fieldAverageTemplates.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) 2011-2017 OpenFOAM Foundation
9  Copyright (C) 2015-2019 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 "fieldAverageItem.H"
30 #include "volFields.H"
31 #include "surfaceFields.H"
32 #include "polySurfaceFields.H"
33 #include "OFstream.H"
34 
35 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
36 
37 template<class Type>
39 (
40  fieldAverageItem& item
41 )
42 {
43  const word& fieldName = item.fieldName();
44 
45  if (!foundObject<Type>(fieldName))
46  {
47  return;
48  }
49 
50  // Field has been found, so set active flag to true
51  item.active() = true;
52 
53  const word& meanFieldName = item.meanFieldName();
54 
55  Log << " Reading/initialising field " << meanFieldName << endl;
56 
57  if (foundObject<Type>(meanFieldName))
58  {}
59  else if (obr().found(meanFieldName))
60  {
61  Log << " Cannot allocate average field " << meanFieldName
62  << " since an object with that name already exists."
63  << " Disabling averaging for field." << endl;
64 
65  item.mean() = false;
66  }
67  else
68  {
69  const Type& baseField = lookupObject<Type>(fieldName);
70 
71  // Store on registry
72  obr().store
73  (
74  new Type
75  (
76  IOobject
77  (
78  meanFieldName,
79  obr().time().timeName(obr().time().startTime().value()),
80  obr(),
81  (
82  restartOnOutput_
83  ? IOobject::NO_READ
84  : IOobject::READ_IF_PRESENT
85  ),
86  IOobject::NO_WRITE
87  ),
88  1*baseField
89  )
90  );
91  }
92 }
93 
94 
95 template<class Type>
97 (
98  fieldAverageItem& item
99 )
100 {
101  typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
102  typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
103  typedef DimensionedField<Type, polySurfaceGeoMesh> SurfFieldType;
104 
105  if (item.mean())
106  {
107  addMeanFieldType<VolFieldType>(item);
108  addMeanFieldType<SurfaceFieldType>(item);
109  addMeanFieldType<SurfFieldType>(item);
110  }
111 }
112 
113 
114 template<class Type>
116 (
117  const fieldAverageItem& item
118 )
119 {
120  if (restartOnOutput_)
121  {
122  return;
123  }
124 
125  const word& fieldName = item.fieldName();
126 
127  const Type* fieldPtr = findObject<Type>(fieldName);
128 
129  if (!fieldPtr)
130  {
131  return;
132  }
133 
135 
136  forAllConstIters(fieldNames, fieldIter)
137  {
138  const word& name = fieldIter();
139 
140  IOobject io
141  (
142  name,
143  obr().time().timeName(obr().time().startTime().value()),
144  obr(),
145  IOobject::MUST_READ,
146  IOobject::NO_WRITE
147  );
148 
149  if (io.typeHeaderOk<Type>(true))
150  {
151  DebugInfo << "Read and store: " << name << endl;
152  obr().store(new Type(io, fieldPtr->mesh()));
153  }
154  else
155  {
157  << "Unable to read window " << Type::typeName << " " << name
158  << ". Averaging restart behaviour may be compromised"
159  << endl;
160  }
161  }
162 }
163 
164 
165 template<class Type>
167 (
168  const fieldAverageItem& item
169 )
170 {
171  typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
172  typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
173  typedef DimensionedField<Type, polySurfaceGeoMesh> SurfFieldType;
174 
175  if (item.window() > 0)
176  {
177  restoreWindowFieldsType<VolFieldType>(item);
178  restoreWindowFieldsType<SurfaceFieldType>(item);
179  restoreWindowFieldsType<SurfFieldType>(item);
180  }
181 }
182 
183 
184 template<class Type1, class Type2>
186 (
187  fieldAverageItem& item
188 )
189 {
190  const word& fieldName = item.fieldName();
191 
192  if (!foundObject<Type1>(fieldName))
193  {
194  return;
195  }
196 
197  const word& meanFieldName = item.meanFieldName();
198  const word& prime2MeanFieldName = item.prime2MeanFieldName();
199 
200  Log << " Reading/initialising field " << prime2MeanFieldName << nl;
201 
202  if (foundObject<Type2>(prime2MeanFieldName))
203  {}
204  else if (obr().found(prime2MeanFieldName))
205  {
206  Log << " Cannot allocate average field " << prime2MeanFieldName
207  << " since an object with that name already exists."
208  << " Disabling averaging for field." << endl;
209 
210  item.prime2Mean() = false;
211  }
212  else
213  {
214  const Type1& baseField = lookupObject<Type1>(fieldName);
215  const Type1& meanField = lookupObject<Type1>(meanFieldName);
216 
217  // Store on registry
218  obr().store
219  (
220  new Type2
221  (
222  IOobject
223  (
224  prime2MeanFieldName,
225  obr().time().timeName(obr().time().startTime().value()),
226  obr(),
227  restartOnOutput_?
228  IOobject::NO_READ
229  : IOobject::READ_IF_PRESENT,
230  IOobject::NO_WRITE
231  ),
232  sqr(baseField) - sqr(meanField)
233  )
234  );
235  }
236 }
237 
238 
239 template<class Type1, class Type2>
241 (
242  fieldAverageItem& item
243 )
244 {
245  typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1;
246  typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1;
247  typedef DimensionedField<Type1, polySurfaceGeoMesh> SurfFieldType1;
248 
249  typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2;
250  typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2;
251  typedef DimensionedField<Type2, polySurfaceGeoMesh> SurfFieldType2;
252 
253  if (item.prime2Mean())
254  {
255  if (!item.mean())
256  {
258  << "To calculate the prime-squared average, the "
259  << "mean average must also be selected for field "
260  << item.fieldName() << nl << exit(FatalError);
261  }
262 
263  addPrime2MeanFieldType<VolFieldType1, VolFieldType2>(item);
264  addPrime2MeanFieldType<SurfaceFieldType1, SurfaceFieldType2>(item);
265  addPrime2MeanFieldType<SurfFieldType1, SurfFieldType2>(item);
266  }
267 }
268 
269 
270 template<class Type>
272 (
273  fieldAverageItem& item
274 )
275 {
276  const word& fieldName = item.fieldName();
277  if (!foundObject<Type>(fieldName))
278  {
279  return;
280  }
281 
282  const Type& baseField = lookupObject<Type>(fieldName);
283 
284  const word windowFieldName = item.windowFieldName(this->name());
285 
286  // Store on registry
287  obr().store
288  (
289  new Type
290  (
291  IOobject
292  (
293  windowFieldName,
294  obr().time().timeName(obr().time().startTime().value()),
295  obr(),
296  restartOnOutput_ ?
297  IOobject::NO_READ
298  : IOobject::READ_IF_PRESENT,
299  IOobject::NO_WRITE
300  ),
301  1*baseField
302  )
303  );
304 
305  DebugInfo << "Create and store: " << windowFieldName << endl;
306 
307  item.addToWindow(windowFieldName, obr().time().deltaTValue());
308 }
309 
310 
311 template<class Type>
313 {
314  typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
315  typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
316  typedef DimensionedField<Type, polySurfaceGeoMesh> SurfFieldType;
317 
318  for (fieldAverageItem& item : faItems_)
319  {
320  if (item.storeWindowFields())
321  {
322  storeWindowFieldType<VolFieldType>(item);
323  storeWindowFieldType<SurfaceFieldType>(item);
324  storeWindowFieldType<SurfFieldType>(item);
325  }
326  }
327 }
328 
329 
330 template<class Type>
332 {
333  typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
334  typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
335  typedef DimensionedField<Type, polySurfaceGeoMesh> SurfFieldType;
336 
337  for (const fieldAverageItem& item : faItems_)
338  {
339  item.calculateMeanField<VolFieldType>(obr());
340  item.calculateMeanField<SurfaceFieldType>(obr());
341  item.calculateMeanField<SurfFieldType>(obr());
342  }
343 }
344 
345 
346 template<class Type1, class Type2>
348 {
349  typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1;
350  typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1;
351  typedef DimensionedField<Type1, polySurfaceGeoMesh> SurfFieldType1;
352 
353  typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2;
354  typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2;
355  typedef DimensionedField<Type2, polySurfaceGeoMesh> SurfFieldType2;
356 
357  for (const fieldAverageItem& item : faItems_)
358  {
359  item.calculatePrime2MeanField<VolFieldType1, VolFieldType2>(obr());
360  item.calculatePrime2MeanField<SurfaceFieldType1, SurfaceFieldType2>
361  (
362  obr()
363  );
364  item.calculatePrime2MeanField<SurfFieldType1, SurfFieldType2>(obr());
365  }
366 }
367 
368 
369 template<class Type1, class Type2>
371 (
372  const fieldAverageItem& item
373 ) const
374 {
375  const word& fieldName = item.fieldName();
376 
377  if (!foundObject<Type1>(fieldName))
378  {
379  return;
380  }
381 
382  const Type1& meanField = lookupObject<Type1>(item.meanFieldName());
383 
384  Type2& prime2MeanField = lookupObjectRef<Type2>(item.prime2MeanFieldName());
385 
386  prime2MeanField += sqr(meanField);
387 }
388 
389 
390 template<class Type1, class Type2>
392 {
393  typedef GeometricField<Type1, fvPatchField, volMesh> VolFieldType1;
394  typedef GeometricField<Type1, fvsPatchField, surfaceMesh> SurfaceFieldType1;
395  typedef DimensionedField<Type1, polySurfaceGeoMesh> SurfFieldType1;
396 
397  typedef GeometricField<Type2, fvPatchField, volMesh> VolFieldType2;
398  typedef GeometricField<Type2, fvsPatchField, surfaceMesh> SurfaceFieldType2;
399  typedef DimensionedField<Type2, polySurfaceGeoMesh> SurfFieldType2;
400 
401  for (const fieldAverageItem& item : faItems_)
402  {
403  if (item.prime2Mean())
404  {
405  addMeanSqrToPrime2MeanType<VolFieldType1, VolFieldType2>(item);
406  addMeanSqrToPrime2MeanType<SurfaceFieldType1, SurfaceFieldType2>
407  (
408  item
409  );
410  addMeanSqrToPrime2MeanType<SurfFieldType1, SurfFieldType2>(item);
411  }
412  }
413 }
414 
415 
416 template<class Type>
418 (
419  const word& fieldName
420 ) const
421 {
422  if (foundObject<Type>(fieldName))
423  {
424  const Type& f = lookupObject<Type>(fieldName);
425  f.write();
426  }
427 }
428 
429 
430 template<class Type>
432 {
433  typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType;
434  typedef GeometricField<Type, fvsPatchField, surfaceMesh> SurfaceFieldType;
435  typedef DimensionedField<Type, polySurfaceGeoMesh> SurfFieldType;
436 
437  for (const fieldAverageItem& item : faItems_)
438  {
439  if (item.mean())
440  {
441  const word& fieldName = item.meanFieldName();
442  writeFieldType<VolFieldType>(fieldName);
443  writeFieldType<SurfaceFieldType>(fieldName);
444  writeFieldType<SurfFieldType>(fieldName);
445  }
446 
447  if (item.prime2Mean())
448  {
449  const word& fieldName = item.prime2MeanFieldName();
450  writeFieldType<VolFieldType>(fieldName);
451  writeFieldType<SurfaceFieldType>(fieldName);
452  writeFieldType<SurfFieldType>(fieldName);
453  }
454 
455  if (item.writeWindowFields())
456  {
458  forAllConstIters(fieldNames, fieldNameIter)
459  {
460  const word& fieldName = fieldNameIter();
461  writeFieldType<VolFieldType>(fieldName);
462  writeFieldType<SurfaceFieldType>(fieldName);
463  writeFieldType<SurfFieldType>(fieldName);
464  }
465  }
466  }
467 }
468 
469 
470 // ************************************************************************* //
Foam::functionObjects::fieldAverage::addPrime2MeanFieldType
void addPrime2MeanFieldType(fieldAverageItem &item)
Add prime-squared average field to database.
Definition: fieldAverageTemplates.C:186
volFields.H
Foam::IOobject
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition: IOobject.H:169
Foam::functionObjects::fieldAverageItem::calculatePrime2MeanField
bool calculatePrime2MeanField(const objectRegistry &obr) const
Calculate prime-squared average fields.
Definition: fieldAverageItemTemplates.C:168
Log
#define Log
Definition: PDRblock.C:35
Foam::functionObjects::fieldAverage::calculateMeanFields
void calculateMeanFields() const
Calculate mean average fields.
Definition: fieldAverageTemplates.C:331
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:65
Foam::functionObjects::fieldAverage::restoreWindowFieldsType
void restoreWindowFieldsType(const fieldAverageItem &item)
Definition: fieldAverageTemplates.C:116
polySurfaceFields.H
Fields for polySurface.
Foam::IOobject::typeHeaderOk
bool typeHeaderOk(const bool checkType=true, const bool search=true, const bool verbose=true)
Read header (uses typeFilePath to find file) and check its info.
Definition: IOobjectTemplates.C:39
Foam::functionObjects::fieldAverage::storeWindowFieldType
void storeWindowFieldType(fieldAverageItem &item)
Definition: fieldAverageTemplates.C:272
Foam::functionObjects::fieldAverageItem::writeWindowFields
bool writeWindowFields() const
Return true if we wish to write window fields.
Definition: fieldAverageItemI.H:245
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:369
surfaceFields.H
Foam::surfaceFields.
Foam::functionObjects::fieldAverage::addMeanSqrToPrime2MeanType
void addMeanSqrToPrime2MeanType(const fieldAverageItem &item) const
Add mean-squared field value to prime-squared mean field.
Definition: fieldAverageTemplates.C:371
Foam::functionObjects::fieldAverage::writeFieldType
void writeFieldType(const word &fieldName) const
Write fields.
Definition: fieldAverageTemplates.C:418
Foam::functionObjects::fieldAverage::calculatePrime2MeanFields
void calculatePrime2MeanFields() const
Calculate prime-squared average fields.
Definition: fieldAverageTemplates.C:347
Foam::functionObjects::fieldAverageItem::fieldName
const word & fieldName() const
Return const access to the field name.
Definition: fieldAverageItemI.H:42
Foam::functionObjects::fieldAverageItem::storeWindowFields
bool storeWindowFields() const
Return true if we wish to store window fields.
Definition: fieldAverageItemI.H:239
OFstream.H
Foam::functionObjects::fieldAverageItem::addToWindow
void addToWindow(const word &fieldName, const scalar deltaT)
Add field to window.
Definition: fieldAverageItem.C:124
Foam::functionObjects::fieldAverageItem::meanFieldName
const word & meanFieldName() const
Return const access to the mean field name.
Definition: fieldAverageItemI.H:61
Foam::functionObjects::fieldAverage::addPrime2MeanField
void addPrime2MeanField(fieldAverageItem &item)
Add prime-squared average field to database.
Definition: fieldAverageTemplates.C:241
Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean
void addMeanSqrToPrime2Mean() const
Add mean-squared field value to prime-squared mean field.
Definition: fieldAverageTemplates.C:391
Foam::functionObjects::fieldAverage::writeFields
void writeFields() const
Write fields.
Definition: fieldAverageTemplates.C:431
fieldAverageItem.H
Foam::functionObjects::fieldAverageItem::mean
bool mean() const
Return const access to the mean flag.
Definition: fieldAverageItemI.H:48
timeName
word timeName
Definition: getTimeIndex.H:3
Foam::FatalError
error FatalError
fieldNames
const wordRes fieldNames(propsDict.getOrDefault< wordRes >("fields", wordRes()))
Foam::functionObjects::fieldAverage::addMeanField
void addMeanField(fieldAverageItem &item)
Add mean average field to database.
Definition: fieldAverageTemplates.C:97
Foam::functionObjects::fieldAverageItem::active
bool active() const
Return const access to the active flag.
Definition: fieldAverageItemI.H:30
Foam::exit
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:130
found
bool found
Definition: TABSMDCalcMethod2.H:32
Foam::functionObjects::fieldAverageItem
Helper class to describe what form of averaging to apply. A set will be applied to each base field in...
Definition: fieldAverageItem.H:159
FatalErrorInFunction
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:453
Foam::sqr
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Definition: dimensionedSymmTensor.C:51
DebugInfo
#define DebugInfo
Report an information message using Foam::Info.
Definition: messageStream.H:382
Foam::functionObjects::fieldAverage::restoreWindowFields
void restoreWindowFields(const fieldAverageItem &item)
Definition: fieldAverageTemplates.C:167
Foam::nl
constexpr char nl
Definition: Ostream.H:404
forAllConstIters
forAllConstIters(mixture.phases(), phase)
Definition: pEqn.H:28
f
labelList f(nPoints)
Foam::functionObjects::fieldAverageItem::prime2Mean
bool prime2Mean() const
Return const access to the prime-squared mean flag.
Definition: fieldAverageItemI.H:76
Foam::functionObjects::fieldAverageItem::window
scalar window() const
Return the window length (iterations or seconds)
Definition: fieldAverageItemI.H:122
Foam::functionObjects::fieldAverage::addMeanFieldType
void addMeanFieldType(fieldAverageItem &item)
Add mean average field to database.
Definition: fieldAverageTemplates.C:39
Foam::functionObjects::fieldAverageItem::prime2MeanFieldName
const word & prime2MeanFieldName() const
Return const access to the prime-squared mean field name.
Definition: fieldAverageItemI.H:89
Foam::name
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
Definition: exprTraits.C:59
startTime
Foam::label startTime
Definition: checkTimeOptions.H:1
Foam::functionObjects::fieldAverageItem::calculateMeanField
bool calculateMeanField(const objectRegistry &obr) const
Calculate the mean field value.
Definition: fieldAverageItemTemplates.C:33
Foam::functionObjects::fieldAverageItem::windowFieldNames
const FIFOStack< word > & windowFieldNames() const
Return the list of window field names (windowType = EXACT)
Definition: fieldAverageItemI.H:142
Foam::FIFOStack
A FIFO stack based on a singly-linked list.
Definition: FIFOStack.H:51
Foam::GeometricField< Type, fvPatchField, volMesh >
Foam::functionObjects::fieldAverage::faItems_
List< fieldAverageItem > faItems_
List of field average items, describing what averages to be.
Definition: fieldAverage.H:290
WarningInFunction
#define WarningInFunction
Report a warning using Foam::Warning.
Definition: messageStream.H:328
Foam::functionObjects::fieldAverageItem::windowFieldName
word windowFieldName(const word &prefix) const
Helper function to construct a window field name.
Definition: fieldAverageItemI.H:206
Foam::DimensionedField
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Definition: DimensionedField.H:54
Foam::functionObjects::fieldAverage::storeWindowFields
void storeWindowFields()
Definition: fieldAverageTemplates.C:312