diff --git a/applications/utilities/preProcessing/setExprBoundaryFields/readFields.H b/applications/utilities/preProcessing/setExprBoundaryFields/readFields.H new file mode 100644 index 0000000000000000000000000000000000000000..224b906fd2551676fc7e4058984fc81d922ea0f2 --- /dev/null +++ b/applications/utilities/preProcessing/setExprBoundaryFields/readFields.H @@ -0,0 +1,190 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 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::readFieldsHandler + +Description + A simple field-loader, as per the readFields function object + +\*---------------------------------------------------------------------------*/ + +#ifndef readFieldsHander_H +#define readFieldsHander_H + +#include "fvMesh.H" +#include "volFields.H" +#include "surfaceFields.H" +#include "messageStream.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class readFieldsHandler Declaration +\*---------------------------------------------------------------------------*/ + +class readFieldsHandler +{ + // Private Data + + //- Mesh reference + fvMesh& mesh_; + + //- Output logging (verbosity) + bool log; + + + // Private Member Functions + + //- Attempt load from io, store on database if successful + template<class FieldType> + bool loadAndStore(const IOobject& io) + { + if (FieldType::typeName == io.headerClassName()) + { + // Store field on mesh database + Log << " Reading " << io.name() + << " (" << FieldType::typeName << ')' << endl; + + mesh_.objectRegistry::store(new FieldType(io, mesh_)); + return true; + } + + return false; + } + + //- Forward to loadAndStore for supported types + template<class Type> + bool loadField(const IOobject& io) + { + typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType; + typedef typename VolFieldType::Internal IntVolFieldType; + typedef GeometricField<Type, fvsPatchField, surfaceMesh> + SurfaceFieldType; + + return + ( + loadAndStore<VolFieldType>(io) + || loadAndStore<IntVolFieldType>(io) + || loadAndStore<SurfaceFieldType>(io) + ); + } + + + //- Load all fields + label loadFields(const UList<word>& fieldSet_) + { + label nLoaded = 0; + + for (const word& fieldName : fieldSet_) + { + // Already loaded? + const auto* ptr = mesh_.cfindObject<regIOobject>(fieldName); + + if (ptr) + { + ++nLoaded; + DebugInfo + << "readFields : " + << ptr->name() << " (" << ptr->type() + << ") already in database" << endl; + continue; + } + + // Load field as necessary + IOobject io + ( + fieldName, + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::NO_WRITE + ); + + const bool ok = + ( + io.typeHeaderOk<regIOobject>(false) // Preload header info + && !io.headerClassName().empty() // Extra safety + && + ( + loadField<scalar>(io) + || loadField<vector>(io) + || loadField<sphericalTensor>(io) + || loadField<symmTensor>(io) + || loadField<tensor>(io) + ) + ); + + if (ok) + { + ++nLoaded; + } + else + { + DebugInfo + << "readFields : failed to load " << fieldName + << endl; + } + } + + return nLoaded; + } + + +public: + + static const bool debug = false; + + + // Constructors + + //- Construct + explicit readFieldsHandler(fvMesh& mesh, bool verbose=true) + : + mesh_(mesh), + log(verbose) + {} + + + // Member Functions + + bool execute(const UList<word>& fieldNames) + { + loadFields(fieldNames); + return true; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/preProcessing/setExprBoundaryFields/setExprBoundaryFields.C b/applications/utilities/preProcessing/setExprBoundaryFields/setExprBoundaryFields.C index 179361cdc36a2b2b726ac778778bc47011b34b6d..d6d240ba9e9d81e6cce9ed9e50725d983233ccea 100644 --- a/applications/utilities/preProcessing/setExprBoundaryFields/setExprBoundaryFields.C +++ b/applications/utilities/preProcessing/setExprBoundaryFields/setExprBoundaryFields.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -44,10 +44,10 @@ Note #include "pointMesh.H" #include "volFields.H" #include "surfaceFields.H" -#include "surfaceFields.H" #include "pointFields.H" #include "patchExprDriver.H" #include "timeSelector.H" +#include "readFields.H" using namespace Foam; @@ -67,20 +67,25 @@ int main(int argc, char *argv[]) "file", "Alternative dictionary for setExprBoundaryFieldsDict" ); - argList::addBoolOption ( "cache-fields", "Cache fields between calls", true // Advanced ); + argList::addOption + ( + "load-fields", + "wordList", + "Specify field or fields to preload. Eg, 'T' or '(p T U)'", + true // Advanced + ); argList::addBoolOption ( "backup", "Preserve sub-entry as .backup", true // Advanced ); - argList::addBoolOption ( "dry-run", @@ -128,12 +133,29 @@ int main(int argc, char *argv[]) mesh.readUpdate(); + // preload fields specified on command-line + if (timei == 0) + { + wordList preloadFields; + args.readListIfPresent("load-fields", preloadFields); + readFieldsHandler(mesh).execute(preloadFields); + } + // preload fields specified in dictionary + { + wordList preloadFields; + setExprDict.readIfPresent("readFields", preloadFields); + readFieldsHandler(mesh).execute(preloadFields); + } + for (const entry& dEntry : setExprDict) { if (!dEntry.isDict()) { - Info<< "Ignoring non-dictionary entry " - << dEntry.keyword() << nl; + if (dEntry.keyword() != "readFields") + { + Info<< "Ignoring non-dictionary entry " + << dEntry.keyword() << nl; + } continue; } @@ -193,8 +215,8 @@ int main(int argc, char *argv[]) for (const dictionary& currDict : exprDicts) { - const word targetName = currDict.get<word>("target"); - const word patchName = currDict.get<word>("patch"); + const word patchName(currDict.get<word>("patch")); + const word targetName(currDict.get<word>("target")); dictionary& patchDict = boundaryFieldDict.subDict(patchName); diff --git a/applications/utilities/preProcessing/setExprFields/readFields.H b/applications/utilities/preProcessing/setExprFields/readFields.H new file mode 100644 index 0000000000000000000000000000000000000000..224b906fd2551676fc7e4058984fc81d922ea0f2 --- /dev/null +++ b/applications/utilities/preProcessing/setExprFields/readFields.H @@ -0,0 +1,190 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 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::readFieldsHandler + +Description + A simple field-loader, as per the readFields function object + +\*---------------------------------------------------------------------------*/ + +#ifndef readFieldsHander_H +#define readFieldsHander_H + +#include "fvMesh.H" +#include "volFields.H" +#include "surfaceFields.H" +#include "messageStream.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class readFieldsHandler Declaration +\*---------------------------------------------------------------------------*/ + +class readFieldsHandler +{ + // Private Data + + //- Mesh reference + fvMesh& mesh_; + + //- Output logging (verbosity) + bool log; + + + // Private Member Functions + + //- Attempt load from io, store on database if successful + template<class FieldType> + bool loadAndStore(const IOobject& io) + { + if (FieldType::typeName == io.headerClassName()) + { + // Store field on mesh database + Log << " Reading " << io.name() + << " (" << FieldType::typeName << ')' << endl; + + mesh_.objectRegistry::store(new FieldType(io, mesh_)); + return true; + } + + return false; + } + + //- Forward to loadAndStore for supported types + template<class Type> + bool loadField(const IOobject& io) + { + typedef GeometricField<Type, fvPatchField, volMesh> VolFieldType; + typedef typename VolFieldType::Internal IntVolFieldType; + typedef GeometricField<Type, fvsPatchField, surfaceMesh> + SurfaceFieldType; + + return + ( + loadAndStore<VolFieldType>(io) + || loadAndStore<IntVolFieldType>(io) + || loadAndStore<SurfaceFieldType>(io) + ); + } + + + //- Load all fields + label loadFields(const UList<word>& fieldSet_) + { + label nLoaded = 0; + + for (const word& fieldName : fieldSet_) + { + // Already loaded? + const auto* ptr = mesh_.cfindObject<regIOobject>(fieldName); + + if (ptr) + { + ++nLoaded; + DebugInfo + << "readFields : " + << ptr->name() << " (" << ptr->type() + << ") already in database" << endl; + continue; + } + + // Load field as necessary + IOobject io + ( + fieldName, + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::NO_WRITE + ); + + const bool ok = + ( + io.typeHeaderOk<regIOobject>(false) // Preload header info + && !io.headerClassName().empty() // Extra safety + && + ( + loadField<scalar>(io) + || loadField<vector>(io) + || loadField<sphericalTensor>(io) + || loadField<symmTensor>(io) + || loadField<tensor>(io) + ) + ); + + if (ok) + { + ++nLoaded; + } + else + { + DebugInfo + << "readFields : failed to load " << fieldName + << endl; + } + } + + return nLoaded; + } + + +public: + + static const bool debug = false; + + + // Constructors + + //- Construct + explicit readFieldsHandler(fvMesh& mesh, bool verbose=true) + : + mesh_(mesh), + log(verbose) + {} + + + // Member Functions + + bool execute(const UList<word>& fieldNames) + { + loadFields(fieldNames); + return true; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/preProcessing/setExprFields/setExprFields.C b/applications/utilities/preProcessing/setExprFields/setExprFields.C index 57e05ad4cb3a184b132da2b1176c1885a1ae62ed..0865b407af68cb27dc54dd2c6e2636cb48f1f9cb 100644 --- a/applications/utilities/preProcessing/setExprFields/setExprFields.C +++ b/applications/utilities/preProcessing/setExprFields/setExprFields.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2019-2020 OpenCFD Ltd. + Copyright (C) 2019-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -44,12 +44,11 @@ Note #include "pointMesh.H" #include "volFields.H" #include "surfaceFields.H" -#include "surfaceFields.H" #include "pointFields.H" #include "exprOps.H" #include "volumeExprDriver.H" #include "timeSelector.H" -#include "dlLibraryTable.H" +#include "readFields.H" using namespace Foam; @@ -175,7 +174,7 @@ void setField if (cond.empty()) { - // No condition + // No condition - set all output = result; setCells = output.size(); @@ -288,12 +287,16 @@ void evaluate << "Expression:" << nl << ">>>>" << nl << expression.c_str() << nl - << "<<<<" << nl - << "Condition:" << nl - << ">>>>" << nl - << condition.c_str() << nl << "<<<<" << nl; + if (condition.size() && condition != "true") + { + Info<< "Condition:" << nl + << ">>>>" << nl + << condition.c_str() << nl + << "<<<<" << nl; + } + if (ctrl.keepPatches) { Info<< "Keeping patches unaltered" << endl; @@ -542,32 +545,38 @@ int main(int argc, char *argv[]) "file", "Alternative dictionary for setExprFieldsDict" ); - argList::addBoolOption ( "dry-run", "Evaluate but do not write" ); - argList::addBoolOption ( "verbose", "Additional verbosity", true // Advanced option ); - + argList::addOption + ( + "load-fields", + "wordList", + "Specify field or fields to preload. Eg, 'T' or '(p T U)'", + true // Advanced option + ); argList::addOption ( "field", "name", - "The field to overwrite command-line operation)", + "The field to overwrite" + " (command-line operation)", true // Advanced option ); argList::addOption ( "expression", "expr", - "The expression to evaluate (command-line operation)", + "The expression to evaluate" + " (command-line operation)", true // Advanced option ); argList::addOption @@ -582,7 +591,7 @@ int main(int argc, char *argv[]) ( "dimension", "dims", - "The dimensions to apply for created fields" + "The dimensions for created fields" " (command-line operation)", true // Advanced option ); @@ -601,7 +610,8 @@ int main(int argc, char *argv[]) argList::addBoolOption ( "create", - "Create a new field (command-line operation)", + "Create a new field" + " (command-line operation)", true // Advanced option ); argList::addBoolOption @@ -714,7 +724,6 @@ int main(int argc, char *argv[]) exprDictPtr.reset(new IOdictionary(dictIO)); } - forAll(times, timei) { runTime.setTime(times[timei], timei); @@ -723,6 +732,14 @@ int main(int argc, char *argv[]) mesh.readUpdate(); + // preload fields specified on command-line + if (timei == 0) + { + wordList preloadFields; + args.readListIfPresent("load-fields", preloadFieldNames); + readFieldsHandler(mesh).execute(preloadFields); + } + if (args.found("dummy-phi") && !dummyPhi) { Info<< "Adding a dummy phi" << endl; @@ -806,6 +823,13 @@ int main(int argc, char *argv[]) { const dictionary& exprDict = *exprDictPtr; + // preload fields specified in dictionary + { + wordList preloadFields; + exprDict.readIfPresent("readFields", preloadFields); + readFieldsHandler(mesh).execute(preloadFields); + } + // Read set construct info from dictionary PtrList<entry> actions(exprDict.lookup("expressions")); diff --git a/etc/caseDicts/annotated/setExprBoundaryFieldsDict b/etc/caseDicts/annotated/setExprBoundaryFieldsDict index 4435b6b622379760b5950710df54f7b811394ea6..54562d32b01249b95b6e3765daf4aa7926d94dff 100644 --- a/etc/caseDicts/annotated/setExprBoundaryFieldsDict +++ b/etc/caseDicts/annotated/setExprBoundaryFieldsDict @@ -14,6 +14,9 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Preload any required fields (optional) +readFields ( U ); + pattern { field T; diff --git a/etc/caseDicts/annotated/setExprFieldsDict b/etc/caseDicts/annotated/setExprFieldsDict index ad72aed963f903f982cbc47032f21d1158f94ab9..c2066852d7a997d1a28ffde884331f78db62d5f3 100644 --- a/etc/caseDicts/annotated/setExprFieldsDict +++ b/etc/caseDicts/annotated/setExprFieldsDict @@ -14,6 +14,9 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Preload any required fields (optional) +readFields ( U ); + expressions ( T diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/Allrun b/tutorials/incompressible/simpleFoam/turbineSiting/Allrun index 86a3f1fc77c957dace816317476ec0e6edba89c4..426d4057b4f20e478889b1606d40f405e5354a89 100755 --- a/tutorials/incompressible/simpleFoam/turbineSiting/Allrun +++ b/tutorials/incompressible/simpleFoam/turbineSiting/Allrun @@ -28,4 +28,8 @@ runApplication reconstructParMesh -constant runApplication reconstructPar +runApplication setExprFields -latestTime ## -load-fields U + +runApplication setExprBoundaryFields -latestTime ## -load-fields '(U)' + #------------------------------------------------------------------------------ diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprBoundaryFieldsDict b/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprBoundaryFieldsDict new file mode 100644 index 0000000000000000000000000000000000000000..4cf97c4ea89959d3db1ba4ac5fe11f5ead33485c --- /dev/null +++ b/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprBoundaryFieldsDict @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2012 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setExprBoundaryFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Preload any required fields (optional) +readFields ( U ); + +updateBCs +{ + field windPowerDensity; + + _value1 + { + target value; + variables ( "rho=1.2" ); + expression #{ 0.5*rho*cbrt(mag(U)) #}; + } + + expressions + ( + { $_value1; patch inlet; } + { $_value1; patch outlet; } + { $_value1; patch sides; } + { $_value1; patch top; } + ); +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprFieldsDict b/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprFieldsDict new file mode 100644 index 0000000000000000000000000000000000000000..73092c745f433fdb743b87007b1e77b894d5210e --- /dev/null +++ b/tutorials/incompressible/simpleFoam/turbineSiting/system/setExprFieldsDict @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2012 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setExprFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Preload any required fields (optional) +readFields ( U ); + +_value1 +{ + variables ( "rho=1.2" ); + expression #{ 0.5*rho*cbrt(mag(U)) #}; +} + +expressions +( + windPowerDensity + { + field windPowerDensity; + create yes; + $_value1; + } +); + + +// ************************************************************************* //