36 template<
class ParcelType>
39 template<
class ParcelType>
42 template<
class ParcelType>
48 template<
class ParcelType>
49 template<
class TrackCloudType>
52 TrackCloudType&
cloud,
62 this->Y_[GAS]*
cloud.composition().Cp(idG, YGas_,
p,
T)
63 + this->Y_[LIQ]*
cloud.composition().Cp(idL, YLiquid_,
p,
T)
64 + this->Y_[SLD]*
cloud.composition().Cp(idS, YSolid_,
p,
T);
68 template<
class ParcelType>
69 template<
class TrackCloudType>
72 TrackCloudType&
cloud,
82 this->Y_[GAS]*
cloud.composition().Hs(idG, YGas_,
p,
T)
83 + this->Y_[LIQ]*
cloud.composition().Hs(idL, YLiquid_,
p,
T)
84 + this->Y_[SLD]*
cloud.composition().Hs(idS, YSolid_,
p,
T);
88 template<
class ParcelType>
89 template<
class TrackCloudType>
92 TrackCloudType&
cloud,
102 this->Y_[GAS]*
cloud.composition().L(idG, YGas_,
p,
T)
103 + this->Y_[LIQ]*
cloud.composition().L(idL, YLiquid_,
p,
T)
104 + this->Y_[SLD]*
cloud.composition().L(idS, YSolid_,
p,
T);
108 template<
class ParcelType>
120 this->updateMassFraction(mass0*YMix[GAS], dMassGas, YGas_);
122 this->updateMassFraction(mass0*YMix[LIQ], dMassLiquid, YLiquid_);
124 this->updateMassFraction(mass0*YMix[SLD], dMassSolid, YSolid_);
126 scalar massNew =
max(massGas + massLiquid + massSolid, ROOTVSMALL);
128 YMix[GAS] = massGas/massNew;
129 YMix[LIQ] = massLiquid/massNew;
130 YMix[SLD] = massSolid/massNew;
132 scalar Ytotal =
sum(YMix);
144 template<
class ParcelType>
145 template<
class TrackCloudType>
148 TrackCloudType&
cloud,
152 ParcelType::setCellValues(
cloud, td);
156 template<
class ParcelType>
157 template<
class TrackCloudType>
160 TrackCloudType&
cloud,
166 ParcelType::cellValueSourceCorrection(
cloud, td, dt);
170 template<
class ParcelType>
171 template<
class TrackCloudType>
174 TrackCloudType&
cloud,
179 typedef typename TrackCloudType::reactingCloudType reactingCloudType;
186 const scalar np0 = this->nParticle_;
187 const scalar d0 = this->d_;
188 const vector& U0 = this->U_;
189 const scalar
T0 = this->T_;
190 const scalar mass0 = this->mass();
192 const scalar pc = td.pc();
201 scalar Ts, rhos, mus, Prs, kappas;
202 this->calcSurfaceValues(
cloud, td,
T0, Ts, rhos, mus, Prs, kappas);
203 scalar Res = this->
Re(rhos, U0, td.Uc(), d0, mus);
225 scalar dhsTrans = 0.0;
247 this->calcPhaseChange
340 scalar mass1 = mass0 -
sum(dMassGas) -
sum(dMassLiquid) -
sum(dMassSolid);
343 if (np0*mass1 <
cloud.constProps().minParcelMass())
345 td.keepParticle =
false;
347 if (
cloud.solution().coupled())
349 scalar dm = np0*mass0;
355 cloud.rhoTrans(gid)[this->
cell()] += dm*YMix[GAS]*YGas_[i];
360 cloud.rhoTrans(gid)[this->
cell()] += dm*YMix[LIQ]*YLiquid_[i];
375 dm*HsEff(
cloud, td, pc,
T0, idG, idL, idS);
377 cloud.phaseChange().addToPhaseChangeMass(np0*mass1);
383 (void)updateMassFractions(mass0, dMassGas, dMassLiquid, dMassSolid);
386 if (
cloud.constProps().constantVolume())
388 this->rho_ = mass1/this->
volume();
392 this->d_ =
cbrt(mass1/this->rho_*6.0/
pi);
396 this->correctSurfaceValues(
cloud, td, Ts,
Cs, rhos, mus, Prs, kappas);
397 Res = this->
Re(rhos, U0, td.Uc(), this->d_, mus);
408 this->calcHeatTransfer
423 this->Cp_ = CpEff(
cloud, td, pc, this->T_, idG, idL, idS);
431 this->calcVelocity(
cloud, td, dt, Res, mus, mass1,
Su, dUTrans, Spu);
437 if (
cloud.solution().coupled())
442 scalar dm = np0*dMassGas[i];
451 scalar dm = np0*dMassLiquid[i];
474 scalar dm = np0*dMassSRCarrier[i];
482 cloud.UTrans()[this->
cell()] += np0*dUTrans;
486 cloud.hsTrans()[this->
cell()] += np0*dhsTrans;
487 cloud.hsCoeff()[this->
cell()] += np0*Sph;
490 if (
cloud.radiation())
492 const scalar ap = this->areaP();
493 const scalar T4 =
pow4(
T0);
494 cloud.radAreaP()[this->
cell()] += dt*np0*ap;
495 cloud.radT4()[this->
cell()] += dt*np0*T4;
496 cloud.radAreaPT4()[this->
cell()] += dt*np0*ap*T4;
504 template<
class ParcelType>
505 template<
class TrackCloudType>
508 TrackCloudType&
cloud,
529 if (!
cloud.devolatilisation().active())
535 (void)
cloud.constProps().TDevol();
536 (void)
cloud.constProps().LDevol();
540 if (
T <
cloud.constProps().TDevol() || canCombust == -1)
545 typedef typename TrackCloudType::reactingCloudType reactingCloudType;
551 cloud.devolatilisation().calculate
565 scalar dMassTot =
sum(dMassDV);
567 cloud.devolatilisation().addToDevolatilisationMass
569 this->nParticle_*dMassTot
572 Sh -= dMassTot*
cloud.constProps().LDevol()/dt;
575 if (
cloud.heatTransfer().BirdCorrection())
578 const scalar Wc =
max(SMALL, td.rhoc()*
RR*td.Tc()/td.pc());
586 const label
id =
composition.localToCarrierId(GAS, i);
589 const scalar Ni = dMassDV[i]/(this->areaS(d)*dt*W);
593 3.6059e-3*(
pow(1.8*Ts, 1.75))
594 *
sqrt(1.0/W + 1.0/Wc)
599 Cs[id] += Ni*d/(2.0*Dab);
605 template<
class ParcelType>
606 template<
class TrackCloudType>
609 TrackCloudType&
cloud,
617 const label canCombust,
632 if (!
cloud.surfaceReaction().active())
638 (void)
cloud.constProps().hRetentionCoeff();
639 (void)
cloud.constProps().TMax();
649 const scalar hReaction =
cloud.surfaceReaction().calculate
672 cloud.surfaceReaction().addToSurfaceReactionMass
675 *(
sum(dMassSRGas) +
sum(dMassSRLiquid) +
sum(dMassSRSolid))
678 const scalar xsi =
min(
T/
cloud.constProps().TMax(), 1.0);
680 (1.0 - xsi*xsi)*
cloud.constProps().hRetentionCoeff();
682 Sh += coeff*hReaction/dt;
684 dhsTrans += (1.0 - coeff)*hReaction;
690 template<
class ParcelType>
698 YLiquid_(
p.YLiquid_),
700 canCombust_(
p.canCombust_)
704 template<
class ParcelType>
707 const ReactingMultiphaseParcel<ParcelType>&
p,
713 YLiquid_(
p.YLiquid_),
715 canCombust_(
p.canCombust_)