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
\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<volTensorField> 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<surfaceScalarField>
(
new surfaceScalarField
(
vf.name() + "BlendingFactor",
max(sigmaMax_*tanh(pow3(Af)), scalar(0))
fvc::interpolate(IOhybrid)
)
);
}
@ -205,16 +239,43 @@ public:
surfaceInterpolationScheme<Type>::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<Type>::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)
{

View File

@ -68,7 +68,7 @@ tmp<volScalarField> SpalartAllmarasDDES<BasicTurbulenceModel>::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<volScalarField> SpalartAllmarasDDES<BasicTurbulenceModel>::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<BasicTurbulenceModel>::SpalartAllmarasDDES
alphaRhoPhi,
phi,
transport,
propertiesName
propertiesName,
type
),
fdFactor_
Cd1_
(
dimensioned<scalar>::lookupOrAddToDict
(
"fdFactor",
"Cd1",
this->coeffDict_,
8
)
),
fdExponent_
Cd2_
(
dimensioned<scalar>::lookupOrAddToDict
(
"fdExponent",
"Cd2",
this->coeffDict_,
3
)
)
{}
{
if (type == typeName)
{
this->printCoeffs(type);
}
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@ -149,8 +159,9 @@ bool SpalartAllmarasDDES<BasicTurbulenceModel>::read()
{
if (SpalartAllmarasDES<BasicTurbulenceModel>::read())
{
fdFactor_.readIfPresent(this->coeffDict());
fdExponent_.readIfPresent(this->coeffDict());
Cd1_.readIfPresent(this->coeffDict());
Cd2_.readIfPresent(this->coeffDict());
return true;
}
else

View File

@ -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

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>
tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::Omega
(

View File

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

View File

@ -34,15 +34,24 @@ namespace LESModels
// * * * * * * * * * * * * 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>
tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::alpha() const
{
// Equation 9 (plus limits)
return max
(
0.25 - this->y_/static_cast<const volScalarField&>(IDDESDelta_.hmax()),
scalar(-5)
);
return max(0.25 - this->y_/IDDESDelta_.hmax(), scalar(-5));
}
@ -52,8 +61,7 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::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<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::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,7 +82,9 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::rd
const volScalarField& magGradU
) const
{
return min
tmp<volScalarField> tr
(
min
(
nur
/(
@ -83,10 +92,15 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::rd
(
magGradU,
dimensionedScalar("SMALL", magGradU.dimensions(), SMALL)
)*sqr(this->kappa_*this->y_)
)
*sqr(this->kappa_*this->y_)
),
scalar(10)
)
);
tr().boundaryField() == 0.0;
return tr;
}
@ -98,8 +112,7 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::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<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::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<volScalarField> fB = min(2*pow(expTerm, -9.0), scalar(1));
// Equation 11
tmp<volScalarField> fe1 =
2*(pos(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0));
// Equation 12
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;
// 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<BasicTurbulenceModel>::SpalartAllmarasIDDES
alphaRhoPhi,
phi,
transport,
propertiesName
propertiesName,
type
),
fwStar_
Cdt1_
(
dimensioned<scalar>::lookupOrAddToDict
(
"fwStar",
"Cdt1",
this->coeffDict_,
0.424
8
)
),
cl_
Cdt2_
(
dimensioned<scalar>::lookupOrAddToDict
(
"cl",
"Cdt2",
this->coeffDict_,
3
)
),
Cl_
(
dimensioned<scalar>::lookupOrAddToDict
(
"Cl",
this->coeffDict_,
3.55
)
),
ct_
Ct_
(
dimensioned<scalar>::lookupOrAddToDict
(
"ct",
"Ct",
this->coeffDict_,
1.63
)
),
IDDESDelta_(refCast<IDDESDelta>(this->delta_()))
{}
IDDESDelta_(setDelta())
{
if (type == typeName)
{
this->printCoeffs(type);
}
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
@ -204,9 +240,10 @@ bool SpalartAllmarasIDDES<BasicTurbulenceModel>::read()
{
if (SpalartAllmarasDES<BasicTurbulenceModel>::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;
}

View File

@ -66,21 +66,11 @@ class SpalartAllmarasIDDES
:
public SpalartAllmarasDES<BasicTurbulenceModel>
{
// 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<volScalarField> alpha() const;
tmp<volScalarField> ft(const volScalarField& magGradU) const;
tmp<volScalarField> 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

View File

@ -37,7 +37,6 @@ namespace LESModels
template<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::rd
(
const volScalarField& nur,
const volScalarField& magGradU
) const
{
@ -45,7 +44,7 @@ tmp<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::rd
(
min
(
nur
this->nuEff()
/(
max
(
@ -69,7 +68,7 @@ tmp<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::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<volScalarField> kOmegaSSTDDES<BasicTurbulenceModel>::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<BasicTurbulenceModel>::kOmegaSSTDDES
type
),
cd1_
Cd1_
(
dimensioned<scalar>::lookupOrAddToDict
(
"cd1",
"Cd1",
this->coeffDict_,
20
)
),
cd2_
Cd2_
(
dimensioned<scalar>::lookupOrAddToDict
(
"cd2",
"Cd2",
this->coeffDict_,
3
)
@ -153,8 +161,8 @@ bool kOmegaSSTDDES<BasicTurbulenceModel>::read()
{
if (kOmegaSSTDES<BasicTurbulenceModel>::read())
{
cd1_.readIfPresent(this->coeffDict());
cd2_.readIfPresent(this->coeffDict());
Cd1_.readIfPresent(this->coeffDict());
Cd2_.readIfPresent(this->coeffDict());
return true;
}

View File

@ -66,14 +66,10 @@ class kOmegaSSTDDES
{
// Private Member Functions
tmp<volScalarField> rd
(
const volScalarField& nur,
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
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
// ************************************************************************* //

View File

@ -62,12 +62,7 @@ tmp<volScalarField> kOmegaSSTDES<BasicTurbulenceModel>::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<BasicTurbulenceModel>::kOmegaSSTDES
(
"CDESkom",
this->coeffDict_,
0.78
0.82
)
),
CDESkeps_
@ -122,7 +117,7 @@ kOmegaSSTDES<BasicTurbulenceModel>::kOmegaSSTDES
(
"CDESkeps",
this->coeffDict_,
0.61
0.60
)
)
{

View File

@ -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

View File

@ -61,7 +61,7 @@ tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::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<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::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<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::rd
}
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::fd
tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::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<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::dTilda
(
@ -128,22 +128,35 @@ tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::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<volScalarField> 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<volScalarField> fHill =
tmp<volScalarField> fB = min(2*pow(expTerm, -9.0), scalar(1));
tmp<volScalarField> fe1 =
2*(pos(alpha)*pow(expTerm, -11.09) + neg(alpha)*pow(expTerm, -9.0));
tmp<volScalarField> fAmp = 1 - max(ft(magGradU), fl(magGradU));
tmp<volScalarField> fRestore = max(fHill - 1, scalar(0))*fAmp;
return max(d0, fHyb*(1 + fRestore)*lRAS + (1 - fHyb)*lLES);
tmp<volScalarField> fe2 = 1 - max(ft(magGradU), fl(magGradU));
tmp<volScalarField> 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<BasicTurbulenceModel>::kOmegaSSTIDDES
propertiesName,
type
),
cdt1_
Cdt1_
(
dimensioned<scalar>::lookupOrAddToDict
(
"cdt1",
"Cdt1",
this->coeffDict_,
20
)
),
cdt2_
Cdt2_
(
dimensioned<scalar>::lookupOrAddToDict
(
"cdt2",
"Cdt2",
this->coeffDict_,
3
)
),
cl_
Cl_
(
dimensioned<scalar>::lookupOrAddToDict
(
"cl",
"Cl",
this->coeffDict_,
5
)
),
ct_
Ct_
(
dimensioned<scalar>::lookupOrAddToDict
(
"ct",
"Ct",
this->coeffDict_,
1.87
)
@ -225,10 +239,10 @@ bool kOmegaSSTIDDES<BasicTurbulenceModel>::read()
{
if (kOmegaSSTDES<BasicTurbulenceModel>::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;
}

View File

@ -81,7 +81,7 @@ class kOmegaSSTIDDES
) const;
//- Delay function
tmp<volScalarField> fd(const volScalarField& maggradU) const;
tmp<volScalarField> 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<volScalarField> dTilda
@ -157,11 +158,13 @@ public:
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "kOmegaSSTIDDES.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //