diff --git a/src/combustionModels/FSD/FSD.C b/src/combustionModels/FSD/FSD.C index 9d79904cd40e578b30c2ee4982ff1e95886355a7..ed3cdb602c4c42d51ae33d4042cbe1681e3f879f 100644 --- a/src/combustionModels/FSD/FSD.C +++ b/src/combustionModels/FSD/FSD.C @@ -56,7 +56,7 @@ FSD<CombThermoType, ThermoType>::FSD ( this->coeffs(), this->mesh(), - *this + *this ) ), ft_ @@ -188,18 +188,17 @@ void FSD<CombThermoType, ThermoType>::calculateSourceNorm() volScalarField& omegaFuelBar = tomegaFuel(); // Calculation of the mixture fraction variance (ftVar) - const compressible::LESModel& lesModel = - YO2.db().lookupObject<compressible::LESModel>("LESProperties"); + // TODO: generalize delta for RAS and LES. + const volScalarField& delta = + refCast<const compressible::LESModel>(this->turbulence()).delta(); - const volScalarField& delta = lesModel.delta(); const volScalarField ftVar(Cv_*sqr(delta)*sqr(mgft)); // Thickened flame (average flame thickness for counterflow configuration // is 1.5 mm) - volScalarField deltaF ( - lesModel.delta()/dimensionedScalar("flame", dimLength, 1.5e-3) + delta/dimensionedScalar("flame", dimLength, 1.5e-3) ); // Linear correlation between delta and flame thickness diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C index 9352dd83961d30200f03284794755ea513c570b0..4294331f25858f324676b4fa6a1f7d716bca6522 100644 --- a/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.C @@ -97,13 +97,23 @@ void Foam::reactionRateFlameAreaModels::relaxation::correct 1e-4 ); - const compressible::LESModel& lesModel = - omega_.db().lookupObject<compressible::LESModel>("LESProperties"); +// const compressible::LESModel& lesModel = +// omega_.db().lookupObject<compressible::LESModel>("LESProperties"); // Total strain : resolved and sub-grid (just LES for now) +// const volScalarField sigmaTotal +// ( +// sigma + alpha_*lesModel.epsilon()/(lesModel.k() + lesModel.kMin()) +// ); + 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)); @@ -118,20 +128,20 @@ void Foam::reactionRateFlameAreaModels::relaxation::correct /(sqr(omega0 - omegaInf) + sqr(omegaMin)) ); - const volScalarField rho(combModel_.rho()); - const surfaceScalarField phi(combModel_.phi()); + tmp<surfaceScalarField> phi(combModel_.phi()); solve ( - fvm::ddt(rho, omega_) + fvm::ddt(omega_) + fvm::div(phi, omega_, "div(phi,omega)") == - rho*Rc*omega0 - - fvm::SuSp(rho*(tau + Rc), omega_) + Rc*omega0 + - fvm::SuSp((tau + Rc), omega_) ); omega_.min(omega0); omega_.max(0.0); + } diff --git a/src/combustionModels/Make/files b/src/combustionModels/Make/files index b68fbb742f273498a2ad7a76f0436b7d665aa45e..f1f87e9cfbb9bb203a494940844d9c250ef49208 100644 --- a/src/combustionModels/Make/files +++ b/src/combustionModels/Make/files @@ -17,12 +17,15 @@ PaSR/PaSRs.C laminar/laminars.C +/* FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.C FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.C FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C FSD/reactionRateFlameAreaModels/relaxation/relaxation.C - FSD/FSDs.C +*/ + +diffusionMulticomponent/diffusionMulticomponents.C noCombustion/noCombustions.C diff --git a/src/combustionModels/combustionModel/combustionModel.H b/src/combustionModels/combustionModel/combustionModel.H index 5368d1af801c6111f22e0580fd87eeac42c482c2..badd4848294db278c4d07cfd8f7f01a5c882d010 100644 --- a/src/combustionModels/combustionModel/combustionModel.H +++ b/src/combustionModels/combustionModel/combustionModel.H @@ -112,9 +112,9 @@ public: inline const fvMesh& mesh() const; //- 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; //- Return access to turbulence diff --git a/src/combustionModels/combustionModel/combustionModelI.H b/src/combustionModels/combustionModel/combustionModelI.H index 65531556828b8d4290ebbb3ef950d6864d301f00..a69437b73a5226fb7be9c6938254b374326ff43b 100644 --- a/src/combustionModels/combustionModel/combustionModelI.H +++ b/src/combustionModels/combustionModel/combustionModelI.H @@ -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_) { @@ -41,7 +41,7 @@ inline const Foam::surfaceScalarField& Foam::combustionModel::phi() const { FatalErrorIn ( - "const Foam::compressibleTurbulenceModel& " + "const Foam::tmp<Foam::surfaceScalarField> " "Foam::combustionModel::turbulence() const " ) << "turbulencePtr_ is empty. Please use " << "combustionModel::setTurbulence " diff --git a/src/combustionModels/diffusionMulticomponent/diffusionMulticomponent.C b/src/combustionModels/diffusionMulticomponent/diffusionMulticomponent.C new file mode 100644 index 0000000000000000000000000000000000000000..bc60afe054adb6a1fcbd64e49871e2532dd0a9f3 --- /dev/null +++ b/src/combustionModels/diffusionMulticomponent/diffusionMulticomponent.C @@ -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; + } +} + + +// ************************************************************************* // diff --git a/src/combustionModels/diffusionMulticomponent/diffusionMulticomponent.H b/src/combustionModels/diffusionMulticomponent/diffusionMulticomponent.H new file mode 100644 index 0000000000000000000000000000000000000000..2d6b9531f74f1b4c282e9c6d09e39165273c9af0 --- /dev/null +++ b/src/combustionModels/diffusionMulticomponent/diffusionMulticomponent.H @@ -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 + +// ************************************************************************* // diff --git a/src/combustionModels/diffusionMulticomponent/diffusionMulticomponents.C b/src/combustionModels/diffusionMulticomponent/diffusionMulticomponents.C new file mode 100644 index 0000000000000000000000000000000000000000..3aa6b7940190776c1192832212d44dd9cc589244 --- /dev/null +++ b/src/combustionModels/diffusionMulticomponent/diffusionMulticomponents.C @@ -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 +); + +// ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties new file mode 100644 index 0000000000000000000000000000000000000000..60eb1671344de4a81fda5f9eb63fc4f24594a6f5 --- /dev/null +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/chemistryProperties @@ -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; + + +// ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties index 51e80f82d64f8071b585d60ff043dd8742ab02b5..76a0324cf85bf99129febed76ce061d732d062bb 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/combustionProperties @@ -16,7 +16,12 @@ FoamFile // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // combustionModel infinitelyFastChemistry<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; @@ -26,8 +31,22 @@ infinitelyFastChemistryCoeffs 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 { + semiImplicit no; Cv 0.1; ftVarMin 1e-2; diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/polyMesh/boundary b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/polyMesh/boundary index 6a17bae1f0dd83c11b4e501aec66a43e5560b414..0082e381a90b720a8aa2b9b9dcdc13388de349df 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/polyMesh/boundary +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/polyMesh/boundary @@ -1,7 +1,7 @@ /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: dev | +| \\ / O peration | Version: dev-OpenCFD | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties index a25c81382a4d3837f18c4a1051eee255fa7aa4a5..7220f7b9960a190aca55da90dffc9d207d6b4d16 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties @@ -189,7 +189,7 @@ greyMeanAbsorptionEmissionCoeffs scatterModel none; -sootModel mixtureFractionSoot<gasHThermoPhysics>; +sootModel none;//mixtureFractionSoot<gasHThermoPhysics>; mixtureFractionSootCoeffs { diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions index 67f2373c382e5477caeeada95dc46a061ee97423..f8d7139b6b2ccd7b43542ce334f336a34648a621 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions @@ -9,7 +9,7 @@ species reactions { - propaneReaction + methaneReaction { type irreversibleinfiniteReaction; reaction "CH4 + 2O2 + 7.5N2 = CO2 + 2H2O + 7.5N2"; diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions.twoSteps b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions.twoSteps new file mode 100644 index 0000000000000000000000000000000000000000..360014f503f0ebb0778d6705d535c7b616c21db4 --- /dev/null +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/reactions.twoSteps @@ -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; + } +} diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/thermo.compressibleGas b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/thermo.compressibleGas index db1994252554db6ef0a01216e4b9a5f5337d58f0..5e02e173a2c835aa7ad60a1e8204e880c87efa93 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/thermo.compressibleGas +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/thermo.compressibleGas @@ -124,3 +124,26 @@ N2 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; + } +} + diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/thermophysicalProperties.twoSteps b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/thermophysicalProperties.twoSteps new file mode 100644 index 0000000000000000000000000000000000000000..ae47817551299d81dca63ffaa7b8914f5fb48532 --- /dev/null +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/thermophysicalProperties.twoSteps @@ -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"; + + +// ************************************************************************* // diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSchemes b/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSchemes index 01608aaaa173fe79cfd69af4f780328905557789..d8cde753f00f302352600a4c3e725055a0ed7823 100644 --- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSchemes +++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/system/fvSchemes @@ -37,10 +37,11 @@ divSchemes N2 limitedLinear01 1; H2O limitedLinear01 1; CO2 limitedLinear01 1; + CO limitedLinear01 1; h limitedLinear 1; }; 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(U) Gauss linear; div(Ji,Ii_h) Gauss upwind;