Merge branch 'feature-dynamicCode' into 'develop'

Feature dynamic code

See merge request Development/OpenFOAM-plus!255
This commit is contained in:
Mark Olesen
2019-05-07 17:33:32 +01:00
committed by Andrew Heather
34 changed files with 1040 additions and 992 deletions

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -51,19 +51,12 @@ ${localCode}
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
extern "C"
{
void ${typeName}
(
Ostream& os,
const dictionary& dict
)
extern "C" void ${typeName}(Ostream& os, const dictionary& dict)
{
//{{{ begin code
${code}
//}}} end code
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -42,7 +42,6 @@ ${codeInclude}
namespace Foam
{
namespace fv
{
@ -55,33 +54,26 @@ ${localCode}
// * * * * * * * * * * * * * * * 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)
extern "C" void ${typeName}_${SHA1sum}(bool load)
{
if (load)
{
// code that can be explicitly executed after loading
// Code that can be explicitly executed after loading
}
else
{
// code that can be explicitly executed before unloading
}
// Code that can be explicitly executed before unloading
}
}
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
//makeRemovablePatchTypeField
//(
// fvPatch${FieldType},
// ${typeName}FvOption${SourceType}
//);
defineTypeNameAndDebug(${typeName}FvOption${SourceType}, 0);
addRemovableToRunTimeSelectionTable
(
@ -91,10 +83,6 @@ addRemovableToRunTimeSelectionTable
);
const char* const ${typeName}FvOption${SourceType}::SHA1sum =
"${SHA1sum}";
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
${typeName}FvOption${SourceType}::
@ -110,8 +98,7 @@ ${typeName}FvOption${SourceType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from components\n";
printMessage("Construct ${typeName} from components");
}
}
@ -123,7 +110,7 @@ ${typeName}FvOption${SourceType}::
{
if (${verbose:-false})
{
Info<<"destroy ${typeName} sha1: ${SHA1sum}\n";
printMessage("Destroy ${typeName}");
}
}
@ -193,14 +180,14 @@ void ${typeName}FvOption${SourceType}::constrain
}
//{{{ begin code
${codeSetValue}
${codeConstrain}
//}}} end code
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace fv
} // End namespace Foam
} // End namespace fv
// ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -27,6 +27,7 @@ Description
Template for use with dynamic code generation of a source.
The hook functions take the following arguments:
\verbatim
codeCorrect
(
GeometricField<Type, fvPatchField, volMesh>& fld
@ -38,16 +39,18 @@ Description
const label fieldi
)
constrain
codeConstrain
(
fvMatrix<Type>& eqn,
const label fieldi
)
\endverbatim
where :
fieldi is the index in the fields entry
eqn is the fvMatrix
\verbatim
energySource
{
type scalarCodedSource;
@ -62,7 +65,6 @@ Description
codeInclude
#{
#};
codeCorrect
@ -78,18 +80,9 @@ Description
heSource -= 0.1*sqr(time.value())*V;
#};
codeSetValue
codeConstrain
#{
Pout<< "**codeSetValue**" << endl;
#};
// Dummy entry. Make dependent on above to trigger recompilation
code
#{
$codeInclude
$codeCorrect
$codeAddSup
$codeSetValue
Pout<< "**codeConstrain**" << endl;
#};
}
@ -98,6 +91,7 @@ Description
// Dummy entry
}
}
\endverbatim
SourceFiles
codedFvOptionTemplate.C
@ -113,7 +107,6 @@ SourceFiles
namespace Foam
{
namespace fv
{
@ -125,10 +118,18 @@ class ${typeName}FvOption${SourceType}
:
public cellSetOption
{
// Private Member Functions
//- Report a message with the SHA1sum
inline static void printMessage(const char* message)
{
Info<< message << " sha1: " << SHA1sum << '\n';
}
public:
//- Information about the SHA1 of the code itself
static const char* const SHA1sum;
//- SHA1 representation of the code content
static constexpr const char* const SHA1sum = "${SHA1sum}";
//- Runtime type information
TypeName("${typeName}");
@ -149,23 +150,22 @@ public:
virtual ~${typeName}FvOption${SourceType}();
// Member functions
// Member Functions
//- Correct field
virtual void correct
(
GeometricField<${TemplateType}, fvPatchField, volMesh>&
GeometricField<${TemplateType}, fvPatchField, volMesh>& fld
);
//- Explicit and implicit matrix contributions
//- Explicit/implicit matrix contributions
virtual void addSup
(
fvMatrix<${TemplateType}>& eqn,
const label fieldi
);
//- Explicit and implicit matrix contributions for compressible
// equations
//- Explicit/implicit matrix contributions for compressible equations
virtual void addSup
(
const volScalarField& rho,
@ -184,9 +184,8 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
} // End namespace fv
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2018-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -49,23 +49,20 @@ addRemovableToRunTimeSelectionTable
// * * * * * * * * * * * * * * * 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)
extern "C" void ${typeName}_${SHA1sum}(bool load)
{
if (load)
{
// code that can be explicitly executed after loading
// Code that can be explicitly executed after loading
}
else
{
// code that can be explicitly executed before unloading
}
// Code that can be explicitly executed before unloading
}
}
@ -101,7 +98,7 @@ tmp<pointField> ${typeName}Points0MotionSolver::curPoints() const
{
if (${verbose:-false})
{
Info<<"curPoints ${typeName} sha1: ${SHA1sum}\n";
printMessage("curPoints ${typeName}");
}
//{{{ begin code

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2018-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -56,6 +56,12 @@ class ${typeName}Points0MotionSolver
{
// Private Member Functions
//- Report a message with the SHA1sum
inline static void printMessage(const char* message)
{
Info<< message << " sha1: " << SHA1sum << '\n';
}
//- No copy construct
${typeName}Points0MotionSolver
(
@ -68,6 +74,9 @@ class ${typeName}Points0MotionSolver
public:
//- SHA1 representation of the code content
static constexpr const char* const SHA1sum = "${SHA1sum}";
//- Runtime type information
TypeName("${typeName}");

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -31,6 +31,7 @@ License
#include "volFields.H"
#include "surfaceFields.H"
#include "unitConversion.H"
//{{{ begin codeInclude
${codeInclude}
//}}} end codeInclude
@ -50,23 +51,20 @@ ${localCode}
// * * * * * * * * * * * * * * * 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)
extern "C" void ${typeName}_${SHA1sum}(bool load)
{
if (load)
{
// code that can be explicitly executed after loading
// Code that can be explicitly executed after loading
}
else
{
// code that can be explicitly executed before unloading
}
// Code that can be explicitly executed before unloading
}
}
@ -79,10 +77,6 @@ makeRemovablePatchTypeField
);
const char* const ${typeName}FixedValueFvPatch${FieldType}::SHA1sum =
"${SHA1sum}";
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
${typeName}FixedValueFvPatch${FieldType}::
@ -96,8 +90,7 @@ ${typeName}FixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/DimensionedField\n";
printMessage("Construct ${typeName} : patch/DimensionedField");
}
}
@ -115,8 +108,7 @@ ${typeName}FixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/DimensionedField/mapper\n";
printMessage("Construct ${typeName} : patch/DimensionedField/mapper");
}
}
@ -133,8 +125,7 @@ ${typeName}FixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/dictionary\n";
printMessage("Construct ${typeName} : patch/dictionary");
}
}
@ -149,8 +140,7 @@ ${typeName}FixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" as copy\n";
printMessage("Copy construct ${typeName}");
}
}
@ -166,8 +156,7 @@ ${typeName}FixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum} "
"as copy/DimensionedField\n";
printMessage("Construct ${typeName} : copy/DimensionedField");
}
}
@ -179,7 +168,7 @@ ${typeName}FixedValueFvPatch${FieldType}::
{
if (${verbose:-false})
{
Info<<"destroy ${typeName} sha1: ${SHA1sum}\n";
printMessage("Destroy ${typeName}");
}
}
@ -195,7 +184,7 @@ void ${typeName}FixedValueFvPatch${FieldType}::updateCoeffs()
if (${verbose:-false})
{
Info<<"updateCoeffs ${typeName} sha1: ${SHA1sum}\n";
printMessage("updateCoeffs ${typeName}");
}
//{{{ begin code

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -52,10 +52,18 @@ class ${typeName}FixedValueFvPatch${FieldType}
:
public fixedValueFvPatchField<${TemplateType}>
{
// Private Member Functions
//- Report a message with the SHA1sum
inline static void printMessage(const char* message)
{
Info<< message << " sha1: " << SHA1sum << '\n';
}
public:
//- Information about the SHA1 of the code itself
static const char* const SHA1sum;
//- SHA1 representation of the code content
static constexpr const char* const SHA1sum = "${SHA1sum}";
//- Runtime type information
TypeName("${typeName}");
@ -126,7 +134,7 @@ public:
virtual ~${typeName}FixedValueFvPatch${FieldType}();
// Member functions
// Member Functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -30,6 +30,7 @@ License
#include "pointPatchFieldMapper.H"
#include "pointFields.H"
#include "unitConversion.H"
//{{{ begin codeInclude
${codeInclude}
//}}} end codeInclude
@ -49,23 +50,20 @@ ${localCode}
// * * * * * * * * * * * * * * * 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)
extern "C" void ${typeName}_${SHA1sum}(bool load)
{
if (load)
{
// code that can be explicitly executed after loading
// Code that can be explicitly executed after loading
}
else
{
// code that can be explicitly executed before unloading
}
// Code that can be explicitly executed before unloading
}
}
@ -78,10 +76,6 @@ makePointPatchTypeField
);
const char* const ${typeName}FixedValuePointPatch${FieldType}::SHA1sum =
"${SHA1sum}";
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
${typeName}FixedValuePointPatch${FieldType}::
@ -95,8 +89,7 @@ ${typeName}FixedValuePointPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/DimensionedField\n";
printMessage("Construct ${typeName} : patch/DimensionedField");
}
}
@ -114,8 +107,7 @@ ${typeName}FixedValuePointPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/DimensionedField/mapper\n";
printMessage("Construct ${typeName} : patch/DimensionedField/mapper");
}
}
@ -133,8 +125,7 @@ ${typeName}FixedValuePointPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/dictionary\n";
printMessage("Construct ${typeName} : patch/dictionary");
}
}
@ -149,8 +140,7 @@ ${typeName}FixedValuePointPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" as copy\n";
printMessage("Copy construct ${typeName}");
}
}
@ -166,8 +156,7 @@ ${typeName}FixedValuePointPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum} "
"as copy/DimensionedField\n";
printMessage("Construct ${typeName} : copy/DimensionedField");
}
}
@ -179,7 +168,7 @@ ${typeName}FixedValuePointPatch${FieldType}::
{
if (${verbose:-false})
{
Info<<"destroy ${typeName} sha1: ${SHA1sum}\n";
printMessage("Destroy ${typeName}");
}
}
@ -195,7 +184,7 @@ void ${typeName}FixedValuePointPatch${FieldType}::updateCoeffs()
if (${verbose:-false})
{
Info<<"updateCoeffs ${typeName} sha1: ${SHA1sum}\n";
printMessage("updateCoeffs ${typeName}");
}
//{{{ begin code

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -52,10 +52,18 @@ class ${typeName}FixedValuePointPatch${FieldType}
:
public fixedValuePointPatchField<${TemplateType}>
{
// Private Member Functions
//- Report a message with the SHA1sum
inline static void printMessage(const char* message)
{
Info<< message << " sha1: " << SHA1sum << '\n';
}
public:
//- Information about the SHA1 of the code itself
static const char* const SHA1sum;
//- SHA1 representation of the code content
static constexpr const char* const SHA1sum = "${SHA1sum}";
//- Runtime type information
TypeName("${typeName}");
@ -127,7 +135,7 @@ public:
virtual ~${typeName}FixedValuePointPatch${FieldType}();
// Member functions
// Member Functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -49,23 +49,20 @@ addRemovableToRunTimeSelectionTable
// * * * * * * * * * * * * * * * 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)
extern "C" void ${typeName}_${SHA1sum}(bool load)
{
if (load)
{
// code that can be explicitly executed after loading
// Code that can be explicitly executed after loading
}
else
{
// code that can be explicitly executed before unloading
}
// Code that can be explicitly executed before unloading
}
}
@ -112,7 +109,7 @@ bool ${typeName}FunctionObject::read(const dictionary& dict)
{
if (${verbose:-false})
{
Info<<"read ${typeName} sha1: ${SHA1sum}\n";
printMessage("read ${typeName}");
}
//{{{ begin code
@ -127,7 +124,7 @@ bool ${typeName}FunctionObject::execute()
{
if (${verbose:-false})
{
Info<<"execute ${typeName} sha1: ${SHA1sum}\n";
printMessage("execute ${typeName}");
}
//{{{ begin code
@ -142,7 +139,7 @@ bool ${typeName}FunctionObject::write()
{
if (${verbose:-false})
{
Info<<"write ${typeName} sha1: ${SHA1sum}\n";
printMessage("write ${typeName}");
}
//{{{ begin code
@ -157,7 +154,7 @@ bool ${typeName}FunctionObject::end()
{
if (${verbose:-false})
{
Info<<"end ${typeName} sha1: ${SHA1sum}\n";
printMessage("end ${typeName}");
}
//{{{ begin code

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -24,8 +24,7 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Description
Template for use with dynamic code generation of a
OutputFilter functionObject.
Template for use with dynamic code generation of a functionObject.
SourceFiles
functionObjectTemplate.C
@ -57,7 +56,7 @@ class ${typeName}FunctionObject
:
public functionObjects::regionFunctionObject
{
// Private data
// Private Data
//{{{ begin codeData
${codeData}
@ -66,6 +65,13 @@ class ${typeName}FunctionObject
// Private Member Functions
//- Report a message with the SHA1sum
inline static void printMessage(const char* message)
{
Info<< message << " sha1: " << SHA1sum << '\n';
}
//- Cast reference of objectRegistry to fvMesh
const fvMesh& mesh() const;
//- No copy construct
@ -74,9 +80,11 @@ class ${typeName}FunctionObject
//- No copy assignment
void operator=(const ${typeName}FunctionObject&) = delete;
public:
//- SHA1 representation of the code content
static constexpr const char* const SHA1sum = "${SHA1sum}";
//- Runtime type information
TypeName("${typeName}");
@ -98,17 +106,17 @@ public:
// Member Functions
//- Read the system calls
//- Read the dictionary
virtual bool read(const dictionary& dict);
//- Execute the "executeCalls" at each time-step
//- Execute (at time-step)
virtual bool execute();
//- Execute the "endCalls" at the final time-loop
virtual bool end();
//- Write, execute the "writeCalls"
//- Write (at write interval)
virtual bool write();
//- Executed at the final time-loop
virtual bool end();
};

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -31,6 +31,7 @@ License
#include "volFields.H"
#include "surfaceFields.H"
#include "unitConversion.H"
//{{{ begin codeInclude
${codeInclude}
//}}} end codeInclude
@ -47,26 +48,22 @@ namespace Foam
${localCode}
//}}} end localCode
// * * * * * * * * * * * * * * * 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)
extern "C" void ${typeName}_${SHA1sum}(bool load)
{
if (load)
{
// code that can be explicitly executed after loading
// Code that can be explicitly executed after loading
}
else
{
// code that can be explicitly executed before unloading
}
// Code that can be explicitly executed before unloading
}
}
@ -79,10 +76,6 @@ makeRemovablePatchTypeField
);
const char* const ${typeName}MixedValueFvPatch${FieldType}::SHA1sum =
"${SHA1sum}";
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
${typeName}MixedValueFvPatch${FieldType}::
@ -96,8 +89,7 @@ ${typeName}MixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/DimensionedField\n";
printMessage("Construct ${typeName} : patch/DimensionedField");
}
}
@ -115,8 +107,7 @@ ${typeName}MixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/DimensionedField/mapper\n";
printMessage("Construct ${typeName} : patch/DimensionedField/mapper");
}
}
@ -133,8 +124,7 @@ ${typeName}MixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" from patch/dictionary\n";
printMessage("Construct ${typeName} : patch/dictionary");
}
}
@ -149,8 +139,7 @@ ${typeName}MixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum}"
" as copy\n";
printMessage("Copy construct ${typeName}");
}
}
@ -166,8 +155,7 @@ ${typeName}MixedValueFvPatch${FieldType}
{
if (${verbose:-false})
{
Info<<"construct ${typeName} sha1: ${SHA1sum} "
"as copy/DimensionedField\n";
printMessage("Construct ${typeName} : copy/DimensionedField");
}
}
@ -179,7 +167,7 @@ ${typeName}MixedValueFvPatch${FieldType}::
{
if (${verbose:-false})
{
Info<<"destroy ${typeName} sha1: ${SHA1sum}\n";
printMessage("Destroy ${typeName}");
}
}
@ -195,7 +183,7 @@ void ${typeName}MixedValueFvPatch${FieldType}::updateCoeffs()
if (${verbose:-false})
{
Info<<"updateCoeffs ${typeName} sha1: ${SHA1sum}\n";
printMessage("updateCoeffs ${typeName}");
}
//{{{ begin code

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) YEAR AUTHOR,AFFILIATION
@ -52,10 +52,18 @@ class ${typeName}MixedValueFvPatch${FieldType}
:
public mixedFvPatchField<${TemplateType}>
{
// Private Member Functions
//- Report a message with the SHA1sum
inline static void printMessage(const char* message)
{
Info<< message << " sha1: " << SHA1sum << '\n';
}
public:
//- Information about the SHA1 of the code itself
static const char* const SHA1sum;
//- SHA1 representation of the code content
static constexpr const char* const SHA1sum = "${SHA1sum}";
//- Runtime type information
TypeName("${typeName}");
@ -126,7 +134,7 @@ public:
virtual ~${typeName}MixedValueFvPatch${FieldType}();
// Member functions
// Member Functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2018-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2017 OpenFOAM Foundation
@ -61,10 +61,6 @@ namespace functionEntries
}
const Foam::word Foam::functionEntries::codeStream::codeTemplateC
= "codeStreamTemplate.C";
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::dlLibraryTable& Foam::functionEntries::codeStream::libs
@ -94,28 +90,20 @@ bool Foam::functionEntries::codeStream::doingMasterOnlyReading
topDict
);
if (debug)
{
Pout<< "codeStream : baseIOdictionary:" << dict.name()
<< " master-only-reading:" << d.globalObject()
<< endl;
}
DebugPout
<< "codeStream : baseIOdictionary:" << dict.name()
<< " master-only-reading:" << d.globalObject() << endl;
return d.globalObject();
}
else
{
if (debug)
{
Pout<< "codeStream : not a baseIOdictionary:" << dict.name()
<< " master-only-reading:" << regIOobject::masterOnlyReading
<< endl;
}
DebugPout
<< "codeStream : not a baseIOdictionary:" << dict.name()
<< " master-only-reading:" << regIOobject::masterOnlyReading << endl;
// Fall back to regIOobject::masterOnlyReading
return regIOobject::masterOnlyReading;
}
}
Foam::functionEntries::codeStream::streamingFunctionType
@ -147,17 +135,13 @@ Foam::functionEntries::codeStream::getFunction
lib = libs(parentDict).findLibrary(libPath);
}
if (!lib)
{
DetailInfo
<< "Using #codeStream with " << libPath << endl;
}
// nothing loaded
// avoid compilation if possible by loading an existing library
if (!lib)
{
DetailInfo
<< "Using #codeStream with " << libPath << endl;
if (isA<baseIOdictionary>(topDict))
{
// Cached access to dl libs. Guarantees clean up upon destruction
@ -199,7 +183,7 @@ Foam::functionEntries::codeStream::getFunction
"EXE_INC = -g \\\n"
+ context.options()
+ "\n\nLIB_LIBS = \\\n"
+ " -lOpenFOAM \\\n"
" -lOpenFOAM \\\n"
+ context.libs()
);
@ -237,26 +221,21 @@ Foam::functionEntries::codeStream::getFunction
off_t masterSize = mySize;
Pstream::scatter(masterSize);
if (debug)
{
Pout<< endl<< "on processor " << Pstream::myProcNo()
DebugPout
<< nl << "on processor " << Pstream::myProcNo()
<< " have masterSize:" << masterSize
<< " and localSize:" << mySize
<< endl;
}
<< " and localSize:" << mySize << endl;
if (mySize < masterSize)
{
if (debug)
{
Pout<< "Local file " << libPath
DebugPout
<< "Local file " << libPath
<< " not of same size (" << mySize
<< ") as master ("
<< masterSize << "). Waiting for "
<< regIOobject::fileModificationSkew
<< " seconds." << endl;
}
Foam::sleep(regIOobject::fileModificationSkew);
// Recheck local size
@ -278,13 +257,10 @@ Foam::functionEntries::codeStream::getFunction
}
}
if (debug)
{
Pout<< endl<< "on processor " << Pstream::myProcNo()
DebugPout
<< nl << "on processor " << Pstream::myProcNo()
<< " after waiting: have masterSize:" << masterSize
<< " and localSize:" << mySize
<< endl;
}
<< " and localSize:" << mySize << endl;
}
if (isA<baseIOdictionary>(topDict))
@ -293,10 +269,8 @@ Foam::functionEntries::codeStream::getFunction
// of Time.
dlLibraryTable& dlLibs = libs(parentDict);
if (debug)
{
Pout<< "Opening cached dictionary:" << libPath << endl;
}
DebugPout
<< "Opening cached dictionary:" << libPath << endl;
if (!dlLibs.open(libPath, false))
{
@ -312,10 +286,9 @@ Foam::functionEntries::codeStream::getFunction
else
{
// Uncached opening of libPath
if (debug)
{
Pout<< "Opening uncached dictionary:" << libPath << endl;
}
DebugPout
<< "Opening uncached dictionary:" << libPath << endl;
lib = dlOpen(libPath, true);
}
}

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2017 OpenFOAM Foundation
@ -100,12 +100,13 @@ SourceFiles
namespace Foam
{
// Forward Declarations
class dlLibraryTable;
namespace functionEntries
{
// Forward declaration of friend classes
// Forward Declarations
class calcEntry;
/*---------------------------------------------------------------------------*\
@ -147,10 +148,12 @@ class codeStream
public:
// Static data members
// Static Data Members
//- Name of the C code template to be used
static const word codeTemplateC;
static constexpr const char* const codeTemplateC
= "codeStreamTemplate.C";
// Related types

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation
@ -56,7 +56,6 @@ static inline void writeEntryIfPresent
const word& key
)
{
// non-recursive like dictionary::found, but no pattern-match either
const entry* eptr = dict.findEntry(key, keyType::LITERAL);
if (eptr)
@ -89,21 +88,25 @@ void* Foam::codedBase::loadLibrary
(
const fileName& libPath,
const string& globalFuncName,
const dictionary& contextDict
const dynamicCodeContext& context
) const
{
void* lib = 0;
// Avoid compilation by loading an existing library
// avoid compilation by loading an existing library
if (!libPath.empty())
void* lib =
(
!libPath.empty() && libs().open(libPath, false)
? libs().findLibrary(libPath)
: nullptr
);
if (!lib)
{
if (libs().open(libPath, false))
{
lib = libs().findLibrary(libPath);
return lib;
}
// verify the loaded version and unload if needed
if (lib)
{
// provision for manual execution of code after loading
if (dlSymFound(lib, globalFuncName))
{
@ -119,29 +122,26 @@ void* Foam::codedBase::loadLibrary
}
else
{
FatalIOErrorInFunction(contextDict)
FatalIOErrorInFunction(context.dict())
<< "Failed looking up symbol " << globalFuncName
<< nl << "from " << libPath << exit(FatalIOError);
}
}
else
{
FatalIOErrorInFunction(contextDict)
FatalIOErrorInFunction(context.dict())
<< "Failed looking up symbol " << globalFuncName << nl
<< "from " << libPath << exit(FatalIOError);
lib = 0;
lib = nullptr;
if (!libs().close(libPath, false))
{
FatalIOErrorInFunction(contextDict)
FatalIOErrorInFunction(context.dict())
<< "Failed unloading library "
<< libPath
<< exit(FatalIOError);
}
}
}
}
}
return lib;
}
@ -151,17 +151,16 @@ void Foam::codedBase::unloadLibrary
(
const fileName& libPath,
const string& globalFuncName,
const dictionary& contextDict
const dynamicCodeContext& context
) const
{
void* lib = 0;
if (libPath.empty())
{
return;
}
lib = libs().findLibrary(libPath);
void* lib =
(
!libPath.empty() && libs().open(libPath, false)
? libs().findLibrary(libPath)
: nullptr
);
if (!lib)
{
@ -183,7 +182,7 @@ void Foam::codedBase::unloadLibrary
}
else
{
FatalIOErrorInFunction(contextDict)
FatalIOErrorInFunction(context.dict())
<< "Failed looking up symbol " << globalFuncName << nl
<< "from " << libPath << exit(FatalIOError);
}
@ -191,7 +190,7 @@ void Foam::codedBase::unloadLibrary
if (!libs().close(libPath, false))
{
FatalIOErrorInFunction(contextDict)
FatalIOErrorInFunction(context.dict())
<< "Failed unloading library " << libPath
<< exit(FatalIOError);
}
@ -305,21 +304,30 @@ void Foam::codedBase::createLibrary
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::codedBase::setCodeContext(const dictionary& dict)
{
context_.setCodeContext(dict);
}
void Foam::codedBase::append(const std::string& str)
{
context_.append(str);
}
void Foam::codedBase::updateLibrary
(
const word& name
const word& name,
const dynamicCodeContext& context
) const
{
const dictionary& dict = this->codeDict();
dynamicCode::checkSecurity
(
"codedBase::updateLibrary()",
dict
context.dict()
);
dynamicCodeContext context(dict);
// codeName: name + _<sha1>
// codeDir : name
dynamicCode dynCode
@ -327,10 +335,11 @@ void Foam::codedBase::updateLibrary
name + context.sha1().str(true),
name
);
const fileName libPath = dynCode.libPath();
// the correct library was already loaded => we are done
// The correct library was already loaded => we are done
if (libs().findLibrary(libPath))
{
return;
@ -338,44 +347,55 @@ void Foam::codedBase::updateLibrary
DetailInfo
<< "Using dynamicCode for " << this->description().c_str()
<< " at line " << dict.startLineNumber()
<< " in " << dict.name() << endl;
<< " at line " << context.dict().startLineNumber()
<< " in " << context.dict().name() << endl;
// remove instantiation of fvPatchField provided by library
// Remove instantiation of fvPatchField provided by library
this->clearRedirect();
// may need to unload old library
// May need to unload old library
unloadLibrary
(
oldLibPath_,
dynamicCode::libraryBaseName(oldLibPath_),
context.dict()
context
);
// try loading an existing library (avoid compilation when possible)
if (!loadLibrary(libPath, dynCode.codeName(), context.dict()))
// Try loading an existing library (avoid compilation when possible)
if (!loadLibrary(libPath, dynCode.codeName(), context))
{
createLibrary(dynCode, context);
loadLibrary(libPath, dynCode.codeName(), context.dict());
loadLibrary(libPath, dynCode.codeName(), context);
}
// retain for future reference
// Retain for future reference
oldLibPath_ = libPath;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::codedBase::codedBase()
{}
void Foam::codedBase::updateLibrary
(
const word& name,
const dictionary& dict
) const
{
updateLibrary(name, dynamicCodeContext(dict));
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::codedBase::~codedBase()
{}
void Foam::codedBase::updateLibrary(const word& name) const
{
if (context_.valid())
{
updateLibrary(name, context_);
}
else
{
updateLibrary(name, dynamicCodeContext(this->codeDict()));
}
}
// ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation
@ -28,6 +28,15 @@ Class
Description
Base class for function objects and boundary conditions using dynamic code
that provides methods for managing loading/unloading/updating
of a dynamic library. For these purposes, it uses a dynamicCodeContext
object to maintain information about the state.
For simple coded objects, the default state management is sufficient.
When there are more complicated code segements
(eg, functionObjects::codedFunctionObject), the state management
must also register these elements as well, starting with an initial
setCodeContext() call and followed by append() to register each element.
SourceFiles
codedBase.C
@ -38,16 +47,16 @@ SourceFiles
#define codedBase_H
#include "dictionary.H"
#include "dynamicCodeContext.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
// Forward Declarations
class Ostream;
class dynamicCode;
class dynamicCodeContext;
class dlLibraryTable;
/*---------------------------------------------------------------------------*\
@ -56,11 +65,15 @@ class dlLibraryTable;
class codedBase
{
// Private data
// Private Data
//- The code context
dynamicCodeContext context_;
//- Previously loaded library
mutable fileName oldLibPath_;
// Private Member Functions
//- Global loader/unloader function type
@ -71,7 +84,7 @@ class codedBase
(
const fileName& libPath,
const string& globalFuncName,
const dictionary& contextDict
const dynamicCodeContext& context
) const;
//- Execute globalFuncName(false) and unload specified library
@ -79,11 +92,15 @@ class codedBase
(
const fileName& libPath,
const string& globalFuncName,
const dictionary& contextDict
const dynamicCodeContext& context
) const;
//- Create library based on the dynamicCodeContext
void createLibrary(dynamicCode&, const dynamicCodeContext&) const;
void createLibrary
(
dynamicCode& dynCode,
const dynamicCodeContext& context
) const;
//- No copy construct
codedBase(const codedBase&) = delete;
@ -95,22 +112,45 @@ class codedBase
protected:
//- Write code-dictionary contents
static void writeCodeDict(Ostream&, const dictionary&);
static void writeCodeDict(Ostream& os, const dictionary& dict);
//- Update library as required
// Protected Member Functions
//- Set code context from a dictionary
void setCodeContext(const dictionary& dict);
//- Add content to SHA1 hashing
void append(const std::string& str);
//- Update library as required, using the given context
void updateLibrary
(
const word& name
const word& name,
const dynamicCodeContext& context
) const;
//- Update library as required, using the given code dictionary
//- to use for the context
void updateLibrary
(
const word& name,
const dictionary& dict
) const;
//- Update library as required, using the predefined context
//- or use the codeDict() to generate one
void updateLibrary(const word& name) const;
//- Get the loaded dynamic libraries
virtual dlLibraryTable& libs() const = 0;
//- Adapt the context for the current object
virtual void prepare
(
dynamicCode&,
const dynamicCodeContext&
dynamicCode& dynCode,
const dynamicCodeContext& context
) const = 0;
// Return a description (type + name) for the output
@ -132,11 +172,11 @@ public:
// Constructors
//- Construct null
codedBase();
codedBase() = default;
//- Destructor
virtual ~codedBase();
virtual ~codedBase() = default;
};

View File

@ -36,6 +36,16 @@ License
#include "dictionary.H"
#include "foamVersion.H"
#undef EXT_SO
#ifdef __APPLE__
#define EXT_SO ".dylib"
#elif defined _WIN32
#define EXT_SO ".dll"
#else
#define EXT_SO ".so"
#endif
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
int Foam::dynamicCode::allowSystemOperations
@ -130,7 +140,7 @@ void Foam::dynamicCode::copyAndFilter
{
is.getLine(line);
// Expand according to mapping.
// Expand according to HashTable mapping, not the environment.
// Expanding according to env variables might cause too many
// surprises
stringOps::inplaceExpand(line, mapping);
@ -151,10 +161,8 @@ bool Foam::dynamicCode::resolveTemplates
const fileName templateDir(Foam::getEnv(codeTemplateEnvName));
bool allOkay = true;
forAll(templateNames, fileI)
for (const fileName& templateName : templateNames)
{
const fileName& templateName = templateNames[fileI];
fileName file;
if (!templateDir.empty() && isDir(templateDir))
{
@ -188,15 +196,16 @@ bool Foam::dynamicCode::resolveTemplates
bool Foam::dynamicCode::writeCommentSHA1(Ostream& os) const
{
const bool hasSHA1 = filterVars_.found("SHA1sum");
const auto fnd = filterVars_.cfind("SHA1sum");
if (hasSHA1)
if (!fnd.found())
{
os << "/* dynamicCode:\n * SHA1 = ";
os.writeQuoted(filterVars_["SHA1sum"], false) << "\n */\n";
return false;
}
return hasSHA1;
os << "/* dynamicCode:\n * SHA1 = ";
os.writeQuoted(*fnd, false) << "\n */\n";
return true;
}
@ -225,9 +234,9 @@ bool Foam::dynamicCode::createMakeFiles() const
writeCommentSHA1(os);
// Write compile files
forAll(compileFiles_, fileI)
for (const fileName& file : compileFiles_)
{
os.writeQuoted(compileFiles_[fileI], false) << nl;
os.writeQuoted(file, false) << nl;
}
os << nl
@ -317,13 +326,15 @@ Foam::fileName Foam::dynamicCode::codeRelPath() const
}
Foam::fileName Foam::dynamicCode::libPath() const
{
return codeRoot_/libSubDir_/"lib" + codeName_ + EXT_SO;
}
Foam::fileName Foam::dynamicCode::libRelPath() const
{
#ifdef __APPLE__
return codeRelPath()/libSubDir_/"lib" + codeName_ + ".dylib";
#else
return codeRelPath()/libSubDir_/"lib" + codeName_ + ".so";
#endif
return codeRelPath()/libSubDir_/"lib" + codeName_ + EXT_SO;
}
@ -336,7 +347,7 @@ void Foam::dynamicCode::clear()
filterVars_.set("typeName", codeName_);
filterVars_.set("SHA1sum", SHA1Digest().str());
// Provide default Make/options
// Default Make/options
makeOptions_ =
"EXE_INC = -g\n"
"\n\nLIB_LIBS = ";
@ -423,10 +434,10 @@ bool Foam::dynamicCode::copyOrCreateFiles(const bool verbose) const
if (!badFiles.empty())
{
FatalErrorInFunction
<< "Could not find the code template(s): "
<< "Could not find code template(s): "
<< badFiles << nl
<< "Under the $" << codeTemplateEnvName
<< " directory or via via the <etc>/"
<< " directory or via the <etc>/"
<< codeTemplateDirName << " expansion"
<< exit(FatalError);
}
@ -440,9 +451,8 @@ bool Foam::dynamicCode::copyOrCreateFiles(const bool verbose) const
mkDir(outputDir);
// Copy/filter files
forAll(resolvedFiles, fileI)
for (const fileName& srcFile : resolvedFiles)
{
const fileName& srcFile = resolvedFiles[fileI];
const fileName dstFile(outputDir/srcFile.name());
IFstream is(srcFile);
@ -469,23 +479,20 @@ bool Foam::dynamicCode::copyOrCreateFiles(const bool verbose) const
// Create files:
forAll(createFiles_, fileI)
for (const fileAndContent& content : createFiles_)
{
const fileName dstFile
(
outputDir/stringOps::expand(createFiles_[fileI].first())
);
const fileName dstFile(outputDir/stringOps::expand(content.first()));
mkDir(dstFile.path());
OFstream os(dstFile);
//Debug: Info<< "Writing to " << createFiles_[fileI].first() << endl;
//Debug: Info<< "Writing to " << content.first() << endl;
if (!os.good())
{
FatalErrorInFunction
<< "Failed writing " << dstFile
<< exit(FatalError);
}
os.writeQuoted(createFiles_[fileI].second(), false) << nl;
os.writeQuoted(content.second(), false) << nl;
}
@ -515,8 +522,7 @@ bool Foam::dynamicCode::wmakeLibso() const
else
{
// Even with details turned off, we want some feedback
Serr
<< "Invoking wmake libso " << this->codePath().c_str() << endl;
Serr<< "Invoking wmake libso " << this->codePath().c_str() << endl;
}
if (Foam::system(cmd) == 0)

View File

@ -219,21 +219,13 @@ public:
return codeRoot_/codeDirName_;
}
//- Library path for specified code name
// Corresponds to codeRoot()/libSubDir()/lib\<codeName\>.so
fileName libPath() const
{
#ifdef __APPLE__
return codeRoot_/libSubDir_/"lib" + codeName_ + ".dylib";
#else
return codeRoot_/libSubDir_/"lib" + codeName_ + ".so";
#endif
}
//- Path for specified code name relative to \<case\>
// Corresponds to topDirName/codeDirName()
fileName codeRelPath() const;
//- Library path for specified code name
// Corresponds to codeRoot()/libSubDir()/lib\<codeName\>.so
fileName libPath() const;
//- Library path for specified code name relative to \<case\>
// Corresponds to
@ -287,6 +279,23 @@ public:
//- Compile a libso
bool wmakeLibso() const;
// Convenience
//- Define a filter variables TemplateType and FieldType
template<class Type>
void setFieldTemplates()
{
std::string val(pTraits<Type>::typeName);
// Template type
setFilterVariable("TemplateType", val);
// Field type - eg, ScalarField, VectorField, ...
val[0] = toupper(val[0]);
val += "Field";
setFilterVariable("FieldType", val);
}
};

