CONTRIBUTION: Turbulence - updated SpalartAlmaras & kOmegaSST DES, DDES and IDDES

Code supplied by CFD Software E+F GmbH
This commit is contained in:
mattijs
2015-12-19 12:14:22 +00:00
parent 30a03e31f3
commit 72be4b372d
13 changed files with 330 additions and 183 deletions

View File

@ -45,7 +45,7 @@ Description
w_2 | scheme 2 weights w_2 | scheme 2 weights
\endvartable \endvartable
Reference: First published in:
\verbatim \verbatim
A. Travin, M. Shur, M. Strelets, P. Spalart (2000). A. Travin, M. Shur, M. Strelets, P. Spalart (2000).
Physical and numerical upgrades in the detached-eddy simulation of Physical and numerical upgrades in the detached-eddy simulation of
@ -54,6 +54,16 @@ Description
Transition and Turbulent Flows, Munich, Germany Transition and Turbulent Flows, Munich, Germany
\endverbatim \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 Example of the DEShybrid scheme specification using linear within the LES
region and linearUpwind within the RAS region: region and linearUpwind within the RAS region:
\verbatim \verbatim
@ -65,7 +75,9 @@ Description
linear // scheme 1 linear // scheme 1
linearUpwind grad(U) // scheme 2 linearUpwind grad(U) // scheme 2
0.65 // DES coefficient, typically = 0.65 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) 1; // Maximum sigma limit (0-1)
. .
. .
@ -119,17 +131,22 @@ class DEShybrid
//- DES Coefficient //- DES Coefficient
scalar CDES_; scalar CDES_;
//- Time scale coefficient [1/s] //- Reference velocity scale [m/s]
dimensionedScalar invTau_; 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_; scalar sigmaMax_;
//- Lower limit for `B' coefficient //- constants of scheme
dimensionedScalar B0_; scalar CH1_;
scalar CH2_;
//- Small length scale to avoid division by zero scalar CH3_;
dimensionedScalar d0_;
//- Disallow default bitwise copy construct //- Disallow default bitwise copy construct
DEShybrid(const DEShybrid&); DEShybrid(const DEShybrid&);
@ -152,31 +169,48 @@ class DEShybrid
tmp<volTensorField> gradU(fvc::grad(U)); tmp<volTensorField> gradU(fvc::grad(U));
const volScalarField S(sqrt(2.0)*mag(symm(gradU()))); const volScalarField S(sqrt(2.0)*mag(symm(gradU())));
const volScalarField Omega(sqrt(2.0)*mag(skew(gradU()))); const volScalarField Omega(sqrt(2.0)*mag(skew(gradU())));
const volScalarField magSqrGradU(magSqr(gradU)); const dimensionedScalar tau0_ = L0_/U0_;
const volScalarField B const volScalarField B
( (
0.5*Omega*max(S, Omega) CH3_*Omega*max(S, Omega)
/max(0.5*magSqrGradU, B0_) /max(0.5*(sqr(S)+sqr(Omega)), sqr(1.0e-3/tau0_))
); );
const volScalarField K 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 lTurb(Foam::sqrt(nuEff/(pow(0.09, 1.5)*K)));
const volScalarField g(tanh(pow4(B))); const volScalarField g(tanh(pow4(B)));
const volScalarField A 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<surfaceScalarField> return tmp<surfaceScalarField>
( (
new surfaceScalarField new surfaceScalarField
( (
vf.name() + "BlendingFactor", vf.name() + "BlendingFactor",
max(sigmaMax_*tanh(pow3(Af)), scalar(0)) fvc::interpolate(IOhybrid)
) )
); );
} }
@ -205,16 +239,43 @@ public:
surfaceInterpolationScheme<Type>::New(mesh, is) surfaceInterpolationScheme<Type>::New(mesh, is)
), ),
CDES_(readScalar(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)), sigmaMax_(readScalar(is)),
B0_("B0", dimless/sqr(dimTime), 1e-20), CH1_(3.0),
d0_("d0", dimLength, SMALL) CH2_(1.0),
CH3_(2.0)
{ {
if (invTau_.value() <= 0) if (U0_.value() <= 0)
{ {
FatalErrorInFunction FatalErrorInFunction
<< "invTau coefficient must be greater than 0. " << "U0 coefficient must be greater than 0. "
<< "Current value: " << invTau_ << exit(FatalError); << "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) if (sigmaMax_ > 1)
{ {
@ -242,16 +303,43 @@ public:
surfaceInterpolationScheme<Type>::New(mesh, faceFlux, is) surfaceInterpolationScheme<Type>::New(mesh, faceFlux, is)
), ),
CDES_(readScalar(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)), sigmaMax_(readScalar(is)),
B0_("B0", dimless/sqr(dimTime), 1e-20), CH1_(3.0),
d0_("d0", dimLength, SMALL) CH2_(1.0),
CH3_(2.0)
{ {
if (invTau_.value() <= 0) if (U0_.value() <= 0)
{ {
FatalErrorInFunction FatalErrorInFunction
<< "invTau coefficient must be greater than 0. " << "U0 coefficient must be greater than 0. "
<< "Current value: " << invTau_ << exit(FatalError); << "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) if (sigmaMax_ > 1)
{ {

View File

@ -68,7 +68,7 @@ tmp<volScalarField> SpalartAllmarasDDES<BasicTurbulenceModel>::fd
const volScalarField& magGradU const volScalarField& magGradU
) const ) const
{ {
return 1 - tanh(pow(fdFactor_*rd(magGradU), fdExponent_)); return 1 - tanh(pow(Cd1_*rd(magGradU), Cd2_));
} }
@ -82,13 +82,16 @@ tmp<volScalarField> SpalartAllmarasDDES<BasicTurbulenceModel>::dTilda
const volTensorField& gradU const volTensorField& gradU
) const ) const
{ {
const volScalarField lRAS(this->y_);
const volScalarField lLES(this->psi(chi, fv1)*this->CDES_*this->delta());
return max return max
( (
this->y_ lRAS
- fd(mag(gradU)) - fd(mag(gradU))
*max *max
( (
this->y_ - this->psi(chi, fv1)*this->CDES_*this->delta(), lRAS - lLES,
dimensionedScalar("zero", dimLength, 0) dimensionedScalar("zero", dimLength, 0)
), ),
dimensionedScalar("small", dimLength, SMALL) dimensionedScalar("small", dimLength, SMALL)
@ -119,27 +122,34 @@ SpalartAllmarasDDES<BasicTurbulenceModel>::SpalartAllmarasDDES
alphaRhoPhi, alphaRhoPhi,
phi, phi,
transport, transport,
propertiesName propertiesName,
type
), ),
fdFactor_
Cd1_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"fdFactor", "Cd1",
this->coeffDict_, this->coeffDict_,
8 8
) )
), ),
fdExponent_ Cd2_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"fdExponent", "Cd2",
this->coeffDict_, this->coeffDict_,
3 3
) )
) )
{} {
if (type == typeName)
{
this->printCoeffs(type);
}
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@ -149,8 +159,9 @@ bool SpalartAllmarasDDES<BasicTurbulenceModel>::read()
{ {
if (SpalartAllmarasDES<BasicTurbulenceModel>::read()) if (SpalartAllmarasDES<BasicTurbulenceModel>::read())
{ {
fdFactor_.readIfPresent(this->coeffDict()); Cd1_.readIfPresent(this->coeffDict());
fdExponent_.readIfPresent(this->coeffDict()); Cd2_.readIfPresent(this->coeffDict());
return true; return true;
} }
else else

View File

@ -81,11 +81,10 @@ protected:
// Protected data // Protected data
//- fd function pre-factor // Model coefficients
dimensionedScalar fdFactor_;
//- fd function exponent dimensionedScalar Cd1_;
dimensionedScalar fdExponent_; dimensionedScalar Cd2_;
// Protected Member Functions // Protected Member Functions

View File

@ -73,16 +73,6 @@ tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::ft2
} }
template<class BasicTurbulenceModel>
tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::S
(
const volTensorField& gradU
) const
{
return sqrt(2.0)*mag(symm(gradU));
}
template<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::Omega tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::Omega
( (

View File

@ -133,8 +133,6 @@ protected:
tmp<volScalarField> ft2(const volScalarField& chi) const; tmp<volScalarField> ft2(const volScalarField& chi) const;
tmp<volScalarField> S(const volTensorField& gradU) const;
tmp<volScalarField> Omega(const volTensorField& gradU) const; tmp<volScalarField> Omega(const volTensorField& gradU) const;
tmp<volScalarField> Stilda tmp<volScalarField> Stilda

View File

@ -34,15 +34,24 @@ namespace LESModels
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
template<class BasicTurbulenceModel>
const IDDESDelta& SpalartAllmarasIDDES<BasicTurbulenceModel>::setDelta() const
{
if (!isA<IDDESDelta>(this->delta_()))
{
FatalErrorInFunction
<< "The delta function must be set to a " << IDDESDelta::typeName
<< " -based model" << exit(FatalError);
}
return refCast<const IDDESDelta>(this->delta_());
}
template<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::alpha() const tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::alpha() const
{ {
// Equation 9 (plus limits) return max(0.25 - this->y_/IDDESDelta_.hmax(), scalar(-5));
return max
(
0.25 - this->y_/static_cast<const volScalarField&>(IDDESDelta_.hmax()),
scalar(-5)
);
} }
@ -52,8 +61,7 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::ft
const volScalarField& magGradU const volScalarField& magGradU
) const ) 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<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::fl
const volScalarField& magGradU const volScalarField& magGradU
) const ) const
{ {
// Equation 13 return tanh(pow(sqr(Cl_)*rd(this->nu(), magGradU), 10));
return tanh(pow(sqr(cl_)*rd(this->nu(), magGradU), 10));
} }
@ -75,7 +82,9 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::rd
const volScalarField& magGradU const volScalarField& magGradU
) const ) const
{ {
return min tmp<volScalarField> tr
(
min
( (
nur nur
/( /(
@ -83,10 +92,15 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::rd
( (
magGradU, magGradU,
dimensionedScalar("SMALL", magGradU.dimensions(), SMALL) dimensionedScalar("SMALL", magGradU.dimensions(), SMALL)
)*sqr(this->kappa_*this->y_) )
*sqr(this->kappa_*this->y_)
), ),
scalar(10) scalar(10)
)
); );
tr().boundaryField() == 0.0;
return tr;
} }
@ -98,8 +112,7 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::fdt
const volScalarField& magGradU const volScalarField& magGradU
) const ) const
{ {
// Related to equation 16 return 1 - tanh(pow(Cdt1_*rd(this->nut_, magGradU), Cdt2_));
return 1 - tanh(pow3(8*rd(this->nuEff(), magGradU)));
} }
@ -111,31 +124,38 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::dTilda
const volTensorField& gradU const volTensorField& gradU
) const ) 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 alpha(this->alpha());
const volScalarField expTerm(exp(sqr(alpha))); const volScalarField expTerm(exp(sqr(alpha)));
const volScalarField magGradU(mag(gradU));
// Equation 9
tmp<volScalarField> fB = min(2*pow(expTerm, -9.0), scalar(1)); tmp<volScalarField> fB = min(2*pow(expTerm, -9.0), scalar(1));
// Equation 11
tmp<volScalarField> fe1 = tmp<volScalarField> fe1 =
2*(pos(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0)); 2*(pos(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0));
// Equation 12
tmp<volScalarField> fe2 = 1 - max(ft(magGradU), fl(magGradU)); tmp<volScalarField> fe2 = 1 - max(ft(magGradU), fl(magGradU));
// Equation 10
const volScalarField psi(this->psi(chi, fv1));
tmp<volScalarField> fe = max(fe1 - 1, scalar(0))*psi*fe2; tmp<volScalarField> fe = max(fe1 - 1, scalar(0))*psi*fe2;
// Equation 16
const volScalarField fdTilda(max(1 - fdt(magGradU), fB)); 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 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) dimensionedScalar("SMALL", dimLength, SMALL)
); );
} }
@ -164,37 +184,53 @@ SpalartAllmarasIDDES<BasicTurbulenceModel>::SpalartAllmarasIDDES
alphaRhoPhi, alphaRhoPhi,
phi, phi,
transport, transport,
propertiesName propertiesName,
type
), ),
fwStar_
Cdt1_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"fwStar", "Cdt1",
this->coeffDict_, this->coeffDict_,
0.424 8
) )
), ),
cl_ Cdt2_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"cl", "Cdt2",
this->coeffDict_,
3
)
),
Cl_
(
dimensioned<scalar>::lookupOrAddToDict
(
"Cl",
this->coeffDict_, this->coeffDict_,
3.55 3.55
) )
), ),
ct_ Ct_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"ct", "Ct",
this->coeffDict_, this->coeffDict_,
1.63 1.63
) )
), ),
IDDESDelta_(refCast<IDDESDelta>(this->delta_())) IDDESDelta_(setDelta())
{} {
if (type == typeName)
{
this->printCoeffs(type);
}
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@ -204,9 +240,10 @@ bool SpalartAllmarasIDDES<BasicTurbulenceModel>::read()
{ {
if (SpalartAllmarasDES<BasicTurbulenceModel>::read()) if (SpalartAllmarasDES<BasicTurbulenceModel>::read())
{ {
fwStar_.readIfPresent(this->coeffDict()); Cdt1_.readIfPresent(this->coeffDict());
cl_.readIfPresent(this->coeffDict()); Cdt2_.readIfPresent(this->coeffDict());
ct_.readIfPresent(this->coeffDict()); Cl_.readIfPresent(this->coeffDict());
Ct_.readIfPresent(this->coeffDict());
return true; return true;
} }

View File

@ -66,21 +66,11 @@ class SpalartAllmarasIDDES
: :
public SpalartAllmarasDES<BasicTurbulenceModel> public SpalartAllmarasDES<BasicTurbulenceModel>
{ {
// Private data
// Model constants
dimensionedScalar fwStar_;
dimensionedScalar cl_;
dimensionedScalar ct_;
// Fields
const IDDESDelta& IDDESDelta_;
// Private Member Functions // Private Member Functions
//- Check that the supplied delta is an IDDESDelta
const IDDESDelta& setDelta() const;
tmp<volScalarField> alpha() const; tmp<volScalarField> alpha() const;
tmp<volScalarField> ft(const volScalarField& magGradU) const; tmp<volScalarField> ft(const volScalarField& magGradU) const;
tmp<volScalarField> fl(const volScalarField& magGradU) const; tmp<volScalarField> fl(const volScalarField& magGradU) const;
@ -101,6 +91,19 @@ class SpalartAllmarasIDDES
protected: protected:
// Protected data
// Model coefficients
dimensionedScalar Cdt1_;
dimensionedScalar Cdt2_;
dimensionedScalar Cl_;
dimensionedScalar Ct_;
// Fields
const IDDESDelta& IDDESDelta_;
// Protected Member Functions // Protected Member Functions
//- Length scale //- Length scale

View File

@ -37,7 +37,6 @@ namespace LESModels
template<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::rd tmp<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::rd
( (
const volScalarField& nur,
const volScalarField& magGradU const volScalarField& magGradU
) const ) const
{ {
@ -45,7 +44,7 @@ tmp<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::rd
( (
min min
( (
nur this->nuEff()
/( /(
max max
( (
@ -69,7 +68,7 @@ tmp<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::fd
const volScalarField& magGradU const volScalarField& magGradU
) const ) const
{ {
return 1 - tanh(pow(cd1_*rd(this->nuEff(), magGradU), cd2_)); return 1 - tanh(pow(Cd1_*rd(magGradU), Cd2_));
} }
@ -87,9 +86,18 @@ tmp<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::dTilda
const volScalarField lRAS(sqrt(k)/(this->betaStar_*omega)); const volScalarField lRAS(sqrt(k)/(this->betaStar_*omega));
const volScalarField lLES(CDES*this->delta()); 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<BasicTurbulenceModel>::kOmegaSSTDDES
type type
), ),
cd1_ Cd1_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"cd1", "Cd1",
this->coeffDict_, this->coeffDict_,
20 20
) )
), ),
cd2_ Cd2_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"cd2", "Cd2",
this->coeffDict_, this->coeffDict_,
3 3
) )
@ -153,8 +161,8 @@ bool kOmegaSSTDDES<BasicTurbulenceModel>::read()
{ {
if (kOmegaSSTDES<BasicTurbulenceModel>::read()) if (kOmegaSSTDES<BasicTurbulenceModel>::read())
{ {
cd1_.readIfPresent(this->coeffDict()); Cd1_.readIfPresent(this->coeffDict());
cd2_.readIfPresent(this->coeffDict()); Cd2_.readIfPresent(this->coeffDict());
return true; return true;
} }

View File

@ -66,14 +66,10 @@ class kOmegaSSTDDES
{ {
// Private Member Functions // Private Member Functions
tmp<volScalarField> rd
(
const volScalarField& nur,
const volScalarField& magGradU
) const;
tmp<volScalarField> fd(const volScalarField& magGradU) const; tmp<volScalarField> fd(const volScalarField& magGradU) const;
tmp<volScalarField> rd(const volScalarField& magGradU) const;
// Disallow default bitwise copy construct and assignment // Disallow default bitwise copy construct and assignment
kOmegaSSTDDES(const kOmegaSSTDDES&); kOmegaSSTDDES(const kOmegaSSTDDES&);
kOmegaSSTDDES& operator=(const kOmegaSSTDDES&); kOmegaSSTDDES& operator=(const kOmegaSSTDDES&);
@ -85,8 +81,8 @@ protected:
// Model coefficients // Model coefficients
dimensionedScalar cd1_; dimensionedScalar Cd1_;
dimensionedScalar cd2_; dimensionedScalar Cd2_;
// Protected Member Functions // Protected Member Functions
@ -144,11 +140,13 @@ public:
} // End namespace Foam } // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository #ifdef NoRepository
# include "kOmegaSSTDDES.C" # include "kOmegaSSTDDES.C"
#endif #endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif #endif
// ************************************************************************* // // ************************************************************************* //

View File

@ -62,12 +62,7 @@ tmp<volScalarField> kOmegaSSTDES<BasicTurbulenceModel>::dTilda
const volScalarField& k = this->k_; const volScalarField& k = this->k_;
const volScalarField& omega = this->omega_; const volScalarField& omega = this->omega_;
return return min(CDES*this->delta(), sqrt(k)/(this->betaStar_*omega));
min
(
CDES*this->delta(),
sqrt(k + this->kMin_)/(this->betaStar_*omega)
);
} }
@ -113,7 +108,7 @@ kOmegaSSTDES<BasicTurbulenceModel>::kOmegaSSTDES
( (
"CDESkom", "CDESkom",
this->coeffDict_, this->coeffDict_,
0.78 0.82
) )
), ),
CDESkeps_ CDESkeps_
@ -122,7 +117,7 @@ kOmegaSSTDES<BasicTurbulenceModel>::kOmegaSSTDES
( (
"CDESkeps", "CDESkeps",
this->coeffDict_, this->coeffDict_,
0.61 0.60
) )
) )
{ {

View File

@ -37,6 +37,9 @@ Description
39th AIAA Aerospace Sciences Meeting and Exhibit, Reno, NV 39th AIAA Aerospace Sciences Meeting and Exhibit, Reno, NV
\endverbatim \endverbatim
Note: DES constants CDES_kom and CDES_keps have been re-calibrated to
OpenFOAM numerics via decaying isotropic turbulence test case
SourceFiles SourceFiles
kOmegaSSTDES.C kOmegaSSTDES.C

View File

@ -61,7 +61,7 @@ tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::ft
const volScalarField& magGradU const volScalarField& magGradU
) const ) const
{ {
return tanh(pow3(sqr(ct_)*rd(this->nut_, magGradU))); return tanh(pow3(sqr(Ct_)*rd(this->nut_, magGradU)));
} }
@ -71,7 +71,7 @@ tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::fl
const volScalarField& magGradU const volScalarField& magGradU
) const ) 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<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::rd
} }
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::fd tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::fdt
( (
const volScalarField& magGradU const volScalarField& magGradU
) const ) 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<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::dTilda tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::dTilda
( (
@ -128,22 +128,35 @@ tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::dTilda
const volScalarField lRAS(sqrt(k)/(this->betaStar_*omega)); const volScalarField lRAS(sqrt(k)/(this->betaStar_*omega));
const volScalarField lLES(CDES*this->delta()); const volScalarField lLES(CDES*this->delta());
const dimensionedScalar d0("SMALL", dimLength, SMALL);
const volScalarField alpha(this->alpha()); const volScalarField alpha(this->alpha());
const volScalarField expTerm(exp(sqr(alpha))); const volScalarField expTerm(exp(sqr(alpha)));
tmp<volScalarField> fStep = min(2*pow(expTerm, -9.0), scalar(1)); tmp<volScalarField> fB = min(2*pow(expTerm, -9.0), scalar(1));
const volScalarField fHyb(max(1 - fd(magGradU), fStep)); tmp<volScalarField> fe1 =
// Simplified version where fRestore = 0
// return max(d0, fHyb*lRAS + (1 - fHyb)*lLES);
// Original form
tmp<volScalarField> fHill =
2*(pos(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0)); 2*(pos(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0));
tmp<volScalarField> fAmp = 1 - max(ft(magGradU), fl(magGradU)); tmp<volScalarField> fe2 = 1 - max(ft(magGradU), fl(magGradU));
tmp<volScalarField> fRestore = max(fHill - 1, scalar(0))*fAmp; tmp<volScalarField> fe = max(fe1 - 1, scalar(0))*fe2;
return max(d0, fHyb*(1 + fRestore)*lRAS + (1 - fHyb)*lLES);
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<BasicTurbulenceModel>::kOmegaSSTIDDES
propertiesName, propertiesName,
type type
), ),
cdt1_
Cdt1_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"cdt1", "Cdt1",
this->coeffDict_, this->coeffDict_,
20 20
) )
), ),
cdt2_ Cdt2_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"cdt2", "Cdt2",
this->coeffDict_, this->coeffDict_,
3 3
) )
), ),
cl_ Cl_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"cl", "Cl",
this->coeffDict_, this->coeffDict_,
5 5
) )
), ),
ct_ Ct_
( (
dimensioned<scalar>::lookupOrAddToDict dimensioned<scalar>::lookupOrAddToDict
( (
"ct", "Ct",
this->coeffDict_, this->coeffDict_,
1.87 1.87
) )
@ -225,10 +239,10 @@ bool kOmegaSSTIDDES<BasicTurbulenceModel>::read()
{ {
if (kOmegaSSTDES<BasicTurbulenceModel>::read()) if (kOmegaSSTDES<BasicTurbulenceModel>::read())
{ {
cdt1_.readIfPresent(this->coeffDict()); Cdt1_.readIfPresent(this->coeffDict());
cdt2_.readIfPresent(this->coeffDict()); Cdt2_.readIfPresent(this->coeffDict());
cl_.readIfPresent(this->coeffDict()); Cl_.readIfPresent(this->coeffDict());
ct_.readIfPresent(this->coeffDict()); Ct_.readIfPresent(this->coeffDict());
return true; return true;
} }

View File

@ -81,7 +81,7 @@ class kOmegaSSTIDDES
) const; ) const;
//- Delay function //- Delay function
tmp<volScalarField> fd(const volScalarField& maggradU) const; tmp<volScalarField> fdt(const volScalarField& magGradU) const;
// Disallow default bitwise copy construct and assignment // Disallow default bitwise copy construct and assignment
kOmegaSSTIDDES(const kOmegaSSTIDDES&); kOmegaSSTIDDES(const kOmegaSSTIDDES&);
@ -94,15 +94,16 @@ protected:
// Model coefficients // Model coefficients
dimensionedScalar cdt1_; dimensionedScalar Cdt1_;
dimensionedScalar cdt2_; dimensionedScalar Cdt2_;
dimensionedScalar cl_; dimensionedScalar Cl_;
dimensionedScalar ct_; dimensionedScalar Ct_;
// Fields // Fields
const IDDESDelta& IDDESDelta_; const IDDESDelta& IDDESDelta_;
// Protected Member Functions
//- Length scale //- Length scale
virtual tmp<volScalarField> dTilda virtual tmp<volScalarField> dTilda
@ -157,11 +158,13 @@ public:
} // End namespace Foam } // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository #ifdef NoRepository
# include "kOmegaSSTIDDES.C" # include "kOmegaSSTIDDES.C"
#endif #endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif #endif
// ************************************************************************* // // ************************************************************************* //