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;
105 specialVariablesIndex_(-1),
118 globalScopes_(rhs.globalScopes_),
119 delayedVariables_(rhs.delayedVariables_),
120 storedVariables_(rhs.storedVariables_),
121 specialVariablesIndex_(rhs.specialVariablesIndex_),
136 specialVariablesIndex_(-1),
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";
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);
598 return topoSetSource::sourceType::CELLSET_SOURCE;
602 return topoSetSource::sourceType::FACESET_SOURCE;
606 return topoSetSource::sourceType::POINTSET_SOURCE;
609 return topoSetSource::sourceType::UNKNOWN_SOURCE;
616 if (
mesh().cellZones().findZoneID(setName) >= 0)
618 return topoSetSource::sourceType::CELLZONE_SOURCE;
621 if (
mesh().faceZones().findZoneID(setName) >= 0)
623 return topoSetSource::sourceType::FACEZONE_SOURCE;
626 if (
mesh().pointZones().findZoneID(setName) >= 0)
628 return topoSetSource::sourceType::POINTZONE_SOURCE;
631 return topoSetSource::sourceType::UNKNOWN_SOURCE;
638 auto setType = topoZoneType(setName);
640 if (topoSetSource::sourceType::UNKNOWN_SOURCE == setType)
642 setType = topoSetType(setName);
654 topoSetSource::sourceType::CELLSET_SOURCE
655 == topoSetType(setName)
664 topoSetSource::sourceType::FACESET_SOURCE
665 == topoSetType(setName)
674 topoSetSource::sourceType::POINTSET_SOURCE
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_);
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)
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.
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)
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)
const word & headerClassName() const noexcept
Return name of the class name read from header.
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)
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.
searchControls
Search/caching controls.
#define DebugInFunction
Report an information message using Foam::Info.
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.
void setSearchBehaviour(enum searchControls search, const bool caching=false)
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)
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.
fileName search(const word &file, const fileName &directory)
Recursively search the given directory for the file.
static const word null
An empty word.
topoSetSource::sourceType topoZoneType(const word &name) const
Return cell/face/point zone type or unknown.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
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, reset 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.
fvExprDriver(enum exprDriver::searchControls search=exprDriver::searchControls::DEFAULT_SEARCH, const dictionary &dict=dictionary::null)
Default construct, and default construct with search preferences.
#define WarningInFunction
Report a warning using Foam::Warning.
virtual bool update()
Update things.
virtual bool readDict(const dictionary &dict)
Read variables, tables etc.