diff --git a/etc/codeTemplates/dynamicCode/fluidThermo b/etc/codeTemplates/dynamicCode/fluidThermo
new file mode 100644
index 0000000000..dfda52b907
--- /dev/null
+++ b/etc/codeTemplates/dynamicCode/fluidThermo
@@ -0,0 +1,105 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Version: dev
+ \\/ M anipulation |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fluidThermo;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+type
+(
+ hePsiThermo
+ heRhoThermo
+);
+
+baseType
+(
+ hePsiThermo psiThermo
+ heRhoThermo rhoThermo
+);
+
+energy
+(
+ sensibleEnthalpy
+ absoluteEnthalpy
+ sensibleInternalEnergy
+ absoluteInternalEnergy
+);
+
+mixture
+(
+ pureMixture
+);
+
+transport
+(
+ const
+ icoTabulated
+ logPolynomial
+ polynomial
+ sutherland
+ tabulated
+ WLF
+);
+
+thermo
+(
+ eConst
+ eIcoTabulated
+ ePolynomial
+ ePower
+ eTabulated
+ hConst
+ hIcoTabulated
+ hPolynomial
+ hPower
+ hTabulated
+ janaf
+);
+
+equationOfState
+(
+ adiabaticPerfectFluid
+ Boussinesq
+ icoPolynomial
+ icoTabulated
+ incompressiblePerfectGas
+ linear
+ PengRobinsonGas
+ perfectFluid
+ perfectGas
+ rhoConst
+ rhoTabulated
+ rPolynomial
+);
+
+codeOptions
+#{
+EXE_INC = \
+ -I$(LIB_SRC)/transportModels/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/thermophysicalProperties/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/lnInclude
+#};
+
+codeLibs
+#{
+LIB_LIBS = \
+ -ltransportModels \
+ -lspecie \
+ -lthermophysicalProperties \
+ -lfluidThermophysicalModels \
+ -lfiniteVolume
+#};
+
+
+// ************************************************************************* //
diff --git a/etc/codeTemplates/dynamicCode/fluidThermo.C b/etc/codeTemplates/dynamicCode/fluidThermo.C
new file mode 100644
index 0000000000..0fbc47f1a8
--- /dev/null
+++ b/etc/codeTemplates/dynamicCode/fluidThermo.C
@@ -0,0 +1,90 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) YEAR OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "forThermo.H"
+#include "makeThermo.H"
+
+#include "thermo.H"
+
+// EoS
+#include "${equationOfState}.H"
+
+// Thermo
+#include "${thermo}Thermo.H"
+#include "${energy}.H"
+
+// Transport
+#include "${transport}Transport.H"
+
+// psi/rho
+#include "${baseType}.H"
+#include "${type}.H"
+
+// Mixture
+#include "${mixture}.H"
+
+
+// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
+
+extern "C"
+{
+ // dynamicCode:
+ // SHA1 = ${SHA1sum}
+ //
+ // Unique function name that can be checked if the correct library version
+ // has been loaded
+ void ${typeName}_${SHA1sum}(bool load)
+ {
+ if (load)
+ {
+ // code that can be explicitly executed after loading
+ }
+ else
+ {
+ // code that can be explicitly executed before unloading
+ }
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ forThermo
+ (
+ ${transport}Transport,
+ ${energy},
+ ${thermo}Thermo,
+ ${equationOfState},
+ specie,
+ makeThermos,
+ ${baseType},
+ ${type},
+ ${mixture}
+ );
+}
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C
index 97207b942d..01c624b2a7 100644
--- a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C
+++ b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2011-2020 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2011-2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -274,7 +274,6 @@ void Foam::codedBase::createLibrary
<< endl;
}
}
- reduce(create, orOp());
}
diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C
index 5ac5b505c8..bd20b0f976 100644
--- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C
+++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C
@@ -139,6 +139,34 @@ void Foam::dynamicCode::copyAndFilter
}
+Foam::fileName Foam::dynamicCode::resolveTemplate
+(
+ const fileName& templateName
+)
+{
+ // Try to get template from FOAM_CODESTREAM_TEMPLATES
+ const fileName templateDir(Foam::getEnv(codeTemplateEnvName));
+
+ fileName file;
+ if (!templateDir.empty() && isDir(templateDir))
+ {
+ file = templateDir/templateName;
+ if (!isFile(file, false, false))
+ {
+ file.clear();
+ }
+ }
+
+ // Not found - fallback to ~OpenFOAM expansion
+ if (file.empty())
+ {
+ file = findEtcFile(codeTemplateDirName/templateName);
+ }
+
+ return file;
+}
+
+
bool Foam::dynamicCode::resolveTemplates
(
const UList& templateNames,
diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H
index b7e8575778..7aeacaf2a2 100644
--- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H
+++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2011-2020 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2011-2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -226,13 +226,11 @@ public:
// Corresponds to topDirName/codeDirName()
fileName codeRelPath() const;
-
//- Library path for specified code name relative to \$FOAM_CASE
// Corresponds to
// dynamicCode/codeDirName()/libSubDir()/lib\.so
fileName libRelPath() const;
-
//- Path for SHA1Digest
// Corresponds to codePath()/Make/SHA1Digest
fileName digestFile() const
@@ -240,6 +238,9 @@ public:
return codeRoot_/codeDirName_/"Make/SHA1Digest";
}
+ //- Resolve code-template via the codeTemplateEnvName
+ // alternatively in the codeTemplateDirName via Foam::findEtcFile
+ static fileName resolveTemplate(const fileName& templateName);
//- Clear files and variables
void clear();
diff --git a/src/thermophysicalModels/basic/Make/files b/src/thermophysicalModels/basic/Make/files
index 92dff66672..f3720d753b 100644
--- a/src/thermophysicalModels/basic/Make/files
+++ b/src/thermophysicalModels/basic/Make/files
@@ -1,4 +1,5 @@
basicThermo/basicThermo.C
+basicThermo/compileThermo.C
fluidThermo/fluidThermo.C
diff --git a/src/thermophysicalModels/basic/basicThermo/basicThermoTemplates.C b/src/thermophysicalModels/basic/basicThermo/basicThermoTemplates.C
index ba9e3b808e..79b561473d 100644
--- a/src/thermophysicalModels/basic/basicThermo/basicThermoTemplates.C
+++ b/src/thermophysicalModels/basic/basicThermo/basicThermoTemplates.C
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2012-2020 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2012-2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -25,6 +25,7 @@ License
#include "basicThermo.H"
#include "wordIOList.H"
+#include "compileThermo.H"
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
@@ -41,47 +42,74 @@ typename Table::iterator Foam::basicThermo::lookupCstrIter
// Lookup the thermo package
typename Table::iterator cstrIter = tablePtr->find(thermoTypeName);
- // Print error message if package not found in the table
if (cstrIter == tablePtr->end())
{
- FatalErrorInFunction
- << "Unknown " << Thermo::typeName << " type " << nl
- << "thermoType" << thermoTypeDict << nl << nl
- << "Valid " << Thermo::typeName << " types are:"
- << nl << nl;
-
- // Get the list of all the suitable thermo packages available
- wordList validThermoTypeNames(tablePtr->sortedToc());
-
- // Build a table of the thermo packages constituent parts
- DynamicList validThermoTypeNameCmpts;
-
- // Set row zero to the column headers
- validThermoTypeNameCmpts.append(wordList(nCmpt));
- forAll(validThermoTypeNameCmpts[0], i)
+ if
+ (
+ dynamicCode::allowSystemOperations
+ && !dynamicCode::resolveTemplate(Thermo::typeName).empty()
+ )
{
- validThermoTypeNameCmpts[0][i] = cmptNames[i];
- }
-
- // Split the thermo package names into their constituent parts and add
- // them to the table, removing any incompatible entries from the list
- forAll(validThermoTypeNames, i)
- {
- const wordList names
+ compileThermo thermo
(
- Thermo::splitThermoName(validThermoTypeNames[i], nCmpt)
+ Thermo::typeName,
+ thermoTypeName,
+ thermoTypeDict
);
+ cstrIter = tablePtr->find(thermoTypeName);
- if (names.size())
+ if (cstrIter == tablePtr->end())
{
- validThermoTypeNameCmpts.append(names);
+ FatalErrorInFunction
+ << "Compilation and linkage of "
+ << Thermo::typeName << " type " << nl
+ << "thermoType" << thermoTypeDict << nl << nl
+ << "failed." << exit(FatalError);
}
}
+ else
+ {
+ // Print error message if package not found in the table
+ FatalErrorInFunction
+ << "Unknown " << Thermo::typeName << " type " << nl
+ << "thermoType" << thermoTypeDict << nl << nl
+ << "Valid " << Thermo::typeName << " types are:"
+ << nl << nl;
- // Print the table of available packages
- printTable(validThermoTypeNameCmpts, FatalError);
+ // Get the list of all the suitable thermo packages available
+ wordList validThermoTypeNames(tablePtr->sortedToc());
- FatalError<< exit(FatalError);
+ // Build a table of the thermo packages constituent parts
+ DynamicList validThermoTypeNameCmpts;
+
+ // Set row zero to the column headers
+ validThermoTypeNameCmpts.append(wordList(nCmpt));
+ forAll(validThermoTypeNameCmpts[0], i)
+ {
+ validThermoTypeNameCmpts[0][i] = cmptNames[i];
+ }
+
+ // Split the thermo package names into their constituent parts and
+ // add them to the table, removing any incompatible entries from the
+ // list
+ forAll(validThermoTypeNames, i)
+ {
+ const wordList names
+ (
+ Thermo::splitThermoName(validThermoTypeNames[i], nCmpt)
+ );
+
+ if (names.size())
+ {
+ validThermoTypeNameCmpts.append(names);
+ }
+ }
+
+ // Print the table of available packages
+ printTable(validThermoTypeNameCmpts, FatalError);
+
+ FatalError<< exit(FatalError);
+ }
}
return cstrIter;
diff --git a/src/thermophysicalModels/basic/basicThermo/compileThermo.C b/src/thermophysicalModels/basic/basicThermo/compileThermo.C
new file mode 100644
index 0000000000..cb9aaaaa7d
--- /dev/null
+++ b/src/thermophysicalModels/basic/basicThermo/compileThermo.C
@@ -0,0 +1,147 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "basicThermo.H"
+#include "compileThermo.H"
+#include "dynamicCodeContext.H"
+#include "Time.H"
+#include "IFstream.H"
+#include "OSspecific.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<>
+const Foam::wordList Foam::CodedBase::codeKeys_ =
+{};
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+Foam::dictionary Foam::compileThermo::optionsDict
+(
+ const word& thermoTypeName,
+ const word& instantiatedThermoName
+) const
+{
+ IFstream optionsFile(dynamicCode::resolveTemplate(thermoTypeName));
+ if (!optionsFile.good())
+ {
+ FatalErrorInFunction
+ << "Failed to open dictionary file " << thermoTypeName
+ << exit(FatalError);
+ }
+
+ dictionary dict(optionsFile);
+
+ fileName thermoTypeFileName(instantiatedThermoName);
+ thermoTypeFileName.replaceAll(',', '_');
+ thermoTypeFileName.replaceAll('<', '_');
+ thermoTypeFileName.replaceAll('>', '_');
+
+ dict.add("name", thermoTypeFileName);
+
+ return dict;
+}
+
+
+void Foam::compileThermo::setFilterVariable
+(
+ dynamicCode& dynCode,
+ const dynamicCodeContext& context,
+ const word& name
+) const
+{
+ const HashSet types(context.dict().lookup(name));
+ const word type(thermoTypeDict_.lookup(name));
+ if (!types.found(type))
+ {
+ FatalIOErrorInFunction(thermoTypeDict_)
+ << "Unknown " << name << " type " << type << nl
+ << "Supported " << name << " types: " << types
+ << exit(FatalIOError);
+ }
+
+ dynCode.setFilterVariable(name, type);
+}
+
+
+void Foam::compileThermo::prepare
+(
+ dynamicCode& dynCode,
+ const dynamicCodeContext& context
+) const
+{
+ dynCode.setFilterVariable("typeName", codeName());
+
+ const HashTable typeToBaseMap(context.dict().lookup("baseType"));
+
+ const word type(thermoTypeDict_.lookup("type"));
+ dynCode.setFilterVariable("type", type);
+
+ dynCode.setFilterVariable("baseType", typeToBaseMap[type]);
+
+ setFilterVariable(dynCode, context, "mixture");
+ setFilterVariable(dynCode, context, "transport");
+ setFilterVariable(dynCode, context, "thermo");
+ setFilterVariable(dynCode, context, "equationOfState");
+ setFilterVariable(dynCode, context, "energy");
+
+ // Compile filtered C template
+ dynCode.addCompileFile(thermoTypeName_ + ".C");
+
+ // Define Make/options
+ dynCode.setMakeOptions(context.options() + "\n\n" + context.libs());
+
+ // Debugging: make verbose
+ if (debug)
+ {
+ dynCode.setFilterVariable("verbose", "true");
+ Info<<"compile " << codeName() << " sha1: "
+ << context.sha1() << endl;
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::compileThermo::compileThermo
+(
+ const word& thermoTypeName,
+ const word& instantiatedThermoName,
+ const dictionary& thermoTypeDict
+)
+:
+ CodedBase
+ (
+ optionsDict(thermoTypeName, instantiatedThermoName)
+ ),
+ thermoTypeName_(thermoTypeName),
+ thermoTypeDict_(thermoTypeDict)
+{
+ this->updateLibrary();
+}
+
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/basic/basicThermo/compileThermo.H b/src/thermophysicalModels/basic/basicThermo/compileThermo.H
new file mode 100644
index 0000000000..e9112c3b6e
--- /dev/null
+++ b/src/thermophysicalModels/basic/basicThermo/compileThermo.H
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef compileThermo_H
+#define compileThermo_H
+
+#include "CodedBase.H"
+#include "dynamicCode.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class compileThermo Declaration
+\*---------------------------------------------------------------------------*/
+
+class compileThermo
+:
+ public CodedBase
+{
+ // Private Member Data
+
+ //- Name of the class Thermo basicThermo is instantiated on
+ const word thermoTypeName_;
+
+ //- Reference to the dictionary containing the thermo components
+ const dictionary& thermoTypeDict_;
+
+
+ // Private Member Functions
+
+ dictionary optionsDict
+ (
+ const word& thermoTypeName,
+ const word& instantiatedThermoName
+ ) const;
+
+ void setFilterVariable
+ (
+ dynamicCode& dynCode,
+ const dynamicCodeContext& context,
+ const word& name
+ ) const;
+
+ //- Adapt the context for the current object
+ virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
+
+ //- Clear the ptr to the redirected object
+ virtual void clearRedirect() const
+ {}
+
+
+public:
+
+ // Constructors
+
+ //- Construct from name and dictionary
+ compileThermo
+ (
+ const word& thermoTypeName,
+ const word& instantiatedThermoName,
+ const dictionary& thermoTypeDict
+ );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //