36 template<
class ParcelType>
37 template<
class TrackData>
60 typedef typename TrackData::cloudType::reactingCloudType reactingCloudType;
62 td.cloud().composition();
65 if (!phaseChange.active() || (YPhase < SMALL))
72 scalar Tvap = phaseChange.
Tvap(X);
79 const scalar TMax = phaseChange.
TMax(pc_, X);
80 const scalar Tdash =
min(
T, TMax);
81 const scalar Tsdash =
min(Ts, TMax);
101 dMassPC =
min(mass*YPhase*
Y, dMassPC);
103 const scalar dMassTot =
sum(dMassPC);
112 const scalar dh = phaseChange.
dh(cid, i, pc_, Tdash);
113 Sh -= dMassPC[i]*dh/dt;
118 if (td.cloud().heatTransfer().BirdCorrection())
121 const scalar Wc = this->rhoc_*
RR*this->Tc_/this->pc_;
127 const scalar Cp =
composition.carrier().Cp(cid, pc_, Tsdash);
129 const scalar Ni = dMassPC[i]/(this->areaS(d)*dt*W);
132 composition.liquids().properties()[i].D(pc_, Tsdash, Wc);
141 Cs[cid] += Ni*d/(2.0*Dab);
147 template<
class ParcelType>
155 scalar mass1 = mass0 -
sum(dMass);
158 if (mass1 > ROOTVSMALL)
162 Y[i] = (
Y[i]*mass0 - dMass[i])/mass1;
172 template<
class ParcelType>
185 template<
class ParcelType>
188 const ReactingParcel<ParcelType>&
p,
201 template<
class ParcelType>
202 template<
class TrackData>
210 ParcelType::setCellValues(td, dt, cellI);
212 pc_ = td.pInterp().interpolate
215 this->currentTetIndices()
218 if (pc_ < td.cloud().constProps().pMin())
223 <<
"Limiting observed pressure in cell " << cellI <<
" to "
224 << td.cloud().constProps().pMin() <<
nl <<
endl;
227 pc_ = td.cloud().constProps().pMin();
232 template<
class ParcelType>
233 template<
class TrackData>
241 scalar addedMass = 0.0;
242 scalar maxMassI = 0.0;
243 forAll(td.cloud().rhoTrans(), i)
245 scalar dm = td.cloud().rhoTrans(i)[cellI];
246 maxMassI =
max(maxMassI,
mag(dm));
250 if (maxMassI < ROOTVSMALL)
255 const scalar massCell = this->massCell(cellI);
257 this->rhoc_ += addedMass/td.cloud().pMesh().cellVolumes()[cellI];
259 const scalar massCellNew = massCell + addedMass;
260 this->Uc_ = (this->Uc_*massCell + td.cloud().UTrans()[cellI])/massCellNew;
263 forAll(td.cloud().rhoTrans(), i)
265 scalar
Y = td.cloud().rhoTrans(i)[cellI]/addedMass;
266 CpEff +=
Y*td.cloud().composition().carrier().Cp
274 const scalar Cpc = td.CpInterp().psi()[cellI];
275 this->Cpc_ = (massCell*Cpc + addedMass*CpEff)/massCellNew;
277 this->Tc_ += td.cloud().hsTrans()[cellI]/(this->Cpc_*massCellNew);
279 if (this->Tc_ < td.cloud().constProps().TMin())
284 <<
"Limiting observed temperature in cell " << cellI <<
" to "
285 << td.cloud().constProps().TMin() <<
nl <<
endl;
288 this->Tc_ = td.cloud().constProps().TMin();
293 template<
class ParcelType>
294 template<
class TrackData>
308 if (!td.cloud().heatTransfer().BirdCorrection() || (
sum(Cs) < SMALL))
320 Xinf[i] =
thermo.carrier().Y(i)[cellI]/
thermo.carrier().W(i);
325 const scalar Xsff = 1.0 -
min(
sum(Cs)*
RR*this->T_/pc_, 1.0);
328 const scalar CsTot = pc_/(
RR*this->T_);
339 const scalar Csi = Cs[i] + Xsff*Xinf[i]*CsTot;
341 Xs[i] = (2.0*Csi + Xinf[i]*CsTot)/3.0;
342 Ys[i] = Xs[i]*
thermo.carrier().W(i);
352 scalar sumYiSqrtW = 0;
353 scalar sumYiCbrtW = 0;
357 const scalar W =
thermo.carrier().W(i);
358 const scalar sqrtW =
sqrt(W);
359 const scalar cbrtW =
cbrt(W);
362 mus += Ys[i]*sqrtW*
thermo.carrier().mu(i, pc_,
T);
363 kappas += Ys[i]*cbrtW*
thermo.carrier().kappa(i, pc_,
T);
364 Cps += Xs[i]*
thermo.carrier().Cp(i, pc_,
T);
366 sumYiSqrtW += Ys[i]*sqrtW;
367 sumYiCbrtW += Ys[i]*cbrtW;
370 Cps =
max(Cps, ROOTVSMALL);
373 rhos =
max(rhos, ROOTVSMALL);
376 mus =
max(mus, ROOTVSMALL);
378 kappas /= sumYiCbrtW;
379 kappas =
max(kappas, ROOTVSMALL);
381 Prs = Cps*mus/kappas;
385 template<
class ParcelType>
386 template<
class TrackData>
394 typedef typename TrackData::cloudType::reactingCloudType reactingCloudType;
396 td.cloud().composition();
402 const scalar np0 = this->nParticle_;
403 const scalar d0 = this->d_;
404 const vector& U0 = this->U_;
405 const scalar T0 = this->T_;
406 const scalar mass0 = this->mass();
410 scalar Ts, rhos, mus, Prs, kappas;
411 this->calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Prs, kappas);
412 scalar Res = this->
Re(U0, d0, rhos, mus);
434 scalar dhsTrans = 0.0;
483 scalar mass1 = updateMassFraction(mass0, dMass, Y_);
488 if (td.cloud().constProps().constantVolume())
490 this->rho_ = mass1/this->volume();
494 this->d_ =
cbrt(mass1/this->rho_*6.0/
pi);
498 if (np0*mass1 < td.cloud().constProps().minParcelMass())
500 td.keepParticle =
false;
502 if (td.cloud().solution().coupled())
504 scalar dm = np0*mass0;
509 scalar dmi = dm*Y_[i];
511 scalar hs =
composition.carrier().Hs(gid, pc_, T0);
513 td.cloud().rhoTrans(gid)[cellI] += dmi;
514 td.cloud().hsTrans()[cellI] += dmi*hs;
516 td.cloud().UTrans()[cellI] += dm*U0;
518 td.cloud().phaseChange().addToPhaseChangeMass(np0*mass1);
525 correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Prs, kappas);
526 Res = this->
Re(U0, this->d_, rhos, mus);
537 this->calcHeatTransfer
559 this->calcVelocity(td, dt, cellI, Res, mus, mass1,
Su, dUTrans, Spu);
565 if (td.cloud().solution().coupled())
570 scalar dm = np0*dMass[i];
572 scalar hs =
composition.carrier().Hs(gid, pc_, T0);
574 td.cloud().rhoTrans(gid)[cellI] += dm;
575 td.cloud().UTrans()[cellI] += dm*U0;
576 td.cloud().hsTrans()[cellI] += dm*hs;
580 td.cloud().UTrans()[cellI] += np0*dUTrans;
581 td.cloud().UCoeff()[cellI] += np0*Spu;
584 td.cloud().hsTrans()[cellI] += np0*dhsTrans;
585 td.cloud().hsCoeff()[cellI] += np0*Sph;
588 if (td.cloud().radiation())
590 const scalar ap = this->areaP();
591 const scalar T4 =
pow4(T0);
592 td.cloud().radAreaP()[cellI] += dt*np0*ap;
593 td.cloud().radT4()[cellI] += dt*np0*T4;
594 td.cloud().radAreaPT4()[cellI] += dt*np0*ap*T4;