From 4a810cbe9d3b3501552cce4b89881362c9664640 Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Tue, 23 Jul 2019 11:48:14 +0100 Subject: [PATCH] SpalartAllmaras[I][D]DES: Named temporary fields and added optional caching for LESRegion The various temporary fields used to create the nuTilda equation sources are now internal fields to avoid unnecessary evaluation of boundary conditions, lowering storage and reducing CPU time, particularly when running in parallel. These temporary fields are now named with respect to the model so that they can be cached conveniently and written as required. The LESRegion field can now be contructed on demand if it is requested as a cached temporary field and written out for diagnostics if needed, for example in the tutorials/incompressible/pisoFoam/LES/motorBike tutorial: cacheTemporaryObjects ( SpalartAllmarasDDES:LESRegion ); functions { writeCachedObjects { type writeObjects; libs ("libutilityFunctionObjects.so"); writeControl writeTime; writeOption anyWrite; objects ( SpalartAllmarasDDES:LESRegion ); } #include "cuttingPlane" #include "streamLines" #include "forceCoeffs" } --- .../SpalartAllmarasDDES/SpalartAllmarasDDES.C | 54 +++-- .../SpalartAllmarasDDES/SpalartAllmarasDDES.H | 18 +- .../SpalartAllmarasDES/SpalartAllmarasDES.C | 191 ++++++++++-------- .../SpalartAllmarasDES/SpalartAllmarasDES.H | 56 ++--- .../SpalartAllmarasIDDES.C | 112 ++++++---- .../SpalartAllmarasIDDES.H | 33 ++- .../LES/motorBike/lesFiles/controlDict | 19 ++ 7 files changed, 286 insertions(+), 197 deletions(-) diff --git a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDDES/SpalartAllmarasDDES.C b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDDES/SpalartAllmarasDDES.C index 3f35ffbbaf..b32de5347d 100644 --- a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDDES/SpalartAllmarasDDES.C +++ b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDDES/SpalartAllmarasDDES.C @@ -35,44 +35,38 @@ namespace LESModels // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // template -tmp SpalartAllmarasDDES::rd +tmp SpalartAllmarasDDES::rd ( - const volScalarField& magGradU + const volScalarField::Internal& magGradU ) const { - tmp tr + return volScalarField::Internal::New ( - volScalarField::New + modelName("rd"), + min ( - modelName("rd"), - min - ( - this->nuEff() - /( - max - ( - magGradU, - dimensionedScalar(magGradU.dimensions(), small) - ) - *sqr(this->kappa_*this->y_) - ), - scalar(10) - ) + this->nuEff()() + /( + max + ( + magGradU, + dimensionedScalar(magGradU.dimensions(), small) + ) + *sqr(this->kappa_*this->y_()) + ), + scalar(10) ) ); - tr.ref().boundaryFieldRef() == 0.0; - - return tr; } template -tmp SpalartAllmarasDDES::fd +tmp SpalartAllmarasDDES::fd ( - const volScalarField& magGradU + const volScalarField::Internal& magGradU ) const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("fd"), 1 - tanh(pow3(8*rd(magGradU))) @@ -83,14 +77,14 @@ tmp SpalartAllmarasDDES::fd // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // template -tmp SpalartAllmarasDDES::dTilda +tmp SpalartAllmarasDDES::dTilda ( - const volScalarField& chi, - const volScalarField& fv1, - const volTensorField& gradU + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1, + const volTensorField::Internal& gradU ) const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("dTilda"), max @@ -99,7 +93,7 @@ tmp SpalartAllmarasDDES::dTilda - fd(mag(gradU)) *max ( - this->y_ - this->CDES_*this->delta(), + this->y_() - this->CDES_*this->delta()(), dimensionedScalar(dimLength, 0) ), dimensionedScalar(dimLength, small) diff --git a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDDES/SpalartAllmarasDDES.H b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDDES/SpalartAllmarasDDES.H index d04a6c0dd8..18b98d44a9 100644 --- a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDDES/SpalartAllmarasDDES.H +++ b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDDES/SpalartAllmarasDDES.H @@ -65,9 +65,15 @@ class SpalartAllmarasDDES { // Private Member Functions - tmp fd(const volScalarField& magGradU) const; + tmp fd + ( + const volScalarField::Internal& magGradU + ) const; - tmp rd(const volScalarField& magGradU) const; + tmp rd + ( + const volScalarField::Internal& magGradU + ) const; protected: @@ -77,11 +83,11 @@ protected: using IOobject::modelName; //- Length scale - virtual tmp dTilda + virtual tmp dTilda ( - const volScalarField& chi, - const volScalarField& fv1, - const volTensorField& gradU + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1, + const volTensorField::Internal& gradU ) const; diff --git a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDES/SpalartAllmarasDES.C b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDES/SpalartAllmarasDES.C index dd132b5e65..5b901d1575 100644 --- a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDES/SpalartAllmarasDES.C +++ b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDES/SpalartAllmarasDES.C @@ -40,7 +40,8 @@ tmp SpalartAllmarasDES::chi() const { return volScalarField::New ( - modelName("chi"), nuTilda_/this->nu() + modelName("chi"), + nuTilda_/this->nu() ); } @@ -61,13 +62,13 @@ tmp SpalartAllmarasDES::fv1 template -tmp SpalartAllmarasDES::fv2 +tmp SpalartAllmarasDES::fv2 ( - const volScalarField& chi, - const volScalarField& fv1 + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1 ) const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("fv2"), 1.0 - chi/(1.0 + chi*fv1) @@ -76,26 +77,12 @@ tmp SpalartAllmarasDES::fv2 template -tmp SpalartAllmarasDES::S +tmp SpalartAllmarasDES::Omega ( - const volTensorField& gradU + const volTensorField::Internal& gradU ) const { - return volScalarField::New - ( - modelName("S"), - sqrt(2.0)*mag(symm(gradU)) - ); -} - - -template -tmp SpalartAllmarasDES::Omega -( - const volTensorField& gradU -) const -{ - return volScalarField::New + return volScalarField::Internal::New ( modelName("Omega"), sqrt(2.0)*mag(skew(gradU)) @@ -104,21 +91,21 @@ tmp SpalartAllmarasDES::Omega template -tmp SpalartAllmarasDES::Stilda +tmp SpalartAllmarasDES::Stilda ( - const volScalarField& chi, - const volScalarField& fv1, - const volScalarField& Omega, - const volScalarField& dTilda + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1, + const volScalarField::Internal& Omega, + const volScalarField::Internal& dTilda ) const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("Stilda"), max ( Omega - + fv2(chi, fv1)*nuTilda_/sqr(kappa_*dTilda), + + fv2(chi, fv1)*nuTilda_()/sqr(kappa_*dTilda), Cs_*Omega ) ); @@ -126,50 +113,44 @@ tmp SpalartAllmarasDES::Stilda template -tmp SpalartAllmarasDES::r +tmp SpalartAllmarasDES::r ( - const volScalarField& nur, - const volScalarField& Omega, - const volScalarField& dTilda + const volScalarField::Internal& nur, + const volScalarField::Internal& Omega, + const volScalarField::Internal& dTilda ) const { - tmp tr + return volScalarField::Internal::New ( - volScalarField::New + modelName("r"), + min ( - modelName("r"), - min - ( - nur - /( - max - ( - Omega, - dimensionedScalar(Omega.dimensions(), small) - ) - *sqr(kappa_*dTilda) - ), - scalar(10) - ) + nur + /( + max + ( + Omega, + dimensionedScalar(Omega.dimensions(), small) + ) + *sqr(kappa_*dTilda) + ), + scalar(10) ) ); - tr.ref().boundaryFieldRef() == 0.0; - - return tr; } template -tmp SpalartAllmarasDES::fw +tmp SpalartAllmarasDES::fw ( - const volScalarField& Omega, - const volScalarField& dTilda + const volScalarField::Internal& Omega, + const volScalarField::Internal& dTilda ) const { - const volScalarField r(this->r(nuTilda_, Omega, dTilda)); - const volScalarField g(r + Cw2_*(pow6(r) - r)); + const volScalarField::Internal r(this->r(nuTilda_, Omega, dTilda)); + const volScalarField::Internal g(modelName("g"), r + Cw2_*(pow6(r) - r)); - return volScalarField::New + return volScalarField::Internal::New ( modelName("fw"), g*pow((1 + pow6(Cw3_))/(pow6(g) + pow6(Cw3_)), 1.0/6.0) @@ -178,23 +159,35 @@ tmp SpalartAllmarasDES::fw template -tmp SpalartAllmarasDES::dTilda +tmp SpalartAllmarasDES::dTilda ( - const volScalarField& chi, - const volScalarField& fv1, - const volTensorField& gradU + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1, + const volTensorField::Internal& gradU ) const { - tmp tdTilda + return volScalarField::Internal::New ( - volScalarField::New - ( - modelName("dTilda"), - CDES_*this->delta() - ) + modelName("dTilda"), + min(CDES_*this->delta()(), y_) ); - min(tdTilda.ref().ref(), tdTilda(), y_); - return tdTilda; +} + + +template +void SpalartAllmarasDES::cacheLESRegion +( + const volScalarField::Internal& dTilda +) const +{ + if (this->mesh_.cacheTemporaryObject(modelName("LESRegion"))) + { + volScalarField::Internal::New + ( + modelName("LESRegion"), + neg(dTilda - y_()) + ); + } } @@ -407,26 +400,43 @@ tmp SpalartAllmarasDES::k() const { const volScalarField chi(this->chi()); const volScalarField fv1(this->fv1(chi)); - return sqr(this->nut()/ck_/dTilda(chi, fv1, fvc::grad(this->U_))); -} + volScalarField dTildaExtrapolated + ( + IOobject + ( + "dTildaExtrapolated", + this->mesh_.time().timeName(), + this->mesh_ + ), + this->mesh_, + dimLength, + zeroGradientFvPatchScalarField::typeName + ); + dTildaExtrapolated.ref() = dTilda(chi, fv1, fvc::grad(this->U_)); + dTildaExtrapolated.correctBoundaryConditions(); -template -tmp SpalartAllmarasDES::LESRegion() const -{ - const volScalarField chi(this->chi()); - const volScalarField fv1(this->fv1(chi)); - - tmp tLESRegion + tmp tk ( volScalarField::New ( - "DES::LESRegion", - neg(dTilda(chi, fv1, fvc::grad(this->U_)) - y_) + modelName("k"), + sqr(this->nut()/ck_/dTildaExtrapolated) ) ); - return tLESRegion; + const fvPatchList& patches = this->mesh_.boundary(); + volScalarField::Boundary& kBf = tk.ref().boundaryFieldRef(); + + forAll(patches, patchi) + { + if (isA(patches[patchi])) + { + kBf[patchi] = 0; + } + } + + return tk; } @@ -451,9 +461,13 @@ void SpalartAllmarasDES::correct() const volScalarField fv1(this->fv1(chi)); tmp tgradU = fvc::grad(U); - const volScalarField Omega(this->Omega(tgradU())); - const volScalarField dTilda(this->dTilda(chi, fv1, tgradU())); - const volScalarField Stilda(this->Stilda(chi, fv1, Omega, dTilda)); + const volScalarField::Internal Omega(this->Omega(tgradU())); + const volScalarField::Internal dTilda(this->dTilda(chi, fv1, tgradU())); + const volScalarField::Internal Stilda + ( + this->Stilda(chi, fv1, Omega, dTilda) + ); + tgradU.clear(); tmp nuTildaEqn ( @@ -462,10 +476,10 @@ void SpalartAllmarasDES::correct() - fvm::laplacian(alpha*rho*DnuTildaEff(), nuTilda_) - Cb2_/sigmaNut_*alpha*rho*magSqr(fvc::grad(nuTilda_)) == - Cb1_*alpha*rho*Stilda*nuTilda_ + Cb1_*alpha()*rho()*Stilda*nuTilda_() - fvm::Sp ( - Cw1_*alpha*rho*fw(Stilda, dTilda)*nuTilda_/sqr(dTilda), + Cw1_*alpha()*rho()*fw(Stilda, dTilda)*nuTilda_()/sqr(dTilda), nuTilda_ ) + fvOptions(alpha, rho, nuTilda_) @@ -479,6 +493,9 @@ void SpalartAllmarasDES::correct() nuTilda_.correctBoundaryConditions(); correctNut(); + + // Optionally cache the LESRegion field + cacheLESRegion(dTilda); } diff --git a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDES/SpalartAllmarasDES.H b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDES/SpalartAllmarasDES.H index ce78a4f248..746b66bbf7 100644 --- a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDES/SpalartAllmarasDES.H +++ b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasDES/SpalartAllmarasDES.H @@ -99,43 +99,50 @@ protected: tmp fv1(const volScalarField& chi) const; - tmp fv2 + tmp fv2 ( - const volScalarField& chi, - const volScalarField& fv1 + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1 ) const; - tmp S(const volTensorField& gradU) const; - - tmp Omega(const volTensorField& gradU) const; - - tmp Stilda + tmp Omega ( - const volScalarField& chi, - const volScalarField& fv1, - const volScalarField& Omega, - const volScalarField& dTilda + const volTensorField::Internal& gradU ) const; - tmp r + tmp Stilda ( - const volScalarField& nur, - const volScalarField& Omega, - const volScalarField& dTilda + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1, + const volScalarField::Internal& Omega, + const volScalarField::Internal& dTilda ) const; - tmp fw + tmp r ( - const volScalarField& Omega, - const volScalarField& dTilda + const volScalarField::Internal& nur, + const volScalarField::Internal& Omega, + const volScalarField::Internal& dTilda + ) const; + + tmp fw + ( + const volScalarField::Internal& Omega, + const volScalarField::Internal& dTilda ) const; //- Length scale - virtual tmp dTilda + virtual tmp dTilda ( - const volScalarField& chi, - const volScalarField& fv1, - const volTensorField& gradU + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1, + const volTensorField::Internal& gradU + ) const; + + //- Cache the LES region indicator field + virtual void cacheLESRegion + ( + const volScalarField::Internal& dTilda ) const; void correctNut(const volScalarField& fv1); @@ -193,9 +200,6 @@ public: return nuTilda_; } - //- Return the LES field indicator - virtual tmp LESRegion() const; - //- Correct nuTilda and related properties virtual void correct(); diff --git a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C index 711ca8122f..fc495c6fe5 100644 --- a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C +++ b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C @@ -35,28 +35,24 @@ namespace LESModels // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // template -tmp SpalartAllmarasIDDES::alpha() const +tmp +SpalartAllmarasIDDES::IDDESalpha() const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("alpha"), - max - ( - 0.25 - - this->y_/static_cast(IDDESDelta_.hmax()), - scalar(-5) - ) + max(0.25 - this->y_()/IDDESDelta_.hmax(), scalar(-5)) ); } template -tmp SpalartAllmarasIDDES::ft +tmp SpalartAllmarasIDDES::ft ( - const volScalarField& magGradU + const volScalarField::Internal& magGradU ) const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("ft"), tanh(pow3(sqr(ct_)*rd(this->nut_, magGradU))) @@ -65,12 +61,12 @@ tmp SpalartAllmarasIDDES::ft template -tmp SpalartAllmarasIDDES::fl +tmp SpalartAllmarasIDDES::fl ( - const volScalarField& magGradU + const volScalarField::Internal& magGradU ) const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("fl"), tanh(pow(sqr(cl_)*rd(this->nu(), magGradU), 10)) @@ -79,13 +75,13 @@ tmp SpalartAllmarasIDDES::fl template -tmp SpalartAllmarasIDDES::rd +tmp SpalartAllmarasIDDES::rd ( - const volScalarField& nur, - const volScalarField& magGradU + const volScalarField::Internal& nur, + const volScalarField::Internal& magGradU ) const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("rd"), min @@ -96,7 +92,7 @@ tmp SpalartAllmarasIDDES::rd ( magGradU, dimensionedScalar(magGradU.dimensions(), small) - )*sqr(this->kappa_*this->y_) + )*sqr(this->kappa_*this->y_()) ), scalar(10) ) @@ -105,12 +101,12 @@ tmp SpalartAllmarasIDDES::rd template -tmp SpalartAllmarasIDDES::fd +tmp SpalartAllmarasIDDES::fd ( - const volScalarField& magGradU + const volScalarField::Internal& magGradU ) const { - return volScalarField::New + return volScalarField::Internal::New ( modelName("fd"), 1 - tanh(pow3(8*rd(this->nuEff(), magGradU))) @@ -121,28 +117,70 @@ tmp SpalartAllmarasIDDES::fd // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // template -tmp SpalartAllmarasIDDES::dTilda +tmp +SpalartAllmarasIDDES::dTilda ( - const volScalarField& chi, - const volScalarField& fv1, - const volTensorField& gradU + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1, + const volTensorField::Internal& gradU ) const { - const volScalarField alpha(this->alpha()); - const volScalarField expTerm(exp(sqr(alpha))); - const volScalarField magGradU(mag(gradU)); + const volScalarField::Internal alpha(IDDESalpha()); - tmp fHill = - 2*(pos0(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0)); + const volScalarField::Internal expTerm + ( + modelName("expTerm"), + exp(sqr(alpha)) + ); - tmp fStep = min(2*pow(expTerm, -9.0), scalar(1)); - const volScalarField fHyb(max(1 - fd(magGradU), fStep)); - tmp fAmp = 1 - max(ft(magGradU), fl(magGradU)); - tmp fRestore = max(fHill - 1, scalar(0))*fAmp; + const volScalarField::Internal magGradU(modelName("magGradU"), mag(gradU)); + + tmp fHill + ( + volScalarField::Internal::New + ( + modelName("fHill"), + 2*(pos0(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0)) + ) + ); + + tmp fStep + ( + volScalarField::Internal::New + ( + modelName("fStep"), + min(2*pow(expTerm, -9.0), scalar(1)) + ) + ); + + const volScalarField::Internal fHyb + ( + modelName("fHyb"), + max(1 - fd(magGradU), fStep) + ); + + tmp fAmp + ( + volScalarField::Internal::New + ( + modelName("fAmp"), + 1 - max(ft(magGradU), fl(magGradU)) + ) + ); + + tmp fRestore + ( + volScalarField::Internal::New + ( + modelName("fRestore"), + max(fHill - 1, scalar(0))*fAmp + ) + ); // IGNORING ft2 terms - const volScalarField Psi + const volScalarField::Internal Psi ( + modelName("Psi"), sqrt ( min @@ -157,7 +195,7 @@ tmp SpalartAllmarasIDDES::dTilda ) ); - return volScalarField::New + return volScalarField::Internal::New ( modelName("dTilda"), max diff --git a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H index e9a1281985..67e4ff650a 100644 --- a/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H +++ b/src/TurbulenceModels/turbulenceModels/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H @@ -78,18 +78,29 @@ class SpalartAllmarasIDDES // Private Member Functions - tmp alpha() const; - tmp ft(const volScalarField& magGradU) const; - tmp fl(const volScalarField& magGradU) const; + tmp IDDESalpha() const; - tmp rd + tmp ft ( - const volScalarField& nur, - const volScalarField& magGradU + const volScalarField::Internal& magGradU + ) const; + + tmp fl + ( + const volScalarField::Internal& magGradU + ) const; + + tmp rd + ( + const volScalarField::Internal& nur, + const volScalarField::Internal& magGradU ) const; //- Delay function - tmp fd(const volScalarField& magGradU) const; + tmp fd + ( + const volScalarField::Internal& magGradU + ) const; protected: @@ -99,11 +110,11 @@ protected: using IOobject::modelName; //- Length scale - virtual tmp dTilda + virtual tmp dTilda ( - const volScalarField& chi, - const volScalarField& fv1, - const volTensorField& gradU + const volScalarField::Internal& chi, + const volScalarField::Internal& fv1, + const volTensorField::Internal& gradU ) const; diff --git a/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/controlDict b/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/controlDict index db67f245b2..fde7eb1ddf 100644 --- a/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/controlDict +++ b/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/controlDict @@ -44,8 +44,27 @@ timePrecision 6; runTimeModifiable true; +cacheTemporaryObjects +( + SpalartAllmarasDDES:LESRegion +); + functions { + writeCachedObjects + { + type writeObjects; + libs ("libutilityFunctionObjects.so"); + + writeControl writeTime; + writeOption anyWrite; + + objects + ( + SpalartAllmarasDDES:LESRegion + ); + } + #include "cuttingPlane" #include "streamLines" #include "forceCoeffs"