From 188c303a2790080b74cd40f5d3af5a2f9d1e8f45 Mon Sep 17 00:00:00 2001 From: Kutalmis Bercin Date: Fri, 5 May 2023 15:07:33 +0100 Subject: [PATCH] ENH: finiteArea: enable cache-gradient mechanism --- src/finiteArea/finiteArea/fac/facGrad.C | 37 ++---- .../gradSchemes/faGradScheme/faGradScheme.C | 111 +++++++++++++++++- .../gradSchemes/faGradScheme/faGradScheme.H | 51 ++++++-- .../gradSchemes/gaussFaGrad/gaussFaGrad.C | 49 ++++++-- .../gradSchemes/gaussFaGrad/gaussFaGrad.H | 27 ++++- .../leastSquaresFaGrad/leastSquaresFaGrad.C | 13 +- .../leastSquaresFaGrad/leastSquaresFaGrad.H | 8 +- .../edgeLimitedFaGrad/edgeLimitedFaGrad.H | 10 +- .../edgeLimitedFaGrad/edgeLimitedFaGrads.C | 15 ++- .../faceLimitedFaGrad/faceLimitedFaGrad.H | 11 +- .../faceLimitedFaGrad/faceLimitedFaGrads.C | 15 ++- .../liquidFilmFoam/cylinder/system/faSolution | 6 + 12 files changed, 276 insertions(+), 77 deletions(-) diff --git a/src/finiteArea/finiteArea/fac/facGrad.C b/src/finiteArea/finiteArea/fac/facGrad.C index 54c829e883..4d833fd190 100644 --- a/src/finiteArea/finiteArea/fac/facGrad.C +++ b/src/finiteArea/finiteArea/fac/facGrad.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -31,6 +32,7 @@ License #include "facEdgeIntegrate.H" #include "faMesh.H" #include "faGradScheme.H" +#include "gaussFaGrad.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -57,20 +59,10 @@ grad const GeometricField& ssf ) { - const areaVectorField &n = ssf.mesh().faceAreaNormals(); - typedef typename outerProduct::type GradType; - - tmp> tgGrad = - fac::edgeIntegrate(ssf.mesh().Sf()*ssf); - - GeometricField& gGrad = tgGrad.ref(); - - gGrad -= n*(n & gGrad); - gGrad.correctBoundaryConditions(); - - return tgGrad; + return fa::gaussGrad::gradf(ssf, "grad(" + ssf.name() + ')'); } + template tmp < @@ -108,22 +100,11 @@ grad const word& name ) { - const areaVectorField &n = vf.mesh().faceAreaNormals(); - typedef typename outerProduct::type GradType; - - tmp> tgGrad = - fa::gradScheme::New - ( - vf.mesh(), - vf.mesh().gradScheme(name) - ).ref().grad(vf); - - GeometricField& gGrad = tgGrad.ref(); - - gGrad -= n*(n & gGrad); - gGrad.correctBoundaryConditions(); - - return tgGrad; + return fa::gradScheme::New + ( + vf.mesh(), + vf.mesh().gradScheme(name) + )().grad(vf, name); } diff --git a/src/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.C b/src/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.C index a5aef3b13f..597355f714 100644 --- a/src/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.C +++ b/src/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd - Copyright (C) 2019-2021 OpenCFD Ltd. + Copyright (C) 2019-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -28,6 +28,8 @@ License #include "fa.H" #include "HashTable.H" +#include "objectRegistry.H" +#include "solution.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -83,11 +85,112 @@ tmp> gradScheme::New } -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // template -gradScheme::~gradScheme() -{} +tmp +< + GeometricField + < + typename outerProduct::type, + faPatchField, + areaMesh + > +> +gradScheme::grad +( + const GeometricField& vsf, + const word& name +) const +{ + typedef typename outerProduct::type GradType; + typedef GeometricField GradFieldType; + + GradFieldType* pgGrad = + mesh().thisDb().template getObjectPtr(name); + + if (!this->mesh().cache(name)) // || this->mesh().changing() + { + // Delete any old occurrences to avoid double registration + if (pgGrad && pgGrad->ownedByRegistry()) + { + solution::cachePrintMessage("Deleting", name, vsf); + delete pgGrad; + } + + solution::cachePrintMessage("Calculating", name, vsf); + return calcGrad(vsf, name); + } + + + if (!pgGrad) + { + solution::cachePrintMessage("Calculating and caching", name, vsf); + + pgGrad = calcGrad(vsf, name).ptr(); + regIOobject::store(pgGrad); + } + else + { + if (pgGrad->upToDate(vsf)) + { + solution::cachePrintMessage("Reusing", name, vsf); + } + else + { + solution::cachePrintMessage("Updating", name, vsf); + delete pgGrad; + + pgGrad = calcGrad(vsf, name).ptr(); + regIOobject::store(pgGrad); + } + } + + return *pgGrad; +} + + +template +tmp +< + GeometricField + < + typename outerProduct::type, + faPatchField, + areaMesh + > +> +gradScheme::grad +( + const GeometricField& vsf +) const +{ + return grad(vsf, "grad(" + vsf.name() + ')'); +} + + +template +tmp +< + GeometricField + < + typename outerProduct::type, + faPatchField, + areaMesh + > +> +gradScheme::grad +( + const tmp>& tvsf +) const +{ + typedef typename outerProduct::type GradType; + typedef GeometricField GradFieldType; + + tmp tgrad = grad(tvsf()); + tvsf.clear(); + return tgrad; +} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.H b/src/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.H index 11696af03b..e6f2bac9c1 100644 --- a/src/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.H +++ b/src/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -113,26 +114,62 @@ public: //- Destructor - virtual ~gradScheme(); + virtual ~gradScheme() = default; // Member Functions //- Return mesh reference - const faMesh& mesh() const - { - return mesh_; - } + const faMesh& mesh() const { return mesh_; } + + //- Calculate and return the grad of the given field. + // Used by grad either to recalculate the cached gradient when it is + // out of date with respect to the field or when it is not cached. + virtual tmp + < + GeometricField + ::type, faPatchField, areaMesh> + > calcGrad + ( + const GeometricField&, + const word& name + ) const = 0; //- Calculate and return the grad of the given field - virtual tmp + //- which may have been cached + tmp + < + GeometricField + ::type, faPatchField, areaMesh> + > grad + ( + const GeometricField&, + const word& name + ) const; + + //- Calculate and return the grad of the given field + //- with the default name + //- which may have been cached + tmp < GeometricField ::type, faPatchField, areaMesh> > grad ( const GeometricField& - ) const = 0; + ) const; + + //- Calculate and return the grad of the given field + //- with the default name + //- which may have been cached + tmp + < + GeometricField + ::type, faPatchField, areaMesh> + > grad + ( + const tmp>& + ) const; }; diff --git a/src/finiteArea/finiteArea/gradSchemes/gaussFaGrad/gaussFaGrad.C b/src/finiteArea/finiteArea/gradSchemes/gaussFaGrad/gaussFaGrad.C index 294f521ac4..af88fa2cf9 100644 --- a/src/finiteArea/finiteArea/gradSchemes/gaussFaGrad/gaussFaGrad.C +++ b/src/finiteArea/finiteArea/gradSchemes/gaussFaGrad/gaussFaGrad.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -47,17 +48,52 @@ tmp < GeometricField < - typename outerProduct::type, faPatchField, areaMesh + typename outerProduct::type, + faPatchField, + areaMesh > > -gaussGrad::grad +gaussGrad::gradf ( - const GeometricField& vsf + const GeometricField& ssf, + const word& name +) +{ + const areaVectorField &n = ssf.mesh().faceAreaNormals(); + typedef typename outerProduct::type GradType; + + tmp> tgGrad = + fac::edgeIntegrate(ssf.mesh().Sf()*ssf); + + GeometricField& gGrad = tgGrad.ref(); + + gGrad -= n*(n & gGrad); + gGrad.correctBoundaryConditions(); + + return tgGrad; +} + + +template +tmp +< + GeometricField + < + typename outerProduct::type, + faPatchField, + areaMesh + > +> +gaussGrad::calcGrad +( + const GeometricField& vsf, + const word& name ) const { typedef typename outerProduct::type GradType; + typedef GeometricField GradFieldType; - tmp> tgGrad + tmp tgGrad ( fac::edgeIntegrate ( @@ -65,12 +101,11 @@ gaussGrad::grad *tinterpScheme_().interpolate(vsf) ) ); - - GeometricField& gGrad = tgGrad.ref(); + GradFieldType& gGrad = tgGrad.ref(); gGrad.correctBoundaryConditions(); + gGrad.rename(name); - gGrad.rename("grad(" + vsf.name() + ')'); correctBoundaryConditions(vsf, gGrad); return tgGrad; diff --git a/src/finiteArea/finiteArea/gradSchemes/gaussFaGrad/gaussFaGrad.H b/src/finiteArea/finiteArea/gradSchemes/gaussFaGrad/gaussFaGrad.H index 84303d3fa5..f0348ffdda 100644 --- a/src/finiteArea/finiteArea/gradSchemes/gaussFaGrad/gaussFaGrad.H +++ b/src/finiteArea/finiteArea/gradSchemes/gaussFaGrad/gaussFaGrad.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -62,8 +63,9 @@ class gaussGrad : public fa::gradScheme { - // Private data + // Private Data + //- Interpolation scheme tmp> tinterpScheme_; @@ -118,17 +120,32 @@ public: // Member Functions - //- Return the gradient of the given field calculated - // using Gauss' theorem on the interpolated field + //- Return the gradient of the given field + //- calculated using Gauss' theorem on the given surface field + static tmp < GeometricField ::type, faPatchField, areaMesh> - > grad + > gradf ( - const GeometricField& + const GeometricField&, + const word& name + ); + + //- Return the gradient of the given field to the + //- gradScheme::grad for optional caching + virtual tmp + < + GeometricField + ::type, faPatchField, areaMesh> + > calcGrad + ( + const GeometricField& vsf, + const word& name ) const; + //- Correct the boundary values of the gradient using the patchField // snGrad functions static void correctBoundaryConditions diff --git a/src/finiteArea/finiteArea/gradSchemes/leastSquaresFaGrad/leastSquaresFaGrad.C b/src/finiteArea/finiteArea/gradSchemes/leastSquaresFaGrad/leastSquaresFaGrad.C index ef6c9d6ce9..ea983b8975 100644 --- a/src/finiteArea/finiteArea/gradSchemes/leastSquaresFaGrad/leastSquaresFaGrad.C +++ b/src/finiteArea/finiteArea/gradSchemes/leastSquaresFaGrad/leastSquaresFaGrad.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -45,18 +46,20 @@ namespace fa { // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - template tmp < GeometricField < - typename outerProduct::type, faPatchField, areaMesh + typename outerProduct::type, + faPatchField, + areaMesh > > -leastSquaresFaGrad::grad +leastSquaresFaGrad::calcGrad ( - const GeometricField& vsf + const GeometricField& vsf, + const word& name ) const { typedef typename outerProduct::type GradType; @@ -69,7 +72,7 @@ leastSquaresFaGrad::grad ( IOobject ( - "grad(" + vsf.name() + ')', + name, vsf.instance(), vsf.db(), IOobject::NO_READ, diff --git a/src/finiteArea/finiteArea/gradSchemes/leastSquaresFaGrad/leastSquaresFaGrad.H b/src/finiteArea/finiteArea/gradSchemes/leastSquaresFaGrad/leastSquaresFaGrad.H index 6651c73004..1e3e518f76 100644 --- a/src/finiteArea/finiteArea/gradSchemes/leastSquaresFaGrad/leastSquaresFaGrad.H +++ b/src/finiteArea/finiteArea/gradSchemes/leastSquaresFaGrad/leastSquaresFaGrad.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -93,13 +94,16 @@ public: // Member Functions + //- Return the gradient of the given field to the + //- gradScheme::grad for optional caching virtual tmp < GeometricField ::type, faPatchField, areaMesh> - > grad + > calcGrad ( - const GeometricField& + const GeometricField& vsf, + const word& name ) const; }; diff --git a/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/edgeLimitedFaGrad/edgeLimitedFaGrad.H b/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/edgeLimitedFaGrad/edgeLimitedFaGrad.H index 8705ecafa5..1d4ca927fd 100644 --- a/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/edgeLimitedFaGrad/edgeLimitedFaGrad.H +++ b/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/edgeLimitedFaGrad/edgeLimitedFaGrad.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -116,13 +117,16 @@ public: // Member Functions - tmp + //- Return the gradient of the given field to the + //- gradScheme::grad for optional caching + virtual tmp < GeometricField ::type, faPatchField, areaMesh> - > grad + > calcGrad ( - const GeometricField& + const GeometricField& vsf, + const word& name ) const; }; diff --git a/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/edgeLimitedFaGrad/edgeLimitedFaGrads.C b/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/edgeLimitedFaGrad/edgeLimitedFaGrads.C index aa6cf862f9..d86270a326 100644 --- a/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/edgeLimitedFaGrad/edgeLimitedFaGrads.C +++ b/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/edgeLimitedFaGrad/edgeLimitedFaGrads.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -72,14 +73,15 @@ inline void edgeLimitedGrad::limitEdge // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // template<> -tmp edgeLimitedGrad::grad +tmp edgeLimitedGrad::calcGrad ( - const areaScalarField& vsf + const areaScalarField& vsf, + const word& name ) const { const faMesh& mesh = vsf.mesh(); - tmp tGrad = basicGradScheme_().grad(vsf); + tmp tGrad = basicGradScheme_().calcGrad(vsf, name); if (k_ < SMALL) { @@ -206,14 +208,15 @@ tmp edgeLimitedGrad::grad template<> -tmp edgeLimitedGrad::grad +tmp edgeLimitedGrad::calcGrad ( - const areaVectorField& vvf + const areaVectorField& vvf, + const word& name ) const { const faMesh& mesh = vvf.mesh(); - tmp tGrad = basicGradScheme_().grad(vvf); + tmp tGrad = basicGradScheme_().grad(vvf, name); if (k_ < SMALL) { diff --git a/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/faceLimitedFaGrad/faceLimitedFaGrad.H b/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/faceLimitedFaGrad/faceLimitedFaGrad.H index a8a0bcbe96..16f5033264 100644 --- a/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/faceLimitedFaGrad/faceLimitedFaGrad.H +++ b/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/faceLimitedFaGrad/faceLimitedFaGrad.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -118,14 +119,16 @@ public: const Type& extrapolate ); - - tmp + //- Return the gradient of the given field to the + //- gradScheme::grad for optional caching + virtual tmp < GeometricField ::type, faPatchField, areaMesh> - > grad + > calcGrad ( - const GeometricField& + const GeometricField& vsf, + const word& name ) const; }; diff --git a/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/faceLimitedFaGrad/faceLimitedFaGrads.C b/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/faceLimitedFaGrad/faceLimitedFaGrads.C index 38bd277111..c32dda42fe 100644 --- a/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/faceLimitedFaGrad/faceLimitedFaGrads.C +++ b/src/finiteArea/finiteArea/gradSchemes/limitedGradSchemes/faceLimitedFaGrad/faceLimitedFaGrads.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -94,14 +95,15 @@ inline void faceLimitedGrad::limitEdge // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // template<> -tmp faceLimitedGrad::grad +tmp faceLimitedGrad::calcGrad ( - const areaScalarField& vsf + const areaScalarField& vsf, + const word& name ) const { const faMesh& mesh = vsf.mesh(); - tmp tGrad = basicGradScheme_().grad(vsf); + tmp tGrad = basicGradScheme_().calcGrad(vsf, name); if (k_ < SMALL) { @@ -243,14 +245,15 @@ tmp faceLimitedGrad::grad template<> -tmp faceLimitedGrad::grad +tmp faceLimitedGrad::calcGrad ( - const areaVectorField& vsf + const areaVectorField& vsf, + const word& name ) const { const faMesh& mesh = vsf.mesh(); - tmp tGrad = basicGradScheme_().grad(vsf); + tmp tGrad = basicGradScheme_().grad(vsf, name); if (k_ < SMALL) { diff --git a/tutorials/finiteArea/liquidFilmFoam/cylinder/system/faSolution b/tutorials/finiteArea/liquidFilmFoam/cylinder/system/faSolution index d097b9ba26..94ba9eddd5 100644 --- a/tutorials/finiteArea/liquidFilmFoam/cylinder/system/faSolution +++ b/tutorials/finiteArea/liquidFilmFoam/cylinder/system/faSolution @@ -44,5 +44,11 @@ relaxationFactors Us 0.5; } +cache +{ + grad(h); + grad(Us); +} + // ************************************************************************* //