From 22e4829795f27e2712e1d519dc133cc27cec5257 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Wed, 24 Apr 2019 12:02:23 +0200 Subject: [PATCH] ENH: simplify access and caching logic for gradScheme (#1276) --- .../gradSchemes/gradScheme/gradScheme.C | 90 ++++++++----------- 1 file changed, 36 insertions(+), 54 deletions(-) diff --git a/src/finiteVolume/finiteVolume/gradSchemes/gradScheme/gradScheme.C b/src/finiteVolume/finiteVolume/gradSchemes/gradScheme/gradScheme.C index a99e6e278f..eae83bb014 100644 --- a/src/finiteVolume/finiteVolume/gradSchemes/gradScheme/gradScheme.C +++ b/src/finiteVolume/finiteVolume/gradSchemes/gradScheme/gradScheme.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2010, 2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) 2011-2016 OpenFOAM Foundation @@ -91,67 +91,49 @@ Foam::fv::gradScheme::grad typedef typename outerProduct::type GradType; typedef GeometricField GradFieldType; - if (!this->mesh().changing() && this->mesh().cache(name)) + GradFieldType* pgGrad = + mesh().objectRegistry::template getObjectPtr(name); + + if (!this->mesh().cache(name) || this->mesh().changing()) { - if (!mesh().objectRegistry::template foundObject(name)) - { - solution::cachePrintMessage("Calculating and caching", name, vsf); - tmp tgGrad = calcGrad(vsf, name); - regIOobject::store(tgGrad.ptr()); - } - - solution::cachePrintMessage("Retrieving", name, vsf); - GradFieldType& gGrad = - mesh().objectRegistry::template lookupObjectRef - ( - name - ); - - if (gGrad.upToDate(vsf)) - { - return gGrad; - } - else + // Delete any old occurrences to avoid double registration + if (pgGrad && pgGrad->ownedByRegistry()) { solution::cachePrintMessage("Deleting", name, vsf); - gGrad.release(); - delete &gGrad; - - solution::cachePrintMessage("Recalculating", name, vsf); - tmp tgGrad = calcGrad(vsf, name); - - solution::cachePrintMessage("Storing", name, vsf); - regIOobject::store(tgGrad.ptr()); - GradFieldType& gGrad = - mesh().objectRegistry::template lookupObjectRef - ( - name - ); - - return gGrad; - } - } - else - { - if (mesh().objectRegistry::template foundObject(name)) - { - GradFieldType& gGrad = - mesh().objectRegistry::template lookupObjectRef - ( - name - ); - - if (gGrad.ownedByRegistry()) - { - solution::cachePrintMessage("Deleting", name, vsf); - gGrad.release(); - delete &gGrad; - } + pgGrad->release(); + 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); + pgGrad->release(); + delete pgGrad; + + pgGrad = calcGrad(vsf, name).ptr(); + regIOobject::store(pgGrad); + } + } + + return *pgGrad; }