diff --git a/src/thermophysicalModels/basic/rhoThermo/rhoThermos.C b/src/thermophysicalModels/basic/rhoThermo/rhoThermos.C index 965a4ddbed82da93995ea3ede722951eff6af2a9..534c1f6081ff9813f413a1980c51ecb8af2742a9 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 0000000000000000000000000000000000000000..b37ec2f9d014be6634f138e48b1a9889b56e4b5d --- /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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "Boussinesq.H" +#include "IOstreams.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Specie> +Foam::Boussinesq<Specie>::Boussinesq(Istream& is) +: + Specie(is), + rho0_(readScalar(is)), + T0_(readScalar(is)), + beta_(readScalar(is)) +{ + is.check + ( + "Boussinesq<Specie>::" + "Boussinesq(Istream& is)" + ); +} + + +template<class Specie> +Foam::Boussinesq<Specie>::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<class Specie> +void Foam::Boussinesq<Specie>::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<class Specie> +Foam::Ostream& Foam::operator<< +( + Ostream& os, + const Boussinesq<Specie>& b +) +{ + os << static_cast<const Specie&>(b) + << token::SPACE << b.rho0_ + << token::SPACE << b.T0_ + << token::SPACE << b.beta_; + + os.check + ( + "Ostream& operator<<" + "(Ostream& os, const Boussinesq<Specie>& 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 0000000000000000000000000000000000000000..fd64b7fcdb63a2f0225dce504418b894e423dd80 --- /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 <http://www.gnu.org/licenses/>. + +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 Specie> class Boussinesq; + +template<class Specie> +inline Boussinesq<Specie> operator+ +( + const Boussinesq<Specie>&, + const Boussinesq<Specie>& +); + +template<class Specie> +inline Boussinesq<Specie> operator- +( + const Boussinesq<Specie>&, + const Boussinesq<Specie>& +); + +template<class Specie> +inline Boussinesq<Specie> operator* +( + const scalar, + const Boussinesq<Specie>& +); + +template<class Specie> +inline Boussinesq<Specie> operator== +( + const Boussinesq<Specie>&, + const Boussinesq<Specie>& +); + +template<class Specie> +Ostream& operator<< +( + Ostream&, + const Boussinesq<Specie>& +); + + +/*---------------------------------------------------------------------------*\ + Class Boussinesq Declaration +\*---------------------------------------------------------------------------*/ + +template<class Specie> +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<Boussinesq> clone() const; + + // Selector from Istream + inline static autoPtr<Boussinesq> New(Istream& is); + + // Selector from dictionary + inline static autoPtr<Boussinesq> 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+ <Specie> + ( + const Boussinesq&, + const Boussinesq& + ); + + friend Boussinesq operator- <Specie> + ( + const Boussinesq&, + const Boussinesq& + ); + + friend Boussinesq operator* <Specie> + ( + const scalar s, + const Boussinesq& + ); + + friend Boussinesq operator== <Specie> + ( + const Boussinesq&, + const Boussinesq& + ); + + + // Ostream Operator + + friend Ostream& operator<< <Specie> + ( + 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 0000000000000000000000000000000000000000..4183d00e12f8fa15f15f4e6d4b91ffe87e1518eb --- /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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "Boussinesq.H" + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Specie> +inline Foam::Boussinesq<Specie>::Boussinesq +( + const Specie& sp, const scalar rho0, const scalar T0, const scalar beta +) +: + Specie(sp), + rho0_(rho0), + T0_(T0), + beta_(beta) +{} + + +template<class Specie> +inline Foam::Boussinesq<Specie>::Boussinesq +( + const Boussinesq& b +) +: + Specie(b), + rho0_(b.rho0_), + T0_(b.T0_), + beta_(b.beta_) +{} + + +template<class Specie> +inline Foam::Boussinesq<Specie>::Boussinesq +( + const word& name, + const Boussinesq<Specie>& b +) +: + Specie(name, b), + rho0_(b.rho0_), + T0_(b.T0_), + beta_(b.beta_) +{} + + +template<class Specie> +inline Foam::autoPtr<Foam::Boussinesq<Specie> > +Foam::Boussinesq<Specie>::clone() const +{ + return autoPtr<Boussinesq<Specie> > + ( + new Boussinesq<Specie>(*this) + ); +} + + +template<class Specie> +inline Foam::autoPtr<Foam::Boussinesq<Specie> > +Foam::Boussinesq<Specie>::New +( + Istream& is +) +{ + return autoPtr<Boussinesq<Specie> > + ( + new Boussinesq<Specie>(is) + ); +} + + +template<class Specie> +inline Foam::autoPtr<Foam::Boussinesq<Specie> > +Foam::Boussinesq<Specie>::New +( + const dictionary& dict +) +{ + return autoPtr<Boussinesq<Specie> > + ( + new Boussinesq<Specie>(dict) + ); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Specie> +inline Foam::scalar Foam::Boussinesq<Specie>::rho +( + scalar p, + scalar T +) const +{ + return rho0_*(1.0 - beta_*(T - T0_)); +} + + +template<class Specie> +inline Foam::scalar Foam::Boussinesq<Specie>::s +( + scalar p, + scalar T +) const +{ + return 0; +} + + +template<class Specie> +inline Foam::scalar Foam::Boussinesq<Specie>::psi +( + scalar p, + scalar T +) const +{ + return 0; +} + + +template<class Specie> +inline Foam::scalar Foam::Boussinesq<Specie>::Z +( + scalar p, + scalar T +) const +{ + return 0; +} + + +template<class Specie> +inline Foam::scalar Foam::Boussinesq<Specie>::cpMcv +( + scalar p, + scalar T +) const +{ + return RR; +} + + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +template<class Specie> +inline Foam::Boussinesq<Specie>& +Foam::Boussinesq<Specie>::operator= +( + const Boussinesq<Specie>& b +) +{ + Specie::operator=(b); + + rho0_ = b.rho0_; + T0_ = b.T0_; + beta_ = b.beta_; + + return *this; +} + +template<class Specie> +inline void Foam::Boussinesq<Specie>::operator+= +( + const Boussinesq<Specie>& 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<class Specie> +inline void Foam::Boussinesq<Specie>::operator-= +( + const Boussinesq<Specie>& b +) +{ + Specie::operator-=(b); + rho0_ = b.rho0_; + T0_ = b.T0_; + beta_ = b.beta_; +} + + +template<class Specie> +inline void Foam::Boussinesq<Specie>::operator*=(const scalar s) +{ + Specie::operator*=(s); +} + + +// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // + +template<class Specie> +inline Foam::Boussinesq<Specie> Foam::operator+ +( + const Boussinesq<Specie>& b1, + const Boussinesq<Specie>& b2 +) +{ + scalar nMoles = b1.nMoles() + b2.nMoles(); + scalar molr1 = b1.nMoles()/nMoles; + scalar molr2 = b2.nMoles()/nMoles; + + return Boussinesq<Specie> + ( + static_cast<const Specie&>(b1) + + static_cast<const Specie&>(b2), + molr1*b1.rho0_ + molr2*b2.rho0_, + molr1*b1.T0_ + molr2*b2.T0_, + molr1*b1.beta_ + molr2*b2.beta_ + ); +} + + +template<class Specie> +inline Foam::Boussinesq<Specie> Foam::operator- +( + const Boussinesq<Specie>& b1, + const Boussinesq<Specie>& b2 +) +{ + return Boussinesq<Specie> + ( + static_cast<const Specie&>(b1) + - static_cast<const Specie&>(b2), + b1.rho0_ - b2.rho0_, + b1.T0_ - b2.T0_, + b1.beta_ - b2.beta_ + ); +} + + +template<class Specie> +inline Foam::Boussinesq<Specie> Foam::operator* +( + const scalar s, + const Boussinesq<Specie>& b +) +{ + return Boussinesq<Specie> + ( + s*static_cast<const Specie&>(b), + b.rho0_, + b.T0_, + b.beta_ + ); +} + + +template<class Specie> +inline Foam::Boussinesq<Specie> Foam::operator== +( + const Boussinesq<Specie>& pg1, + const Boussinesq<Specie>& pg2 +) +{ + return pg2 - pg1; +} + + +// ************************************************************************* //