46 if (faItems_[i].mean())
48 if (obr_.found(faItems_[i].meanFieldName()))
50 obr_.checkOut(*obr_[faItems_[i].meanFieldName()]);
54 if (faItems_[i].prime2Mean())
56 if (obr_.found(faItems_[i].prime2MeanFieldName()))
58 obr_.checkOut(*obr_[faItems_[i].prime2MeanFieldName()]);
74 addMeanField<scalar>(fieldI);
75 addMeanField<vector>(fieldI);
76 addMeanField<sphericalTensor>(fieldI);
77 addMeanField<symmTensor>(fieldI);
78 addMeanField<tensor>(fieldI);
84 addPrime2MeanField<scalar, scalar>(fieldI);
85 addPrime2MeanField<vector, symmTensor>(fieldI);
90 if (!faItems_[fieldI].active())
92 WarningIn(
"void Foam::fieldAverage::initialize()")
93 <<
"Field " << faItems_[fieldI].fieldName()
94 <<
" not found in database for averaging";
114 const label currentTimeIndex =
115 static_cast<const fvMesh&
>(obr_).time().timeIndex();
117 if (prevTimeIndex_ == currentTimeIndex)
123 prevTimeIndex_ = currentTimeIndex;
126 Info<<
type() <<
" " << name_ <<
" output:" <<
nl;
128 Info<<
" Calculating averages" <<
nl;
130 addMeanSqrToPrime2Mean<scalar, scalar>();
131 addMeanSqrToPrime2Mean<vector, symmTensor>();
133 calculateMeanFields<scalar>();
134 calculateMeanFields<vector>();
135 calculateMeanFields<sphericalTensor>();
136 calculateMeanFields<symmTensor>();
137 calculateMeanFields<tensor>();
139 calculatePrime2MeanFields<scalar, scalar>();
140 calculatePrime2MeanFields<vector, symmTensor>();
144 totalIter_[fieldI]++;
145 totalTime_[fieldI] += obr_.time().deltaTValue();
152 Info<<
" Writing average fields" <<
endl;
154 writeFields<scalar>();
155 writeFields<vector>();
156 writeFields<sphericalTensor>();
157 writeFields<symmTensor>();
158 writeFields<tensor>();
168 "fieldAveragingProperties",
169 obr_.time().timeName(),
180 const word& fieldName = faItems_[fieldI].fieldName();
182 propsDict.
subDict(fieldName).
add(
"totalIter", totalIter_[fieldI]);
183 propsDict.
subDict(fieldName).
add(
"totalTime", totalTime_[fieldI]);
186 propsDict.regIOobject::write();
193 totalIter_.setSize(faItems_.size(), 1);
196 totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue());
198 if (resetOnRestart_ || resetOnOutput_)
200 Info<<
" Starting averaging at time " << obr_.time().timeName()
207 "fieldAveragingProperties",
208 obr_.time().timeName(obr_.time().startTime().value()),
218 Info<<
" Starting averaging at time " << obr_.time().timeName()
225 Info<<
" Restarting averaging for fields:" <<
nl;
228 const word& fieldName = faItems_[fieldI].fieldName();
229 if (propsDict.
found(fieldName))
233 totalIter_[fieldI] =
readLabel(fieldDict.lookup(
"totalIter"));
234 totalTime_[fieldI] =
readScalar(fieldDict.lookup(
"totalTime"));
235 Info<<
" " << fieldName
236 <<
" iters = " << totalIter_[fieldI]
237 <<
" time = " << totalTime_[fieldI] <<
nl;
251 const bool loadFromFiles
258 resetOnRestart_(
false),
259 resetOnOutput_(
false),
266 if (isA<fvMesh>(obr_))
275 "fieldAverage::fieldAverage" 278 "const objectRegistry&, " 279 "const dictionary&, " 282 ) <<
"No fvMesh available, deactivating " << name_ <<
nl 300 initialised_ =
false;
306 dict.
lookup(
"fields") >> faItems_;
308 readAveragingProperties();
344 writeAveragingProperties();
348 Info<<
" Restarting averaging at time " << obr_.time().timeName()
352 totalIter_.setSize(faItems_.size(), 1);
355 totalTime_.setSize(faItems_.size(), obr_.time().deltaTValue());
bool found(const word &, bool recursive=false, bool patternMatch=true) const
Search dictionary for given keyword.
fieldAverage(const fieldAverage &)
Disallow default bitwise copy construct.
Mesh data needed to do the Finite Volume discretisation.
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
virtual ~fieldAverage()
Destructor.
virtual void calcAverages()
Main calculation routine.
A class for handling words, derived from string.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
virtual void timeSet()
Called when time was set at the end of the Time::operator++.
A list of keyword definitions, which are a keyword followed by any number of values (e...
const dictionary & subDict(const word &) const
Find and return a sub-dictionary.
label readLabel(Istream &is)
void writeAveragingProperties() const
Write averaging properties - steps and time.
Ostream & endl(Ostream &os)
Add newline and flush stream.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
#define WarningIn(functionName)
Report a warning using Foam::Warning.
IOdictionary propsDict(IOobject( "particleTrackProperties", runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED ))
void readAveragingProperties()
Read averaging properties - steps and time.
bool readScalar(const char *buf, doubleScalar &s)
Read whole of buf as a scalar. Return true if succesful.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
void resetFields()
Checkout fields (causes deletion) from the database.
virtual void write()
Calculate the field average data and write.
bool add(entry *, bool mergeEntry=false)
Add a new entry.
fileName::Type type(const fileName &)
Return the file type: DIRECTORY or FILE.
Mesh consisting of general polyhedral cells.
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
Registry of regIOobjects.
void initialize()
Reset lists (clear existing values) and initialize averaging.
bool readIfPresent(const word &, T &, bool recursive=false, bool patternMatch=true) const
Find an entry if present, and assign to T.
bool read(const char *, int32_t &)
virtual void updateMesh(const mapPolyMesh &)
Update mesh.
bool headerOk()
Read and check header info.
virtual void end()
Execute the averaging at the final time-loop, currently does nothing.
virtual void writeAverages() const
Write averages.
defineTypeNameAndDebug(combustionModel, 0)
virtual void movePoints(const polyMesh &)
Move points.
virtual void read(const dictionary &)
Read the field average data.
virtual void execute()
Execute the averaging.