32 template<
class ParcelType>
33 template<
class TrackCloudType>
36 TrackCloudType& cloud,
40 ParcelType::setCellValues(cloud, td);
44 template<
class ParcelType>
45 template<
class TrackCloudType>
48 TrackCloudType& cloud,
53 ParcelType::cellValueSourceCorrection(cloud, td, dt);
57 template<
class ParcelType>
58 template<
class TrackCloudType>
61 TrackCloudType& cloud,
66 typedef typename TrackCloudType::reactingCloudType reactingCloudType;
71 if (liquidCore() > 0.5)
74 cloud.forces().setCalcCoupled(
false);
81 scalar TMax = composition.
liquids().Tc(
X0);
82 const scalar
T0 = this->
T();
83 const scalar pc0 = td.pc();
84 if (composition.
liquids().pv(pc0, T0,
X0) >= pc0*0.999)
87 TMax = composition.
liquids().pvInvert(pc0,
X0);
91 cloud.constProps().setTMax(TMax);
95 sigma_ = composition.
liquids().sigma(pc0, T0,
X0);
98 const scalar mass0 = this->mass();
99 mu_ = composition.
liquids().mu(pc0, T0,
X0);
101 ParcelType::calc(cloud,td, dt);
107 this->ms() -= this->ms()*(mass0 - this->mass())/mass0;
111 scalar T1 = this->
T();
114 this->
Cp() = composition.
liquids().Cp(td.pc(), T1, X1);
116 sigma_ = composition.
liquids().sigma(td.pc(), T1, X1);
118 scalar
rho1 = composition.
liquids().rho(td.pc(), T1, X1);
121 mu_ = composition.
liquids().mu(td.pc(), T1, X1);
123 scalar d1 = this->d()*
cbrt(rho0/rho1);
126 if (liquidCore() > 0.5)
128 calcAtomization(cloud, td, dt);
132 scalar d2 = this->d();
133 this->nParticle() *=
pow3(d1/d2);
137 calcBreakup(cloud, td, dt);
142 cloud.forces().setCalcCoupled(
true);
146 template<
class ParcelType>
147 template<
class TrackCloudType>
150 TrackCloudType& cloud,
155 typedef typename TrackCloudType::reactingCloudType reactingCloudType;
159 typedef typename TrackCloudType::sprayCloudType sprayCloudType;
164 scalar Wc = td.rhoc()*
RR*td.Tc()/td.pc();
166 scalar Tav = atomization.
Taverage(this->
T(), td.Tc());
169 scalar rhoAv = td.pc()/(R*Tav);
171 scalar soi = cloud.injectors().timeStart();
172 scalar currentTime = cloud.db().time().value();
174 const vector& injectionPos = this->position0();
180 scalar t0 =
max(0.0, currentTime - this->age() - soi);
181 scalar t1 =
min(t0 + dt, cloud.injectors().timeEnd() - soi);
184 scalar volFlowRate = cloud.injectors().volumeToInject(t0, t1)/dt;
189 chi = this->chi(cloud, td, composition.
liquids().X(this->
Y()));
213 template<
class ParcelType>
214 template<
class TrackCloudType>
217 TrackCloudType& cloud,
222 const typename TrackCloudType::parcelType& p =
223 static_cast<const typename TrackCloudType::parcelType&
>(*this);
224 typename TrackCloudType::parcelType::trackingData& ttd =
225 static_cast<typename TrackCloudType::parcelType::trackingData&
>(td);
227 const typename TrackCloudType::forceType& forces = cloud.forces();
229 if (cloud.breakup().solveOscillationEq())
231 solveTABEq(cloud, td, dt);
235 scalar Wc = td.rhoc()*
RR*td.Tc()/td.pc();
237 scalar Tav = cloud.atomization().Taverage(this->
T(), td.Tc());
240 scalar rhoAv = td.pc()/(R*Tav);
241 scalar muAv = td.muc();
243 scalar Urmag =
mag(Urel);
244 scalar
Re = this->
Re(rhoAv, this->
U(), td.Uc(), this->d(), muAv);
246 const scalar mass = p.mass();
247 const forceSuSp Fcp = forces.calcCoupled(p, ttd, dt, mass, Re, muAv);
248 const forceSuSp Fncp = forces.calcNonCoupled(p, ttd, dt, mass, Re, muAv);
249 this->tMom() = mass/(Fcp.
Sp() + Fncp.
Sp());
251 const vector g = cloud.g().value();
253 scalar parcelMassChild = 0.0;
257 cloud.breakup().update
283 scalar Re = rhoAv*Urmag*dChild/muAv;
287 child->origId() = this->getNewParticleID();
289 child->
d0() = dChild;
290 const scalar massChild = child->mass();
291 child->mass0() = massChild;
292 child->nParticle() = parcelMassChild/massChild;
295 forces.calcCoupled(*child, ttd, dt, massChild, Re, muAv);
297 forces.calcNonCoupled(*child, ttd, dt, massChild, Re, muAv);
302 child->
y() = cloud.breakup().y0();
303 child->
yDot() = cloud.breakup().yDot0();
305 child->
ms() = -great;
306 child->
injector() = this->injector();
307 child->
tMom() = massChild/(Fcp.
Sp() + Fncp.
Sp());
309 child->calcDispersion(cloud, td, dt);
311 cloud.addParticle(child);
316 template<
class ParcelType>
317 template<
class TrackCloudType>
320 TrackCloudType& cloud,
327 typedef typename TrackCloudType::reactingCloudType reactingCloudType;
332 scalar
T0 = this->
T();
334 scalar pAmb = cloud.pAmbient();
336 scalar pv = composition.
liquids().pv(p0, T0, X);
340 if (pv >= 0.999*pAmb)
347 scalar hl = liq.
hl(pAmb, TBoil);
348 scalar iTp = liq.
h(pAmb, T0) - pAmb/liq.
rho(pAmb, T0);
349 scalar iTb = liq.
h(pAmb, TBoil) - pAmb/liq.
rho(pAmb, TBoil);
351 chi += X[i]*(iTp - iTb)/hl;
355 chi =
min(1.0,
max(chi, 0.0));
361 template<
class ParcelType>
362 template<
class TrackCloudType>
365 TrackCloudType& cloud,
370 const scalar& TABCmu = cloud.breakup().TABCmu();
371 const scalar& TABtwoWeCrit = cloud.breakup().TABtwoWeCrit();
372 const scalar& TABComega = cloud.breakup().TABComega();
374 scalar r = 0.5*this->d();
379 scalar rtd = 0.5*TABCmu*mu_/(this->
rho()*r2);
382 scalar omega2 = TABComega*sigma_/(this->
rho()*r3) - rtd*rtd;
386 scalar omega =
sqrt(omega2);
388 this->We(td.rhoc(), this->
U(), td.Uc(), r, sigma_)/TABtwoWeCrit;
391 scalar
y0 = this->
y() - We;
392 scalar yDot0 = this->yDot() + y0*rtd;
395 scalar
c =
cos(omega*dt);
396 scalar
s =
sin(omega*dt);
397 scalar
e =
exp(-rtd*dt);
399 this->
y() = We + e*(y0*c + (yDot0/omega)*s);
400 this->yDot() = (We - this->
y())*rtd + e*(yDot0*c - omega*y0*s);
413 template<
class ParcelType>
433 template<
class ParcelType>
#define forAll(list, i)
Loop across all elements in list.
virtual scalar rho(scalar p, scalar T) const =0
Liquid density [kg/m^3].
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
scalar tMom_
Momentum relaxation time (needed for calculating parcel acc.)
basicSpecieMixture & composition
scalar KHindex() const
Return const access to Kelvin-Helmholtz breakup index.
scalar tMom() const
Return const access to momentum relaxation time.
virtual bool calcChi() const =0
Flag to indicate if chi needs to be calculated.
virtual scalar pvInvert(scalar p) const
Invert the vapour pressure relationship to retrieve the.
scalar liquidCore() const
Return const access to liquid core.
dimensionedScalar sqrt(const dimensionedScalar &ds)
Templated atomization model class.
virtual scalar hl(scalar p, scalar T) const =0
Heat of vapourisation [J/kg].
void calcAtomization(TrackCloudType &cloud, trackingData &td, const scalar dt)
Correct parcel properties according to atomization model.
dimensionedScalar y0(const dimensionedScalar &ds)
void calcBreakup(TrackCloudType &cloud, trackingData &td, const scalar dt)
Correct parcel properties according to breakup model.
const dimensionedScalar & c
Speed of light in a vacuum.
scalar ms() const
Return const access to stripped parcel mass.
scalar liquidCore_
Part of liquid core ( >0.5=liquid, <0.5=droplet )
SprayParcel(const polyMesh &mesh, const barycentric &coordinates, const label celli, const label tetFacei, const label tetPti)
Construct from mesh, coordinates and topology.
scalar y() const
Return const access to spherical deviation.
Helper container for force Su and Sp terms.
scalarList X0(nSpecie, 0.0)
scalar chi(TrackCloudType &cloud, trackingData &td, const scalarField &X) const
Calculate the chi-factor for flash-boiling for the.
dimensionedScalar pos(const dimensionedScalar &ds)
scalar d0() const
Return const access to initial droplet diameter.
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
dimensionedScalar cos(const dimensionedScalar &ds)
dimensionedScalar exp(const dimensionedScalar &ds)
const dimensionedScalar & e
Elementary charge.
virtual void update(const scalar dt, scalar &d, scalar &liquidCore, scalar &tc, const scalar rho, const scalar mu, const scalar sigma, const scalar volFlowRate, const scalar rhoAv, const scalar Urel, const vector &pos, const vector &injectionPos, const scalar pAmbient, const scalar chi, Random &rndGen) const =0
dimensionedScalar cbrt(const dimensionedScalar &ds)
scalar tc() const
Return const access to atomization characteristic time.
virtual scalar h(scalar p, scalar T) const =0
Liquid enthalpy [J/kg] - reference to 298.15 K.
The thermophysical properties of a liquid.
scalar injector_
Injected from injector (needed e.g. for calculating distance.
scalar user_
Passive scalar (extra variable to be defined by user)
scalar Sp() const
Return const access to the implicit coefficient [kg/s].
scalar yDot() const
Return const access to rate of change of spherical deviation.
dimensionedScalar sin(const dimensionedScalar &ds)
void calc(TrackCloudType &cloud, trackingData &td, const scalar dt)
Update parcel properties over the time interval.
scalar user() const
Return const access to passive user scalar.
scalar sigma_
Liquid surface tension [N/m].
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
dimensionedScalar pow3(const dimensionedScalar &ds)
vector position0_
Injection position.
#define R(A, B, C, D, E, F, K, M)
scalar injector() const
Return const access to injector id.
scalar yDot_
Rate of change of spherical deviation.
PtrList< volScalarField > & Y
void solveTABEq(TrackCloudType &cloud, trackingData &td, const scalar dt)
Solve the TAB equation.
scalar Taverage(const scalar &Tliq, const scalar &Tc) const
Average temperature calculation.
void setCellValues(TrackCloudType &cloud, trackingData &td)
Set cell values.
scalar ms_
Stripped parcel mass due to breakup.
scalar Cp(const scalar p, const scalar T) const
void cellValueSourceCorrection(TrackCloudType &cloud, trackingData &td, const scalar dt)
Correct cell values using latest transfer information.
dimensioned< scalar > mag(const dimensioned< Type > &)
scalar d0_
Initial droplet diameter.
const scalar RR
Universal gas constant (default in [J/kmol/K])
Mesh consisting of general polyhedral cells.
scalar tc_
Characteristic time (used in atomization and/or breakup model)
scalar mu_
Liquid dynamic viscosity [Pa.s].
const dimensionedVector & g
const dimensionedScalar & rho1
Templated reacting parcel composition model class Consists of carrier species (via thermo package)...
scalar y_
Spherical deviation.
ParcelType::trackingData trackingData
Use base tracking data.
scalar KHindex_
Index for KH Breakup.
scalarField Re(const UList< complex > &cf)
Reaching spray parcel, with added functionality for atomization and breakup.
const liquidMixtureProperties & liquids() const
Return the global (additional) liquids.