functionObject.H
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-2016 OpenFOAM Foundation
9  Copyright (C) 2017-2021 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 Namespace
28  Foam::functionObjects
29 
30 Description
31  Function objects are OpenFOAM utilities to ease workflow configurations and
32  enhance workflows by producing additional user-requested data both during
33  runtime and postprocessing calculations, typically in the form of
34  additional logging to the screen, or generating text, image and field files.
35 
36  Function objects eliminate the need to store all runtime generated data,
37  hence saving considerable resources. Furthermore, function objects are
38  readily applied to batch-driven processes, improving reliability by
39  standardising the sequence of operations and reducing the amount of manual
40  interaction.
41 
42  In addition, the output of most function objects, e.g. output fields, are
43  stored on the mesh database so that it can be retrieved and used for other
44  applications (e.g. directly using \c wallShearStress function object output
45  in \c fieldAverage function object to produce \c wallShearStressMean field).
46 
47  \section secFunctionObjects Using function objects
48 
49  Function objects can be executed by using two methods:
50 
51  - \c functions sub-dictionary in the \c system/controlDict file
52  - \c postProcess command-line utility
53 
54  For the first method, each selected function object should be listed inside
55  \c functions sub-dictionary of the \c system/controlDict file as a nested
56  sub-dictionary, typically as in the following example:
57 
58  \verbatim
59  functions // sub-dictionary name under the system/controlDict file
60  {
61  ..optional entries..
62 
63  <dictName1>
64  {
65  // Mandatory entries
66  type <functionObjectTypeName>;
67  libs (<libType>FunctionObjects);
68 
69  // Mandatory entries defined in <functionObjectType>
70  ...
71 
72  // Optional entries defined in <functionObjectType>
73  ...
74 
75  // Optional (inherited) entries
76  region region0;
77  enabled true;
78  log true;
79  timeStart 0;
80  timeEnd 1000;
81  executeControl timeStep;
82  executeInterval 1;
83  writeControl timeStep;
84  writeInterval 1;
85  }
86 
87  <dictName2>
88  {
89  ...
90  }
91 
92  ...
93 
94  <dictNameN>
95  {
96  ...
97  }
98  }
99  \endverbatim
100 
101  where the entries mean:
102  \table
103  Property | Description | Type | Reqd | Deflt
104  type | Type name of function object | word | yes | -
105  libs | Library name(s) for implementation | words | no | -
106  enabled | Switch to turn function object on/off | bool | no | true
107  errors | Error handling (default/warn/ignore/strict) | word | no | inherits
108  log | Switch to write log info to standard output | bool | no | true
109  useNamePrefix | Add scoping prefix to names | bool | no | inherits
110  region | Name of region for multi-region cases | word | no | region0
111  timeStart | Start time for function object execution | scalar | no | 0
112  timeEnd | End time for function object execution | scalar | no | inf
113  executeControl | See time controls below | word | no | timeStep
114  executeInterval | Steps/time between execute phases | label | no | 1
115  writeControl | See time controls below | word | no | timeStep
116  writeInterval | Steps/time between write phases | label | no | 1
117  \endtable
118 
119  If the \c errors entry is missing, it uses the value (if any)
120  specified within the top-level functionObjectList.
121 
122  If the \c useNamePrefix entry is missing, it uses the value (if any)
123  specified within the top-level functionObjectList or otherwise
124  uses the current value of functionObject::defaultUseNamePrefix
125 
126  Time controls:
127  \table
128  Option | Description
129  none | Trigger is disabled
130  timeStep | Trigger every 'Interval' time-steps
131  writeTime | Trigger every 'Interval' output times
132  runTime | Trigger every 'Interval' run time period
133  adjustableRunTime | Currently identical to "runTime"
134  clockTime | Trigger every 'Interval' clock time period
135  cpuTime | Trigger every 'Interval' CPU time period
136  onEnd | Trigger on end of simulation run
137  \endtable
138 
139  The sub-dictionary name \c <userDefinedSubDictName> is chosen by the user,
140  and is typically used as the name of the output directory for any data
141  written by the function object.
142 
143  As the base mandatory entries, the \c type entry defines the type of
144  function object properties that follow. Function objects are packaged into
145  separate libraries for flexibility and the \c libs entry is used to specify
146  which library should be loaded.
147 
148  Each function object has two separate run phases:
149 
150  - The \c execute phase is meant to be used for updating calculations
151  or for management tasks.
152  - The \c write phase is meant for writing the calculated data to disk.
153 
154  For each phase the respective time controls are provided, as listed above.
155 
156 
157  The second method of executing function objects is to use \c postProcess
158  utility.
159 
160  When specified without additional arguments, the \c postProcess utility
161  executes all function objects defined in the \c system/controlDict file
162  for all time directories:
163 
164  \verbatim
165  postProcess
166  \endverbatim
167 
168  Most function objects can be invoked directly without the need to specify
169  the input dictionary using the \c -func option, e.g. to execute the Courant
170  number function object:
171 
172  \verbatim
173  postProcess -func CourantNo
174  \endverbatim
175 
176  In addition, the \c -postProcess option is available to all solvers,
177  and operates similarly to the stand-alone \c postProcess utility.
178  For example, having completed a \c simpleFoam calculation, the following
179  will execute all function objects defined in the \c system/controlDict file
180  for all time directories:
181 
182  \verbatim
183  simpleFoam -postProcess
184  \endverbatim
185 
186 Class
187  Foam::functionObject
188 
189 Description
190  Abstract base-class for Time/database function objects.
191 
192 See also
193  - Foam::functionObjectList
194  - Foam::functionObjects::timeControl
195 
196 SourceFiles
197  functionObject.C
198 
199 \*---------------------------------------------------------------------------*/
200 
201 #ifndef functionObject_H
202 #define functionObject_H
203 
204 #include "typeInfo.H"
205 #include "autoPtr.H"
206 #include "runTimeSelectionTables.H"
207 
208 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
209 
210 namespace Foam
211 {
212 
213 // Forward Declarations
214 class Time;
215 class polyMesh;
216 class mapPolyMesh;
217 
218 /*---------------------------------------------------------------------------*\
219  Class functionObject Declaration
220 \*---------------------------------------------------------------------------*/
221 
222 class functionObject
223 {
224  // Private Data
225 
226  //- Function object name
227  const word name_;
228 
229  //- Flag to indicate that names should be prefixed
230  bool useNamePrefix_;
231 
232 
233 protected:
234 
235  // Protected Member Functions
236 
237  //- Return a scoped (prefixed) name
238  // Used to construct local field names, controlled by useNamePrefix_
239  word scopedName(const word& name) const;
240 
241 
242 public:
243 
244  // Forward Declarations
245  class unavailableFunctionObject;
246 
247 
248  // Public Data
249 
250  //- Flag to write log into Info
251  bool log;
252 
253 
254  // Static Data Members
255 
256  //- Flag to execute debug content
257  static int debug;
258 
259  //- Global post-processing mode switch
260  static bool postProcess;
261 
262  //- Global default for useNamePrefix
263  static bool defaultUseNamePrefix;
264 
265  //- Directory prefix
266  static word outputPrefix;
267 
268 
269  // Declare run-time constructor selection tables
270 
272  (
273  autoPtr,
275  dictionary,
276  (const word& name, const Time& runTime, const dictionary& dict),
277  (name, runTime, dict)
278  );
279 
280 
281  // Constructors
282 
283  //- Construct from components
284  explicit functionObject
285  (
286  const word& name,
287  const bool withNamePrefix = defaultUseNamePrefix
288  );
289 
290  //- Return clone
291  autoPtr<functionObject> clone() const
292  {
294  return nullptr;
295  }
296 
297 
298  // Selectors
299 
300  //- Select from dictionary, based on its "type" entry
301  static autoPtr<functionObject> New
302  (
303  const word& name,
304  const Time& runTime,
305  const dictionary& dict
306  );
307 
308 
309  //- Destructor
310  virtual ~functionObject() = default;
311 
312 
313  // Member Functions
314 
315  //- Runtime type information
316  virtual const word& type() const = 0;
317 
318  //- Return the name of this functionObject
319  const word& name() const noexcept;
320 
321  //- Return the flag for adding a scoping name prefix
322  bool useNamePrefix() const noexcept;
323 
324  //- Modify the flag for adding a scoping name prefix
325  // \return previous value.
326  bool useNamePrefix(bool on) noexcept;
327 
328  //- Read and set the function object if its data have changed
329  virtual bool read(const dictionary& dict);
330 
331  //- Called at each ++ or += of the time-loop.
332  // postProcess overrides the usual executeControl behaviour and
333  // forces execution (used in post-processing mode)
334  virtual bool execute() = 0;
335 
336  //- Execute using the specified subIndex.
337  // The base implementation is a no-op.
338  // \param subIndex an execution sub-index corresponding to a
339  // sub-cycle or something similar.
340  virtual bool execute(const label subIndex);
341 
342  //- Called at each ++ or += of the time-loop.
343  // postProcess overrides the usual writeControl behaviour and
344  // forces writing always (used in post-processing mode)
345  virtual bool write() = 0;
346 
347  //- Called when Time::run() determines that the time-loop exits.
348  // The base implementation is a no-op.
349  virtual bool end();
350 
351  //- Called at the end of Time::adjustDeltaT() if adjustTime is true
352  virtual bool adjustTimeStep();
353 
354  //- Did any file get changed during execution?
355  virtual bool filesModified() const;
356 
357  //- Update for changes of mesh
358  // The base implementation is a no-op.
359  virtual void updateMesh(const mapPolyMesh& mpm);
360 
361  //- Update for changes of mesh
362  // The base implementation is a no-op.
363  virtual void movePoints(const polyMesh& mesh);
364 };
365 
366 
367 /*---------------------------------------------------------------------------*\
368  Class functionObject::unavailableFunctionObject Declaration
369 \*---------------------------------------------------------------------------*/
370 
371 //- Abstract functionObject to report when a real version is unavailable.
373 :
374  public functionObject
375 {
376 protected:
377 
378  //- Construct with name
379  explicit unavailableFunctionObject(const word& name);
380 
381  //- Report it is unavailable, emitting a FatalError for try/catch
382  //- in the caller
383  void carp(std::string message = "") const;
384 
385 
386 public:
387 
388  // Member Functions
389 
390  //- No nothing
391  virtual bool execute();
392 
393  //- No nothing
394  virtual bool write();
395 };
396 
397 
398 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
399 
400 } // End namespace Foam
401 
402 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
403 
404 #endif
405 
406 // ************************************************************************* //
runTime
engineTime & runTime
Definition: createEngineTime.H:13
Foam::functionObject::execute
virtual bool execute()=0
Called at each ++ or += of the time-loop.
Foam::Time
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Definition: Time.H:73
Foam::functionObject::write
virtual bool write()=0
Called at each ++ or += of the time-loop.
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:65
typeInfo.H
Foam::functionObject::New
static autoPtr< functionObject > New(const word &name, const Time &runTime, const dictionary &dict)
Select from dictionary, based on its "type" entry.
Definition: functionObject.C:79
Foam::functionObject::functionObject
functionObject(const word &name, const bool withNamePrefix=defaultUseNamePrefix)
Construct from components.
Definition: functionObject.C:65
Foam::polyMesh
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:77
Foam::functionObject
Abstract base-class for Time/database function objects.
Definition: functionObject.H:332
Foam::functionObject::declareRunTimeSelectionTable
declareRunTimeSelectionTable(autoPtr, functionObject, dictionary,(const word &name, const Time &runTime, const dictionary &dict),(name, runTime, dict))
NotImplemented
#define NotImplemented
Issue a FatalErrorIn for a function not currently implemented.
Definition: error.H:517
Foam::functionObject::defaultUseNamePrefix
static bool defaultUseNamePrefix
Global default for useNamePrefix.
Definition: functionObject.H:373
Foam::functionObject::~functionObject
virtual ~functionObject()=default
Destructor.
Foam::functionObject::postProcess
static bool postProcess
Global post-processing mode switch.
Definition: functionObject.H:370
Foam::functionObject::read
virtual bool read(const dictionary &dict)
Read and set the function object if its data have changed.
Definition: functionObject.C:163
Foam::functionObject::outputPrefix
static word outputPrefix
Directory prefix.
Definition: functionObject.H:376
Foam::functionObject::clone
autoPtr< functionObject > clone() const
Return clone.
Definition: functionObject.H:401
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:123
Foam::functionObject::adjustTimeStep
virtual bool adjustTimeStep()
Called at the end of Time::adjustDeltaT() if adjustTime is true.
Definition: functionObject.C:198
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:6
Foam
Namespace for OpenFOAM.
Definition: atmBoundaryLayer.C:33
Foam::functionObject::movePoints
virtual void movePoints(const polyMesh &mesh)
Update for changes of mesh.
Definition: functionObject.C:214
Foam::functionObject::end
virtual bool end()
Called when Time::run() determines that the time-loop exits.
Definition: functionObject.C:192
Foam::functionObject::scopedName
word scopedName(const word &name) const
Return a scoped (prefixed) name.
Definition: functionObject.C:51
Foam::autoPtr
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
Definition: HashPtrTable.H:53
Foam::functionObject::updateMesh
virtual void updateMesh(const mapPolyMesh &mpm)
Update for changes of mesh.
Definition: functionObject.C:210
Foam::functionObject::unavailableFunctionObject
Abstract functionObject to report when a real version is unavailable.
Definition: functionObject.H:482
Foam::functionObject::name
const word & name() const noexcept
Return the name of this functionObject.
Definition: functionObject.C:143
Foam::functionObject::debug
static int debug
Flag to execute debug content.
Definition: functionObject.H:367
runTimeSelectionTables.H
Macros to ease declaration of run-time selection tables.
Foam::functionObject::type
virtual const word & type() const =0
Runtime type information.
Foam::functionObject::useNamePrefix
bool useNamePrefix() const noexcept
Return the flag for adding a scoping name prefix.
Definition: functionObject.C:149
Foam::functionObject::filesModified
virtual bool filesModified() const
Did any file get changed during execution?
Definition: functionObject.C:204
Foam::mapPolyMesh
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
Definition: mapPolyMesh.H:161
Foam::functionObject::log
bool log
Flag to write log into Info.
Definition: functionObject.H:355
autoPtr.H