ReactingMultiphaseParcel.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2024 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 
27 #include "CompositionModel.H"
28 #include "NoDevolatilisation.H"
29 #include "NoSurfaceReaction.H"
30 #include "mathematicalConstants.H"
31 
32 using namespace Foam::constant::mathematical;
33 
34 
35 // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
36 
37 template<class ParcelType>
38 template<class TrackCloudType>
40 (
41  TrackCloudType& cloud,
42  trackingData& td,
43  const scalar p,
44  const scalar T,
45  const label idG,
46  const label idL,
47  const label idS
48 ) const
49 {
50  return
51  this->Y_[idG]*cloud.composition().Cp(idG, YGas_, p, T)
52  + this->Y_[idL]*cloud.composition().Cp(idL, YLiquid_, p, T)
53  + this->Y_[idS]*cloud.composition().Cp(idS, YSolid_, p, T);
54 }
55 
56 
57 template<class ParcelType>
58 template<class TrackCloudType>
60 (
61  TrackCloudType& cloud,
62  trackingData& td,
63  const scalar p,
64  const scalar T,
65  const label idG,
66  const label idL,
67  const label idS
68 ) const
69 {
70  return
71  this->Y_[idG]*cloud.composition().hs(idG, YGas_, p, T)
72  + this->Y_[idL]*cloud.composition().hs(idL, YLiquid_, p, T)
73  + this->Y_[idS]*cloud.composition().hs(idS, YSolid_, p, T);
74 }
75 
76 
77 template<class ParcelType>
78 template<class TrackCloudType>
80 (
81  TrackCloudType& cloud,
82  trackingData& td,
83  const scalar p,
84  const scalar T,
85  const label idG,
86  const label idL,
87  const label idS
88 ) const
89 {
90  return
91  this->Y_[idG]*cloud.composition().L(idG, YGas_, p, T)
92  + this->Y_[idL]*cloud.composition().L(idL, YLiquid_, p, T)
93  + this->Y_[idS]*cloud.composition().L(idS, YSolid_, p, T);
94 }
95 
96 
97 template<class ParcelType>
99 (
100  const scalar mass0,
101  const scalarField& dMassGas,
102  const scalarField& dMassLiquid,
103  const scalarField& dMassSolid,
104  const label idG,
105  const label idL,
106  const label idS
107 )
108 {
109  scalarField& YMix = this->Y_;
110 
111  scalar massGas =
112  this->updateMassFraction(mass0*YMix[idG], dMassGas, YGas_);
113  scalar massLiquid =
114  this->updateMassFraction(mass0*YMix[idL], dMassLiquid, YLiquid_);
115  scalar massSolid =
116  this->updateMassFraction(mass0*YMix[idS], dMassSolid, YSolid_);
117 
118  scalar massNew = max(massGas + massLiquid + massSolid, rootVSmall);
119 
120  YMix[idG] = massGas/massNew;
121  YMix[idL] = massLiquid/massNew;
122  YMix[idS] = 1.0 - YMix[idG] - YMix[idL];
123 
124  return massNew;
125 }
126 
127 
128 // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
129 
130 template<class ParcelType>
131 template<class TrackCloudType>
133 (
134  TrackCloudType& cloud,
135  trackingData& td
136 )
137 {
138  ParcelType::setCellValues(cloud, td);
139 }
140 
141 
142 template<class ParcelType>
143 template<class TrackCloudType>
145 (
146  TrackCloudType& cloud,
147  trackingData& td,
148  const scalar dt
149 )
150 {
151  // Reuse correction from reacting parcel
152  ParcelType::cellValueSourceCorrection(cloud, td, dt);
153 }
154 
155 
156 template<class ParcelType>
157 template<class TrackCloudType>
159 (
160  TrackCloudType& cloud,
161  trackingData& td,
162  const scalar dt
163 )
164 {
165  typedef typename TrackCloudType::thermoCloudType thermoCloudType;
166  const CompositionModel<thermoCloudType>& composition =
167  cloud.composition();
168 
169 
170  // Define local properties at beginning of timestep
171  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
172 
173  const scalar np0 = this->nParticle_;
174  const scalar d0 = this->d_;
175  const vector& U0 = this->U_;
176  const scalar T0 = this->T_;
177  const scalar mass0 = this->mass();
178 
179  const scalar pc = td.pc();
180 
181  const scalarField& YMix = this->Y_;
182  const label idG = composition.idGas();
183  const label idL = composition.idLiquid();
184  const label idS = composition.idSolid();
185 
186 
187  // Calc surface values
188  scalar Ts, rhos, mus, Prs, kappas;
189  this->calcSurfaceValues(cloud, td, T0, Ts, rhos, mus, Prs, kappas);
190  scalar Res = this->Re(rhos, U0, td.Uc(), d0, mus);
191 
192 
193  // Sources
194  //~~~~~~~~
195 
196  // Explicit momentum source for particle
197  vector Su = Zero;
198 
199  // Linearised momentum source coefficient
200  scalar Spu = 0.0;
201 
202  // Momentum transfer from the particle to the carrier phase
203  vector dUTrans = Zero;
204 
205  // Explicit enthalpy source for particle
206  scalar Sh = 0.0;
207 
208  // Linearised enthalpy source coefficient
209  scalar Sph = 0.0;
210 
211  // Sensible enthalpy transfer from the particle to the carrier phase
212  scalar dhsTrans = 0.0;
213 
214 
215  // 1. Compute models that contribute to mass transfer - U, T held constant
216  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
217 
218  // Phase change in liquid phase
219  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
220 
221  // Mass transfer due to phase change
222  scalarField dMassPC(YLiquid_.size(), 0.0);
223 
224  // Molar flux of species emitted from the particle (kmol/m^2/s)
225  scalar Ne = 0.0;
226 
227  // Sum Ni*Cpi*Wi of emission species
228  scalar NCpW = 0.0;
229 
230  // Surface concentrations of emitted species
231  scalarField Cs(composition.carrier().species().size(), 0.0);
232 
233  // Calc mass and enthalpy transfer due to phase change
234  this->calcPhaseChange
235  (
236  cloud,
237  td,
238  dt,
239  Res,
240  Prs,
241  Ts,
242  mus/rhos,
243  d0,
244  T0,
245  mass0,
246  idL,
247  YMix[idL],
248  YLiquid_,
249  dMassPC,
250  Sh,
251  Ne,
252  NCpW,
253  Cs
254  );
255 
256 
257  // Devolatilisation
258  // ~~~~~~~~~~~~~~~~
259 
260  // Mass transfer due to devolatilisation
261  scalarField dMassDV(YGas_.size(), 0.0);
262 
263  // Calc mass and enthalpy transfer due to devolatilisation
264  calcDevolatilisation
265  (
266  cloud,
267  td,
268  dt,
269  Ts,
270  d0,
271  T0,
272  mass0,
273  mass0_,
274  YMix[idG]*YGas_,
275  YMix[idL]*YLiquid_,
276  YMix[idS]*YSolid_,
277  canCombust_,
278  dMassDV,
279  Sh,
280  Ne,
281  NCpW,
282  Cs
283  );
284 
285 
286  // Surface reactions
287  // ~~~~~~~~~~~~~~~~~
288 
289  // Change in carrier phase composition due to surface reactions
290  scalarField dMassSRGas(YGas_.size(), 0.0);
291  scalarField dMassSRLiquid(YLiquid_.size(), 0.0);
292  scalarField dMassSRSolid(YSolid_.size(), 0.0);
293  scalarField dMassSRCarrier(composition.carrier().species().size(), 0.0);
294 
295  // Calc mass and enthalpy transfer due to surface reactions
296  calcSurfaceReactions
297  (
298  cloud,
299  td,
300  dt,
301  d0,
302  T0,
303  mass0,
304  canCombust_,
305  Ne,
306  YMix,
307  YGas_,
308  YLiquid_,
309  YSolid_,
310  dMassSRGas,
311  dMassSRLiquid,
312  dMassSRSolid,
313  dMassSRCarrier,
314  Sh,
315  dhsTrans
316  );
317 
318 
319  // 2. Update the parcel properties due to change in mass
320  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
321 
322  scalarField dMassGas(dMassDV + dMassSRGas);
323  scalarField dMassLiquid(dMassPC + dMassSRLiquid);
324  scalarField dMassSolid(dMassSRSolid);
325  scalar mass1 =
326  updateMassFractions
327  (
328  mass0,
329  dMassGas,
330  dMassLiquid,
331  dMassSolid,
332  idG,
333  idL,
334  idS
335  );
336 
337  this->Cp_ = CpEff(cloud, td, pc, T0, idG, idL, idS);
338 
339  // Update particle density or diameter
340  if (cloud.constProps().constantVolume())
341  {
342  this->rho_ = mass1/this->volume();
343  }
344  else
345  {
346  this->d_ = cbrt(mass1/this->rho_*6.0/pi);
347  }
348 
349  // Remove the particle when mass falls below minimum threshold
350  if (np0*mass1 < cloud.constProps().minParcelMass())
351  {
352  td.keepParticle = false;
353 
354  if (cloud.solution().coupled())
355  {
356  scalar dm = np0*mass0;
357 
358  // Absorb parcel into carrier phase
359  forAll(YGas_, i)
360  {
361  label gid = composition.localToCarrierId(idG, i);
362  cloud.rhoTrans(gid)[this->cell()] += dm*YMix[idG]*YGas_[i];
363  }
364  forAll(YLiquid_, i)
365  {
366  label gid = composition.localToCarrierId(idL, i);
367  cloud.rhoTrans(gid)[this->cell()] += dm*YMix[idL]*YLiquid_[i];
368  }
369 
370  // No mapping between solid components and carrier phase
371  /*
372  forAll(YSolid_, i)
373  {
374  label gid = composition.localToCarrierId(idS, i);
375  cloud.rhoTrans(gid)[this->cell()] += dm*YMix[idS]*YSolid_[i];
376  }
377  */
378 
379  cloud.UTransRef()[this->cell()] += dm*U0;
380 
381  cloud.hsTransRef()[this->cell()] +=
382  dm*hsEff(cloud, td, pc, T0, idG, idL, idS);
383 
384  cloud.phaseChange().addToPhaseChangeMass(np0*mass1);
385  }
386 
387  return;
388  }
389 
390  // Correct surface values due to emitted species
391  this->correctSurfaceValues(cloud, td, Ts, Cs, rhos, mus, Prs, kappas);
392  Res = this->Re(rhos, U0, td.Uc(), this->d_, mus);
393 
394 
395  // 3. Compute heat- and momentum transfers
396  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
397 
398  // Heat transfer
399  // ~~~~~~~~~~~~~
400 
401  // Calculate new particle temperature
402  this->T_ =
403  this->calcHeatTransfer
404  (
405  cloud,
406  td,
407  dt,
408  Res,
409  Prs,
410  kappas,
411  NCpW,
412  Sh,
413  dhsTrans,
414  Sph
415  );
416 
417 
418  this->Cp_ = CpEff(cloud, td, pc, this->T_, idG, idL, idS);
419 
420 
421  // Motion
422  // ~~~~~~
423 
424  // Calculate new particle velocity
425  this->U_ =
426  this->calcVelocity(cloud, td, dt, Res, mus, mass1, Su, dUTrans, Spu);
427 
428 
429  // 4. Accumulate carrier phase source terms
430  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
431 
432  if (cloud.solution().coupled())
433  {
434  // Transfer mass lost to carrier mass, momentum and enthalpy sources
435  forAll(YGas_, i)
436  {
437  scalar dm = np0*dMassGas[i];
438  label gid = composition.localToCarrierId(idG, i);
439  scalar hs = composition.carrier().hsi(gid, pc, T0);
440  cloud.rhoTrans(gid)[this->cell()] += dm;
441  cloud.UTransRef()[this->cell()] += dm*U0;
442  cloud.hsTransRef()[this->cell()] += dm*hs;
443  }
444  forAll(YLiquid_, i)
445  {
446  scalar dm = np0*dMassLiquid[i];
447  label gid = composition.localToCarrierId(idL, i);
448  scalar hs = composition.carrier().hsi(gid, pc, T0);
449  cloud.rhoTrans(gid)[this->cell()] += dm;
450  cloud.UTransRef()[this->cell()] += dm*U0;
451  cloud.hsTransRef()[this->cell()] += dm*hs;
452  }
453 
454  // No mapping between solid components and carrier phase
455  /*
456  forAll(YSolid_, i)
457  {
458  scalar dm = np0*dMassSolid[i];
459  label gid = composition.localToCarrierId(idS, i);
460  scalar hs = composition.carrier().hsi(gid, pc, T0);
461  cloud.rhoTrans(gid)[this->cell()] += dm;
462  cloud.UTransRef()[this->cell()] += dm*U0;
463  cloud.hsTransRef()[this->cell()] += dm*hs;
464  }
465  */
466 
467  forAll(dMassSRCarrier, i)
468  {
469  scalar dm = np0*dMassSRCarrier[i];
470  scalar hs = composition.carrier().hsi(i, pc, T0);
471  cloud.rhoTrans(i)[this->cell()] += dm;
472  cloud.UTransRef()[this->cell()] += dm*U0;
473  cloud.hsTransRef()[this->cell()] += dm*hs;
474  }
475 
476  // Update momentum transfer
477  cloud.UTransRef()[this->cell()] += np0*dUTrans;
478  cloud.UCoeffRef()[this->cell()] += np0*Spu;
479 
480  // Update sensible enthalpy transfer
481  cloud.hsTransRef()[this->cell()] += np0*dhsTrans;
482  cloud.hsCoeffRef()[this->cell()] += np0*Sph;
483 
484  // Update radiation fields
485  if (cloud.radiation())
486  {
487  const scalar ap = this->areaP();
488  const scalar T4 = pow4(T0);
489  cloud.radAreaP()[this->cell()] += dt*np0*ap;
490  cloud.radT4()[this->cell()] += dt*np0*T4;
491  cloud.radAreaPT4()[this->cell()] += dt*np0*ap*T4;
492  }
493  }
494 }
495 
496 
497 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
498 
499 template<class ParcelType>
500 template<class TrackCloudType>
502 (
503  TrackCloudType& cloud,
504  trackingData& td,
505  const scalar dt,
506  const scalar Ts,
507  const scalar d,
508  const scalar T,
509  const scalar mass,
510  const scalar mass0,
511  const scalarField& YGasEff,
512  const scalarField& YLiquidEff,
513  const scalarField& YSolidEff,
514  label& canCombust,
515  scalarField& dMassDV,
516  scalar& Sh,
517  scalar& N,
518  scalar& NCpW,
519  scalarField& Cs
520 ) const
521 {
522  // Check that model is active
523  if
524  (
525  isType
526  <
528  <
529  typename TrackCloudType::reactingMultiphaseCloudType
530  >
531  >
532  (
533  cloud.devolatilisation()
534  )
535  )
536  {
537  if (canCombust != -1)
538  {
539  canCombust = 1;
540  }
541  return;
542  }
543 
544  // Initialise demand-driven constants
545  (void)cloud.constProps().TDevol();
546  (void)cloud.constProps().LDevol();
547 
548  // Check that the parcel temperature is within necessary limits for
549  // devolatilisation to occur
550  if (T < cloud.constProps().TDevol() || canCombust == -1)
551  {
552  return;
553  }
554 
555  typedef typename TrackCloudType::thermoCloudType thermoCloudType;
556  const CompositionModel<thermoCloudType>& composition =
557  cloud.composition();
558 
559  const label idG = composition.idGas();
560 
561  const typename TrackCloudType::parcelType& p =
562  static_cast<const typename TrackCloudType::parcelType&>(*this);
563  typename TrackCloudType::parcelType::trackingData& ttd =
564  static_cast<typename TrackCloudType::parcelType::trackingData&>(td);
565 
566  // Total mass of volatiles evolved
567  cloud.devolatilisation().calculate
568  (
569  p,
570  ttd,
571  dt,
572  mass0,
573  mass,
574  T,
575  YGasEff,
576  YLiquidEff,
577  YSolidEff,
578  canCombust,
579  dMassDV
580  );
581 
582  scalar dMassTot = sum(dMassDV);
583 
584  cloud.devolatilisation().addToDevolatilisationMass
585  (
586  this->nParticle_*dMassTot
587  );
588 
589  Sh -= dMassTot*cloud.constProps().LDevol()/dt;
590 
591  // Update molar emissions
592  if (cloud.heatTransfer().BirdCorrection())
593  {
594  // Molar average molecular weight of carrier mix
595  const scalar Wc = max(small, td.rhoc()*RR*td.Tc()/td.pc());
596 
597  // Note: hardcoded gaseous diffusivities for now
598  // TODO: add to carrier thermo
599  const scalar beta = sqr(cbrt(15.0) + cbrt(15.0));
600 
601  forAll(dMassDV, i)
602  {
603  const label id = composition.localToCarrierId(idG, i);
604  const scalar Cp = composition.carrier().Cpi(id, td.pc(), Ts);
605  const scalar W = composition.carrier().WiValue(id);
606  const scalar Ni = dMassDV[i]/(this->areaS(d)*dt*W);
607 
608  // Dab calc'd using API vapour mass diffusivity function
609  const scalar Dab =
610  3.6059e-3*(pow(1.8*Ts, 1.75))
611  *sqrt(1.0/W + 1.0/Wc)
612  /(td.pc()*beta);
613 
614  N += Ni;
615  NCpW += Ni*Cp*W;
616  Cs[id] += Ni*d/(2.0*Dab);
617  }
618  }
619 }
620 
621 
622 template<class ParcelType>
623 template<class TrackCloudType>
625 (
626  TrackCloudType& cloud,
627  trackingData& td,
628  const scalar dt,
629  const scalar d,
630  const scalar T,
631  const scalar mass,
632  const label canCombust,
633  const scalar N,
634  const scalarField& YMix,
635  const scalarField& YGas,
636  const scalarField& YLiquid,
637  const scalarField& YSolid,
638  scalarField& dMassSRGas,
639  scalarField& dMassSRLiquid,
640  scalarField& dMassSRSolid,
641  scalarField& dMassSRCarrier,
642  scalar& Sh,
643  scalar& dhsTrans
644 ) const
645 {
646  // Check that model is active
647  if
648  (
649  isType
650  <
652  <
653  typename TrackCloudType::reactingMultiphaseCloudType
654  >
655  >
656  (
657  cloud.surfaceReaction()
658  )
659  )
660  {
661  return;
662  }
663 
664  // Initialise demand-driven constants
665  (void)cloud.constProps().hRetentionCoeff();
666  (void)cloud.constProps().TMax();
667 
668  // Check that model is active
669  if (canCombust != 1)
670  {
671  return;
672  }
673 
674 
675  // Update surface reactions
676  const scalar hReaction = cloud.surfaceReaction().calculate
677  (
678  dt,
679  this->cell(),
680  d,
681  T,
682  td.Tc(),
683  td.pc(),
684  td.rhoc(),
685  mass,
686  YGas,
687  YLiquid,
688  YSolid,
689  YMix,
690  N,
691  dMassSRGas,
692  dMassSRLiquid,
693  dMassSRSolid,
694  dMassSRCarrier
695  );
696 
697  cloud.surfaceReaction().addToSurfaceReactionMass
698  (
699  this->nParticle_
700  *(sum(dMassSRGas) + sum(dMassSRLiquid) + sum(dMassSRSolid))
701  );
702 
703  const scalar xsi = min(T/cloud.constProps().TMax(), 1.0);
704  const scalar coeff =
705  (1.0 - xsi*xsi)*cloud.constProps().hRetentionCoeff();
706 
707  Sh += coeff*hReaction/dt;
708 
709  dhsTrans += (1.0 - coeff)*hReaction;
710 }
711 
712 
713 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
714 
715 template<class ParcelType>
717 (
719 )
720 :
721  ParcelType(p),
722  mass0_(p.mass0_),
723  YGas_(p.YGas_),
724  YLiquid_(p.YLiquid_),
725  YSolid_(p.YSolid_),
726  canCombust_(p.canCombust_)
727 {}
728 
729 
730 // * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * * * //
731 
733 
734 // ************************************************************************* //
scalar hs(const scalar p, const scalar T) const
Definition: EtoHthermo.H:11
scalar Cp(const scalar p, const scalar T) const
Definition: EtoHthermo.H:2
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:433
Templated reacting parcel composition model class Consists of carrier species (via thermo package),...
virtual label idLiquid() const =0
Liquid id.
const fluidMulticomponentThermo & carrier() const
Return the carrier components (wrapper function)
label localToCarrierId(const label phaseI, const label id, const bool allowNotFound=false) const
Return carrier id of component given local id.
virtual label idSolid() const =0
Solid id.
virtual label idGas() const =0
Gas id.
void size(const label)
Override size to be inconsistent with allocated storage.
Definition: ListI.H:164
Dummy devolatilisation model for 'none'.
Dummy surface reaction model for 'none'.
Multiphase variant of the reacting parcel class with one/two-way coupling with the continuous phase.
void calcSurfaceReactions(TrackCloudType &cloud, trackingData &td, const scalar dt, const scalar d, const scalar T, const scalar mass, const label canCombust, const scalar N, const scalarField &YMix, const scalarField &YGas, const scalarField &YLiquid, const scalarField &YSolid, scalarField &dMassSRGas, scalarField &dMassSRLiquid, scalarField &dMassSRSolid, scalarField &dMassSRCarrier, scalar &Sh, scalar &dhsTrans) const
Calculate surface reactions.
void cellValueSourceCorrection(TrackCloudType &cloud, trackingData &td, const scalar dt)
Correct cell values using latest transfer information.
void calcDevolatilisation(TrackCloudType &cloud, trackingData &td, const scalar dt, const scalar Ts, const scalar d, const scalar T, const scalar mass, const scalar mass0, const scalarField &YGasEff, const scalarField &YLiquidEff, const scalarField &YSolidEff, label &canCombust, scalarField &dMassDV, scalar &Sh, scalar &N, scalar &NCpW, scalarField &Cs) const
Calculate Devolatilisation.
ParcelType::trackingData trackingData
Use base tracking data.
ReactingMultiphaseParcel(const polyMesh &mesh, const barycentric &coordinates, const label celli, const label tetFacei, const label tetPti, const label facei)
Construct from mesh, coordinates and topology.
void setCellValues(TrackCloudType &cloud, trackingData &td)
Set cell values.
void calc(TrackCloudType &cloud, trackingData &td, const scalar dt)
Update parcel properties over the time interval.
A cell is defined as a list of faces with extra functionality.
Definition: cell.H:60
Base class for clouds. Provides a basic evolution algorithm, models, and a database for caching deriv...
Definition: cloud.H:63
virtual void calculate(const LagrangianSubScalarField &deltaT, const bool final)
Update the cloud properties.
Definition: cloud.C:493
virtual scalar Cpi(const label speciei, const scalar p, const scalar T) const =0
Heat capacity at constant pressure [J/kg/K].
virtual const speciesTable & species() const =0
The table of species.
virtual scalar WiValue(const label speciei) const =0
Molecular weight [kg/kmol].
virtual scalar hsi(const label speciei, const scalar p, const scalar T) const =0
Sensible enthalpy [J/kg].
mathematical constants.
const dimensionedScalar RR
Universal gas constant: default SI units: [J/kmol/K].
tmp< VolField< Type > > Su(const VolField< Type > &su, const VolField< Type > &vf)
Definition: fvcSup.C:44
static const zero Zero
Definition: zero.H:97
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
void T(LagrangianPatchField< Type > &f, const LagrangianPatchField< Type > &f1)
bool isType(const Type &t)
Check the typeid.
Definition: typeInfo.H:163
void pow4(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
void pow(LagrangianPatchField< typename powProduct< Type, r >::type > &f, const LagrangianPatchField< Type > &f1)
scalarList W(const fluidMulticomponentThermo &thermo)
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
void cbrt(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
void sqr(LagrangianPatchField< typename outerProduct< Type, Type >::type > &f, const LagrangianPatchField< Type > &f1)
void sqrt(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
scalarField Re(const UList< complex > &cf)
Definition: complexFields.C:97
volScalarField & p
scalar T0
Definition: createFields.H:22