pressure.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) 2012-2016 OpenFOAM Foundation
9  Copyright (C) 2016-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 
29 #include "pressure.H"
30 #include "volFields.H"
31 #include "basicThermo.H"
34 
35 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
36 
37 namespace Foam
38 {
39 namespace functionObjects
40 {
41  defineTypeNameAndDebug(pressure, 0);
42  addToRunTimeSelectionTable(functionObject, pressure, dictionary);
43 }
44 }
45 
46 
47 const Foam::Enum
48 <
50 >
52 ({
53  { STATIC, "static" },
54  { TOTAL, "total" },
55  { ISENTROPIC, "isentropic" },
56  { STATIC_COEFF, "staticCoeff" },
57  { TOTAL_COEFF, "totalCoeff" },
58 });
59 
60 
61 const Foam::Enum
62 <
64 >
66 ({
67  { NONE, "none" },
68  { ADD, "add" },
69  { SUBTRACT, "subtract" },
70 });
71 
72 
73 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
74 
75 Foam::word Foam::functionObjects::pressure::resultName() const
76 {
77  word rName;
78 
79  if (mode_ & STATIC)
80  {
81  rName = "static(" + fieldName_ + ")";
82  }
83  else if (mode_ & TOTAL)
84  {
85  rName = "total(" + fieldName_ + ")";
86  }
87  else if (mode_ & ISENTROPIC)
88  {
89  rName = "isentropic(" + fieldName_ + ")";
90  }
91  else
92  {
94  << "Unhandled calculation mode " << modeNames[mode_]
95  << abort(FatalError);
96  }
97 
98  switch (hydrostaticMode_)
99  {
100  case NONE:
101  {
102  break;
103  }
104  case ADD:
105  {
106  rName = rName + "+rgh";
107 
108  break;
109  }
110  case SUBTRACT:
111  {
112  rName = rName + "-rgh";
113 
114  break;
115  }
116  }
117 
118  if (mode_ & COEFF)
119  {
120  rName += "_coeff";
121  }
122 
123  return rName;
124 }
125 
126 
127 Foam::tmp<Foam::volScalarField> Foam::functionObjects::pressure::rhoScale
128 (
129  const volScalarField& p
130 ) const
131 {
132  if (p.dimensions() == dimPressure)
133  {
135  (
136  IOobject
137  (
138  "rhoScale",
139  p.mesh().time().timeName(),
140  p.mesh(),
144  ),
145  p,
147  );
148  }
149 
150  if (!rhoInfInitialised_)
151  {
153  << type() << " " << name() << ": "
154  << "pressure identified as incompressible, but reference "
155  << "density is not set. Please set 'rho' to 'rhoInf', and "
156  << "set an appropriate value for 'rhoInf'"
157  << exit(FatalError);
158  }
159 
160  return dimensionedScalar("rhoInf", dimDensity, rhoInf_)*p;
161 }
162 
163 
164 Foam::tmp<Foam::volScalarField> Foam::functionObjects::pressure::rhoScale
165 (
166  const volScalarField& p,
167  const tmp<volScalarField>& tsf
168 ) const
169 {
170  if (p.dimensions() == dimPressure)
171  {
172  return lookupObject<volScalarField>(rhoName_)*tsf;
173  }
174 
175  return dimensionedScalar("rhoInf", dimDensity, rhoInf_)*tsf;
176 }
177 
178 
179 void Foam::functionObjects::pressure::addHydrostaticContribution
180 (
181  const volScalarField& p,
182  volScalarField& prgh
183 ) const
184 {
185  // Add/subtract hydrostatic contribution
186 
187  if (hydrostaticMode_ == NONE)
188  {
189  return;
190  }
191 
192  if (!gInitialised_)
193  {
194  g_ = mesh_.time().lookupObject<uniformDimensionedVectorField>("g");
195  }
196 
197  if (!hRefInitialised_)
198  {
199  hRef_ = mesh_.lookupObject<uniformDimensionedScalarField>("hRef");
200  }
201 
202  const dimensionedScalar ghRef
203  (
204  (g_ & (cmptMag(g_.value())/mag(g_.value())))*hRef_
205  );
206 
207  tmp<volScalarField> rgh = rhoScale(p, (g_ & mesh_.C()) - ghRef);
208 
209  switch (hydrostaticMode_)
210  {
211  case ADD:
212  {
213  prgh += rgh;
214  break;
215  }
216  case SUBTRACT:
217  {
218  prgh -= rgh;
219  break;
220  }
221  default:
222  {}
223  }
224 }
225 
226 
227 Foam::tmp<Foam::volScalarField> Foam::functionObjects::pressure::calcPressure
228 (
229  const volScalarField& p,
230  const tmp<volScalarField>& tp
231 ) const
232 {
233  // Initialise to the pressure reference level
234  auto tresult =
236  (
237  IOobject
238  (
239  scopedName("p"),
240  mesh_.time().timeName(),
241  mesh_,
243  ),
244  mesh_,
245  dimensionedScalar("p", dimPressure, pRef_)
246  );
247 
248  volScalarField& result = tresult.ref();
249 
250  addHydrostaticContribution(p, result);
251 
252  if (mode_ & STATIC)
253  {
254  result += tp;
255  return tresult;
256  }
257 
258  if (mode_ & TOTAL)
259  {
260  result +=
261  tp
262  + rhoScale(p, 0.5*magSqr(lookupObject<volVectorField>(UName_)));
263  return tresult;
264  }
265 
266  if (mode_ & ISENTROPIC)
267  {
268  const basicThermo* thermoPtr =
269  p.mesh().cfindObject<basicThermo>(basicThermo::dictName);
270 
271  if (!thermoPtr)
272  {
274  << "Isentropic pressure calculation requires a "
275  << "thermodynamics package"
276  << exit(FatalError);
277  }
278 
279  const volScalarField gamma(thermoPtr->gamma());
280  const volScalarField Mb
281  (
282  mag(lookupObject<volVectorField>(UName_))
283  /sqrt(gamma*tp.ref()/thermoPtr->rho())
284  );
285 
286  result += tp*(pow(1 + (gamma - 1)/2*sqr(Mb), gamma/(gamma - 1)));
287  return tresult;
288  }
289 
290  return tresult;
291 }
292 
293 
294 Foam::tmp<Foam::volScalarField> Foam::functionObjects::pressure::coeff
295 (
296  const tmp<volScalarField>& tp
297 ) const
298 {
299  if (mode_ & COEFF)
300  {
301  tmp<volScalarField> tpCoeff(tp.ptr());
302  volScalarField& pCoeff = tpCoeff.ref();
303 
304  pCoeff -= dimensionedScalar("pInf", dimPressure, pInf_);
305 
306  const dimensionedScalar pSmall("pSmall", dimPressure, SMALL);
307  const dimensionedVector U("U", dimVelocity, UInf_);
308  const dimensionedScalar rho("rho", dimDensity, rhoInf_);
309 
310  pCoeff /= 0.5*rho*magSqr(U) + pSmall;
311 
312  return tpCoeff;
313  }
314 
315  return std::move(tp);
316 }
317 
318 
319 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
320 
321 bool Foam::functionObjects::pressure::calc()
322 {
323  if (foundObject<volScalarField>(fieldName_))
324  {
325  const volScalarField& p = lookupObject<volScalarField>(fieldName_);
326 
327  auto tp = tmp<volScalarField>::New
328  (
329  IOobject
330  (
331  resultName_,
332  p.mesh().time().timeName(),
333  p.mesh(),
337  ),
338  coeff(calcPressure(p, rhoScale(p)))
339  );
340 
341  return store(resultName_, tp);
342  }
343 
344  return false;
345 }
346 
347 
348 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
349 
351 (
352  const word& name,
353  const Time& runTime,
354  const dictionary& dict
355 )
356 :
358  mode_(STATIC),
359  hydrostaticMode_(NONE),
360  UName_("U"),
361  rhoName_("rho"),
362  pRef_(0),
363  pInf_(0),
364  UInf_(Zero),
365  rhoInf_(1),
366  rhoInfInitialised_(false),
367  g_(dimAcceleration),
368  gInitialised_(false),
369  hRef_(dimLength),
370  hRefInitialised_(false)
371 {
372  read(dict);
373 }
374 
375 
376 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
377 
379 {
380  Info<< type() << " " << name() << ":" << nl;
381 
383 
384  UName_ = dict.getOrDefault<word>("U", "U");
385  rhoName_ = dict.getOrDefault<word>("rho", "rho");
386 
387  if (rhoName_ == "rhoInf")
388  {
389  dict.readEntry("rhoInf", rhoInf_);
390  rhoInfInitialised_ = true;
391  }
392 
393  if (!modeNames.readIfPresent("mode", dict, mode_))
394  {
395  // Backwards compatibility
396  // - check for the presence of 'calcTotal' and 'calcCoeff'
397 
398  bool calcTotal =
399  dict.getOrDefaultCompat<bool>("mode", {{"calcTotal", 1812}}, false);
400  bool calcCoeff =
401  dict.getOrDefaultCompat<bool>("mode", {{"calcCoeff", 1812}}, false);
402 
403  if (calcTotal)
404  {
405  mode_ = TOTAL;
406  }
407  else
408  {
409  mode_ = STATIC;
410  }
411 
412  if (calcCoeff)
413  {
414  mode_ = static_cast<mode>(COEFF | mode_);
415  }
416  }
417 
418  Info<< " Operating mode: " << modeNames[mode_] << nl;
419 
420  pRef_ = dict.getOrDefault<scalar>("pRef", 0);
421 
422  if
423  (
424  hydrostaticModeNames.readIfPresent
425  (
426  "hydrostaticMode",
427  dict,
428  hydrostaticMode_
429  )
430  && hydrostaticMode_
431  )
432  {
433  Info<< " Hydrostatic mode: "
434  << hydrostaticModeNames[hydrostaticMode_]
435  << nl;
436  gInitialised_ = dict.readIfPresent("g", g_);
437  hRefInitialised_ = dict.readIfPresent("hRef", hRef_);
438  }
439  else
440  {
441  Info<< " Not including hydrostatic effects" << nl;
442  }
443 
444 
445  if (mode_ & COEFF)
446  {
447  dict.readEntry("pInf", pInf_);
448  dict.readEntry("UInf", UInf_);
449  dict.readEntry("rhoInf", rhoInf_);
450 
451  const scalar zeroCheck = 0.5*rhoInf_*magSqr(UInf_) + pInf_;
452 
453  if (mag(zeroCheck) < ROOTVSMALL)
454  {
456  << type() << " " << name() << ": "
457  << "Coefficient calculation requested, but reference "
458  << "pressure level is zero. Please check the supplied "
459  << "values of pInf, UInf and rhoInf" << endl;
460  }
461 
462  rhoInfInitialised_ = true;
463  }
464 
465  resultName_ = dict.getOrDefault<word>("result", resultName());
466 
467  Info<< endl;
468 
469  return true;
470 }
471 
472 
473 // ************************************************************************* //
word dictName() const
The local dictionary name (final part of scoped name)
Definition: dictionaryI.H:53
dictionary dict
defineTypeNameAndDebug(ObukhovLength, 0)
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:125
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
static const Enum< hydrostaticMode > hydrostaticModeNames
Definition: pressure.H:378
UniformDimensionedField< vector > uniformDimensionedVectorField
error FatalError
Error stream (stdout output on all processes), with additional &#39;FOAM FATAL ERROR&#39; header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:120
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:578
word fieldName_
Name of field to process.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
mode
Enumeration for pressure calculation mode.
Definition: pressure.H:356
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:49
Various UniformDimensionedField types.
dimensioned< vector > dimensionedVector
Dimensioned vector obtained from generic dimensioned type.
engineTime & runTime
dimensionedScalar sqrt(const dimensionedScalar &ds)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:487
virtual bool read(const dictionary &dict)
Read the fieldExpression data.
No type, or default initialized type.
Ignore writing from objectRegistry::writeObject()
pressure(const word &name, const Time &runTime, const dictionary &)
Construct from Time and dictionary.
Definition: pressure.C:344
UniformDimensionedField< scalar > uniformDimensionedScalarField
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Definition: Time.H:69
Macros for easy insertion into run-time selection tables.
bool read(const char *buf, int32_t &val)
Same as readInt32.
Definition: int32.H:127
GeometricField< scalar, fvPatchField, volMesh > volScalarField
Definition: volFieldsFwd.H:81
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
Definition: POSIX.C:799
const dimensionSet dimAcceleration
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
Definition: exprTraits.C:52
hydrostaticMode
Enumeration for hydrostatic contributions.
Definition: pressure.H:371
A class for handling words, derived from Foam::string.
Definition: word.H:63
virtual bool read(const dictionary &)
Read the pressure data.
Definition: pressure.C:371
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
Definition: tmp.H:212
Coefficient manipulator.
Definition: pressure.H:361
const dimensionSet dimPressure
errorManip< error > abort(error &err)
Definition: errorManip.H:139
void cmptMag(FieldField< Field, Type > &cf, const FieldField< Field, Type > &f)
addToRunTimeSelectionTable(functionObject, ObukhovLength, dictionary)
const dimensionSet dimDensity
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
U
Definition: pEqn.H:72
#define WarningInFunction
Report a warning using Foam::Warning.
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
const dimensionSet dimLength(0, 1, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:50
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
Intermediate class for handling field expression function objects (e.g. blendingFactor etc...
Nothing to be read.
static const word & calculatedType() noexcept
The type name for calculated patch fields.
Definition: fvPatchField.H:201
messageStream Info
Information stream (stdout output on master, null elsewhere)
Internal & ref(const bool updateAccessTime=true)
Same as internalFieldRef()
const scalar gamma
Definition: EEqn.H:9
volScalarField & p
A class for managing temporary objects.
Definition: HashPtrTable.H:50
mode_t mode(const fileName &name, const bool followLink=true)
Return the file mode, normally following symbolic links.
Definition: POSIX.C:773
Request registration (bool: true)
Do not request registration (bool: false)
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
Namespace for OpenFOAM.
static const Enum< mode > modeNames
Definition: pressure.H:366
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:133
const dimensionSet dimVelocity