ENH: Adding diffusionMulticomponent combustion model.

Adding optional files to smallPoolFire2D to run using this model.
Taking out of the compilation of FSD combustion. It needs futher work to run using the new turbulent framework
This commit is contained in:
sergio
2015-12-07 17:02:18 -08:00
parent 34ecb74654
commit 4ba032b2be
17 changed files with 977 additions and 23 deletions

View File

@ -56,7 +56,7 @@ FSD<CombThermoType, ThermoType>::FSD
( (
this->coeffs(), this->coeffs(),
this->mesh(), this->mesh(),
*this *this
) )
), ),
ft_ ft_
@ -188,18 +188,17 @@ void FSD<CombThermoType, ThermoType>::calculateSourceNorm()
volScalarField& omegaFuelBar = tomegaFuel(); volScalarField& omegaFuelBar = tomegaFuel();
// Calculation of the mixture fraction variance (ftVar) // Calculation of the mixture fraction variance (ftVar)
const compressible::LESModel& lesModel = // TODO: generalize delta for RAS and LES.
YO2.db().lookupObject<compressible::LESModel>("LESProperties"); const volScalarField& delta =
refCast<const compressible::LESModel>(this->turbulence()).delta();
const volScalarField& delta = lesModel.delta();
const volScalarField ftVar(Cv_*sqr(delta)*sqr(mgft)); const volScalarField ftVar(Cv_*sqr(delta)*sqr(mgft));
// Thickened flame (average flame thickness for counterflow configuration // Thickened flame (average flame thickness for counterflow configuration
// is 1.5 mm) // is 1.5 mm)
volScalarField deltaF volScalarField deltaF
( (
lesModel.delta()/dimensionedScalar("flame", dimLength, 1.5e-3) delta/dimensionedScalar("flame", dimLength, 1.5e-3)
); );
// Linear correlation between delta and flame thickness // Linear correlation between delta and flame thickness

View File

@ -97,13 +97,23 @@ void Foam::reactionRateFlameAreaModels::relaxation::correct
1e-4 1e-4
); );
const compressible::LESModel& lesModel = // const compressible::LESModel& lesModel =
omega_.db().lookupObject<compressible::LESModel>("LESProperties"); // omega_.db().lookupObject<compressible::LESModel>("LESProperties");
// Total strain : resolved and sub-grid (just LES for now) // Total strain : resolved and sub-grid (just LES for now)
// const volScalarField sigmaTotal
// (
// sigma + alpha_*lesModel.epsilon()/(lesModel.k() + lesModel.kMin())
// );
const volScalarField sigmaTotal const volScalarField sigmaTotal
( (
sigma + alpha_*lesModel.epsilon()/(lesModel.k() + lesModel.kMin()) sigma
+ alpha_*combModel_.turbulence().epsilon()
/ (
combModel_.turbulence().k()
+ dimensionedScalar("kMin", sqr(dimVelocity), SMALL)
)
); );
const volScalarField omegaInf(correlation_.omega0Sigma(sigmaTotal)); const volScalarField omegaInf(correlation_.omega0Sigma(sigmaTotal));
@ -118,20 +128,20 @@ void Foam::reactionRateFlameAreaModels::relaxation::correct
/(sqr(omega0 - omegaInf) + sqr(omegaMin)) /(sqr(omega0 - omegaInf) + sqr(omegaMin))
); );
const volScalarField rho(combModel_.rho()); tmp<surfaceScalarField> phi(combModel_.phi());
const surfaceScalarField phi(combModel_.phi());
solve solve
( (
fvm::ddt(rho, omega_) fvm::ddt(omega_)
+ fvm::div(phi, omega_, "div(phi,omega)") + fvm::div(phi, omega_, "div(phi,omega)")
== ==
rho*Rc*omega0 Rc*omega0
- fvm::SuSp(rho*(tau + Rc), omega_) - fvm::SuSp((tau + Rc), omega_)
); );
omega_.min(omega0); omega_.min(omega0);
omega_.max(0.0); omega_.max(0.0);
} }

View File

