Go to the documentation of this file.
36 template<
class CloudType>
47 this->owner().thermo().carrier().Y()[i][celli]
48 /this->owner().thermo().carrier().W(i);
55 template<
class CloudType>
68 template<
class CloudType>
76 liquids_(owner.thermo().liquids()),
77 activeLiquids_(this->coeffDict().lookup(
"activeLiquids")),
78 liqToCarrierMap_(activeLiquids_.size(), -1),
79 liqToLiqMap_(activeLiquids_.size(), -1)
81 if (activeLiquids_.size() == 0)
84 <<
"Evaporation model selected, but no active liquids defined"
89 Info<<
"Participating liquid species:" <<
endl;
94 Info<<
" " << activeLiquids_[i] <<
endl;
96 owner.composition().carrierId(activeLiquids_[i]);
100 const label idLiquid = owner.composition().idLiquid();
104 owner.composition().localId(idLiquid, activeLiquids_[i]);
110 template<
class CloudType>
117 liquids_(pcm.owner().thermo().liquids()),
126 template<
class CloudType>
133 template<
class CloudType>
151 if ((liquids_.Tc(X) -
T) < SMALL)
156 <<
"Parcel reached critical conditions: "
157 <<
"evaporating all available mass" <<
endl;
162 const label lid = liqToLiqMap_[i];
163 dMassPC[lid] = GREAT;
170 scalar ps = liquids_.pv(pc, Ts, X);
173 scalar rhos = ps*liquids_.W(X)/(
RR*Ts);
185 scalar Yc = this->owner().thermo().carrier().Y()[i][celli];
186 Hc += Yc*this->owner().thermo().carrier().Ha(i, pc, Tc);
187 Hsc += Yc*this->owner().thermo().carrier().Ha(i, ps, Ts);
188 Cpc += Yc*this->owner().thermo().carrier().Cp(i, ps, Ts);
189 kappac += Yc*this->owner().thermo().carrier().kappa(i, ps, Ts);
195 const label gid = liqToCarrierMap_[i];
196 const label lid = liqToLiqMap_[i];
199 const scalar TBoil = liquids_.properties()[lid].pvInvert(pc);
202 const scalar Td =
min(
T, 0.999*TBoil);
205 const scalar pSat = liquids_.properties()[lid].pv(pc, Td);
208 const scalar Xc = XcMix[gid];
218 const scalar Dab = liquids_.properties()[lid].D(ps, Ts);
221 const scalar Sc =
nu/(Dab + ROOTVSMALL);
224 const scalar Sh = this->Sh(
Re, Sc);
231 const scalar deltaT =
max(
T - TBoil, 0.5);
234 const scalar hv = liquids_.properties()[lid].hl(pc, Td);
240 alphaS = 760.0*
pow(deltaT, 0.26);
242 else if (deltaT < 25.0)
244 alphaS = 27.0*
pow(deltaT, 2.33);
248 alphaS = 13800.0*
pow(deltaT, 0.39);
252 const scalar Gf = alphaS*deltaT*
pi*
sqr(d)/hv;
256 const scalar
A = (Hc - Hsc)/hv;
257 const scalar
B =
pi*kappac/Cpc*d*Sh;
266 for (label i=0; i<50; i++)
270 G =
B/(1.0 + Gr)*
log(1.0 +
A*(1.0 + Gr));
273 if (
mag(Gr - GrDash)/GrDash < 1
e-3)
280 dMassPC[lid] += (
G + Gf)*dt;
287 const scalar Xs = X[lid]*pSat/pc;
290 const scalar
Xr = (Xs - Xc)/
max(SMALL, 1.0 - Xs);
295 dMassPC[lid] +=
pi*d*Sh*Dab*rhos*
log(1.0 +
Xr)*dt;
303 template<
class CloudType>
315 if (liquids_.properties()[idl].pv(
p,
T) >= 0.999*
p)
317 TDash = liquids_.properties()[idl].pvInvert(
p);
321 switch (parent::enthalpyTransfer_)
323 case (parent::etLatentHeat):
325 dh = liquids_.properties()[idl].hl(
p, TDash);
328 case (parent::etEnthalpyDifference):
330 scalar hc = this->owner().composition().carrier().Ha(idc,
p, TDash);
331 scalar hp = liquids_.properties()[idl].h(
p, TDash);
347 template<
class CloudType>
353 return liquids_.Tpt(X);
357 template<
class CloudType>
364 return liquids_.pvInvert(
p, X);
int debug
Static debugging option.
const scalar RR
Universal gas constant: default in [J/(kmol K)].
Templated phase change model class.
virtual void calculate(const scalar dt, const label celli, const scalar Re, const scalar Pr, const scalar d, const scalar nu, const scalar T, const scalar Ts, const scalar pc, const scalar Tc, const scalarField &X, scalarField &dMassPC) const
Update model.
const dimensionedScalar G
Newtonian constant of gravitation.
A class for managing temporary objects.
List< label > liqToLiqMap_
Mapping between local and global liquid species.
psiReactionThermo & thermo
static const Foam::dimensionedScalar B("", Foam::dimless, 18.678)
static const Foam::dimensionedScalar A("", Foam::dimPressure, 611.21)
Ostream & endl(Ostream &os)
Add newline and flush stream.
virtual scalar dh(const label idc, const label idl, const scalar p, const scalar T) const
Return the enthalpy per unit mass.
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
virtual scalar Tvap(const scalarField &X) const
Return vapourisation temperature.
#define forAll(list, i)
Loop across all elements in list.
virtual ~LiquidEvaporationBoil()
Destructor.
virtual scalar TMax(const scalar p, const scalarField &X) const
Return maximum/limiting temperature.
List< label > liqToCarrierMap_
Mapping between liquid and carrier species.
List< word > activeLiquids_
List of active liquid names.
messageStream Info
Information stream (uses stdout - output is on the master only)
dimensionedScalar Pr("Pr", dimless, laminarTransport)
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
LiquidEvaporationBoil(const dictionary &dict, CloudType &cloud)
Construct from dictionary.
Liquid evaporation model.
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Templated base class for dsmc cloud.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
tmp< scalarField > calcXc(const label celli) const
Calculate the carrier phase component volume fractions at celli.
dimensionedScalar log(const dimensionedScalar &ds)
errorManip< error > abort(error &err)
PtrList< volScalarField > & Y
spatialTransform Xr(const vector &a, const scalar omega)
Rotational spatial transformation tensor about axis a by omega radians.
scalar Sh() const
Sherwood number.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
constexpr scalar pi(M_PI)
dimensionedScalar sqrt(const dimensionedScalar &ds)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
scalarField Re(const UList< complex > &cf)
Extract real component.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
dimensionedScalar cbrt(const dimensionedScalar &ds)
#define WarningInFunction
Report a warning using Foam::Warning.