mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
CONTRIBUTION: Turbulence - updated SpalartAlmaras & kOmegaSST DES, DDES and IDDES
Code supplied by CFD Software E+F GmbH
This commit is contained in:
@ -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)
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
(
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -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
|
||||
)
|
||||
)
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
Reference in New Issue
Block a user