33 template<
class ParcelType>
36 template<
class ParcelType>
39 template<
class ParcelType>
45 template<
class ParcelType>
46 template<
class TrackData>
58 this->Y_[GAS]*td.cloud().composition().Cp(idG, YGas_,
p,
T)
59 + this->Y_[LIQ]*td.cloud().composition().Cp(idL, YLiquid_,
p,
T)
60 + this->Y_[SLD]*td.cloud().composition().Cp(idS, YSolid_,
p,
T);
64 template<
class ParcelType>
65 template<
class TrackData>
77 this->Y_[GAS]*td.cloud().composition().Hs(idG, YGas_,
p,
T)
78 + this->Y_[LIQ]*td.cloud().composition().Hs(idL, YLiquid_,
p,
T)
79 + this->Y_[SLD]*td.cloud().composition().Hs(idS, YSolid_,
p,
T);
83 template<
class ParcelType>
84 template<
class TrackData>
96 this->Y_[GAS]*td.cloud().composition().L(idG, YGas_,
p,
T)
97 + this->Y_[LIQ]*td.cloud().composition().L(idL, YLiquid_,
p,
T)
98 + this->Y_[SLD]*td.cloud().composition().L(idS, YSolid_,
p,
T);
102 template<
class ParcelType>
114 this->updateMassFraction(mass0*YMix[GAS], dMassGas, YGas_);
116 this->updateMassFraction(mass0*YMix[LIQ], dMassLiquid, YLiquid_);
118 this->updateMassFraction(mass0*YMix[SLD], dMassSolid, YSolid_);
120 scalar massNew =
max(massGas + massLiquid + massSolid, ROOTVSMALL);
122 YMix[GAS] = massGas/massNew;
123 YMix[LIQ] = massLiquid/massNew;
124 YMix[SLD] = massSolid/massNew;
126 scalar Ytotal =
sum(YMix);
138 template<
class ParcelType>
139 template<
class TrackData>
147 ParcelType::setCellValues(td, dt, cellI);
151 template<
class ParcelType>
152 template<
class TrackData>
161 ParcelType::cellValueSourceCorrection(td, dt, cellI);
165 template<
class ParcelType>
166 template<
class TrackData>
174 typedef typename TrackData::cloudType::reactingCloudType reactingCloudType;
176 td.cloud().composition();
181 const scalar np0 = this->nParticle_;
182 const scalar d0 = this->d_;
183 const vector& U0 = this->U_;
184 const scalar T0 = this->T_;
185 const scalar mass0 = this->mass();
187 const scalar pc = this->pc_;
196 scalar Ts, rhos, mus, Prs, kappas;
197 this->calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Prs, kappas);
198 scalar Res = this->
Re(U0, d0, rhos, mus);
220 scalar dhsTrans = 0.0;
242 this->calcPhaseChange
332 scalar mass1 = mass0 -
sum(dMassGas) -
sum(dMassLiquid) -
sum(dMassSolid);
335 if (np0*mass1 < td.cloud().constProps().minParcelMass())
337 td.keepParticle =
false;
339 if (td.cloud().solution().coupled())
341 scalar dm = np0*mass0;
347 td.cloud().rhoTrans(gid)[cellI] += dm*YMix[GAS]*YGas_[i];
352 td.cloud().rhoTrans(gid)[cellI] += dm*YMix[LIQ]*YLiquid_[i];
364 td.cloud().UTrans()[cellI] += dm*U0;
366 td.cloud().hsTrans()[cellI] += dm*HsEff(td, pc, T0, idG, idL, idS);
368 td.cloud().phaseChange().addToPhaseChangeMass(np0*mass1);
374 (void)updateMassFractions(mass0, dMassGas, dMassLiquid, dMassSolid);
377 if (td.cloud().constProps().constantVolume())
379 this->rho_ = mass1/this->volume();
383 this->d_ =
cbrt(mass1/this->rho_*6.0/
pi);
387 this->correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Prs, kappas);
388 Res = this->
Re(U0, this->d_, rhos, mus);
399 this->calcHeatTransfer
414 this->Cp_ = CpEff(td, pc, this->T_, idG, idL, idS);
422 this->calcVelocity(td, dt, cellI, Res, mus, mass1,
Su, dUTrans, Spu);
428 if (td.cloud().solution().coupled())
433 scalar dm = np0*dMassGas[i];
436 td.cloud().rhoTrans(gid)[cellI] += dm;
437 td.cloud().UTrans()[cellI] += dm*U0;
438 td.cloud().hsTrans()[cellI] += dm*hs;
442 scalar dm = np0*dMassLiquid[i];
445 td.cloud().rhoTrans(gid)[cellI] += dm;
446 td.cloud().UTrans()[cellI] += dm*U0;
447 td.cloud().hsTrans()[cellI] += dm*hs;
465 scalar dm = np0*dMassSRCarrier[i];
467 td.cloud().rhoTrans(i)[cellI] += dm;
468 td.cloud().UTrans()[cellI] += dm*U0;
469 td.cloud().hsTrans()[cellI] += dm*hs;
473 td.cloud().UTrans()[cellI] += np0*dUTrans;
474 td.cloud().UCoeff()[cellI] += np0*Spu;
477 td.cloud().hsTrans()[cellI] += np0*dhsTrans;
478 td.cloud().hsCoeff()[cellI] += np0*Sph;
481 if (td.cloud().radiation())
483 const scalar ap = this->areaP();
484 const scalar T4 =
pow4(T0);
485 td.cloud().radAreaP()[cellI] += dt*np0*ap;
486 td.cloud().radT4()[cellI] += dt*np0*T4;
487 td.cloud().radAreaPT4()[cellI] += dt*np0*ap*T4;
493 template<
class ParcelType>
494 template<
class TrackData>
517 if (!td.cloud().devolatilisation().active())
523 (void)td.cloud().constProps().TDevol();
524 (void)td.cloud().constProps().LDevol();
528 if (
T < td.cloud().constProps().TDevol() || canCombust == -1)
533 typedef typename TrackData::cloudType::reactingCloudType reactingCloudType;
535 td.cloud().composition();
539 td.cloud().devolatilisation().calculate
553 scalar dMassTot =
sum(dMassDV);
555 td.cloud().devolatilisation().addToDevolatilisationMass
557 this->nParticle_*dMassTot
560 Sh -= dMassTot*td.cloud().constProps().LDevol()/dt;
563 if (td.cloud().heatTransfer().BirdCorrection())
567 max(SMALL, this->rhoc_*
RR*this->Tc_/this->pc_);
576 const scalar Cp =
composition.carrier().Cp(
id, this->pc_, Ts);
578 const scalar Ni = dMassDV[i]/(this->areaS(d)*dt*W);
582 3.6059e-3*(
pow(1.8*Ts, 1.75))
583 *
sqrt(1.0/W + 1.0/Wc)
588 Cs[id] += Ni*d/(2.0*Dab);
594 template<
class ParcelType>
595 template<
class TrackData>
604 const label canCombust,
619 if (!td.cloud().surfaceReaction().active())
625 (void)td.cloud().constProps().hRetentionCoeff();
626 (void)td.cloud().constProps().TMax();
636 const scalar hReaction = td.cloud().surfaceReaction().calculate
657 td.cloud().surfaceReaction().addToSurfaceReactionMass
660 *(
sum(dMassSRGas) +
sum(dMassSRLiquid) +
sum(dMassSRSolid))
663 const scalar xsi =
min(
T/td.cloud().constProps().TMax(), 1.0);
665 (1.0 - xsi*xsi)*td.cloud().constProps().hRetentionCoeff();
669 dhsTrans += (1.0 -
coeff)*hReaction;
675 template<
class ParcelType>
683 YLiquid_(
p.YLiquid_),
685 canCombust_(
p.canCombust_)
689 template<
class ParcelType>
692 const ReactingMultiphaseParcel<ParcelType>&
p,
698 YLiquid_(
p.YLiquid_),
700 canCombust_(
p.canCombust_)