diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files
index 4d2062b421..0e1224505b 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 0000000000..41b8af6a29
--- /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 .
+
+\*---------------------------------------------------------------------------*/
+
+#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("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 0000000000..a6fbc65615
--- /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 .
+
+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
+ Type getBaseProperty
+ (
+ const word& entryName,
+ const Type& defaultValue = pTraits::zero
+ ) const;
+
+ //- Retrieve generic property from the base model
+ template
+ void getBaseProperty(const word& entryName, Type& value) const;
+
+ //- Add generic property to the base model
+ template
+ void setBaseProperty(const word& entryName, const Type& value);
+
+
+ // Model properties
+
+ //- Retrieve generic property from the sub-model
+ template
+ Type getModelProperty
+ (
+ const word& entryName,
+ const Type& defaultValue = pTraits::zero
+ ) const;
+
+ //- Retrieve generic property from the sub-model
+ template
+ void getModelProperty(const word& entryName, Type& value) const;
+
+ //- Add generic property to the sub-model
+ template
+ 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 0000000000..df881986e8
--- /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 .
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+template
+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
+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
+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
+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
+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
+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
+ );
+ }
+ }
+}
+
+
+// ************************************************************************* //