mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Added new caseInfo function object
Collects and writes case information to file in OpenFOAM dictionary or JSON
format. Data includes:
- meta: case name, path, regions, parallel etc.
- dictionaries: entries retrieved from dictionaries - registered or from file
- per region: mesh metrics, boundary and boundary field types
- function object results
Example of function object specification:
caseInfo
{
type caseInfo;
libs (utilityFunctionObjects);
// Warn when entries are not found
lookupMode warn; // none | warn | error;
// Write format
writeFormat json; // dictionary | json;
dictionaries
{
USolver // User-specified names
{
// Look up using registered name
name "fvSolution";
// Optionally limit to specific entries
include
(
"solvers/U/solver"
);
}
fvSchemes
{
name "fvSchemes";
// include all entries by default
}
timeScheme
{
name "fvSchemes";
include
(
"/ddtSchemes/default"
);
}
turbulence
{
name "turbulenceProperties";
// include all entries by default
}
controlDict
{
// Look up using file path
path "<case>/system/controlDict";
include
(
"application"
"deltaT"
"startTime"
"endTime"
);
}
}
functionObjects (minMax1);
}
This commit is contained in:
@ -1,5 +1,7 @@
|
|||||||
abort/abort.C
|
abort/abort.C
|
||||||
|
|
||||||
|
caseInfo/caseInfo.C
|
||||||
|
|
||||||
codedFunctionObject/codedFunctionObject.C
|
codedFunctionObject/codedFunctionObject.C
|
||||||
|
|
||||||
areaWrite/areaWrite.C
|
areaWrite/areaWrite.C
|
||||||
|
|||||||
529
src/functionObjects/utilities/caseInfo/caseInfo.C
Normal file
529
src/functionObjects/utilities/caseInfo/caseInfo.C
Normal file
@ -0,0 +1,529 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2023 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "caseInfo.H"
|
||||||
|
#include "OFstream.H"
|
||||||
|
#include "fvMesh.H"
|
||||||
|
#include "cloud.H"
|
||||||
|
#include "globalMeshData.H"
|
||||||
|
#include "volFields.H"
|
||||||
|
#include "surfaceFields.H"
|
||||||
|
#include "processorFvPatch.H"
|
||||||
|
#include "JSONformatter.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace functionObjects
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(caseInfo, 0);
|
||||||
|
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
functionObject,
|
||||||
|
caseInfo,
|
||||||
|
dictionary
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Enum<functionObjects::caseInfo::writeFormat>
|
||||||
|
Foam::functionObjects::caseInfo::writeFormatNames_
|
||||||
|
{
|
||||||
|
{ writeFormat::dict, "dictionary" },
|
||||||
|
{ writeFormat::json, "json" },
|
||||||
|
};
|
||||||
|
|
||||||
|
const Enum<functionObjects::caseInfo::lookupMode>
|
||||||
|
Foam::functionObjects::caseInfo::lookupModeNames_
|
||||||
|
{
|
||||||
|
{ lookupMode::none, "none" },
|
||||||
|
{ lookupMode::warn, "warn" },
|
||||||
|
{ lookupMode::error, "error" },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::functionObjects::caseInfo::report(const string& str) const
|
||||||
|
{
|
||||||
|
switch (lookupMode_)
|
||||||
|
{
|
||||||
|
case lookupMode::warn:
|
||||||
|
{
|
||||||
|
Warning << str.c_str() << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case lookupMode::error:
|
||||||
|
{
|
||||||
|
FatalError << str.c_str() << exit(FatalError);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case lookupMode::none:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::functionObjects::caseInfo::processDict
|
||||||
|
(
|
||||||
|
dictionary& dict,
|
||||||
|
const dictionary& targetDict,
|
||||||
|
const entry* includePtr,
|
||||||
|
const entry* excludePtr
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
auto sanitise = [](const wordRe& w){
|
||||||
|
string str = w;
|
||||||
|
str.replaceAll("/", "_").replaceAll(".", "_");
|
||||||
|
|
||||||
|
// Strip any leading "_"
|
||||||
|
while (str.starts_with('_'))
|
||||||
|
{
|
||||||
|
str = str.substr(1);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (includePtr)
|
||||||
|
{
|
||||||
|
const wordRes includeEntryNames(includePtr->stream());
|
||||||
|
for (const auto& nameRegex : includeEntryNames)
|
||||||
|
{
|
||||||
|
const auto* e = targetDict.findScoped(nameRegex, keyType::REGEX);
|
||||||
|
if (e)
|
||||||
|
{
|
||||||
|
if (nameRegex.contains('/') || nameRegex.contains('.'))
|
||||||
|
{
|
||||||
|
auto copyPtr = e->clone();
|
||||||
|
copyPtr->keyword() = sanitise(nameRegex);
|
||||||
|
dict.add(copyPtr.ptr());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dict.add(*e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
report
|
||||||
|
(
|
||||||
|
"Unable to find entry "
|
||||||
|
+ nameRegex
|
||||||
|
+ " in dictionary "
|
||||||
|
+ targetDict.name()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (excludePtr)
|
||||||
|
{
|
||||||
|
dictionary allData(targetDict);
|
||||||
|
|
||||||
|
const wordRes excludeEntryNames(excludePtr->stream());
|
||||||
|
|
||||||
|
for (const auto& nameRegex : excludeEntryNames)
|
||||||
|
{
|
||||||
|
const auto* e = allData.findScoped(nameRegex, keyType::REGEX);
|
||||||
|
if (e)
|
||||||
|
{
|
||||||
|
allData.remove(e->keyword());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dict += allData;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Add complete dictionary
|
||||||
|
dict += targetDict;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::functionObjects::caseInfo::writeMeta(dictionary& out) const
|
||||||
|
{
|
||||||
|
out.add("case", time_.globalCaseName());
|
||||||
|
out.add("path", time_.globalPath());
|
||||||
|
out.add("regions", time_.sortedNames<fvMesh>());
|
||||||
|
out.add("nTimes", time_.times().size());
|
||||||
|
out.add("nProc", Pstream::nProcs());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::functionObjects::caseInfo::writeRegisteredDicts
|
||||||
|
(
|
||||||
|
const objectRegistry& obr,
|
||||||
|
dictionary& out,
|
||||||
|
dictionary& dictionaries
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
for (const auto& e : dictionaries)
|
||||||
|
{
|
||||||
|
const auto& keyword = e.keyword();
|
||||||
|
|
||||||
|
if (!e.isDict())
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(dictionaries)
|
||||||
|
<< "Entries must be specified in dictionary format. Please "
|
||||||
|
<< "correct entry " << keyword
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const dictionary& inputDict = e.dict();
|
||||||
|
|
||||||
|
auto* includePtr = inputDict.findEntry("include");
|
||||||
|
auto* excludePtr = inputDict.findEntry("exclude");
|
||||||
|
|
||||||
|
const auto* ePtr = inputDict.findEntry("name");
|
||||||
|
|
||||||
|
if (ePtr)
|
||||||
|
{
|
||||||
|
const word name(ePtr->stream());
|
||||||
|
auto* dictPtr = obr.cfindObject<IOdictionary>(name);
|
||||||
|
|
||||||
|
if (dictPtr)
|
||||||
|
{
|
||||||
|
processDict
|
||||||
|
(
|
||||||
|
out.subDictOrAdd(keyword),
|
||||||
|
*dictPtr,
|
||||||
|
includePtr,
|
||||||
|
excludePtr
|
||||||
|
);
|
||||||
|
dictionaries.remove(keyword);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::functionObjects::caseInfo::writeFileDicts
|
||||||
|
(
|
||||||
|
dictionary& out,
|
||||||
|
dictionary& dictionaries
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
for (auto& e : dictionaries)
|
||||||
|
{
|
||||||
|
const auto& keyword = e.keyword();
|
||||||
|
|
||||||
|
if (!e.isDict())
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(dictionaries)
|
||||||
|
<< "Entries must be specified in dictionary format. Please "
|
||||||
|
<< "correct entry " << keyword
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const dictionary& inputDict = e.dict();
|
||||||
|
|
||||||
|
auto* includePtr = inputDict.findEntry("include");
|
||||||
|
auto* excludePtr = inputDict.findEntry("exclude");
|
||||||
|
|
||||||
|
const auto* ePtr = inputDict.findEntry("path");
|
||||||
|
|
||||||
|
if (ePtr)
|
||||||
|
{
|
||||||
|
fileName path(ePtr->stream());
|
||||||
|
path.expand();
|
||||||
|
|
||||||
|
IOobject io(path, time(), IOobject::MUST_READ);
|
||||||
|
|
||||||
|
if (!io.typeHeaderOk<dictionary>(false))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const word oldTypeName = IOdictionary::typeName;
|
||||||
|
const_cast<word&>(IOdictionary::typeName) = word::null;
|
||||||
|
|
||||||
|
processDict
|
||||||
|
(
|
||||||
|
out.subDictOrAdd(keyword),
|
||||||
|
IOdictionary(io),
|
||||||
|
includePtr,
|
||||||
|
excludePtr
|
||||||
|
);
|
||||||
|
|
||||||
|
const_cast<word&>(IOdictionary::typeName) = oldTypeName;
|
||||||
|
|
||||||
|
dictionaries.remove(keyword);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::functionObjects::caseInfo::writeFunctionObjects
|
||||||
|
(
|
||||||
|
dictionary& out
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
for (const auto& fo : functionObjectNames_)
|
||||||
|
{
|
||||||
|
dictionary dict;
|
||||||
|
if (getObjectResultDict(fo, dict))
|
||||||
|
{
|
||||||
|
out.add(fo, dict);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
report("No result entries found for function object " + fo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::functionObjects::caseInfo::writeMeshStats
|
||||||
|
(
|
||||||
|
const polyMesh& mesh,
|
||||||
|
dictionary& dict
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
dict.add("nGeometricD", mesh.nGeometricD());
|
||||||
|
dict.add("nSolutionD", mesh.nSolutionD());
|
||||||
|
|
||||||
|
const auto& globalData = mesh.globalData();
|
||||||
|
|
||||||
|
dict.add("nPoints", globalData.nTotalPoints());
|
||||||
|
dict.add("nFaces", globalData.nTotalFaces());
|
||||||
|
dict.add("nCells", globalData.nTotalCells());
|
||||||
|
|
||||||
|
dict.add("nPatches", mesh.boundaryMesh().nNonProcessor());
|
||||||
|
|
||||||
|
dict.add("pointZones", mesh.pointZones().names());
|
||||||
|
dict.add("faceZones", mesh.faceZones().names());
|
||||||
|
dict.add("cellZones", mesh.cellZones().names());
|
||||||
|
|
||||||
|
dict.add("boundsMin", mesh.bounds().min());
|
||||||
|
dict.add("boundsMax", mesh.bounds().max());
|
||||||
|
|
||||||
|
dict.add("clouds", mesh.sortedNames<cloud>());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
template<class Type>
|
||||||
|
void addPatchTypeDetails(const fvMesh& mesh, dictionary& dict)
|
||||||
|
{
|
||||||
|
auto objects = mesh.lookupClass<Type>();
|
||||||
|
for (const auto* objPtr : objects)
|
||||||
|
{
|
||||||
|
if (objPtr->readOpt() == IOobject::MUST_READ)
|
||||||
|
{
|
||||||
|
const auto& bf = objPtr->boundaryField();
|
||||||
|
dictionary& objDict = dict.subDictOrAdd(objPtr->name());
|
||||||
|
|
||||||
|
for (const auto& pf : bf)
|
||||||
|
{
|
||||||
|
if (!isA<processorFvPatch>(pf.patch()))
|
||||||
|
{
|
||||||
|
objDict.add(pf.patch().name(), pf.type());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<template<typename> class FieldType>
|
||||||
|
void addPatchDetails(const fvMesh& mesh, dictionary& dict)
|
||||||
|
{
|
||||||
|
addPatchTypeDetails<FieldType<scalar>>(mesh, dict);
|
||||||
|
addPatchTypeDetails<FieldType<vector>>(mesh, dict);
|
||||||
|
addPatchTypeDetails<FieldType<sphericalTensor>>(mesh, dict);
|
||||||
|
addPatchTypeDetails<FieldType<symmTensor>>(mesh, dict);
|
||||||
|
addPatchTypeDetails<FieldType<tensor>>(mesh, dict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::functionObjects::caseInfo::writePatches
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
dictionary& dict
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// Geometry
|
||||||
|
dictionary& bnd = dict.subDictOrAdd("types");
|
||||||
|
const auto& pbm = mesh.boundaryMesh();
|
||||||
|
for (const auto& pp : pbm)
|
||||||
|
{
|
||||||
|
if (!isA<processorPolyPatch>(pp))
|
||||||
|
{
|
||||||
|
bnd.add(pp.name(), pp.type());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fields
|
||||||
|
dictionary& fld = dict.subDictOrAdd("fields");
|
||||||
|
addPatchDetails<VolumeField>(mesh, fld);
|
||||||
|
addPatchDetails<SurfaceField>(mesh, fld);
|
||||||
|
//addPatchDetails<AreaField>(mesh, fld);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::functionObjects::caseInfo::caseInfo
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const Time& runTime,
|
||||||
|
const dictionary& dict
|
||||||
|
)
|
||||||
|
:
|
||||||
|
stateFunctionObject(name, runTime),
|
||||||
|
writeFile(runTime, name, typeName, dict),
|
||||||
|
writeFormat_(writeFormat::dict),
|
||||||
|
lookupMode_(lookupMode::warn)
|
||||||
|
{
|
||||||
|
read(dict);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
bool Foam::functionObjects::caseInfo::read(const dictionary& dict)
|
||||||
|
{
|
||||||
|
if (stateFunctionObject::read(dict) && writeFile::read(dict))
|
||||||
|
{
|
||||||
|
writeFormat_ = writeFormatNames_.get("writeFormat", dict);
|
||||||
|
lookupModeNames_.readIfPresent("lookupMode", dict, lookupMode_);
|
||||||
|
|
||||||
|
dictionaries_ = dict.subOrEmptyDict("dictionaries");
|
||||||
|
|
||||||
|
functionObjectNames_ =
|
||||||
|
dict.getOrDefault<wordList>("functionObjects", wordList());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::functionObjects::caseInfo::execute()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::functionObjects::caseInfo::write()
|
||||||
|
{
|
||||||
|
// Output dictionary
|
||||||
|
dictionary data;
|
||||||
|
|
||||||
|
// Case meta data
|
||||||
|
writeMeta(data.subDictOrAdd("meta"));
|
||||||
|
|
||||||
|
// Note: copying dictionaries
|
||||||
|
// - these are consumed/removed when found to enable checks that all
|
||||||
|
// dictionaries are processed
|
||||||
|
dictionary dicts(dictionaries_);
|
||||||
|
|
||||||
|
dictionary& dataDicts = data.subDictOrAdd("dictionaries");
|
||||||
|
|
||||||
|
// Time-registered dictionaries
|
||||||
|
writeRegisteredDicts(time_, dataDicts, dicts);
|
||||||
|
|
||||||
|
// File-based dictionaries
|
||||||
|
writeFileDicts(dataDicts, dicts);
|
||||||
|
|
||||||
|
// Per-region information
|
||||||
|
const auto meshes = time_.lookupClass<fvMesh>();
|
||||||
|
dictionary& regionDict = data.subDictOrAdd("regions");
|
||||||
|
for (const auto& iter : meshes.csorted())
|
||||||
|
{
|
||||||
|
dictionary meshDicts(dicts);
|
||||||
|
|
||||||
|
const fvMesh& mesh = *iter.val();
|
||||||
|
|
||||||
|
const word& name = mesh.name();
|
||||||
|
|
||||||
|
dictionary& out = regionDict.subDictOrAdd(name);
|
||||||
|
|
||||||
|
writeMeshStats(mesh, out.subDictOrAdd("mesh"));
|
||||||
|
|
||||||
|
writePatches(mesh, out.subDictOrAdd("boundary"));
|
||||||
|
|
||||||
|
// Mesh-registered dictionaries
|
||||||
|
writeRegisteredDicts(mesh, out.subDictOrAdd("dictionaries"), meshDicts);
|
||||||
|
|
||||||
|
for (const word& keyword : meshDicts.sortedToc())
|
||||||
|
{
|
||||||
|
report
|
||||||
|
(
|
||||||
|
"Mesh '"
|
||||||
|
+ keyword
|
||||||
|
+ "' : Unable to process dictionary entry '"
|
||||||
|
+ keyword
|
||||||
|
+ "'"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
writeFunctionObjects(data.subDictOrAdd("functions"));
|
||||||
|
|
||||||
|
|
||||||
|
if (Pstream::master())
|
||||||
|
{
|
||||||
|
auto filePtr = newFileAtTime(name(), time_.value());
|
||||||
|
auto& os = filePtr();
|
||||||
|
|
||||||
|
// Reset stream width - was set in writeFile
|
||||||
|
os.width(0);
|
||||||
|
|
||||||
|
switch (writeFormat_)
|
||||||
|
{
|
||||||
|
case writeFormat::dict:
|
||||||
|
{
|
||||||
|
os << data << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case writeFormat::json:
|
||||||
|
{
|
||||||
|
JSONformatter json(os);
|
||||||
|
json.writeDict(data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Info<< "Written " << writeFormatNames_[writeFormat_]
|
||||||
|
<< " file: " << os.name() << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
287
src/functionObjects/utilities/caseInfo/caseInfo.H
Normal file
287
src/functionObjects/utilities/caseInfo/caseInfo.H
Normal file
@ -0,0 +1,287 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | www.openfoam.com
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2023 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::functionObjects::caseInfo
|
||||||
|
|
||||||
|
Description
|
||||||
|
Collects and writes case information to file.
|
||||||
|
|
||||||
|
Example of function object specification:
|
||||||
|
\verbatim
|
||||||
|
caseInfo
|
||||||
|
{
|
||||||
|
type caseInfo;
|
||||||
|
libs (utilityFunctionObjects);
|
||||||
|
|
||||||
|
// Warn when entries are not found
|
||||||
|
lookupMode warn; // none | warn | error;
|
||||||
|
|
||||||
|
// Write format
|
||||||
|
writeFormat json; // dictionary | json;
|
||||||
|
|
||||||
|
dictionaries
|
||||||
|
{
|
||||||
|
USolver // User-specified names
|
||||||
|
{
|
||||||
|
// Look up using registered name
|
||||||
|
name "fvSolution";
|
||||||
|
|
||||||
|
// Optionally limit to specific entries
|
||||||
|
include
|
||||||
|
(
|
||||||
|
"solvers/U/solver"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
fvSchemes
|
||||||
|
{
|
||||||
|
name "fvSchemes";
|
||||||
|
|
||||||
|
// include all entries by default
|
||||||
|
}
|
||||||
|
timeScheme
|
||||||
|
{
|
||||||
|
name "fvSchemes";
|
||||||
|
|
||||||
|
include
|
||||||
|
(
|
||||||
|
"/ddtSchemes/default"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
turbulence
|
||||||
|
{
|
||||||
|
name "turbulenceProperties";
|
||||||
|
|
||||||
|
// include all entries by default
|
||||||
|
}
|
||||||
|
controlDict
|
||||||
|
{
|
||||||
|
// Look up using file path
|
||||||
|
path "<case>/system/controlDict";
|
||||||
|
|
||||||
|
include
|
||||||
|
(
|
||||||
|
"application"
|
||||||
|
"deltaT"
|
||||||
|
"startTime"
|
||||||
|
"endTime"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
functionObjects (minMax1); // v2306 only
|
||||||
|
}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
Where the entries comprise:
|
||||||
|
\table
|
||||||
|
Property | Description | Required | Default
|
||||||
|
type | Type name: caseInfo | yes |
|
||||||
|
lookupMode | Lookup mode | no | warn
|
||||||
|
writeFormat | Write format | yes |
|
||||||
|
dictionaries | Dictionaries to process | no | \<none\>
|
||||||
|
functionObjects | Function objects to process | no | \<none\>
|
||||||
|
\endtable
|
||||||
|
|
||||||
|
See also
|
||||||
|
Foam::functionObject
|
||||||
|
Foam::timeFunctionObject
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
caseInfo.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef functionObjects_caseInfo_H
|
||||||
|
#define functionObjects_caseInfo_H
|
||||||
|
|
||||||
|
#include "writeFile.H"
|
||||||
|
#include "stateFunctionObject.H"
|
||||||
|
#include "Enum.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// Forward declarations
|
||||||
|
class fvMesh;
|
||||||
|
|
||||||
|
namespace functionObjects
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class caseInfo Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class caseInfo
|
||||||
|
:
|
||||||
|
public stateFunctionObject,
|
||||||
|
public writeFile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Public enumerations
|
||||||
|
|
||||||
|
//- Write format enumeration
|
||||||
|
enum class writeFormat
|
||||||
|
{
|
||||||
|
dict,
|
||||||
|
json
|
||||||
|
};
|
||||||
|
|
||||||
|
//- Lookup mode enumeration
|
||||||
|
enum class lookupMode
|
||||||
|
{
|
||||||
|
none,
|
||||||
|
warn,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// Private Member Data
|
||||||
|
|
||||||
|
//- Write format names
|
||||||
|
static const Enum<writeFormat> writeFormatNames_;
|
||||||
|
|
||||||
|
//- Lookup mode names
|
||||||
|
static const Enum<lookupMode> lookupModeNames_;
|
||||||
|
|
||||||
|
//- Write/output format, e.g. dictionary, JSON
|
||||||
|
writeFormat writeFormat_;
|
||||||
|
|
||||||
|
//- Lookup mode when reading entries
|
||||||
|
lookupMode lookupMode_;
|
||||||
|
|
||||||
|
//- Dictionaries
|
||||||
|
dictionary dictionaries_;
|
||||||
|
|
||||||
|
//- List of function objects to process
|
||||||
|
wordList functionObjectNames_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Report
|
||||||
|
void report(const string& str) const;
|
||||||
|
|
||||||
|
//- Process dictionary
|
||||||
|
void processDict
|
||||||
|
(
|
||||||
|
dictionary& dict,
|
||||||
|
const dictionary& targetDict,
|
||||||
|
const entry* includePtr,
|
||||||
|
const entry* excludePtr
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
caseInfo(const caseInfo&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const caseInfo&) = delete;
|
||||||
|
|
||||||
|
|
||||||
|
// Write data
|
||||||
|
|
||||||
|
//- Write case meta data
|
||||||
|
void writeMeta(dictionary& dict) const;
|
||||||
|
|
||||||
|
//- Write registered dictionaries
|
||||||
|
void writeRegisteredDicts
|
||||||
|
(
|
||||||
|
const objectRegistry& obr,
|
||||||
|
dictionary& dict,
|
||||||
|
dictionary& dictionaries
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Write file-based dictionaries
|
||||||
|
void writeFileDicts
|
||||||
|
(
|
||||||
|
dictionary& dict,
|
||||||
|
dictionary& dictionaries
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Write function object results
|
||||||
|
void writeFunctionObjects(dictionary& dict) const;
|
||||||
|
|
||||||
|
//- Write mesh statistics
|
||||||
|
void writeMeshStats(const polyMesh& mesh, dictionary& dict) const;
|
||||||
|
|
||||||
|
//- Write mesh patches
|
||||||
|
void writePatches(const fvMesh& mesh, dictionary& dict) const;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("caseInfo");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from Time and dictionary
|
||||||
|
caseInfo
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const Time& runTime,
|
||||||
|
const dictionary& dict
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~caseInfo() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Read the controls
|
||||||
|
virtual bool read(const dictionary& dict);
|
||||||
|
|
||||||
|
//- Execute, does nothing
|
||||||
|
virtual bool execute();
|
||||||
|
|
||||||
|
//- Write the caseInfo
|
||||||
|
virtual bool write();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace functionObjects
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
Reference in New Issue
Block a user