kineticTheoryModel.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-2020 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 "kineticTheoryModel.H"
27 #include "mathematicalConstants.H"
28 #include "phaseSystem.H"
29 #include "fvOptions.H"
30 
31 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
32 
33 const Foam::phaseModel&
34 Foam::RASModels::kineticTheoryModel::continuousPhase() const
35 {
36  const phaseSystem& fluid = phase_.fluid();
37 
38  if (continuousPhaseName_ == word::null)
39  {
40  if (fluid.movingPhases().size() != 2)
41  {
43  << "Continuous phase name must be specified "
44  << "when there are more than two moving phases."
45  << exit(FatalIOError);
46  }
47 
48  forAll(fluid.movingPhases(), movingPhasei)
49  {
50  const phaseModel& otherPhase = fluid.movingPhases()[movingPhasei];
51 
52  if (&otherPhase != &phase_)
53  {
54  return otherPhase;
55  }
56  }
57  }
58 
59  return fluid.phases()[continuousPhaseName_];
60 };
61 
62 
63 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
64 
66 (
67  const volScalarField& alpha,
68  const volScalarField& rho,
69  const volVectorField& U,
70  const surfaceScalarField& alphaRhoPhi,
71  const surfaceScalarField& phi,
72  const transportModel& phase,
73  const word& type
74 )
75 :
77  (
78  type,
79  alpha,
80  rho,
81  U,
82  alphaRhoPhi,
83  phi,
84  phase
85  ),
86 
87  phase_(phase),
88 
89  continuousPhaseName_
90  (
91  coeffDict_.lookupOrDefault("continuousPhase", word::null)
92  ),
93 
94  viscosityModel_
95  (
96  kineticTheoryModels::viscosityModel::New
97  (
99  )
100  ),
101  conductivityModel_
102  (
103  kineticTheoryModels::conductivityModel::New
104  (
105  coeffDict_
106  )
107  ),
108  radialModel_
109  (
110  kineticTheoryModels::radialModel::New
111  (
112  coeffDict_
113  )
114  ),
115  granularPressureModel_
116  (
117  kineticTheoryModels::granularPressureModel::New
118  (
119  coeffDict_
120  )
121  ),
122  frictionalStressModel_
123  (
124  kineticTheoryModels::frictionalStressModel::New
125  (
126  coeffDict_
127  )
128  ),
129 
130  equilibrium_(coeffDict_.lookup("equilibrium")),
131  e_("e", dimless, coeffDict_),
132  alphaMax_("alphaMax", dimless, coeffDict_),
133  alphaMinFriction_
134  (
135  "alphaMinFriction",
136  dimless,
137  coeffDict_
138  ),
139  residualAlpha_
140  (
141  "residualAlpha",
142  dimless,
143  coeffDict_
144  ),
145 
146  maxNut_
147  (
148  "maxNut",
149  dimensionSet(0, 2, -1, 0, 0),
150  coeffDict_.lookupOrDefault<scalar>("maxNut", 1000)
151  ),
152 
153  Theta_
154  (
155  IOobject
156  (
157  IOobject::groupName("Theta", phase.name()),
158  U.time().timeName(),
159  U.mesh(),
162  ),
163  U.mesh()
164  ),
165 
166  lambda_
167  (
168  IOobject
169  (
170  IOobject::groupName("lambda", phase.name()),
171  U.time().timeName(),
172  U.mesh(),
173  IOobject::NO_READ,
175  ),
176  U.mesh(),
177  dimensionedScalar(dimensionSet(0, 2, -1, 0, 0), 0)
178  ),
179 
180  gs0_
181  (
182  IOobject
183  (
184  IOobject::groupName("gs0", phase.name()),
185  U.time().timeName(),
186  U.mesh(),
187  IOobject::NO_READ,
189  ),
190  U.mesh(),
191  dimensionedScalar(dimensionSet(0, 0, 0, 0, 0), 0)
192  ),
193 
194  kappa_
195  (
196  IOobject
197  (
198  IOobject::groupName("kappa", phase.name()),
199  U.time().timeName(),
200  U.mesh(),
201  IOobject::NO_READ,
203  ),
204  U.mesh(),
205  dimensionedScalar(dimensionSet(1, -1, -1, 0, 0), 0)
206  ),
207 
208  nuFric_
209  (
210  IOobject
211  (
212  IOobject::groupName("nuFric", phase.name()),
213  U.time().timeName(),
214  U.mesh(),
215  IOobject::NO_READ,
217  ),
218  U.mesh(),
219  dimensionedScalar(dimensionSet(0, 2, -1, 0, 0), 0)
220  )
221 {
222  if (type == typeName)
223  {
224  printCoeffs(type);
225  }
226 }
227 
228 
229 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
230 
232 {}
233 
234 
235 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
236 
238 {
239  if
240  (
241  eddyViscosity<RASModel<phaseCompressibleMomentumTransportModel>>::read()
242  )
243  {
244  coeffDict().lookup("equilibrium") >> equilibrium_;
245  e_.readIfPresent(coeffDict());
246  alphaMax_.readIfPresent(coeffDict());
247  alphaMinFriction_.readIfPresent(coeffDict());
248 
249  viscosityModel_->read();
250  conductivityModel_->read();
251  radialModel_->read();
252  granularPressureModel_->read();
253  frictionalStressModel_->read();
254 
255  return true;
256  }
257  else
258  {
259  return false;
260  }
261 }
262 
263 
266 {
268  return nut_;
269 }
270 
271 
274 {
276  return nut_;
277 }
278 
279 
282 {
283  return tmp<volSymmTensorField>
284  (
286  (
287  IOobject
288  (
289  IOobject::groupName("R", U_.group()),
290  runTime_.timeName(),
291  mesh_,
294  ),
295  - (nut_)*dev(twoSymm(fvc::grad(U_)))
296  - (lambda_*fvc::div(phi_))*symmTensor::I
297  )
298  );
299 }
300 
301 
304 {
305  const volScalarField& rho = phase_.rho();
306 
307  tmp<volScalarField> tpPrime
308  (
309  Theta_
310  *granularPressureModel_->granularPressureCoeffPrime
311  (
312  alpha_,
313  radialModel_->g0(alpha_, alphaMinFriction_, alphaMax_),
314  radialModel_->g0prime(alpha_, alphaMinFriction_, alphaMax_),
315  rho,
316  e_
317  )
318  + frictionalStressModel_->frictionalPressurePrime
319  (
320  phase_,
321  alphaMinFriction_,
322  alphaMax_
323  )
324  );
325 
326  volScalarField::Boundary& bpPrime =
327  tpPrime.ref().boundaryFieldRef();
328 
329  forAll(bpPrime, patchi)
330  {
331  if (!bpPrime[patchi].coupled())
332  {
333  bpPrime[patchi] == 0;
334  }
335  }
336 
337  return tpPrime;
338 }
339 
340 
343 {
344  return fvc::interpolate(pPrime());
345 }
346 
347 
350 {
351  return tmp<volSymmTensorField>
352  (
354  (
355  IOobject
356  (
357  IOobject::groupName("devTau", U_.group()),
358  runTime_.timeName(),
359  mesh_,
362  ),
363  - (rho_*nut_)
364  *dev(twoSymm(fvc::grad(U_)))
365  - ((rho_*lambda_)*fvc::div(phi_))*symmTensor::I
366  )
367  );
368 }
369 
370 
373 (
374  volVectorField& U
375 ) const
376 {
377  return
378  (
379  - fvm::laplacian(rho_*nut_, U)
380  - fvc::div
381  (
382  (rho_*nut_)*dev2(T(fvc::grad(U)))
383  + ((rho_*lambda_)*fvc::div(phi_))
384  *dimensioned<symmTensor>("I", dimless, symmTensor::I)
385  )
386  );
387 }
388 
389 
391 {
392  // Local references
393  volScalarField alpha(max(alpha_, scalar(0)));
394  const phaseSystem& fluid = phase_.fluid();
395  const phaseModel& continuousPhase = this->continuousPhase();
396  const volScalarField& rho = phase_.rho();
397  const surfaceScalarField& alphaRhoPhi = alphaRhoPhi_;
398  const volVectorField& U = U_;
399  const volVectorField& Uc_ = continuousPhase.U();
400 
401  const scalar sqrtPi = sqrt(constant::mathematical::pi);
402  dimensionedScalar ThetaSmall("ThetaSmall", Theta_.dimensions(), 1e-6);
403  dimensionedScalar ThetaSmallSqrt(sqrt(ThetaSmall));
404 
405  tmp<volScalarField> tda(phase_.d());
406  const volScalarField& da = tda();
407 
408  tmp<volTensorField> tgradU(fvc::grad(U_));
409  const volTensorField& gradU(tgradU());
410  volSymmTensorField D(symm(gradU));
411 
412  // Calculating the radial distribution function
413  gs0_ = radialModel_->g0(alpha, alphaMinFriction_, alphaMax_);
414 
415  if (!equilibrium_)
416  {
417  // Particle viscosity (Table 3.2, p.47)
418  nut_ = viscosityModel_->nu(alpha, Theta_, gs0_, rho, da, e_);
419 
420  volScalarField ThetaSqrt("sqrtTheta", sqrt(Theta_));
421 
422  // Bulk viscosity p. 45 (Lun et al. 1984).
423  lambda_ = (4.0/3.0)*sqr(alpha)*da*gs0_*(1 + e_)*ThetaSqrt/sqrtPi;
424 
425  // Stress tensor, Definitions, Table 3.1, p. 43
427  (
428  rho*(2*nut_*D + (lambda_ - (2.0/3.0)*nut_)*tr(D)*I)
429  );
430 
431  // Dissipation (Eq. 3.24, p.50)
432  volScalarField gammaCoeff
433  (
434  "gammaCoeff",
435  12*(1 - sqr(e_))
436  *max(sqr(alpha), residualAlpha_)
437  *rho*gs0_*(1.0/da)*ThetaSqrt/sqrtPi
438  );
439 
440  // Drag
441  volScalarField beta
442  (
443  fluid.foundSubModel<dragModel>(phase_, continuousPhase)
444  ? fluid.lookupSubModel<dragModel>(phase_, continuousPhase).K()
446  (
447  "beta",
448  phase_.mesh(),
450  )
451  );
452 
453  // Eq. 3.25, p. 50 Js = J1 - J2
454  volScalarField J1("J1", 3*beta);
455  volScalarField J2
456  (
457  "J2",
458  0.25*sqr(beta)*da*magSqr(U - Uc_)
459  /(
460  max(alpha, residualAlpha_)*rho
461  *sqrtPi*(ThetaSqrt + ThetaSmallSqrt)
462  )
463  );
464 
465  // particle pressure - coefficient in front of Theta (Eq. 3.22, p. 45)
466  volScalarField PsCoeff
467  (
468  granularPressureModel_->granularPressureCoeff
469  (
470  alpha,
471  gs0_,
472  rho,
473  e_
474  )
475  );
476 
477  // 'thermal' conductivity (Table 3.3, p. 49)
478  kappa_ = conductivityModel_->kappa(alpha, Theta_, gs0_, rho, da, e_);
479 
480  fv::options& fvOptions(fv::options::New(mesh_));
481 
482  // Construct the granular temperature equation (Eq. 3.20, p. 44)
483  // NB. note that there are two typos in Eq. 3.20:
484  // Ps should be without grad
485  // the laplacian has the wrong sign
486  fvScalarMatrix ThetaEqn
487  (
488  1.5*
489  (
490  fvm::ddt(alpha, rho, Theta_)
491  + fvm::div(alphaRhoPhi, Theta_)
492  - fvc::Sp(fvc::ddt(alpha, rho) + fvc::div(alphaRhoPhi), Theta_)
493  )
494  - fvm::laplacian(kappa_, Theta_, "laplacian(kappa,Theta)")
495  ==
496  - fvm::SuSp((PsCoeff*I) && gradU, Theta_)
497  + (tau && gradU)
498  + fvm::Sp(-gammaCoeff, Theta_)
499  + fvm::Sp(-J1, Theta_)
500  + fvm::Sp(J2/(Theta_ + ThetaSmall), Theta_)
501  + fvOptions(alpha, rho, Theta_)
502  );
503 
504  ThetaEqn.relax();
505  fvOptions.constrain(ThetaEqn);
506  ThetaEqn.solve();
507  fvOptions.correct(Theta_);
508  }
509  else
510  {
511  // Equilibrium => dissipation == production
512  // Eq. 4.14, p.82
513  volScalarField K1("K1", 2*(1 + e_)*rho*gs0_);
515  (
516  "K3",
517  0.5*da*rho*
518  (
519  (sqrtPi/(3*(3.0 - e_)))
520  *(1 + 0.4*(1 + e_)*(3*e_ - 1)*alpha*gs0_)
521  +1.6*alpha*gs0_*(1 + e_)/sqrtPi
522  )
523  );
524 
526  (
527  "K2",
528  4*da*rho*(1 + e_)*alpha*gs0_/(3*sqrtPi) - 2*K3/3.0
529  );
530 
531  volScalarField K4("K4", 12*(1 - sqr(e_))*rho*gs0_/(da*sqrtPi));
532 
533  volScalarField trD
534  (
535  "trD",
536  alpha/(alpha + residualAlpha_)
537  *fvc::div(phi_)
538  );
539  volScalarField tr2D("tr2D", sqr(trD));
540  volScalarField trD2("trD2", tr(D & D));
541 
542  volScalarField t1("t1", K1*alpha + rho);
543  volScalarField l1("l1", -t1*trD);
544  volScalarField l2("l2", sqr(t1)*tr2D);
545  volScalarField l3
546  (
547  "l3",
548  4.0
549  *K4
550  *alpha
551  *(2*K3*trD2 + K2*tr2D)
552  );
553 
554  Theta_ = sqr
555  (
556  (l1 + sqrt(l2 + l3))
557  /(2*max(alpha, residualAlpha_)*K4)
558  );
559 
560  kappa_ = conductivityModel_->kappa(alpha, Theta_, gs0_, rho, da, e_);
561  }
562 
563  Theta_.max(0);
564  Theta_.min(100);
565 
566  {
567  // particle viscosity (Table 3.2, p.47)
568  nut_ = viscosityModel_->nu(alpha, Theta_, gs0_, rho, da, e_);
569 
570  volScalarField ThetaSqrt("sqrtTheta", sqrt(Theta_));
571 
572  // Bulk viscosity p. 45 (Lun et al. 1984).
573  lambda_ = (4.0/3.0)*sqr(alpha)*da*gs0_*(1 + e_)*ThetaSqrt/sqrtPi;
574 
575  // Frictional pressure
576  volScalarField pf
577  (
578  frictionalStressModel_->frictionalPressure
579  (
580  phase_,
581  alphaMinFriction_,
582  alphaMax_
583  )
584  );
585 
586  nuFric_ = frictionalStressModel_->nu
587  (
588  phase_,
589  alphaMinFriction_,
590  alphaMax_,
591  pf/rho,
592  D
593  );
594 
595  // Limit viscosity and add frictional viscosity
596  nut_.min(maxNut_);
597  nuFric_ = min(nuFric_, maxNut_ - nut_);
598  nut_ += nuFric_;
599  }
600 
601  if (debug)
602  {
603  Info<< typeName << ':' << nl
604  << " max(Theta) = " << max(Theta_).value() << nl
605  << " max(nut) = " << max(nut_).value() << endl;
606  }
607 }
608 
609 
610 // ************************************************************************* //
GeometricField< symmTensor, fvPatchField, volMesh > volSymmTensorField
Definition: volFieldsFwd.H:61
virtual tmp< volSymmTensorField > devTau() const
Return the effective stress tensor.
tmp< GeometricField< typename outerProduct< vector, Type >::type, fvPatchField, volMesh >> grad(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
Definition: fvcGrad.C:52
fvMatrix< scalar > fvScalarMatrix
Definition: fvMatricesFwd.H:42
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
virtual tmp< volScalarField > epsilon() const
Return the turbulence kinetic energy dissipation rate.
tmp< fvMatrix< Type > > SuSp(const volScalarField::Internal &, const GeometricField< Type, fvPatchField, volMesh > &)
PhaseCompressibleMomentumTransportModel< phaseModel > phaseCompressibleMomentumTransportModel
Typedef for phaseCompressibleMomentumTransportModel.
fv::options & fvOptions
static autoPtr< RASModel > New(const alphaField &alpha, const rhoField &rho, const volVectorField &U, const surfaceScalarField &alphaRhoPhi, const surfaceScalarField &phi, const transportModel &transport)
Return a reference to the selected RAS model.
Definition: RASModel.C:114
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
#define K1
Definition: SHA1.C:167
virtual tmp< volSymmTensorField > sigma() const
Return the stress tensor [m^2/s^2].
#define K4
Definition: SHA1.C:170
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
#define K2
Definition: SHA1.C:168
virtual tmp< surfaceScalarField > pPrimef() const
Return the face-phase-pressure&#39;.
GeometricField< tensor, fvPatchField, volMesh > volTensorField
Definition: volFieldsFwd.H:62
dimensionedSymmTensor sqr(const dimensionedVector &dv)
tmp< GeometricField< Type, fvPatchField, volMesh > > div(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
Definition: fvcDiv.C:47
static const dictionary null
Null dictionary.
Definition: dictionary.H:241
virtual tmp< fvVectorMatrix > divDevTau(volVectorField &U) const
Return the source term for the momentum equation.
IOobject(const word &name, const fileName &instance, const objectRegistry &registry, readOption r=NO_READ, writeOption w=NO_WRITE, bool registerObject=true)
Construct from name, instance, registry, io options.
Definition: IOobject.C:177
#define K3
Definition: SHA1.C:169
static tmp< GeometricField< scalar, fvPatchField, volMesh > > New(const word &name, const Internal &, const PtrList< fvPatchField< scalar >> &)
Return a temporary field constructed from name,.
dimensionedScalar sqrt(const dimensionedScalar &ds)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
tmp< GeometricField< Type, fvPatchField, volMesh > > Sp(const volScalarField &sp, const GeometricField< Type, fvPatchField, volMesh > &vf)
Definition: fvcSup.C:67
tmp< fvMatrix< Type > > Sp(const volScalarField::Internal &, const GeometricField< Type, fvPatchField, volMesh > &)
GeometricField< vector, fvPatchField, volMesh > volVectorField
Definition: volFieldsFwd.H:58
dimensionedSymmTensor twoSymm(const dimensionedSymmTensor &dt)
tmp< GeometricField< Type, fvPatchField, volMesh > > ddt(const dimensioned< Type > dt, const fvMesh &mesh)
Definition: fvcDdt.C:45
GeometricField< scalar, fvPatchField, volMesh > volScalarField
Definition: volFieldsFwd.H:57
dictionary coeffDict_
Model coefficients dictionary.
Definition: RASModel.H:68
dimensionedSymmTensor dev(const dimensionedSymmTensor &dt)
RASModel< phaseCompressibleMomentumTransportModel > ::transportModel transportModel
Definition: eddyViscosity.H:72
static const SymmTensor I
Definition: SymmTensor.H:72
static word groupName(Name name, const word &group)
tmp< fvMatrix< Type > > ddt(const GeometricField< Type, fvPatchField, volMesh > &vf)
Definition: fvmDdt.C:46
static const word null
An empty word.
Definition: word.H:77
virtual void correct()
Solve the kinetic theory equations and correct the viscosity.
word timeName
Definition: getTimeIndex.H:3
void min(const dimensioned< Type > &)
dimensionedScalar tr(const dimensionedSphericalTensor &dt)
const word & name() const
Name function is needed to disambiguate those inherited.
dimensioned< scalar > magSqr(const dimensioned< Type > &)
virtual ~kineticTheoryModel()
Destructor.
static const char nl
Definition: Ostream.H:260
tmp< fvMatrix< Type > > div(const surfaceScalarField &flux, const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
Definition: fvmDiv.C:46
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
static tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > interpolate(const GeometricField< Type, fvPatchField, volMesh > &tvf, const surfaceScalarField &faceFlux, Istream &schemeData)
Interpolate field onto faces using scheme given by Istream.
Internal & ref()
Return a reference to the dimensioned internal field.
kineticTheoryModel(const volScalarField &alpha, const volScalarField &rho, const volVectorField &U, const surfaceScalarField &alphaRhoPhi, const surfaceScalarField &phi, const phaseModel &transport, const word &type=typeName)
Construct from components.
label patchi
dimensionedSymmTensor dev2(const dimensionedSymmTensor &dt)
const dimensionSet dimless(0, 0, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:47
static const dimensionSet dimK
Coefficient dimensions.
Definition: dragModel.H:93
T lookupOrDefault(const word &, const T &, bool recursive=false, bool patternMatch=true) const
Find and return a T,.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition: error.H:331
dimensionedSymmTensor symm(const dimensionedSymmTensor &dt)
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
tmp< fvMatrix< Type > > laplacian(const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
Definition: fvmLaplacian.C:46
virtual tmp< volScalarField > pPrime() const
Return the phase-pressure&#39;.
const phaseSystem & fluid() const
Return the system to which this phase belongs.
eddyViscosity(const word &modelName, const alphaField &alpha, const rhoField &rho, const volVectorField &U, const surfaceScalarField &alphaRhoPhi, const surfaceScalarField &phi, const transportModel &transport)
Construct from components.
Definition: eddyViscosity.C:34
virtual bool read()
Re-read model coefficients if they have changed.
messageStream Info
virtual tmp< volScalarField > k() const
Return the turbulence kinetic energy.
RASModel(const word &type, const alphaField &alpha, const rhoField &rho, const volVectorField &U, const surfaceScalarField &alphaRhoPhi, const surfaceScalarField &phi, const transportModel &transport)
Construct from components.
Definition: RASModel.C:44
const doubleScalar e
Elementary charge.
Definition: doubleScalar.H:105
volScalarField alpha(IOobject("alpha", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE), lambda *max(Ua &U, zeroSensitivity))
A class for managing temporary objects.
Definition: PtrList.H:53
GeometricField< scalar, fvsPatchField, surfaceMesh > surfaceScalarField
static options & New(const fvMesh &mesh)
Construct fvOptions and register to datbase if not present.
Definition: fvOptions.C:101
#define NotImplemented
Issue a FatalErrorIn for a function not currently implemented.
Definition: error.H:366
Single incompressible phase derived from the phase-fraction. Used as part of the multiPhaseMixture fo...
Definition: phaseModel.H:53
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
Definition: dictionary.C:812
IOerror FatalIOError