Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "COxidationDiffusionLimitedRate.H"
00027 #include <OpenFOAM/mathematicalConstants.H>
00028
00029
00030
00031 template<class CloudType>
00032 Foam::COxidationDiffusionLimitedRate<CloudType>::COxidationDiffusionLimitedRate
00033 (
00034 const dictionary& dict,
00035 CloudType& owner
00036 )
00037 :
00038 SurfaceReactionModel<CloudType>(dict, owner, typeName),
00039 Sb_(dimensionedScalar(this->coeffDict().lookup("Sb")).value()),
00040 D_(dimensionedScalar(this->coeffDict().lookup("D")).value()),
00041 CsLocalId_(-1),
00042 O2GlobalId_(owner.composition().globalCarrierId("O2")),
00043 CO2GlobalId_(owner.composition().globalCarrierId("CO2")),
00044 WC_(0.0),
00045 WO2_(0.0),
00046 HcCO2_(0.0)
00047 {
00048
00049 label idSolid = owner.composition().idSolid();
00050 CsLocalId_ = owner.composition().localId(idSolid, "C");
00051
00052
00053 WO2_ = owner.mcCarrierThermo().speciesData()[O2GlobalId_].W();
00054 scalar WCO2 = owner.mcCarrierThermo().speciesData()[CO2GlobalId_].W();
00055 WC_ = WCO2 - WO2_;
00056 HcCO2_ = owner.mcCarrierThermo().speciesData()[CO2GlobalId_].Hc();
00057
00058 if (Sb_ < 0)
00059 {
00060 FatalErrorIn
00061 (
00062 "COxidationDiffusionLimitedRate<CloudType>"
00063 "("
00064 "const dictionary&, "
00065 "CloudType&"
00066 ")"
00067 ) << "Stoichiometry of reaction, Sb, must be greater than zero" << nl
00068 << exit(FatalError);
00069 }
00070 }
00071
00072
00073
00074
00075 template<class CloudType>
00076 Foam::COxidationDiffusionLimitedRate<CloudType>::
00077 ~COxidationDiffusionLimitedRate()
00078 {}
00079
00080
00081
00082
00083 template<class CloudType>
00084 bool Foam::COxidationDiffusionLimitedRate<CloudType>::active() const
00085 {
00086 return true;
00087 }
00088
00089
00090 template<class CloudType>
00091 Foam::scalar Foam::COxidationDiffusionLimitedRate<CloudType>::calculate
00092 (
00093 const scalar dt,
00094 const label cellI,
00095 const scalar d,
00096 const scalar T,
00097 const scalar Tc,
00098 const scalar pc,
00099 const scalar rhoc,
00100 const scalar mass,
00101 const scalarField& YGas,
00102 const scalarField& YLiquid,
00103 const scalarField& YSolid,
00104 const scalarField& YMixture,
00105 const scalar N,
00106 scalarField& dMassGas,
00107 scalarField& dMassLiquid,
00108 scalarField& dMassSolid,
00109 scalarField& dMassSRCarrier
00110 ) const
00111 {
00112
00113 const label idSolid = CloudType::parcelType::SLD;
00114 const scalar fComb = YMixture[idSolid]*YSolid[CsLocalId_];
00115
00116
00117 if (fComb < SMALL)
00118 {
00119 return 0.0;
00120 }
00121
00122
00123 const scalar YO2 = this->owner().mcCarrierThermo().Y(O2GlobalId_)[cellI];
00124
00125
00126 scalar dmC =
00127 4.0*mathematicalConstant::pi*d*D_*YO2*Tc*rhoc/(Sb_*(T + Tc))*dt;
00128
00129
00130 dmC = min(mass*fComb, dmC);
00131
00132
00133 const scalar dmO2 = dmC/WC_*Sb_*WO2_;
00134
00135
00136 const scalar dmCO2 = dmC + dmO2;
00137
00138
00139 dMassSolid[CsLocalId_] += dmC;
00140
00141
00142 dMassSRCarrier[O2GlobalId_] -= dmO2;
00143 dMassSRCarrier[CO2GlobalId_] += dmCO2;
00144
00145
00146 return -HcCO2_*dmCO2;
00147 }
00148
00149
00150