Added sensible enthalpy (hs, Hs) and chemical enthalpy (hc, Hc) to the thermodynamics package.

Absolute enthalpy h = hs + hc.
This commit is contained in:
henry
2008-10-27 10:45:45 +00:00
parent 37ed8d9c7e
commit a7090d8f9e
25 changed files with 750 additions and 343 deletions

View File

@ -2,14 +2,21 @@ basicMixture = mixtures/basicMixture
basicThermo = basicThermo basicThermo = basicThermo
$(basicMixture)/basicMixture.C $(basicMixture)/basicMixture.C
$(basicMixture)/basicMixtures.C
$(basicThermo)/basicThermo.C $(basicThermo)/basicThermo.C
$(basicThermo)/newBasicThermo.C $(basicThermo)/newBasicThermo.C
$(basicThermo)/basicThermos.C
hThermo/hThermos.C
eThermo/eThermos.C
derivedFvPatchFields/fixedEnthalpy/fixedEnthalpyFvPatchScalarField.C derivedFvPatchFields/fixedEnthalpy/fixedEnthalpyFvPatchScalarField.C
derivedFvPatchFields/gradientEnthalpy/gradientEnthalpyFvPatchScalarField.C derivedFvPatchFields/gradientEnthalpy/gradientEnthalpyFvPatchScalarField.C
derivedFvPatchFields/mixedEnthalpy/mixedEnthalpyFvPatchScalarField.C derivedFvPatchFields/mixedEnthalpy/mixedEnthalpyFvPatchScalarField.C
derivedFvPatchFields/fixedInternalEnergy/fixedInternalEnergyFvPatchScalarField.C
derivedFvPatchFields/gradientInternalEnergy/gradientInternalEnergyFvPatchScalarField.C
derivedFvPatchFields/mixedInternalEnergy/mixedInternalEnergyFvPatchScalarField.C
derivedFvPatchFields/wallHeatTransfer/wallHeatTransferFvPatchScalarField.C derivedFvPatchFields/wallHeatTransfer/wallHeatTransferFvPatchScalarField.C
LIB = $(FOAM_LIBBIN)/libbasicThermophysicalModels LIB = $(FOAM_LIBBIN)/libbasicThermophysicalModels

View File