View File

@ -29,110 +29,135 @@ License
#include "stringOps.H"
#include "OSHA1stream.H"
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
void Foam::dynamicCodeContext::inplaceExpand
(
string& code,
const dictionary& dict
)
{
stringOps::inplaceTrim(code);
stringOps::inplaceExpand(code, dict);
}
unsigned Foam::dynamicCodeContext::addLineDirective
(
string& code,
label lineNum,
const fileName& file
)
{
++lineNum; // Change from 0-based to 1-based
const auto len = code.length();
if (lineNum > 0 && len && !file.empty())
{
code = "#line " + Foam::name(lineNum) + " \"" + file + "\"\n" + code;
return (code.length() - len);
}
return 0;
}
unsigned Foam::dynamicCodeContext::addLineDirective
(
string& code,
label lineNum,
const dictionary& dict
)
{
return addLineDirective(code, lineNum, dict.name());
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::dynamicCodeContext::dynamicCodeContext()
:
dict_(std::cref<dictionary>(dictionary::null))
{}
Foam::dynamicCodeContext::dynamicCodeContext(const dictionary& dict)
:
dict_(dict),
code_(),
localCode_(),
include_(),
options_(),
libs_()
dynamicCodeContext()
{
// Expand dictionary entries
// Note: removes any leading/trailing whitespace
// - necessary for compilation options, convenient for includes
// and body.
const entry* codePtr = dict.findEntry("code", keyType::LITERAL);
if (codePtr)
{
codePtr->readEntry(code_);
stringOps::inplaceTrim(code_);
stringOps::inplaceExpand(code_, dict);
}
const entry* includePtr = dict.findEntry("codeInclude", keyType::LITERAL);
if (includePtr)
{
includePtr->readEntry(include_);
stringOps::inplaceTrim(include_);
stringOps::inplaceExpand(include_, dict);
}
const entry* optionsPtr = dict.findEntry("codeOptions", keyType::LITERAL);
if (optionsPtr)
{
optionsPtr->readEntry(options_);
stringOps::inplaceTrim(options_);
stringOps::inplaceExpand(options_, dict);
}
const entry* libsPtr = dict.findEntry("codeLibs", keyType::LITERAL);
if (libsPtr)
{
libsPtr->readEntry(libs_);
stringOps::inplaceTrim(libs_);
stringOps::inplaceExpand(libs_, dict);
}
const entry* localPtr = dict.findEntry("localCode", keyType::LITERAL);
if (localPtr)
{
localPtr->readEntry(localCode_);
stringOps::inplaceTrim(localCode_);
stringOps::inplaceExpand(localCode_, dict);
}
// Calculate SHA1 digest from include, options, localCode, code
OSHA1stream os;
os << include_ << options_ << libs_ << localCode_ << code_;
sha1_ = os.digest();
// Add line number after calculating sha1 since includes processorDDD
// in path which differs between processors.
if (codePtr)
{
addLineDirective(code_, codePtr->startLineNumber(), dict.name());
}
if (includePtr)
{
addLineDirective(include_, includePtr->startLineNumber(), dict.name());
}
// Do not add line directive to options_ (Make/options) and libs since
// they are preprocessed as a single line at this point. Can be fixed.
if (localPtr)
{
addLineDirective(localCode_, localPtr->startLineNumber(), dict.name());
}
setCodeContext(dict);
}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::dynamicCodeContext::addLineDirective
(
string& code,
label lineNum,
const fileName& name
)
bool Foam::dynamicCodeContext::valid() const
{
++lineNum; // Change from 0-based to 1-based
return &(dict_.get()) != &(dictionary::null);
}
if (lineNum > 0 && !name.empty())
void Foam::dynamicCodeContext::setCodeContext(const dictionary& dict)
{
code = "#line " + Foam::name(lineNum) + " \"" + name + "\"\n" + code;
dict_ = std::cref<dictionary>(dict);
sha1_.clear();
// Expand dictionary entries.
// Removing any leading/trailing whitespace is necessary for compilation
// options, but is also convenient for includes and code body.
const entry* eptr;
options_.clear();
sha1_.append("<codeOptions>");
if ((eptr = dict.findEntry("codeOptions", keyType::LITERAL)) != nullptr)
{
eptr->readEntry(options_);
dynamicCodeContext::inplaceExpand(options_, dict);
sha1_.append(options_);
// No #line for options (Make/options)
}
libs_.clear();
sha1_.append("<codeLibs>");
if ((eptr = dict.findEntry("codeLibs", keyType::LITERAL)) != nullptr)
{
eptr->readEntry(libs_);
dynamicCodeContext::inplaceExpand(libs_, dict);
sha1_.append(libs_);
// No #line for libs (LIB_LIBS)
}
include_.clear();
sha1_.append("<codeInclude>");
if ((eptr = dict.findEntry("codeInclude", keyType::LITERAL)) != nullptr)
{
eptr->readEntry(include_);
dynamicCodeContext::inplaceExpand(include_, dict);
sha1_.append(include_);
addLineDirective(include_, eptr->startLineNumber(), dict);
}
code_.clear();
sha1_.append("<code>");
if ((eptr = dict.findEntry("code", keyType::LITERAL)) != nullptr)
{
eptr->readEntry(code_);
dynamicCodeContext::inplaceExpand(code_, dict);
sha1_.append(code_);
addLineDirective(code_, eptr->startLineNumber(), dict);
}
localCode_.clear();
sha1_.append("<localCode>");
if ((eptr = dict.findEntry("localCode", keyType::LITERAL)) != nullptr)
{
eptr->readEntry(localCode_);
dynamicCodeContext::inplaceExpand(localCode_, dict);
sha1_.append(localCode_);
addLineDirective(localCode_, eptr->startLineNumber(), dict);
}
}

View File

@ -37,8 +37,9 @@ SourceFiles
#ifndef dynamicCodeContext_H
#define dynamicCodeContext_H
#include <functional>
#include "dictionary.H"
#include "SHA1Digest.H"
#include "SHA1.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -51,19 +52,13 @@ namespace Foam
class dynamicCodeContext
{
// Private data
// Private Data
//- The parent dictionary context
const dictionary& dict_;
std::reference_wrapper<const dictionary> dict_;
//- Optional "code" entry
string code_;
//- Optional "localCode" entry
string localCode_;
//- Optional "codeInclude" entry
string include_;
//- The SHA1 of the contents
SHA1 sha1_;
//- Optional "codeOptions" entry
string options_;
@ -71,24 +66,68 @@ class dynamicCodeContext
//- Optional "codeLibs" entry
string libs_;
//- Calculated SHA1Digest
SHA1Digest sha1_;
//- Optional "codeInclude" entry
string include_;
//- Optional "code" entry
string code_;
//- Optional "localCode" entry
string localCode_;
public:
// Constructors
//- Construct null
dynamicCodeContext();
//- Construct from a dictionary
dynamicCodeContext(const dictionary& dict);
explicit dynamicCodeContext(const dictionary& dict);
// Member functions
// Static Member Functions
//- Cleanup string and expand with dictionary parameters
static void inplaceExpand(string& code, const dictionary& dict);
//- Prefix a \#line directive to code.
// The input lineNum is 0-based.
// Is a no-op if any of the arguments are invalid
// (lineNum is negative, code or file are empty)
//
// \return The change in string length caused by the directive.
// This can potentially be used to recover the substring portions.
static unsigned addLineDirective
(
string& code,
label lineNum,
const fileName& file
);
//- Prefix a \#line directive to code.
// The name of the dictionary is used for the 'file' name.
static unsigned addLineDirective
(
string& code,
label lineNum,
const dictionary& dict
);
// Member Functions
//- Considered valid if not using dictionary::null as the context
bool valid() const;
//- Set code context from a dictionary
void setCodeContext(const dictionary& dict);
//- Return the parent dictionary context
const dictionary& dict() const
{
return dict_;
return dict_.get();
}
//- Return the code-includes
@ -121,20 +160,27 @@ public:
return localCode_;
}
//- Return SHA1 digest calculated from include, options, code
const SHA1Digest& sha1() const
//- Return SHA1 calculated from options, libs, include, code
const SHA1& sha1() const
{
return sha1_;
}
//- Helper: add \#line directive
// The lineNum is 0-based. No-op if the lineNum is negative.
static void addLineDirective
(
string& code,
label lineNum,
const fileName& name
);
//- Add content to SHA1 hashing
void append(const std::string& str)
{
sha1_.append(str);
}
// Member Operators
//- Cast to dictionary
operator const dictionary&() const
{
return dict_.get();
}
};

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2012-2016 OpenFOAM Foundation
@ -30,38 +30,6 @@ License
#include "pointPatchFieldMapper.H"
#include "pointFields.H"
#include "dynamicCode.H"
#include "dynamicCodeContext.H"
#include "stringOps.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
template<class Type>
const Foam::word Foam::codedFixedValuePointPatchField<Type>::codeTemplateC
= "fixedValuePointPatchFieldTemplate.C";
template<class Type>
const Foam::word Foam::codedFixedValuePointPatchField<Type>::codeTemplateH
= "fixedValuePointPatchFieldTemplate.H";
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
template<class Type>
void Foam::codedFixedValuePointPatchField<Type>::setFieldTemplates
(
dynamicCode& dynCode
)
{
word fieldType(pTraits<Type>::typeName);
// Template type for pointPatchField
dynCode.setFilterVariable("TemplateType", fieldType);
// Name for pointPatchField - eg, ScalarField, VectorField, ...
fieldType[0] = toupper(fieldType[0]);
dynCode.setFilterVariable("FieldType", fieldType + "Field");
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
@ -71,12 +39,12 @@ const
{
const objectRegistry& obr = this->db();
if (obr.foundObject<IOdictionary>("codeDict"))
const IOdictionary* dictptr = obr.cfindObject<IOdictionary>("codeDict");
if (dictptr)
{
return obr.lookupObject<IOdictionary>("codeDict");
return *dictptr;
}
else
{
return obr.store
(
new IOdictionary
@ -92,7 +60,6 @@ const
)
);
}
}
template<class Type>
@ -113,8 +80,7 @@ void Foam::codedFixedValuePointPatchField<Type>::prepare
dynCode.setFilterVariable("typeName", name_);
// Set TemplateType and FieldType filter variables
// (for pointPatchField)
setFieldTemplates(dynCode);
dynCode.setFieldTemplates<Type>();
// Compile filtered C template
dynCode.addCompileFile(codeTemplateC);
@ -122,10 +88,10 @@ void Foam::codedFixedValuePointPatchField<Type>::prepare
// Copy filtered H template
dynCode.addCopyFile(codeTemplateH);
// Debugging: make BC verbose
// Debugging: make verbose
// dynCode.setFilterVariable("verbose", "true");
// Info<<"compile " << name_ << " sha1: "
// DetailInfo
// <<"compile " << name_ << " sha1: "
// << context.sha1() << endl;
// Define Make/options
@ -135,8 +101,8 @@ void Foam::codedFixedValuePointPatchField<Type>::prepare
"-I$(LIB_SRC)/finiteVolume/lnInclude \\\n"
+ context.options()
+ "\n\nLIB_LIBS = \\\n"
+ " -lOpenFOAM \\\n"
+ " -lfiniteVolume \\\n"
" -lOpenFOAM \\\n"
" -lfiniteVolume \\\n"
+ context.libs()
);
}

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2012-2017 OpenFOAM Foundation
@ -92,9 +92,7 @@ SourceFiles
namespace Foam
{
// Forward declaration of classes
class dynamicCode;
class dynamicCodeContext;
// Forward Declarations
class IOdictionary;
/*---------------------------------------------------------------------------*\
@ -105,7 +103,7 @@ template<class Type>
class codedFixedValuePointPatchField
:
public fixedValuePointPatchField<Type>,
public codedBase
protected codedBase
{
// Private data
@ -121,9 +119,6 @@ class codedFixedValuePointPatchField
const IOdictionary& dict() const;
//- Set the rewrite vars controlling the Type
static void setFieldTemplates(dynamicCode& dynCode);
//- Get the loaded dynamic libraries
virtual dlLibraryTable& libs() const;
@ -142,13 +137,15 @@ class codedFixedValuePointPatchField
public:
// Static data members
// Static Data Members
//- Name of the C code template to be used
static const word codeTemplateC;
static constexpr const char* const codeTemplateC
= "fixedValuePointPatchFieldTemplate.C";
//- Name of the H code template to be used
static const word codeTemplateH;
static constexpr const char* const codeTemplateH
= "fixedValuePointPatchFieldTemplate.H";
//- Runtime type information

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -26,10 +26,7 @@ License
#include "codedPoints0MotionSolver.H"
#include "dictionary.H"
#include "Time.H"
#include "SHA1Digest.H"
#include "dynamicCode.H"
#include "dynamicCodeContext.H"
#include "stringOps.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -58,14 +55,15 @@ void Foam::codedPoints0MotionSolver::prepare
dynCode.setFilterVariable("typeName", name_);
// Compile filtered C template
dynCode.addCompileFile("codedPoints0MotionSolverTemplate.C");
dynCode.addCompileFile(codeTemplateC);
// Copy filtered H template
dynCode.addCopyFile("codedPoints0MotionSolverTemplate.H");
dynCode.addCopyFile(codeTemplateH);
// Debugging: make BC verbose
// Debugging: make verbose
// dynCode.setFilterVariable("verbose", "true");
// Info<<"compile " << name_ << " sha1: "
// DetailInfo
// <<"compile " << name_ << " sha1: "
// << context.sha1() << endl;
// Define Make/options
@ -73,12 +71,15 @@ void Foam::codedPoints0MotionSolver::prepare
(
"EXE_INC = -g \\\n"
"-I$(LIB_SRC)/finiteVolume/lnInclude \\\n"
"-I$(LIB_SRC)/fvMotionSolvers/lnInclude \\\n"
"-I$(LIB_SRC)/dynamicMesh/lnInclude \\\n"
"-I$(LIB_SRC)/meshTools/lnInclude \\\n"
"-I$(LIB_SRC)/dynamicMesh/lnInclude \\\n"
"-I$(LIB_SRC)/fvMotionSolvers/lnInclude \\\n"
+ context.options()
+ "\n\nLIB_LIBS = \\\n"
+ " -lfvMotionSolvers \\\n"
" -lfiniteVolume \\\n"
" -lmeshTools \\\n"
" -ldynamicMesh \\\n"
" -lfvMotionSolvers \\\n"
+ context.libs()
);
}

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -90,7 +90,7 @@ class codedPoints0MotionSolver
{
protected:
// Protected data
// Protected Data
//- Name of redirected motion solver
word name_;
@ -107,17 +107,17 @@ protected:
//- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output
//- Return a description (type + name) for the output
virtual string description() const;
// Clear any redirected objects
//- Clear any redirected objects
virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext
// The dictionary to initialize the codeContext
virtual const dictionary& codeDict() const;
//- No copy assignment construct
//- No copy construct
codedPoints0MotionSolver(const codedPoints0MotionSolver&) = delete;
//- No copy assignment
@ -126,6 +126,17 @@ protected:
public:
// Static Data Members
//- Name of the C code template to be used
static constexpr const char* const codeTemplateC
= "codedPoints0MotionSolverTemplate.C";
//- Name of the H code template to be used
static constexpr const char* const codeTemplateH
= "codedPoints0MotionSolverTemplate.H";
//- Runtime type information
TypeName("coded");
@ -156,10 +167,10 @@ public:
virtual void solve();
//- Update local data for geometry changes
virtual void movePoints(const pointField&);
virtual void movePoints(const pointField& fld);
//- Update local data for topology changes
virtual void updateMesh(const mapPolyMesh&);
virtual void updateMesh(const mapPolyMesh& mpm);
};

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation
@ -31,37 +31,6 @@ License
#include "volFields.H"
#include "dynamicCode.H"
#include "dynamicCodeContext.H"
#include "stringOps.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
template<class Type>
const Foam::word Foam::codedFixedValueFvPatchField<Type>::codeTemplateC
= "fixedValueFvPatchFieldTemplate.C";
template<class Type>
const Foam::word Foam::codedFixedValueFvPatchField<Type>::codeTemplateH
= "fixedValueFvPatchFieldTemplate.H";
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
template<class Type>
void Foam::codedFixedValueFvPatchField<Type>::setFieldTemplates
(
dynamicCode& dynCode
)
{
word fieldType(pTraits<Type>::typeName);
// template type for fvPatchField
dynCode.setFilterVariable("TemplateType", fieldType);
// Name for fvPatchField - eg, ScalarField, VectorField, ...
fieldType[0] = toupper(fieldType[0]);
dynCode.setFilterVariable("FieldType", fieldType + "Field");
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
@ -70,12 +39,12 @@ const Foam::IOdictionary& Foam::codedFixedValueFvPatchField<Type>::dict() const
{
const objectRegistry& obr = this->db();
if (obr.foundObject<IOdictionary>("codeDict"))
const IOdictionary* dictptr = obr.cfindObject<IOdictionary>("codeDict");
if (dictptr)
{
return obr.lookupObject<IOdictionary>("codeDict");
return *dictptr;
}
else
{
return obr.store
(
new IOdictionary
@ -91,7 +60,6 @@ const Foam::IOdictionary& Foam::codedFixedValueFvPatchField<Type>::dict() const
)
);
}
}
template<class Type>
@ -108,34 +76,33 @@ void Foam::codedFixedValueFvPatchField<Type>::prepare
const dynamicCodeContext& context
) const
{
// take no chances - typeName must be identical to name_
// Take no chances - typeName must be identical to name_
dynCode.setFilterVariable("typeName", name_);
// set TemplateType and FieldType filter variables
// (for fvPatchField)
setFieldTemplates(dynCode);
// Set TemplateType and FieldType filter variables
dynCode.setFieldTemplates<Type>();
// compile filtered C template
// Compile filtered C template
dynCode.addCompileFile(codeTemplateC);
// copy filtered H template
// Copy filtered H template
dynCode.addCopyFile(codeTemplateH);
// debugging: make BC verbose
// Debugging: make verbose
// dynCode.setFilterVariable("verbose", "true");
// Info<<"compile " << name_ << " sha1: "
// DetailInfo
// <<"compile " << name_ << " sha1: "
// << context.sha1() << endl;
// define Make/options
// Define Make/options
dynCode.setMakeOptions
(
"EXE_INC = -g \\\n"
"-I$(LIB_SRC)/finiteVolume/lnInclude \\\n"
+ context.options()
+ "\n\nLIB_LIBS = \\\n"
+ " -lOpenFOAM \\\n"
+ " -lfiniteVolume \\\n"
" -lOpenFOAM \\\n"
" -lfiniteVolume \\\n"
+ context.libs()
);
}

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2017 OpenFOAM Foundation
@ -93,9 +93,7 @@ SourceFiles
namespace Foam
{
// Forward declaration of classes
class dynamicCode;
class dynamicCodeContext;
// Forward Declarations
class IOdictionary;
/*---------------------------------------------------------------------------*\
@ -106,9 +104,9 @@ template<class Type>
class codedFixedValueFvPatchField
:
public fixedValueFvPatchField<Type>,
public codedBase
protected codedBase
{
// Private data
// Private Data
//- Dictionary contents for the boundary condition
const dictionary dict_;
@ -122,9 +120,6 @@ class codedFixedValueFvPatchField
const IOdictionary& dict() const;
//- Set the rewrite vars controlling the Type
static void setFieldTemplates(dynamicCode& dynCode);
//- Get the loaded dynamic libraries
virtual dlLibraryTable& libs() const;
@ -146,10 +141,12 @@ public:
// Static data members
//- Name of the C code template to be used
static const word codeTemplateC;
static constexpr const char* const codeTemplateC
= "fixedValueFvPatchFieldTemplate.C";
//- Name of the H code template to be used
static const word codeTemplateH;
static constexpr const char* const codeTemplateH
= "fixedValueFvPatchFieldTemplate.H";
//- Runtime type information

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation
@ -30,38 +30,6 @@ License
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "dynamicCode.H"
#include "dynamicCodeContext.H"
#include "stringOps.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
template<class Type>
const Foam::word Foam::codedMixedFvPatchField<Type>::codeTemplateC
= "mixedFvPatchFieldTemplate.C";
template<class Type>
const Foam::word Foam::codedMixedFvPatchField<Type>::codeTemplateH
= "mixedFvPatchFieldTemplate.H";
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
template<class Type>
void Foam::codedMixedFvPatchField<Type>::setFieldTemplates
(
dynamicCode& dynCode
)
{
word fieldType(pTraits<Type>::typeName);
// template type for fvPatchField
dynCode.setFilterVariable("TemplateType", fieldType);
// Name for fvPatchField - eg, ScalarField, VectorField, ...
fieldType[0] = toupper(fieldType[0]);
dynCode.setFilterVariable("FieldType", fieldType + "Field");
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
@ -70,12 +38,12 @@ const Foam::IOdictionary& Foam::codedMixedFvPatchField<Type>::dict() const
{
const objectRegistry& obr = this->db();
if (obr.foundObject<IOdictionary>("codeDict"))
const IOdictionary* dictptr = obr.cfindObject<IOdictionary>("codeDict");
if (dictptr)
{
return obr.lookupObject<IOdictionary>("codeDict");
return *dictptr;
}
else
{
return obr.store
(
new IOdictionary
@ -91,7 +59,6 @@ const Foam::IOdictionary& Foam::codedMixedFvPatchField<Type>::dict() const
)
);
}
}
template<class Type>
@ -108,34 +75,33 @@ void Foam::codedMixedFvPatchField<Type>::prepare
const dynamicCodeContext& context
) const
{
// take no chances - typeName must be identical to name_
// Take no chances - typeName must be identical to name_
dynCode.setFilterVariable("typeName", name_);
// set TemplateType and FieldType filter variables
// (for fvPatchField)
setFieldTemplates(dynCode);
// Set TemplateType and FieldType filter variables
dynCode.setFieldTemplates<Type>();
// compile filtered C template
// Compile filtered C template
dynCode.addCompileFile(codeTemplateC);
// copy filtered H template
// Copy filtered H template
dynCode.addCopyFile(codeTemplateH);
// debugging: make BC verbose
// Debugging: make verbose
// dynCode.setFilterVariable("verbose", "true");
// Info<<"compile " << name_ << " sha1: "
// DetailInfo
// <<"compile " << name_ << " sha1: "
// << context.sha1() << endl;
// define Make/options
// Define Make/options
dynCode.setMakeOptions
(
"EXE_INC = -g \\\n"
"-I$(LIB_SRC)/finiteVolume/lnInclude \\\n"
+ context.options()
+ "\n\nLIB_LIBS = \\\n"
+ " -lOpenFOAM \\\n"
+ " -lfiniteVolume \\\n"
" -lOpenFOAM \\\n"
" -lfiniteVolume \\\n"
+ context.libs()
);
}

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2017 OpenFOAM Foundation
@ -132,9 +132,6 @@ class codedMixedFvPatchField
const IOdictionary& dict() const;
//- Set the rewrite vars controlling the Type
static void setFieldTemplates(dynamicCode& dynCode);
//- Get the loaded dynamic libraries
virtual dlLibraryTable& libs() const;
@ -153,13 +150,15 @@ class codedMixedFvPatchField
public:
// Static data members
// Static Data Members
//- Name of the C code template to be used
static const word codeTemplateC;
static constexpr const char* const codeTemplateC
= "mixedFvPatchFieldTemplate.C";
//- Name of the H code template to be used
static const word codeTemplateH;
static constexpr const char* const codeTemplateH
= "mixedFvPatchFieldTemplate.H";
//- Runtime type information

View File

@ -29,10 +29,7 @@ License
#include "volFields.H"
#include "dictionary.H"
#include "Time.H"
#include "SHA1Digest.H"
#include "dynamicCode.H"
#include "dynamicCodeContext.H"
#include "stringOps.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -42,7 +39,6 @@ namespace Foam
namespace functionObjects
{
defineTypeNameAndDebug(codedFunctionObject, 0);
addToRunTimeSelectionTable
(
functionObject,
@ -70,14 +66,15 @@ void Foam::functionObjects::codedFunctionObject::prepare
dynCode.setFilterVariable("codeEnd", codeEnd_);
// Compile filtered C template
dynCode.addCompileFile("functionObjectTemplate.C");
dynCode.addCompileFile(codeTemplateC);
// Copy filtered H template
dynCode.addCopyFile("functionObjectTemplate.H");
dynCode.addCopyFile(codeTemplateH);
// Debugging: make BC verbose
// Debugging: make verbose
// dynCode.setFilterVariable("verbose", "true");
// Info<<"compile " << name_ << " sha1: "
// DetailInfo
// <<"compile " << name_ << " sha1: "
// << context.sha1() << endl;
// Define Make/options
@ -88,9 +85,9 @@ void Foam::functionObjects::codedFunctionObject::prepare
"-I$(LIB_SRC)/meshTools/lnInclude \\\n"
+ context.options()
+ "\n\nLIB_LIBS = \\\n"
+ " -lOpenFOAM \\\n"
+ " -lfiniteVolume \\\n"
+ " -lmeshTools \\\n"
" -lOpenFOAM \\\n"
" -lfiniteVolume \\\n"
" -lmeshTools \\\n"
+ context.libs()
);
}
@ -187,84 +184,110 @@ bool Foam::functionObjects::codedFunctionObject::read(const dictionary& dict)
{
timeFunctionObject::read(dict);
codedBase::setCodeContext(dict);
dict.readCompat<word>("name", {{"redirectType", 1706}}, name_);
const entry* dataPtr = dict.findEntry("codeData", keyType::LITERAL);
label nKeywords = 0;
if (dataPtr)
const entry* eptr;
codeData_.clear();
codedBase::append("<codeData>");
if ((eptr = dict.findEntry("codeData", keyType::LITERAL)) != nullptr)
{
dataPtr->readEntry(codeData_);
stringOps::inplaceExpand(codeData_, dict);
eptr->readEntry(codeData_);
dynamicCodeContext::inplaceExpand(codeData_, dict);
codedBase::append(codeData_);
dynamicCodeContext::addLineDirective
(
codeData_,
dataPtr->startLineNumber(),
eptr->startLineNumber(),
dict.name()
);
++nKeywords;
}
const entry* readPtr = dict.findEntry("codeRead", keyType::LITERAL);
if (readPtr)
codeRead_.clear();
codedBase::append("<codeRead>");
if ((eptr = dict.findEntry("codeRead", keyType::LITERAL)) != nullptr)
{
readPtr->readEntry(codeRead_);
stringOps::inplaceExpand(codeRead_, dict);
eptr->readEntry(codeRead_);
dynamicCodeContext::inplaceExpand(codeRead_, dict);
codedBase::append(codeRead_);
dynamicCodeContext::addLineDirective
(
codeRead_,
readPtr->startLineNumber(),
eptr->startLineNumber(),
dict.name()
);
++nKeywords;
}
const entry* execPtr = dict.findEntry("codeExecute", keyType::LITERAL);
if (execPtr)
codeExecute_.clear();
codedBase::append("<codeExecute>");
if ((eptr = dict.findEntry("codeExecute", keyType::LITERAL)) != nullptr)
{
execPtr->readEntry(codeExecute_);
stringOps::inplaceExpand(codeExecute_, dict);
eptr->readEntry(codeExecute_);
dynamicCodeContext::inplaceExpand(codeExecute_, dict);
codedBase::append(codeExecute_);
dynamicCodeContext::addLineDirective
(
codeExecute_,
execPtr->startLineNumber(),
eptr->startLineNumber(),
dict.name()
);
++nKeywords;
}
const entry* writePtr = dict.findEntry("codeWrite", keyType::LITERAL);
if (writePtr)
codeWrite_.clear();
codedBase::append("<codeWrite>");
if ((eptr = dict.findEntry("codeWrite", keyType::LITERAL)) != nullptr)
{
writePtr->readEntry(codeWrite_);
stringOps::inplaceExpand(codeWrite_, dict);
eptr->readEntry(codeWrite_);
dynamicCodeContext::inplaceExpand(codeWrite_, dict);
codedBase::append(codeWrite_);
dynamicCodeContext::addLineDirective
(
codeWrite_,
writePtr->startLineNumber(),
eptr->startLineNumber(),
dict.name()
);
++nKeywords;
}
const entry* endPtr = dict.findEntry("codeEnd", keyType::LITERAL);
if (endPtr)
codeEnd_.clear();
codedBase::append("<codeEnd>");
if ((eptr = dict.findEntry("codeEnd", keyType::LITERAL)) != nullptr)
{
endPtr->readEntry(codeEnd_);
stringOps::inplaceExpand(codeEnd_, dict);
eptr->readEntry(codeEnd_);
dynamicCodeContext::inplaceExpand(codeEnd_, dict);
codedBase::append(codeEnd_);
dynamicCodeContext::addLineDirective
(
codeEnd_,
endPtr->startLineNumber(),
eptr->startLineNumber(),
dict.name()
);
++nKeywords;
}
if (!dataPtr && !readPtr && !execPtr && !writePtr && !endPtr)
if (!nKeywords)
{
IOWarningInFunction(dict)
<< "No critical \"code\" prefixed keywords were found."
<< " Please check the code documentation for more details."
<< nl << endl;
<< "No critical \"code\" prefixed keywords found." << nl
<< "Please check the code documentation for more details." << nl
<< endl;
}
updateLibrary(name_);

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2017 OpenFOAM Foundation
@ -123,13 +123,13 @@ protected:
//- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output
//- Return a description (type + name) for the output
virtual string description() const;
// Clear any redirected objects
//- Clear any redirected objects
virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext
//- The dictionary to initialize the codeContext
virtual const dictionary& codeDict() const;
@ -142,6 +142,17 @@ protected:
public:
// Static Data Members
//- Name of the C code template to be used
static constexpr const char* const codeTemplateC
= "functionObjectTemplate.C";
//- Name of the H code template to be used
static constexpr const char* const codeTemplateH
= "functionObjectTemplate.H";
//- Runtime type information
TypeName("coded");

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2012-2016 OpenFOAM Foundation
@ -50,7 +50,7 @@ void Foam::fv::CodedSource<Type>::prepare
//dynCode.removeFilterVariable("code");
dynCode.setFilterVariable("codeCorrect", codeCorrect_);
dynCode.setFilterVariable("codeAddSup", codeAddSup_);
dynCode.setFilterVariable("codeSetValue", codeSetValue_);
dynCode.setFilterVariable("codeConstrain", codeConstrain_);
// compile filtered C template
dynCode.addCompileFile("codedFvOptionTemplate.C");
@ -58,9 +58,10 @@ void Foam::fv::CodedSource<Type>::prepare
// copy filtered H template
dynCode.addCopyFile("codedFvOptionTemplate.H");
// debugging: make BC verbose
// debugging: make verbose
// dynCode.setFilterVariable("verbose", "true");
// Info<<"compile " << name_ << " sha1: "
// DetailInfo
// <<"compile " << name_ << " sha1: "
// << context.sha1() << endl;
// define Make/options
@ -68,15 +69,15 @@ void Foam::fv::CodedSource<Type>::prepare
(
"EXE_INC = -g \\\n"
"-I$(LIB_SRC)/finiteVolume/lnInclude \\\n"
"-I$(LIB_SRC)/fvOptions/lnInclude \\\n"
"-I$(LIB_SRC)/meshTools/lnInclude \\\n"
"-I$(LIB_SRC)/sampling/lnInclude \\\n"
"-I$(LIB_SRC)/fvOptions/lnInclude \\\n"
+ context.options()
+ "\n\nLIB_LIBS = \\\n"
+ " -lmeshTools \\\n"
+ " -lfvOptions \\\n"
+ " -lsampling \\\n"
+ " -lfiniteVolume \\\n"
" -lfvOptions \\\n"
" -lmeshTools \\\n"
" -lsampling \\\n"
" -lfiniteVolume \\\n"
+ context.libs()
);
}

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2012-2016 OpenFOAM Foundation
@ -34,6 +34,7 @@ Description
The hook functions take the following arguments:
\verbatim
codeCorrect
(
GeometricField<Type, fvPatchField, volMesh>& field
@ -45,11 +46,12 @@ Description
const label fieldi
)
constrain
codeConstrain
(
fvMatrix<Type}>& eqn,
const label fieldi
)
\endverbatim
where :
field is the name of the field in the fields list
@ -71,7 +73,6 @@ Usage
codeInclude
#{
#};
codeCorrect
@ -87,18 +88,9 @@ Usage
heSource -= 0.1*sqr(time.value())*V;
#};
codeSetValue
codeContrain
#{
Pout<< "**codeSetValue**" << endl;
#};
// Dummy entry. Make dependent on above to trigger recompilation
code
#{
$codeInclude
$codeCorrect
$codeAddSup
$codeSetValue
Pout<< "**codeConstrain**" << endl;
#};
}
}
@ -131,18 +123,18 @@ template<class Type>
class CodedSource
:
public cellSetOption,
public codedBase
protected codedBase
{
protected:
// Protected data
// Protected Data
word name_;
string codeCorrect_;
string codeAddSup_;
string codeSetValue_;
string codeConstrain_;
//- Underlying functionObject
mutable autoPtr<option> redirectFvOptionPtr_;
@ -156,13 +148,13 @@ protected:
//- Adapt the context for the current object
virtual void prepare(dynamicCode&, const dynamicCodeContext&) const;
// Return a description (type + name) for the output
//- Return a description (type + name) for the output
virtual string description() const;
// Clear any redirected objects
//- Clear any redirected objects
virtual void clearRedirect() const;
// Get the dictionary to initialize the codeContext
//- Get the dictionary to initialize the codeContext
virtual const dictionary& codeDict() const;
@ -189,6 +181,7 @@ public:
//- Dynamically compiled fvOption
option& redirectFvOption() const;
// Evaluation
//- Correct field
@ -197,15 +190,14 @@ public:
GeometricField<Type, fvPatchField, volMesh>&
);
//- Explicit and implicit matrix contributions
//- Explicit/implicit matrix contributions
virtual void addSup
(
fvMatrix<Type>& eqn,
const label fieldi
);
//- Explicit and implicit matrix contributions
// to compressible equation
//- Explicit/implicit matrix contributions to compressible equation
virtual void addSup
(
const volScalarField& rho,

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2012-2016 OpenFOAM Foundation
@ -26,71 +26,86 @@ License
\*---------------------------------------------------------------------------*/
#include "CodedSource.H"
#include "stringOps.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
bool Foam::fv::CodedSource<Type>::read(const dictionary& dict)
{
if (cellSetOption::read(dict))
codedBase::setCodeContext(coeffs_);
if (!cellSetOption::read(dict))
{
return false;
}
coeffs_.readEntry("fields", fieldNames_);
applied_.setSize(fieldNames_.size(), false);
dict.readCompat<word>("name", {{"redirectType", 1706}}, name_);
// Code snippets
// Code chunks
codedBase::append("<codeCorrect>");
{
const entry& e =
coeffs_.lookupEntry("codeCorrect", keyType::LITERAL);
e.readEntry(codeCorrect_);
stringOps::inplaceTrim(codeCorrect_);
stringOps::inplaceExpand(codeCorrect_, coeffs_);
dynamicCodeContext::inplaceExpand(codeCorrect_, coeffs_);
codedBase::append(codeCorrect_);
dynamicCodeContext::addLineDirective
(
codeCorrect_,
e.startLineNumber(),
coeffs_.name()
coeffs_
);
}
codedBase::append("<codeAddSup>");
{
const entry& e =
coeffs_.lookupEntry("codeAddSup", keyType::LITERAL);
e.readEntry(codeAddSup_);
stringOps::inplaceTrim(codeAddSup_);
stringOps::inplaceExpand(codeAddSup_, coeffs_);
dynamicCodeContext::inplaceExpand(codeAddSup_, coeffs_);
codedBase::append(codeAddSup_);
dynamicCodeContext::addLineDirective
(
codeAddSup_,
e.startLineNumber(),
coeffs_.name()
coeffs_
);
}
codedBase::append("<codeConstrain>");
{
const entry& e =
coeffs_.lookupEntry("codeSetValue", keyType::LITERAL);
coeffs_.lookupEntryCompat
(
"codeConstrain",
{{ "codeSetValue", 1812 }}, keyType::LITERAL
);
e.readEntry(codeConstrain_);
dynamicCodeContext::inplaceExpand(codeConstrain_, coeffs_);
codedBase::append(codeConstrain_);
e.readEntry(codeSetValue_);
stringOps::inplaceTrim(codeSetValue_);
stringOps::inplaceExpand(codeSetValue_, coeffs_);
dynamicCodeContext::addLineDirective
(
codeSetValue_,
codeConstrain_,
e.startLineNumber(),
coeffs_.name()
coeffs_
);
}
return true;
}
return false;
}
// ************************************************************************* //