@ -17,12 +17,15 @@ PaSR/PaSRs.C
laminar/laminars.C laminar/laminars.C
/*
FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C
FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C
FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C
FSD/reactionRateFlameAreaModels/relaxation/relaxation.C FSD/reactionRateFlameAreaModels/relaxation/relaxation.C
FSD/FSDs.C FSD/FSDs.C
*/
diffusionMulticomponent/diffusionMulticomponents.C
noCombustion/noCombustions.C noCombustion/noCombustions.C

View File

@ -112,9 +112,9 @@ public:
inline const fvMesh& mesh() const; inline const fvMesh& mesh() const;
//- Return const access to phi //- Return const access to phi
inline const surfaceScalarField& phi() const; inline tmp<surfaceScalarField> phi() const;
//- Return const access to rho //- Returns rho
virtual tmp<volScalarField> rho() const = 0; virtual tmp<volScalarField> rho() const = 0;
//- Return access to turbulence //- Return access to turbulence

View File

@ -31,7 +31,7 @@ inline const Foam::fvMesh& Foam::combustionModel::mesh() const
} }
inline const Foam::surfaceScalarField& Foam::combustionModel::phi() const inline Foam::tmp<Foam::surfaceScalarField> Foam::combustionModel::phi() const
{ {
if (turbulencePtr_) if (turbulencePtr_)
{ {
@ -41,7 +41,7 @@ inline const Foam::surfaceScalarField& Foam::combustionModel::phi() const
{ {
FatalErrorIn FatalErrorIn
( (
"const Foam::compressibleTurbulenceModel& " "const Foam::tmp<Foam::surfaceScalarField> "
"Foam::combustionModel::turbulence() const " "Foam::combustionModel::turbulence() const "
) << "turbulencePtr_ is empty. Please use " ) << "turbulencePtr_ is empty. Please use "
<< "combustionModel::setTurbulence " << "combustionModel::setTurbulence "

View File

@ -0,0 +1,515 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenCFD Ltd
\\/ 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 "diffusionMulticomponent.H"
#include "fvcGrad.H"
#include "reactingMixture.H"
#include "fvCFD.H"
#include "mathematicalConstants.H"
// * * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * //
template<class CombThermoType, class ThermoType>
void Foam::combustionModels::
diffusionMulticomponent<CombThermoType, ThermoType>::init()
{
// Load default values
if (this->coeffs().found("Ci"))
{
this->coeffs().lookup("Ci") >> Ci_;
}
if (this->coeffs().found("YoxStream"))
{
this->coeffs().lookup("YoxStream") >> YoxStream_;
}
if (this->coeffs().found("YfStream"))
{
this->coeffs().lookup("YfStream") >> YfStream_;
}
if (this->coeffs().found("sigma"))
{
this->coeffs().lookup("sigma") >> sigma_;
}
if (this->coeffs().found("ftCorr"))
{
this->coeffs().lookup("ftCorr") >> ftCorr_;
}
if (this->coeffs().found("alpha"))
{
alpha_ = readScalar(this->coeffs().lookup("alpha"));
}
if (this->coeffs().found("laminarIgn"))
{
this->coeffs().lookup("laminarIgn") >> laminarIgn_;
}
typedef typename Reaction<ThermoType>::specieCoeffs specieCoeffs;
const speciesTable& species = this->thermo().composition().species();
scalarList specieStoichCoeffs(species.size());
const label nReactions = reactions_.size();
for (label k=0; k < nReactions; k++)
{
RijPtr_.set
(
k,
new volScalarField
(
IOobject
(
"Rijk" + name(k),
this->mesh_.time().timeName(),
this->mesh_,
IOobject::NO_READ,
IOobject::NO_WRITE,
false
),
this->mesh_,
dimensionedScalar("Rij", dimMass/dimTime/dimVolume, 0.0),
zeroGradientFvPatchScalarField::typeName
)
);
RijPtr_[k].storePrevIter();
const List<specieCoeffs>& lhs = reactions_[k].lhs();
const List<specieCoeffs>& rhs = reactions_[k].rhs();
const label fuelIndex = species[fuelNames_[k]];
const label oxydantIndex = species[oxydantNames_[k]];
const scalar Wu = specieThermo_[fuelIndex].W();
const scalar Wox = specieThermo_[oxydantIndex].W();
forAll(lhs, i)
{
const label specieI = lhs[i].index;
specieStoichCoeffs[specieI] = -lhs[i].stoichCoeff;
qFuel_[k] +=
specieThermo_[specieI].hc()*lhs[i].stoichCoeff/Wu;
}
forAll(rhs, i)
{
const label specieI = rhs[i].index;
specieStoichCoeffs[specieI] = rhs[i].stoichCoeff;
qFuel_[k] -=
specieThermo_[specieI].hc()*rhs[i].stoichCoeff/Wu;
}
Info << "Fuel heat of combustion : " << qFuel_[k] << endl;
s_[k] =
(Wox*mag(specieStoichCoeffs[oxydantIndex]))
/ (Wu*mag(specieStoichCoeffs[fuelIndex]));
Info << "stoichiometric oxygen-fuel ratio : " << s_[k] << endl;
stoicRatio_[k] = s_[k]*YfStream_[k]/YoxStream_[k];
Info << "stoichiometric air-fuel ratio : " << stoicRatio_[k] << endl;
const scalar fStoich = 1.0/(1.0 + stoicRatio_[k]);
Info << "stoichiometric mixture fraction : " << fStoich << endl;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CombThermoType, class ThermoType>
Foam::combustionModels::diffusionMulticomponent<CombThermoType, ThermoType>::
diffusionMulticomponent
(
const word& modelType, const fvMesh& mesh, const word& phaseName
)
:
CombThermoType(modelType, mesh, phaseName),
reactions_
(
dynamic_cast<const reactingMixture<ThermoType>&>(this->thermo())
),
specieThermo_
(
dynamic_cast<const reactingMixture<ThermoType>&>
(this->thermo()).speciesData()
),
RijPtr_(reactions_.size()),
Ci_(reactions_.size(), 1.0),
fuelNames_(this->coeffs().lookup("fuels")),
oxydantNames_(this->coeffs().lookup("oxydants")),
qFuel_(reactions_.size()),
stoicRatio_(reactions_.size()),
s_(reactions_.size()),
YoxStream_(reactions_.size(), 0.23),
YfStream_(reactions_.size(), 1.0),
sigma_(reactions_.size(), 0.02),
oxydantRes_(this->coeffs().lookup("oxydantRes")),
ftCorr_(reactions_.size(), 0.0),
alpha_(1),
laminarIgn_(false)
{
init();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class CombThermoType, class ThermoType>
Foam::combustionModels::diffusionMulticomponent<CombThermoType, ThermoType>::
~diffusionMulticomponent()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
template<class CombThermoType, class ThermoType>
Foam::tmp<Foam::volScalarField> Foam::combustionModels::
diffusionMulticomponent<CombThermoType, ThermoType>::tc() const
{
return this->chemistryPtr_->tc();
}
template<class CombThermoType, class ThermoType>
void Foam::combustionModels::
diffusionMulticomponent<CombThermoType, ThermoType>::correct()
{
if (this->active())
{
typedef typename Reaction<ThermoType>::specieCoeffs specieCoeffs;
const speciesTable& species = this->thermo().composition().species();
const label nReactions = reactions_.size();
PtrList<volScalarField> RijlPtr(nReactions);
for (label k=0; k < nReactions; k++)
{
RijlPtr.set
(
k,
new volScalarField
(
IOobject
(
"Rijl" + word(k),
this->mesh_.time().timeName(),
this->mesh_,
IOobject::NO_READ,
IOobject::NO_WRITE,
false
),
this->mesh_,
dimensionedScalar("Rijl", dimMass/dimTime/dimVolume, 0.0),
zeroGradientFvPatchScalarField::typeName
)
);
volScalarField& Rijl = RijlPtr[k];
// Obtain individual reaction rates for each reaction
const label fuelIndex = species[fuelNames_[k]];
if (laminarIgn_)
{
Rijl.dimensionedInternalField() =
-this->chemistryPtr_->calculateRR(k, fuelIndex);
}
// Look for the fuelStoic
const List<specieCoeffs>& rhs = reactions_[k].rhs();
const List<specieCoeffs>& lhs = reactions_[k].lhs();
// Set to zero RR's
forAll (lhs, l)
{
const label lIndex = lhs[l].index;
this->chemistryPtr_->RR(lIndex) =
dimensionedScalar("zero", dimMass/dimTime/dimVolume, 0.0);
}
forAll (rhs, l)
{
const label rIndex = rhs[l].index;
this->chemistryPtr_->RR(rIndex) =
dimensionedScalar("zero", dimMass/dimTime/dimVolume, 0.0);
}
}
for (label k=0; k < nReactions; k++)
{
const label fuelIndex = species[fuelNames_[k]];
const label oxydantIndex = species[oxydantNames_[k]];
const volScalarField& Yfuel =
this->thermo().composition().Y(fuelIndex);
const volScalarField& Yox =
this->thermo().composition().Y(oxydantIndex);
const volScalarField ft
(
"ft" + name(k),
(
s_[k]*Yfuel
- (Yox - YoxStream_[k])
)
/
(
s_[k]*YfStream_[k] + YoxStream_[k]
)
);
const scalar sigma = sigma_[k];
const scalar fStoich = 1.0/(1.0 + stoicRatio_[k]) + ftCorr_[k];
const volScalarField OAvailScaled
(
"OAvailScaled",
Yox/max(oxydantRes_[k], 1e-3)
);
const volScalarField preExp
(
"preExp" + name(k),
1.0 + sqr(OAvailScaled)
);
const volScalarField filter
(
(1.0/(sigma*sqrt(2.0*constant::mathematical::pi)))
* exp(-sqr(ft - fStoich)/(2*sqr(sigma)))
);
const volScalarField topHatFilter
(
pos(filter - 1e-3)
);
const volScalarField prob
(
"prob" + name(k), preExp*filter
);
const volScalarField RijkDiff
(
"RijkDiff",
Ci_[k]*this->turbulence().muEff()*prob*
(
mag(fvc::grad(Yfuel) & fvc::grad(Yox))
)
*pos(Yox)*pos(Yfuel)
);
volScalarField& Rijk = RijPtr_[k];
if (laminarIgn_)
{
Rijk =
min(RijkDiff, topHatFilter*RijlPtr[k]*pos(Yox)*pos(Yfuel));
}
else
{
Rijk = RijkDiff;
}
Rijk.relax(alpha_);
if (this->mesh_.time().outputTime() && debug)
{
Rijk.write();
ft.write();
}
// Look for the fuelStoic
const List<specieCoeffs>& rhs = reactions_[k].rhs();
const List<specieCoeffs>& lhs = reactions_[k].lhs();
scalar fuelStoic = 1.0;
forAll (lhs, l)
{
const label lIndex = lhs[l].index;
if (lIndex == fuelIndex)
{
fuelStoic = lhs[l].stoichCoeff;
break;
}
}
const scalar MwFuel = specieThermo_[fuelIndex].W();
// Update left hand side species
forAll (lhs, l)
{
const label lIndex = lhs[l].index;
const scalar stoichCoeff = lhs[l].stoichCoeff;
this->chemistryPtr_->RR(lIndex) +=
-Rijk*stoichCoeff*specieThermo_[lIndex].W()
/fuelStoic/MwFuel;
}
// Update right hand side species
forAll (rhs, r)
{
const label rIndex = rhs[r].index;
const scalar stoichCoeff = rhs[r].stoichCoeff;
this->chemistryPtr_->RR(rIndex) +=
Rijk*stoichCoeff*specieThermo_[rIndex].W()
/fuelStoic/MwFuel;
}
}
}
}
template<class CombThermoType, class ThermoType>
Foam::tmp<Foam::fvScalarMatrix>
Foam::combustionModels::diffusionMulticomponent<CombThermoType, ThermoType>::
R(volScalarField& Y) const
{
tmp<fvScalarMatrix> tSu(new fvScalarMatrix(Y, dimMass/dimTime));
fvScalarMatrix& Su = tSu();
if (this->active())
{
const label specieI = this->thermo().composition().species()[Y.name()];
Su += this->chemistryPtr_->RR(specieI);
}
return tSu;
}
template<class CombThermoType, class ThermoType>
Foam::tmp<Foam::volScalarField>
Foam::combustionModels::diffusionMulticomponent<CombThermoType, ThermoType>::
dQ() const
{
tmp<volScalarField> tdQ
(
new volScalarField
(
IOobject
(
"dQ",
this->mesh().time().timeName(),
this->mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE,
false
),
this->mesh(),
dimensionedScalar("dQ", dimEnergy/dimTime, 0.0),
zeroGradientFvPatchScalarField::typeName
)
);
if (this->active())
{
volScalarField& dQ = tdQ();
dQ = this->chemistryPtr_->dQ();
}
return tdQ;
}
template<class CombThermoType, class ThermoType>
Foam::tmp<Foam::volScalarField>
Foam::combustionModels::diffusionMulticomponent<CombThermoType, ThermoType>::
Sh() const
{
tmp<volScalarField> tSh
(
new volScalarField
(
IOobject
(
"Sh",
this->mesh().time().timeName(),
this->mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE,
false
),
this->mesh(),
dimensionedScalar("zero", dimEnergy/dimTime/dimVolume, 0.0),
zeroGradientFvPatchScalarField::typeName
)
);
if (this->active())
{
scalarField& Sh = tSh();
Sh = this->chemistryPtr_->Sh();
}
return tSh;
}
template<class CombThermoType, class ThermoType>
bool Foam::combustionModels::
diffusionMulticomponent<CombThermoType, ThermoType>::read()
{
if (CombThermoType::read())
{
this->coeffs().readIfPresent("Ci", Ci_);
this->coeffs().readIfPresent("sigma", sigma_);
this->coeffs().readIfPresent("oxydantRes", oxydantRes_);
this->coeffs().readIfPresent("ftCorr", ftCorr_);
this->coeffs().readIfPresent("alpha", alpha_);
this->coeffs().readIfPresent("laminarIgn", laminarIgn_);
return true;
}
else
{
return false;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,224 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenCFD Ltd
\\/ 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::combustionModels::diffusionMulticomponent
Description
Diffusion based turbulent combustion model for multicomponent species.
The model calculates the laminar finite rate source terms based on
the kinetic for each reaction in order to begin the combustion and
evaluates the minimum between this and the cross diffusion rate term
defined as D*prob*muEff*mag(grad(Yi)*grad(Yj)) if laminarIgn is true.
where:
D : is a model constant.
muEff : is the effective turbulent diffusivity
prob : is a Gaussian shaped distribution around the stoichiometric value
of each reaction. The distribtion has the input parameter 'sigma'
for standard deviation.
The variable prob is multiplied by the factor: 1 + pow2(O2/oxydantRes),
where oxydantRes is the residual oxydant specified for each reaction.
In the combustion properties dictionary:
diffusionMulticomponentCoeffs
{
Ci (1.0 1.0); // Default to 1
fuels (CH4 CO);
oxydants (O2 O2);
YoxStream (0.23 0.23); // Default to 0.23
YfStream (1.0 1.0); // Default to 1.0
sigma (0.02 0.02); // Default to 0.02
oxydantRes (0.025 0.005);
ftCorr (0.0 0.0); // Default to 0.0
laminarIgn false; // Default false
}
ftCorr is used to shift the location of the flame and corrects the
stochimetric mixture value when the mesh resolution is not enough
to resolve the combustion zone.
NOTE: Optionally the switch 'laminarIgn' can be used to ignite the mixture
using laminar combustion.
SourceFiles
diffusionMulticomponent.C
\*---------------------------------------------------------------------------*/
#ifndef diffusionMulticomponent_H
#define diffusionMulticomponent_H
#include "scalarList.H"
#include "tmp.H"
#include "Reaction.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace combustionModels
{
/*---------------------------------------------------------------------------*\
Class diffusionMulticomponent Declaration
\*---------------------------------------------------------------------------*/
template<class CombThermoType, class ThermoType>
class diffusionMulticomponent
:
public CombThermoType
{
// Private data
//- Reactions
const PtrList<Reaction<ThermoType> >& reactions_;
//- Thermodynamic data of the species
const PtrList<ThermoType>& specieThermo_;
//- Pointer list of source terms
PtrList<volScalarField> RijPtr_;
//- Model constants
scalarList Ci_;
//- List of fuels for each reaction
wordList fuelNames_;
//- List of oxydants for each reaction
wordList oxydantNames_;
//- Heat of combustion [J/Kg]
scalarList qFuel_;
//- Stoichiometric air-fuel mass ratio
scalarList stoicRatio_;
//- Stoichiometric oxygen-fuel mass ratio
scalarList s_;
//- Oxydaser sream mass concentrations
scalarList YoxStream_;
//- Fuel stream mass concentrations
scalarList YfStream_;
//- Mean distribution for gaussian probabililty
scalarList sigma_;
//- Residual oxydaser
scalarList oxydantRes_;
//- ft stochiometric correction
scalarList ftCorr_;
//- Relaxatnio factor on total source
scalar alpha_;
//- Switch on to laminar combustion for ignition
bool laminarIgn_;
// Private Member Functions
//- Return the chemical time scale
tmp<volScalarField> tc() const;
//- Initialize
void init();
//- Disallow copy construct
diffusionMulticomponent(const diffusionMulticomponent&);
//- Disallow default bitwise assignment
void operator=(const diffusionMulticomponent&);
public:
//- Runtime type information
TypeName("diffusionMulticomponent");
// Constructors
//- Construct from components
diffusionMulticomponent
(
const word& modelType,
const fvMesh& mesh,
const word& phaseName
);
//- Destructor
virtual ~diffusionMulticomponent();
// Member Functions
// Evolution
//- Correct combustion rate
virtual void correct();
//- Fuel consumption rate matrix.
virtual tmp<fvScalarMatrix> R(volScalarField& Y) const;
//- Heat release rate calculated from fuel consumption rate matrix
virtual tmp<volScalarField> dQ() const;
//- Return source for enthalpy equation [kg/m/s3]
virtual tmp<volScalarField> Sh() const;
// IO
//- Update properties from given dictionary
virtual bool read();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace combustionModels
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "diffusionMulticomponent.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,61 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 "makeCombustionTypes.H"
#include "thermoPhysicsTypes.H"
#include "psiChemistryCombustion.H"
#include "rhoChemistryCombustion.H"
#include "diffusionMulticomponent.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Combustion models based on sensibleEnthalpy
makeCombustionTypesThermo
(
diffusionMulticomponent,
psiChemistryCombustion,
gasHThermoPhysics,
psiCombustionModel
);
makeCombustionTypesThermo
(
diffusionMulticomponent,
rhoChemistryCombustion,
gasHThermoPhysics,
rhoCombustionModel
);
makeCombustionTypesThermo
(
diffusionMulticomponent,
rhoChemistryCombustion,
incompressibleGasHThermoPhysics,
rhoCombustionModel
);
// ************************************************************************* //

View File

@ -0,0 +1,29 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object chemistryProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
chemistryType
{
chemistrySolver noChemistrySolver;
chemistryThermo psi;
}
chemistry on;
initialChemicalTimeStep 1e-07;
// ************************************************************************* //

View File

@ -16,7 +16,12 @@ FoamFile
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
combustionModel infinitelyFastChemistry<psiThermoCombustion,gasHThermoPhysics>; combustionModel infinitelyFastChemistry<psiThermoCombustion,gasHThermoPhysics>;
//combustionModel FSD<psiThermoCombustion,gasHThermoPhysics>; //combustionModel FSD<psiThermoCombustion,gasHThermoPhysics>;
//combustionModel diffusionMulticomponent<psiChemistryCombustion,gasHThermoPhysics>;
//NOTE: To use diffusionMulticomponent combustion model you need to rename files:
// reactions.twoSteps -> reactions
// thermophysicalProperties.twoSteps -> thermophysicalProperties
active true; active true;
@ -26,8 +31,22 @@ infinitelyFastChemistryCoeffs
C 5.0; C 5.0;
} }
diffusionMulticomponentCoeffs
{
Ci (1.0 1.5);
fuels (CH4 CO);
oxydants (O2 O2);
YoxStream (0.23 0.23);
YfStream (1.0 1.0);
sigma (0.02 0.02);
oxydantRes (0.015 0.005);
ftCorr (0 0);
laminarIgn false;
}
FSDCoeffs FSDCoeffs
{ {
semiImplicit no;
Cv 0.1; Cv 0.1;
ftVarMin 1e-2; ftVarMin 1e-2;

View File

@ -1,7 +1,7 @@
/*--------------------------------*- C++ -*----------------------------------*\ /*--------------------------------*- C++ -*----------------------------------*\
| ========= | | | ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev | | \\ / O peration | Version: dev-OpenCFD |
| \\ / A nd | Web: www.OpenFOAM.org | | \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | | | \\/ M anipulation | |
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/

View File

@ -189,7 +189,7 @@ greyMeanAbsorptionEmissionCoeffs
scatterModel none; scatterModel none;
sootModel mixtureFractionSoot<gasHThermoPhysics>; sootModel none;//mixtureFractionSoot<gasHThermoPhysics>;
mixtureFractionSootCoeffs mixtureFractionSootCoeffs
{ {

View File

@ -9,7 +9,7 @@ species
reactions reactions
{ {
propaneReaction methaneReaction
{ {
type irreversibleinfiniteReaction; type irreversibleinfiniteReaction;
reaction "CH4 + 2O2 + 7.5N2 = CO2 + 2H2O + 7.5N2"; reaction "CH4 + 2O2 + 7.5N2 = CO2 + 2H2O + 7.5N2";

View File

@ -0,0 +1,30 @@
species
(
O2
H2O
CH4
CO2
CO
N2
);
reactions
{
methaneReaction
{
type irreversibleArrheniusReaction;
reaction "CH4^0.9 + 2O2^1.1 = CO + 2H2O";
A 2.119e12;
beta 0;
Ta 17676;
}
COReaction
{
type irreversibleArrheniusReaction;
reaction "CO + 0.5O2^0.25 = CO2";
A 1e6;
beta 0;
Ta 6060;
}
}

View File

@ -124,3 +124,26 @@ N2
Ts 170.672; Ts 170.672;
} }
} }
CO
{
specie
{
nMoles 1;
molWeight 28.0106;
}
thermodynamics
{
Tlow 200;
Thigh 6000;
Tcommon 1000;
highCpCoeffs ( 3.04849 0.00135173 -4.85794e-07 7.88536e-11 -4.69807e-15 -14266.1 6.0171 );
lowCpCoeffs ( 3.57953 -0.000610354 1.01681e-06 9.07006e-10 -9.04424e-13 -14344.1 3.50841 );
}
transport
{
As 1.67212e-06;
Ts 170.672;
}
}

View File

@ -0,0 +1,40 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 2.2.2 |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object thermophysicalProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
thermoType
{
type hePsiThermo;
mixture reactingMixture;
transport sutherland;
thermo janaf;
energy sensibleEnthalpy;
equationOfState perfectGas;
specie specie;
}
inertSpecie N2;
fuel CH4;
chemistryReader foamChemistryReader;
foamChemistryFile "$FOAM_CASE/constant/reactions";
foamChemistryThermoFile "$FOAM_CASE/constant/thermo.compressibleGas";
// ************************************************************************* //

View File

@ -37,10 +37,11 @@ divSchemes
N2 limitedLinear01 1; N2 limitedLinear01 1;
H2O limitedLinear01 1; H2O limitedLinear01 1;
CO2 limitedLinear01 1; CO2 limitedLinear01 1;
CO limitedLinear01 1;
h limitedLinear 1; h limitedLinear 1;
}; };
div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear; div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
div(phi,omega) Gauss limitedLinear 1; div(phi,omega) Gauss upwind;
div(phi,K) Gauss limitedLinear 1; div(phi,K) Gauss limitedLinear 1;
div(U) Gauss linear; div(U) Gauss linear;
div(Ji,Ii_h) Gauss upwind; div(Ji,Ii_h) Gauss upwind;