35 namespace functionObjects
49 if (faItems_[i].mean())
51 if (obr_.found(faItems_[i].meanFieldName()))
53 obr_.checkOut(*obr_[faItems_[i].meanFieldName()]);
57 if (faItems_[i].prime2Mean())
59 if (obr_.found(faItems_[i].prime2MeanFieldName()))
61 obr_.checkOut(*obr_[faItems_[i].prime2MeanFieldName()]);
75 addMeanField<scalar>(fieldi);
76 addMeanField<vector>(fieldi);
77 addMeanField<sphericalTensor>(fieldi);
78 addMeanField<symmTensor>(fieldi);
79 addMeanField<tensor>(fieldi);
85 addPrime2MeanField<scalar, scalar>(fieldi);
86 addPrime2MeanField<vector, symmTensor>(fieldi);
99 <<
" Restarting averaging at time " << obr_.time().timeName()
103 totalIter_.setSize(faItems_.size(), 1);
106 totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue());
119 const label currentTimeIndex = obr_.time().timeIndex();
120 const scalar currentTime = obr_.time().value();
122 if (prevTimeIndex_ == currentTimeIndex)
128 prevTimeIndex_ = currentTimeIndex;
131 if (periodicRestart_ && currentTime > restartPeriod_*periodIndex_)
139 <<
" Calculating averages" <<
nl;
141 addMeanSqrToPrime2Mean<scalar, scalar>();
142 addMeanSqrToPrime2Mean<vector, symmTensor>();
144 calculateMeanFields<scalar>();
145 calculateMeanFields<vector>();
146 calculateMeanFields<sphericalTensor>();
147 calculateMeanFields<symmTensor>();
148 calculateMeanFields<tensor>();
150 calculatePrime2MeanFields<scalar, scalar>();
151 calculatePrime2MeanFields<vector, symmTensor>();
155 totalIter_[fieldi]++;
156 totalTime_[fieldi] += obr_.time().deltaTValue();
165 Log <<
" Writing average fields" <<
endl;
167 writeFields<scalar>();
168 writeFields<vector>();
169 writeFields<sphericalTensor>();
170 writeFields<symmTensor>();
171 writeFields<tensor>();
183 name() +
"Properties",
184 obr_.time().timeName(),
195 const word& fieldName = faItems_[fieldi].fieldName();
197 propsDict.
subDict(fieldName).
add(
"totalIter", totalIter_[fieldi]);
198 propsDict.
subDict(fieldName).
add(
"totalTime", totalTime_[fieldi]);
201 propsDict.regIOobject::write();
210 totalIter_.setSize(faItems_.size(), 1);
213 totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue());
215 if ((restartOnRestart_ || restartOnOutput_) &&
log)
217 Info<<
" Starting averaging at time " << obr_.time().timeName()
224 name() +
"Properties",
225 obr_.time().timeName(obr_.time().startTime().value()),
236 <<
" Starting averaging at time " 237 << obr_.time().timeName() <<
nl;
244 Log <<
" Restarting averaging for fields:" <<
nl;
248 const word& fieldName = faItems_[fieldi].fieldName();
249 if (propsDict.
found(fieldName))
253 totalIter_[fieldi] =
readLabel(fieldDict.lookup(
"totalIter"));
254 totalTime_[fieldi] =
readScalar(fieldDict.lookup(
"totalTime"));
258 <<
" iters = " << totalIter_[fieldi]
259 <<
" time = " << totalTime_[fieldi] <<
nl;
277 restartOnRestart_(
false),
278 restartOnOutput_(
false),
279 periodicRestart_(
false),
280 restartPeriod_(GREAT),
303 initialised_ =
false;
310 dict.
lookup(
"fields") >> faItems_;
312 if (periodicRestart_)
314 dict.
lookup(
"restartPeriod") >> restartPeriod_;
317 readAveragingProperties();
336 writeAveragingProperties();
338 if (restartOnOutput_)
virtual bool read(const dictionary &)
Read the field average data.
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
fieldAverage(const fieldAverage &)
Disallow default bitwise copy construct.
dimensionedScalar log(const dimensionedScalar &ds)
A list of keyword definitions, which are a keyword followed by any number of values (e...
virtual bool write()
Write the field averages.
const dictionary & subDict(const word &) const
Find and return a sub-dictionary.
IOdictionary propsDict(IOobject("particleTrackProperties", runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED))
Ostream & endl(Ostream &os)
Add newline and flush stream.
virtual bool execute()
Calculate the field averages.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Macros for easy insertion into run-time selection tables.
bool add(entry *, bool mergeEntry=false)
Add a new entry.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
virtual void writeAverages() const
Write averages.
virtual bool read(const dictionary &)
Read optional controls.
bool read(const char *, int32_t &)
void writeAveragingProperties() const
Write averaging properties - steps and time.
void readAveragingProperties()
Read averaging properties - steps and time.
A class for handling words, derived from string.
bool readIfPresent(const word &, T &, bool recursive=false, bool patternMatch=true) const
Find an entry if present, and assign to T.
virtual void calcAverages()
Main calculation routine.
bool found(const word &, bool recursive=false, bool patternMatch=true) const
Search dictionary for given keyword.
bool readScalar(const char *buf, doubleScalar &s)
Read whole of buf as a scalar. Return true if succesful.
label readLabel(Istream &is)
word name(const complex &)
Return a string representation of a complex.
void initialize()
Reset lists (clear existing values) and initialize averaging.
fileName::Type type(const fileName &)
Return the file type: DIRECTORY or FILE.
addToRunTimeSelectionTable(functionObject, blendingFactor, dictionary)
void resetFields()
Checkout fields (causes deletion) from the database.
void restart()
Restart averaging for restartOnOutput.
#define Log
Report write to Foam::Info if the local log switch is true.
bool headerOk()
Read and check header info.
Specialization of Foam::functionObject for an Foam::fvMesh, providing a reference to the Foam::fvMesh...
defineTypeNameAndDebug(fvMeshFunctionObject, 0)
virtual ~fieldAverage()
Destructor.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.