@ -31,6 +31,9 @@ License
#include "fixedEnthalpyFvPatchScalarField.H" #include "fixedEnthalpyFvPatchScalarField.H"
#include "gradientEnthalpyFvPatchScalarField.H" #include "gradientEnthalpyFvPatchScalarField.H"
#include "mixedEnthalpyFvPatchScalarField.H" #include "mixedEnthalpyFvPatchScalarField.H"
#include "fixedInternalEnergyFvPatchScalarField.H"
#include "gradientInternalEnergyFvPatchScalarField.H"
#include "mixedInternalEnergyFvPatchScalarField.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -74,9 +77,9 @@ wordList basicThermo::hBoundaryTypes()
return hbt; return hbt;
} }
void basicThermo::hBoundaryCorrection(volScalarField& h_) void basicThermo::hBoundaryCorrection(volScalarField& h)
{ {
volScalarField::GeometricBoundaryField& hbf = h_.boundaryField(); volScalarField::GeometricBoundaryField& hbf = h.boundaryField();
forAll(hbf, patchi) forAll(hbf, patchi)
{ {
@ -93,6 +96,53 @@ void basicThermo::hBoundaryCorrection(volScalarField& h_)
} }
} }
wordList basicThermo::eBoundaryTypes()
{
const volScalarField::GeometricBoundaryField& tbf = T_.boundaryField();
wordList ebt = tbf.types();
forAll(tbf, patchi)
{
if (isA<fixedValueFvPatchScalarField>(tbf[patchi]))
{
ebt[patchi] = fixedInternalEnergyFvPatchScalarField::typeName;
}
else if
(
isA<zeroGradientFvPatchScalarField>(tbf[patchi])
|| isA<fixedGradientFvPatchScalarField>(tbf[patchi])
)
{
ebt[patchi] = gradientInternalEnergyFvPatchScalarField::typeName;
}
else if (isA<mixedFvPatchScalarField>(tbf[patchi]))
{
ebt[patchi] = mixedInternalEnergyFvPatchScalarField::typeName;
}
}
return ebt;
}
void basicThermo::eBoundaryCorrection(volScalarField& e)
{
volScalarField::GeometricBoundaryField& ebf = e.boundaryField();
forAll(ebf, patchi)
{
if (isA<gradientInternalEnergyFvPatchScalarField>(ebf[patchi]))
{
refCast<gradientInternalEnergyFvPatchScalarField>(ebf[patchi])
.gradient() = ebf[patchi].fvPatchField::snGrad();
}
else if (isA<mixedInternalEnergyFvPatchScalarField>(ebf[patchi]))
{
refCast<mixedInternalEnergyFvPatchScalarField>(ebf[patchi])
.refGrad() = ebf[patchi].fvPatchField::snGrad();
}
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //

View File

@ -74,6 +74,9 @@ protected:
wordList hBoundaryTypes(); wordList hBoundaryTypes();
void hBoundaryCorrection(volScalarField& h); void hBoundaryCorrection(volScalarField& h);
wordList eBoundaryTypes();
void eBoundaryCorrection(volScalarField& e);
//- Construct as copy (not implemented) //- Construct as copy (not implemented)
basicThermo(const basicThermo&); basicThermo(const basicThermo&);
@ -107,8 +110,7 @@ public:
static autoPtr<basicThermo> New(const fvMesh&); static autoPtr<basicThermo> New(const fvMesh&);
// Destructor //- Destructor
virtual ~basicThermo(); virtual ~basicThermo();
@ -122,13 +124,13 @@ public:
//- Pressure [Pa] //- Pressure [Pa]
// Non-const access allowed for transport equations // Non-const access allowed for transport equations
volScalarField& p() virtual volScalarField& p()
{ {
return p_; return p_;
} }
//- Pressure [Pa] //- Pressure [Pa]
const volScalarField& p() const virtual const volScalarField& p() const
{ {
return p_; return p_;
} }
@ -193,23 +195,52 @@ public:
return volScalarField::null(); return volScalarField::null();
} }
//- Internal energy for cell-set [J/kg]
virtual tmp<scalarField> e
(
const scalarField& T,
const labelList& cells
) const
{
notImplemented
(
"basicThermo::e"
"(const scalarField& T, const labelList& cells) const"
);
return tmp<scalarField>(NULL);
}
//-Internal energy for patch [J/kg]
virtual tmp<scalarField> e
(
const scalarField& T,
const label patchi
) const
{
notImplemented
(
"basicThermo::e"
"(const scalarField& T, const label patchi) const"
);
return tmp<scalarField>(NULL);
}
// Fields derived from thermodynamic state variables // Fields derived from thermodynamic state variables
//- Temperature [K] //- Temperature [K]
const volScalarField& T() const virtual const volScalarField& T() const
{ {
return T_; return T_;
} }
//- Density [kg/m^3] //- Density [kg/m^3]
tmp<volScalarField> rho() const virtual tmp<volScalarField> rho() const
{ {
return p_*psi(); return p_*psi();
} }
//- Compressibility [s^2/m^2] //- Compressibility [s^2/m^2]
const volScalarField& psi() const virtual const volScalarField& psi() const
{ {
return psi_; return psi_;
} }
@ -236,6 +267,21 @@ public:
return volScalarField::null(); return volScalarField::null();
} }
//- Heat capacity at constant volume for patch [J/kg/K]
virtual tmp<scalarField> Cv
(
const scalarField& T,
const label patchi
) const
{
notImplemented
(
"basicThermo::Cv"
"(const scalarField& T, const label patchi) const"
);
return tmp<scalarField>(NULL);
}
//- Heat capacity at constant volume [J/kg/K] //- Heat capacity at constant volume [J/kg/K]
virtual tmp<volScalarField> Cv() const virtual tmp<volScalarField> Cv() const
{ {
@ -247,13 +293,13 @@ public:
// Access to transport state variables // Access to transport state variables
//- Dynamic viscosity of mixture [kg/ms] //- Dynamic viscosity of mixture [kg/ms]
const volScalarField& mu() const virtual const volScalarField& mu() const
{ {
return mu_; return mu_;
} }
//- Thermal diffusivity for enthalpy of mixture [kg/ms] //- Thermal diffusivity for enthalpy of mixture [kg/ms]
const volScalarField& alpha() const virtual const volScalarField& alpha() const
{ {
return alpha_; return alpha_;
} }

View File

@ -38,13 +38,6 @@ Description
#define makeBasicThermo(Cthermo,Mixture,Transport,Thermo,EqnOfState) \ #define makeBasicThermo(Cthermo,Mixture,Transport,Thermo,EqnOfState) \
\ \
typedef Mixture<Transport<specieThermo<Thermo<EqnOfState> > > > \
Mixture##Transport##Thermo##EqnOfState; \
\
defineTemplateTypeNameAndDebugWithName \
(Mixture##Transport##Thermo##EqnOfState, \
#Mixture"<"#Transport"<specieThermo<"#Thermo"<"#EqnOfState">>>>", 0) \
\
typedef Cthermo<Mixture<Transport<specieThermo<Thermo<EqnOfState> > > > > \ typedef Cthermo<Mixture<Transport<specieThermo<Thermo<EqnOfState> > > > > \
Cthermo##Mixture##Transport##Thermo##EqnOfState; \ Cthermo##Mixture##Transport##Thermo##EqnOfState; \
\ \
@ -60,7 +53,6 @@ addToRunTimeSelectionTable \
fvMesh \ fvMesh \
) )
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif #endif

View File

@ -205,7 +205,6 @@ Foam::tmp<Foam::scalarField> Foam::hThermo<MixtureType>::h
return th; return th;
} }
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::scalarField> Foam::hThermo<MixtureType>::Cp Foam::tmp<Foam::scalarField> Foam::hThermo<MixtureType>::Cp
( (
@ -224,7 +223,6 @@ Foam::tmp<Foam::scalarField> Foam::hThermo<MixtureType>::Cp
return tCp; return tCp;
} }
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::volScalarField> Foam::hThermo<MixtureType>::Cp() const Foam::tmp<Foam::volScalarField> Foam::hThermo<MixtureType>::Cp() const
{ {
@ -243,7 +241,8 @@ Foam::tmp<Foam::volScalarField> Foam::hThermo<MixtureType>::Cp() const
IOobject::NO_WRITE IOobject::NO_WRITE
), ),
mesh, mesh,
dimensionSet(0, 2, -2, -1, 0) dimensionSet(0, 2, -2, -1, 0),
T_.boundaryField().types()
) )
); );
@ -256,13 +255,38 @@ Foam::tmp<Foam::volScalarField> Foam::hThermo<MixtureType>::Cp() const
forAll(T_.boundaryField(), patchi) forAll(T_.boundaryField(), patchi)
{ {
cp.boundaryField()[patchi] = Cp(T_.boundaryField()[patchi], patchi); const fvPatchScalarField& pT = T_.boundaryField()[patchi];
fvPatchScalarField& pCp = cp.boundaryField()[patchi];
forAll(pT, facei)
{
pCp[facei] = this->patchFaceMixture(patchi, facei).Cp(pT[facei]);
}
} }
return tCp; return tCp;
} }
template<class MixtureType>
Foam::tmp<Foam::scalarField> Foam::hThermo<MixtureType>::Cv
(
const scalarField& T,
const label patchi
) const
{
tmp<scalarField> tCv(new scalarField(T.size()));
scalarField& cv = tCv();
forAll(T, facei)
{
cv[facei] = this->patchFaceMixture(patchi, facei).Cv(T[facei]);
}
return tCv;
}
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::volScalarField> Foam::hThermo<MixtureType>::Cv() const Foam::tmp<Foam::volScalarField> Foam::hThermo<MixtureType>::Cv() const
{ {
@ -281,8 +305,7 @@ Foam::tmp<Foam::volScalarField> Foam::hThermo<MixtureType>::Cv() const
IOobject::NO_WRITE IOobject::NO_WRITE
), ),
mesh, mesh,
dimensionSet(0, 2, -2, -1, 0), dimensionSet(0, 2, -2, -1, 0)
T_.boundaryField().types()
) )
); );
@ -295,19 +318,12 @@ Foam::tmp<Foam::volScalarField> Foam::hThermo<MixtureType>::Cv() const
forAll(T_.boundaryField(), patchi) forAll(T_.boundaryField(), patchi)
{ {
const fvPatchScalarField& pT = T_.boundaryField()[patchi]; cv.boundaryField()[patchi] = Cv(T_.boundaryField()[patchi], patchi);
fvPatchScalarField& pCv = cv.boundaryField()[patchi];
forAll(pT, facei)
{
pCv[facei] = this->patchFaceMixture(patchi, facei).Cv(pT[facei]);
}
} }
return tCv; return tCv;
} }
template<class MixtureType> template<class MixtureType>
bool Foam::hThermo<MixtureType>::read() bool Foam::hThermo<MixtureType>::read()
{ {

View File

@ -79,40 +79,39 @@ public:
hThermo(const fvMesh&); hThermo(const fvMesh&);
// Destructor //- Destructor
virtual ~hThermo();
~hThermo();
// Member functions // Member functions
//- Return the compostion of the combustion mixture //- Return the compostion of the combustion mixture
basicMixture& composition() virtual basicMixture& composition()
{ {
return *this; return *this;
} }
//- Return the compostion of the combustion mixture //- Return the compostion of the combustion mixture
const basicMixture& composition() const virtual const basicMixture& composition() const
{ {
return *this; return *this;
} }
//- Update properties //- Update properties
void correct(); virtual void correct();
// Access to thermodynamic state variables // Access to thermodynamic state variables
//- Enthalpy [J/kg] //- Enthalpy [J/kg]
// Non-const access allowed for transport equations // Non-const access allowed for transport equations
volScalarField& h() virtual volScalarField& h()
{ {
return h_; return h_;
} }
//- Enthalpy [J/kg] //- Enthalpy [J/kg]
const volScalarField& h() const virtual const volScalarField& h() const
{ {
return h_; return h_;
} }
@ -121,31 +120,42 @@ public:
// Fields derived from thermodynamic state variables // Fields derived from thermodynamic state variables
//- Enthalpy for cell-set [J/kg] //- Enthalpy for cell-set [J/kg]
tmp<scalarField> h virtual tmp<scalarField> h
( (
const scalarField& T, const scalarField& T,
const labelList& cells const labelList& cells
) const; ) const;
//- Enthalpy for patch [J/kg] //- Enthalpy for patch [J/kg]
tmp<scalarField> h virtual tmp<scalarField> h
( (
const scalarField& T, const scalarField& T,
const label patchi const label patchi
) const; ) const;
//- Heat capacity at constant pressure for patch [J/kg/K] //- Heat capacity at constant pressure for patch [J/kg/K]
tmp<scalarField> Cp(const scalarField& T, const label patchi) const; virtual tmp<scalarField> Cp
(
const scalarField& T,
const label patchi
) const;
//- Heat capacity at constant pressure [J/kg/K] //- Heat capacity at constant pressure [J/kg/K]
tmp<volScalarField> Cp() const; virtual tmp<volScalarField> Cp() const;
//- Heat capacity at constant volume for patch [J/kg/K]
virtual tmp<scalarField> Cv
(
const scalarField& T,
const label patchi
) const;
//- Heat capacity at constant volume [J/kg/K] //- Heat capacity at constant volume [J/kg/K]
tmp<volScalarField> Cv() const; virtual tmp<volScalarField> Cv() const;
//- Read thermophysicalProperties dictionary //- Read thermophysicalProperties dictionary
bool read(); virtual bool read();
}; };

View File

@ -92,8 +92,7 @@ public:
static autoPtr<hCombustionThermo> New(const fvMesh&); static autoPtr<hCombustionThermo> New(const fvMesh&);
// Destructor //- Destructor
virtual ~hCombustionThermo(); virtual ~hCombustionThermo();
@ -110,18 +109,24 @@ public:
//- Enthalpy [J/kg] //- Enthalpy [J/kg]
// Non-const access allowed for transport equations // Non-const access allowed for transport equations
volScalarField& h() virtual volScalarField& h()
{ {
return h_; return h_;
} }
//- Enthalpy [J/kg] //- Enthalpy [J/kg]
const volScalarField& h() const virtual const volScalarField& h() const
{ {
return h_; return h_;
} }
//- Sensible enthalpy [J/kg]
virtual tmp<volScalarField> hs() const = 0;
//- Chemical enthalpy [J/kg]
virtual tmp<volScalarField> hc() const = 0;
//- Update properties //- Update properties
virtual void correct() = 0; virtual void correct() = 0;
}; };

View File

