diff --git a/src/functionObjects/utilities/Make/files b/src/functionObjects/utilities/Make/files index e9bb23307d7c7dc8820fbb510e298696978b6e18..240c0a24e9674b2c05da8f33aad70f5d71e75a5f 100644 --- a/src/functionObjects/utilities/Make/files +++ b/src/functionObjects/utilities/Make/files @@ -10,6 +10,8 @@ ensightWrite/ensightWriteUpdate.C vtkWrite/vtkWrite.C vtkWrite/vtkWriteUpdate.C +multiRegion/multiRegion.C + removeRegisteredObject/removeRegisteredObject.C parProfiling/parProfiling.C diff --git a/src/functionObjects/utilities/multiRegion/multiRegion.C b/src/functionObjects/utilities/multiRegion/multiRegion.C new file mode 100644 index 0000000000000000000000000000000000000000..c09eefa5721487ab6b8c86071cd223d4f751a789 --- /dev/null +++ b/src/functionObjects/utilities/multiRegion/multiRegion.C @@ -0,0 +1,169 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 "multiRegion.H" +#include "fvMesh.H" +#include "timeControlFunctionObject.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace functionObjects +{ + defineTypeNameAndDebug(multiRegion, 0); + + addToRunTimeSelectionTable + ( + functionObject, + multiRegion, + dictionary + ); +} +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::functionObjects::multiRegion::multiRegion +( + const word& name, + const Time& runTime, + const dictionary& dict +) +: + timeFunctionObject(name, runTime) +{ + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::functionObjects::multiRegion::read(const dictionary& dict) +{ + if (functionObject::read(dict)) + { + Info<< type() << ' ' << name() << ':' << nl; + + wordRes regionMatcher; + + const bool matchAny = + !dict.readIfPresent<wordRes>("regions", regionMatcher); + + const dictionary& functionDict = dict.subDict("function"); + + const wordList allRegions(time_.sortedNames<fvMesh>()); + functions_.resize(allRegions.size()); + + const bool needsTimeControl = timeControl::entriesPresent(functionDict); + + label functioni = 0; + for (const word& regionName : allRegions) + { + if (matchAny || regionMatcher.match(regionName)) + { + const word localName(IOobject::scopedName(name(), regionName)); + + dictionary regionDict(functionDict); + regionDict.add("region", regionName); + + if (needsTimeControl) + { + functions_.set + ( + functioni, + new timeControl(localName, time_, regionDict) + ); + } + else + { + functions_.set + ( + functioni, + functionObject::New(localName, time_, regionDict) + ); + } + + ++functioni; + } + } + + functions_.resize(functioni); + + if (functions_.empty()) + { + WarningInFunction + << "No regions applied" + << endl; + + return false; + } + + Info<< " Spawned additional object(s):" << nl; + for (const auto& f : functions_) + { + Info<< " " << f.name() << nl; + } + + Info<< endl; + + return true; + } + + return false; +} + + +bool Foam::functionObjects::multiRegion::execute() +{ + bool result = true; + + for (auto& f : functions_) + { + result = f.execute() && result; + } + + return result; +} + + +bool Foam::functionObjects::multiRegion::write() +{ + bool result = true; + + for (auto& f : functions_) + { + result = f.write() && result; + } + + return result; +} + + +// ************************************************************************* // diff --git a/src/functionObjects/utilities/multiRegion/multiRegion.H b/src/functionObjects/utilities/multiRegion/multiRegion.H new file mode 100644 index 0000000000000000000000000000000000000000..41f9c19464f2d86f4260fb8d59e9e81f0bd97e3f --- /dev/null +++ b/src/functionObjects/utilities/multiRegion/multiRegion.H @@ -0,0 +1,158 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 OpenCFD Ltd. +------------------------------------------------------------------------------- +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::functionObjects::multiRegion + +Group + grpUtilitiesFunctionObjects + +Description + Wrapper that clones the supplied function object for each region. + + Simplifies the setup of identical post-processing requirements for + multi-region cases. + Applies the supplied function to all regions by default. + +Usage + Minimal example by using \c system/controlDict.functions: + \verbatim + multiRegion + { + // Mandatory entries + type multiRegion; + libs (utilityFunctionObjects); + + function + { + // Actual object specification + type fieldMinMax; + libs (fieldFunctionObjects); + fields (<field1> ... <fieldN>); + } + + // Optional entries + regions (region1 region2); + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Deflt + type | Type name: multiRegion | word | yes | - + libs | Library name: utilityFunctionObjects | word | yes | - + function | Function object sub-dictionary | dict | yes | - + regions | List of region names | wordList | no | all + \endtable + +See also + - Foam::functionObject + +SourceFiles + multiRegion.C + +\*---------------------------------------------------------------------------*/ + +#ifndef functionObjects_multiRegion_H +#define functionObjects_multiRegion_H + +#include "timeFunctionObject.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace functionObjects +{ + +/*---------------------------------------------------------------------------*\ + Class multiRegion Declaration +\*---------------------------------------------------------------------------*/ + +class multiRegion +: + public functionObjects::timeFunctionObject +{ +protected: + + // Protected Data + + //- List of cloned objects (1 per region) + PtrList<functionObject> functions_; + + + // Protected Member Functions + + //- No copy construct + multiRegion(const multiRegion&) = delete; + + //- No copy assignment + void operator=(const multiRegion&) = delete; + + +public: + + //- Runtime type information + TypeName("multiRegion"); + + + // Constructors + + //- Construct from Time and dictionary + multiRegion + ( + const word& name, + const Time& runTime, + const dictionary& dict + ); + + + //- Destructor + virtual ~multiRegion() = default; + + + // Member Functions + + //- Read the controls + virtual bool read(const dictionary& dict); + + //- Execute, currently does nothing + virtual bool execute(); + + //- Write the multiRegion + virtual bool write(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace functionObjects +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/system/controlDict b/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/system/controlDict index 80636743d50c50a9e55fe02bed42266a030c54ff..4483c1eec35d3e129334a7c5c88ac8dc7f16c776 100644 --- a/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/system/controlDict +++ b/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/system/controlDict @@ -1,7 +1,7 @@ /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: v2012 | +| \\ / O peration | Version: v2106 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ @@ -44,5 +44,24 @@ timePrecision 6; runTimeModifiable true; +functions +{ + multiRegion + { + type multiRegion; + libs (utilityFunctionObjects); + + // regions ( ".*Air" ); + + function + { + // Actual object specification + type fieldMinMax; + libs (fieldFunctionObjects); + fields (T); + } + } +} + // ************************************************************************* //