diff --git a/etc/codeTemplates/dynamicCode/FilterFunctionObjectTemplate.C b/etc/codeTemplates/dynamicCode/FilterFunctionObjectTemplate.C new file mode 100644 index 0000000000000000000000000000000000000000..abb7b007c7abd321810e5d9ead6e7cf4b48fcba7 --- /dev/null +++ b/etc/codeTemplates/dynamicCode/FilterFunctionObjectTemplate.C @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "FilterFunctionObjectTemplate.H" + +// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * // + +extern "C" +{ + // dynamicCode: + // SHA1 = ${SHA1sum} + // + // unique function name that can be checked if the correct library version + // has been loaded + void ${typeName}_${SHA1sum}(bool load) + { + if (load) + { + // code that can be explicitly executed after loading + } + else + { + // code that can be explicitly executed before unloading + } + } +} + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineNamedTemplateTypeNameAndDebug(${typeName}FilterFunctionObject, 0); + + //addToRunTimeSelectionTable + addRemovableToRunTimeSelectionTable + ( + functionObject, + ${typeName}FilterFunctionObject, + dictionary + ); +} + +// ************************************************************************* // diff --git a/etc/codeTemplates/dynamicCode/FilterFunctionObjectTemplate.H b/etc/codeTemplates/dynamicCode/FilterFunctionObjectTemplate.H new file mode 100644 index 0000000000000000000000000000000000000000..193016233dabf2a5f29a4600a2f00670b9df343e --- /dev/null +++ b/etc/codeTemplates/dynamicCode/FilterFunctionObjectTemplate.H @@ -0,0 +1,51 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Description + FunctionObject wrapper around functionObjectTemplate to allow them + to be created via the functions entry within controlDict. + +SourceFiles + FilterFunctionObject.C + +\*---------------------------------------------------------------------------*/ + +#ifndef FilterFunctionObject_H +#define FilterFunctionObject_H + +#include "functionObjectTemplate.H" +#include "OutputFilterFunctionObject.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + typedef OutputFilterFunctionObject<${typeName}FunctionObject> + ${typeName}FilterFunctionObject; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/etc/codeTemplates/dynamicCode/IOfunctionObjectTemplate.H b/etc/codeTemplates/dynamicCode/IOfunctionObjectTemplate.H new file mode 100644 index 0000000000000000000000000000000000000000..9faf896772e4740d668d498a8628f9e348705ba8 --- /dev/null +++ b/etc/codeTemplates/dynamicCode/IOfunctionObjectTemplate.H @@ -0,0 +1,50 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Typedef + Foam::IOfunctionObjectTemplate + +Description + Instance of the generic IOOutputFilter for ${typeName}FunctionObject. + +\*---------------------------------------------------------------------------*/ + +#ifndef IOfunctionObjectTemplate_H +#define IOfunctionObjectTemplate_H + +#include "functionObjectTemplate.H" +#include "IOOutputFilter.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + typedef IOOutputFilter<${typeName}FunctionObject> + IO${typeName}FunctionObject; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/etc/codeTemplates/dynamicCode/functionObjectTemplate.C b/etc/codeTemplates/dynamicCode/functionObjectTemplate.C new file mode 100644 index 0000000000000000000000000000000000000000..fa3467946f9cdb7024be83c391d4d8b93d68eca8 --- /dev/null +++ b/etc/codeTemplates/dynamicCode/functionObjectTemplate.C @@ -0,0 +1,132 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "functionObjectTemplate.H" +#include "Time.H" +//#include "pointFields.H" + +//{{{ begin codeInclude +${codeInclude} +//}}} end codeInclude + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(${typeName}FunctionObject, 0); + + +// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * // + +//{{{ begin localCode +${localCode} +//}}} end localCode + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +${typeName}FunctionObject::${typeName}FunctionObject +( + const word& name, + const objectRegistry& obr, + const dictionary& dict, + const bool +) +: + name_(name), + obr_(obr) +{ + read(dict); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +${typeName}FunctionObject::~${typeName}FunctionObject() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void ${typeName}FunctionObject::read(const dictionary& dict) +{ + if (${verbose:-false}) + { + Info<<"read ${typeName} sha1: ${SHA1sum}\n"; + } + +//{{{ begin code + ${codeRead} +//}}} end code +} + + +void ${typeName}FunctionObject::execute() +{ + if (${verbose:-false}) + { + Info<<"execute ${typeName} sha1: ${SHA1sum}\n"; + } + +//{{{ begin code + ${codeExecute} +//}}} end code +} + + +void ${typeName}FunctionObject::end() +{ + if (${verbose:-false}) + { + Info<<"end ${typeName} sha1: ${SHA1sum}\n"; + } + +//{{{ begin code + ${codeEnd} +//}}} end code +} + + +void ${typeName}FunctionObject::write() +{ + if (${verbose:-false}) + { + Info<<"write ${typeName} sha1: ${SHA1sum}\n"; + } + +//{{{ begin code + ${code} +//}}} end code +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + + +// ************************************************************************* // diff --git a/etc/codeTemplates/dynamicCode/functionObjectTemplate.H b/etc/codeTemplates/dynamicCode/functionObjectTemplate.H new file mode 100644 index 0000000000000000000000000000000000000000..cc921c90d24ffaf2b543d2a217c009433249ca67 --- /dev/null +++ b/etc/codeTemplates/dynamicCode/functionObjectTemplate.H @@ -0,0 +1,138 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Description + Template for use with dynamic code generation of a + OutputFilter functionObject. + +SourceFiles + functionObjectTemplate.C + +\*---------------------------------------------------------------------------*/ + +#ifndef functionObjectTemplate_H +#define functionObjectTemplate_H + +#include "stringList.H" +#include "pointField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of classes +class objectRegistry; +class dictionary; +class mapPolyMesh; + +/*---------------------------------------------------------------------------*\ + A templated functionObject +\*---------------------------------------------------------------------------*/ + +class ${typeName}FunctionObject +{ + // Private data + + //- Name of this set of system calls + word name_; + + //- Registry + const objectRegistry& obr_; + +//{{{ begin codeData + ${codeData} +//}}} end codeData + + + // Private Member Functions + + //- Disallow default bitwise copy construct + ${typeName}FunctionObject(const ${typeName}FunctionObject&); + + //- Disallow default bitwise assignment + void operator=(const ${typeName}FunctionObject&); + + +public: + + //- Runtime type information + TypeName("${typeName}"); + + + // Constructors + + //- Construct for given objectRegistry and dictionary. + // Allow the possibility to load fields from files + ${typeName}FunctionObject + ( + const word& name, + const objectRegistry& unused, + const dictionary&, + const bool loadFromFilesUnused = false + ); + + + //- Destructor + virtual ~${typeName}FunctionObject(); + + + // Member Functions + + //- Return name of the system call set + virtual const word& name() const + { + return name_; + } + + //- Read the system calls + virtual void read(const dictionary&); + + //- Execute the "executeCalls" at each time-step + virtual void execute(); + + //- Execute the "endCalls" at the final time-loop + virtual void end(); + + //- Write, execute the "writeCalls" + virtual void write(); + + //- Update for changes of mesh + virtual void updateMesh(const mapPolyMesh&) + {} + + //- Update for changes of mesh + virtual void movePoints(const pointField&) + {} +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/postProcessing/functionObjects/utilities/Make/files b/src/postProcessing/functionObjects/utilities/Make/files index a93fad2edadcb9a9b6f011ed423abff1d8ccb9e6..88d8fb9c42c9047d80236394e9207668d14bdd7c 100644 --- a/src/postProcessing/functionObjects/utilities/Make/files +++ b/src/postProcessing/functionObjects/utilities/Make/files @@ -1,3 +1,5 @@ +codedFunctionObject/codedFunctionObject.C + staticPressure/staticPressure.C staticPressure/staticPressureFunctionObject.C diff --git a/src/postProcessing/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C b/src/postProcessing/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C new file mode 100644 index 0000000000000000000000000000000000000000..36da451a6385cf5b5393b3680efc306f2341fd2c --- /dev/null +++ b/src/postProcessing/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C @@ -0,0 +1,398 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "codedFunctionObject.H" +#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 * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(codedFunctionObject, 0); + + addToRunTimeSelectionTable + ( + functionObject, + codedFunctionObject, + dictionary + ); +} + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +void* Foam::codedFunctionObject::loadLibrary +( + const fileName& libPath, + const string& globalFuncName, + const dictionary& contextDict +) +{ + void* lib = 0; + + // avoid compilation by loading an existing library + if (!libPath.empty() && dlLibraryTable::open(libPath, false)) + { + lib = dlLibraryTable::findLibrary(libPath); + + // 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 + { + FatalIOErrorIn + ( + "codedFunctionObject::updateLibrary()", + contextDict + ) << "Failed looking up symbol " << globalFuncName << nl + << "from " << libPath << exit(FatalIOError); + } + } + else + { + FatalIOErrorIn + ( + "codedFunctionObject::loadLibrary()", + contextDict + ) << "Failed looking up symbol " << globalFuncName << nl + << "from " << libPath << exit(FatalIOError); + + lib = 0; + if (!dlLibraryTable::close(libPath, false)) + { + FatalIOErrorIn + ( + "codedFunctionObject::loadLibrary()", + contextDict + ) << "Failed unloading library " + << libPath + << exit(FatalIOError); + } + } + } + } + + return lib; +} + + +void Foam::codedFunctionObject::unloadLibrary +( + const fileName& libPath, + const string& globalFuncName, + const dictionary& contextDict +) +{ + void* lib = 0; + + if (!libPath.empty()) + { + lib = dlLibraryTable::findLibrary(libPath); + } + + if (!lib) + { + return; + } + + // provision for manual execution of code before unloading + if (dlSymFound(lib, globalFuncName)) + { + loaderFunctionType function = + reinterpret_cast<loaderFunctionType> + ( + dlSym(lib, globalFuncName) + ); + + if (function) + { + (*function)(false); // force unload + } + else + { + FatalIOErrorIn + ( + "codedFunctionObject::unloadLibrary()", + contextDict + ) << "Failed looking up symbol " << globalFuncName << nl + << "from " << libPath << exit(FatalIOError); + } + } + + if (!dlLibraryTable::close(libPath, false)) + { + FatalIOErrorIn + ( + "codedFunctionObject::" + "updateLibrary()", + contextDict + ) << "Failed unloading library " << libPath + << exit(FatalIOError); + } +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::codedFunctionObject::createLibrary +( + dynamicCode& dynCode, + const dynamicCodeContext& context +) const +{ + bool create = Pstream::master(); + + if (create) + { + // Write files for new library + if (!dynCode.upToDate(context)) + { + Info<< "Using dynamicCode for functionObject " << name() + << endl; + + // filter with this context + dynCode.reset(context); + + // Set additional rewrite rules + dynCode.setFilterVariable("typeName", redirectType_); + dynCode.setFilterVariable("codeRead", codeRead_); + dynCode.setFilterVariable("codeExecute", codeExecute_); + dynCode.setFilterVariable("codeEnd", codeEnd_); + //dynCode.setFilterVariable("codeWrite", codeWrite_); + + // compile filtered C template + dynCode.addCompileFile("functionObjectTemplate.C"); + dynCode.addCompileFile("FilterFunctionObjectTemplate.C"); + + // copy filtered H template + dynCode.addCopyFile("FilterFunctionObjectTemplate.H"); + dynCode.addCopyFile("functionObjectTemplate.H"); + dynCode.addCopyFile("IOfunctionObjectTemplate.H"); + + // debugging: make BC verbose + // dynCode.setFilterVariable("verbose", "true"); + // Info<<"compile " << redirectType_ << " 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() + ); + + if (!dynCode.copyOrCreateFiles(true)) + { + FatalIOErrorIn + ( + "codedFunctionObject::createLibrary(..)", + context.dict() + ) << "Failed writing files for" << nl + << dynCode.libRelPath() << nl + << exit(FatalIOError); + } + } + + if (!dynCode.wmakeLibso()) + { + FatalIOErrorIn + ( + "codedFunctionObject::createLibrary(..)", + context.dict() + ) << "Failed wmake " << dynCode.libRelPath() << nl + << exit(FatalIOError); + } + } + + + // all processes must wait for compile to finish + reduce(create, orOp<bool>()); +} + + +void Foam::codedFunctionObject::updateLibrary() const +{ + dynamicCode::checkSecurity + ( + "codedFunctionObject::updateLibrary()", + dict_ + ); + + dynamicCodeContext context(dict_); + + // codeName: redirectType + _<sha1> + // codeDir : redirectType + dynamicCode dynCode + ( + redirectType_ + context.sha1().str(true), + redirectType_ + ); + const fileName libPath = dynCode.libPath(); + + + // the correct library was already loaded => we are done + if (dlLibraryTable::findLibrary(libPath)) + { + return; + } + + // remove instantiation of fvPatchField provided by library + redirectFunctionObjectPtr_.clear(); + + // may need to unload old library + unloadLibrary + ( + oldLibPath_, + dynamicCode::libraryBaseName(oldLibPath_), + context.dict() + ); + + // try loading an existing library (avoid compilation when possible) + if (!loadLibrary(libPath, dynCode.codeName(), context.dict())) + { + createLibrary(dynCode, context); + + loadLibrary(libPath, dynCode.codeName(), context.dict()); + } + + // retain for future reference + oldLibPath_ = libPath; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::codedFunctionObject::codedFunctionObject +( + const word& name, + const Time& time, + const dictionary& dict +) +: + functionObject(name), + time_(time), + dict_(dict) +{ + read(dict_); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::codedFunctionObject::~codedFunctionObject() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::functionObject& +Foam::codedFunctionObject::redirectFunctionObject() const +{ + if (!redirectFunctionObjectPtr_.valid()) + { + dictionary constructDict(dict_); + constructDict.set("type", redirectType_); + + redirectFunctionObjectPtr_ = functionObject::New + ( + redirectType_, + time_, + constructDict + ); + } + return redirectFunctionObjectPtr_(); +} + + +bool Foam::codedFunctionObject::start() +{ + updateLibrary(); + return redirectFunctionObject().start(); +} + + +bool Foam::codedFunctionObject::execute(const bool forceWrite) +{ + updateLibrary(); + return redirectFunctionObject().execute(forceWrite); +} + + +bool Foam::codedFunctionObject::end() +{ + updateLibrary(); + return redirectFunctionObject().end(); +} + + +bool Foam::codedFunctionObject::read(const dictionary& dict) +{ + dict.lookup("redirectType") >> redirectType_; + + if (dict.found("codeRead")) + { + codeRead_ = stringOps::trim(dict["codeRead"]); + stringOps::inplaceExpand(codeRead_, dict); + } + if (dict.found("codeExecute")) + { + codeExecute_ = stringOps::trim(dict["codeExecute"]); + stringOps::inplaceExpand(codeExecute_, dict); + } + if (dict.found("codeEnd")) + { + codeEnd_ = stringOps::trim(dict["codeEnd"]); + stringOps::inplaceExpand(codeEnd_, dict); + } + updateLibrary(); + return redirectFunctionObject().read(dict); +} + + +// ************************************************************************* // diff --git a/src/postProcessing/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H b/src/postProcessing/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H new file mode 100644 index 0000000000000000000000000000000000000000..0827dcd5751260a9cdd9e8c54b3c3bf4695d6ae1 --- /dev/null +++ b/src/postProcessing/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H @@ -0,0 +1,174 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::codedFunctionObject + +Description + functionObject using dynamic code compilation. + +SourceFiles + codedFunctionObject.C + +\*---------------------------------------------------------------------------*/ + +#ifndef codedFunctionObject_H +#define codedFunctionObject_H + +#include "pointFieldFwd.H" +#include "functionObject.H" +#include "dictionary.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of classes +class objectRegistry; +class dictionary; +class mapPolyMesh; +class dynamicCode; +class dynamicCodeContext; +class IOdictionary; + +/*---------------------------------------------------------------------------*\ + Class codedFunctionObject Declaration +\*---------------------------------------------------------------------------*/ + +class codedFunctionObject +: + public functionObject +{ +protected: + + // Protected data + + //- Reference to the time database + const Time& time_; + + //- Input dictionary + dictionary dict_; + + word redirectType_; + + string codeRead_; + string codeExecute_; + string codeEnd_; + + //- Previously loaded library + mutable fileName oldLibPath_; + + //- Underlying functionObject + mutable autoPtr<functionObject> redirectFunctionObjectPtr_; + + // Private Member Functions + + //- Global loader/unloader function type + typedef void (*loaderFunctionType)(bool); + + //- Load specified library and execute globalFuncName(true) + static void* loadLibrary + ( + const fileName& libPath, + const string& globalFuncName, + const dictionary& contextDict + ); + + //- Execute globalFuncName(false) and unload specified library + static void unloadLibrary + ( + const fileName& libPath, + const string& globalFuncName, + const dictionary& contextDict + ); + + + //- Create library based on the dynamicCodeContext + void createLibrary(dynamicCode&, const dynamicCodeContext&) const; + + //- Update library as required + void updateLibrary() const; + + //- Read relevant dictionary entries + void readDict(); + + //- Disallow default bitwise copy construct + codedFunctionObject(const codedFunctionObject&); + + //- Disallow default bitwise assignment + void operator=(const codedFunctionObject&); + + +public: + + //- Runtime type information + TypeName("coded"); + + + // Constructors + + //- Construct for given objectRegistry and dictionary. + // Allow the possibility to load fields from files + codedFunctionObject + ( + const word& name, + const Time& time, + const dictionary& dict + ); + + + //- Destructor + virtual ~codedFunctionObject(); + + + // Member Functions + + //- Dynamically compiled functionObject + functionObject& redirectFunctionObject() const; + + //- Called at the start of the time-loop + virtual bool start(); + + //- Called at each ++ or += of the time-loop. forceWrite overrides the + // outputControl behaviour. + virtual bool execute(const bool forceWrite); + + //- Called when Time::run() determines that the time-loop exits. + // By default it simply calls execute(). + virtual bool end(); + + //- Read and set the function object if its data have changed + virtual bool read(const dictionary&); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //