ThermalPhaseChangePhaseSystem.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 | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2015-2019 OpenFOAM Foundation
9  Copyright (C) 2020 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
31 #include "fvcVolumeIntegrate.H"
32 #include "fvmSup.H"
33 
34 // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
35 
36 template<class BasePhaseSystem>
39 (
40  const phasePairKey& key
41 ) const
42 {
43  if (!iDmdt_.found(key))
44  {
45  return phaseSystem::dmdt(key);
46  }
47 
48  const scalar dmdtSign(Pair<word>::compare(iDmdt_.find(key).key(), key));
49 
50  return dmdtSign**iDmdt_[key];
51 }
52 
53 
54 template<class BasePhaseSystem>
57 (
58  const phasePairKey& key
59 ) const
60 {
61  if (!wDmdt_.found(key))
62  {
63  return phaseSystem::dmdt(key);
64  }
65 
66  const scalar dmdtSign(Pair<word>::compare(wDmdt_.find(key).key(), key));
67 
68  return dmdtSign**wDmdt_[key];
69 }
70 
71 
72 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
73 
74 template<class BasePhaseSystem>
77 (
78  const fvMesh& mesh
79 )
80 :
81  BasePhaseSystem(mesh),
82  volatile_(this->template getOrDefault<word>("volatile", "none")),
83  saturationModel_
84  (
85  saturationModel::New(this->subDict("saturationModel"), mesh)
86  ),
87  phaseChange_(this->lookup("phaseChange"))
88 {
89 
91  (
93  this->phasePairs_,
94  phasePairIter
95  )
96  {
97  const phasePair& pair(phasePairIter());
98 
99  if (pair.ordered())
100  {
101  continue;
102  }
103 
104  // Initially assume no mass transfer
105  iDmdt_.set
106  (
107  pair,
108  new volScalarField
109  (
110  IOobject
111  (
112  IOobject::groupName("iDmdt", pair.name()),
113  this->mesh().time().timeName(),
114  this->mesh(),
115  IOobject::READ_IF_PRESENT,
116  IOobject::AUTO_WRITE
117  ),
118  this->mesh(),
120  )
121  );
122 
123  // Initially assume no mass transfer
124  wDmdt_.set
125  (
126  pair,
127  new volScalarField
128  (
129  IOobject
130  (
131  IOobject::groupName("wDmdt", pair.name()),
132  this->mesh().time().timeName(),
133  this->mesh(),
134  IOobject::READ_IF_PRESENT,
135  IOobject::AUTO_WRITE
136  ),
137  this->mesh(),
139  )
140  );
141 
142  // Initially assume no mass transfer
143  wMDotL_.set
144  (
145  pair,
146  new volScalarField
147  (
148  IOobject
149  (
150  IOobject::groupName("wMDotL", pair.name()),
151  this->mesh().time().timeName(),
152  this->mesh(),
153  IOobject::READ_IF_PRESENT,
154  IOobject::AUTO_WRITE
155  ),
156  this->mesh(),
158  )
159  );
160  }
161 }
162 
163 
164 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
165 
166 template<class BasePhaseSystem>
169 {}
170 
171 
172 // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
173 
174 template<class BasePhaseSystem>
177 {
178  return saturationModel_();
179 }
180 
181 
182 template<class BasePhaseSystem>
185 (
186  const phasePairKey& key
187 ) const
188 {
189  return BasePhaseSystem::dmdt(key) + this->iDmdt(key) + this->wDmdt(key);
190 }
191 
192 
193 template<class BasePhaseSystem>
196 {
197  PtrList<volScalarField> dmdts(BasePhaseSystem::dmdts());
198 
199  forAllConstIter(iDmdtTable, iDmdt_, iDmdtIter)
200  {
201  const phasePair& pair = this->phasePairs_[iDmdtIter.key()];
202  const volScalarField& iDmdt = *iDmdtIter();
203 
204  this->addField(pair.phase1(), "dmdt", iDmdt, dmdts);
205  this->addField(pair.phase2(), "dmdt", - iDmdt, dmdts);
206  }
207 
208  forAllConstIter(wDmdtTable, wDmdt_, wDmdtIter)
209  {
210  const phasePair& pair = this->phasePairs_[wDmdtIter.key()];
211  const volScalarField& wDmdt = *wDmdtIter();
212 
213  this->addField(pair.phase1(), "dmdt", wDmdt, dmdts);
214  this->addField(pair.phase2(), "dmdt", - wDmdt, dmdts);
215  }
216 
217  return dmdts;
218 }
219 
220 
221 template<class BasePhaseSystem>
224 {
226  BasePhaseSystem::heatTransfer();
227 
228  phaseSystem::heatTransferTable& eqns = eqnsPtr();
229 
230  // Add boundary term
232  (
234  this->phasePairs_,
235  phasePairIter
236  )
237  {
238  if (this->wMDotL_.found(phasePairIter.key()))
239  {
240  const phasePair& pair(phasePairIter());
241 
242  if (pair.ordered())
243  {
244  continue;
245  }
246 
247  const phaseModel& phase1 = pair.phase1();
248  const phaseModel& phase2 = pair.phase2();
249 
250  *eqns[phase1.name()] += negPart(*this->wMDotL_[pair]);
251  *eqns[phase2.name()] -= posPart(*this->wMDotL_[pair]);
252 
253  if
254  (
255  phase1.thermo().he().member() == "e"
256  || phase2.thermo().he().member() == "e"
257  )
258  {
259  const volScalarField dmdt
260  (
261  this->iDmdt(pair) + this->wDmdt(pair)
262  );
263 
264  if (phase1.thermo().he().member() == "e")
265  {
266  *eqns[phase1.name()] +=
267  phase1.thermo().p()*dmdt/phase1.thermo().rho();
268  }
269 
270  if (phase2.thermo().he().member() == "e")
271  {
272  *eqns[phase2.name()] -=
273  phase2.thermo().p()*dmdt/phase2.thermo().rho();
274  }
275  }
276  }
277  }
278 
279  return eqnsPtr;
280 }
281 
282 
283 template<class BasePhaseSystem>
286 {
289 
290  phaseSystem::massTransferTable& eqns = eqnsPtr();
291 
293  (
295  this->phasePairs_,
296  phasePairIter
297  )
298  {
299  const phasePair& pair(phasePairIter());
300 
301  if (pair.ordered())
302  {
303  continue;
304  }
305 
306  const phaseModel& phase = pair.phase1();
307  const phaseModel& otherPhase = pair.phase2();
308 
309  const PtrList<volScalarField>& Yi = phase.Y();
310 
311  forAll(Yi, i)
312  {
313  if (Yi[i].member() != volatile_)
314  {
315  continue;
316  }
317 
318  const word name
319  (
320  IOobject::groupName(volatile_, phase.name())
321  );
322 
323  const word otherName
324  (
325  IOobject::groupName(volatile_, otherPhase.name())
326  );
327 
328  // Note that the phase YiEqn does not contain a continuity error
329  // term, so these additions represent the entire mass transfer
330 
331  const volScalarField dmdt(this->iDmdt(pair) + this->wDmdt(pair));
332 
333  *eqns[name] += dmdt;
334  *eqns[otherName] -= dmdt;
335  }
336  }
337 
338  return eqnsPtr;
339 }
340 
341 
342 template<class BasePhaseSystem>
343 void
345 {
347  alphatPhaseChangeWallFunction;
348 
350  (
351  typename BasePhaseSystem::heatTransferModelTable,
352  this->heatTransferModels_,
353  heatTransferModelIter
354  )
355  {
356  const phasePair& pair
357  (
358  this->phasePairs_[heatTransferModelIter.key()]
359  );
360 
361  const phaseModel& phase1 = pair.phase1();
362  const phaseModel& phase2 = pair.phase2();
363 
364  const volScalarField& T1(phase1.thermo().T());
365  const volScalarField& T2(phase2.thermo().T());
366 
367  const volScalarField& he1(phase1.thermo().he());
368  const volScalarField& he2(phase2.thermo().he());
369 
370  const volScalarField& p(phase1.thermo().p());
371 
372  volScalarField& iDmdt(*this->iDmdt_[pair]);
373  volScalarField& Tf(*this->Tf_[pair]);
374 
375  const volScalarField Tsat(saturationModel_->Tsat(phase1.thermo().p()));
376 
377  volScalarField hf1
378  (
379  he1.member() == "e"
380  ? phase1.thermo().he(p, Tsat) + p/phase1.rho()
381  : phase1.thermo().he(p, Tsat)
382  );
383  volScalarField hf2
384  (
385  he2.member() == "e"
386  ? phase2.thermo().he(p, Tsat) + p/phase2.rho()
387  : phase2.thermo().he(p, Tsat)
388  );
389 
390  volScalarField h1
391  (
392  he1.member() == "e"
393  ? he1 + p/phase1.rho()
394  : tmp<volScalarField>(he1)
395  );
396 
397  volScalarField h2
398  (
399  he2.member() == "e"
400  ? he2 + p/phase2.rho()
402  );
403 
405  (
406  (neg0(iDmdt)*hf2 + pos(iDmdt)*h2)
407  - (pos0(iDmdt)*hf1 + neg(iDmdt)*h1)
408  );
409 
410  volScalarField iDmdtNew(iDmdt);
411 
412  if (phaseChange_)
413  {
414  volScalarField H1(heatTransferModelIter().first()->K(0));
415  volScalarField H2(heatTransferModelIter().second()->K(0));
416 
417  iDmdtNew = (H1*(Tsat - T1) + H2*(Tsat - T2))/L;
418  }
419  else
420  {
421  iDmdtNew == dimensionedScalar(iDmdt.dimensions());
422  }
423 
424  volScalarField H1(heatTransferModelIter().first()->K());
425  volScalarField H2(heatTransferModelIter().second()->K());
426 
427  // Limit the H[12] to avoid /0
428  H1.max(SMALL);
429  H2.max(SMALL);
430 
431  Tf = (H1*T1 + H2*T2 + iDmdtNew*L)/(H1 + H2);
432 
433  Info<< "Tf." << pair.name()
434  << ": min = " << gMin(Tf.primitiveField())
435  << ", mean = " << gAverage(Tf.primitiveField())
436  << ", max = " << gMax(Tf.primitiveField())
437  << endl;
438 
439  scalar iDmdtRelax(this->mesh().fieldRelaxationFactor("iDmdt"));
440  iDmdt = (1 - iDmdtRelax)*iDmdt + iDmdtRelax*iDmdtNew;
441 
442  if (phaseChange_)
443  {
444  Info<< "iDmdt." << pair.name()
445  << ": min = " << gMin(iDmdt.primitiveField())
446  << ", mean = " << gAverage(iDmdt.primitiveField())
447  << ", max = " << gMax(iDmdt.primitiveField())
448  << ", integral = " << fvc::domainIntegrate(iDmdt).value()
449  << endl;
450  }
451 
452  volScalarField& wDmdt(*this->wDmdt_[pair]);
453  volScalarField& wMDotL(*this->wMDotL_[pair]);
454  wDmdt *= 0.0;
455  wMDotL *= 0.0;
456 
457  bool wallBoilingActive = false;
458 
459  forAllConstIter(phasePair, pair, iter)
460  {
461  const phaseModel& phase = iter();
462  const phaseModel& otherPhase = iter.otherPhase();
463 
464  if
465  (
466  phase.mesh().foundObject<volScalarField>
467  (
468  "alphat." + phase.name()
469  )
470  )
471  {
472  const volScalarField& alphat =
473  phase.mesh().lookupObject<volScalarField>
474  (
475  "alphat." + phase.name()
476  );
477 
478  const fvPatchList& patches = this->mesh().boundary();
479  forAll(patches, patchi)
480  {
481  const fvPatch& currPatch = patches[patchi];
482 
483  if
484  (
485  isA<alphatPhaseChangeWallFunction>
486  (
487  alphat.boundaryField()[patchi]
488  )
489  )
490  {
491  const alphatPhaseChangeWallFunction& PCpatch =
492  refCast<const alphatPhaseChangeWallFunction>
493  (
494  alphat.boundaryField()[patchi]
495  );
496 
497  phasePairKey key(phase.name(), otherPhase.name());
498 
499  if (PCpatch.activePhasePair(key))
500  {
501  wallBoilingActive = true;
502 
503  const scalarField& patchDmdt =
504  PCpatch.dmdt(key);
505  const scalarField& patchMDotL =
506  PCpatch.mDotL(key);
507 
508  const scalar sign
509  (
510  Pair<word>::compare(pair, key)
511  );
512 
513  forAll(patchDmdt, facei)
514  {
515  const label faceCelli =
516  currPatch.faceCells()[facei];
517  wDmdt[faceCelli] -= sign*patchDmdt[facei];
518  wMDotL[faceCelli] -= sign*patchMDotL[facei];
519  }
520  }
521  }
522  }
523  }
524  }
525 
526  if (wallBoilingActive)
527  {
528  Info<< "wDmdt." << pair.name()
529  << ": min = " << gMin(wDmdt.primitiveField())
530  << ", mean = " << gAverage(wDmdt.primitiveField())
531  << ", max = " << gMax(wDmdt.primitiveField())
532  << ", integral = " << fvc::domainIntegrate(wDmdt).value()
533  << endl;
534  }
535  }
536 }
537 
538 
539 template<class BasePhaseSystem>
541 {
542  if (BasePhaseSystem::read())
543  {
544  bool readOK = true;
545 
546  // Models ...
547 
548  return readOK;
549  }
550  else
551  {
552  return false;
553  }
554 }
555 
556 
557 // ************************************************************************* //
Foam::phaseModel
Single incompressible phase derived from the phase-fraction. Used as part of the multiPhaseMixture fo...
Definition: phaseModel.H:54
Foam::IOobject
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition: IOobject.H:169
L
const vector L(dict.get< vector >("L"))
Foam::phasePair
Description for mass transfer between a pair of phases. The direction of the mass transfer is from th...
Definition: phasePair.H:53
p
volScalarField & p
Definition: createFieldRefs.H:8
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:65
Foam::ThermalPhaseChangePhaseSystem::dmdts
virtual PtrList< volScalarField > dmdts() const
Return the mass transfer rates for each phase.
Definition: ThermalPhaseChangePhaseSystem.C:195
Foam::ThermalPhaseChangePhaseSystem::iDmdt
tmp< volScalarField > iDmdt(const phasePairKey &key) const
Return the interfacial mass transfer rate for a pair.
Definition: ThermalPhaseChangePhaseSystem.C:39
Foam::phase
Single incompressible phase derived from the phase-fraction. Used as part of the multiPhaseMixture fo...
Definition: phase.H:54
Foam::tmp
A class for managing temporary objects.
Definition: PtrList.H:61
Foam::dimEnergy
const dimensionSet dimEnergy
Foam::dimDensity
const dimensionSet dimDensity
Foam::gAverage
Type gAverage(const FieldField< Field, Type > &f)
Definition: FieldFieldFunctions.C:604
Foam::saturationModel
Definition: saturationModel.H:53
Foam::fvc::domainIntegrate
dimensioned< Type > domainIntegrate(const GeometricField< Type, fvPatchField, volMesh > &vf)
Definition: fvcVolumeIntegrate.C:88
Foam::posPart
dimensionedScalar posPart(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:221
Foam::GeometricField::primitiveField
const Internal::FieldType & primitiveField() const
Return a const-reference to the internal field.
Definition: GeometricFieldI.H:53
Foam::neg0
dimensionedScalar neg0(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:210
Foam::glTF::key
auto key(const Type &t) -> typename std::enable_if< std::is_enum< Type >::value, typename std::underlying_type< Type >::type >::type
Definition: foamGltfBase.H:108
Foam::compressible::alphatPhaseChangeWallFunctionFvPatchScalarField
Abstract base-class for all alphatWallFunctions supporting phase-change.
Definition: alphatPhaseChangeWallFunctionFvPatchScalarField.H:100
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:369
Foam::pos0
dimensionedScalar pos0(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:188
he2
volScalarField & he2
Definition: EEqns.H:3
Foam::sign
dimensionedScalar sign(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:166
forAllConstIter
#define forAllConstIter(Container, container, iter)
Iterate across all elements in the container object.
Definition: stdFoam.H:344
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:296
Foam::ThermalPhaseChangePhaseSystem::read
virtual bool read()
Read base phaseProperties dictionary.
Definition: ThermalPhaseChangePhaseSystem.C:540
K
CGAL::Exact_predicates_exact_constructions_kernel K
Definition: CGALTriangulation3DKernel.H:58
Foam::blockMeshTools::read
void read(Istream &, label &val, const dictionary &)
In-place read with dictionary lookup.
Definition: blockMeshTools.C:57
ThermalPhaseChangePhaseSystem.H
Foam::dimTime
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
Definition: dimensionSets.H:53
Foam::phasePairKey::ordered
bool ordered() const noexcept
Return the ordered flag.
Definition: phasePairKey.H:98
alphatPhaseChangeWallFunctionFvPatchScalarField.H
Foam::Field< scalar >
massTransfer
phaseSystem::massTransferTable & massTransfer(massTransferPtr())
Foam::ThermalPhaseChangePhaseSystem::~ThermalPhaseChangePhaseSystem
virtual ~ThermalPhaseChangePhaseSystem()
Destructor.
Definition: ThermalPhaseChangePhaseSystem.C:168
Foam::Info
messageStream Info
Information stream (stdout output on master, null elsewhere)
Foam::ThermalPhaseChangePhaseSystem::ThermalPhaseChangePhaseSystem
ThermalPhaseChangePhaseSystem(const fvMesh &)
Construct from fvMesh.
Definition: ThermalPhaseChangePhaseSystem.C:77
Foam::fvPatch
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition: fvPatch.H:65
Foam::ThermalPhaseChangePhaseSystem::correctInterfaceThermo
virtual void correctInterfaceThermo()
Correct the interface thermodynamics.
Definition: ThermalPhaseChangePhaseSystem.C:344
Foam::dimensionedScalar
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
Definition: dimensionedScalarFwd.H:42
Foam::PtrList
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers....
Definition: List.H:59
Foam::phasePairKey
An ordered or unorder pair of phase names. Typically specified as follows.
Definition: phasePairKey.H:65
Foam::radiation::lookup
Lookup type of boundary radiation properties.
Definition: lookup.H:63
phase2
phaseModel & phase2
Definition: setRegionFluidFields.H:6
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:6
Foam::fvMesh
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:85
fvmSup.H
Calculate the matrix for implicit and explicit sources.
Foam::phase::name
const word & name() const
Definition: phase.H:111
Foam::HashTable< autoPtr< phasePair >, phasePairKey, phasePairKey::hash >
Foam::New
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tdf1, const word &name, const dimensionSet &dimensions)
Global function forwards to reuseTmpDimensionedField::New.
Definition: DimensionedFieldReuseFunctions.H:105
Foam::phaseModel::name
const word & name() const
Definition: phaseModel.H:140
Foam::autoPtr
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
Definition: HashPtrTable.H:53
Foam::negPart
dimensionedScalar negPart(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:232
Foam::Pair
An ordered pair of two objects of type <T> with first() and second() elements.
Definition: Pair.H:54
Foam::HashPtrTable< volScalarField, phasePairKey, phasePairKey::hash >
Foam::phaseModel::otherPhase
const phaseModel & otherPhase() const
Return the other phase in this two-phase system.
Definition: phaseModel.C:218
Foam::phasePair::name
virtual word name() const
Pair name.
Definition: phasePair.C:69
Foam::ThermalPhaseChangePhaseSystem::saturation
const saturationModel & saturation() const
Return the saturationModel.
Definition: ThermalPhaseChangePhaseSystem.C:176
fvcVolumeIntegrate.H
Volume integrate volField creating a volField.
patches
const polyBoundaryMesh & patches
Definition: convertProcessorPatches.H:65
Foam::phasePair::phase2
const phaseModel & phase2() const
Definition: phasePairI.H:36
Foam::ThermalPhaseChangePhaseSystem::dmdt
virtual tmp< volScalarField > dmdt(const phasePairKey &key) const
Return the mass transfer rate for a pair.
Definition: ThermalPhaseChangePhaseSystem.C:185
Foam::fvPatch::faceCells
virtual const labelUList & faceCells() const
Return faceCells.
Definition: fvPatch.C:113
Foam::name
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
Definition: exprTraits.C:59
Foam::GeometricField::max
void max(const dimensioned< Type > &dt)
Use the maximum of the field and specified value.
Definition: GeometricField.C:1143
phase1
phaseModel & phase1
Definition: setRegionFluidFields.H:5
Foam::gMin
Type gMin(const FieldField< Field, Type > &f)
Definition: FieldFieldFunctions.C:593
Foam::dimVolume
const dimensionSet dimVolume(pow3(dimLength))
Definition: dimensionSets.H:60
Foam::phasePair::phase1
const phaseModel & phase1() const
Definition: phasePairI.H:30
Foam::GeometricField< scalar, fvPatchField, volMesh >
Foam::neg
dimensionedScalar neg(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:199
Foam::gMax
Type gMax(const FieldField< Field, Type > &f)
Definition: FieldFieldFunctions.C:592
Foam::ThermalPhaseChangePhaseSystem::wDmdt
tmp< volScalarField > wDmdt(const phasePairKey &key) const
Return the boundary mass transfer rate for a pair.
Definition: ThermalPhaseChangePhaseSystem.C:57
Foam::ThermalPhaseChangePhaseSystem::heatTransfer
virtual autoPtr< phaseSystem::heatTransferTable > heatTransfer() const
Return the heat transfer matrices.
Definition: ThermalPhaseChangePhaseSystem.C:223
Foam::GeometricField::boundaryField
const Boundary & boundaryField() const
Return const-reference to the boundary field.
Definition: GeometricFieldI.H:62
Foam::ThermalPhaseChangePhaseSystem::massTransfer
virtual autoPtr< phaseSystem::massTransferTable > massTransfer() const
Return the mass transfer matrices.
Definition: ThermalPhaseChangePhaseSystem.C:285
Foam::pos
dimensionedScalar pos(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:177