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 | Copyright (C) 2011-2015 OpenFOAM Foundation
6  \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
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 \*---------------------------------------------------------------------------*/
25 
26 #include "fieldAverageItem.H"
27 #include "volFields.H"
28 #include "surfaceFields.H"
29 #include "OFstream.H"
30 
31 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
32 
33 template<class Type>
35 {
36  faItems_[fieldI].active() = true;
37 
38  const word& fieldName = faItems_[fieldI].fieldName();
39  const word& meanFieldName = faItems_[fieldI].meanFieldName();
40 
41  if (log_) Info << " Reading/initialising field " << meanFieldName << endl;
42 
43  if (obr_.foundObject<Type>(meanFieldName))
44  {
45  // do nothing
46  }
47  else if (obr_.found(meanFieldName))
48  {
49  if (log_) Info
50  << " Cannot allocate average field " << meanFieldName
51  << " since an object with that name already exists."
52  << " Disabling averaging for field." << endl;
53 
54  faItems_[fieldI].mean() = false;
55  }
56  else
57  {
58  const Type& baseField = obr_.lookupObject<Type>(fieldName);
59 
60  // Store on registry
61  obr_.store
62  (
63  new Type
64  (
65  IOobject
66  (
67  meanFieldName,
69  obr_,
74  ),
75  1*baseField
76  )
77  );
78  }
79 }
80 
81 
82 template<class Type>
84 {
85  if (faItems_[fieldI].mean())
86  {
89 
90  const word& fieldName = faItems_[fieldI].fieldName();
91 
92  if (obr_.foundObject<volFieldType>(fieldName))
93  {
94  addMeanFieldType<volFieldType>(fieldI);
95  }
96  else if (obr_.foundObject<surfFieldType>(fieldName))
97  {
98  addMeanFieldType<surfFieldType>(fieldI);
99  }
100  }
101 }
102 
103 
104 template<class Type1, class Type2>
106 {
107  const word& fieldName = faItems_[fieldI].fieldName();
108  const word& meanFieldName = faItems_[fieldI].meanFieldName();
109  const word& prime2MeanFieldName = faItems_[fieldI].prime2MeanFieldName();
110 
111  if (log_) Info
112  << " Reading/initialising field " << prime2MeanFieldName << endl;
113 
114  if (obr_.foundObject<Type2>(prime2MeanFieldName))
115  {
116  // do nothing
117  }
118  else if (obr_.found(prime2MeanFieldName))
119  {
120  if (log_) Info
121  << " Cannot allocate average field " << prime2MeanFieldName
122  << " since an object with that name already exists."
123  << " Disabling averaging for field." << endl;
124 
125  faItems_[fieldI].prime2Mean() = false;
126  }
127  else
128  {
129  const Type1& baseField = obr_.lookupObject<Type1>(fieldName);
130  const Type1& meanField = obr_.lookupObject<Type1>(meanFieldName);
131 
132  // Store on registry
133  obr_.store
134  (
135  new Type2
136  (
137  IOobject
138  (
139  prime2MeanFieldName,
140  obr_.time().timeName(obr_.time().startTime().value()),
141  obr_,
142  resetOnOutput_
146  ),
147  sqr(baseField) - sqr(meanField)
148  )
149  );
150  }
151 }
152 
153 
154 template<class Type1, class Type2>
156 {
157  typedef GeometricField<Type1, fvPatchField, volMesh> volFieldType1;
159 
160  typedef GeometricField<Type2, fvPatchField, volMesh> volFieldType2;
162 
163  if (faItems_[fieldI].prime2Mean())
164  {
165  const word& fieldName = faItems_[fieldI].fieldName();
166 
167  if (!faItems_[fieldI].mean())
168  {
170  << "To calculate the prime-squared average, the "
171  << "mean average must also be selected for field "
172  << fieldName << nl << exit(FatalError);
173  }
174 
175  if (obr_.foundObject<volFieldType1>(fieldName))
176  {
177  addPrime2MeanFieldType<volFieldType1, volFieldType2>(fieldI);
178  }
179  else if (obr_.foundObject<surfFieldType1>(fieldName))
180  {
181  addPrime2MeanFieldType<surfFieldType1, surfFieldType2>(fieldI);
182  }
183  }
184 }
185 
186 
187 template<class Type>
189 {
190  const word& fieldName = faItems_[fieldI].fieldName();
191 
192  if (obr_.foundObject<Type>(fieldName))
193  {
194  const Type& baseField = obr_.lookupObject<Type>(fieldName);
195 
196  Type& meanField = const_cast<Type&>
197  (
198  obr_.lookupObject<Type>(faItems_[fieldI].meanFieldName())
199  );
200 
201  scalar dt = obr_.time().deltaTValue();
202  scalar Dt = totalTime_[fieldI];
203 
204  if (faItems_[fieldI].iterBase())
205  {
206  dt = 1.0;
207  Dt = scalar(totalIter_[fieldI]);
208  }
209 
210  scalar alpha = (Dt - dt)/Dt;
211  scalar beta = dt/Dt;
212 
213  if (faItems_[fieldI].window() > 0)
214  {
215  const scalar w = faItems_[fieldI].window();
216 
217  if (Dt - dt >= w)
218  {
219  alpha = (w - dt)/w;
220  beta = dt/w;
221  }
222  }
223 
224  meanField = alpha*meanField + beta*baseField;
225  }
226 }
227 
228 
229 template<class Type>
231 {
232  typedef GeometricField<Type, fvPatchField, volMesh> volFieldType;
234 
235  forAll(faItems_, i)
236  {
237  if (faItems_[i].mean())
238  {
239  calculateMeanFieldType<volFieldType>(i);
240  calculateMeanFieldType<surfFieldType>(i);
241  }
242  }
243 }
244 
245 
246 template<class Type1, class Type2>
248 {
249  const word& fieldName = faItems_[fieldI].fieldName();
250 
251  if (obr_.foundObject<Type1>(fieldName))
252  {
253  const Type1& baseField = obr_.lookupObject<Type1>(fieldName);
254  const Type1& meanField =
255  obr_.lookupObject<Type1>(faItems_[fieldI].meanFieldName());
256 
257  Type2& prime2MeanField = const_cast<Type2&>
258  (
259  obr_.lookupObject<Type2>(faItems_[fieldI].prime2MeanFieldName())
260  );
261 
262  scalar dt = obr_.time().deltaTValue();
263  scalar Dt = totalTime_[fieldI];
264 
265  if (faItems_[fieldI].iterBase())
266  {
267  dt = 1.0;
268  Dt = scalar(totalIter_[fieldI]);
269  }
270 
271  scalar alpha = (Dt - dt)/Dt;
272  scalar beta = dt/Dt;
273 
274  if (faItems_[fieldI].window() > 0)
275  {
276  const scalar w = faItems_[fieldI].window();
277 
278  if (Dt - dt >= w)
279  {
280  alpha = (w - dt)/w;
281  beta = dt/w;
282  }
283  }
284 
285  prime2MeanField =
286  alpha*prime2MeanField
287  + beta*sqr(baseField)
288  - sqr(meanField);
289  }
290 }
291 
292 
293 template<class Type1, class Type2>
295 {
296  typedef GeometricField<Type1, fvPatchField, volMesh> volFieldType1;
298 
299  typedef GeometricField<Type2, fvPatchField, volMesh> volFieldType2;
301 
302  forAll(faItems_, i)
303  {
304  if (faItems_[i].prime2Mean())
305  {
306  calculatePrime2MeanFieldType<volFieldType1, volFieldType2>(i);
307  calculatePrime2MeanFieldType<surfFieldType1, surfFieldType2>(i);
308  }
309  }
310 }
311 
312 
313 template<class Type1, class Type2>
315 {
316  const word& fieldName = faItems_[fieldI].fieldName();
317 
318  if (obr_.foundObject<Type1>(fieldName))
319  {
320  const Type1& meanField =
321  obr_.lookupObject<Type1>(faItems_[fieldI].meanFieldName());
322 
323  Type2& prime2MeanField = const_cast<Type2&>
324  (
325  obr_.lookupObject<Type2>(faItems_[fieldI].prime2MeanFieldName())
326  );
327 
328  prime2MeanField += sqr(meanField);
329  }
330 }
331 
332 
333 template<class Type1, class Type2>
335 {
336  typedef GeometricField<Type1, fvPatchField, volMesh> volFieldType1;
338 
339  typedef GeometricField<Type2, fvPatchField, volMesh> volFieldType2;
341 
342  forAll(faItems_, i)
343  {
344  if (faItems_[i].prime2Mean())
345  {
346  addMeanSqrToPrime2MeanType<volFieldType1, volFieldType2>(i);
347  addMeanSqrToPrime2MeanType<surfFieldType1, surfFieldType2>(i);
348  }
349  }
350 }
351 
352 
353 template<class Type>
354 void Foam::fieldAverage::writeFieldType(const word& fieldName) const
355 {
356  if (obr_.foundObject<Type>(fieldName))
357  {
358  const Type& f = obr_.lookupObject<Type>(fieldName);
359  f.write();
360  }
361 }
362 
363 
364 template<class Type>
366 {
367  typedef GeometricField<Type, fvPatchField, volMesh> volFieldType;
369 
370  forAll(faItems_, i)
371  {
372  if (faItems_[i].mean())
373  {
374  const word& fieldName = faItems_[i].meanFieldName();
375  writeFieldType<volFieldType>(fieldName);
376  writeFieldType<surfFieldType>(fieldName);
377  }
378  if (faItems_[i].prime2Mean())
379  {
380  const word& fieldName = faItems_[i].prime2MeanFieldName();
381  writeFieldType<volFieldType>(fieldName);
382  writeFieldType<surfFieldType>(fieldName);
383  }
384  }
385 }
386 
387 
388 // ************************************************************************* //
volFields.H
beta
dimensionedScalar beta("beta", dimless/dimTemperature, laminarTransport)
Foam::IOobject
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:91
Foam::fieldAverage::faItems_
List< fieldAverageItem > faItems_
List of field average items, describing what averages to be.
Definition: fieldAverage.H:200
w
volScalarField w(IOobject("w", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE), mesh, dimensionedScalar("w", dimensionSet(0, 0, 0, 0, 0, 0, 0), 0.0))
Foam::word
A class for handling words, derived from string.
Definition: word.H:59
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:406
Foam::fieldAverage::calculatePrime2MeanFields
void calculatePrime2MeanFields() const
Calculate prime-squared average fields.
Definition: fieldAverageTemplates.C:294
Foam::constant::atomic::alpha
const dimensionedScalar alpha
Fine-structure constant: default SI units: [].
Definition: readThermalProperties.H:216
Foam::objectRegistry::time
const Time & time() const
Return time.
Definition: objectRegistry.H:117
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
surfaceFields.H
Foam::surfaceFields.
Foam::dimensioned::value
const Type & value() const
Return const reference to value.
Definition: dimensionedType.C:261
Foam::fieldAverage::log_
Switch log_
Switch to send output to Info as well as to file.
Definition: fieldAverage.H:193
Foam::fieldAverage::writeFieldType
void writeFieldType(const word &fieldName) const
Write fields.
Definition: fieldAverageTemplates.C:354
Foam::IOobject::NO_WRITE
@ NO_WRITE
Definition: IOobject.H:118
OFstream.H
Foam::fieldAverage::addPrime2MeanField
void addPrime2MeanField(const label fieldI)
Add prime-squared average field to database.
Definition: fieldAverageTemplates.C:155
Foam::label
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
Foam::IOobject::NO_READ
@ NO_READ
Definition: IOobject.H:111
Foam::nl
static const char nl
Definition: Ostream.H:260
Foam::Info
messageStream Info
fieldAverageItem.H
Foam::fieldAverage::writeFields
void writeFields() const
Write fields.
Definition: fieldAverageTemplates.C:365
Foam::fieldAverage::addMeanField
void addMeanField(const label fieldI)
Add mean average field to database.
Definition: fieldAverageTemplates.C:83
Foam::FatalError
error FatalError
Foam::fieldAverage::addMeanSqrToPrime2MeanType
void addMeanSqrToPrime2MeanType(const label fieldI) const
Add mean-squared field value to prime-squared mean field.
Definition: fieldAverageTemplates.C:314
Foam::HashTable::found
bool found(const Key &) const
Return true if hashedEntry is found in table.
Definition: HashTable.C:109
Foam::fieldAverage::obr_
const objectRegistry & obr_
Reference to the database.
Definition: fieldAverage.H:181
Foam::fieldAverage::addMeanSqrToPrime2Mean
void addMeanSqrToPrime2Mean() const
Add mean-squared field value to prime-squared mean field.
Definition: fieldAverageTemplates.C:334
Foam::exit
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
Foam::fieldAverage::addMeanFieldType
void addMeanFieldType(const label fieldI)
Add mean average field to database.
Definition: fieldAverageTemplates.C:34
Foam::objectRegistry::foundObject
bool foundObject(const word &name) const
Is the named Type found?
Definition: objectRegistryTemplates.C:142
Foam::regIOobject::store
void store()
Transfer ownership of this object to its registry.
Definition: regIOobjectI.H:34
FatalErrorInFunction
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:318
Foam::sqr
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Definition: dimensionedSymmTensor.C:49
f
labelList f(nPoints)
Foam::Time::timeName
static word timeName(const scalar, const int precision=precision_)
Return time name of given scalar time.
Definition: Time.C:741
Foam::fieldAverage::addPrime2MeanFieldType
void addPrime2MeanFieldType(const label fieldI)
Add prime-squared average field to database.
Definition: fieldAverageTemplates.C:105
Foam::fieldAverage::calculateMeanFields
void calculateMeanFields() const
Calculate mean average fields.
Definition: fieldAverageTemplates.C:230
Foam::fieldAverage::calculatePrime2MeanFieldType
void calculatePrime2MeanFieldType(const label fieldI) const
Calculate prime-squared average fields.
Definition: fieldAverageTemplates.C:247
Foam::objectRegistry::lookupObject
const Type & lookupObject(const word &name) const
Lookup and return the object of the given Type.
Definition: objectRegistryTemplates.C:165
Foam::GeometricField
Generic GeometricField class.
Definition: surfaceFieldsFwd.H:52
Foam::IOobject::READ_IF_PRESENT
@ READ_IF_PRESENT
Definition: IOobject.H:110
Foam::fieldAverage::calculateMeanFieldType
void calculateMeanFieldType(const label fieldI) const
Calculate mean average fields.
Definition: fieldAverageTemplates.C:188
Foam::Time::startTime
virtual dimensionedScalar startTime() const
Return start time.
Definition: Time.C:872
Foam::fieldAverage::resetOnOutput_
Switch resetOnOutput_
Reset the averaging process on output flag.
Definition: fieldAverage.H:190