Skip to content

Commit 2861dcc

Browse files
authored
Merge pull request #280 from minzhang0929/master
Create access to the reaction rate of each species involved in a given reaction
2 parents ee94d5b + aa0d895 commit 2861dcc

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed

src/dfCanteraMixture/CanteraMixture.C

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ Foam::CanteraMixture::CanteraMixture
6363

6464
CanteraSolution_=Cantera::newSolution(CanteraMechanismFile_, "");
6565
CanteraGas_=CanteraSolution_->thermo();
66+
CanteraKinetics_=CanteraSolution_->kinetics();
6667
CanteraTransport_=newTransportMgr(transportModelName_, CanteraGas_.get());
6768

6869
Y_.resize(nSpecies());

src/dfCanteraMixture/CanteraMixture.H

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ SourceFiles
3939
#include "cantera/zerodim.h"
4040
#include "cantera/transport.h"
4141
#include "cantera/thermo/IdealGasPhase.h"
42+
#include "cantera/kinetics.h"
4243
#include "IOdictionary.H"
4344
#include "fvMesh.H"
4445
#include "word.H"
@@ -66,6 +67,7 @@ class CanteraMixture
6667
const string CanteraMechanismFile_;
6768
std::shared_ptr<Cantera::Solution> CanteraSolution_;
6869
std::shared_ptr<Cantera::ThermoPhase> CanteraGas_;
70+
std::shared_ptr<Cantera::Kinetics> CanteraKinetics_;
6971
word transportModelName_;
7072
Cantera::Transport* CanteraTransport_;
7173
hashedWordList species_;
@@ -223,10 +225,13 @@ public:
223225

224226
const hashedWordList& species() const {return species_;}
225227
int nSpecies() {return int(CanteraGas_->nSpecies());}
228+
int nReactions() {return int(CanteraKinetics_->nReactions());}
226229

227230
std::shared_ptr<Cantera::ThermoPhase> CanteraGas() {return CanteraGas_;}
228231

229232
std::shared_ptr<Cantera::Solution> CanteraSolution() {return CanteraSolution_;}
233+
234+
std::shared_ptr<Cantera::Kinetics> CanteraKinetics() {return CanteraKinetics_;}
230235

231236
Cantera::Transport* CanteraTransport() {return CanteraTransport_;}
232237

src/dfChemistryModel/dfChemistryModel.C

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,15 @@ Foam::dfChemistryModel<ThermoType>::dfChemistryModel
5151
thermo_(thermo),
5252
mixture_(dynamic_cast<CanteraMixture&>(thermo)),
5353
CanteraGas_(mixture_.CanteraGas()),
54+
CanteraKinetics_(mixture_.CanteraKinetics()),
5455
mesh_(thermo.p().mesh()),
5556
chemistry_(lookup("chemistry")),
5657
relTol_(this->subDict("odeCoeffs").lookupOrDefault("relTol",1e-9)),
5758
absTol_(this->subDict("odeCoeffs").lookupOrDefault("absTol",1e-15)),
5859
Y_(mixture_.Y()),
5960
rhoD_(mixture_.nSpecies()),
6061
hai_(mixture_.nSpecies()),
61-
hc_(mixture_.nSpecies()),
62+
hc_(mixture_.nSpecies()),
6263
yTemp_(mixture_.nSpecies()),
6364
dTemp_(mixture_.nSpecies()),
6465
hrtTemp_(mixture_.nSpecies()),
@@ -719,7 +720,69 @@ Foam::dfChemistryModel<ThermoType>::updateReactionRates
719720
return deltaTMin;
720721
}
721722

723+
template<class ThermoType>
724+
Foam::tmp<Foam::DimensionedField<Foam::scalar, Foam::volMesh>>
725+
Foam::dfChemistryModel<ThermoType>::calculateRR
726+
(
727+
const label reactionI,
728+
const label speciei
729+
) const
730+
{
731+
tmp<volScalarField::Internal> tRR
732+
(
733+
volScalarField::Internal::New
734+
(
735+
"RR",
736+
mesh_,
737+
dimensionedScalar(dimMass/dimVolume/dimTime, 0)
738+
)
739+
);
740+
741+
volScalarField::Internal& RR = tRR.ref();
742+
743+
doublereal netRate[mixture_.nReactions()];
744+
doublereal X[mixture_.nSpecies()];
745+
746+
forAll(rho_, celli)
747+
{
748+
const scalar rhoi = rho_[celli];
749+
const scalar Ti = T_[celli];
750+
const scalar pi = p_[celli];
751+
752+
for (label i=0; i<mixture_.nSpecies(); i++)
753+
{
754+
const scalar Yi = Y_[i][celli];
755+
756+
X[i] = rhoi*Yi/CanteraGas_->molecularWeight(i);
757+
}
758+
759+
CanteraGas_->setState_TPX(Ti, pi, X);
760+
761+
CanteraKinetics_->getNetRatesOfProgress(netRate);
722762

763+
auto R = CanteraKinetics_->reaction(reactionI);
764+
765+
for (const auto& sp : R->reactants)
766+
{
767+
if (speciei == static_cast<int>(CanteraGas_->speciesIndex(sp.first)))
768+
{
769+
RR[celli] -= sp.second*netRate[reactionI];
770+
}
771+
772+
}
773+
for (const auto& sp : R->products)
774+
{
775+
if (speciei == static_cast<int>(CanteraGas_->speciesIndex(sp.first)))
776+
{
777+
RR[celli] += sp.second*netRate[reactionI];
778+
}
779+
}
780+
781+
RR[celli] *= CanteraGas_->molecularWeight(speciei);
782+
}
783+
784+
return tRR;
785+
}
723786

724787
template <class ThermoType>
725788
Foam::LoadBalancer

src/dfChemistryModel/dfChemistryModel.H

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public IOdictionary
9393
ThermoType& thermo_;
9494
CanteraMixture& mixture_;
9595
std::shared_ptr<Cantera::ThermoPhase> CanteraGas_;
96+
std::shared_ptr<Cantera::Kinetics> CanteraKinetics_;
9697
const fvMesh& mesh_;
9798
Switch chemistry_;
9899

@@ -107,7 +108,7 @@ public IOdictionary
107108
// species absolute enthalpy, [J/kg]
108109
PtrList<volScalarField> hai_;
109110
// species chemistry enthalpy, [J/kg]
110-
scalarList hc_;
111+
scalarList hc_;
111112
// temp mass fraction
112113
mutable scalarList yTemp_;
113114
// temp mass diffusion coefficients
@@ -284,6 +285,12 @@ public:
284285
//- Return access to chemical source terms [kg/m^3/s]
285286
volScalarField::Internal& RR(const label i) {return RR_[i];}
286287

288+
tmp<volScalarField::Internal> calculateRR
289+
(
290+
const label reactionI,
291+
const label speciei
292+
) const;
293+
287294
//- Return the heat release rate [J/m/s^3]
288295
const volScalarField& Qdot() const
289296
{

0 commit comments

Comments
 (0)