OpenFOAM-4.x/src/thermophysicalModels/specie/thermo/thermo/thermo.H

407 lines
12 KiB
C++

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 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::thermo
Description
Basic thermodynamics type based on the use of fitting functions for
cp, h, s obtained from the template argument type thermo. All other
properties are derived from these primitive functions.
SourceFiles
thermoI.H
thermo.C
\*---------------------------------------------------------------------------*/
#ifndef thermo_H
#define thermo_H
#include "thermodynamicConstants.H"
using namespace Foam::constant::thermodynamic;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace species
{
// Forward declaration of friend functions and operators
template<class Thermo, template<class> class Type> class thermo;
template<class Thermo, template<class> class Type>
inline thermo<Thermo, Type> operator+
(
const thermo<Thermo, Type>&,
const thermo<Thermo, Type>&
);
template<class Thermo, template<class> class Type>
inline thermo<Thermo, Type> operator-
(
const thermo<Thermo, Type>&,
const thermo<Thermo, Type>&
);
template<class Thermo, template<class> class Type>
inline thermo<Thermo, Type> operator*
(
const scalar,
const thermo<Thermo, Type>&
);
template<class Thermo, template<class> class Type>
inline thermo<Thermo, Type> operator==
(
const thermo<Thermo, Type>&,
const thermo<Thermo, Type>&
);
template<class Thermo, template<class> class Type>
Ostream& operator<<
(
Ostream&,
const thermo<Thermo, Type>&
);
/*---------------------------------------------------------------------------*\
Class thermo Declaration
\*---------------------------------------------------------------------------*/
template<class Thermo, template<class> class Type>
class thermo
:
public Thermo,
public Type<thermo<Thermo, Type>>
{
// Private data
//- Convergence tolerance of energy -> temperature inversion functions
static const scalar tol_;
//- Max number of iterations in energy->temperature inversion functions
static const int maxIter_;
// Private Member Functions
//- Return the temperature corresponding to the value of the
// thermodynamic property f, given the function f = F(p, T)
// and dF(p, T)/dT
inline scalar T
(
scalar f,
scalar p,
scalar T0,
scalar (thermo::*F)(const scalar, const scalar) const,
scalar (thermo::*dFdT)(const scalar, const scalar) const,
scalar (thermo::*limit)(const scalar) const
) const;
public:
//- The thermodynamics of the individual species'
typedef thermo<Thermo, Type> thermoType;
// Constructors
//- Construct from components
inline thermo(const Thermo& sp);
//- Construct from Istream
thermo(Istream&);
//- Construct from dictionary
thermo(const dictionary& dict);
//- Construct as named copy
inline thermo(const word& name, const thermo&);
// Member Functions
//- Return the instantiated type name
static word typeName()
{
return
Thermo::typeName() + ','
+ Type<thermo<Thermo, Type>>::typeName();
}
// Fundamental properties
// (These functions must be provided in derived types)
// Heat capacity at constant pressure [J/(kmol K)]
// scalar cp(const scalar) const;
// Absolute Enthalpy [J/kmol]
// scalar ha(const scalar) const;
// Sensible enthalpy [J/kmol]
// scalar hs(const scalar) const;
// Chemical enthalpy [J/kmol]
// scalar hc(const scalar) const;
// Entropy [J/(kmol K)]
// scalar s(const scalar) const;
// Calculate and return derived properties
// (These functions need not provided in derived types)
// Mole specific properties
//- Name of Enthalpy/Internal energy
static inline word heName();
//- Enthalpy/Internal energy [J/kmol]
inline scalar he(const scalar p, const scalar T) const;
//- Heat capacity at constant volume [J/(kmol K)]
inline scalar cv(const scalar p, const scalar T) const;
//- Heat capacity at constant pressure/volume [J/(kmol K)]
inline scalar cpv(const scalar p, const scalar T) const;
//- Gamma = cp/cv []
inline scalar gamma(const scalar p, const scalar T) const;
//- Ratio of heat capacity at constant pressure to that at
// constant pressure/volume []
inline scalar cpBycpv(const scalar p, const scalar T) const;
//- Sensible internal energy [J/kmol]
inline scalar es(const scalar p, const scalar T) const;
//- Absolute internal energy [J/kmol]
inline scalar ea(const scalar p, const scalar T) const;
//- Gibbs free energy [J/kmol]
inline scalar g(const scalar p, const scalar T) const;
//- Helmholtz free energy [J/kmol]
inline scalar a(const scalar p, const scalar T) const;
// Mass specific properties
//- Heat capacity at constant pressure [J/(kg K)]
inline scalar Cp(const scalar p, const scalar T) const;
//- Heat capacity at constant volume [J/(kg K)]
inline scalar Cv(const scalar p, const scalar T) const;
//- Heat capacity at constant pressure/volume [J/(kg K)]
inline scalar Cpv(const scalar p, const scalar T) const;
//- Enthalpy/Internal energy [J/kg]
inline scalar HE(const scalar p, const scalar T) const;
//- Sensible enthalpy [J/kg]
inline scalar Hs(const scalar p, const scalar T) const;
//- Chemical enthalpy [J/kg]
inline scalar Hc() const;
//- Absolute Enthalpy [J/kg]
inline scalar Ha(const scalar p, const scalar T) const;
//- Entropy [J/(kg K)]
inline scalar S(const scalar p, const scalar T) const;
//- Internal energy [J/kg]
inline scalar E(const scalar p, const scalar T) const;
//- Sensible internal energy [J/kg]
inline scalar Es(const scalar p, const scalar T) const;
//- Absolute internal energy [J/kg]
inline scalar Ea(const scalar p, const scalar T) const;
//- Gibbs free energy [J/kg]
inline scalar G(const scalar p, const scalar T) const;
//- Helmholtz free energy [J/kg]
inline scalar A(const scalar p, const scalar T) const;
// Equilibrium reaction thermodynamics
//- Equilibrium constant [] i.t.o fugacities
// = PIi(fi/Pstd)^nui
inline scalar K(const scalar p, const scalar T) const;
//- Equilibrium constant [] i.t.o. partial pressures
// = PIi(pi/Pstd)^nui
// For low pressures (where the gas mixture is near perfect) Kp = K
inline scalar Kp(const scalar p, const scalar T) const;
//- Equilibrium constant i.t.o. molar concentration
// = PIi(ci/cstd)^nui
// For low pressures (where the gas mixture is near perfect)
// Kc = Kp(pstd/(RR*T))^nu
inline scalar Kc(const scalar p, const scalar T) const;
//- Equilibrium constant [] i.t.o. mole-fractions
// For low pressures (where the gas mixture is near perfect)
// Kx = Kp(pstd/p)^nui
inline scalar Kx
(
const scalar p,
const scalar T
) const;
//- Equilibrium constant [] i.t.o. number of moles
// For low pressures (where the gas mixture is near perfect)
// Kn = Kp(n*pstd/p)^nui where n = number of moles in mixture
inline scalar Kn
(
const scalar p,
const scalar T,
const scalar n
) const;
// Energy->temperature inversion functions
//- Temperature from enthalpy or internal energy
// given an initial temperature T0
inline scalar THE
(
const scalar H,
const scalar p,
const scalar T0
) const;
//- Temperature from sensible enthalpy given an initial T0
inline scalar THs
(
const scalar Hs,
const scalar p,
const scalar T0
) const;
//- Temperature from absolute enthalpy
// given an initial temperature T0
inline scalar THa
(
const scalar H,
const scalar p,
const scalar T0
) const;
//- Temperature from sensible internal energy
// given an initial temperature T0
inline scalar TEs
(
const scalar E,
const scalar p,
const scalar T0
) const;
//- Temperature from absolute internal energy
// given an initial temperature T0
inline scalar TEa
(
const scalar E,
const scalar p,
const scalar T0
) const;
// I-O
//- Write to Ostream
void write(Ostream& os) const;
// Member operators
inline void operator+=(const thermo&);
inline void operator-=(const thermo&);
inline void operator*=(const scalar);
// Friend operators
friend thermo operator+ <Thermo, Type>
(
const thermo&,
const thermo&
);
friend thermo operator- <Thermo, Type>
(
const thermo&,
const thermo&
);
friend thermo operator* <Thermo, Type>
(
const scalar s,
const thermo&
);
friend thermo operator== <Thermo, Type>
(
const thermo&,
const thermo&
);
// Ostream Operator
friend Ostream& operator<< <Thermo, Type>
(
Ostream&,
const thermo&
);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace species
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "thermoI.H"
#ifdef NoRepository
#include "thermo.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //