diff --git a/applications/utilities/preProcessing/setExprBoundaryFields/readFields.H b/applications/utilities/preProcessing/setExprBoundaryFields/readFields.H
new file mode 100644
index 0000000000..224b906fd2
--- /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 .
+
+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
+ 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
+ bool loadField(const IOobject& io)
+ {
+ typedef GeometricField VolFieldType;
+ typedef typename VolFieldType::Internal IntVolFieldType;
+ typedef GeometricField
+ SurfaceFieldType;
+
+ return
+ (
+ loadAndStore(io)
+ || loadAndStore(io)
+ || loadAndStore(io)
+ );
+ }
+
+
+ //- Load all fields
+ label loadFields(const UList& fieldSet_)
+ {
+ label nLoaded = 0;
+
+ for (const word& fieldName : fieldSet_)
+ {
+ // Already loaded?
+ const auto* ptr = mesh_.cfindObject(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(false) // Preload header info
+ && !io.headerClassName().empty() // Extra safety
+ &&
+ (
+ loadField(io)
+ || loadField(io)
+ || loadField(io)
+ || loadField(io)
+ || loadField(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& 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 179361cdc3..d6d240ba9e 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("target");
- const word patchName = currDict.get("patch");
+ const word patchName(currDict.get("patch"));
+ const word targetName(currDict.get("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 0000000000..224b906fd2
--- /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 .
+
+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
+ 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
+ bool loadField(const IOobject& io)
+ {
+ typedef GeometricField VolFieldType;
+ typedef typename VolFieldType::Internal IntVolFieldType;
+ typedef GeometricField
+ SurfaceFieldType;
+
+ return
+ (
+ loadAndStore(io)
+ || loadAndStore(io)
+ || loadAndStore(io)
+ );
+ }
+
+
+ //- Load all fields
+ label loadFields(const UList& fieldSet_)
+ {
+ label nLoaded = 0;
+
+ for (const word& fieldName : fieldSet_)
+ {
+ // Already loaded?
+ const auto* ptr = mesh_.cfindObject(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(false) // Preload header info
+ && !io.headerClassName().empty() // Extra safety
+ &&
+ (
+ loadField(io)
+ || loadField(io)
+ || loadField(io)
+ || loadField(io)
+ || loadField(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& 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 57e05ad4cb..0865b407af 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 actions(exprDict.lookup("expressions"));
diff --git a/etc/caseDicts/annotated/setExprBoundaryFieldsDict b/etc/caseDicts/annotated/setExprBoundaryFieldsDict
index 4435b6b622..54562d32b0 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 ad72aed963..c2066852d7 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 86a3f1fc77..426d4057b4 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 0000000000..4cf97c4ea8
--- /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 0000000000..73092c745f
--- /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;
+ }
+);
+
+
+// ************************************************************************* //