@ -96,8 +96,7 @@ public:
static autoPtr<hhuCombustionThermo> New(const fvMesh&); static autoPtr<hhuCombustionThermo> New(const fvMesh&);
// Destructor //- Destructor
virtual ~hhuCombustionThermo(); virtual ~hhuCombustionThermo();
@ -111,13 +110,13 @@ public:
//- Unburnt gas enthalpy [J/kg] //- Unburnt gas enthalpy [J/kg]
// Non-const access allowed for transport equations // Non-const access allowed for transport equations
volScalarField& hu() virtual volScalarField& hu()
{ {
return hu_; return hu_;
} }
//- Unburnt gas enthalpy [J/kg] //- Unburnt gas enthalpy [J/kg]
const volScalarField& hu() const virtual const volScalarField& hu() const
{ {
return hu_; return hu_;
} }
@ -140,7 +139,7 @@ public:
) const = 0; ) const = 0;
//- Unburnt gas temperature [K] //- Unburnt gas temperature [K]
const volScalarField& Tu() const virtual const volScalarField& Tu() const
{ {
return Tu_; return Tu_;
} }

View File

@ -134,7 +134,120 @@ void Foam::hMixtureThermo<MixtureType>::calculate()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::scalarField> Foam::hMixtureThermo<MixtureType>::h void Foam::hMixtureThermo<MixtureType>::correct()
{
if (debug)
{
Info<< "entering hMixtureThermo<MixtureType>::correct()" << endl;
}
// force the saving of the old-time values
psi_.oldTime();
calculate();
if (debug)
{
Info<< "exiting hMixtureThermo<MixtureType>::correct()" << endl;
}
}
template<class MixtureType>
Foam::tmp<Foam::volScalarField>
Foam::hMixtureThermo<MixtureType>::hs() const
{
const fvMesh& mesh = T_.mesh();
tmp<volScalarField> ths
(
new volScalarField
(
IOobject
(
"hs",
mesh.time().timeName(),
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh,
h_.dimensions()
)
);
volScalarField& hsf = ths();
scalarField& hsCells = hsf.internalField();
const scalarField& TCells = T_.internalField();
forAll(TCells, celli)
{
hsCells[celli] = this->cellMixture(celli).Hs(TCells[celli]);
}
forAll(T_.boundaryField(), patchi)
{
scalarField& hsp = hsf.boundaryField()[patchi];
const scalarField& Tp = T_.boundaryField()[patchi];
forAll(Tp, facei)
{
hsp[facei] = this->patchFaceMixture(patchi, facei).Hs(Tp[facei]);
}
}
return ths;
}
template<class MixtureType>
Foam::tmp<Foam::volScalarField>
Foam::hMixtureThermo<MixtureType>::hc() const
{
const fvMesh& mesh = T_.mesh();
tmp<volScalarField> thc
(
new volScalarField
(
IOobject
(
"hc",
mesh.time().timeName(),
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh,
h_.dimensions()
)
);
volScalarField& hcf = thc();
scalarField& hcCells = hcf.internalField();
forAll(hcCells, celli)
{
hcCells[celli] = this->cellMixture(celli).Hc();
}
forAll(hcf.boundaryField(), patchi)
{
scalarField& hcp = hcf.boundaryField()[patchi];
forAll(hcp, facei)
{
hcp[facei] = this->patchFaceMixture(patchi, facei).Hc();
}
}
return thc;
}
template<class MixtureType>
Foam::tmp<Foam::scalarField>
Foam::hMixtureThermo<MixtureType>::h
( (
const scalarField& T, const scalarField& T,
const labelList& cells const labelList& cells
@ -153,7 +266,8 @@ Foam::tmp<Foam::scalarField> Foam::hMixtureThermo<MixtureType>::h
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::scalarField> Foam::hMixtureThermo<MixtureType>::h Foam::tmp<Foam::scalarField>
Foam::hMixtureThermo<MixtureType>::h
( (
const scalarField& T, const scalarField& T,
const label patchi const label patchi
@ -172,7 +286,8 @@ Foam::tmp<Foam::scalarField> Foam::hMixtureThermo<MixtureType>::h
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::scalarField> Foam::hMixtureThermo<MixtureType>::Cp Foam::tmp<Foam::scalarField>
Foam::hMixtureThermo<MixtureType>::Cp
( (
const scalarField& T, const scalarField& T,
const label patchi const label patchi
@ -192,7 +307,8 @@ Foam::tmp<Foam::scalarField> Foam::hMixtureThermo<MixtureType>::Cp
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::volScalarField> Foam::hMixtureThermo<MixtureType>::Cp() const Foam::tmp<Foam::volScalarField>
Foam::hMixtureThermo<MixtureType>::Cp() const
{ {
const fvMesh& mesh = T_.mesh(); const fvMesh& mesh = T_.mesh();
@ -215,9 +331,12 @@ Foam::tmp<Foam::volScalarField> Foam::hMixtureThermo<MixtureType>::Cp() const
volScalarField& cp = tCp(); volScalarField& cp = tCp();
forAll(T_, celli) scalarField& cpCells = cp.internalField();
const scalarField& TCells = T_.internalField();
forAll(TCells, celli)
{ {
cp[celli] = this->cellMixture(celli).Cp(T_[celli]); cpCells[celli] = this->cellMixture(celli).Cp(TCells[celli]);
} }
forAll(T_.boundaryField(), patchi) forAll(T_.boundaryField(), patchi)
@ -229,26 +348,6 @@ Foam::tmp<Foam::volScalarField> Foam::hMixtureThermo<MixtureType>::Cp() const
} }
template<class MixtureType>
void Foam::hMixtureThermo<MixtureType>::correct()
{
if (debug)
{
Info<< "entering hMixtureThermo<MixtureType>::correct()" << endl;
}
// force the saving of the old-time values
psi_.oldTime();
calculate();
if (debug)
{
Info<< "exiting hMixtureThermo<MixtureType>::correct()" << endl;
}
}
template<class MixtureType> template<class MixtureType>
bool Foam::hMixtureThermo<MixtureType>::read() bool Foam::hMixtureThermo<MixtureType>::read()
{ {

View File

@ -73,21 +73,20 @@ public:
hMixtureThermo(const fvMesh&); hMixtureThermo(const fvMesh&);
// Destructor //- Destructor
virtual ~hMixtureThermo(); virtual ~hMixtureThermo();
// Member functions // Member functions
//- Return the compostion of the combustion mixture //- Return the compostion of the combustion mixture
combustionMixture& composition() virtual combustionMixture& composition()
{ {
return *this; return *this;
} }
//- Return the compostion of the combustion mixture //- Return the compostion of the combustion mixture
const combustionMixture& composition() const virtual const combustionMixture& composition() const
{ {
return *this; return *this;
} }
@ -95,28 +94,37 @@ public:
//- Update properties //- Update properties
virtual void correct(); virtual void correct();
//- Sensible enthalpy [J/kg]
virtual tmp<volScalarField> hs() const;
//- Chemical enthalpy [J/kg]
virtual tmp<volScalarField> hc() const;
// Fields derived from thermodynamic state variables // Fields derived from thermodynamic state variables
//- Enthalpy for cell-set [J/kg] //- Enthalpy for cell-set [J/kg]
tmp<scalarField> h virtual tmp<scalarField> h
( (
const scalarField& T, const scalarField& T,
const labelList& cells const labelList& cells
) const; ) const;
//- Enthalpy for patch [J/kg] //- Enthalpy for patch [J/kg]
tmp<scalarField> h virtual tmp<scalarField> h
( (
const scalarField& T, const scalarField& T,
const label patchi const label patchi
) const; ) const;
//- Heat capacity at constant pressure for patch [J/kg/K] //- Heat capacity at constant pressure for patch [J/kg/K]
tmp<scalarField> Cp(const scalarField& T, const label patchi) const; virtual tmp<scalarField> Cp
(
const scalarField& T,
const label patchi
) const;
//- Heat capacity at constant pressure [J/kg/K] //- Heat capacity at constant pressure [J/kg/K]
tmp<volScalarField> Cp() const; virtual tmp<volScalarField> Cp() const;
//- Read thermophysicalProperties dictionary //- Read thermophysicalProperties dictionary

View File

@ -173,6 +173,100 @@ void Foam::hhuMixtureThermo<MixtureType>::correct()
} }
} }
template<class MixtureType>
Foam::tmp<Foam::volScalarField>
Foam::hhuMixtureThermo<MixtureType>::hs() const
{
const fvMesh& mesh = T_.mesh();
tmp<volScalarField> ths
(
new volScalarField
(
IOobject
(
"hs",
mesh.time().timeName(),
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh,
h_.dimensions()
)
);
volScalarField& hsf = ths();
scalarField& hsCells = hsf.internalField();
const scalarField& TCells = T_.internalField();
forAll(TCells, celli)
{
hsCells[celli] = this->cellMixture(celli).Hs(TCells[celli]);
}
forAll(T_.boundaryField(), patchi)
{
scalarField& hsp = hsf.boundaryField()[patchi];
const scalarField& Tp = T_.boundaryField()[patchi];
forAll(Tp, facei)
{
hsp[facei] = this->patchFaceMixture(patchi, facei).Hs(Tp[facei]);
}
}
return ths;
}
template<class MixtureType>
Foam::tmp<Foam::volScalarField>
Foam::hhuMixtureThermo<MixtureType>::hc() const
{
const fvMesh& mesh = T_.mesh();
tmp<volScalarField> thc
(
new volScalarField
(
IOobject
(
"hc",
mesh.time().timeName(),
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh,
h_.dimensions()
)
);
volScalarField& hcf = thc();
scalarField& hcCells = hcf.internalField();
forAll(hcCells, celli)
{
hcCells[celli] = this->cellMixture(celli).Hc();
}
forAll(hcf.boundaryField(), patchi)
{
scalarField& hcp = hcf.boundaryField()[patchi];
forAll(hcp, facei)
{
hcp[facei] = this->patchFaceMixture(patchi, facei).Hc();
}
}
return thc;
}
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::scalarField> Foam::hhuMixtureThermo<MixtureType>::h Foam::tmp<Foam::scalarField> Foam::hhuMixtureThermo<MixtureType>::h
( (
@ -232,7 +326,8 @@ Foam::tmp<Foam::scalarField> Foam::hhuMixtureThermo<MixtureType>::Cp
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::Cp() const Foam::tmp<Foam::volScalarField>
Foam::hhuMixtureThermo<MixtureType>::Cp() const
{ {
const fvMesh& mesh = T_.mesh(); const fvMesh& mesh = T_.mesh();
@ -254,10 +349,12 @@ Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::Cp() const
); );
volScalarField& cp = tCp(); volScalarField& cp = tCp();
scalarField& cpCells = cp.internalField();
const scalarField& TCells = T_.internalField();
forAll(T_, celli) forAll(TCells, celli)
{ {
cp[celli] = this->cellMixture(celli).Cp(T_[celli]); cpCells[celli] = this->cellMixture(celli).Cp(TCells[celli]);
} }
forAll(T_.boundaryField(), patchi) forAll(T_.boundaryField(), patchi)
@ -269,9 +366,9 @@ Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::Cp() const
} }
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::scalarField> Foam::hhuMixtureThermo<MixtureType>::hu Foam::tmp<Foam::scalarField>
Foam::hhuMixtureThermo<MixtureType>::hu
( (
const scalarField& Tu, const scalarField& Tu,
const labelList& cells const labelList& cells
@ -290,7 +387,8 @@ Foam::tmp<Foam::scalarField> Foam::hhuMixtureThermo<MixtureType>::hu
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::scalarField> Foam::hhuMixtureThermo<MixtureType>::hu Foam::tmp<Foam::scalarField>
Foam::hhuMixtureThermo<MixtureType>::hu
( (
const scalarField& Tu, const scalarField& Tu,
const label patchi const label patchi
@ -309,7 +407,8 @@ Foam::tmp<Foam::scalarField> Foam::hhuMixtureThermo<MixtureType>::hu
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::Tb() const Foam::tmp<Foam::volScalarField>
Foam::hhuMixtureThermo<MixtureType>::Tb() const
{ {
tmp<volScalarField> tTb tmp<volScalarField> tTb
( (
@ -328,10 +427,14 @@ Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::Tb() const
); );
volScalarField& Tb_ = tTb(); volScalarField& Tb_ = tTb();
scalarField& TbCells = Tb_.internalField();
const scalarField& TCells = T_.internalField();
const scalarField& hCells = h_.internalField();
forAll(Tb_, celli) forAll(TbCells, celli)
{ {
Tb_[celli] = this->cellProducts(celli).TH(h_[celli], T_[celli]); TbCells[celli] =
this->cellProducts(celli).TH(hCells[celli], TCells[celli]);
} }
forAll(Tb_.boundaryField(), patchi) forAll(Tb_.boundaryField(), patchi)
@ -344,7 +447,8 @@ Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::Tb() const
forAll(pTb, facei) forAll(pTb, facei)
{ {
pTb[facei] = pTb[facei] =
this->patchFaceProducts(patchi, facei).TH(ph[facei], pT[facei]); this->patchFaceProducts(patchi, facei)
.TH(ph[facei], pT[facei]);
} }
} }
@ -374,10 +478,14 @@ Foam::hhuMixtureThermo<MixtureType>::psiu() const
); );
volScalarField& psiu = tpsiu(); volScalarField& psiu = tpsiu();
scalarField& psiuCells = psiu.internalField();
const scalarField& TuCells = Tu_.internalField();
const scalarField& pCells = p_.internalField();
forAll(psiu, celli) forAll(psiuCells, celli)
{ {
psiu[celli] = this->cellReactants(celli).psi(p_[celli], Tu_[celli]); psiuCells[celli] =
this->cellReactants(celli).psi(pCells[celli], TuCells[celli]);
} }
forAll(psiu.boundaryField(), patchi) forAll(psiu.boundaryField(), patchi)
@ -421,12 +529,15 @@ Foam::hhuMixtureThermo<MixtureType>::psib() const
); );
volScalarField& psib = tpsib(); volScalarField& psib = tpsib();
scalarField& psibCells = psib.internalField();
volScalarField Tb_ = Tb(); volScalarField Tb_ = Tb();
const scalarField& TbCells = Tb_.internalField();
const scalarField& pCells = p_.internalField();
forAll(psib, celli) forAll(psibCells, celli)
{ {
psib[celli] = this->cellReactants(celli).psi(p_[celli], Tb_[celli]); psibCells[celli] =
this->cellReactants(celli).psi(pCells[celli], TbCells[celli]);
} }
forAll(psib.boundaryField(), patchi) forAll(psib.boundaryField(), patchi)
@ -449,7 +560,8 @@ Foam::hhuMixtureThermo<MixtureType>::psib() const
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::muu() const Foam::tmp<Foam::volScalarField>
Foam::hhuMixtureThermo<MixtureType>::muu() const
{ {
tmp<volScalarField> tmuu tmp<volScalarField> tmuu
( (
@ -469,10 +581,12 @@ Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::muu() const
); );
volScalarField& muu_ = tmuu(); volScalarField& muu_ = tmuu();
scalarField& muuCells = muu_.internalField();
const scalarField& TuCells = Tu_.internalField();
forAll(muu_, celli) forAll(muuCells, celli)
{ {
muu_[celli] = this->cellReactants(celli).mu(Tu_[celli]); muuCells[celli] = this->cellReactants(celli).mu(TuCells[celli]);
} }
forAll(muu_.boundaryField(), patchi) forAll(muu_.boundaryField(), patchi)
@ -492,7 +606,8 @@ Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::muu() const
template<class MixtureType> template<class MixtureType>
Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::mub() const Foam::tmp<Foam::volScalarField>
Foam::hhuMixtureThermo<MixtureType>::mub() const
{ {
tmp<volScalarField> tmub tmp<volScalarField> tmub
( (
@ -512,11 +627,13 @@ Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::mub() const
); );
volScalarField& mub_ = tmub(); volScalarField& mub_ = tmub();
scalarField& mubCells = mub_.internalField();
volScalarField Tb_ = Tb(); volScalarField Tb_ = Tb();
const scalarField& TbCells = Tb_.internalField();
forAll(mub_, celli) forAll(mubCells, celli)
{ {
mub_[celli] = this->cellProducts(celli).mu(Tb_[celli]); mubCells[celli] = this->cellProducts(celli).mu(TbCells[celli]);
} }
forAll(mub_.boundaryField(), patchi) forAll(mub_.boundaryField(), patchi)
@ -526,7 +643,8 @@ Foam::tmp<Foam::volScalarField> Foam::hhuMixtureThermo<MixtureType>::mub() const
forAll(pMub, facei) forAll(pMub, facei)
{ {
pMub[facei] = this->patchFaceProducts(patchi, facei).mu(pTb[facei]); pMub[facei] =
this->patchFaceProducts(patchi, facei).mu(pTb[facei]);
} }
} }

View File

@ -73,21 +73,20 @@ public:
hhuMixtureThermo(const fvMesh&); hhuMixtureThermo(const fvMesh&);
// Destructor //- Destructor
virtual ~hhuMixtureThermo(); virtual ~hhuMixtureThermo();
// Member functions // Member functions
//- Return the compostion of the combustion mixture //- Return the compostion of the combustion mixture
combustionMixture& composition() virtual combustionMixture& composition()
{ {
return *this; return *this;
} }
//- Return the compostion of the combustion mixture //- Return the compostion of the combustion mixture
const combustionMixture& composition() const virtual const combustionMixture& composition() const
{ {
return *this; return *this;
} }
@ -95,38 +94,48 @@ public:
//- Update properties //- Update properties
virtual void correct(); virtual void correct();
//- Sensible enthalpy [J/kg]
virtual tmp<volScalarField> hs() const;
//- Chemical enthalpy [J/kg]
virtual tmp<volScalarField> hc() const;
// Fields derived from thermodynamic state variables // Fields derived from thermodynamic state variables
//- Enthalpy for cell-set [J/kg] //- Enthalpy for cell-set [J/kg]
tmp<scalarField> h virtual tmp<scalarField> h
( (
const scalarField& T, const scalarField& T,
const labelList& cells const labelList& cells
) const; ) const;
//- Enthalpy for patch [J/kg] //- Enthalpy for patch [J/kg]
tmp<scalarField> h virtual tmp<scalarField> h
( (
const scalarField& T, const scalarField& T,
const label patchi const label patchi
) const; ) const;
//- Heat capacity at constant pressure for patch [J/kg/K] //- Heat capacity at constant pressure for patch [J/kg/K]
tmp<scalarField> Cp(const scalarField& T, const label patchi) const; virtual tmp<scalarField> Cp
(
const scalarField& T,
const label patchi
) const;
//- Heat capacity at constant pressure [J/kg/K] //- Heat capacity at constant pressure [J/kg/K]
tmp<volScalarField> Cp() const; virtual tmp<volScalarField> Cp() const;
//- Unburnt gas enthalpy for cell-set [J/kg] //- Unburnt gas enthalpy for cell-set [J/kg]
tmp<scalarField> hu virtual tmp<scalarField> hu
( (
const scalarField& T, const scalarField& T,
const labelList& cells const labelList& cells
) const; ) const;
//- Unburnt gas enthalpy for patch [J/kg] //- Unburnt gas enthalpy for patch [J/kg]
tmp<scalarField> hu virtual tmp<scalarField> hu
( (
const scalarField& T, const scalarField& T,
const label patchi const label patchi
@ -134,22 +143,22 @@ public:
//- Burnt gas temperature [K] //- Burnt gas temperature [K]
tmp<volScalarField> Tb() const; virtual tmp<volScalarField> Tb() const;
//- Unburnt gas compressibility [s^2/m^2] //- Unburnt gas compressibility [s^2/m^2]
tmp<volScalarField> psiu() const; virtual tmp<volScalarField> psiu() const;
//- Burnt gas compressibility [s^2/m^2] //- Burnt gas compressibility [s^2/m^2]
tmp<volScalarField> psib() const; virtual tmp<volScalarField> psib() const;
// Access to transport variables // Access to transport variables
//- Dynamic viscosity of unburnt gas [kg/ms] //- Dynamic viscosity of unburnt gas [kg/ms]
tmp<volScalarField> muu() const; virtual tmp<volScalarField> muu() const;
//- Dynamic viscosity of burnt gas [kg/ms] //- Dynamic viscosity of burnt gas [kg/ms]
tmp<volScalarField> mub() const; virtual tmp<volScalarField> mub() const;
//- Read thermophysicalProperties dictionary //- Read thermophysicalProperties dictionary

View File

@ -22,35 +22,27 @@ License
along with OpenFOAM; if not, write to the Free Software Foundation, along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
Base class of the thermophysical property types.
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "specie.H" #include "specie.H"
#include "IOstreams.H" #include "IOstreams.H"
#include "dimensionedConstants.H" #include "dimensionedConstants.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/* * * * * * * * * * * * * public constants * * * * * * * * * * * * */ /* * * * * * * * * * * * * public constants * * * * * * * * * * * * */
//- Universal gas constant (default in [J/(kmol K)]) //- Universal gas constant (default in [J/(kmol K)])
const scalar specie::RR = dimensionedConstant("R", 8314.51); const Foam::scalar Foam::specie::RR = dimensionedConstant("R", 8314.51);
//- Standard pressure (default in [Pa]) //- Standard pressure (default in [Pa])
const scalar specie::Pstd = dimensionedConstant("Pstd", 1.0e5); const Foam::scalar Foam::specie::Pstd = dimensionedConstant("Pstd", 1.0e5);
//- Standard temperature (default in [K]) //- Standard temperature (default in [K])
const scalar specie::Tstd = dimensionedConstant("Tstd", 298.15); const Foam::scalar Foam::specie::Tstd = dimensionedConstant("Tstd", 298.15);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
specie::specie(Istream& is) Foam::specie::specie(Istream& is)
: :
name_(is), name_(is),
nMoles_(readScalar(is)), nMoles_(readScalar(is)),
@ -62,7 +54,7 @@ specie::specie(Istream& is)
// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
Ostream& operator<<(Ostream& os, const specie& st) Foam::Ostream& Foam::operator<<(Ostream& os, const specie& st)
{ {
os << st.name_ << tab os << st.name_ << tab
<< st.nMoles_ << tab << st.nMoles_ << tab
@ -73,8 +65,4 @@ Ostream& operator<<(Ostream& os, const specie& st)
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -22,27 +22,18 @@ License
along with OpenFOAM; if not, write to the Free Software Foundation, along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
Constant properties thermodynamics package derived from the basic
thermo package data type specieThermo.
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "eConstThermo.H" #include "eConstThermo.H"
#include "IOstreams.H" #include "IOstreams.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
eConstThermo::eConstThermo(Istream& is) Foam::eConstThermo::eConstThermo(Istream& is)
: :
specieThermo(is), specieThermo(is),
CV(readScalar(is)), Cv_(readScalar(is)),
Hf(readScalar(is)) Hf_(readScalar(is))
{ {
is.check("eConstThermo::eConstThermo(Istream& is)"); is.check("eConstThermo::eConstThermo(Istream& is)");
} }
@ -50,17 +41,13 @@ eConstThermo::eConstThermo(Istream& is)
// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
Ostream& operator<<(Ostream& os, const eConstThermo& ct) Foam::Ostream& Foam::operator<<(Ostream& os, const eConstThermo& ct)
{ {
os << (const specieThermo&)ct << tab << ct.CV << tab << ct.Hf; os << (const specieThermo&)ct << tab << ct.Cv_ << tab << ct.Hf_;
os.check("Ostream& operator<<(Ostream& os, const eConstThermo& ct)"); os.check("Ostream& operator<<(Ostream& os, const eConstThermo& ct)");
return os; return os;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -95,13 +95,13 @@ class eConstThermo
{ {
// Private data // Private data
scalar CV; scalar Cv_;
scalar Hf; scalar Hf_;
// Private member functions // Private member functions
//- construct from components //- Construct from components
inline eConstThermo inline eConstThermo
( (
const specieThermo& st, const specieThermo& st,
@ -109,6 +109,7 @@ class eConstThermo
const scalar hf const scalar hf
); );
public: public:
// Constructors // Constructors
@ -136,6 +137,12 @@ public:
//- Enthalpy [J/kmol] //- Enthalpy [J/kmol]
inline scalar h(const scalar T) const; inline scalar h(const scalar T) const;
//- Sensible Enthalpy [J/kmol]
inline scalar hs(const scalar T) const;
//- Chemical enthalpy [J/kmol]
inline scalar hc() const;
//- Entropy [J/(kmol K)] //- Entropy [J/(kmol K)]
inline scalar s(const scalar T) const; inline scalar s(const scalar T) const;

View File

@ -34,8 +34,8 @@ inline Foam::eConstThermo::eConstThermo
) )
: :
specieThermo(st), specieThermo(st),
CV(cv), Cv_(cv),
Hf(hf) Hf_(hf)
{} {}
@ -48,8 +48,8 @@ inline Foam::eConstThermo::eConstThermo
) )
: :
specieThermo(name, ct), specieThermo(name, ct),
CV(ct.CV), Cv_(ct.Cv_),
Hf(ct.Hf) Hf_(ct.Hf_)
{} {}
@ -79,13 +79,26 @@ Foam::eConstThermo<equationOfState>::New(Istream& is)
inline Foam::scalar Foam::eConstThermo::cp(const scalar) const inline Foam::scalar Foam::eConstThermo::cp(const scalar) const
{ {
return CV*W() + RR; return Cv_*W() + RR;
} }
inline Foam::scalar Foam::eConstThermo::h(const scalar T) const inline Foam::scalar Foam::eConstThermo::h(const scalar T) const
{ {
return cp(T)*T + Hf*W(); return cp(T)*T + Hf_*W();
}
inline Foam::scalar Foam::eConstThermo::hs(const scalar T) const
{
return cp(T)*T;
}
template<class equationOfState>
inline Foam::scalar Foam::eConstThermo<equationOfState>::hc() const
{
return Hf_*this->W();
} }
@ -102,7 +115,7 @@ inline Foam::scalar Foam::eConstThermo::TH
const scalar T0 const scalar T0
) const ) const
{ {
return (h - Hf)/Cp(T0); return (h - Hf_)/Cp(T0);
} }
@ -112,7 +125,7 @@ inline Foam::scalar Foam::eConstThermo::TE
const scalar const scalar
) const ) const
{ {
return (e - Hf)/CV; return (e - Hf_)/Cv_;
} }
@ -125,8 +138,8 @@ inline Foam::eConstThermo& Foam::eConstThermo::operator=
{ {
specieThermo::operator=(ct); specieThermo::operator=(ct);
CV = ct.CV; Cv_ = ct.Cv_;
Hf = ct.Hf; Hf_ = ct.Hf_;
return *this; return *this;
} }
@ -145,8 +158,8 @@ inline Foam::eConstThermo Foam::operator+
return eConstThermo return eConstThermo
( (
st, st,
ct1.nMoles()/st.nMoles()*ct1.CV + ct2.nMoles()/st.nMoles()*ct2.CV, ct1.nMoles()/st.nMoles()*ct1.Cv_ + ct2.nMoles()/st.nMoles()*ct2.Cv_,
ct1.nMoles()/st.nMoles()*ct1.Hf + ct2.nMoles()/st.nMoles()*ct2.Hf ct1.nMoles()/st.nMoles()*ct1.Hf_ + ct2.nMoles()/st.nMoles()*ct2.Hf_
); );
} }
@ -162,8 +175,8 @@ inline Foam::eConstThermo Foam::operator-
return eConstThermo return eConstThermo
( (
st, st,
ct1.nMoles()/st.nMoles()*ct1.CV - ct2.nMoles()/st.nMoles()*ct2.CV, ct1.nMoles()/st.nMoles()*ct1.Cv_ - ct2.nMoles()/st.nMoles()*ct2.Cv_,
ct1.nMoles()/st.nMoles()*ct1.Hf - ct2.nMoles()/st.nMoles()*ct2.Hf ct1.nMoles()/st.nMoles()*ct1.Hf_ - ct2.nMoles()/st.nMoles()*ct2.Hf_
); );
} }
@ -177,8 +190,8 @@ inline Foam::eConstThermo Foam::operator*
return eConstThermo return eConstThermo
( (
s*((const specieThermo&)ct), s*((const specieThermo&)ct),
ct.CV, ct.Cv_,
ct.Hf ct.Hf_
); );
} }

View File

@ -22,28 +22,19 @@ License
along with OpenFOAM; if not, write to the Free Software Foundation, along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
Constant properties thermodynamics package
templated ito the equationOfState.
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "hConstThermo.H" #include "hConstThermo.H"
#include "IOstreams.H" #include "IOstreams.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class equationOfState> template<class equationOfState>
hConstThermo<equationOfState>::hConstThermo(Istream& is) Foam::hConstThermo<equationOfState>::hConstThermo(Istream& is)
: :
equationOfState(is), equationOfState(is),
CP(readScalar(is)), Cp_(readScalar(is)),
Hf(readScalar(is)) Hf_(readScalar(is))
{ {
is.check("hConstThermo::hConstThermo(Istream& is)"); is.check("hConstThermo::hConstThermo(Istream& is)");
} }
@ -52,18 +43,18 @@ hConstThermo<equationOfState>::hConstThermo(Istream& is)
// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
template<class equationOfState> template<class equationOfState>
Ostream& operator<<(Ostream& os, const hConstThermo<equationOfState>& ct) Foam::Ostream& Foam::operator<<
(
Ostream& os,
const hConstThermo<equationOfState>& ct
)
{ {
os << static_cast<const equationOfState&>(ct) << tab os << static_cast<const equationOfState&>(ct) << tab
<< ct.CP << tab << ct.Hf; << ct.Cp_ << tab << ct.Hf_;
os.check("Ostream& operator<<(Ostream& os, const hConstThermo& ct)"); os.check("Ostream& operator<<(Ostream& os, const hConstThermo& ct)");
return os; return os;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -94,13 +94,13 @@ class hConstThermo
{ {
// Private data // Private data
scalar CP; scalar Cp_;
scalar Hf; scalar Hf_;
// Private member functions // Private member functions
//- construct from components //- Construct from components
inline hConstThermo inline hConstThermo
( (
const equationOfState& st, const equationOfState& st,
@ -136,6 +136,12 @@ public:
//- Enthalpy [J/kmol] //- Enthalpy [J/kmol]
inline scalar h(const scalar T) const; inline scalar h(const scalar T) const;
//- Sensible enthalpy [J/kmol]
inline scalar hs(const scalar T) const;
//- Chemical enthalpy [J/kmol]
inline scalar hc() const;
//- Entropy [J/(kmol K)] //- Entropy [J/(kmol K)]
inline scalar s(const scalar T) const; inline scalar s(const scalar T) const;

View File

@ -35,8 +35,8 @@ inline Foam::hConstThermo<equationOfState>::hConstThermo
) )
: :
equationOfState(st), equationOfState(st),
CP(cp), Cp_(cp),
Hf(hf) Hf_(hf)
{} {}
@ -50,8 +50,8 @@ inline Foam::hConstThermo<equationOfState>::hConstThermo
) )
: :
equationOfState(name, ct), equationOfState(name, ct),
CP(ct.CP), Cp_(ct.Cp_),
Hf(ct.Hf) Hf_(ct.Hf_)
{} {}
@ -80,21 +80,47 @@ Foam::hConstThermo<equationOfState>::New(Istream& is)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class equationOfState> template<class equationOfState>
inline Foam::scalar Foam::hConstThermo<equationOfState>::cp(const scalar) const inline Foam::scalar Foam::hConstThermo<equationOfState>::cp
(
const scalar
) const
{ {
return CP*this->W(); return Cp_*this->W();
} }
template<class equationOfState> template<class equationOfState>
inline Foam::scalar Foam::hConstThermo<equationOfState>::h(const scalar T) const inline Foam::scalar Foam::hConstThermo<equationOfState>::h
(
const scalar T
) const
{ {
return (CP*T + Hf)*this->W(); return (Cp_*T + Hf_)*this->W();
} }
template<class equationOfState> template<class equationOfState>
inline Foam::scalar Foam::hConstThermo<equationOfState>::s(const scalar T) const inline Foam::scalar Foam::hConstThermo<equationOfState>::hs
(
const scalar T
) const
{
return Cp_*T*this->W();
}
template<class equationOfState>
inline Foam::scalar Foam::hConstThermo<equationOfState>::hc() const
{
return Hf_*this->W();
}
template<class equationOfState>
inline Foam::scalar Foam::hConstThermo<equationOfState>::s
(
const scalar T
) const
{ {
notImplemented notImplemented
( (
@ -119,8 +145,8 @@ inline void Foam::hConstThermo<equationOfState>::operator+=
molr1 /= this->nMoles(); molr1 /= this->nMoles();
scalar molr2 = ct.nMoles()/this->nMoles(); scalar molr2 = ct.nMoles()/this->nMoles();
CP = molr1*CP + molr2*ct.CP; Cp_ = molr1*Cp_ + molr2*ct.Cp_;
Hf = molr1*Hf + molr2*ct.Hf; Hf_ = molr1*Hf_ + molr2*ct.Hf_;
} }
@ -137,8 +163,8 @@ inline void Foam::hConstThermo<equationOfState>::operator-=
molr1 /= this->nMoles(); molr1 /= this->nMoles();
scalar molr2 = ct.nMoles()/this->nMoles(); scalar molr2 = ct.nMoles()/this->nMoles();
CP = molr1*CP - molr2*ct.CP; Cp_ = molr1*Cp_ - molr2*ct.Cp_;
Hf = molr1*Hf - molr2*ct.Hf; Hf_ = molr1*Hf_ - molr2*ct.Hf_;
} }
@ -160,8 +186,10 @@ inline Foam::hConstThermo<equationOfState> Foam::operator+
return hConstThermo<equationOfState> return hConstThermo<equationOfState>
( (
eofs, eofs,
ct1.nMoles()/eofs.nMoles()*ct1.CP + ct2.nMoles()/eofs.nMoles()*ct2.CP, ct1.nMoles()/eofs.nMoles()*ct1.Cp_
ct1.nMoles()/eofs.nMoles()*ct1.Hf + ct2.nMoles()/eofs.nMoles()*ct2.Hf + ct2.nMoles()/eofs.nMoles()*ct2.Cp_,
ct1.nMoles()/eofs.nMoles()*ct1.Hf_
+ ct2.nMoles()/eofs.nMoles()*ct2.Hf_
); );
} }
@ -182,8 +210,10 @@ inline Foam::hConstThermo<equationOfState> Foam::operator-
return hConstThermo<equationOfState> return hConstThermo<equationOfState>
( (
eofs, eofs,
ct1.nMoles()/eofs.nMoles()*ct1.CP - ct2.nMoles()/eofs.nMoles()*ct2.CP, ct1.nMoles()/eofs.nMoles()*ct1.Cp_
ct1.nMoles()/eofs.nMoles()*ct1.Hf - ct2.nMoles()/eofs.nMoles()*ct2.Hf - ct2.nMoles()/eofs.nMoles()*ct2.Cp_,
ct1.nMoles()/eofs.nMoles()*ct1.Hf_
- ct2.nMoles()/eofs.nMoles()*ct2.Hf_
); );
} }
@ -198,8 +228,8 @@ inline Foam::hConstThermo<equationOfState> Foam::operator*
return hConstThermo<equationOfState> return hConstThermo<equationOfState>
( (
s*static_cast<const equationOfState&>(ct), s*static_cast<const equationOfState&>(ct),
ct.CP, ct.Cp_,
ct.Hf ct.Hf_
); );
} }

