From dfecb23b08c04c92401bc0bdf904ed0793c3be66 Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Sat, 31 Oct 2015 18:27:38 +0000 Subject: [PATCH] equationOfState/Boussinesq: New equation of state for the Boussinesq approximation for buoyant flows Description Incompressible gas equation of state using the Boussinesq approximation for the density as a function of temperature only: \verbatim rho = rho0*(1 - beta*(T - T0)) \endverbatim To be used with the buoyantPimpleFoam and buoyantSimpleFoam solvers as an alternative to using buoyantBoussinesqPimpleFoam or buoyantBoussinesqSimpleFoam, providing consistency with all other solvers and utilities using the thermodynamics package in OpenFOAM. --- .../basic/rhoThermo/rhoThermos.C | 75 ++++- .../equationOfState/Boussinesq/Boussinesq.C | 98 ++++++ .../equationOfState/Boussinesq/Boussinesq.H | 260 ++++++++++++++++ .../equationOfState/Boussinesq/BoussinesqI.H | 292 ++++++++++++++++++ 4 files changed, 724 insertions(+), 1 deletion(-) create mode 100644 src/thermophysicalModels/specie/equationOfState/Boussinesq/Boussinesq.C create mode 100644 src/thermophysicalModels/specie/equationOfState/Boussinesq/Boussinesq.H create mode 100644 src/thermophysicalModels/specie/equationOfState/Boussinesq/BoussinesqI.H diff --git a/src/thermophysicalModels/basic/rhoThermo/rhoThermos.C b/src/thermophysicalModels/basic/rhoThermo/rhoThermos.C index 965a4ddbed..534c1f6081 100644 --- a/src/thermophysicalModels/basic/rhoThermo/rhoThermos.C +++ b/src/thermophysicalModels/basic/rhoThermo/rhoThermos.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -29,6 +29,7 @@ License #include "specie.H" #include "perfectGas.H" #include "incompressiblePerfectGas.H" +#include "Boussinesq.H" #include "rhoConst.H" #include "perfectFluid.H" #include "PengRobinsonGas.H" @@ -177,6 +178,42 @@ makeThermo specie ); +makeThermo +( + rhoThermo, + heRhoThermo, + pureMixture, + constTransport, + sensibleEnthalpy, + hConstThermo, + Boussinesq, + specie +); + +makeThermo +( + rhoThermo, + heRhoThermo, + pureMixture, + sutherlandTransport, + sensibleEnthalpy, + hConstThermo, + Boussinesq, + specie +); + +makeThermo +( + rhoThermo, + heRhoThermo, + pureMixture, + sutherlandTransport, + sensibleEnthalpy, + janafThermo, + Boussinesq, + specie +); + makeThermo ( rhoThermo, @@ -335,6 +372,42 @@ makeThermo specie ); +makeThermo +( + rhoThermo, + heRhoThermo, + pureMixture, + constTransport, + sensibleInternalEnergy, + hConstThermo, + Boussinesq, + specie +); + +makeThermo +( + rhoThermo, + heRhoThermo, + pureMixture, + sutherlandTransport, + sensibleInternalEnergy, + hConstThermo, + Boussinesq, + specie +); + +makeThermo +( + rhoThermo, + heRhoThermo, + pureMixture, + sutherlandTransport, + sensibleInternalEnergy, + janafThermo, + Boussinesq, + specie +); + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/thermophysicalModels/specie/equationOfState/Boussinesq/Boussinesq.C b/src/thermophysicalModels/specie/equationOfState/Boussinesq/Boussinesq.C new file mode 100644 index 0000000000..b37ec2f9d0 --- /dev/null +++ b/src/thermophysicalModels/specie/equationOfState/Boussinesq/Boussinesq.C @@ -0,0 +1,98 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "Boussinesq.H" +#include "IOstreams.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template +Foam::Boussinesq::Boussinesq(Istream& is) +: + Specie(is), + rho0_(readScalar(is)), + T0_(readScalar(is)), + beta_(readScalar(is)) +{ + is.check + ( + "Boussinesq::" + "Boussinesq(Istream& is)" + ); +} + + +template +Foam::Boussinesq::Boussinesq +( + const dictionary& dict +) +: + Specie(dict), + rho0_(readScalar(dict.subDict("equationOfState").lookup("rho0"))), + T0_(readScalar(dict.subDict("equationOfState").lookup("T0"))), + beta_(readScalar(dict.subDict("equationOfState").lookup("beta"))) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +void Foam::Boussinesq::write(Ostream& os) const +{ + Specie::write(os); + dictionary dict("equationOfState"); + dict.add("rho0", rho0_); + dict.add("T0", T0_); + dict.add("beta", beta_); + + os << indent << dict.dictName() << dict; +} + + +// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * // + +template +Foam::Ostream& Foam::operator<< +( + Ostream& os, + const Boussinesq& b +) +{ + os << static_cast(b) + << token::SPACE << b.rho0_ + << token::SPACE << b.T0_ + << token::SPACE << b.beta_; + + os.check + ( + "Ostream& operator<<" + "(Ostream& os, const Boussinesq& st)" + ); + return os; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/specie/equationOfState/Boussinesq/Boussinesq.H b/src/thermophysicalModels/specie/equationOfState/Boussinesq/Boussinesq.H new file mode 100644 index 0000000000..fd64b7fcdb --- /dev/null +++ b/src/thermophysicalModels/specie/equationOfState/Boussinesq/Boussinesq.H @@ -0,0 +1,260 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Class + Foam::Boussinesq + +Description + Incompressible gas equation of state using the Boussinesq approximation for + the density as a function of temperature only: + + \verbatim + rho = rho0*(1 - beta*(T - T0)) + \endverbatim + +SourceFiles + BoussinesqI.H + Boussinesq.C + +\*---------------------------------------------------------------------------*/ + +#ifndef Boussinesq_H +#define Boussinesq_H + +#include "autoPtr.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of friend functions and operators + +template class Boussinesq; + +template +inline Boussinesq operator+ +( + const Boussinesq&, + const Boussinesq& +); + +template +inline Boussinesq operator- +( + const Boussinesq&, + const Boussinesq& +); + +template +inline Boussinesq operator* +( + const scalar, + const Boussinesq& +); + +template +inline Boussinesq operator== +( + const Boussinesq&, + const Boussinesq& +); + +template +Ostream& operator<< +( + Ostream&, + const Boussinesq& +); + + +/*---------------------------------------------------------------------------*\ + Class Boussinesq Declaration +\*---------------------------------------------------------------------------*/ + +template +class Boussinesq +: + public Specie +{ + // Private data + + //- Reference density + scalar rho0_; + + //- Reference temperature + scalar T0_; + + //- Thermal expansion coefficient + scalar beta_; + + +public: + + // Constructors + + //- Construct from components + inline Boussinesq + ( + const Specie& sp, + const scalar rho0, + const scalar T0, + const scalar beta + ); + + //- Construct from Boussinesq + inline Boussinesq(const Boussinesq& sp); + + //- Construct from Istream + Boussinesq(Istream&); + + //- Construct from dictionary + Boussinesq(const dictionary& dict); + + //- Construct as named copy + inline Boussinesq + ( + const word& name, + const Boussinesq& + ); + + //- Construct and return a clone + inline autoPtr clone() const; + + // Selector from Istream + inline static autoPtr New(Istream& is); + + // Selector from dictionary + inline static autoPtr New + ( + const dictionary& dict + ); + + + // Member functions + + //- Return the instantiated type name + static word typeName() + { + return + "Boussinesq<" + + word(Specie::typeName_()) + '>'; + } + + + // Fundamental properties + + //- Is the equation of state is incompressible i.e. rho != f(p) + static const bool incompressible = true; + + //- Is the equation of state is isochoric i.e. rho = const + static const bool isochoric = false; + + //- Return density [kg/m^3] + inline scalar rho(scalar p, scalar T) const; + + //- Return entropy [J/(kmol K)] + inline scalar s(const scalar p, const scalar T) const; + + //- Return compressibility rho/p [s^2/m^2] + inline scalar psi(scalar p, scalar T) const; + + //- Return compression factor [] + inline scalar Z(scalar p, scalar T) const; + + //- Return (cp - cv) [J/(kmol K] + inline scalar cpMcv(scalar p, scalar T) const; + + + // IO + + //- Write to Ostream + void write(Ostream& os) const; + + + // Member operators + + inline Boussinesq& operator= + ( + const Boussinesq& + ); + inline void operator+=(const Boussinesq&); + inline void operator-=(const Boussinesq&); + + inline void operator*=(const scalar); + + + // Friend operators + + friend Boussinesq operator+ + ( + const Boussinesq&, + const Boussinesq& + ); + + friend Boussinesq operator- + ( + const Boussinesq&, + const Boussinesq& + ); + + friend Boussinesq operator* + ( + const scalar s, + const Boussinesq& + ); + + friend Boussinesq operator== + ( + const Boussinesq&, + const Boussinesq& + ); + + + // Ostream Operator + + friend Ostream& operator<< + ( + Ostream&, + const Boussinesq& + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "BoussinesqI.H" + +#ifdef NoRepository +# include "Boussinesq.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/specie/equationOfState/Boussinesq/BoussinesqI.H b/src/thermophysicalModels/specie/equationOfState/Boussinesq/BoussinesqI.H new file mode 100644 index 0000000000..4183d00e12 --- /dev/null +++ b/src/thermophysicalModels/specie/equationOfState/Boussinesq/BoussinesqI.H @@ -0,0 +1,292 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "Boussinesq.H" + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template +inline Foam::Boussinesq::Boussinesq +( + const Specie& sp, const scalar rho0, const scalar T0, const scalar beta +) +: + Specie(sp), + rho0_(rho0), + T0_(T0), + beta_(beta) +{} + + +template +inline Foam::Boussinesq::Boussinesq +( + const Boussinesq& b +) +: + Specie(b), + rho0_(b.rho0_), + T0_(b.T0_), + beta_(b.beta_) +{} + + +template +inline Foam::Boussinesq::Boussinesq +( + const word& name, + const Boussinesq& b +) +: + Specie(name, b), + rho0_(b.rho0_), + T0_(b.T0_), + beta_(b.beta_) +{} + + +template +inline Foam::autoPtr > +Foam::Boussinesq::clone() const +{ + return autoPtr > + ( + new Boussinesq(*this) + ); +} + + +template +inline Foam::autoPtr > +Foam::Boussinesq::New +( + Istream& is +) +{ + return autoPtr > + ( + new Boussinesq(is) + ); +} + + +template +inline Foam::autoPtr > +Foam::Boussinesq::New +( + const dictionary& dict +) +{ + return autoPtr > + ( + new Boussinesq(dict) + ); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +inline Foam::scalar Foam::Boussinesq::rho +( + scalar p, + scalar T +) const +{ + return rho0_*(1.0 - beta_*(T - T0_)); +} + + +template +inline Foam::scalar Foam::Boussinesq::s +( + scalar p, + scalar T +) const +{ + return 0; +} + + +template +inline Foam::scalar Foam::Boussinesq::psi +( + scalar p, + scalar T +) const +{ + return 0; +} + + +template +inline Foam::scalar Foam::Boussinesq::Z +( + scalar p, + scalar T +) const +{ + return 0; +} + + +template +inline Foam::scalar Foam::Boussinesq::cpMcv +( + scalar p, + scalar T +) const +{ + return RR; +} + + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +template +inline Foam::Boussinesq& +Foam::Boussinesq::operator= +( + const Boussinesq& b +) +{ + Specie::operator=(b); + + rho0_ = b.rho0_; + T0_ = b.T0_; + beta_ = b.beta_; + + return *this; +} + +template +inline void Foam::Boussinesq::operator+= +( + const Boussinesq& b +) +{ + scalar molr1 = this->nMoles(); + Specie::operator+=(b); + molr1 /= this->nMoles(); + scalar molr2 = b.nMoles()/this->nMoles(); + + rho0_ = molr1*rho0_ + molr2*b.rho0_; + T0_ = molr1*T0_ + molr2*b.T0_; + beta_ = molr1*beta_ + molr2*b.beta_; +} + + +template +inline void Foam::Boussinesq::operator-= +( + const Boussinesq& b +) +{ + Specie::operator-=(b); + rho0_ = b.rho0_; + T0_ = b.T0_; + beta_ = b.beta_; +} + + +template +inline void Foam::Boussinesq::operator*=(const scalar s) +{ + Specie::operator*=(s); +} + + +// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // + +template +inline Foam::Boussinesq Foam::operator+ +( + const Boussinesq& b1, + const Boussinesq& b2 +) +{ + scalar nMoles = b1.nMoles() + b2.nMoles(); + scalar molr1 = b1.nMoles()/nMoles; + scalar molr2 = b2.nMoles()/nMoles; + + return Boussinesq + ( + static_cast(b1) + + static_cast(b2), + molr1*b1.rho0_ + molr2*b2.rho0_, + molr1*b1.T0_ + molr2*b2.T0_, + molr1*b1.beta_ + molr2*b2.beta_ + ); +} + + +template +inline Foam::Boussinesq Foam::operator- +( + const Boussinesq& b1, + const Boussinesq& b2 +) +{ + return Boussinesq + ( + static_cast(b1) + - static_cast(b2), + b1.rho0_ - b2.rho0_, + b1.T0_ - b2.T0_, + b1.beta_ - b2.beta_ + ); +} + + +template +inline Foam::Boussinesq Foam::operator* +( + const scalar s, + const Boussinesq& b +) +{ + return Boussinesq + ( + s*static_cast(b), + b.rho0_, + b.T0_, + b.beta_ + ); +} + + +template +inline Foam::Boussinesq Foam::operator== +( + const Boussinesq& pg1, + const Boussinesq& pg2 +) +{ + return pg2 - pg1; +} + + +// ************************************************************************* //