39 namespace functionObjects
51 const Enum<functionObjects::caseInfo::writeFormat>
52 Foam::functionObjects::caseInfo::writeFormatNames_
55 { writeFormat::json,
"json" },
58 const Enum<functionObjects::caseInfo::lookupMode>
59 Foam::functionObjects::caseInfo::lookupModeNames_
61 { lookupMode::none,
"none" },
62 { lookupMode::warn,
"warn" },
63 { lookupMode::error,
"error" },
70 void Foam::functionObjects::caseInfo::report(
const string& str)
const 92 void Foam::functionObjects::caseInfo::processDict
95 const dictionary& targetDict,
96 const entry* includePtr,
97 const entry* excludePtr
100 auto sanitise = [](
const wordRe& w){
102 str.replaceAll(
"/",
"_").replaceAll(
".",
"_");
105 while (str.starts_with(
'_'))
114 const wordRes includeEntryNames(includePtr->stream());
115 for (
const auto& nameRegex : includeEntryNames)
120 if (nameRegex.contains(
'/') || nameRegex.contains(
'.'))
122 auto copyPtr =
e->clone();
123 copyPtr->keyword() = sanitise(nameRegex);
124 dict.add(copyPtr.ptr());
135 "Unable to find entry " 149 const wordRes excludeEntryNames(excludePtr->stream());
151 for (
const auto& nameRegex : excludeEntryNames)
156 allData.remove(
e->keyword());
175 out.add(
"case", time_.globalCaseName());
176 out.add(
"path", time_.globalPath());
177 out.add(
"regions", time_.sortedNames<
fvMesh>());
178 out.add(
"nTimes", time_.times().size());
190 for (
const auto&
e : dictionaries)
192 const auto& keyword =
e.keyword();
197 <<
"Entries must be specified in dictionary format. Please " 198 <<
"correct entry " << keyword
204 auto* includePtr = inputDict.
findEntry(
"include");
205 auto* excludePtr = inputDict.
findEntry(
"exclude");
207 const auto* ePtr = inputDict.
findEntry(
"name");
223 dictionaries.
remove(keyword);
233 dictionary& dictionaries
236 for (
auto&
e : dictionaries)
238 const auto& keyword =
e.keyword();
243 <<
"Entries must be specified in dictionary format. Please " 244 <<
"correct entry " << keyword
250 auto* includePtr = inputDict.findEntry(
"include");
251 auto* excludePtr = inputDict.findEntry(
"exclude");
253 const auto* ePtr = inputDict.findEntry(
"path");
257 fileName
path(ePtr->stream());
262 if (!
io.typeHeaderOk<dictionary>(
false))
267 const word oldTypeName = IOdictionary::typeName;
268 const_cast<word&
>(IOdictionary::typeName) =
word::null;
272 out.subDictOrAdd(keyword),
278 const_cast<word&
>(IOdictionary::typeName) = oldTypeName;
280 dictionaries.remove(keyword);
291 for (
const auto& fo : functionObjectNames_)
294 if (getObjectResultDict(fo,
dict))
300 report(
"No result entries found for function object " + fo);
308 const polyMesh&
mesh,
312 dict.add(
"nGeometricD",
mesh.nGeometricD());
313 dict.add(
"nSolutionD",
mesh.nSolutionD());
315 const auto& globalData =
mesh.globalData();
317 dict.add(
"nPoints", globalData.nTotalPoints());
318 dict.add(
"nFaces", globalData.nTotalFaces());
319 dict.add(
"nCells", globalData.nTotalCells());
321 dict.add(
"nPatches",
mesh.boundaryMesh().nNonProcessor());
323 dict.add(
"pointZones",
mesh.pointZones().names());
324 dict.add(
"faceZones",
mesh.faceZones().names());
325 dict.add(
"cellZones",
mesh.cellZones().names());
327 dict.add(
"boundsMin",
mesh.bounds().min());
328 dict.add(
"boundsMax",
mesh.bounds().max());
339 auto objects =
mesh.lookupClass<Type>();
340 for (
const auto* objPtr : objects)
344 const auto& bf = objPtr->boundaryField();
347 for (
const auto& pf : bf)
349 if (!isA<processorFvPatch>(pf.patch()))
351 objDict.add(pf.patch().name(), pf.type());
358 template<
template<
typename>
class FieldType>
361 addPatchTypeDetails<FieldType<scalar>>(
mesh,
dict);
362 addPatchTypeDetails<FieldType<vector>>(
mesh,
dict);
363 addPatchTypeDetails<FieldType<sphericalTensor>>(
mesh,
dict);
364 addPatchTypeDetails<FieldType<symmTensor>>(
mesh,
dict);
365 addPatchTypeDetails<FieldType<tensor>>(
mesh,
dict);
378 const auto&
pbm =
mesh.boundaryMesh();
379 for (
const auto&
pp :
pbm)
381 if (!isA<processorPolyPatch>(
pp))
389 addPatchDetails<VolumeField>(
mesh,
fld);
390 addPatchDetails<SurfaceField>(
mesh,
fld);
406 writeFormat_(writeFormat::
dict),
407 lookupMode_(lookupMode::warn)
419 writeFormatNames_.readIfPresent(
"writeFormat",
dict, writeFormat_);
420 lookupModeNames_.readIfPresent(
"lookupMode",
dict, lookupMode_);
422 dictionaries_ =
dict.subOrEmptyDict(
"dictionaries");
424 functionObjectNames_ =
456 writeRegisteredDicts(time_, dataDicts, dicts);
459 writeFileDicts(dataDicts, dicts);
464 for (
const auto& iter :
meshes.csorted())
481 for (
const word& keyword : meshDicts.sortedToc())
487 +
"' : Unable to process dictionary entry '" 500 auto filePtr = newFileAtTime(
name(), time_.value());
506 switch (writeFormat_)
513 case writeFormat::json:
515 JSONformatter json(
os);
516 json.writeDict(data);
521 Info<<
"Written " << writeFormatNames_[writeFormat_]
522 <<
" file: " <<
os.name() <<
endl;
const polyBoundaryMesh & pbm
defineTypeNameAndDebug(ObukhovLength, 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...
Ostream & endl(Ostream &os)
Add newline and flush stream.
entry * add(entry *entryPtr, bool mergeEntry=false)
Add a new entry.
virtual bool read(const dictionary &dict)
Read the controls.
const Type * cfindObject(const word &name, const bool recursive=false) const
Return const pointer to the object of the given Type.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
virtual bool execute()
Execute, does nothing.
Macros for easy insertion into run-time selection tables.
dictionary & subDictOrAdd(const word &keyword, enum keyType::option matchOpt=keyType::REGEX)
Find and return a sub-dictionary for manipulation.
bool read(const char *buf, int32_t &val)
Same as readInt32.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
bool remove(const word &keyword)
Remove an entry specified by keyword.
void writeMeshStats(const polyMesh &mesh, dictionary &dict) const
Write mesh statistics.
autoPtr< OFstream > filePtr
static label nProcs(const label communicator=worldComm)
Number of ranks in parallel run (for given communicator). It is 1 for serial run. ...
const dimensionedScalar e
Elementary charge.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
A class for handling words, derived from Foam::string.
A cloud is a registry collection of lagrangian particles.
void writeMeta(dictionary &dict) const
Write case meta data.
caseInfo(const caseInfo &)=delete
No copy construct.
void writeRegisteredDicts(const objectRegistry &obr, dictionary &dict, dictionary &dictionaries) const
Write registered dictionaries.
Foam::PtrList< Foam::fvMesh > meshes(regionNames.size())
static const word null
An empty word.
void addPatchDetails(const fvMesh &mesh, dictionary &dict)
OBJstream os(runTime.globalPath()/outputName)
fileName path(UMean.rootPath()/UMean.caseName()/"graphs"/UMean.instance())
addToRunTimeSelectionTable(functionObject, ObukhovLength, dictionary)
virtual bool read(const dictionary &dict)
Read.
void writePatches(const fvMesh &mesh, dictionary &dict) const
Write mesh patches.
messageStream Warning
Warning stream (stdout output on master, null elsewhere), with additional 'FOAM Warning' header text...
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< ' ';}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< ' ';}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< ' ';}gmvFile<< nl;for(const word &name :lagrangianScalarNames){ IOField< scalar > fld(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
List< word > wordList
List of word.
void writeFileDicts(dictionary &dict, dictionary &dictionaries) const
Write file-based dictionaries.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
void writeFunctionObjects(dictionary &dict) const
Write function object results.
virtual bool read(const dictionary &dict)
Read and set the function object if its data have changed.
Mesh data needed to do the Finite Volume discretisation.
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
const entry * findEntry(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find an entry (const access) with the given keyword.
Base class for function objects, adding functionality to read/write state information (data required ...
messageStream Info
Information stream (stdout output on master, null elsewhere)
IOobject io("surfaceFilmProperties", mesh.time().constant(), mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, IOobject::NO_REGISTER)
Registry of regIOobjects.
Base class for writing single files from the function objects.
void addPatchTypeDetails(const fvMesh &mesh, dictionary &dict)
virtual bool write()
Write the caseInfo.
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
IOerror FatalIOError
Error stream (stdout output on all processes), with additional 'FOAM FATAL IO ERROR' header text and ...