From 72be4b372da170c73e892734d969a04f7ccb4e65 Mon Sep 17 00:00:00 2001 From: mattijs Date: Sat, 19 Dec 2015 12:14:22 +0000 Subject: [PATCH] CONTRIBUTION: Turbulence - updated SpalartAlmaras & kOmegaSST DES, DDES and IDDES Code supplied by CFD Software E+F GmbH --- .../schemes/DEShybrid/DEShybrid.H | 146 ++++++++++++++---- .../SpalartAllmarasDDES/SpalartAllmarasDDES.C | 45 ++++-- .../SpalartAllmarasDDES/SpalartAllmarasDDES.H | 7 +- .../SpalartAllmarasDES/SpalartAllmarasDES.C | 10 -- .../SpalartAllmarasDES/SpalartAllmarasDES.H | 2 - .../SpalartAllmarasIDDES.C | 131 ++++++++++------ .../SpalartAllmarasIDDES.H | 29 ++-- .../DES/kOmegaSSTDDES/kOmegaSSTDDES.C | 30 ++-- .../DES/kOmegaSSTDDES/kOmegaSSTDDES.H | 14 +- .../DES/kOmegaSSTDES/kOmegaSSTDES.C | 11 +- .../DES/kOmegaSSTDES/kOmegaSSTDES.H | 3 + .../DES/kOmegaSSTIDDES/kOmegaSSTIDDES.C | 72 +++++---- .../DES/kOmegaSSTIDDES/kOmegaSSTIDDES.H | 13 +- 13 files changed, 330 insertions(+), 183 deletions(-) diff --git a/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.H b/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.H index df2642e27e..d481d45b95 100644 --- a/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.H +++ b/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.H @@ -45,7 +45,7 @@ Description w_2 | scheme 2 weights \endvartable - Reference: + First published in: \verbatim A. Travin, M. Shur, M. Strelets, P. Spalart (2000). Physical and numerical upgrades in the detached-eddy simulation of @@ -54,6 +54,16 @@ Description Transition and Turbulent Flows, Munich, Germany \endverbatim + Original publication contained a typo for C_H3 constant. Corrected version + with minor changes for 2 lower limiters published in: + \verbatim + P. Spalart, M. Shur, M. Strelets, A. Travin (2012). + Sensitivity of Landing-Gear Noise Predictions by Large-Eddy + Simulation to Numerics and Resolution. + AIAA Paper 2012-1174, 50th AIAA Aerospace Sciences Meeting, + Nashville / TN, Jan. 2012 + \endverbatim + Example of the DEShybrid scheme specification using linear within the LES region and linearUpwind within the RAS region: \verbatim @@ -65,7 +75,9 @@ Description linear // scheme 1 linearUpwind grad(U) // scheme 2 0.65 // DES coefficient, typically = 0.65 - 10 // Reference time scale (Uref/Lref) + 30 // Reference velocity scale + 2 // Reference length scale + 0 // Minimum sigma limit (0-1) 1; // Maximum sigma limit (0-1) . . @@ -119,17 +131,22 @@ class DEShybrid //- DES Coefficient scalar CDES_; - //- Time scale coefficient [1/s] - dimensionedScalar invTau_; + //- Reference velocity scale [m/s] + dimensionedScalar U0_; - //- Maximum bound for sigma (limited to 1) + //- Reference length scale [m] + dimensionedScalar L0_; + + //- Minimum bound for sigma (0 <= sigmaMin <= 1) + scalar sigmaMin_; + + //- Maximum bound for sigma (0 <= sigmaMax <= 1) scalar sigmaMax_; - //- Lower limit for `B' coefficient - dimensionedScalar B0_; - - //- Small length scale to avoid division by zero - dimensionedScalar d0_; + //- constants of scheme + scalar CH1_; + scalar CH2_; + scalar CH3_; //- Disallow default bitwise copy construct DEShybrid(const DEShybrid&); @@ -152,31 +169,48 @@ class DEShybrid tmp gradU(fvc::grad(U)); const volScalarField S(sqrt(2.0)*mag(symm(gradU()))); const volScalarField Omega(sqrt(2.0)*mag(skew(gradU()))); - const volScalarField magSqrGradU(magSqr(gradU)); + const dimensionedScalar tau0_ = L0_/U0_; const volScalarField B ( - 0.5*Omega*max(S, Omega) - /max(0.5*magSqrGradU, B0_) + CH3_*Omega*max(S, Omega) + /max(0.5*(sqr(S)+sqr(Omega)), sqr(1.0e-3/tau0_)) ); const volScalarField K ( - max(Foam::sqrt(0.5*magSqrGradU), 0.1*invTau_) + max(Foam::sqrt(0.5*(sqr(S)+sqr(Omega))), 0.1/tau0_) ); + const volScalarField lTurb(Foam::sqrt(nuEff/(pow(0.09, 1.5)*K))); const volScalarField g(tanh(pow4(B))); const volScalarField A ( - max(scalar(0), CDES_*delta/max(lTurb*g, d0_) - 0.5) + CH2_*max(scalar(0), CDES_*delta/max(lTurb*g, 1.0e-15*L0_) - 0.5) ); - const surfaceScalarField Af(fvc::interpolate(A)); + + const volScalarField IOhybrid + ( + IOobject + ( + "DEShybridFactor", + this->mesh().time().timeName(), + this->mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + max(sigmaMax_*tanh(pow(A, CH1_)), sigmaMin_) + ); + if (this->mesh().time().outputTime()) + { + IOhybrid.write(); + } return tmp ( new surfaceScalarField ( vf.name() + "BlendingFactor", - max(sigmaMax_*tanh(pow3(Af)), scalar(0)) + fvc::interpolate(IOhybrid) ) ); } @@ -205,16 +239,43 @@ public: surfaceInterpolationScheme::New(mesh, is) ), CDES_(readScalar(is)), - invTau_("invTau", dimless/dimTime, readScalar(is)), + U0_("U0", dimLength/dimTime, readScalar(is)), + L0_("L0", dimLength, readScalar(is)), + sigmaMin_(readScalar(is)), sigmaMax_(readScalar(is)), - B0_("B0", dimless/sqr(dimTime), 1e-20), - d0_("d0", dimLength, SMALL) + CH1_(3.0), + CH2_(1.0), + CH3_(2.0) { - if (invTau_.value() <= 0) + if (U0_.value() <= 0) { FatalErrorInFunction - << "invTau coefficient must be greater than 0. " - << "Current value: " << invTau_ << exit(FatalError); + << "U0 coefficient must be greater than 0. " + << "Current value: " << U0_ << exit(FatalError); + } + if (L0_.value() <= 0) + { + FatalErrorInFunction + << "L0 coefficient must be greater than 0. " + << "Current value: " << L0_ << exit(FatalError); + } + if (sigmaMin_ < 0) + { + FatalErrorInFunction + << "sigmaMin coefficient must be greater than or equal to 0. " + << "Current value: " << sigmaMin_ << exit(FatalError); + } + if (sigmaMax_ < 0) + { + FatalErrorInFunction + << "sigmaMax coefficient must be greater than or equal to 0. " + << "Current value: " << sigmaMax_ << exit(FatalError); + } + if (sigmaMin_ > 1) + { + FatalErrorInFunction + << "sigmaMin coefficient must be less than or equal to 1. " + << "Current value: " << sigmaMin_ << exit(FatalError); } if (sigmaMax_ > 1) { @@ -242,16 +303,43 @@ public: surfaceInterpolationScheme::New(mesh, faceFlux, is) ), CDES_(readScalar(is)), - invTau_("invTau", dimless/dimTime, readScalar(is)), + U0_("U0", dimLength/dimTime, readScalar(is)), + L0_("L0", dimLength, readScalar(is)), + sigmaMin_(readScalar(is)), sigmaMax_(readScalar(is)), - B0_("B0", dimless/sqr(dimTime), 1e-20), - d0_("d0", dimLength, SMALL) + CH1_(3.0), + CH2_(1.0), + CH3_(2.0) { - if (invTau_.value() <= 0) + if (U0_.value() <= 0) { FatalErrorInFunction - << "invTau coefficient must be greater than 0. " - << "Current value: " << invTau_ << exit(FatalError); + << "U0 coefficient must be greater than 0. " + << "Current value: " << U0_ << exit(FatalError); + } + if (L0_.value() <= 0) + { + FatalErrorInFunction + << "L0 coefficient must be greater than 0. " + << "Current value: " << U0_ << exit(FatalError); + } + if (sigmaMin_ < 0) + { + FatalErrorInFunction + << "sigmaMin coefficient must be greater than or equal to 0. " + << "Current value: " << sigmaMin_ << exit(FatalError); + } + if (sigmaMax_ < 0) + { + FatalErrorInFunction + << "sigmaMax coefficient must be greater than or equal to 0. " + << "Current value: " << sigmaMax_ << exit(FatalError); + } + if (sigmaMin_ > 1) + { + FatalErrorInFunction + << "sigmaMin coefficient must be less than or equal to 1. " + << "Current value: " << sigmaMin_ << exit(FatalError); } if (sigmaMax_ > 1) { diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.C b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.C index 3339dd4ce5..2ef1428d79 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.C +++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.C @@ -46,12 +46,12 @@ tmp SpalartAllmarasDDES::rd ( this->nuEff() /( - max - ( - magGradU, - dimensionedScalar("SMALL", magGradU.dimensions(), SMALL) - ) - *sqr(this->kappa_*this->y_) + max + ( + magGradU, + dimensionedScalar("SMALL", magGradU.dimensions(), SMALL) + ) + *sqr(this->kappa_*this->y_) ), scalar(10) ) @@ -68,7 +68,7 @@ tmp SpalartAllmarasDDES::fd const volScalarField& magGradU ) const { - return 1 - tanh(pow(fdFactor_*rd(magGradU), fdExponent_)); + return 1 - tanh(pow(Cd1_*rd(magGradU), Cd2_)); } @@ -82,13 +82,16 @@ tmp SpalartAllmarasDDES::dTilda const volTensorField& gradU ) const { + const volScalarField lRAS(this->y_); + const volScalarField lLES(this->psi(chi, fv1)*this->CDES_*this->delta()); + return max ( - this->y_ + lRAS - fd(mag(gradU)) *max ( - this->y_ - this->psi(chi, fv1)*this->CDES_*this->delta(), + lRAS - lLES, dimensionedScalar("zero", dimLength, 0) ), dimensionedScalar("small", dimLength, SMALL) @@ -119,27 +122,34 @@ SpalartAllmarasDDES::SpalartAllmarasDDES alphaRhoPhi, phi, transport, - propertiesName + propertiesName, + type ), - fdFactor_ + + Cd1_ ( dimensioned::lookupOrAddToDict ( - "fdFactor", + "Cd1", this->coeffDict_, 8 ) ), - fdExponent_ + Cd2_ ( dimensioned::lookupOrAddToDict ( - "fdExponent", + "Cd2", this->coeffDict_, 3 ) ) -{} +{ + if (type == typeName) + { + this->printCoeffs(type); + } +} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // @@ -149,8 +159,9 @@ bool SpalartAllmarasDDES::read() { if (SpalartAllmarasDES::read()) { - fdFactor_.readIfPresent(this->coeffDict()); - fdExponent_.readIfPresent(this->coeffDict()); + Cd1_.readIfPresent(this->coeffDict()); + Cd2_.readIfPresent(this->coeffDict()); + return true; } else diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.H b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.H index 80fb8c3cef..9ba263f13e 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.H +++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.H @@ -81,11 +81,10 @@ protected: // Protected data - //- fd function pre-factor - dimensionedScalar fdFactor_; + // Model coefficients - //- fd function exponent - dimensionedScalar fdExponent_; + dimensionedScalar Cd1_; + dimensionedScalar Cd2_; // Protected Member Functions diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.C b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.C index a803522f8c..f5dce6ab61 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.C +++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.C @@ -73,16 +73,6 @@ tmp SpalartAllmarasDES::ft2 } -template -tmp SpalartAllmarasDES::S -( - const volTensorField& gradU -) const -{ - return sqrt(2.0)*mag(symm(gradU)); -} - - template tmp SpalartAllmarasDES::Omega ( diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.H b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.H index 2ffbbbd714..ea2aacc3a3 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.H +++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.H @@ -133,8 +133,6 @@ protected: tmp ft2(const volScalarField& chi) const; - tmp S(const volTensorField& gradU) const; - tmp Omega(const volTensorField& gradU) const; tmp Stilda diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C index 40ea5c9e6a..ea6e934268 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C +++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C @@ -34,15 +34,24 @@ namespace LESModels // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // +template +const IDDESDelta& SpalartAllmarasIDDES::setDelta() const +{ + if (!isA(this->delta_())) + { + FatalErrorInFunction + << "The delta function must be set to a " << IDDESDelta::typeName + << " -based model" << exit(FatalError); + } + + return refCast(this->delta_()); +} + + template tmp SpalartAllmarasIDDES::alpha() const { - // Equation 9 (plus limits) - return max - ( - 0.25 - this->y_/static_cast(IDDESDelta_.hmax()), - scalar(-5) - ); + return max(0.25 - this->y_/IDDESDelta_.hmax(), scalar(-5)); } @@ -52,8 +61,7 @@ tmp SpalartAllmarasIDDES::ft const volScalarField& magGradU ) const { - // Equation 13 - return tanh(pow3(sqr(ct_)*rd(this->nut_, magGradU))); + return tanh(pow3(sqr(Ct_)*rd(this->nut_, magGradU))); } @@ -63,8 +71,7 @@ tmp SpalartAllmarasIDDES::fl const volScalarField& magGradU ) const { - // Equation 13 - return tanh(pow(sqr(cl_)*rd(this->nu(), magGradU), 10)); + return tanh(pow(sqr(Cl_)*rd(this->nu(), magGradU), 10)); } @@ -75,18 +82,25 @@ tmp SpalartAllmarasIDDES::rd const volScalarField& magGradU ) const { - return min + tmp tr ( - nur - /( - max - ( - magGradU, - dimensionedScalar("SMALL", magGradU.dimensions(), SMALL) - )*sqr(this->kappa_*this->y_) - ), - scalar(10) + min + ( + nur + /( + max + ( + magGradU, + dimensionedScalar("SMALL", magGradU.dimensions(), SMALL) + ) + *sqr(this->kappa_*this->y_) + ), + scalar(10) + ) ); + tr().boundaryField() == 0.0; + + return tr; } @@ -98,8 +112,7 @@ tmp SpalartAllmarasIDDES::fdt const volScalarField& magGradU ) const { - // Related to equation 16 - return 1 - tanh(pow3(8*rd(this->nuEff(), magGradU))); + return 1 - tanh(pow(Cdt1_*rd(this->nut_, magGradU), Cdt2_)); } @@ -111,31 +124,38 @@ tmp SpalartAllmarasIDDES::dTilda const volTensorField& gradU ) const { + const volScalarField magGradU(mag(gradU)); + const volScalarField psi(this->psi(chi, fv1)); + + const volScalarField lRAS(this->y_); + const volScalarField lLES(psi*this->CDES_*this->delta()); + const volScalarField alpha(this->alpha()); const volScalarField expTerm(exp(sqr(alpha))); - const volScalarField magGradU(mag(gradU)); - // Equation 9 tmp fB = min(2*pow(expTerm, -9.0), scalar(1)); - - // Equation 11 tmp fe1 = 2*(pos(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0)); - - // Equation 12 tmp fe2 = 1 - max(ft(magGradU), fl(magGradU)); - - // Equation 10 - const volScalarField psi(this->psi(chi, fv1)); tmp fe = max(fe1 - 1, scalar(0))*psi*fe2; - // Equation 16 const volScalarField fdTilda(max(1 - fdt(magGradU), fB)); - // Equation 17 (plus limits) + // Simplified formulation from Gritskevich et al. paper (2011) where fe = 0 + /* return max ( - fdTilda*(1 + fe)*this->y_ + (1 - fdTilda)*psi*this->CDES_*this->delta(), + fdTilda*lRAS + + (1 - fdTilda)*lLES, + dimensionedScalar("SMALL", dimLength, SMALL) + ); + */ + + // Original formulation from Shur et al. paper (2008) + return max + ( + fdTilda*(1 + fe)*lRAS + + (1 - fdTilda)*lLES, dimensionedScalar("SMALL", dimLength, SMALL) ); } @@ -164,37 +184,53 @@ SpalartAllmarasIDDES::SpalartAllmarasIDDES alphaRhoPhi, phi, transport, - propertiesName + propertiesName, + type ), - fwStar_ + + Cdt1_ ( dimensioned::lookupOrAddToDict ( - "fwStar", + "Cdt1", this->coeffDict_, - 0.424 + 8 ) ), - cl_ + Cdt2_ ( dimensioned::lookupOrAddToDict ( - "cl", + "Cdt2", + this->coeffDict_, + 3 + ) + ), + Cl_ + ( + dimensioned::lookupOrAddToDict + ( + "Cl", this->coeffDict_, 3.55 ) ), - ct_ + Ct_ ( dimensioned::lookupOrAddToDict ( - "ct", + "Ct", this->coeffDict_, 1.63 ) ), - IDDESDelta_(refCast(this->delta_())) -{} + IDDESDelta_(setDelta()) +{ + if (type == typeName) + { + this->printCoeffs(type); + } +} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // @@ -204,9 +240,10 @@ bool SpalartAllmarasIDDES::read() { if (SpalartAllmarasDES::read()) { - fwStar_.readIfPresent(this->coeffDict()); - cl_.readIfPresent(this->coeffDict()); - ct_.readIfPresent(this->coeffDict()); + Cdt1_.readIfPresent(this->coeffDict()); + Cdt2_.readIfPresent(this->coeffDict()); + Cl_.readIfPresent(this->coeffDict()); + Ct_.readIfPresent(this->coeffDict()); return true; } diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H index f146bf1dbf..1c61c84f0f 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H +++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H @@ -66,21 +66,11 @@ class SpalartAllmarasIDDES : public SpalartAllmarasDES { - // Private data - - // Model constants - - dimensionedScalar fwStar_; - dimensionedScalar cl_; - dimensionedScalar ct_; - - // Fields - - const IDDESDelta& IDDESDelta_; - - // Private Member Functions + //- Check that the supplied delta is an IDDESDelta + const IDDESDelta& setDelta() const; + tmp alpha() const; tmp ft(const volScalarField& magGradU) const; tmp fl(const volScalarField& magGradU) const; @@ -101,6 +91,19 @@ class SpalartAllmarasIDDES protected: + // Protected data + + // Model coefficients + + dimensionedScalar Cdt1_; + dimensionedScalar Cdt2_; + dimensionedScalar Cl_; + dimensionedScalar Ct_; + + // Fields + + const IDDESDelta& IDDESDelta_; + // Protected Member Functions //- Length scale diff --git a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDDES/kOmegaSSTDDES.C b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDDES/kOmegaSSTDDES.C index 9256590ddb..b4f46dfd1d 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDDES/kOmegaSSTDDES.C +++ b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDDES/kOmegaSSTDDES.C @@ -37,7 +37,6 @@ namespace LESModels template tmp kOmegaSSTDDES::rd ( - const volScalarField& nur, const volScalarField& magGradU ) const { @@ -45,7 +44,7 @@ tmp kOmegaSSTDDES::rd ( min ( - nur + this->nuEff() /( max ( @@ -69,7 +68,7 @@ tmp kOmegaSSTDDES::fd const volScalarField& magGradU ) const { - return 1 - tanh(pow(cd1_*rd(this->nuEff(), magGradU), cd2_)); + return 1 - tanh(pow(Cd1_*rd(magGradU), Cd2_)); } @@ -87,9 +86,18 @@ tmp kOmegaSSTDDES::dTilda const volScalarField lRAS(sqrt(k)/(this->betaStar_*omega)); const volScalarField lLES(CDES*this->delta()); - const dimensionedScalar d0("SMALL", dimLength, SMALL); - return max(lRAS - fd(magGradU)*max(lRAS - lLES, d0), d0); + return max + ( + lRAS + - fd(magGradU) + *max + ( + lRAS - lLES, + dimensionedScalar("zero", dimLength, 0) + ), + dimensionedScalar("small", dimLength, SMALL) + ); } @@ -120,20 +128,20 @@ kOmegaSSTDDES::kOmegaSSTDDES type ), - cd1_ + Cd1_ ( dimensioned::lookupOrAddToDict ( - "cd1", + "Cd1", this->coeffDict_, 20 ) ), - cd2_ + Cd2_ ( dimensioned::lookupOrAddToDict ( - "cd2", + "Cd2", this->coeffDict_, 3 ) @@ -153,8 +161,8 @@ bool kOmegaSSTDDES::read() { if (kOmegaSSTDES::read()) { - cd1_.readIfPresent(this->coeffDict()); - cd2_.readIfPresent(this->coeffDict()); + Cd1_.readIfPresent(this->coeffDict()); + Cd2_.readIfPresent(this->coeffDict()); return true; } diff --git a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDDES/kOmegaSSTDDES.H b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDDES/kOmegaSSTDDES.H index ebc3e3ab12..cae207217a 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDDES/kOmegaSSTDDES.H +++ b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDDES/kOmegaSSTDDES.H @@ -66,14 +66,10 @@ class kOmegaSSTDDES { // Private Member Functions - tmp rd - ( - const volScalarField& nur, - const volScalarField& magGradU - ) const; - tmp fd(const volScalarField& magGradU) const; + tmp rd(const volScalarField& magGradU) const; + // Disallow default bitwise copy construct and assignment kOmegaSSTDDES(const kOmegaSSTDDES&); kOmegaSSTDDES& operator=(const kOmegaSSTDDES&); @@ -85,8 +81,8 @@ protected: // Model coefficients - dimensionedScalar cd1_; - dimensionedScalar cd2_; + dimensionedScalar Cd1_; + dimensionedScalar Cd2_; // Protected Member Functions @@ -144,11 +140,13 @@ public: } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #ifdef NoRepository # include "kOmegaSSTDDES.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDES/kOmegaSSTDES.C b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDES/kOmegaSSTDES.C index ef36104006..0251f96e2a 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDES/kOmegaSSTDES.C +++ b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDES/kOmegaSSTDES.C @@ -62,12 +62,7 @@ tmp kOmegaSSTDES::dTilda const volScalarField& k = this->k_; const volScalarField& omega = this->omega_; - return - min - ( - CDES*this->delta(), - sqrt(k + this->kMin_)/(this->betaStar_*omega) - ); + return min(CDES*this->delta(), sqrt(k)/(this->betaStar_*omega)); } @@ -113,7 +108,7 @@ kOmegaSSTDES::kOmegaSSTDES ( "CDESkom", this->coeffDict_, - 0.78 + 0.82 ) ), CDESkeps_ @@ -122,7 +117,7 @@ kOmegaSSTDES::kOmegaSSTDES ( "CDESkeps", this->coeffDict_, - 0.61 + 0.60 ) ) { diff --git a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDES/kOmegaSSTDES.H b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDES/kOmegaSSTDES.H index 219c041c04..a7648d0dd1 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDES/kOmegaSSTDES.H +++ b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTDES/kOmegaSSTDES.H @@ -37,6 +37,9 @@ Description 39th AIAA Aerospace Sciences Meeting and Exhibit, Reno, NV \endverbatim + Note: DES constants CDES_kom and CDES_keps have been re-calibrated to + OpenFOAM numerics via decaying isotropic turbulence test case + SourceFiles kOmegaSSTDES.C diff --git a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTIDDES/kOmegaSSTIDDES.C b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTIDDES/kOmegaSSTIDDES.C index 797f42407b..df888a7ebe 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTIDDES/kOmegaSSTIDDES.C +++ b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTIDDES/kOmegaSSTIDDES.C @@ -61,7 +61,7 @@ tmp kOmegaSSTIDDES::ft const volScalarField& magGradU ) const { - return tanh(pow3(sqr(ct_)*rd(this->nut_, magGradU))); + return tanh(pow3(sqr(Ct_)*rd(this->nut_, magGradU))); } @@ -71,7 +71,7 @@ tmp kOmegaSSTIDDES::fl const volScalarField& magGradU ) const { - return tanh(pow(sqr(cl_)*rd(this->nu(), magGradU), 10)); + return tanh(pow(sqr(Cl_)*rd(this->nu(), magGradU), 10)); } @@ -104,18 +104,18 @@ tmp kOmegaSSTIDDES::rd } +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + template -tmp kOmegaSSTIDDES::fd +tmp kOmegaSSTIDDES::fdt ( const volScalarField& magGradU ) const { - return 1 - tanh(pow(cdt1_*rd(this->nuEff(), magGradU), cdt2_)); + return 1 - tanh(pow(Cdt1_*rd(this->nut_, magGradU), Cdt2_)); } -// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // - template tmp kOmegaSSTIDDES::dTilda ( @@ -128,22 +128,35 @@ tmp kOmegaSSTIDDES::dTilda const volScalarField lRAS(sqrt(k)/(this->betaStar_*omega)); const volScalarField lLES(CDES*this->delta()); - const dimensionedScalar d0("SMALL", dimLength, SMALL); const volScalarField alpha(this->alpha()); const volScalarField expTerm(exp(sqr(alpha))); - tmp fStep = min(2*pow(expTerm, -9.0), scalar(1)); - const volScalarField fHyb(max(1 - fd(magGradU), fStep)); - // Simplified version where fRestore = 0 - // return max(d0, fHyb*lRAS + (1 - fHyb)*lLES); - - // Original form - tmp fHill = + tmp fB = min(2*pow(expTerm, -9.0), scalar(1)); + tmp fe1 = 2*(pos(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0)); - tmp fAmp = 1 - max(ft(magGradU), fl(magGradU)); - tmp fRestore = max(fHill - 1, scalar(0))*fAmp; - return max(d0, fHyb*(1 + fRestore)*lRAS + (1 - fHyb)*lLES); + tmp fe2 = 1 - max(ft(magGradU), fl(magGradU)); + tmp fe = max(fe1 - 1, scalar(0))*fe2; + + const volScalarField fdTilda(max(1 - fdt(magGradU), fB)); + + // Simplified formulation from Gritskevich et al. paper (2011) where fe = 0 + /* + return max + ( + fdTilda*lRAS + + (1 - fdTilda)*lLES, + dimensionedScalar("SMALL", dimLength, SMALL) + ); + */ + + // Original formulation from Shur et al. paper (2008) + return max + ( + fdTilda*(1 + fe)*lRAS + + (1 - fdTilda)*lLES, + dimensionedScalar("SMALL", dimLength, SMALL) + ); } @@ -173,38 +186,39 @@ kOmegaSSTIDDES::kOmegaSSTIDDES propertiesName, type ), - cdt1_ + + Cdt1_ ( dimensioned::lookupOrAddToDict ( - "cdt1", + "Cdt1", this->coeffDict_, 20 ) ), - cdt2_ + Cdt2_ ( dimensioned::lookupOrAddToDict ( - "cdt2", + "Cdt2", this->coeffDict_, 3 ) ), - cl_ + Cl_ ( dimensioned::lookupOrAddToDict ( - "cl", + "Cl", this->coeffDict_, 5 ) ), - ct_ + Ct_ ( dimensioned::lookupOrAddToDict ( - "ct", + "Ct", this->coeffDict_, 1.87 ) @@ -225,10 +239,10 @@ bool kOmegaSSTIDDES::read() { if (kOmegaSSTDES::read()) { - cdt1_.readIfPresent(this->coeffDict()); - cdt2_.readIfPresent(this->coeffDict()); - cl_.readIfPresent(this->coeffDict()); - ct_.readIfPresent(this->coeffDict()); + Cdt1_.readIfPresent(this->coeffDict()); + Cdt2_.readIfPresent(this->coeffDict()); + Cl_.readIfPresent(this->coeffDict()); + Ct_.readIfPresent(this->coeffDict()); return true; } diff --git a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTIDDES/kOmegaSSTIDDES.H b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTIDDES/kOmegaSSTIDDES.H index fe5e50a304..898776c835 100644 --- a/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTIDDES/kOmegaSSTIDDES.H +++ b/src/TurbulenceModels/turbulenceModels/DES/kOmegaSSTIDDES/kOmegaSSTIDDES.H @@ -81,7 +81,7 @@ class kOmegaSSTIDDES ) const; //- Delay function - tmp fd(const volScalarField& maggradU) const; + tmp fdt(const volScalarField& magGradU) const; // Disallow default bitwise copy construct and assignment kOmegaSSTIDDES(const kOmegaSSTIDDES&); @@ -94,15 +94,16 @@ protected: // Model coefficients - dimensionedScalar cdt1_; - dimensionedScalar cdt2_; - dimensionedScalar cl_; - dimensionedScalar ct_; + dimensionedScalar Cdt1_; + dimensionedScalar Cdt2_; + dimensionedScalar Cl_; + dimensionedScalar Ct_; // Fields const IDDESDelta& IDDESDelta_; + // Protected Member Functions //- Length scale virtual tmp dTilda @@ -157,11 +158,13 @@ public: } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #ifdef NoRepository # include "kOmegaSSTIDDES.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* //