diff --git a/src/functionObjects/field/Make/files b/src/functionObjects/field/Make/files
index 284ebd4e34..de5be18775 100644
--- a/src/functionObjects/field/Make/files
+++ b/src/functionObjects/field/Make/files
@@ -62,6 +62,7 @@ XiReactionRate/XiReactionRate.C
streamFunction/streamFunction.C
fieldsExpression/fieldsExpression.C
+add/add.C
subtract/subtract.C
LIB = $(FOAM_LIBBIN)/libfieldFunctionObjects
diff --git a/src/functionObjects/field/add/add.C b/src/functionObjects/field/add/add.C
new file mode 100644
index 0000000000..88be04e7a6
--- /dev/null
+++ b/src/functionObjects/field/add/add.C
@@ -0,0 +1,70 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 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 "add.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+ defineTypeNameAndDebug(add, 0);
+ addToRunTimeSelectionTable(functionObject, add, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+bool Foam::functionObjects::add::calc()
+{
+ return calcAllTypes(*this);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::functionObjects::add::add
+(
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+)
+:
+ fieldsExpression(name, runTime, dict)
+{
+ setResultName("add");
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::functionObjects::add::~add()
+{}
+
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/add/add.H b/src/functionObjects/field/add/add.H
new file mode 100644
index 0000000000..1198c2b0df
--- /dev/null
+++ b/src/functionObjects/field/add/add.H
@@ -0,0 +1,129 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 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::functionObjects::add
+
+Group
+ grpFieldFunctionObjects
+
+Description
+ Add a list of fields.
+
+ The operation can be applied to any volume or surface fields generating a
+ volume or surface scalar field.
+
+ Example of function object specification:
+ \verbatim
+ Ttot
+ {
+ type add;
+ libs ("libfieldFunctionObjects.so");
+ fields (T Tdelta);
+ result Ttot;
+ executeControl writeTime;
+ writeControl writeTime;
+ }
+ \endverbatim
+
+See also
+ Foam::functionObjects::fieldsExpression
+ Foam::functionObjects::fvMeshFunctionObject
+
+SourceFiles
+ add.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_add_H
+#define functionObjects_add_H
+
+#include "fieldsExpression.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+ Class add Declaration
+\*---------------------------------------------------------------------------*/
+
+class add
+:
+ public fieldsExpression
+{
+ // Private Member Functions
+
+ //- Add the list of fields of the specified type
+ // and return the result
+ template
+ tmp calcFieldType() const;
+
+ //- Add the list of fields and return true if successful
+ virtual bool calc();
+
+
+public:
+
+ friend class fieldsExpression;
+
+
+ //- Runtime type information
+ TypeName("add");
+
+
+ // Constructors
+
+ //- Construct from Time and dictionary
+ add
+ (
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+ );
+
+
+ //- Destructor
+ virtual ~add();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+ #include "addTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/add/addTemplates.C b/src/functionObjects/field/add/addTemplates.C
new file mode 100644
index 0000000000..13b81af0ef
--- /dev/null
+++ b/src/functionObjects/field/add/addTemplates.C
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 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 .
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+template
+Foam::tmp
+Foam::functionObjects::add::calcFieldType() const
+{
+ tmp tresult
+ (
+ lookupObject(fieldNames_[0])
+ + lookupObject(fieldNames_[1])
+ );
+
+ for (label i=2; i(fieldNames_[i]);
+ }
+
+ return tresult;
+}
+
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/fieldsExpression/fieldsExpression.C b/src/functionObjects/field/fieldsExpression/fieldsExpression.C
index bf61140b14..482c1aa932 100644
--- a/src/functionObjects/field/fieldsExpression/fieldsExpression.C
+++ b/src/functionObjects/field/fieldsExpression/fieldsExpression.C
@@ -52,12 +52,12 @@ void Foam::functionObjects::fieldsExpression::setResultName
if (resultName_.empty())
{
- if (fieldNames_ != defaultArgs)
+ if (!fieldNames_.empty())
{
- resultName_ = typeName + '(';
- forAll(fieldNames_, i)
+ resultName_ = typeName + '(' + fieldNames_[0];
+ for (label i=1; i
+ bool calcFieldTypes(FOType& fo);
+
+ //- Call 'calcFieldTypes' for the given 'Type' and functionObject
+ template
+ bool calcType(FOType& fo);
+
+ //- Call 'calcType' for the given functionObject
+ // for each primitive type
+ template
+ bool calcAllTypes(FOType& fo);
+
+ virtual bool calc() = 0;
private:
@@ -133,6 +151,12 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+#ifdef NoRepository
+ #include "fieldsExpressionTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
#endif
// ************************************************************************* //
diff --git a/src/functionObjects/field/fieldsExpression/fieldsExpressionTemplates.C b/src/functionObjects/field/fieldsExpression/fieldsExpressionTemplates.C
new file mode 100644
index 0000000000..b9b3be1135
--- /dev/null
+++ b/src/functionObjects/field/fieldsExpression/fieldsExpressionTemplates.C
@@ -0,0 +1,82 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 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 "volFields.H"
+#include "surfaceFields.H"
+
+// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
+
+template
+bool Foam::functionObjects::fieldsExpression::calcFieldTypes(FOType& fo)
+{
+ typedef GeometricField VolFieldType;
+ typedef GeometricField SurfaceFieldType;
+
+ if (foundObject(fieldNames_[0]))
+ {
+ return store
+ (
+ resultName_,
+ fo.template calcFieldType()
+ );
+ }
+ else if (foundObject(fieldNames_[0]))
+ {
+ return store
+ (
+ resultName_,
+ fo.template calcFieldType()
+ );
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+template
+bool Foam::functionObjects::fieldsExpression::calcType(FOType& fo)
+{
+ return calcFieldTypes(fo);
+}
+
+
+template
+bool Foam::functionObjects::fieldsExpression::calcAllTypes(FOType& fo)
+{
+ bool processed = false;
+
+ processed = processed || fo.template calcType(fo);
+ processed = processed || fo.template calcType(fo);
+ processed = processed || fo.template calcType(fo);
+ processed = processed || fo.template calcType(fo);
+ processed = processed || fo.template calcType(fo);
+
+ return processed;
+}
+
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/subtract/subtract.C b/src/functionObjects/field/subtract/subtract.C
index 592ba5941d..8405fd11fa 100644
--- a/src/functionObjects/field/subtract/subtract.C
+++ b/src/functionObjects/field/subtract/subtract.C
@@ -42,15 +42,7 @@ namespace functionObjects
bool Foam::functionObjects::subtract::calc()
{
- bool processed = false;
-
- processed = processed || calcSubtract();
- processed = processed || calcSubtract();
- processed = processed || calcSubtract();
- processed = processed || calcSubtract();
- processed = processed || calcSubtract();
-
- return processed;
+ return calcAllTypes(*this);
}
@@ -65,15 +57,7 @@ Foam::functionObjects::subtract::subtract
:
fieldsExpression(name, runTime, dict)
{
- read(dict);
-
- if (fieldNames_.size() < 2)
- {
- FatalIOErrorInFunction(dict)
- << type() << " requires at least 2 fields only "
- << fieldNames_.size() << " provided: " << fieldNames_
- << exit(FatalIOError);
- }
+ setResultName("subtract");
}
diff --git a/src/functionObjects/field/subtract/subtract.H b/src/functionObjects/field/subtract/subtract.H
index 31fae7285a..6fb4aa7fd2 100644
--- a/src/functionObjects/field/subtract/subtract.H
+++ b/src/functionObjects/field/subtract/subtract.H
@@ -80,11 +80,7 @@ class subtract
//- Subtract the list of fields of the specified type
// and return the result
template
- tmp subtractFields() const;
-
- //- Subtract the list of fields and register the result
- template
- bool calcSubtract();
+ tmp calcFieldType() const;
//- Subtract the list of fields and return true if successful
virtual bool calc();
@@ -92,6 +88,9 @@ class subtract
public:
+ friend class fieldsExpression;
+
+
//- Runtime type information
TypeName("subtract");
diff --git a/src/functionObjects/field/subtract/subtractTemplates.C b/src/functionObjects/field/subtract/subtractTemplates.C
index 6368f29e4d..07aee1e98c 100644
--- a/src/functionObjects/field/subtract/subtractTemplates.C
+++ b/src/functionObjects/field/subtract/subtractTemplates.C
@@ -23,14 +23,11 @@ License
\*---------------------------------------------------------------------------*/
-#include "volFields.H"
-#include "surfaceFields.H"
-
-// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
template
Foam::tmp
-Foam::functionObjects::subtract::subtractFields() const
+Foam::functionObjects::subtract::calcFieldType() const
{
tmp tresult
(
@@ -40,40 +37,11 @@ Foam::functionObjects::subtract::subtractFields() const
for (label i=2; i(fieldNames_[i]);
+ tresult.ref() -= lookupObject(fieldNames_[i]);
}
return tresult;
}
-template
-bool Foam::functionObjects::subtract::calcSubtract()
-{
- typedef GeometricField VolFieldType;
- typedef GeometricField SurfaceFieldType;
-
- if (foundObject(fieldNames_[0]))
- {
- return store
- (
- resultName_,
- subtractFields()
- );
- }
- else if (foundObject(fieldNames_[0]))
- {
- return store
- (
- resultName_,
- subtractFields()
- );
- }
- else
- {
- return false;
- }
-}
-
-
// ************************************************************************* //