Go to the documentation of this file.
54 bool Foam::expressions::fvExprDriver::cacheSets_ =
true;
56 const 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;
113 specialVariablesIndex_(-1),
125 globalScopes_(rhs.globalScopes_),
126 delayedVariables_(rhs.delayedVariables_),
127 storedVariables_(rhs.storedVariables_),
128 specialVariablesIndex_(rhs.specialVariablesIndex_),
141 dict.getOrDefault(
"cacheReadFields",
false),
142 dict.getOrDefault(
"searchInMemory",
true),
143 dict.getOrDefault(
"searchFiles",
false),
178 dict.readIfPresent(
"globalScopes", globalScopes_);
180 const entry* eptr =
nullptr;
193 if (writer_ && !storedVariables_.empty())
197 <<
"The 'storedVariables' was already read."
198 <<
" No update from " << is
206 dict.checkITstream(is,
"storedVariables");
219 if (writer_ && !delayedVariables_.empty())
223 <<
"Seems like 'delayedVariables' was already read."
224 <<
" No update from " << is
232 dict.checkITstream(is,
"delayedVariables");
234 for (
auto& var : inputs)
236 delayedVariables_.insert(var.name(), var);
249 return this->
mesh().time();
267 const bool updated = this->
update();
269 const label eventIndex =
mesh().time().timeIndex();
270 const scalar eventTime =
mesh().time().value();
273 <<
"fvExprDriver::updateSpecialVariables(force="
274 << force <<
") Updated: " << updated <<
endl;
276 if (specialVariablesIndex_ < 0)
279 <<
"First update: " << eventIndex <<
endl;
281 specialVariablesIndex_ = eventIndex;
286 << v.name() <<
" = " << v.initialValueExpression()
288 << v.hasValue() <<
")" <<
endl;
293 <<
"First value: " << v.initialValueExpression()
294 <<
" -> " << v.name() <<
endl;
296 parse(v.initialValueExpression());
299 <<
"Parser size: " << this->size() <<
nl
300 <<
"Calculated: " << result_ <<
nl
301 <<
"Stored: " << v <<
nl;
306 if (force || specialVariablesIndex_ != eventIndex)
309 <<
"Store variables: " << force <<
' '
310 << specialVariablesIndex_ <<
' '
311 << eventIndex <<
endl;
315 if (variables_.found(v.name()))
318 <<
"Storing variable: " << v.name() <<
" "
319 << variables_[v.name()] <<
endl;
321 v = variables_[v.name()];
324 specialVariablesIndex_ = eventIndex;
330 <<
"Updating delayed variable " << iter().name() <<
endl;
332 if (!iter().updateReadValue(eventTime))
334 const exprString& expr = iter().startupValueExpression();
337 <<
"Evaluate: " << expr <<
endl;
340 iter().setReadValue(result_);
343 <<
"Value " << iter() <<
nl
344 <<
"Type " << iter().valueType() <<
"("
345 << result_.valueType() <<
")" <<
endl;
350 << iter().name() <<
" updated without problem" <<
endl;
359 <<
"Clearing variables" <<
endl;
361 const scalar eventTime =
mesh().time().value();
365 updateSpecialVariables();
369 variables_.insert(v.name(), v);
372 addVariables(variableStrings_,
false);
376 iter().storeValue(eventTime);
389 if (!allowShadowing_ && objPtr)
394 <<
") is shadowed by a variable of the same name." <<
nl
395 <<
"This may lead to trouble" <<
nl
396 <<
"If this is OK set 'allowShadowing'"
397 <<
" in the relevant parser" <<
nl
402 result_.testIfSingleValue();
405 <<
"Evaluating: " << expr <<
" -> " << varName <<
endl
410 if (delayedVariables_.found(varName))
413 variables_.erase(varName);
416 << varName <<
" is delayed" <<
endl;
419 delayedVariables_[varName] = result_;
437 <<
"Evaluating remote " << remote.c_str()
438 <<
" : " << expr <<
" -> " << varName <<
endl;
440 word driverType(
"patch");
443 const auto slashPos = remote.find(
'/');
444 if (slashPos != std::string::npos)
447 remote.resize(slashPos);
450 const auto quotePos = remote.find(
'\'');
451 if (quotePos != std::string::npos)
463 driverType ==
"patch"
467 || identName ==
"volume"
468 || identName ==
"internalField"
472 driverType =
"internalField";
477 if (!regionName.empty())
490 <<
"Call other with ("
491 << driverType <<
", " << identName <<
", " <<
regionName <<
")\n";
499 otherDriver->
parse(expr);
501 exprResult otherResult(this->getRemoteResult(*otherDriver));
510 <<
"Remote result: " << otherResult <<
nl;
513 if (delayedVariables_.found(varName))
516 variables_.erase(varName);
519 << varName <<
" is delayed - setting" <<
nl;
522 delayedVariables_[varName] = std::move(otherResult);
527 variables_.set(varName, std::move(otherResult));
552 if (!
meshPtr && readIfNecessary)
556 <<
" not in memory. Loading it" <<
endl;
563 mesh.time().constant(),
585 const word& fieldName
588 return getHeaderClassName(this->
mesh(), fieldName);
597 if (searchInMemory())
603 return ioptr->type();
609 return getHeaderClassName(this->
mesh(), name);
623 return topoSetSource::sourceType::CELLSET_SOURCE;
627 return topoSetSource::sourceType::FACESET_SOURCE;
631 return topoSetSource::sourceType::POINTSET_SOURCE;
634 return topoSetSource::sourceType::UNKNOWN_SOURCE;
641 if (
mesh().cellZones().findZoneID(setName) >= 0)
643 return topoSetSource::sourceType::CELLZONE_SOURCE;
646 if (
mesh().faceZones().findZoneID(setName) >= 0)
648 return topoSetSource::sourceType::FACEZONE_SOURCE;
651 if (
mesh().pointZones().findZoneID(setName) >= 0)
653 return topoSetSource::sourceType::POINTZONE_SOURCE;
656 return topoSetSource::sourceType::UNKNOWN_SOURCE;
663 auto setType = topoZoneType(setName);
665 if (topoSetSource::sourceType::UNKNOWN_SOURCE == setType)
667 setType = topoSetType(setName);
679 topoSetSource::sourceType::CELLSET_SOURCE
680 == topoSetType(setName)
689 topoSetSource::sourceType::FACESET_SOURCE
690 == topoSetType(setName)
699 topoSetSource::sourceType::POINTSET_SOURCE
700 == topoSetType(setName)
707 return (
mesh().cellZones().findZoneID(
name) >= 0);
713 return (
mesh().faceZones().findZoneID(
name) >= 0);
719 return (
mesh().pointZones().findZoneID(
name) >= 0);
735 return (!storedVariables_.empty() || !delayedVariables_.empty());
744 dict.readIfPresent(
"storedVariables", storedVariables_);
757 if (storedVariables_.size())
759 driver.updateSpecialVariables(
true);
761 dict.add(
"storedVariables", storedVariables_);
A keyword and a list of tokens is an 'entry'.
static autoPtr< fvExprDriver > New(const dictionary &dict, const fvMesh &mesh)
Return a reference to the selected value driver.
Defines the attributes of an object for which implicit objectRegistry management is supported,...
sourceType
Enumeration defining the types of sources.
Foam::autoPtr< Foam::fvMesh > meshPtr(nullptr)
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
A class for handling words, derived from Foam::string.
static const fvMesh * resetDefaultMesh(const fvMesh &mesh, const bool force=false)
Set the default mesh (if not already set)
virtual ITstream & stream() const =0
Return token stream, if entry is a primitive entry.
virtual bool hasDataToWrite() const
Do we need a data file to be written.
virtual unsigned parse(const std::string &expr, size_t pos=0, size_t len=std::string::npos)=0
Execute the parser.
void testIfSingleValue(const bool parRun=Pstream::parRun())
Test if field corresponds to a single-value and thus uniform.
virtual bool readDict(const dictionary &dict)
Read variables, tables etc.
void setSearchBehaviour(bool cacheReadFields, bool searchInMemory, bool searchFiles)
Set search behaviour.
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.
word getFieldClassName(const word &name) const
Lookup the field class name (memory or read from disk)
const Time & runTime() const
The Time associated with the mesh.
static word validate(const std::string &s, const bool prefix=false)
Construct validated word (no invalid characters).
const exprResult & get(const word &name, const wordUList &scopes) const
Return a global variable, if it exists, or a exprResult::null.
Base driver for parsing value expressions associated with an fvMesh.
bool isPointZone(const word &name) const
Test if name is a known pointZone.
Ostream & endl(Ostream &os)
Add newline and flush stream.
defineRunTimeSelectionTable(fvExprDriver, dictionary)
virtual word timeName() const
The current time name.
virtual void evaluateVariableRemote(string remote, const word &varName, const expressions::exprString &expr)
virtual void prepareData(dictionary &dict) const
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)
fvExprDriver(bool cacheReadFields=false, bool searchInMemory=true, bool searchFiles=false, const dictionary &dict=dictionary::null)
Null constructor, and null construct with search preferences.
word getTypeOfField(const word &fieldName) const
Read the IOobject for fieldName and return its headerClassName.
A polymorphic field/result from evaluating an expression.
virtual ~fvExprDriver()
Destructor.
An input stream of tokens.
#define DebugInFunction
Report an information message using Foam::Info.
word name(const complex &c)
Return string representation of complex.
virtual scalar timeValue() const
The current time value.
virtual void updateSpecialVariables(bool force=false)
Examine current variable values and update stored variables.
Base driver for parsing (field) values.
topoSetSource::sourceType topoSourceType(const word &name) const
Return cell/face/point zone/set type or unknown.
#define forAllIters(container, iter)
Iterate across all elements in the container object.
bool isFaceZone(const word &name) const
Test if name is a known faceZone.
bool isUniform() const
True if single, uniform value.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
bool isPointSet(const word &name) const
Test if name is a known pointSet.
const exprResult & lookupGlobal(const word &name) const
Return the global variable if available or a null result.
Mesh data needed to do the Finite Volume discretisation.
An exprResult with persistence.
errorManip< error > abort(error &err)
errorManipArg< error, int > exit(error &err, const int errNo=1)
virtual void evaluateVariable(const word &varName, const expressions::exprString &expr)
const word & headerClassName() const
Return name of the class name read from header.
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
bool isCellZone(const word &name) const
Test if name is a known cellZone.
regIOobject is an abstract class derived from IOobject to handle automatic object registration with t...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
bool isFaceSet(const word &name) const
Test if name is a known faceSet.
#define DebugInfo
Report an information message using Foam::Info.
const Type * cfindObject(const word &name, const bool recursive=false) const
Return const pointer to the object of the given Type.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
topoSetSource::sourceType topoSetType(const word &name) const
Return cell/face/point set type or unknown.
static const word null
An empty word.
topoSetSource::sourceType topoZoneType(const word &name) const
Return cell/face/point zone type or unknown.
const Time & time() const
Return the top-level database.
virtual void getData(const dictionary &dict)
Read data from dictionary, normally via the reader/writer.
virtual void clearVariables()
Clear temporary variables and resets from expression strings.
static const fvMesh & regionMesh(const dictionary &dict, const fvMesh &mesh, bool readIfNecessary)
void setGlobalScopes(const wordUList &scopes)
Define scopes for global variables.
defineTypeNameAndDebug(fvExprDriver, 0)
static exprResultGlobals & New(const objectRegistry &obr)
Static constructor for singleton.
#define WarningInFunction
Report a warning using Foam::Warning.
virtual bool update()
Update things.
virtual bool readDict(const dictionary &dict)
Read variables, tables etc.