34template<
class CloudType>
53 label idSolid =
owner.composition().idSolid();
54 CsLocalId_ =
owner.composition().localId(idSolid,
"C");
55 ashLocalId_ =
owner.composition().localId(idSolid,
"ash",
true);
58 WO2_ =
owner.thermo().carrier().W(O2GlobalId_);
59 const scalar WCO2 =
owner.thermo().carrier().W(CO2GlobalId_);
62 HcCO2_ =
owner.thermo().carrier().Hc(CO2GlobalId_);
64 const scalar YCloc =
owner.composition().
Y0(idSolid)[CsLocalId_];
65 const scalar YSolidTot =
owner.composition().YMixture0()[idSolid];
66 Info<<
" C(s): particle mass fraction = " << YCloc*YSolidTot <<
endl;
70 Info<<
" Using user specified heat of reaction: "
71 << heatOfReaction_ <<
" [J/kg]" <<
endl;
76template<
class CloudType>
79 const COxidationHurtMitchell<CloudType>& srm
84 CsLocalId_(srm.CsLocalId_),
85 ashLocalId_(srm.ashLocalId_),
86 O2GlobalId_(srm.O2GlobalId_),
87 CO2GlobalId_(srm.CO2GlobalId_),
91 heatOfReaction_(srm.heatOfReaction_)
97template<
class CloudType>
121 const label idGas = CloudType::parcelType::GAS;
122 const label idSolid = CloudType::parcelType::SLD;
123 const scalar Ychar = YMixture[idSolid]*YSolid[CsLocalId_];
131 const SLGThermo&
thermo = this->owner().thermo();
134 const scalar YO2 =
thermo.carrier().Y(O2GlobalId_)[celli];
143 const scalar convSI = 1000.0/10000.0;
146 const scalar RRcal = 1985.877534;
149 scalar Ydaf = YMixture[idGas] + YMixture[idSolid];
150 if (ashLocalId_ != -1)
152 Ydaf -= YMixture[idSolid]*YSolid[ashLocalId_];
156 const scalar charPrc =
max(0,
min(Ychar/(Ydaf + ROOTVSMALL)*100.0, 100));
163 const scalar ppO2 =
max(0.0, rhoc*YO2/WO2_*RR*Tc);
166 const scalar E = -5.94 + 0.355*charPrc;
169 const scalar lnK1750 = 2.8 - 0.0758*charPrc;
170 const scalar
A =
exp(lnK1750 + E/RRcal/1750.0);
173 const scalar Rk =
A*
exp(-E/(RRcal*
T));
176 const scalar qCsLim = mass*Ychar/(WC_*Ap*dt);
177 const scalar qCs =
min(convSI*Rk*
Foam::sqrt(ppO2/101325.0), qCsLim);
180 const scalar dOmega = qCs*Ap*dt;
183 dMassSRCarrier[O2GlobalId_] += -dOmega*Sb_*WO2_;
184 dMassSRCarrier[CO2GlobalId_] += dOmega*(WC_ + Sb_*WO2_);
187 dMassSolid[CsLocalId_] += dOmega*WC_;
192 if (heatOfReaction_ < 0)
194 const scalar HsC =
thermo.solids().properties()[CsLocalId_].Hs(
T);
195 return dOmega*(WC_*HsC - (WC_ + Sb_*WO2_)*HcCO2_);
199 return dOmega*WC_*heatOfReaction_;
static const Foam::dimensionedScalar A("", Foam::dimPressure, 611.21)
propsDict readIfPresent("fields", acceptFields)
COxidationHurtMitchell(const dictionary &dict, CloudType &owner)
Construct from dictionary.
virtual scalar calculate(const scalar dt, const scalar Re, const scalar nu, const label celli, const scalar d, const scalar T, const scalar Tc, const scalar pc, const scalar rhoc, const scalar mass, const scalarField &YGas, const scalarField &YLiquid, const scalarField &YSolid, const scalarField &YMixture, const scalar N, scalarField &dMassGas, scalarField &dMassLiquid, scalarField &dMassSolid, scalarField &dMassSRCarrier) const
Update surface reactions.
const CloudType & owner() const
Return const access to the owner cloud.
Thermo package for (S)olids (L)iquids and (G)ases Takes reference to thermo package,...
SurfaceReactionModel(CloudType &owner)
Construct null from owner.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
const dictionary & coeffDict() const
Return const access to the coefficients dictionary.
const dictionary & dict() const
Return const access to the cloud dictionary.
Basic thermodynamics type based on the use of fitting functions for cp, h, s obtained from the templa...
basicSpecieMixture & composition
constexpr scalar pi(M_PI)
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
DSMCCloud< dsmcParcel > CloudType
dimensionedScalar exp(const dimensionedScalar &ds)
dimensionedSymmTensor sqr(const dimensionedVector &dv)
messageStream Info
Information stream (stdout output on master, null elsewhere).
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
const word GlobalIOList< Tuple2< scalar, vector > >::typeName("scalarVectorTable")
Ostream & endl(Ostream &os)
Add newline and flush stream.
dimensionedScalar sqrt(const dimensionedScalar &ds)
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
scalarField Re(const UList< complex > &cmplx)
Extract real component.
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
scalarList Y0(nSpecie, Zero)
psiReactionThermo & thermo
const Vector< label > N(dict.get< Vector< label > >("N"))