volFieldValue.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) 2017-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 "volFieldValue.H"
30 #include "fvMesh.H"
31 #include "volFields.H"
33 
34 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
35 
36 namespace Foam
37 {
38 namespace functionObjects
39 {
40 namespace fieldValues
41 {
42  defineTypeNameAndDebug(volFieldValue, 0);
43  addToRunTimeSelectionTable(fieldValue, volFieldValue, dictionary);
44  addToRunTimeSelectionTable(functionObject, volFieldValue, dictionary);
45 }
46 }
47 }
48 
49 const Foam::Enum
50 <
52 >
54 ({
55  // Normal operations
56  { operationType::opNone, "none" },
57  { operationType::opMin, "min" },
58  { operationType::opMax, "max" },
59  { operationType::opSum, "sum" },
60  { operationType::opSumMag, "sumMag" },
61  { operationType::opAverage, "average" },
62  { operationType::opVolAverage, "volAverage" },
63  { operationType::opVolIntegrate, "volIntegrate" },
64  { operationType::opCoV, "CoV" },
65 
66  // Using weighting
67  { operationType::opWeightedSum, "weightedSum" },
68  { operationType::opWeightedAverage, "weightedAverage" },
69  { operationType::opWeightedVolAverage, "weightedVolAverage" },
70  { operationType::opWeightedVolIntegrate, "weightedVolIntegrate" },
71 });
72 
73 const Foam::Enum
74 <
76 >
78 ({
79  { postOperationType::postOpNone, "none" },
80  { postOperationType::postOpMag, "mag" },
81  { postOperationType::postOpSqrt, "sqrt" },
82 });
83 
84 
85 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
86 
88 {
89  // Only a few operations require the cell volume
90  switch (operation_)
91  {
92  case opVolAverage:
93  case opVolIntegrate:
96  case opCoV:
97  return true;
98 
99  default:
100  return false;
101  }
102 }
103 
104 
106 {
107  // Operation specifically tagged to use mag
108  return (operation_ & typeAbsolute);
109 }
110 
111 
113 {
114  // Operation specifically tagged to require a weight field
115  return (operation_ & typeWeighted);
116 }
117 
118 
120 (
121  const scalarField& weightField
122 ) const
123 {
124  return
125  (
126  usesWeight()
127  && returnReduce(!weightField.empty(), orOp<bool>()) // On some processor
128  );
129 }
130 
131 
133 (
134  Ostream& os
135 ) const
136 {
137  volRegion::writeFileHeader(*this, os);
138  if (weightFieldName_ != "none")
139  {
140  writeHeaderValue(os, "Weight field", weightFieldName_);
141  }
142 
143  writeCommented(os, "Time");
144 
145  // TBD: add in postOperation information?
146 
147  for (const word& fieldName : fields_)
148  {
149  os << tab << operationTypeNames_[operation_]
150  << "(" << fieldName << ")";
151  }
152 
153  os << endl;
154 }
155 
156 
158 (
159  const scalarField& V,
160  const scalarField& weightField
161 )
162 {
163  label nProcessed = 0;
164 
165  for (const word& fieldName : fields_)
166  {
167  if
168  (
169  writeValues<scalar>(fieldName, V, weightField)
170  || writeValues<vector>(fieldName, V, weightField)
171  || writeValues<sphericalTensor>(fieldName, V, weightField)
172  || writeValues<symmTensor>(fieldName, V, weightField)
173  || writeValues<tensor>(fieldName, V, weightField)
174  )
175  {
176  ++nProcessed;
177  }
178  else
179  {
181  << "Requested field " << fieldName
182  << " not found in database and not processed"
183  << endl;
184  }
185  }
186 
187  return nProcessed;
188 }
189 
190 
191 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
192 
194 (
195  const word& name,
196  const Time& runTime,
197  const dictionary& dict
198 )
199 :
200  fieldValue(name, runTime, dict, typeName),
202  operation_(operationTypeNames_.get("operation", dict)),
203  postOperation_
204  (
205  postOperationTypeNames_.getOrDefault
206  (
207  "postOperation",
208  dict,
209  postOperationType::postOpNone,
210  true // Failsafe behaviour
211  )
212  ),
213  weightFieldName_("none")
214 {
215  read(dict);
216  writeFileHeader(file());
217 }
218 
219 
221 (
222  const word& name,
223  const objectRegistry& obr,
224  const dictionary& dict
225 )
226 :
227  fieldValue(name, obr, dict, typeName),
229  operation_(operationTypeNames_.get("operation", dict)),
230  postOperation_
231  (
232  postOperationTypeNames_.getOrDefault
233  (
234  "postOperation",
235  dict,
236  postOperationType::postOpNone,
237  true // Failsafe behaviour
238  )
239  ),
240  weightFieldName_("none")
241 {
242  read(dict);
243 }
244 
245 
246 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
247 
249 (
250  const dictionary& dict
251 )
252 {
254 
255  weightFieldName_ = "none";
256 
257  if (usesWeight())
258  {
259  if (dict.readIfPresent("weightField", weightFieldName_))
260  {
261  Info<< " weight field = " << weightFieldName_;
262  }
263  else
264  {
265  // Suggest possible alternative unweighted operation?
267  << "The '" << operationTypeNames_[operation_]
268  << "' operation is missing a weightField." << nl
269  << "Either provide the weightField, "
270  << "use weightField 'none' to suppress weighting," << nl
271  << "or use a different operation."
272  << exit(FatalIOError);
273  }
274  }
275 
276  Info<< nl << endl;
277 
278  return true;
279 }
280 
281 
283 {
284  volRegion::update(); // Ensure cached values are valid
285 
287 
288  if (Pstream::master())
289  {
290  writeCurrentTime(file());
291  }
292 
293  // Only some operations need the cell volume
294  scalarField V;
295  if (usesVol())
296  {
297  V = filterField(fieldValue::mesh_.V());
298  }
299 
300  // Weight field - zero-size means weight = 1
301  scalarField weightField;
302  if (weightFieldName_ != "none")
303  {
304  weightField = getFieldValues<scalar>(weightFieldName_, true);
305  }
306 
307  writeAll(V, weightField);
308 
309  if (Pstream::master())
310  {
311  file()<< endl;
312  }
313 
314  Log << endl;
315 
316  return true;
317 }
318 
319 
320 // ************************************************************************* //
volFields.H
runTime
engineTime & runTime
Definition: createEngineTime.H:13
Foam::Enum
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
Definition: IOstreamOption.H:57
Log
#define Log
Definition: PDRblock.C:34
Foam::Time
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Definition: Time.H:73
Foam::functionObjects::fieldValues::addToRunTimeSelectionTable
addToRunTimeSelectionTable(functionObject, fieldValueDelta, dictionary)
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:62
Foam::functionObjects::fieldValue::read
virtual bool read(const dictionary &dict)
Read from dictionary.
Definition: fieldValue.C:89
Foam::functionObjects::fieldValues::volFieldValue::usesWeight
bool usesWeight() const
True if the operation variant uses a weight-field.
Definition: volFieldValue.C:112
Foam::functionObjects::volRegion::update
bool update()
Update the cached values as required.
Definition: volRegion.C:228
Foam::returnReduce
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
Definition: PstreamReduceOps.H:94
Foam::functionObjects::volRegion
Volume (cell) region selection class.
Definition: volRegion.H:115
Foam::functionObjects::fieldValues::volFieldValue::postOperationType
postOperationType
Post-operation type enumeration.
Definition: volFieldValue.H:321
Foam::functionObjects::fieldValues::volFieldValue::volFieldValue
volFieldValue(const word &name, const Time &runTime, const dictionary &dict)
Construct from name, Time and dictionary.
Definition: volFieldValue.C:194
volFieldValue.H
Foam::functionObjects::fieldValues::volFieldValue::opWeightedVolIntegrate
Weighted volume integral.
Definition: volFieldValue.H:311
Foam::read
bool read(const char *buf, int32_t &val)
Same as readInt32.
Definition: int32.H:107
Foam::functionObjects::fieldValues::defineTypeNameAndDebug
defineTypeNameAndDebug(fieldValueDelta, 0)
Foam::FatalIOError
IOerror FatalIOError
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:350
Foam::functionObjects::fieldValues::volFieldValue::read
virtual bool read(const dictionary &dict)
Read from dictionary.
Definition: volFieldValue.C:249
Foam::functionObjects::fieldValues::volFieldValue::opCoV
Coefficient of variation.
Definition: volFieldValue.H:297
Foam::functionObjects::fieldValues::volFieldValue::operation_
operationType operation_
Operation to apply to values.
Definition: volFieldValue.H:337
Foam::functionObjects::fieldValues::volFieldValue::write
virtual bool write()
Calculate and write.
Definition: volFieldValue.C:282
Foam::functionObjects::fieldValues::volFieldValue::operationType
operationType
Operation type enumeration.
Definition: volFieldValue.H:285
Foam::objectRegistry
Registry of regIOobjects.
Definition: objectRegistry.H:60
Foam::functionObjects::fieldValues::volFieldValue::postOperationTypeNames_
static const Enum< postOperationType > postOperationTypeNames_
Operation type names.
Definition: volFieldValue.H:329
Foam::Field< scalar >
Foam::Info
messageStream Info
Information stream (uses stdout - output is on the master only)
Foam::name
word name(const complex &c)
Return string representation of complex.
Definition: complex.C:76
Foam::functionObjects::fieldValues::volFieldValue::writeFileHeader
virtual void writeFileHeader(Ostream &os) const
Output file header information.
Definition: volFieldValue.C:133
Foam::functionObjects::fieldValues::volFieldValue::operationTypeNames_
static const Enum< operationType > operationTypeNames_
Operation type names.
Definition: volFieldValue.H:317
Foam::functionObjects::fieldValues::volFieldValue::usesMag
bool usesMag() const
True if the operation variant uses mag.
Definition: volFieldValue.C:105
dict
dictionary dict
Definition: searchingEngine.H:14
Foam::dictionary
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:121
addToRunTimeSelectionTable.H
Macros for easy insertion into run-time selection tables.
fvMesh.H
Foam
Namespace for OpenFOAM.
Definition: atmBoundaryLayer.C:33
Foam::exit
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:130
Foam::UPstream::master
static bool master(const label communicator=0)
Am I the master process.
Definition: UPstream.H:439
Foam::tab
constexpr char tab
Definition: Ostream.H:384
Foam::nl
constexpr char nl
Definition: Ostream.H:385
Foam::functionObjects::fieldValue
Intermediate class for handling field value-based function objects.
Definition: fieldValue.H:119
Foam::functionObjects::fvMeshFunctionObject::mesh_
const fvMesh & mesh_
Reference to the fvMesh.
Definition: fvMeshFunctionObject.H:73
Foam::functionObjects::volRegion::writeFileHeader
void writeFileHeader(const writeFile &wf, Ostream &file) const
Output file header information.
Definition: volRegion.C:123
Foam::functionObjects::fieldValues::volFieldValue::opWeightedVolAverage
Weighted volume average.
Definition: volFieldValue.H:308
Foam::functionObjects::fieldValues::volFieldValue::opVolAverage
Volume average.
Definition: volFieldValue.H:295
FatalIOErrorInFunction
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition: error.H:392
Foam::Ostream
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:56
Foam::functionObjects::fieldValue::write
virtual bool write()
Write.
Definition: fieldValue.C:113
Foam::orOp
Definition: ops.H:234
Foam::functionObjects::fieldValues::volFieldValue::canWeight
bool canWeight(const scalarField &weightField) const
True if operation variant uses a weight-field that is available.
Definition: volFieldValue.C:120
WarningInFunction
#define WarningInFunction
Report a warning using Foam::Warning.
Definition: messageStream.H:298
Foam::functionObjects::fieldValues::volFieldValue::writeAll
label writeAll(const scalarField &V, const scalarField &weightField)
Helper function to output field values.
Definition: volFieldValue.C:158
Foam::functionObjects::fieldValues::volFieldValue::opVolIntegrate
Volume integral.
Definition: volFieldValue.H:296
Foam::functionObjects::fieldValues::volFieldValue::usesVol
bool usesVol() const
True if the operation needs the cell-volume.
Definition: volFieldValue.C:87