ReactingParcel.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "ReactingParcel.H"
27 #include "specie.H"
28 #include "CompositionModel.H"
29 #include "PhaseChangeModel.H"
30 #include "mathematicalConstants.H"
31 
32 using namespace Foam::constant::mathematical;
33 
34 // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
35 
36 template<class ParcelType>
37 template<class TrackData>
39 (
40  TrackData& td,
41  const scalar dt,
42  const label cellI,
43  const scalar Re,
44  const scalar Pr,
45  const scalar Ts,
46  const scalar nus,
47  const scalar d,
48  const scalar T,
49  const scalar mass,
50  const label idPhase,
51  const scalar YPhase,
52  const scalarField& Y,
53  scalarField& dMassPC,
54  scalar& Sh,
55  scalar& N,
56  scalar& NCpW,
57  scalarField& Cs
58 )
59 {
60  typedef typename TrackData::cloudType::reactingCloudType reactingCloudType;
62  td.cloud().composition();
63  PhaseChangeModel<reactingCloudType>& phaseChange = td.cloud().phaseChange();
64 
65  if (!phaseChange.active() || (YPhase < SMALL))
66  {
67  return;
68  }
69 
70  scalarField X(composition.liquids().X(Y));
71 
72  scalar Tvap = phaseChange.Tvap(X);
73 
74  if (T < Tvap)
75  {
76  return;
77  }
78 
79  const scalar TMax = phaseChange.TMax(pc_, X);
80  const scalar Tdash = min(T, TMax);
81  const scalar Tsdash = min(Ts, TMax);
82 
83  // Calculate mass transfer due to phase change
84  phaseChange.calculate
85  (
86  dt,
87  cellI,
88  Re,
89  Pr,
90  d,
91  nus,
92  Tdash,
93  Tsdash,
94  pc_,
95  this->Tc_,
96  X,
97  dMassPC
98  );
99 
100  // Limit phase change mass by availability of each specie
101  dMassPC = min(mass*YPhase*Y, dMassPC);
102 
103  const scalar dMassTot = sum(dMassPC);
104 
105  // Add to cumulative phase change mass
106  phaseChange.addToPhaseChangeMass(this->nParticle_*dMassTot);
107 
108  forAll(dMassPC, i)
109  {
110  const label cid = composition.localToCarrierId(idPhase, i);
111 
112  const scalar dh = phaseChange.dh(cid, i, pc_, Tdash);
113  Sh -= dMassPC[i]*dh/dt;
114  }
115 
116 
117  // Update molar emissions
118  if (td.cloud().heatTransfer().BirdCorrection())
119  {
120  // Average molecular weight of carrier mix - assumes perfect gas
121  const scalar Wc = this->rhoc_*RR*this->Tc_/this->pc_;
122 
123  forAll(dMassPC, i)
124  {
125  const label cid = composition.localToCarrierId(idPhase, i);
126 
127  const scalar Cp = composition.carrier().Cp(cid, pc_, Tsdash);
128  const scalar W = composition.carrier().W(cid);
129  const scalar Ni = dMassPC[i]/(this->areaS(d)*dt*W);
130 
131  const scalar Dab =
132  composition.liquids().properties()[i].D(pc_, Tsdash, Wc);
133 
134  // Molar flux of species coming from the particle (kmol/m^2/s)
135  N += Ni;
136 
137  // Sum of Ni*Cpi*Wi of emission species
138  NCpW += Ni*Cp*W;
139 
140  // Concentrations of emission species
141  Cs[cid] += Ni*d/(2.0*Dab);
142  }
143  }
144 }
145 
146 
147 template<class ParcelType>
149 (
150  const scalar mass0,
151  const scalarField& dMass,
152  scalarField& Y
153 ) const
154 {
155  scalar mass1 = mass0 - sum(dMass);
156 
157  // only update the mass fractions if the new particle mass is finite
158  if (mass1 > ROOTVSMALL)
159  {
160  forAll(Y, i)
161  {
162  Y[i] = (Y[i]*mass0 - dMass[i])/mass1;
163  }
164  }
165 
166  return mass1;
167 }
168 
169 
170 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
171 
172 template<class ParcelType>
174 (
176 )
177 :
178  ParcelType(p),
179  mass0_(p.mass0_),
180  Y_(p.Y_),
181  pc_(p.pc_)
182 {}
183 
184 
185 template<class ParcelType>
187 (
188  const ReactingParcel<ParcelType>& p,
189  const polyMesh& mesh
190 )
191 :
192  ParcelType(p, mesh),
193  mass0_(p.mass0_),
194  Y_(p.Y_),
195  pc_(p.pc_)
196 {}
197 
198 
199 // * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * * //
200 
201 template<class ParcelType>
202 template<class TrackData>
204 (
205  TrackData& td,
206  const scalar dt,
207  const label cellI
208 )
209 {
210  ParcelType::setCellValues(td, dt, cellI);
211 
212  pc_ = td.pInterp().interpolate
213  (
214  this->position(),
215  this->currentTetIndices()
216  );
217 
218  if (pc_ < td.cloud().constProps().pMin())
219  {
220  if (debug)
221  {
223  << "Limiting observed pressure in cell " << cellI << " to "
224  << td.cloud().constProps().pMin() << nl << endl;
225  }
226 
227  pc_ = td.cloud().constProps().pMin();
228  }
229 }
230 
231 
232 template<class ParcelType>
233 template<class TrackData>
235 (
236  TrackData& td,
237  const scalar dt,
238  const label cellI
239 )
240 {
241  scalar addedMass = 0.0;
242  scalar maxMassI = 0.0;
243  forAll(td.cloud().rhoTrans(), i)
244  {
245  scalar dm = td.cloud().rhoTrans(i)[cellI];
246  maxMassI = max(maxMassI, mag(dm));
247  addedMass += dm;
248  }
249 
250  if (maxMassI < ROOTVSMALL)
251  {
252  return;
253  }
254 
255  const scalar massCell = this->massCell(cellI);
256 
257  this->rhoc_ += addedMass/td.cloud().pMesh().cellVolumes()[cellI];
258 
259  const scalar massCellNew = massCell + addedMass;
260  this->Uc_ = (this->Uc_*massCell + td.cloud().UTrans()[cellI])/massCellNew;
261 
262  scalar CpEff = 0.0;
263  forAll(td.cloud().rhoTrans(), i)
264  {
265  scalar Y = td.cloud().rhoTrans(i)[cellI]/addedMass;
266  CpEff += Y*td.cloud().composition().carrier().Cp
267  (
268  i,
269  this->pc_,
270  this->Tc_
271  );
272  }
273 
274  const scalar Cpc = td.CpInterp().psi()[cellI];
275  this->Cpc_ = (massCell*Cpc + addedMass*CpEff)/massCellNew;
276 
277  this->Tc_ += td.cloud().hsTrans()[cellI]/(this->Cpc_*massCellNew);
278 
279  if (this->Tc_ < td.cloud().constProps().TMin())
280  {
281  if (debug)
282  {
284  << "Limiting observed temperature in cell " << cellI << " to "
285  << td.cloud().constProps().TMin() << nl << endl;
286  }
287 
288  this->Tc_ = td.cloud().constProps().TMin();
289  }
290 }
291 
292 
293 template<class ParcelType>
294 template<class TrackData>
296 (
297  TrackData& td,
298  const label cellI,
299  const scalar T,
300  const scalarField& Cs,
301  scalar& rhos,
302  scalar& mus,
303  scalar& Prs,
304  scalar& kappas
305 )
306 {
307  // No correction if total concentration of emitted species is small
308  if (!td.cloud().heatTransfer().BirdCorrection() || (sum(Cs) < SMALL))
309  {
310  return;
311  }
312 
313  const SLGThermo& thermo = td.cloud().thermo();
314 
315  // Far field carrier molar fractions
316  scalarField Xinf(thermo.carrier().species().size());
317 
318  forAll(Xinf, i)
319  {
320  Xinf[i] = thermo.carrier().Y(i)[cellI]/thermo.carrier().W(i);
321  }
322  Xinf /= sum(Xinf);
323 
324  // Molar fraction of far field species at particle surface
325  const scalar Xsff = 1.0 - min(sum(Cs)*RR*this->T_/pc_, 1.0);
326 
327  // Surface carrier total molar concentration
328  const scalar CsTot = pc_/(RR*this->T_);
329 
330  // Surface carrier composition (molar fraction)
331  scalarField Xs(Xinf.size());
332 
333  // Surface carrier composition (mass fraction)
334  scalarField Ys(Xinf.size());
335 
336  forAll(Xs, i)
337  {
338  // Molar concentration of species at particle surface
339  const scalar Csi = Cs[i] + Xsff*Xinf[i]*CsTot;
340 
341  Xs[i] = (2.0*Csi + Xinf[i]*CsTot)/3.0;
342  Ys[i] = Xs[i]*thermo.carrier().W(i);
343  }
344  Xs /= sum(Xs);
345  Ys /= sum(Ys);
346 
347 
348  rhos = 0;
349  mus = 0;
350  kappas = 0;
351  scalar Cps = 0;
352  scalar sumYiSqrtW = 0;
353  scalar sumYiCbrtW = 0;
354 
355  forAll(Ys, i)
356  {
357  const scalar W = thermo.carrier().W(i);
358  const scalar sqrtW = sqrt(W);
359  const scalar cbrtW = cbrt(W);
360 
361  rhos += Xs[i]*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);
365 
366  sumYiSqrtW += Ys[i]*sqrtW;
367  sumYiCbrtW += Ys[i]*cbrtW;
368  }
369 
370  Cps = max(Cps, ROOTVSMALL);
371 
372  rhos *= pc_/(RR*T);
373  rhos = max(rhos, ROOTVSMALL);
374 
375  mus /= sumYiSqrtW;
376  mus = max(mus, ROOTVSMALL);
377 
378  kappas /= sumYiCbrtW;
379  kappas = max(kappas, ROOTVSMALL);
380 
381  Prs = Cps*mus/kappas;
382 }
383 
384 
385 template<class ParcelType>
386 template<class TrackData>
388 (
389  TrackData& td,
390  const scalar dt,
391  const label cellI
392 )
393 {
394  typedef typename TrackData::cloudType::reactingCloudType reactingCloudType;
396  td.cloud().composition();
397 
398 
399  // Define local properties at beginning of time step
400  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
401 
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();
407 
408 
409  // Calc surface values
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);
413 
414 
415  // Sources
416  // ~~~~~~~
417 
418  // Explicit momentum source for particle
420 
421  // Linearised momentum source coefficient
422  scalar Spu = 0.0;
423 
424  // Momentum transfer from the particle to the carrier phase
425  vector dUTrans = vector::zero;
426 
427  // Explicit enthalpy source for particle
428  scalar Sh = 0.0;
429 
430  // Linearised enthalpy source coefficient
431  scalar Sph = 0.0;
432 
433  // Sensible enthalpy transfer from the particle to the carrier phase
434  scalar dhsTrans = 0.0;
435 
436 
437  // 1. Compute models that contribute to mass transfer - U, T held constant
438  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
439 
440  // Phase change
441  // ~~~~~~~~~~~~
442 
443  // Mass transfer due to phase change
444  scalarField dMassPC(Y_.size(), 0.0);
445 
446  // Molar flux of species emitted from the particle (kmol/m^2/s)
447  scalar Ne = 0.0;
448 
449  // Sum Ni*Cpi*Wi of emission species
450  scalar NCpW = 0.0;
451 
452  // Surface concentrations of emitted species
453  scalarField Cs(composition.carrier().species().size(), 0.0);
454 
455  // Calc mass and enthalpy transfer due to phase change
456  calcPhaseChange
457  (
458  td,
459  dt,
460  cellI,
461  Res,
462  Prs,
463  Ts,
464  mus/rhos,
465  d0,
466  T0,
467  mass0,
468  0,
469  1.0,
470  Y_,
471  dMassPC,
472  Sh,
473  Ne,
474  NCpW,
475  Cs
476  );
477 
478 
479  // 2. Update the parcel properties due to change in mass
480  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
481 
482  scalarField dMass(dMassPC);
483  scalar mass1 = updateMassFraction(mass0, dMass, Y_);
484 
485  this->Cp_ = composition.Cp(0, Y_, pc_, T0);
486 
487  // Update particle density or diameter
488  if (td.cloud().constProps().constantVolume())
489  {
490  this->rho_ = mass1/this->volume();
491  }
492  else
493  {
494  this->d_ = cbrt(mass1/this->rho_*6.0/pi);
495  }
496 
497  // Remove the particle when mass falls below minimum threshold
498  if (np0*mass1 < td.cloud().constProps().minParcelMass())
499  {
500  td.keepParticle = false;
501 
502  if (td.cloud().solution().coupled())
503  {
504  scalar dm = np0*mass0;
505 
506  // Absorb parcel into carrier phase
507  forAll(Y_, i)
508  {
509  scalar dmi = dm*Y_[i];
510  label gid = composition.localToCarrierId(0, i);
511  scalar hs = composition.carrier().Hs(gid, pc_, T0);
512 
513  td.cloud().rhoTrans(gid)[cellI] += dmi;
514  td.cloud().hsTrans()[cellI] += dmi*hs;
515  }
516  td.cloud().UTrans()[cellI] += dm*U0;
517 
518  td.cloud().phaseChange().addToPhaseChangeMass(np0*mass1);
519  }
520 
521  return;
522  }
523 
524  // Correct surface values due to emitted species
525  correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Prs, kappas);
526  Res = this->Re(U0, this->d_, rhos, mus);
527 
528 
529  // 3. Compute heat- and momentum transfers
530  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
531 
532  // Heat transfer
533  // ~~~~~~~~~~~~~
534 
535  // Calculate new particle temperature
536  this->T_ =
537  this->calcHeatTransfer
538  (
539  td,
540  dt,
541  cellI,
542  Res,
543  Prs,
544  kappas,
545  NCpW,
546  Sh,
547  dhsTrans,
548  Sph
549  );
550 
551  this->Cp_ = composition.Cp(0, Y_, pc_, T0);
552 
553 
554  // Motion
555  // ~~~~~~
556 
557  // Calculate new particle velocity
558  this->U_ =
559  this->calcVelocity(td, dt, cellI, Res, mus, mass1, Su, dUTrans, Spu);
560 
561 
562  // 4. Accumulate carrier phase source terms
563  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
564 
565  if (td.cloud().solution().coupled())
566  {
567  // Transfer mass lost to carrier mass, momentum and enthalpy sources
568  forAll(dMass, i)
569  {
570  scalar dm = np0*dMass[i];
571  label gid = composition.localToCarrierId(0, i);
572  scalar hs = composition.carrier().Hs(gid, pc_, T0);
573 
574  td.cloud().rhoTrans(gid)[cellI] += dm;
575  td.cloud().UTrans()[cellI] += dm*U0;
576  td.cloud().hsTrans()[cellI] += dm*hs;
577  }
578 
579  // Update momentum transfer
580  td.cloud().UTrans()[cellI] += np0*dUTrans;
581  td.cloud().UCoeff()[cellI] += np0*Spu;
582 
583  // Update sensible enthalpy transfer
584  td.cloud().hsTrans()[cellI] += np0*dhsTrans;
585  td.cloud().hsCoeff()[cellI] += np0*Sph;
586 
587  // Update radiation fields
588  if (td.cloud().radiation())
589  {
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;
595  }
596  }
597 }
598 
599 
600 // * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * * * //
601 
602 #include "ReactingParcelIO.C"
603 
604 // ************************************************************************* //
Foam::constant::thermodynamic::RR
const scalar RR
Universal gas constant (default in [J/(kmol K)])
Definition: thermodynamicConstants.C:44
ReactingParcel.H
Foam::PhaseChangeModel
Templated phase change model class.
Definition: ReactingCloud.H:55
mathematicalConstants.H
Foam::Vector< scalar >::zero
static const Vector zero
Definition: Vector.H:80
p
p
Definition: pEqn.H:62
Sh
scalar Sh
Definition: solveChemistry.H:2
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:406
Foam::SLGThermo
Thermo package for (S)olids (L)iquids and (G)ases Takes reference to thermo package,...
Definition: SLGThermo.H:62
Foam::basicMultiComponentMixture::species
const speciesTable & species() const
Return the table of species.
Definition: basicMultiComponentMixtureI.H:27
Foam::Re
scalarField Re(const UList< complex > &cf)
Definition: complexFields.C:97
thermo
Basic thermodynamics type based on the use of fitting functions for cp, h, s obtained from the templa...
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
Foam::mag
dimensioned< scalar > mag(const dimensioned< Type > &)
PhaseChangeModel.H
ReactingParcelIO.C
specie.H
Foam::CompositionModel
Templated reacting parcel composition model class Consists of carrier species (via thermo package),...
Definition: ReactingCloud.H:52
Foam::PhaseChangeModel::dh
virtual scalar dh(const label idc, const label idl, const scalar p, const scalar T) const
Return the enthalpy per unit mass.
Definition: PhaseChangeModel.C:129
Foam::pow4
dimensionedScalar pow4(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:98
Foam::label
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
Foam::Field
Pre-declare SubField and related Field type.
Definition: Field.H:57
Foam::fvc::Su
tmp< GeometricField< Type, fvPatchField, volMesh > > Su(const GeometricField< Type, fvPatchField, volMesh > &su, const GeometricField< Type, fvPatchField, volMesh > &vf)
Definition: fvcSup.C:44
Foam::nl
static const char nl
Definition: Ostream.H:260
Foam::T
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
Definition: FieldFieldFunctions.C:55
Foam::ReactingParcel::ReactingParcel
ReactingParcel(const polyMesh &mesh, const vector &position, const label cellI, const label tetFaceI, const label tetPtI)
Construct from owner, position, and cloud owner.
Definition: ReactingParcelI.H:64
Pr
dimensionedScalar Pr("Pr", dimless, laminarTransport)
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:18
Foam::ReactingParcel::setCellValues
void setCellValues(TrackData &td, const scalar dt, const label cellI)
Set cell values.
Definition: ReactingParcel.C:204
Foam::max
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
Foam::constant::mathematical
mathematical constants.
Foam::PhaseChangeModel::calculate
virtual void calculate(const scalar dt, const label cellI, 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 =0
Update model.
Foam::Vector< scalar >
Foam::PhaseChangeModel::TMax
virtual scalar TMax(const scalar p, const scalarField &X) const
Return maximum/limiting temperature.
Definition: PhaseChangeModel.C:142
Foam::sqrt
dimensionedScalar sqrt(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:142
CompositionModel.H
composition
basicMultiComponentMixture & composition
Definition: createFields.H:35
Foam::sum
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
Definition: DimensionedFieldFunctions.C:333
Foam::ReactingParcel::cellValueSourceCorrection
void cellValueSourceCorrection(TrackData &td, const scalar dt, const label cellI)
Correct cell values using latest transfer information.
Definition: ReactingParcel.C:235
Foam::constant::mathematical::pi
const scalar pi(M_PI)
Foam::PhaseChangeModel::Tvap
virtual scalar Tvap(const scalarField &X) const
Return vapourisation temperature.
Definition: PhaseChangeModel.C:152
Foam::ReactingParcel::calc
void calc(TrackData &td, const scalar dt, const label cellI)
Update parcel properties over the time interval.
Definition: ReactingParcel.C:388
Foam::List::size
void size(const label)
Override size to be inconsistent with allocated storage.
Foam::cbrt
dimensionedScalar cbrt(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:153
Foam::ReactingParcel::correctSurfaceValues
void correctSurfaceValues(TrackData &td, const label cellI, const scalar T, const scalarField &Cs, scalar &rhos, scalar &mus, scalar &Prs, scalar &kappas)
Correct surface values due to emitted species.
Definition: ReactingParcel.C:296
Foam::ReactingParcel
Reacting parcel class with one/two-way coupling with the continuous phase.
Definition: ReactingParcel.H:50
Foam::ReactingParcel::calcPhaseChange
void calcPhaseChange(TrackData &td, const scalar dt, const label cellI, const scalar Re, const scalar Pr, const scalar Ts, const scalar nus, const scalar d, const scalar T, const scalar mass, const label idPhase, const scalar YPhase, const scalarField &YComponents, scalarField &dMassPC, scalar &Sh, scalar &N, scalar &NCpW, scalarField &Cs)
Calculate Phase change.
Definition: ReactingParcel.C:39
Foam::min
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
WarningInFunction
#define WarningInFunction
Report a warning using Foam::Warning.
Definition: messageStream.H:259
Foam::ReactingParcel::updateMassFraction
scalar updateMassFraction(const scalar mass0, const scalarField &dMass, scalarField &Y) const
Update mass fraction.
Definition: ReactingParcel.C:149
Foam::PhaseChangeModel::addToPhaseChangeMass
void addToPhaseChangeMass(const scalar dMass)
Add to phase change mass.
Definition: PhaseChangeModel.C:159
Y
PtrList< volScalarField > & Y
Definition: createFields.H:36
N
label N
Definition: createFields.H:22