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  const int oldLocal = volScalarField::Boundary::localConsistency;
209 
210  tmp<volScalarField> rgh = rhoScale(p, (g_ & mesh_.C()) - ghRef);
211 
212  switch (hydrostaticMode_)
213  {
214  case ADD:
215  {
216  prgh += rgh;
217  break;
218  }
219  case SUBTRACT:
220  {
221  prgh -= rgh;
222  break;
223  }
224  default:
225  {}
226  }
227 
229 }
230 
231 
232 Foam::tmp<Foam::volScalarField> Foam::functionObjects::pressure::calcPressure
233 (
234  const volScalarField& p,
235  const tmp<volScalarField>& tp
236 ) const
237 {
238  // Initialise to the pressure reference level
239  auto tresult =
241  (
242  IOobject
243  (
244  scopedName("p"),
245  mesh_.time().timeName(),
246  mesh_,
248  ),
249  mesh_,
250  dimensionedScalar("p", dimPressure, pRef_)
251  );
252 
253  volScalarField& result = tresult.ref();
254 
255  addHydrostaticContribution(p, result);
256 
257  if (mode_ & STATIC)
258  {
259  result += tp;
260  return tresult;
261  }
262 
263  if (mode_ & TOTAL)
264  {
265  result +=
266  tp
267  + rhoScale(p, 0.5*magSqr(lookupObject<volVectorField>(UName_)));
268  return tresult;
269  }
270 
271  if (mode_ & ISENTROPIC)
272  {
273  const basicThermo* thermoPtr =
274  p.mesh().cfindObject<basicThermo>(basicThermo::dictName);
275 
276  if (!thermoPtr)
277  {
279  << "Isentropic pressure calculation requires a "
280  << "thermodynamics package"
281  << exit(FatalError);
282  }
283 
284  const volScalarField gamma(thermoPtr->gamma());
285  const volScalarField Mb
286  (
287  mag(lookupObject<volVectorField>(UName_))
288  /sqrt(gamma*tp.ref()/thermoPtr->rho())
289  );
290 
291  result += tp*(pow(1 + (gamma - 1)/2*sqr(Mb), gamma/(gamma - 1)));
292  return tresult;
293  }
294 
295  return tresult;
296 }
297 
298 
299 Foam::tmp<Foam::volScalarField> Foam::functionObjects::pressure::coeff
300 (
301  const tmp<volScalarField>& tp
302 ) const
303 {
304  if (mode_ & COEFF)
305  {
306  tmp<volScalarField> tpCoeff(tp.ptr());
307  volScalarField& pCoeff = tpCoeff.ref();
308 
309  pCoeff -= dimensionedScalar("pInf", dimPressure, pInf_);
310 
311  const dimensionedScalar pSmall("pSmall", dimPressure, SMALL);
312  const dimensionedVector U("U", dimVelocity, UInf_);
313  const dimensionedScalar rho("rho", dimDensity, rhoInf_);
314 
315  pCoeff /= 0.5*rho*magSqr(U) + pSmall;
316 
317  return tpCoeff;
318  }
319 
320  return std::move(tp);
321 }
322 
323 
324 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
325 
326 bool Foam::functionObjects::pressure::calc()
327 {
328  if (foundObject<volScalarField>(fieldName_))
329  {
330  const volScalarField& p = lookupObject<volScalarField>(fieldName_);
331 
332  auto tp = tmp<volScalarField>::New
333  (
334  IOobject
335  (
336  resultName_,
337  p.mesh().time().timeName(),
338  p.mesh(),
342  ),
343  coeff(calcPressure(p, rhoScale(p)))
344  );
345 
346  return store(resultName_, tp);
347  }
348 
349  return false;
350 }
351 
352 
353 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
354 
356 (
357  const word& name,
358  const Time& runTime,
359  const dictionary& dict
360 )
361 :
363  mode_(STATIC),
364  hydrostaticMode_(NONE),
365  UName_("U"),
366  rhoName_("rho"),
367  pRef_(0),
368  pInf_(0),
369  UInf_(Zero),
370  rhoInf_(1),
371  rhoInfInitialised_(false),
372  g_(dimAcceleration),
373  gInitialised_(false),
374  hRef_(dimLength),
375  hRefInitialised_(false)
376 {
377  read(dict);
378 }
379 
380 
381 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
382 
384 {
385  Info<< type() << " " << name() << ":" << nl;
386 
388 
389  UName_ = dict.getOrDefault<word>("U", "U");
390  rhoName_ = dict.getOrDefault<word>("rho", "rho");
391 
392  if (rhoName_ == "rhoInf")
393  {
394  dict.readEntry("rhoInf", rhoInf_);
395  rhoInfInitialised_ = true;
396  }
397 
398  if (!modeNames.readIfPresent("mode", dict, mode_))
399  {
400  // Backwards compatibility
401  // - check for the presence of 'calcTotal' and 'calcCoeff'
402 
403  bool calcTotal =
404  dict.getOrDefaultCompat<bool>("mode", {{"calcTotal", 1812}}, false);
405  bool calcCoeff =
406  dict.getOrDefaultCompat<bool>("mode", {{"calcCoeff", 1812}}, false);
407 
408  if (calcTotal)
409  {
410  mode_ = TOTAL;
411  }
412  else
413  {
414  mode_ = STATIC;
415  }
416 
417  if (calcCoeff)
418  {
419  mode_ = static_cast<mode>(COEFF | mode_);
420  }
421  }
422 
423  Info<< " Operating mode: " << modeNames[mode_] << nl;
424 
425  pRef_ = dict.getOrDefault<scalar>("pRef", 0);
426 
427  if
428  (
429  hydrostaticModeNames.readIfPresent
430  (
431  "hydrostaticMode",
432  dict,
433  hydrostaticMode_
434  )
435  && hydrostaticMode_
436  )
437  {
438  Info<< " Hydrostatic mode: "
439  << hydrostaticModeNames[hydrostaticMode_]
440  << nl;
441  gInitialised_ = dict.readIfPresent("g", g_);
442  hRefInitialised_ = dict.readIfPresent("hRef", hRef_);
443  }
444  else
445  {
446  Info<< " Not including hydrostatic effects" << nl;
447  }
448 
449 
450  if (mode_ & COEFF)
451  {
452  dict.readEntry("pInf", pInf_);
453  dict.readEntry("UInf", UInf_);
454  dict.readEntry("rhoInf", rhoInf_);
455 
456  const scalar zeroCheck = 0.5*rhoInf_*magSqr(UInf_) + pInf_;
457 
458  if (mag(zeroCheck) < ROOTVSMALL)
459  {
461  << type() << " " << name() << ": "
462  << "Coefficient calculation requested, but reference "
463  << "pressure level is zero. Please check the supplied "
464  << "values of pInf, UInf and rhoInf" << endl;
465  }
466 
467  rhoInfInitialised_ = true;
468  }
469 
470  resultName_ = dict.getOrDefault<word>("result", resultName());
471 
472  Info<< endl;
473 
474  return true;
475 }
476 
477 
478 // ************************************************************************* //
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:129
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:598
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:50
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:531
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:349
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 expressions::valueTypeCode::INVALID.
Definition: exprTraits.C:127
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:376
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
Definition: tmp.H:206
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...
Definition: error.H:64
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:204
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:127
const dimensionSet dimVelocity