From 56919a444203751717a4ece05d44cc8716787ca1 Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Sat, 19 Nov 2016 21:48:48 +0000 Subject: [PATCH] functionObjects::add: Add 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 Also refactored functionObjects::fieldsExpression to avoid code duplication between the 'add' and 'subtract' functionObjects. --- src/functionObjects/field/Make/files | 1 + src/functionObjects/field/add/add.C | 70 ++++++++++ src/functionObjects/field/add/add.H | 129 ++++++++++++++++++ src/functionObjects/field/add/addTemplates.C | 47 +++++++ .../field/fieldsExpression/fieldsExpression.C | 17 ++- .../field/fieldsExpression/fieldsExpression.H | 28 +++- .../fieldsExpressionTemplates.C | 82 +++++++++++ src/functionObjects/field/subtract/subtract.C | 20 +-- src/functionObjects/field/subtract/subtract.H | 9 +- .../field/subtract/subtractTemplates.C | 38 +----- 10 files changed, 377 insertions(+), 64 deletions(-) create mode 100644 src/functionObjects/field/add/add.C create mode 100644 src/functionObjects/field/add/add.H create mode 100644 src/functionObjects/field/add/addTemplates.C create mode 100644 src/functionObjects/field/fieldsExpression/fieldsExpressionTemplates.C diff --git a/src/functionObjects/field/Make/files b/src/functionObjects/field/Make/files index 284ebd4e3..de5be1877 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 000000000..88be04e7a --- /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 000000000..1198c2b0d --- /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 000000000..13b81af0e --- /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 bf61140b1..482c1aa93 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 000000000..b9b3be113 --- /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 592ba5941..8405fd11f 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 31fae7285..6fb4aa7fd 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 6368f29e4..07aee1e98 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; - } -} - - // ************************************************************************* //