34 void Foam::loopControl::clear()
48 void Foam::loopControl::read(
const dictionary&
dict)
59 timeStart = time_.userTimeToTime(timeStart);
64 && time_.value() >= (timeStart - 0.5*time_.deltaTValue())
71 timeEnd = time_.userTimeToTime(timeEnd);
76 && time_.value() <= (timeEnd + 0.5*time_.deltaTValue())
97 bool Foam::loopControl::checkConverged()
const 99 if (convergenceDict_.empty())
104 bool achieved =
true;
105 bool checked =
false;
107 const objectRegistry& obr = time_;
111 const fvMesh*
meshPtr =
dynamic_cast<const fvMesh*
>(iter.val());
113 const fvMesh& regionMesh = *
meshPtr;
116 regionMesh.data().solverPerformanceDict();
117 for (
const entry& dataDictEntry : solverDict)
119 const word& variableName = dataDictEntry.keyword();
121 const scalar absTol =
122 convergenceDict_.getOrDefault<scalar>(variableName, -1);
128 Pair<scalar> residuals =
136 achieved = achieved && (residuals.first() < absTol);
141 return checked && achieved;
147 Foam::loopControl::loopControl
165 Foam::loopControl::loopControl
185 Foam::loopControl::loopControl
188 const word& algorithmName,
194 fvSolution fvsol(
time_);
225 bool active = (index_ < total_);
231 converged_ = checkConverged();
235 time_.functionObjects().execute(onConverged_, index_);
241 interval_ && !(index_ % interval_)
245 time_.functionObjects().execute(onLoop_, index_);
252 if (!converged_ && !onEnd_.empty())
254 time_.functionObjects().execute(onEnd_, index_);
266 os << ctrl.
name() <<
": ";
267 if (ctrl.nCycles() && ctrl.index() <= ctrl.nCycles())
269 os << ctrl.index() <<
'/' << ctrl.nCycles();
A class for managing sub-loops referencing Time.
A list of keyword definitions, which are a keyword followed by a number of values (eg...
virtual const fileName & name() const override
Read/write access to the name of the stream.
const word dictName("faMeshDefinition")
wordRes onLoop_
Function object names to fire during the loop (at executeInterval)
label total_
The total number of cycles in the sub-cycle.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
bool loop()
True if looping is active, increments the index and executes the onLoop and onConverged functions...
static Pair< scalar > maxResidual(const fvMesh &fvmesh, const entry &dataDictEntry)
Extract maximum residual for the solver performance entry, provided the corresponding volume field is...
wordRes onEnd_
Function object names to fire when the loop exits without convergence.
Foam::autoPtr< Foam::dynamicFvMesh > meshPtr
void clear()
Clear the list, i.e. set size to zero.
A class for handling words, derived from Foam::string.
wordRes onConverged_
Function object names to fire on convergence.
label interval_
The interval to execute onLoop function-objects.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
bool readIfPresent(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX) const
Find an entry if present, and assign to T val. FatalIOError if it is found and the number of tokens i...
OBJstream os(runTime.globalPath()/outputName)
dictionary subOrEmptyDict(const word &keyword, enum keyType::option matchOpt=keyType::REGEX, const bool mandatory=false) const
Find and return a sub-dictionary as a copy, otherwise return an empty dictionary. ...
bool converged_
Convergence tests passed.
Ostream & operator<<(Ostream &, const boundaryPatch &p)
Write boundaryPatch as dictionary entries (without surrounding braces)
dictionary convergenceDict_
Dictionary for checking convergence (all regions)
~loopControl()
Destructor.
T getOrDefault(const word &keyword, const T &deflt, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T, or return the given default value. FatalIOError if it is found and the number of...
void clear()
Clear the dictionary.
A class for managing arbitrary loops with the ability to invoke function object execution.
forAllConstIters(mixture.phases(), phase)
const dictionary * findDict(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a sub-dictionary pointer if present (and it is a dictionary) otherwise return nullptr...