populationBalanceModel.H
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) 2017-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 Class
25  Foam::diameterModels::populationBalanceModel
26 
27 Description
28  Model for tracking the evolution of a dispersed phase size distribution due
29  to coalescence (synonymous with coagulation, aggregation, agglomeration)
30  and breakup events as well as density or phase changes. Provides an
31  approximate solution of the population balance equation by means of a class
32  method. The underlying theory is described in the article of Lehnigk et al.
33  (2021).
34 
35  The size distribution, expressed through a volume-based number density
36  function, is discretised using the fixot pivot technique of Kumar and
37  Ramkrishna (1996). Thereby, the population balance equation is transformed
38  into a series of transport equations for the particle (bubble, droplet)
39  number concentrations in separate size classes that are coupled through
40  their source terms. The discretisation is based on representative particle
41  volumes, which are provided by the user through the corresponding sphere
42  equivalent diameters.
43 
44  Since the representative volumes are fixed a priori and the total dispersed
45  phase volume already available from solving the phase continuity equation,
46  the model only determines the evolution of the individual size class
47  fractions
48 
49  \f[
50  f_{i,\varphi} = \frac{\alpha_{i,\varphi}}{\alpha_{\varphi}}\,,
51  \f]
52 
53  where \f$\alpha_{i,\varphi}\f$ is the volume fraction of the size class and
54  \f$\alpha_{\varphi}\f$ the total phase fraction of phase \f$\varphi\f$.
55 
56  The source terms are formulated such that the first and second moment of
57  the distribution, i.e. the total particle number and volume, are conserved
58  irrespective of the discretisation of the size domain. The treatment of
59  particle breakup depends on the selected breakup submodels. For models
60  which provide a total breakup frequency and a separate daughter size
61  distribution function, the formulation provided Kumar and Ramkrishna (1996)
62  is utilised, which is applicable both for binary and multiple breakup
63  events. Currently, only field-independent daughter size distribution models
64  are allowed. In case of binary breakup models that provide the breakup
65  frequency between a size class pair directly, the formulation of Liao et
66  al. (2018) is adopted, which is computationally more efficient compared to
67  first extracting the field-dependent daughter size distribution and then
68  consuming it in the formulation of Kumar and Ramkrishna. The source terms
69  describing a drift of the size distribution through particle growth or
70  shrinkage are derived using upwind differencing, thus ensuring conservation
71  of the total particle number and volume. Note that due to the volume-based
72  implementation, both density as well as phase change lead to a drift of the
73  size distribution function. Further, users can specify multiple submodels
74  for each mechanism, whose contributions are added up.
75 
76  The model also allows to distribute the size classes over multiple
77  representative phases with identical physical properties that collectively
78  define the dispersed phase. Thereby, size class fields can be transported
79  with different velocity fields in order to account for the size dependency
80  of the particle motion. A possible mass transfer between representative
81  phases by means of coalescence, breakup and drift is taken into account.
82  Similarly, the spatial evolution of secondary particle properties such as
83  the particle surface area can be tracked.
84 
85  The key variable during a simulation is the Sauter diameter, which is
86  computed from the size class fractions of the corresponding phase. The
87  underlying size distribution can be extracted from the simulation using the
88  functionObject 'sizeDistribution'. Integral and mean properties of a size
89  distribution can be computed with the functionObject 'moments'.
90 
91  Verification cases for the population balance modelling functionality are
92  provided in test/multiphaseEuler/populationBalance.
93 
94  References:
95  \verbatim
96  Lehnigk, R., Bainbridge, W., Liao, Y., Lucas, D., Niemi, T.,
97  Peltola, J., & Schlegel, F. (2021).
98  An openā€source population balance modeling framework for the simulation
99  of polydisperse multiphase flows.
100  AIChE Journal, 68(3), e17539.
101  \endverbatim
102 
103  \verbatim
104  Coalescence and breakup term formulation:
105  Kumar, S., & Ramkrishna, D. (1996).
106  On the solution of population balance equations by discretization-I. A
107  fixed pivot technique.
108  Chemical Engineering Science, 51(8), 1311-1332.
109  \endverbatim
110 
111  \verbatim
112  Binary breakup term formulation:
113  Liao, Y., Oertel, R., Kriebitzsch, S., Schlegel, F., & Lucas, D. (2018).
114  A discrete population balance equation for binary breakage.
115  International Journal for Numerical Methods in Fluids, 87(4), 202-215.
116  \endverbatim
117 
118 Usage
119  Excerpt from an exemplary phaseProperties dictionary:
120  \verbatim
121  type populationBalanceMultiphaseSystem;
122 
123  ...
124 
125  populationBalances (bubbles);
126 
127  air
128  {
129  type pureIsothermalPhaseModel;
130 
131  diameterModel velocityGroup;
132 
133  velocityGroupCoeffs
134  {
135  populationBalance bubbles;
136 
137  shapeModel spherical;
138 
139  sizeGroups
140  (
141  f1 { dSph 1e-3; }
142  f2 { dSph 2e-3; }
143  f3 { dSph 3e-3; }
144  f4 { dSph 4e-3; }
145  f5 { dSph 5e-3; }
146  ...
147  );
148  }
149 
150  residualAlpha 1e-6;
151  }
152 
153  ...
154 
155  populationBalanceCoeffs
156  {
157  bubbles
158  {
159  continuousPhase water;
160 
161  coalescenceModels
162  (
163  LehrMilliesMewes{}
164  );
165 
166  binaryBreakupModels
167  (
168  LehrMilliesMewes{}
169  );
170 
171  breakupModels
172  ();
173 
174  driftModels
175  (
176  densityChange{}
177  );
178 
179  nucleationModels
180  ();
181  }
182  }
183  \endverbatim
184 
185 See also
186  Foam::PopulationBalancePhaseSystem
187  Foam::diameterModels::sizeGroup
188  Foam::diameterModels::velocityGroup
189  Foam::diameterModels::SecondaryPropertyModel
190  Foam::diameterModels::coalescenceModel
191  Foam::diameterModels::breakupModel
192  Foam::diameterModels::daughterSizeDistributionModel
193  Foam::diameterModels::binaryBreakupModel
194  Foam::diameterModels::driftModel
195  Foam::diameterModels::nucleationModel
196  Foam::functionObjects::sizeDistribution
197  Foam::functionObjects::moments
198 
199 SourceFiles
200  populationBalanceModel.C
201 
202 \*---------------------------------------------------------------------------*/
203 
204 #ifndef populationBalanceModel_H
205 #define populationBalanceModel_H
206 
207 #include "sizeGroup.H"
208 #include "phaseSystem.H"
209 #include "HashPtrTable.H"
210 #include "Pair.H"
211 
212 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
213 
214 namespace Foam
215 {
216 
217 class phaseCompressibleMomentumTransportModel;
218 
219 namespace diameterModels
220 {
221 
222 class coalescenceModel;
223 class breakupModel;
224 class binaryBreakupModel;
225 class driftModel;
226 class nucleationModel;
227 
228 /*---------------------------------------------------------------------------*\
229  Class populationBalanceModel Declaration
230 \*---------------------------------------------------------------------------*/
231 
233 :
234  public regIOobject
235 {
236 public:
237 
238  // Public Classes
239 
240  //- Class to accumulate population balance sub-class pointers
241  class groups
242  :
243  public regIOobject
244  {
245  // Private Data
246 
247  //- Velocity group pointers
248  HashTable<const velocityGroup*> velocityGroupPtrs_;
249 
250  //- Size group pointers
251  UPtrList<sizeGroup> sizeGroups_;
252 
253 
254  // Private Constructor
255 
256  //- Construct with a name on a database
257  groups(const word& popBalName, const objectRegistry& db)
258  :
260  (
261  IOobject
262  (
263  name(popBalName),
264  db.time().constant(),
265  db
266  )
267  )
268  {}
269 
270 
271  // Private Member Functions
272 
273  //- Return the name of the pointer cache
274  static word name(const word& popBalName)
275  {
276  return popBalName + ":groups";
277  }
278 
279 
280  public:
281 
282  // Constructors
283 
284  //- Lookup in the registry or construct new
285  static groups& New
286  (
287  const word& popBalName,
288  const objectRegistry& db
289  )
290  {
291  if (db.foundObject<groups>(name(popBalName)))
292  {
293  return db.lookupObjectRef<groups>(name(popBalName));
294  }
295 
296  groups* ps = new groups(popBalName, db);
297 
298  ps->store();
299 
300  return *ps;
301  }
302 
303 
304  // Member Functions
305 
306  //- Return the current number of size groups
308  {
309  return sizeGroups_.size();
310  }
311 
312  //- Insert a velocity group into the table
313  void insert(velocityGroup& group)
314  {
315  velocityGroupPtrs_.insert(group.phase().name(), &group);
316 
317  const label i0 = nSizeGroups();
318 
319  sizeGroups_.resize(i0 + group.sizeGroups().size());
320 
321  forAll(group.sizeGroups(), i)
322  {
323  sizeGroups_.set(i0 + i, &group.sizeGroups()[i]);
324 
325  if
326  (
327  i0 + i != 0
328  && sizeGroups_[i0 + i - 1].x().value()
329  >= sizeGroups_[i0 + i].x().value()
330  )
331  {
333  << "Size groups must be specified in order of "
334  << "their representative size"
335  << exit(FatalError);
336  }
337  }
338  }
339 
340  //- Retrieve the pointers
341  static void retrieve
342  (
343  const populationBalanceModel& popBal,
344  HashTable<const velocityGroup*>& velGroupPtrs,
345  UPtrList<sizeGroup>& szGroupPtrs
346  )
347  {
348  const objectRegistry& db = popBal.fluid().mesh();
349 
350  if (!db.foundObject<groups>(name(popBal.name())))
351  {
353  << "No velocity groups exist for population "
354  << "balance \"" << popBal.name() << "\""
355  << exit(FatalError);
356  }
357 
358  groups& ps =
359  db.lookupObjectRef<groups>(name(popBal.name()));
360 
361  velGroupPtrs.transfer(ps.velocityGroupPtrs_);
362  szGroupPtrs.transfer(ps.sizeGroups_);
363 
364  ps.checkOut();
365  }
366 
367  //- Dummy write for regIOobject
368  virtual bool writeData(Ostream&) const
369  {
370  return true;
371  }
372  };
373 
374 
375 private:
376 
377  // Private Data
378 
379  //- Reference to the phaseSystem
380  const phaseSystem& fluid_;
381 
382  //- Interfacial mass transfer rates
383  phaseSystem::dmdtfTable dmdtfs_;
384 
385  //- Reference to the mesh
386  const fvMesh& mesh_;
387 
388  //- Name of the populationBalance
389  word name_;
390 
391  //- Dictionary
392  dictionary dict_;
393 
394  //- Continuous phase
395  const phaseModel& continuousPhase_;
396 
397  //- Velocity groups belonging to this populationBalance
398  HashTable<const velocityGroup*> velocityGroupPtrs_;
399 
400  //- Size groups belonging to this populationBalance
401  UPtrList<sizeGroup> sizeGroups_;
402 
403  //- sizeGroup boundaries
405 
406  //- Section width required for binary breakup formulation
408 
409  //- Explicitly treated sources
411 
412  //- Implicitly treated sources
414 
415  //- Dilatation errors
416  HashTable<volScalarField> dilatationErrors_;
417 
418  //- Field for caching sources
419  volScalarField Sui_;
420 
421  //- Coalescence models
422  PtrList<coalescenceModel> coalescenceModels_;
423 
424  //- Coalescence rate
425  autoPtr<volScalarField> coalescenceRate_;
426 
427  //- Coalescence relevant size group pairs
428  List<labelPair> coalescencePairs_;
429 
430  //- Breakup models
431  PtrList<breakupModel> breakupModels_;
432 
433  //- Breakup rate
434  autoPtr<volScalarField> breakupRate_;
435 
436  //- Binary breakup models
437  PtrList<binaryBreakupModel> binaryBreakupModels_;
438 
439  //- Binary breakup rate
440  autoPtr<volScalarField> binaryBreakupRate_;
441 
442  //- Binary breakup relevant size group pairs
443  List<labelPair> binaryBreakupPairs_;
444 
445  //- Drift models
446  PtrList<driftModel> drift_;
447 
448  //- Drift rate
449  autoPtr<volScalarField> driftRate_;
450 
451  //- Zeroeth order models
452  PtrList<nucleationModel> nucleation_;
453 
454  //- Zeroeth order rate
455  autoPtr<volScalarField> nucleationRate_;
456 
457  //- Total void fraction
458  autoPtr<volScalarField> alphas_;
459 
460  //- Mean Sauter diameter
462 
463  //- Average velocity
465 
466  //- Counter for interval between source term updates
467  label sourceUpdateCounter_;
468 
469 
470  // Private Member Functions
471 
472  void registerVelocityGroups();
473 
474  void initialiseDmdtfs();
475 
476  void createPhasePairs();
477 
478  void precompute();
479 
480  void birthByCoalescence(const label j, const label k);
481 
482  void deathByCoalescence(const label i, const label j);
483 
484  void birthByBreakup(const label k, const label model);
485 
486  void deathByBreakup(const label i);
487 
488  void calcDeltas();
489 
490  void birthByBinaryBreakup(const label i, const label j);
491 
492  void deathByBinaryBreakup(const label j, const label i);
493 
494  void drift(const label i, driftModel& model);
495 
496  void nucleation(const label i, nucleationModel& model);
497 
498  void sources();
499 
500  void correctDilatationError();
501 
502  void calcAlphas();
503 
504  tmp<volScalarField> calcDsm();
505 
506  void calcVelocity();
507 
508  //- Return whether the sources should be updated on this iteration
509  bool updateSources();
510 
511  //- Return the interval at which the sources are updated
512  inline label sourceUpdateInterval() const;
513 
514  //- Calculate and return the number allocation coefficient
515  template<class EtaType, class VType>
516  EtaType eta(const label i, const VType& v) const;
517 
518  //- Calculate and return the volume allocation coefficient
519  template<class EtaType, class VType>
520  EtaType etaV(const label i, const VType& v) const;
521 
522 
523 public:
524 
525  //- Runtime type information
526  TypeName("populationBalanceModel");
527 
528 
529  // Constructors
530 
531  //- Construct for a fluid
533 
534  //- Return clone
536 
537  //- Return a pointer to a new populationBalanceModel object created on
538  // freestore from Istream
539  class iNew
540  {
541  const phaseSystem& fluid_;
542 
543  public:
544 
545  iNew(const phaseSystem& fluid)
546  :
547  fluid_(fluid)
548  {}
549 
551  {
552  const word name(is);
553 
554  Info << "Setting up population balance: " << name << endl;
555 
557  (
558  new populationBalanceModel(fluid_, name)
559  );
560  }
561  };
562 
563 
564  //- Destructor
565  virtual ~populationBalanceModel();
566 
567 
568  // Member Functions
569 
570  //- Dummy write for regIOobject
571  bool writeData(Ostream&) const;
572 
573  //- Return reference to the phaseSystem
574  inline const phaseSystem& fluid() const;
575 
576  //- Return reference to the interfacial mass transfer rates
577  inline const phaseSystem::dmdtfTable& dmdtfs() const;
578 
579  //- Return reference to the mesh
580  inline const fvMesh& mesh() const;
581 
582  //- Return populationBalanceCoeffs dictionary
583  inline const dictionary& dict() const;
584 
585  //- Return the number of corrections
586  inline label nCorr() const;
587 
588  //- Solve on final pimple iteration only
589  inline Switch solveOnFinalIterOnly() const;
590 
591  //- Return continuous phase
592  inline const phaseModel& continuousPhase() const;
593 
594  //- Return the size groups belonging to this populationBalance
595  inline const UPtrList<sizeGroup>& sizeGroups() const;
596 
597  //- Return implicit source terms
598  inline const volScalarField& Sp(const label i) const;
599 
600  //- Return dilatation obtained from source terms
601  inline const HashTable<volScalarField>& sourceDilatation() const;
602 
603  //- Return coalescence relevant size group pairs
604  inline const List<labelPair>& coalescencePairs() const;
605 
606  //- Return binary breakup relevant size group pairs
607  inline const List<labelPair>& binaryBreakupPairs() const;
608 
609  //- Return total void of phases belonging to this populationBalance
610  inline const volScalarField& alphas() const;
611 
612  //- Return average velocity
613  inline const volVectorField& U() const;
614 
615  //- Return the number allocation coefficient
616  dimensionedScalar eta(const label i, const dimensionedScalar& v) const;
617 
618  //- Return the number allocation coefficient
620  (
621  const label i,
622  const volScalarField::Internal& v
623  ) const;
624 
625  //- Return the volume allocation coefficient
626  dimensionedScalar etaV(const label i, const dimensionedScalar& v) const;
627 
628  //- Return the volume allocation coefficient
630  (
631  const label i,
632  const volScalarField::Internal& v
633  ) const;
634 
635  //- Return the surface tension coefficient between a given dispersed
636  // and the continuous phase
638  (
639  const phaseModel& dispersedPhase
640  ) const;
641 
642  //- Return reference to momentumTransport model of the continuous phase
644  continuousTurbulence() const;
645 
646  //- Solve the population balance equation
647  void solve();
648 
649  //- Correct derived quantities
650  void correct();
651 };
652 
653 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
654 
655 } // End namespace diameterModels
656 } // End namespace Foam
657 
658 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
659 
660 #include "populationBalanceModelI.H"
661 
662 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
663 
664 #endif
665 
666 // ************************************************************************* //
label k
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Generic GeometricField class.
An STL-conforming hash table.
Definition: HashTable.H:127
void transfer(HashTable< T, Key, Hash > &)
Transfer the contents of the argument table into this table.
Definition: HashTable.C:587
bool insert(const Key &, const T &newElmt)
Insert a new hashedEntry.
Definition: HashTableI.H:80
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:99
const objectRegistry & db() const
Return the local objectRegistry.
Definition: IOobject.C:312
word group() const
Return group (extension part of name)
Definition: IOobject.C:324
const word & name() const
Return name.
Definition: IOobject.H:310
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
Definition: Istream.H:60
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: List.H:91
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:57
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
Definition: PtrList.H:75
A simple wrapper around bool so that it can be read as a word: true/false, on/off,...
Definition: Switch.H:61
static const word & constant()
Return constant name.
Definition: TimePaths.H:122
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
Definition: UPtrList.H:66
bool set(const label) const
Is element set.
Definition: UPtrListI.H:87
void transfer(UPtrList< T > &)
Transfer the contents of the argument UPtrList into this.
Definition: UPtrList.C:87
label size() const
Return the number of elements in the UPtrList.
Definition: UPtrListI.H:29
void resize(const label)
Reset size of UPtrList. This can only be used to set the size.
Definition: UPtrListI.H:71
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
Definition: autoPtr.H:51
Base class for drift models.
Definition: driftModel.H:54
Base class for nucleation models.
Class to accumulate population balance sub-class pointers.
static void retrieve(const populationBalanceModel &popBal, HashTable< const velocityGroup * > &velGroupPtrs, UPtrList< sizeGroup > &szGroupPtrs)
Retrieve the pointers.
static groups & New(const word &popBalName, const objectRegistry &db)
Lookup in the registry or construct new.
label nSizeGroups()
Return the current number of size groups.
virtual bool writeData(Ostream &) const
Dummy write for regIOobject.
void insert(velocityGroup &group)
Insert a velocity group into the table.
Return a pointer to a new populationBalanceModel object created on.
autoPtr< populationBalanceModel > operator()(Istream &is) const
Model for tracking the evolution of a dispersed phase size distribution due to coalescence (synonymou...
const HashTable< volScalarField > & sourceDilatation() const
Return dilatation obtained from source terms.
const phaseSystem & fluid() const
Return reference to the phaseSystem.
bool writeData(Ostream &) const
Dummy write for regIOobject.
const List< labelPair > & coalescencePairs() const
Return coalescence relevant size group pairs.
autoPtr< populationBalanceModel > clone() const
Return clone.
const List< labelPair > & binaryBreakupPairs() const
Return binary breakup relevant size group pairs.
const volVectorField & U() const
Return average velocity.
populationBalanceModel(const phaseSystem &fluid, const word &name)
Construct for a fluid.
const UPtrList< sizeGroup > & sizeGroups() const
Return the size groups belonging to this populationBalance.
Switch solveOnFinalIterOnly() const
Solve on final pimple iteration only.
const phaseModel & continuousPhase() const
Return continuous phase.
TypeName("populationBalanceModel")
Runtime type information.
const volScalarField & alphas() const
Return total void of phases belonging to this populationBalance.
const dictionary & dict() const
Return populationBalanceCoeffs dictionary.
const tmp< volScalarField > sigmaWithContinuousPhase(const phaseModel &dispersedPhase) const
Return the surface tension coefficient between a given dispersed.
const fvMesh & mesh() const
Return reference to the mesh.
label nCorr() const
Return the number of corrections.
const phaseCompressibleMomentumTransportModel & continuousTurbulence() const
Return reference to momentumTransport model of the continuous phase.
const volScalarField & Sp(const label i) const
Return implicit source terms.
const phaseSystem::dmdtfTable & dmdtfs() const
Return reference to the interfacial mass transfer rates.
void solve()
Solve the population balance equation.
Computes the Sauter mean diameter based on a user specified size distribution, defined in terms of si...
Definition: velocityGroup.H:87
A list of keyword definitions, which are a keyword followed by any number of values (e....
Definition: dictionary.H:162
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:99
Registry of regIOobjects.
const Time & time() const
Return time.
Type & lookupObjectRef(const word &name) const
Lookup and return the object reference of the given Type.
bool foundObject(const word &name) const
Is the named Type in registry.
Templated abstract base class for multiphase compressible turbulence models.
Class to represent a system of phases and model interfacial transfers between them.
Definition: phaseSystem.H:73
const fvMesh & mesh() const
Return the mesh.
Definition: phaseSystemI.H:89
regIOobject is an abstract class derived from IOobject to handle automatic object registration with t...
Definition: regIOobject.H:55
regIOobject(const IOobject &, const bool isTime=false)
Construct from IOobject. Optional flag for if IOobject is the.
Definition: regIOobject.C:41
bool checkOut()
Remove object from registry.
Definition: regIOobject.C:241
void store()
Transfer ownership of this object to its registry.
Definition: regIOobjectI.H:40
A class for managing temporary objects.
Definition: tmp.H:55
A class for handling words, derived from string.
Definition: word.H:62
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:334
Namespace for OpenFOAM.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
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
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:257
messageStream Info
error FatalError