View File

@ -22,23 +22,15 @@ License
along with OpenFOAM; if not, write to the Free Software Foundation, along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
JANAF tables based thermodynamics package templated ito the equationOfState.
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "janafThermo.H" #include "janafThermo.H"
#include "IOstreams.H" #include "IOstreams.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class equationOfState> template<class equationOfState>
janafThermo<equationOfState>::janafThermo(Istream& is) Foam::janafThermo<equationOfState>::janafThermo(Istream& is)
: :
equationOfState(is), equationOfState(is),
Tlow_(readScalar(is)), Tlow_(readScalar(is)),
@ -103,7 +95,11 @@ janafThermo<equationOfState>::janafThermo(Istream& is)
// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
template<class equationOfState> template<class equationOfState>
Ostream& operator<<(Ostream& os, const janafThermo<equationOfState>& jt) Foam::Ostream& Foam::operator<<
(
Ostream& os,
const janafThermo<equationOfState>& jt
)
{ {
os << static_cast<const equationOfState&>(jt) << nl os << static_cast<const equationOfState&>(jt) << nl
<< " " << jt.Tlow_ << " " << jt.Tlow_
@ -145,8 +141,4 @@ Ostream& operator<<(Ostream& os, const janafThermo<equationOfState>& jt)
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -150,6 +150,12 @@ public:
//- Enthalpy [J/kmol] //- Enthalpy [J/kmol]
inline scalar h(const scalar T) const; inline scalar h(const scalar T) const;
//- Sensible enthalpy [J/kmol]
inline scalar hs(const scalar T) const;
//- Chemical enthalpy [J/kmol]
inline scalar hc() const;
//- Entropy [J/(kmol K)] //- Entropy [J/(kmol K)]
inline scalar s(const scalar T) const; inline scalar s(const scalar T) const;

View File

@ -25,6 +25,7 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "janafThermo.H" #include "janafThermo.H"
#include "specie.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
@ -130,8 +131,7 @@ inline Foam::scalar Foam::janafThermo<equationOfState>::h
) const ) const
{ {
const coeffArray& a = coeffs(T); const coeffArray& a = coeffs(T);
return return this->RR*
this->RR*
( (
((((a[4]/5.0*T + a[3]/4.0)*T + a[2]/3.0)*T + a[1]/2.0)*T + a[0])*T ((((a[4]/5.0*T + a[3]/4.0)*T + a[2]/3.0)*T + a[1]/2.0)*T + a[0])*T
+ a[5] + a[5]
@ -139,6 +139,36 @@ inline Foam::scalar Foam::janafThermo<equationOfState>::h
} }
template<class equationOfState>
inline Foam::scalar Foam::janafThermo<equationOfState>::hs
(
const scalar T
) const
{
const coeffArray& a = coeffs(T);
scalar Tr = T - specie::Tstd;
return this->RR*
(
((((a[4]/5.0*Tr + a[3]/4.0)*Tr + a[2]/3.0)*Tr + a[1]/2.0)*Tr + a[0])*Tr
);
}
template<class equationOfState>
inline Foam::scalar Foam::janafThermo<equationOfState>::hc() const
{
const coeffArray& a = lowCpCoeffs_;
const scalar& Tstd = specie::Tstd;
return this->RR*
(
(
(((a[4]/5.0*Tstd + a[3]/4.0)*Tstd + a[2]/3.0)*Tstd + a[1]/2.0)*Tstd
+ a[0]
)*Tstd
);
}
template<class equationOfState> template<class equationOfState>
inline Foam::scalar Foam::janafThermo<equationOfState>::s inline Foam::scalar Foam::janafThermo<equationOfState>::s
( (

View File

@ -22,34 +22,24 @@ License
along with OpenFOAM; if not, write to the Free Software Foundation, along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
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.
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "specieThermo.H" #include "specieThermo.H"
#include "IOstreams.H" #include "IOstreams.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * private static data * * * * * * * * * * * * * */
template<class thermo> template<class thermo>
const scalar specieThermo<thermo>::tol_ = 1.0e-4; const Foam::scalar Foam::specieThermo<thermo>::tol_ = 1.0e-4;
template<class thermo> template<class thermo>
const int specieThermo<thermo>::maxIter_ = 100; const int Foam::specieThermo<thermo>::maxIter_ = 100;
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class thermo> template<class thermo>
specieThermo<thermo>::specieThermo(Istream& is) Foam::specieThermo<thermo>::specieThermo(Istream& is)
: :
thermo(is) thermo(is)
{ {
@ -60,7 +50,7 @@ specieThermo<thermo>::specieThermo(Istream& is)
// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
template<class thermo> template<class thermo>
Ostream& operator<<(Ostream& os, const specieThermo<thermo>& st) Foam::Ostream& Foam::operator<<(Ostream& os, const specieThermo<thermo>& st)
{ {
os << static_cast<const thermo&>(st); os << static_cast<const thermo&>(st);
@ -69,8 +59,4 @@ Ostream& operator<<(Ostream& os, const specieThermo<thermo>& st)
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -140,6 +140,12 @@ public:
// Enthalpy [J/kmol] // Enthalpy [J/kmol]
//scalar h(const scalar) const; //scalar h(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)] // Entropy [J/(kmol K)]
//scalar s(const scalar) const; //scalar s(const scalar) const;
@ -158,6 +164,9 @@ public:
//- Internal energy [J/kmol] //- Internal energy [J/kmol]
inline scalar e(const scalar T) const; inline scalar e(const scalar T) const;
//- Sensible internal energy [J/kmol]
inline scalar es(const scalar T) const;
//- Gibbs free energy [J/kmol] //- Gibbs free energy [J/kmol]
inline scalar g(const scalar T) const; inline scalar g(const scalar T) const;
@ -176,6 +185,12 @@ public:
//- Enthalpy [J/kg] //- Enthalpy [J/kg]
inline scalar H(const scalar T) const; inline scalar H(const scalar T) const;
//- Sensible enthalpy [J/kg]
inline scalar Hs(const scalar T) const;
//- Chemical enthalpy [J/kg]
inline scalar Hc() const;
//- Entropy [J/(kg K)] //- Entropy [J/(kg K)]
inline scalar S(const scalar T) const; inline scalar S(const scalar T) const;

View File

@ -24,20 +24,12 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "error.H"
#include "specieThermo.H" #include "specieThermo.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// construct from components
template<class thermo> template<class thermo>
inline specieThermo<thermo>::specieThermo inline Foam::specieThermo<thermo>::specieThermo
( (
const thermo& sp const thermo& sp
) )
@ -46,10 +38,8 @@ inline specieThermo<thermo>::specieThermo
{} {}
// return the temperature corresponding to the value of the
// thermodynamic property f, given the function f = F(T) and dF(T)/dT
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::T inline Foam::scalar Foam::specieThermo<thermo>::T
( (
scalar f, scalar f,
scalar T0, scalar T0,
@ -87,9 +77,8 @@ inline scalar specieThermo<thermo>::T
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct as named copy
template<class thermo> template<class thermo>
inline specieThermo<thermo>::specieThermo inline Foam::specieThermo<thermo>::specieThermo
( (
const word& name, const word& name,
const specieThermo& st const specieThermo& st
@ -101,105 +90,114 @@ inline specieThermo<thermo>::specieThermo
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
// Calculate and return derived properties
// (These functions need not provided in derived types)
// mole specific properties
// Heat capacities [J/(kmol K)]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::cv(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::cv(const scalar T) const
{ {
return this->cp(T) - this->RR; return this->cp(T) - this->RR;
} }
// gamma = cp/cv []
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::gamma(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::gamma(const scalar T) const
{ {
scalar CP = this->cp(T); scalar CP = this->cp(T);
return CP/(CP - this->RR); return CP/(CP - this->RR);
} }
// Internal energy [J/kmol]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::e(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::e(const scalar T) const
{ {
return this->h(T) - this->RR*(T - this->Tstd); return this->h(T) - this->RR*(T - this->Tstd);
} }
// Gibbs free energy [J/kmol]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::g(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::es(const scalar T) const
{
return this->hs(T) - this->RR*(T - this->Tstd);
}
template<class thermo>
inline Foam::scalar Foam::specieThermo<thermo>::g(const scalar T) const
{ {
return this->h(T) - T*this->s(T); return this->h(T) - T*this->s(T);
} }
// Helmholtz free energy [J/kmol]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::a(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::a(const scalar T) const
{ {
return this->e(T) - T*this->s(T); return this->e(T) - T*this->s(T);
} }
// mass specific properties
// Heat capacity at constant pressure [J/(kg K)]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::Cp(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::Cp(const scalar T) const
{ {
return this->cp(T)/this->W(); return this->cp(T)/this->W();
} }
// Heat capacity at constant pressure [J/(kg K)]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::Cv(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::Cv(const scalar T) const
{ {
return this->cv(T)/this->W(); return this->cv(T)/this->W();
} }
// Enthalpy [J/kg]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::H(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::H(const scalar T) const
{ {
return this->h(T)/this->W(); return this->h(T)/this->W();
} }
// Entropy [J/kg]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::S(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::Hs(const scalar T) const
{
return this->hs(T)/this->W();
}
template<class thermo>
inline Foam::scalar Foam::specieThermo<thermo>::Hc() const
{
return this->hc()/this->W();
}
template<class thermo>
inline Foam::scalar Foam::specieThermo<thermo>::S(const scalar T) const
{ {
return this->s(T)/this->W(); return this->s(T)/this->W();
} }
// Internal energy [J/kg]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::E(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::E(const scalar T) const
{ {
return this->e(T)/this->W(); return this->e(T)/this->W();
} }
// Gibbs free energy [J/kg]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::G(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::G(const scalar T) const
{ {
return this->g(T)/this->W(); return this->g(T)/this->W();
} }
// Helmholtz free energy [J/kg]
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::A(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::A(const scalar T) const
{ {
return this->a(T)/this->W(); return this->a(T)/this->W();
} }
// Equilibrium reaction thermodynamics
// Equilibrium constant []
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::K(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::K(const scalar T) const
{ {
scalar arg = -this->nMoles()*this->g(T)/(this->RR*T); scalar arg = -this->nMoles()*this->g(T)/(this->RR*T);
@ -213,21 +211,16 @@ inline scalar specieThermo<thermo>::K(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
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::Kp(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::Kp(const scalar T) const
{ {
return K(T); return K(T);
} }
//- Equilibrium constant i.t.o. concentration
// For low pressures (where the gas mixture is near perfect)
// Kc = Kp(pstd/(RR*T))^nu
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::Kc(const scalar T) const inline Foam::scalar Foam::specieThermo<thermo>::Kc(const scalar T) const
{ {
if (equal(this->nMoles(), SMALL)) if (equal(this->nMoles(), SMALL))
{ {
@ -240,11 +233,12 @@ inline scalar specieThermo<thermo>::Kc(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
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::Kx(const scalar T, const scalar p) const inline Foam::scalar Foam::specieThermo<thermo>::Kx
(
const scalar T,
const scalar p
) const
{ {
if (equal(this->nMoles(), SMALL)) if (equal(this->nMoles(), SMALL))
{ {
@ -257,11 +251,8 @@ inline scalar specieThermo<thermo>::Kx(const scalar T, const scalar p) 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
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::Kn inline Foam::scalar Foam::specieThermo<thermo>::Kn
( (
const scalar T, const scalar T,
const scalar p, const scalar p,
@ -279,19 +270,23 @@ inline scalar specieThermo<thermo>::Kn
} }
// Energy->temperature inversion functions
// Temperature from Enthalpy given an initial temperature T0
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::TH(const scalar h, const scalar T0) const inline Foam::scalar Foam::specieThermo<thermo>::TH
(
const scalar h,
const scalar T0
) const
{ {
return T(h, T0, &specieThermo<thermo>::H, &specieThermo<thermo>::Cp); return T(h, T0, &specieThermo<thermo>::H, &specieThermo<thermo>::Cp);
} }
// Temperature from internal energy given an initial temperature T0
template<class thermo> template<class thermo>
inline scalar specieThermo<thermo>::TE(const scalar e, const scalar T0) const inline Foam::scalar Foam::specieThermo<thermo>::TE
(
const scalar e,
const scalar T0
) const
{ {
return T(e, T0, &specieThermo<thermo>::E, &specieThermo<thermo>::Cv); return T(e, T0, &specieThermo<thermo>::E, &specieThermo<thermo>::Cv);
} }
@ -300,19 +295,25 @@ inline scalar specieThermo<thermo>::TE(const scalar e, const scalar T0) const
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
template<class thermo> template<class thermo>
inline void specieThermo<thermo>::operator+=(const specieThermo<thermo>& st) inline void Foam::specieThermo<thermo>::operator+=
(
const specieThermo<thermo>& st
)
{ {
thermo::operator+=(st); thermo::operator+=(st);
} }
template<class thermo> template<class thermo>
inline void specieThermo<thermo>::operator-=(const specieThermo<thermo>& st) inline void Foam::specieThermo<thermo>::operator-=
(
const specieThermo<thermo>& st
)
{ {
thermo::operator-=(st); thermo::operator-=(st);
} }
template<class thermo> template<class thermo>
inline void specieThermo<thermo>::operator*=(const scalar s) inline void Foam::specieThermo<thermo>::operator*=(const scalar s)
{ {
thermo::operator*=(s); thermo::operator*=(s);
} }
@ -321,7 +322,7 @@ inline void specieThermo<thermo>::operator*=(const scalar s)
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
template<class thermo> template<class thermo>
inline specieThermo<thermo> operator+ inline Foam::specieThermo<thermo> Foam::operator+
( (
const specieThermo<thermo>& st1, const specieThermo<thermo>& st1,
const specieThermo<thermo>& st2 const specieThermo<thermo>& st2
@ -335,7 +336,7 @@ inline specieThermo<thermo> operator+
template<class thermo> template<class thermo>
inline specieThermo<thermo> operator- inline Foam::specieThermo<thermo> Foam::operator-
( (
const specieThermo<thermo>& st1, const specieThermo<thermo>& st1,
const specieThermo<thermo>& st2 const specieThermo<thermo>& st2
@ -349,7 +350,7 @@ inline specieThermo<thermo> operator-
template<class thermo> template<class thermo>
inline specieThermo<thermo> operator* inline Foam::specieThermo<thermo> Foam::operator*
( (
const scalar s, const scalar s,
const specieThermo<thermo>& st const specieThermo<thermo>& st
@ -363,7 +364,7 @@ inline specieThermo<thermo> operator*
template<class thermo> template<class thermo>
inline specieThermo<thermo> operator== inline Foam::specieThermo<thermo> Foam::operator==
( (
const specieThermo<thermo>& st1, const specieThermo<thermo>& st1,
const specieThermo<thermo>& st2 const specieThermo<thermo>& st2
@ -373,8 +374,4 @@ inline specieThermo<thermo> operator==
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //