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");
210 ITstream& is = eptr->
stream();
212 if (writer_ && !delayedVariables_.empty())
216 <<
"Seems like 'delayedVariables' was already read." 217 <<
" No update from " << is
222 List<exprResultDelayed> inputs(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;
288 for (exprResultStored& v : storedVariables_)
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();
342 for (exprResultStored& v : storedVariables_)
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";
450 const fvMesh* pRegion = &(this->
mesh());
452 if (!regionName.empty())
454 pRegion = pRegion->time().cfindObject<fvMesh>(
regionName);
465 <<
"Call other with (" 466 << driverType <<
", " << identName <<
", " <<
regionName <<
")\n";
468 autoPtr<fvExprDriver> otherDriver =
471 otherDriver->setSearchBehaviour(*
this);
472 otherDriver->setGlobalScopes(this->globalScopes_);
474 otherDriver->parse(expr);
476 exprResult otherResult(this->getRemoteResult(*otherDriver));
479 if (!otherResult.isUniform())
481 otherResult.testIfSingleValue();
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(),
562 const word& fieldName
565 return getHeaderClassName(this->
mesh(), fieldName);
574 if (searchRegistry())
580 return ioptr->type();
586 return getHeaderClassName(this->
mesh(), name);
600 return topoSetSource::sourceType::CELLSET_SOURCE;
602 if (
io.isHeaderClass<faceSet>())
604 return topoSetSource::sourceType::FACESET_SOURCE;
606 if (
io.isHeaderClass<pointSet>())
608 return topoSetSource::sourceType::POINTSET_SOURCE;
611 return topoSetSource::sourceType::UNKNOWN_SOURCE;
618 if (
mesh().cellZones().findZoneID(setName) >= 0)
620 return topoSetSource::sourceType::CELLZONE_SOURCE;
623 if (
mesh().faceZones().findZoneID(setName) >= 0)
625 return topoSetSource::sourceType::FACEZONE_SOURCE;
628 if (
mesh().pointZones().findZoneID(setName) >= 0)
630 return topoSetSource::sourceType::POINTZONE_SOURCE;
633 return topoSetSource::sourceType::UNKNOWN_SOURCE;
640 auto setType = topoZoneType(setName);
642 if (topoSetSource::sourceType::UNKNOWN_SOURCE == setType)
644 setType = topoSetType(setName);
656 topoSetSource::sourceType::CELLSET_SOURCE
657 == topoSetType(setName)
666 topoSetSource::sourceType::FACESET_SOURCE
667 == topoSetType(setName)
676 topoSetSource::sourceType::POINTSET_SOURCE
677 == topoSetType(setName)
684 return (
mesh().cellZones().findZoneID(
name) >= 0);
690 return (
mesh().faceZones().findZoneID(
name) >= 0);
696 return (
mesh().pointZones().findZoneID(
name) >= 0);
712 return (!storedVariables_.empty() || !delayedVariables_.empty());
721 dict.readIfPresent(
"storedVariables", storedVariables_);
734 if (storedVariables_.size())
736 driver.updateSpecialVariables(
true);
738 dict.add(
"storedVariables", storedVariables_);
static word validate(const std::string &s, const bool prefix=false)
Construct validated word (no invalid characters).
word getFieldClassName(const word &name) const
Lookup the field class name (memory or read from disk)
virtual void prepareData(dictionary &dict) const
Prepare/update special variables and add to dictionary, normally via the reader/writer.
fvExprDriver(enum exprDriver::searchControls search=exprDriver::searchControls::DEFAULT_SEARCH, const dictionary &dict=dictionary::null)
Default construct, and default construct with search preferences.
defineTypeNameAndDebug(fvExprDriver, 0)
errorManipArg< error, int > exit(error &err, const int errNo=1)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
A polymorphic field/result from evaluating an expression.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
static const fvMesh & regionMesh(const dictionary &dict, const fvMesh &mesh, bool readIfNecessary)
Determine mesh or region mesh as specified in the dictionary with the keyword "region".
word getTypeOfField(const word &fieldName) const
Read the IOobject for fieldName and return its headerClassName.
constexpr char nl
The newline '\n' character (0x0a)
virtual ~fvExprDriver()
Destructor.
defineRunTimeSelectionTable(fvExprDriver, dictionary)
virtual bool readDict(const dictionary &dict)
Read variables, tables etc.
Ostream & endl(Ostream &os)
Add newline and flush stream.
static autoPtr< fvExprDriver > New(const dictionary &dict, const fvMesh &mesh)
Return a reference to the selected value driver.
Ignore writing from objectRegistry::writeObject()
topoSetSource::sourceType topoSourceType(const word &name) const
Return cell/face/point zone/set type or unknown.
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.
virtual void updateSpecialVariables(bool force=false)
Examine current variable values and update stored variables.
searchControls
Search/caching controls.
virtual bool hasDataToWrite() const
Do we need a data file to be written.
static IOobject findIOobject(const polyMesh &mesh, const word &name, IOobjectOption::readOption rOpt=IOobjectOption::MUST_READ, IOobjectOption::writeOption wOpt=IOobjectOption::NO_WRITE, IOobjectOption::registerOption reg=IOobjectOption::LEGACY_REGISTER)
Find IOobject in the polyMesh/sets/ (used as constructor helper)
static const fvMesh & defaultMesh()
Get the default mesh, if one is defined.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
Foam::autoPtr< Foam::dynamicFvMesh > meshPtr
bool isFaceSet(const word &name) const
Test if name is a known faceSet.
A class for handling words, derived from Foam::string.
#define DebugInFunction
Report an information message using Foam::Info.
virtual void evaluateVariable(const word &varName, const expressions::exprString &expr)
Evaluate the expression and save as the specified named variable.
A variant of Foam::string with expansion of dictionary variables into a comma-separated form...
An exprResult with persistence.
#define forAllIters(container, iter)
Iterate across all elements in the container object.
static const word null
An empty word.
bool isCellZone(const word &name) const
Test if name is a known cellZone.
virtual void evaluateVariableRemote(string remote, const word &varName, const expressions::exprString &expr)
Evaluate an expression on a remote and save as the specified named variable.
errorManip< error > abort(error &err)
#define DebugInfo
Report an information message using Foam::Info.
topoSetSource::sourceType topoSetType(const word &name) const
Return cell/face/point set type or unknown.
topoSetSource::sourceType topoZoneType(const word &name) const
Return cell/face/point zone type or unknown.
Base driver for parsing (field) values.
virtual bool update()
Update things.
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.
bool isPointSet(const word &name) const
Test if name is a known pointSet.
bool isFaceZone(const word &name) const
Test if name is a known faceZone.
const word & headerClassName() const noexcept
Return name of the class name read from header.
#define WarningInFunction
Report a warning using Foam::Warning.
Foam::word regionName(args.getOrDefault< word >("region", Foam::polyMesh::defaultRegion))
A collection of cell labels.
virtual bool readDict(const dictionary &dict)
Read variables, tables etc.
sourceType
Enumeration defining the types of sources.
Mesh data needed to do the Finite Volume discretisation.
regIOobject is an abstract class derived from IOobject to handle automatic object registration with t...
static const fvMesh * resetDefaultMesh(const fvMesh &mesh, const bool force=false)
Set the default mesh (if not already set)
const exprResult & lookupGlobal(const word &name) const
Return the global variable if available or a null result.
fileName search(const word &file, const fileName &directory)
Recursively search the given directory for the file.
IOobject io("surfaceFilmProperties", mesh.time().constant(), mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, IOobject::NO_REGISTER)
virtual ITstream & stream() const =0
Return token stream, if entry is a primitive entry.
Defines the attributes of an object for which implicit objectRegistry management is supported...
bool isCellSet(const word &name) const
Test if name is a known cellSet.
Request registration (bool: true)
An input stream of tokens.
static exprResultGlobals & New(const objectRegistry &obr)
Static constructor for singleton.
A keyword and a list of tokens is an 'entry'.
bool isPointZone(const word &name) const
Test if name is a known pointZone.