From 5f654bb996ebee7cbf4f0ae135f7171d1e11f82b Mon Sep 17 00:00:00 2001 From: andy Date: Fri, 11 Oct 2013 14:49:05 +0100 Subject: [PATCH] ENH: Added optional caching of limiter field --- .../LimitedScheme/LimitedScheme.C | 105 ++++++++++++++---- .../LimitedScheme/LimitedScheme.H | 11 +- 2 files changed, 90 insertions(+), 26 deletions(-) diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.C b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.C index 0ac2a3932a..5471da9006 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.C +++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -28,33 +28,17 @@ License #include "fvcGrad.H" #include "coupledFvPatchFields.H" -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // template class LimitFunc> -Foam::tmp -Foam::LimitedScheme::limiter +void Foam::LimitedScheme::calcLimiter ( - const GeometricField& phi + const GeometricField& phi, + surfaceScalarField& limiterField ) const { const fvMesh& mesh = this->mesh(); - tmp tLimiter - ( - new surfaceScalarField - ( - IOobject - ( - type() + "Limiter(" + phi.name() + ')', - mesh.time().timeName(), - mesh - ), - mesh, - dimless - ) - ); - surfaceScalarField& lim = tLimiter(); - tmp > tlPhi = LimitFunc()(phi); @@ -73,7 +57,7 @@ Foam::LimitedScheme::limiter const vectorField& C = mesh.C(); - scalarField& pLim = lim.internalField(); + scalarField& pLim = limiterField.internalField(); forAll(pLim, face) { @@ -92,7 +76,8 @@ Foam::LimitedScheme::limiter ); } - surfaceScalarField::GeometricBoundaryField& bLim = lim.boundaryField(); + surfaceScalarField::GeometricBoundaryField& bLim = + limiterField.boundaryField(); forAll(bLim, patchi) { @@ -143,8 +128,80 @@ Foam::LimitedScheme::limiter pLim = 1.0; } } +} - return tLimiter; + +// * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * * // + +template class LimitFunc> +Foam::tmp +Foam::LimitedScheme::limiter +( + const GeometricField& phi +) const +{ + const fvMesh& mesh = this->mesh(); + + const word limiterFieldName(type() + "Limiter(" + phi.name() + ')'); + + if (this->mesh().cache("limiter")) + { + if (!mesh.foundObject(limiterFieldName)) + { + surfaceScalarField* limiterField + ( + new surfaceScalarField + ( + IOobject + ( + limiterFieldName, + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh, + dimless + ) + ); + + mesh.objectRegistry::store(limiterField); + } + + surfaceScalarField& limiterField = + const_cast + ( + mesh.lookupObject + ( + limiterFieldName + ) + ); + + calcLimiter(phi, limiterField); + + return limiterField; + } + else + { + tmp tlimiterField + ( + new surfaceScalarField + ( + IOobject + ( + limiterFieldName, + mesh.time().timeName(), + mesh + ), + mesh, + dimless + ) + ); + + calcLimiter(phi, tlimiterField()); + + return tlimiterField; + } } diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.H b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.H index 718a2e6a77..e41b280a12 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.H +++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -57,7 +57,7 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class LimitedScheme Declaration + Class LimitedScheme Declaration \*---------------------------------------------------------------------------*/ template class LimitFunc> @@ -68,6 +68,13 @@ class LimitedScheme { // Private Member Functions + //- Calculate the limiter + void calcLimiter + ( + const GeometricField& phi, + surfaceScalarField& limiterField + ) const; + //- Disallow default bitwise copy construct LimitedScheme(const LimitedScheme&);