34 template<
class CloudType>
45 this->owner().composition().carrier().Y()[i][celli]
46 /this->owner().composition().carrier().Wi(i);
53 template<
class CloudType>
66 template<
class CloudType>
74 liquids_(owner.thermo().liquids()),
75 activeLiquids_(this->coeffDict().lookup(
"activeLiquids")),
76 liqToCarrierMap_(activeLiquids_.size(), -1),
77 liqToLiqMap_(activeLiquids_.size(), -1)
79 if (activeLiquids_.size() == 0)
82 <<
"Evaporation model selected, but no active liquids defined" 87 Info<<
"Participating liquid species:" <<
endl;
92 Info<<
" " << activeLiquids_[i] <<
endl;
94 owner.composition().carrierId(activeLiquids_[i]);
98 const label idLiquid = owner.composition().idLiquid();
102 owner.composition().localId(idLiquid, activeLiquids_[i]);
108 template<
class CloudType>
115 liquids_(pcm.
owner().thermo().liquids()),
124 template<
class CloudType>
131 template<
class CloudType>
135 const typename CloudType::parcelType::trackingData& td,
150 if ((liquids_.Tc(X) -
T) < small)
155 <<
"Parcel reached critical conditions: " 156 <<
"evaporating all available mass" <<
endl;
161 const label lid = liqToLiqMap_[i];
162 dMassPC[lid] = great;
169 scalar ps = liquids_.pv(pc, Ts, X);
172 scalar rhos = ps*liquids_.W(X)/(
RR*Ts);
184 scalar Yc = this->owner().composition().carrier().Y()[i][p.cell()];
185 Hc += Yc*this->owner().composition().carrier().Ha(i, pc, Tc);
186 Hsc += Yc*this->owner().composition().carrier().Ha(i, ps, Ts);
187 Cpc += Yc*this->owner().composition().carrier().Cp(i, ps, Ts);
188 kappac += Yc*this->owner().composition().carrier().kappa(i, ps, Ts);
194 const label gid = liqToCarrierMap_[i];
195 const label lid = liqToLiqMap_[i];
198 const scalar TBoil = liquids_.properties()[lid].pvInvert(pc);
201 const scalar Td =
min(T, 0.999*TBoil);
204 const scalar pSat = liquids_.properties()[lid].pv(pc, Td);
207 const scalar Xc = XcMix[gid];
217 const scalar Dab = liquids_.properties()[lid].D(ps, Ts);
220 const scalar Sc = nu/(Dab + rootVSmall);
223 const scalar Sh = this->Sh(Re, Sc);
230 const scalar deltaT =
max(T - TBoil, 0.5);
233 const scalar hv = liquids_.properties()[lid].hl(pc, Td);
239 alphaS = 760.0*
pow(deltaT, 0.26);
241 else if (deltaT < 25.0)
243 alphaS = 27.0*
pow(deltaT, 2.33);
247 alphaS = 13800.0*
pow(deltaT, 0.39);
251 const scalar Gf = alphaS*deltaT*
pi*
sqr(d)/hv;
255 const scalar A = (Hc - Hsc)/hv;
256 const scalar B =
pi*kappac/Cpc*d*Sh;
265 for (
label i=0; i<50; i++)
269 G = B/(1.0 + Gr)*
log(1.0 + A*(1.0 + Gr));
272 if (
mag(Gr - GrDash)/GrDash < 1
e-3)
279 dMassPC[lid] += (G + Gf)*dt;
286 const scalar Xs = X[lid]*pSat/pc;
289 const scalar
Xr = (Xs - Xc)/
max(small, 1.0 - Xs);
294 dMassPC[lid] +=
pi*d*Sh*Dab*rhos*
log(1.0 + Xr)*dt;
302 template<
class CloudType>
314 if (liquids_.properties()[idl].pv(p, T) >= 0.999*
p)
316 TDash = liquids_.properties()[idl].pvInvert(p);
320 switch (parent::enthalpyTransfer_)
322 case (parent::etLatentHeat):
327 case (parent::etEnthalpyDifference):
329 scalar hc = this->owner().composition().carrier().Ha(idc, p, TDash);
330 scalar hp = liquids_.
properties()[idl].Ha(p, TDash);
346 template<
class CloudType>
352 return liquids_.Tpt(X);
356 template<
class CloudType>
363 return liquids_.pvInvert(p, X);
const dictionary & properties() const
Return const access to the properties dictionary.
tmp< scalarField > calcXc(const label celli) const
Calculate the carrier phase component volume fractions at celli.
#define forAll(list, i)
Loop across all elements in list.
List< word > activeLiquids_
List of active liquid names.
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
Templated phase change model class.
dimensionedScalar log(const dimensionedScalar &ds)
A list of keyword definitions, which are a keyword followed by any number of values (e...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
basicSpecieMixture & composition
dimensionedSymmTensor sqr(const dimensionedVector &dv)
List< label > liqToCarrierMap_
Mapping between liquid and carrier species.
dimensionedScalar sqrt(const dimensionedScalar &ds)
Ostream & endl(Ostream &os)
Add newline and flush stream.
const dimensionedScalar G
Newtonian constant of gravitation.
virtual scalar Tvap(const scalarField &X) const
Return vapourisation temperature.
List< label > liqToLiqMap_
Mapping between local and global liquid species.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
const CloudType & owner() const
Return const access to the owner cloud.
const dimensionedScalar RR
Universal gas constant: default SI units: [J/kmol/K].
virtual scalar dh(const label idc, const label idl, const scalar p, const scalar T) const
Return the enthalpy per unit mass.
LiquidEvaporationBoil(const dictionary &dict, CloudType &cloud)
Construct from dictionary.
Liquid evaporation model.
dimensionedScalar cbrt(const dimensionedScalar &ds)
spatialTransform Xr(const vector &a, const scalar omega)
Rotational spatial transformation tensor about axis a by omega radians.
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
errorManip< error > abort(error &err)
ParcelType parcelType
Type of parcel the cloud was instantiated for.
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
virtual scalar TMax(const scalar p, const scalarField &X) const
Return maximum/limiting temperature.
#define WarningInFunction
Report a warning using Foam::Warning.
PtrList< volScalarField > & Y
dimensioned< scalar > mag(const dimensioned< Type > &)
A class for managing temporary objects.
Templated base class for dsmc cloud.
virtual void calculate(const typename CloudType::parcelType &p, const typename CloudType::parcelType::trackingData &td, const scalar dt, 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.
virtual ~LiquidEvaporationBoil()
Destructor.
scalar Sh() const
Sherwood number.