diff --git a/etc/codeTemplates/dynamicCode/codeStreamTemplate.C b/etc/codeTemplates/dynamicCode/codeStreamTemplate.C index c118de2a21a0904658f821850db5cd63f9580c59..418a02df024d909eae6a351599ae82b515678397 100644 --- a/etc/codeTemplates/dynamicCode/codeStreamTemplate.C +++ b/etc/codeTemplates/dynamicCode/codeStreamTemplate.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011, 2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) YEAR AUTHOR,AFFILIATION @@ -51,18 +51,11 @@ ${localCode} // * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * // -extern "C" +extern "C" void ${typeName}(Ostream& os, const dictionary& dict) { - void ${typeName} - ( - Ostream& os, - const dictionary& dict - ) - { //{{{ begin code - ${code} + ${code} //}}} end code - } } diff --git a/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.C b/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.C index 28dc80613abcb74c0e5d8a48a8b6c8994c68689e..dcd5fec036d1aaf30283628f254cc793c5bbc941 100644 --- a/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.C +++ b/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.C @@ -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 +extern "C" void ${typeName}_${SHA1sum}(bool load) { - // 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 { - if (load) - { - // 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 // ************************************************************************* // diff --git a/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.H b/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.H index 56d3f4d6ba88d153b405ff27834e798d8b4b25d7..96ee5cb09621221c014ab1f73957d62ccaa8344d 100644 --- a/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.H +++ b/etc/codeTemplates/dynamicCode/codedFvOptionTemplate.H @@ -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 - #{ - Pout<< "**codeSetValue**" << endl; - #}; - - // Dummy entry. Make dependent on above to trigger recompilation - code + codeConstrain #{ - $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,44 +150,42 @@ public: virtual ~${typeName}FvOption${SourceType}(); - // Member functions - - //- Correct field - virtual void correct - ( - GeometricField<${TemplateType}, fvPatchField, volMesh>& - ); - - //- Explicit and implicit matrix contributions - virtual void addSup - ( - fvMatrix<${TemplateType}>& eqn, - const label fieldi - ); - - //- Explicit and implicit matrix contributions for compressible - // equations - virtual void addSup - ( - const volScalarField& rho, - fvMatrix<${TemplateType}>& eqn, - const label fieldi - ); - - //- Set value - virtual void constrain - ( - fvMatrix<${TemplateType}>& eqn, - const label fieldi - ); + // Member Functions + + //- Correct field + virtual void correct + ( + GeometricField<${TemplateType}, fvPatchField, volMesh>& fld + ); + + //- Explicit/implicit matrix contributions + virtual void addSup + ( + fvMatrix<${TemplateType}>& eqn, + const label fieldi + ); + + //- Explicit/implicit matrix contributions for compressible equations + virtual void addSup + ( + const volScalarField& rho, + fvMatrix<${TemplateType}>& eqn, + const label fieldi + ); + + //- Set value + virtual void constrain + ( + fvMatrix<${TemplateType}>& eqn, + const label fieldi + ); }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -} // End namespace Foam - } // End namespace fv +} // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/etc/codeTemplates/dynamicCode/codedPoints0MotionSolverTemplate.C b/etc/codeTemplates/dynamicCode/codedPoints0MotionSolverTemplate.C index 862b94a5dedcaffdaec49371d133402ef9550006..a07bf58035c11d4807d6c0e6317d18a7b54061e3 100644 --- a/etc/codeTemplates/dynamicCode/codedPoints0MotionSolverTemplate.C +++ b/etc/codeTemplates/dynamicCode/codedPoints0MotionSolverTemplate.C @@ -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 +extern "C" void ${typeName}_${SHA1sum}(bool load) { - // 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) { - if (load) - { - // code that can be explicitly executed after loading - } - else - { - // code that can be explicitly executed before unloading - } + // Code that can be explicitly executed after loading + } + else + { + // 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 diff --git a/etc/codeTemplates/dynamicCode/codedPoints0MotionSolverTemplate.H b/etc/codeTemplates/dynamicCode/codedPoints0MotionSolverTemplate.H index f3a8af3f38158be8971ceb2b67c2340b5513a2f8..b78347d0a20067737970975034e8eba4e2c91892 100644 --- a/etc/codeTemplates/dynamicCode/codedPoints0MotionSolverTemplate.H +++ b/etc/codeTemplates/dynamicCode/codedPoints0MotionSolverTemplate.H @@ -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}"); diff --git a/etc/codeTemplates/dynamicCode/fixedValueFvPatchFieldTemplate.C b/etc/codeTemplates/dynamicCode/fixedValueFvPatchFieldTemplate.C index 721505f2fcc507fa6a8c53a614171b347304479d..c11b9c9c09c248d2614fd59a439a3f1c6ea549c8 100644 --- a/etc/codeTemplates/dynamicCode/fixedValueFvPatchFieldTemplate.C +++ b/etc/codeTemplates/dynamicCode/fixedValueFvPatchFieldTemplate.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011, 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 +extern "C" void ${typeName}_${SHA1sum}(bool load) { - // 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 { - if (load) - { - // 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 diff --git a/etc/codeTemplates/dynamicCode/fixedValueFvPatchFieldTemplate.H b/etc/codeTemplates/dynamicCode/fixedValueFvPatchFieldTemplate.H index 9923314d542234303d23486a3a3d8e1cb4605d52..841869117d9df7f56255e4247f7f8889d07fa2c4 100644 --- a/etc/codeTemplates/dynamicCode/fixedValueFvPatchFieldTemplate.H +++ b/etc/codeTemplates/dynamicCode/fixedValueFvPatchFieldTemplate.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011, 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(); diff --git a/etc/codeTemplates/dynamicCode/fixedValuePointPatchFieldTemplate.C b/etc/codeTemplates/dynamicCode/fixedValuePointPatchFieldTemplate.C index f52a8baa7bd7b73cd7ab792d571c8f10c3ddf5e6..06498e2663ebdda62f5f84258c433d43b174b16b 100644 --- a/etc/codeTemplates/dynamicCode/fixedValuePointPatchFieldTemplate.C +++ b/etc/codeTemplates/dynamicCode/fixedValuePointPatchFieldTemplate.C @@ -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 +extern "C" void ${typeName}_${SHA1sum}(bool load) { - // 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 { - if (load) - { - // 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 diff --git a/etc/codeTemplates/dynamicCode/fixedValuePointPatchFieldTemplate.H b/etc/codeTemplates/dynamicCode/fixedValuePointPatchFieldTemplate.H index bf9c1c91a985e2d41f8f75d14f0ae66e87169f9f..a7dc299232fe19344ac811d4d3e1f65290c92745 100644 --- a/etc/codeTemplates/dynamicCode/fixedValuePointPatchFieldTemplate.H +++ b/etc/codeTemplates/dynamicCode/fixedValuePointPatchFieldTemplate.H @@ -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(); diff --git a/etc/codeTemplates/dynamicCode/functionObjectTemplate.C b/etc/codeTemplates/dynamicCode/functionObjectTemplate.C index f0db099efe4b77d86e430b0ec5444b848155f0ee..7e4b19272110a0d208fbc01bd63fd9d93d154ad6 100644 --- a/etc/codeTemplates/dynamicCode/functionObjectTemplate.C +++ b/etc/codeTemplates/dynamicCode/functionObjectTemplate.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011, 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 +extern "C" void ${typeName}_${SHA1sum}(bool load) { - // 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) { - if (load) - { - // code that can be explicitly executed after loading - } - else - { - // code that can be explicitly executed before unloading - } + // Code that can be explicitly executed after loading + } + else + { + // 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 diff --git a/etc/codeTemplates/dynamicCode/functionObjectTemplate.H b/etc/codeTemplates/dynamicCode/functionObjectTemplate.H index 986eb733907ac44fa25667db0bb6024ebdb60532..099e4de163c73d3167450627b6b1bdd4fd1f5547 100644 --- a/etc/codeTemplates/dynamicCode/functionObjectTemplate.H +++ b/etc/codeTemplates/dynamicCode/functionObjectTemplate.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011, 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(); }; diff --git a/etc/codeTemplates/dynamicCode/mixedFvPatchFieldTemplate.C b/etc/codeTemplates/dynamicCode/mixedFvPatchFieldTemplate.C index 7ac6c674fd3e23ca95dbaa49f4b90fbb389f40b6..40072caa90ca2bb6276be2ee89d7488625ec2e7a 100644 --- a/etc/codeTemplates/dynamicCode/mixedFvPatchFieldTemplate.C +++ b/etc/codeTemplates/dynamicCode/mixedFvPatchFieldTemplate.C @@ -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 +extern "C" void ${typeName}_${SHA1sum}(bool load) { - // 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 { - if (load) - { - // 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 diff --git a/etc/codeTemplates/dynamicCode/mixedFvPatchFieldTemplate.H b/etc/codeTemplates/dynamicCode/mixedFvPatchFieldTemplate.H index 4a47be69802e3106ac8472fc17ae4a89b15a116a..3b9f128f57abed9adf8ff8aca64a32baa3b44467 100644 --- a/etc/codeTemplates/dynamicCode/mixedFvPatchFieldTemplate.H +++ b/etc/codeTemplates/dynamicCode/mixedFvPatchFieldTemplate.H @@ -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(); diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C index c7df23c8dee551d89b45999bbf59dcc0529f2e15..de2ed61f346e0881db15b93321b1d25e5a7c6273 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011, 2018 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011-2011, 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,27 +90,19 @@ 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; - } - // Fall back to regIOobject::masterOnlyReading - return regIOobject::masterOnlyReading; - } + DebugPout + << "codeStream : not a baseIOdictionary:" << dict.name() + << " master-only-reading:" << regIOobject::masterOnlyReading << endl; + + // Fall back to regIOobject::masterOnlyReading + return regIOobject::masterOnlyReading; } @@ -147,17 +135,13 @@ Foam::functionEntries::codeStream::getFunction lib = libs(parentDict).findLibrary(libPath); } + // nothing loaded + // avoid compilation if possible by loading an existing library if (!lib) { DetailInfo << "Using #codeStream with " << libPath << endl; - } - - // nothing loaded - // avoid compilation if possible by loading an existing library - if (!lib) - { 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() - << " have masterSize:" << masterSize - << " and localSize:" << mySize - << endl; - } - + DebugPout + << nl << "on processor " << Pstream::myProcNo() + << " have masterSize:" << masterSize + << " and localSize:" << mySize << endl; if (mySize < masterSize) { - if (debug) - { - Pout<< "Local file " << libPath - << " not of same size (" << mySize - << ") as master (" - << masterSize << "). Waiting for " - << regIOobject::fileModificationSkew - << " seconds." << endl; - } + 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() - << " after waiting: have masterSize:" << masterSize - << " and localSize:" << mySize - << endl; - } + DebugPout + << nl << "on processor " << Pstream::myProcNo() + << " after waiting: have masterSize:" << masterSize + << " 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); } } diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.H b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.H index b013392e6ec3e02b3a8248f94929ebd5adc48601..7fc0436b1d21352ab3d82d89c0433053456b4256 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.H +++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011, 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 diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C index 031b3d8fdd1a3f3b85487273a00fc1a5a50f8576..5f305ed5e3a424243e4f06b2107428e846ef61f1 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 | - \\ / 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,57 +88,58 @@ 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 + + void* lib = + ( + !libPath.empty() && libs().open(libPath, false) + ? libs().findLibrary(libPath) + : nullptr + ); + + if (!lib) + { + return lib; + } - // avoid compilation by loading an existing library - if (!libPath.empty()) + // verify the loaded version and unload if needed + + // provision for manual execution of code after loading + if (dlSymFound(lib, globalFuncName)) { - if (libs().open(libPath, false)) + loaderFunctionType function = + reinterpret_cast<loaderFunctionType> + ( + dlSym(lib, globalFuncName) + ); + + if (function) + { + (*function)(true); // force load + } + else { - lib = libs().findLibrary(libPath); + FatalIOErrorInFunction(context.dict()) + << "Failed looking up symbol " << globalFuncName + << nl << "from " << libPath << exit(FatalIOError); + } + } + else + { + FatalIOErrorInFunction(context.dict()) + << "Failed looking up symbol " << globalFuncName << nl + << "from " << libPath << exit(FatalIOError); - // verify the loaded version and unload if needed - if (lib) - { - // provision for manual execution of code after loading - if (dlSymFound(lib, globalFuncName)) - { - loaderFunctionType function = - reinterpret_cast<loaderFunctionType> - ( - dlSym(lib, globalFuncName) - ); - - if (function) - { - (*function)(true); // force load - } - else - { - FatalIOErrorInFunction(contextDict) - << "Failed looking up symbol " << globalFuncName - << nl << "from " << libPath << exit(FatalIOError); - } - } - else - { - FatalIOErrorInFunction(contextDict) - << "Failed looking up symbol " << globalFuncName << nl - << "from " << libPath << exit(FatalIOError); - - lib = 0; - if (!libs().close(libPath, false)) - { - FatalIOErrorInFunction(contextDict) - << "Failed unloading library " - << libPath - << exit(FatalIOError); - } - } - } + lib = nullptr; + if (!libs().close(libPath, false)) + { + FatalIOErrorInFunction(context.dict()) + << "Failed unloading library " + << libPath + << exit(FatalIOError); } } @@ -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())); + } +} // ************************************************************************* // diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H index 2d318848e94e716ddd78fc54a20a6810f4802a35..a8c37e0aaeca648280dc31f0965c0d8ba2c028e8 100644 --- a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H +++ b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H @@ -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); + + + // Protected Member Functions + + //- Set code context from a dictionary + void setCodeContext(const dictionary& dict); - //- Update library as required + //- 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; }; diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C index 7e63d8d298d264046e5af2bd8eebec69853727bd..0c5d105c935342fa1e6722073013976eb6d1d002 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C +++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C @@ -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; } @@ -214,7 +223,7 @@ bool Foam::dynamicCode::createMakeFiles() const mkDir(dstFile.path()); OFstream os(dstFile); - //Debug: Info << "Writing to " << dstFile << endl; + //Debug: Info<< "Writing to " << dstFile << endl; if (!os.good()) { FatalErrorInFunction @@ -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,10 +451,9 @@ 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()); + const fileName dstFile(outputDir/srcFile.name()); IFstream is(srcFile); //Debug: Info<< "Reading from " << is.name() << endl; @@ -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) diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H index 4ed7ffaf3cc2228511552e63591a0a84e23bb698..ea9364eb16f508add1b3eb643f671b1495901d1f 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H +++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H @@ -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); + } }; diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.C b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.C index 602b713775063f200950c6c6012ca17ca0ff0642..3f30dc708fdf9d48937259bda06b471f57c5e4ba 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.C +++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.C @@ -29,110 +29,135 @@ License #include "stringOps.H" #include "OSHA1stream.H" -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // -Foam::dynamicCodeContext::dynamicCodeContext(const dictionary& dict) -: - dict_(dict), - code_(), - localCode_(), - include_(), - options_(), - libs_() +void Foam::dynamicCodeContext::inplaceExpand +( + string& code, + const dictionary& dict +) { - // Expand dictionary entries + stringOps::inplaceTrim(code); + stringOps::inplaceExpand(code, dict); +} - // Note: removes any leading/trailing whitespace - // - necessary for compilation options, convenient for includes - // and body. - const entry* codePtr = dict.findEntry("code", keyType::LITERAL); +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 (codePtr) + if (lineNum > 0 && len && !file.empty()) { - codePtr->readEntry(code_); - stringOps::inplaceTrim(code_); - stringOps::inplaceExpand(code_, dict); + code = "#line " + Foam::name(lineNum) + " \"" + file + "\"\n" + code; + + return (code.length() - len); } - const entry* includePtr = dict.findEntry("codeInclude", keyType::LITERAL); + return 0; +} - if (includePtr) - { - includePtr->readEntry(include_); - stringOps::inplaceTrim(include_); - stringOps::inplaceExpand(include_, dict); - } - const entry* optionsPtr = dict.findEntry("codeOptions", keyType::LITERAL); +unsigned Foam::dynamicCodeContext::addLineDirective +( + string& code, + label lineNum, + const dictionary& dict +) +{ + return addLineDirective(code, lineNum, dict.name()); +} - if (optionsPtr) - { - optionsPtr->readEntry(options_); - stringOps::inplaceTrim(options_); - stringOps::inplaceExpand(options_, dict); - } - const entry* libsPtr = dict.findEntry("codeLibs", keyType::LITERAL); +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - if (libsPtr) - { - libsPtr->readEntry(libs_); - stringOps::inplaceTrim(libs_); - stringOps::inplaceExpand(libs_, dict); - } +Foam::dynamicCodeContext::dynamicCodeContext() +: + dict_(std::cref<dictionary>(dictionary::null)) +{} - const entry* localPtr = dict.findEntry("localCode", keyType::LITERAL); - if (localPtr) - { - localPtr->readEntry(localCode_); - stringOps::inplaceTrim(localCode_); - stringOps::inplaceExpand(localCode_, dict); - } +Foam::dynamicCodeContext::dynamicCodeContext(const dictionary& dict) +: + dynamicCodeContext() +{ + setCodeContext(dict); +} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +bool Foam::dynamicCodeContext::valid() const +{ + return &(dict_.get()) != &(dictionary::null); +} - // Calculate SHA1 digest from include, options, localCode, code - OSHA1stream os; - os << include_ << options_ << libs_ << localCode_ << code_; - sha1_ = os.digest(); +void Foam::dynamicCodeContext::setCodeContext(const dictionary& dict) +{ + 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. - // Add line number after calculating sha1 since includes processorDDD - // in path which differs between processors. + const entry* eptr; - if (codePtr) + options_.clear(); + sha1_.append("<codeOptions>"); + if ((eptr = dict.findEntry("codeOptions", keyType::LITERAL)) != nullptr) { - addLineDirective(code_, codePtr->startLineNumber(), dict.name()); + eptr->readEntry(options_); + dynamicCodeContext::inplaceExpand(options_, dict); + sha1_.append(options_); + // No #line for options (Make/options) } - if (includePtr) + libs_.clear(); + sha1_.append("<codeLibs>"); + if ((eptr = dict.findEntry("codeLibs", keyType::LITERAL)) != nullptr) { - addLineDirective(include_, includePtr->startLineNumber(), dict.name()); + eptr->readEntry(libs_); + dynamicCodeContext::inplaceExpand(libs_, dict); + sha1_.append(libs_); + // No #line for libs (LIB_LIBS) } - // 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) + include_.clear(); + sha1_.append("<codeInclude>"); + if ((eptr = dict.findEntry("codeInclude", keyType::LITERAL)) != nullptr) { - addLineDirective(localCode_, localPtr->startLineNumber(), dict.name()); + eptr->readEntry(include_); + dynamicCodeContext::inplaceExpand(include_, dict); + sha1_.append(include_); + addLineDirective(include_, eptr->startLineNumber(), dict); } -} - -// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // - -void Foam::dynamicCodeContext::addLineDirective -( - string& code, - label lineNum, - const fileName& name -) -{ - ++lineNum; // Change from 0-based to 1-based + 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); + } - if (lineNum > 0 && !name.empty()) + localCode_.clear(); + sha1_.append("<localCode>"); + if ((eptr = dict.findEntry("localCode", keyType::LITERAL)) != nullptr) { - code = "#line " + Foam::name(lineNum) + " \"" + name + "\"\n" + code; + eptr->readEntry(localCode_); + dynamicCodeContext::inplaceExpand(localCode_, dict); + sha1_.append(localCode_); + addLineDirective(localCode_, eptr->startLineNumber(), dict); } } diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.H b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.H index 7458bcb2ab1b17ea7d46999fc53295fa398c1938..9ad880f8d59c0776277ce4e133d3c5bdb7a9930c 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.H +++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCodeContext.H @@ -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); + + + // 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 - // 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(); + } + }; diff --git a/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.C b/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.C index e842924dcf872aca5bf292f658ce862ab6d2efa2..be9f6aa09473e0bd4d02ec3664bfaadf1aed7c12 100644 --- a/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.C +++ b/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.C @@ -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,27 +39,26 @@ 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 + + return obr.store + ( + new IOdictionary ( - new IOdictionary + IOobject ( - IOobject - ( - "codeDict", - this->db().time().system(), - this->db(), - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE - ) + "codeDict", + this->db().time().system(), + this->db(), + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE ) - ); - } + ) + ); } @@ -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,23 +88,23 @@ void Foam::codedFixedValuePointPatchField<Type>::prepare // Copy filtered H template dynCode.addCopyFile(codeTemplateH); - - // Debugging: make BC verbose - // dynCode.setFilterVariable("verbose", "true"); - // Info<<"compile " << name_ << " sha1: " - // << context.sha1() << endl; + // Debugging: make verbose + // dynCode.setFilterVariable("verbose", "true"); + // DetailInfo + // <<"compile " << name_ << " sha1: " + // << context.sha1() << endl; // 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" - + context.libs() - ); + ( + "EXE_INC = -g \\\n" + "-I$(LIB_SRC)/finiteVolume/lnInclude \\\n" + + context.options() + + "\n\nLIB_LIBS = \\\n" + " -lOpenFOAM \\\n" + " -lfiniteVolume \\\n" + + context.libs() + ); } diff --git a/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.H b/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.H index 5a34608c2ee18ab92d76adf282a56a17ae485730..9c3dc956d339442360ebd4cb3063f5b56d865b36 100644 --- a/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.H +++ b/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.H @@ -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 diff --git a/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C b/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C index e3c0f914dd61a4ab61b39bf83d7eec4ebc6f3d33..cd545237c4d0d20d73ca0e22344b3fa939ccb5ff 100644 --- a/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C +++ b/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C @@ -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() ); } diff --git a/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.H b/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.H index d095d9481b10f8ec4a65ebbb151d373297309f62..1786193563fbe756aa1ed1b65a32bf10fcad109e 100644 --- a/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.H +++ b/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.H @@ -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); }; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.C index 3ec2b3a5b148596ad99d9e74d275dcbc5dacd2a1..e21217fc52f75734a5d7b305c388e210fe6ee5b8 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011, 2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011-2011, 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,27 +39,26 @@ 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 + + return obr.store + ( + new IOdictionary ( - new IOdictionary + IOobject ( - IOobject - ( - "codeDict", - this->db().time().system(), - this->db(), - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE - ) + "codeDict", + this->db().time().system(), + this->db(), + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE ) - ); - } + ) + ); } @@ -108,36 +76,35 @@ 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 verbose + // dynCode.setFilterVariable("verbose", "true"); + // DetailInfo + // <<"compile " << name_ << " sha1: " + // << context.sha1() << endl; - // debugging: make BC verbose - // dynCode.setFilterVariable("verbose", "true"); - // Info<<"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" - + context.libs() - ); + ( + "EXE_INC = -g \\\n" + "-I$(LIB_SRC)/finiteVolume/lnInclude \\\n" + + context.options() + + "\n\nLIB_LIBS = \\\n" + " -lOpenFOAM \\\n" + " -lfiniteVolume \\\n" + + context.libs() + ); } diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H index 2fd5e0d1f92534614dc23f1884727e7d6497bc43..1e2d7956fbab73cfe8102e360a57cea659f9019a 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011, 2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) 2011-2017 OpenFOAM Foundation @@ -38,8 +38,8 @@ Usage \verbatim <patchName> { - type codedFixedValue; - value uniform 0; + type codedFixedValue; + value uniform 0; name rampedFixedValue; // name of generated BC code @@ -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 diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.C index 7e2bff9185eeb9c21b4e538573d5388026a5c75b..4d378e68c892431225bef8915d1f675415ec9e80 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.C @@ -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,27 +38,26 @@ 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 + + return obr.store + ( + new IOdictionary ( - new IOdictionary + IOobject ( - IOobject - ( - "codeDict", - this->db().time().system(), - this->db(), - IOobject::MUST_READ_IF_MODIFIED, - IOobject::NO_WRITE - ) + "codeDict", + this->db().time().system(), + this->db(), + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE ) - ); - } + ) + ); } @@ -108,36 +75,35 @@ 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 verbose + // dynCode.setFilterVariable("verbose", "true"); + // DetailInfo + // <<"compile " << name_ << " sha1: " + // << context.sha1() << endl; - // debugging: make BC verbose - // dynCode.setFilterVariable("verbose", "true"); - // Info<<"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" - + context.libs() - ); + ( + "EXE_INC = -g \\\n" + "-I$(LIB_SRC)/finiteVolume/lnInclude \\\n" + + context.options() + + "\n\nLIB_LIBS = \\\n" + " -lOpenFOAM \\\n" + " -lfiniteVolume \\\n" + + context.libs() + ); } diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.H index 489ae8c482eec270f79ffa076931061d660fc4c8..87d3252802b64929feb1eef252c58e6430bb003d 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.H @@ -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 diff --git a/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C b/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C index ce45990ae10a940ad55f3c6fe67a85f5d034907d..221e54e0ee14f995235ac9f19cebdc3204463300 100644 --- a/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C +++ b/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C @@ -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; + + const entry* eptr; - if (dataPtr) + 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() ); - } - const entry* readPtr = dict.findEntry("codeRead", keyType::LITERAL); + ++nKeywords; + } - 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() ); - } - const entry* execPtr = dict.findEntry("codeExecute", keyType::LITERAL); + ++nKeywords; + } - 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() ); - } - const entry* writePtr = dict.findEntry("codeWrite", keyType::LITERAL); + ++nKeywords; + } - 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() ); - } - const entry* endPtr = dict.findEntry("codeEnd", keyType::LITERAL); + ++nKeywords; + } - 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_); diff --git a/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H b/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H index 7bac4e67b61a5c40d25eb14b3c4718563100a0ad..3a2de2b50b17381310e15bc65a2fbf182607ba18 100644 --- a/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H +++ b/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2011, 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"); diff --git a/src/fvOptions/sources/general/codedSource/CodedSource.C b/src/fvOptions/sources/general/codedSource/CodedSource.C index f995b87ede6213074ec7cf2894b7485616335c58..c0171d4ca211cd5cc43b603843992661ac2817e6 100644 --- a/src/fvOptions/sources/general/codedSource/CodedSource.C +++ b/src/fvOptions/sources/general/codedSource/CodedSource.C @@ -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,27 +58,28 @@ void Foam::fv::CodedSource<Type>::prepare // copy filtered H template dynCode.addCopyFile("codedFvOptionTemplate.H"); - // debugging: make BC verbose - // dynCode.setFilterVariable("verbose", "true"); - // Info<<"compile " << name_ << " sha1: " - // << context.sha1() << endl; + // debugging: make verbose + // dynCode.setFilterVariable("verbose", "true"); + // DetailInfo + // <<"compile " << name_ << " sha1: " + // << context.sha1() << endl; // define Make/options dynCode.setMakeOptions - ( - "EXE_INC = -g \\\n" - "-I$(LIB_SRC)/finiteVolume/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" - + context.libs() - ); + ( + "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" + + context.options() + + "\n\nLIB_LIBS = \\\n" + " -lfvOptions \\\n" + " -lmeshTools \\\n" + " -lsampling \\\n" + " -lfiniteVolume \\\n" + + context.libs() + ); } diff --git a/src/fvOptions/sources/general/codedSource/CodedSource.H b/src/fvOptions/sources/general/codedSource/CodedSource.H index 6e670bdb965729be9004b91d70d2a090fa45f923..433cf25621310243d157086ae15aecd805b30488 100644 --- a/src/fvOptions/sources/general/codedSource/CodedSource.H +++ b/src/fvOptions/sources/general/codedSource/CodedSource.H @@ -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 - #{ - Pout<< "**codeSetValue**" << endl; - #}; - - // Dummy entry. Make dependent on above to trigger recompilation - code + codeContrain #{ - $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,42 +181,42 @@ public: //- Dynamically compiled fvOption option& redirectFvOption() const; - // Evaluation - - //- Correct field - virtual void correct - ( - GeometricField<Type, fvPatchField, volMesh>& - ); - - //- Explicit and implicit matrix contributions - virtual void addSup - ( - fvMatrix<Type>& eqn, - const label fieldi - ); - - //- Explicit and implicit matrix contributions - // to compressible equation - virtual void addSup - ( - const volScalarField& rho, - fvMatrix<Type>& eqn, - const label fieldi - ); - - //- Set value - virtual void constrain - ( - fvMatrix<Type>& eqn, - const label fieldi - ); - - - // IO - - //- Read source dictionary - virtual bool read(const dictionary& dict); + + // Evaluation + + //- Correct field + virtual void correct + ( + GeometricField<Type, fvPatchField, volMesh>& + ); + + //- Explicit/implicit matrix contributions + virtual void addSup + ( + fvMatrix<Type>& eqn, + const label fieldi + ); + + //- Explicit/implicit matrix contributions to compressible equation + virtual void addSup + ( + const volScalarField& rho, + fvMatrix<Type>& eqn, + const label fieldi + ); + + //- Set value + virtual void constrain + ( + fvMatrix<Type>& eqn, + const label fieldi + ); + + + // IO + + //- Read source dictionary + virtual bool read(const dictionary& dict); }; diff --git a/src/fvOptions/sources/general/codedSource/CodedSourceIO.C b/src/fvOptions/sources/general/codedSource/CodedSourceIO.C index 6bd56cb6c588f707c5169338e4f6045d29ddbf93..5c23b6637db75ea1ddbf1c8f057445b1676cc349 100644 --- a/src/fvOptions/sources/general/codedSource/CodedSourceIO.C +++ b/src/fvOptions/sources/general/codedSource/CodedSourceIO.C @@ -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,70 +26,85 @@ 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)) { - coeffs_.readEntry("fields", fieldNames_); - applied_.setSize(fieldNames_.size(), false); + return false; + } - dict.readCompat<word>("name", {{"redirectType", 1706}}, name_); + coeffs_.readEntry("fields", fieldNames_); + applied_.setSize(fieldNames_.size(), false); - // Code snippets - { - const entry& e = - coeffs_.lookupEntry("codeCorrect", keyType::LITERAL); + dict.readCompat<word>("name", {{"redirectType", 1706}}, name_); - e.readEntry(codeCorrect_); - stringOps::inplaceTrim(codeCorrect_); - stringOps::inplaceExpand(codeCorrect_, coeffs_); - dynamicCodeContext::addLineDirective - ( - codeCorrect_, - e.startLineNumber(), - coeffs_.name() - ); - } + // Code chunks - { - const entry& e = - coeffs_.lookupEntry("codeAddSup", keyType::LITERAL); + codedBase::append("<codeCorrect>"); + { + const entry& e = + coeffs_.lookupEntry("codeCorrect", keyType::LITERAL); - e.readEntry(codeAddSup_); - stringOps::inplaceTrim(codeAddSup_); - stringOps::inplaceExpand(codeAddSup_, coeffs_); - dynamicCodeContext::addLineDirective - ( - codeAddSup_, - e.startLineNumber(), - coeffs_.name() - ); - } + e.readEntry(codeCorrect_); + dynamicCodeContext::inplaceExpand(codeCorrect_, coeffs_); + + codedBase::append(codeCorrect_); + + dynamicCodeContext::addLineDirective + ( + codeCorrect_, + e.startLineNumber(), + coeffs_ + ); + } + + codedBase::append("<codeAddSup>"); + { + const entry& e = + coeffs_.lookupEntry("codeAddSup", keyType::LITERAL); - { - const entry& e = - coeffs_.lookupEntry("codeSetValue", keyType::LITERAL); + e.readEntry(codeAddSup_); + dynamicCodeContext::inplaceExpand(codeAddSup_, coeffs_); - e.readEntry(codeSetValue_); - stringOps::inplaceTrim(codeSetValue_); - stringOps::inplaceExpand(codeSetValue_, coeffs_); - dynamicCodeContext::addLineDirective + codedBase::append(codeAddSup_); + + dynamicCodeContext::addLineDirective + ( + codeAddSup_, + e.startLineNumber(), + coeffs_ + ); + } + + codedBase::append("<codeConstrain>"); + { + const entry& e = + coeffs_.lookupEntryCompat ( - codeSetValue_, - e.startLineNumber(), - coeffs_.name() + "codeConstrain", + {{ "codeSetValue", 1812 }}, keyType::LITERAL ); - } - return true; + e.readEntry(codeConstrain_); + dynamicCodeContext::inplaceExpand(codeConstrain_, coeffs_); + + codedBase::append(codeConstrain_); + + dynamicCodeContext::addLineDirective + ( + codeConstrain_, + e.startLineNumber(), + coeffs_ + ); } - return false; + return true; }