54bool Foam::expressions::fvExprDriver::cacheSets_ =
true;
56const Foam::fvMesh* Foam::expressions::fvExprDriver::defaultMeshPtr_ =
nullptr;
66 <<
"No default mesh set" <<
nl
67 <<
"Try the 'fvExprDriverFunctionObject' as a workaround"
72 return *defaultMeshPtr_;
82 const fvMesh* ptr = defaultMeshPtr_;
84 if (force || (ptr !=
nullptr))
86 defaultMeshPtr_ = &
mesh;
105 specialVariablesIndex_(-1),
118 globalScopes_(rhs.globalScopes_),
119 delayedVariables_(rhs.delayedVariables_),
120 storedVariables_(rhs.storedVariables_),
121 specialVariablesIndex_(rhs.specialVariablesIndex_),
136 specialVariablesIndex_(-1),
157 expressions::exprDriver::readDict(
dict);
171 dict.readIfPresent(
"globalScopes", globalScopes_);
173 const entry* eptr =
nullptr;
186 if (writer_ && !storedVariables_.empty())
190 <<
"The 'storedVariables' was already read."
191 <<
" No update from " << is
199 dict.checkITstream(is,
"storedVariables");
212 if (writer_ && !delayedVariables_.empty())
216 <<
"Seems like 'delayedVariables' was already read."
217 <<
" No update from " << is
225 dict.checkITstream(is,
"delayedVariables");
227 for (
auto& var : inputs)
229 delayedVariables_.insert(var.name(), var);
242 const bool updated = this->
update();
244 const label eventIndex =
mesh().time().timeIndex();
245 const scalar eventTime =
mesh().time().value();
248 <<
"fvExprDriver::updateSpecialVariables(force="
249 << force <<
") Updated: " << updated <<
endl;
251 if (specialVariablesIndex_ < 0)
254 <<
"First update: " << eventIndex <<
endl;
256 specialVariablesIndex_ = eventIndex;
261 << v.name() <<
" = " << v.initialValueExpression()
263 << v.hasValue() <<
")" <<
endl;
268 <<
"First value: " << v.initialValueExpression()
269 <<
" -> " << v.name() <<
endl;
271 parse(v.initialValueExpression());
274 <<
"Parser size: " << this->size() <<
nl
275 <<
"Calculated: " << result_ <<
nl
276 <<
"Stored: " << v <<
nl;
281 if (force || specialVariablesIndex_ != eventIndex)
284 <<
"Store variables: " << force <<
' '
285 << specialVariablesIndex_ <<
' '
286 << eventIndex <<
endl;
290 if (variables_.found(v.name()))
293 <<
"Storing variable: " << v.name() <<
" "
294 << variables_[v.name()] <<
endl;
296 v = variables_[v.name()];
299 specialVariablesIndex_ = eventIndex;
305 <<
"Updating delayed variable " << iter().name() <<
endl;
307 if (!iter().updateReadValue(eventTime))
309 const exprString& expr = iter().startupValueExpression();
312 <<
"Evaluate: " << expr <<
endl;
315 iter().setReadValue(result_);
318 <<
"Value " << iter() <<
nl
319 <<
"Type " << iter().valueType() <<
"("
320 << result_.valueType() <<
")" <<
endl;
325 << iter().name() <<
" updated without problem" <<
endl;
334 <<
"Clearing variables" <<
endl;
336 const scalar eventTime =
mesh().time().value();
340 updateSpecialVariables();
344 variables_.insert(v.name(), v);
347 addVariables(variableStrings_,
false);
351 iter().storeValue(eventTime);
364 if (!allowShadowing_ && objPtr)
369 <<
") is shadowed by a variable of the same name." <<
nl
370 <<
"This may lead to trouble" <<
nl
371 <<
"If this is OK set 'allowShadowing'"
372 <<
" in the relevant parser" <<
nl
377 result_.testIfSingleValue();
380 <<
"Evaluating: " << expr <<
" -> " << varName <<
endl
385 if (delayedVariables_.found(varName))
388 variables_.erase(varName);
391 << varName <<
" is delayed" <<
endl;
394 delayedVariables_[varName] = result_;
412 <<
"Evaluating remote " << remote.c_str()
413 <<
" : " << expr <<
" -> " << varName <<
endl;
415 word driverType(
"patch");
418 const auto slashPos = remote.find(
'/');
419 if (slashPos != std::string::npos)
422 remote.resize(slashPos);
425 const auto quotePos = remote.find(
'\'');
426 if (quotePos != std::string::npos)
438 driverType ==
"patch"
442 || identName ==
"volume"
443 || identName ==
"internalField"
447 driverType =
"internalField";
452 if (!regionName.empty())
465 <<
"Call other with ("
466 << driverType <<
", " << identName <<
", " <<
regionName <<
")\n";
471 otherDriver->setSearchBehaviour(*
this);
472 otherDriver->setGlobalScopes(this->globalScopes_);
474 otherDriver->parse(expr);
476 exprResult otherResult(this->getRemoteResult(*otherDriver));
485 <<
"Remote result: " << otherResult <<
nl;
488 if (delayedVariables_.found(varName))
491 variables_.erase(varName);
494 << varName <<
" is delayed - setting" <<
nl;
497 delayedVariables_[varName] = std::move(otherResult);
502 variables_.set(varName, std::move(otherResult));
527 if (!
meshPtr && readIfNecessary)
531 <<
" not in memory. Loading it" <<
endl;
538 mesh.time().constant(),
560 const word& fieldName
563 return getHeaderClassName(this->
mesh(), fieldName);
572 if (searchRegistry())
578 return ioptr->type();
584 return getHeaderClassName(this->
mesh(), name);
616 if (
mesh().cellZones().findZoneID(setName) >= 0)
621 if (
mesh().faceZones().findZoneID(setName) >= 0)
626 if (
mesh().pointZones().findZoneID(setName) >= 0)
638 auto setType = topoZoneType(setName);
642 setType = topoSetType(setName);
655 == topoSetType(setName)
665 == topoSetType(setName)
675 == topoSetType(setName)
682 return (
mesh().cellZones().findZoneID(
name) >= 0);
688 return (
mesh().faceZones().findZoneID(
name) >= 0);
694 return (
mesh().pointZones().findZoneID(
name) >= 0);
710 return (!storedVariables_.empty() || !delayedVariables_.empty());
719 dict.readIfPresent(
"storedVariables", storedVariables_);
732 if (storedVariables_.size())
734 driver.updateSpecialVariables(
true);
736 dict.add(
"storedVariables", storedVariables_);
Defines the attributes of an object for which implicit objectRegistry management is supported,...
const word & headerClassName() const noexcept
Return name of the class name read from header.
An input stream of tokens.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
static autoPtr< Time > New()
Construct (dummy) Time - no functionObjects or libraries.
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
A collection of cell labels.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
A keyword and a list of tokens is an 'entry'.
virtual ITstream & stream() const =0
Return token stream, if entry is a primitive entry.
Base driver for parsing (field) values.
searchControls
Search/caching controls.
virtual bool update()
Update things.
const dictionary & dict() const noexcept
The dictionary with all input data/specification.
An exprResult with persistence.
A polymorphic field/result from evaluating an expression.
void testIfSingleValue(const bool parRun=Pstream::parRun())
Test if field corresponds to a single-value and thus uniform.
bool isUniform() const
True if single, uniform value.
Base driver for parsing value expressions associated with an fvMesh.
bool isPointSet(const word &name) const
Test if name is a known pointSet.
bool isFaceSet(const word &name) const
Test if name is a known faceSet.
virtual void updateSpecialVariables(bool force=false)
Examine current variable values and update stored variables.
virtual void prepareData(dictionary &dict) const
virtual bool hasDataToWrite() const
Do we need a data file to be written.
const exprResult & lookupGlobal(const word &name) const
Return the global variable if available or a null result.
static const fvMesh & defaultMesh()
Get the default mesh, if one is defined.
bool isCellSet(const word &name) const
Test if name is a known cellSet.
bool isPointZone(const word &name) const
Test if name is a known pointZone.
virtual void evaluateVariableRemote(string remote, const word &varName, const expressions::exprString &expr)
topoSetSource::sourceType topoZoneType(const word &name) const
Return cell/face/point zone type or unknown.
virtual bool readDict(const dictionary &dict)
Read variables, tables etc.
word getFieldClassName(const word &name) const
Lookup the field class name (memory or read from disk)
bool isCellZone(const word &name) const
Test if name is a known cellZone.
bool isFaceZone(const word &name) const
Test if name is a known faceZone.
virtual void evaluateVariable(const word &varName, const expressions::exprString &expr)
topoSetSource::sourceType topoSetType(const word &name) const
Return cell/face/point set type or unknown.
virtual ~fvExprDriver()
Destructor.
virtual void clearVariables()
Clear temporary variables, reset from expression strings.
static const fvMesh * resetDefaultMesh(const fvMesh &mesh, const bool force=false)
Set the default mesh (if not already set)
topoSetSource::sourceType topoSourceType(const word &name) const
Return cell/face/point zone/set type or unknown.
virtual void getData(const dictionary &dict)
Read data from dictionary, normally via the reader/writer.
word getTypeOfField(const word &fieldName) const
Read the IOobject for fieldName and return its headerClassName.
const fvMesh & regionMesh() const
Return region mesh.
Mesh data needed to do the Finite Volume discretisation.
const Time & time() const
Return the top-level database.
virtual void validate()
Validate the turbulence fields after construction.
const Type * cfindObject(const word &name, const bool recursive=false) const
Return const pointer to the object of the given Type.
regIOobject is an abstract class derived from IOobject to handle automatic object registration with t...
sourceType
Enumeration defining the types of sources.
@ POINTSET_SOURCE
Points as set.
@ FACESET_SOURCE
Faces as set.
@ FACEZONE_SOURCE
Faces as zone.
@ UNKNOWN_SOURCE
Placeholder.
@ POINTZONE_SOURCE
Points as zone.
@ CELLSET_SOURCE
Cells as set.
@ CELLZONE_SOURCE
Cells as zone.
static IOobject findIOobject(const polyMesh &mesh, const word &name, readOption r=MUST_READ, writeOption w=NO_WRITE)
Find IOobject in the polyMesh/sets (used as constructor helper)
A class for handling words, derived from Foam::string.
static const word null
An empty word.
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Foam::autoPtr< Foam::dynamicFvMesh > meshPtr
Foam::word regionName(Foam::polyMesh::defaultRegion)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
IOobject io("surfaceFilmProperties", mesh.time().constant(), mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, false)
#define DebugInfo
Report an information message using Foam::Info.
#define WarningInFunction
Report a warning using Foam::Warning.
#define DebugInFunction
Report an information message using Foam::Info.
Ostream & endl(Ostream &os)
Add newline and flush stream.
errorManip< error > abort(error &err)
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
errorManipArg< error, int > exit(error &err, const int errNo=1)
fileName search(const word &file, const fileName &directory)
Recursively search the given directory for the file.
constexpr char nl
The newline '\n' character (0x0a)
#define defineRunTimeSelectionTable(baseType, argNames)
Define run-time selection table.
#define forAllIters(container, iter)
Iterate across all elements in the container object.