From d06c0a1da6ec56c1e937f29383de066980ce9100 Mon Sep 17 00:00:00 2001 From: andy <andy> Date: Mon, 9 Dec 2013 09:27:10 +0000 Subject: [PATCH] ENH: Added base class for run-time selectable models --- src/OpenFOAM/Make/files | 2 + .../primitives/subModelBase/subModelBase.C | 180 ++++++++++++++ .../primitives/subModelBase/subModelBase.H | 222 ++++++++++++++++++ .../subModelBase/subModelBaseTemplates.C | 194 +++++++++++++++ 4 files changed, 598 insertions(+) create mode 100644 src/OpenFOAM/primitives/subModelBase/subModelBase.C create mode 100644 src/OpenFOAM/primitives/subModelBase/subModelBase.H create mode 100644 src/OpenFOAM/primitives/subModelBase/subModelBaseTemplates.C diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files index 4d2062b421c..0e1224505b2 100644 --- a/src/OpenFOAM/Make/files +++ b/src/OpenFOAM/Make/files @@ -73,6 +73,8 @@ primitives/functions/DataEntry/polynomial/polynomialIO.C primitives/functions/Polynomial/polynomialFunction.C +primitives/subModelBase/subModelBase.C + strings = primitives/strings $(strings)/string/string.C $(strings)/string/stringIO.C diff --git a/src/OpenFOAM/primitives/subModelBase/subModelBase.C b/src/OpenFOAM/primitives/subModelBase/subModelBase.C new file mode 100644 index 00000000000..41b8af6a29e --- /dev/null +++ b/src/OpenFOAM/primitives/subModelBase/subModelBase.C @@ -0,0 +1,180 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "subModelBase.H" + +// * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * // + +bool Foam::subModelBase::subModelBase::inLine() const +{ + return (modelName_ != word::null); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::subModelBase::subModelBase(dictionary& properties) +: + modelName_(word::null), + properties_(properties), + dict_(dictionary::null), + baseName_(word::null), + modelType_(word::null), + coeffDict_(dictionary::null) +{} + + +Foam::subModelBase::subModelBase +( + dictionary& properties, + const dictionary& dict, + const word& baseName, + const word& modelType, + const word& dictExt +) +: + modelName_(word::null), + properties_(properties), + dict_(dict), + baseName_(baseName), + modelType_(modelType), + coeffDict_(dict.subDict(modelType + dictExt)) +{} + + +Foam::subModelBase::subModelBase +( + const word& modelName, + dictionary& properties, + const dictionary& dict, + const word& baseName, + const word& modelType +) +: + modelName_(modelName), + properties_(properties), + dict_(dict), + baseName_(baseName), + modelType_(modelType), + coeffDict_(dict) +{} + + +Foam::subModelBase::subModelBase(const subModelBase& smb) +: + modelName_(smb.modelName_), + properties_(smb.properties_), + dict_(smb.dict_), + baseName_(smb.baseName_), + modelType_(smb.modelType_), + coeffDict_(smb.coeffDict_) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::subModelBase::~subModelBase() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::word& Foam::subModelBase::modelName() const +{ + return modelName_; +} + + +const Foam::dictionary& Foam::subModelBase::dict() const +{ + return dict_; +} + + +const Foam::word& Foam::subModelBase::baseName() const +{ + return baseName_; +} + + +const Foam::word& Foam::subModelBase::modelType() const +{ + return modelType_; +} + + +const Foam::dictionary& Foam::subModelBase::coeffDict() const +{ + return coeffDict_; +} + + +const Foam::dictionary& Foam::subModelBase::properties() const +{ + return properties_; +} + + +bool Foam::subModelBase::defaultCoeffs(const bool printMsg) const +{ + bool def = coeffDict_.lookupOrDefault<bool>("defaultCoeffs", false); + if (printMsg && def) + { + Info<< incrIndent; + Info<< indent << "Employing default coefficients" << endl; + Info<< decrIndent; + } + + return def; +} + + +bool Foam::subModelBase::active() const +{ + return true; +} + + +void Foam::subModelBase::cacheFields(const bool) +{ + // do nothing +} + + +bool Foam::subModelBase::outputTime() const +{ + return active(); +} + + +void Foam::subModelBase::write(Ostream& os) const +{ + // not writing complete cloud dictionary, only coeffs +// os << dict_; + os << coeffDict_; +} + + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/subModelBase/subModelBase.H b/src/OpenFOAM/primitives/subModelBase/subModelBase.H new file mode 100644 index 00000000000..a6fbc65615a --- /dev/null +++ b/src/OpenFOAM/primitives/subModelBase/subModelBase.H @@ -0,0 +1,222 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::subModelBase + +Description + Base class for generic sub-models requiring to be read from dictionary. + Provides a mechanism to read and write properties from a dictionary to + enable clean re-starts. Used by, e.g. clou dsub-models. + +SourceFiles + subModelBase.C + +\*---------------------------------------------------------------------------*/ + +#ifndef subModelBase_H +#define subModelBase_H + +#include "dictionary.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + + +/*---------------------------------------------------------------------------*\ + Class subModelBase Declaration +\*---------------------------------------------------------------------------*/ + +class subModelBase +{ +private: + + // Private Member Functions + + //- Disallow default bitwise assignment + void operator=(const subModelBase&); + + +protected: + + // Protected Data + + //- Name of the sub-model + const word modelName_; + + //- Reference to properties dictionary e.g. for restart + dictionary& properties_; + + //- Copy of dictionary used during construction + const dictionary dict_; + + //- Name of the sub-model base class + const word baseName_; + + //- Type of the sub-model + const word modelType_; + + //- Coefficients dictionary + const dictionary coeffDict_; + + + // Protected Member Functions + + //- Flag to indicate whether data is/was read in-line + bool inLine() const; + + +public: + + // Constructors + + //- Construct null + subModelBase(dictionary& properties); + + //- Construct from components without name + subModelBase + ( + dictionary& properties, + const dictionary& dict, + const word& baseName, + const word& modelType, + const word& dictExt = "Coeffs" + ); + + //- Construct from components with name + subModelBase + ( + const word& modelName, + dictionary& properties, + const dictionary& dict, + const word& baseName, + const word& modelType + ); + + //- Construct as copy + subModelBase(const subModelBase& smb); + + + //- Destructor + virtual ~subModelBase(); + + + // Member Functions + + // Access + + //- Return const access to the name of the sub-model + const word& modelName() const; + + //- Return const access to the cloud dictionary + const dictionary& dict() const; + + //- Return const access to the base name of the sub-model + const word& baseName() const; + + //- Return const access to the sub-model type + const word& modelType() const; + + //- Return const access to the coefficients dictionary + const dictionary& coeffDict() const; + + //- Return const access to the properties dictionary + const dictionary& properties() const; + + //- Returns true if defaultCoeffs is true and outputs on printMsg + virtual bool defaultCoeffs(const bool printMsg) const; + + //- Return the model 'active' status - default active = true + virtual bool active() const; + + //- Cache dependant sub-model fields + virtual void cacheFields(const bool store); + + //- Flag to indicate when to write a property + virtual bool outputTime() const; + + + // Edit + + // Base properties + + //- Retrieve generic property from the base model + template<class Type> + Type getBaseProperty + ( + const word& entryName, + const Type& defaultValue = pTraits<Type>::zero + ) const; + + //- Retrieve generic property from the base model + template<class Type> + void getBaseProperty(const word& entryName, Type& value) const; + + //- Add generic property to the base model + template<class Type> + void setBaseProperty(const word& entryName, const Type& value); + + + // Model properties + + //- Retrieve generic property from the sub-model + template<class Type> + Type getModelProperty + ( + const word& entryName, + const Type& defaultValue = pTraits<Type>::zero + ) const; + + //- Retrieve generic property from the sub-model + template<class Type> + void getModelProperty(const word& entryName, Type& value) const; + + //- Add generic property to the sub-model + template<class Type> + void setModelProperty(const word& entryName, const Type& value); + + + // I-O + + //- Write + virtual void write(Ostream& os) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "subModelBaseTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/subModelBase/subModelBaseTemplates.C b/src/OpenFOAM/primitives/subModelBase/subModelBaseTemplates.C new file mode 100644 index 00000000000..df881986e8e --- /dev/null +++ b/src/OpenFOAM/primitives/subModelBase/subModelBaseTemplates.C @@ -0,0 +1,194 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Type> +Type Foam::subModelBase::getBaseProperty +( + const word& entryName, + const Type& defaultValue +) const +{ + Type result = defaultValue; + + if (properties_.found(baseName_)) + { + const dictionary& baseDict = properties_.subDict(baseName_); + baseDict.readIfPresent(entryName, result); + } + + return result; +} + + +template<class Type> +void Foam::subModelBase::getBaseProperty +( + const word& entryName, + Type& value +) const +{ + if (properties_.found(baseName_)) + { + const dictionary& baseDict = properties_.subDict(baseName_); + baseDict.readIfPresent(entryName, value); + } +} + + +template<class Type> +void Foam::subModelBase::setBaseProperty +( + const word& entryName, + const Type& value +) +{ + if (properties_.found(baseName_)) + { + dictionary& baseDict = properties_.subDict(baseName_); + baseDict.add(entryName, value, true); + } + else + { + properties_.add(baseName_, dictionary()); + properties_.subDict(baseName_).add(entryName, value); + } +} + + +template<class Type> +Type Foam::subModelBase::getModelProperty +( + const word& entryName, + const Type& defaultValue +) const +{ + Type result = defaultValue; + + if (properties_.found(baseName_)) + { + const dictionary& baseDict = properties_.subDict(baseName_); + + if (inLine() && baseDict.found(modelName_)) + { + baseDict.subDict(modelName_).readIfPresent(entryName, result); + } + else if (baseDict.found(modelType_)) + { + baseDict.subDict(modelType_).readIfPresent(entryName, result); + } + } + + return result; +} + + +template<class Type> +void Foam::subModelBase::getModelProperty +( + const word& entryName, + Type& value +) const +{ + if (properties_.found(baseName_)) + { + const dictionary& baseDict = properties_.subDict(baseName_); + + if (inLine() && baseDict.found(modelName_)) + { + baseDict.subDict(modelName_).readIfPresent(entryName, value); + } + else if (baseDict.found(modelType_)) + { + baseDict.subDict(modelType_).readIfPresent(entryName, value); + } + } +} + + +template<class Type> +void Foam::subModelBase::setModelProperty +( + const word& entryName, + const Type& value +) +{ + if (properties_.found(baseName_)) + { + dictionary& baseDict = properties_.subDict(baseName_); + + if (inLine()) + { + if (baseDict.found(modelName_)) + { + baseDict.subDict(modelName_).add(entryName, value, true); + } + else + { + baseDict.add(modelName_, dictionary()); + baseDict.subDict(modelName_).add(entryName, value, true); + } + } + else + { + if (baseDict.found(modelType_)) + { + baseDict.subDict(modelType_).add(entryName, value, true); + } + else + { + baseDict.add(modelType_, dictionary()); + baseDict.subDict(modelType_).add(entryName, value, true); + } + } + } + else + { + properties_.add(baseName_, dictionary()); + + if (inLine()) + { + properties_.subDict(baseName_).add(modelName_, dictionary()); + properties_.subDict(baseName_).subDict(modelName_).add + ( + entryName, + value + ); + } + else + { + properties_.subDict(baseName_).add(modelType_, dictionary()); + properties_.subDict(baseName_).subDict(modelType_).add + ( + entryName, + value + ); + } + } +} + + +// ************************************************************************* // -- GitLab