STYLE: various simplifications and changes
BUG: DEShybrid: reintroduce e28bed59
This commit is contained in:
parent
493bfdbdc4
commit
3a4537abc9
@ -30,7 +30,7 @@ Class
|
||||
|
||||
Description
|
||||
Improved hybrid convection scheme of Travin et al. for hybrid RAS/LES
|
||||
calculations with enhanced GAM behaviour.
|
||||
calculations with enhanced Grey Area Mitigation (GAM) behaviour.
|
||||
|
||||
The scheme provides a blend between two convection schemes, based on local
|
||||
properties including the wall distance, velocity gradient and eddy
|
||||
@ -55,25 +55,26 @@ Description
|
||||
|
||||
First published in:
|
||||
\verbatim
|
||||
A. Travin, M. Shur, M. Strelets, P. Spalart (2000).
|
||||
Physical and numerical upgrades in the detached-eddy simulation of
|
||||
complex turbulent flows.
|
||||
In Proceedings of the 412th Euromech Colloquium on LES and Complex
|
||||
Transition and Turbulent Flows, Munich, Germany
|
||||
Travin, A., Shur, M., Strelets, M., & Spalart, P. R. (2000).
|
||||
Physical and numerical upgrades in the detached-eddy
|
||||
simulation of complex turbulent flows.
|
||||
In LES of Complex Transitional and Turbulent Flows.
|
||||
Proceedings of the Euromech Colloquium 412. Munich, Germany
|
||||
\endverbatim
|
||||
|
||||
Original publication contained a typo for C_H3 constant. Corrected version
|
||||
with minor changes for 2 lower limiters published in:
|
||||
Original publication contained a typo for \c 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
|
||||
Spalart, P., Shur, M., Strelets, M., & Travin, A. (2012).
|
||||
Sensitivity of landing-gear noise predictions by large-eddy
|
||||
simulation to numerics and resolution.
|
||||
In 50th AIAA Aerospace Sciences Meeting Including the
|
||||
New Horizons Forum and Aerospace Exposition. Nashville, US.
|
||||
DOI:10.2514/6.2012-1174
|
||||
\endverbatim
|
||||
|
||||
Example of the DEShybrid scheme specification using linear within the LES
|
||||
region and linearUpwind within the RAS region:
|
||||
Example of the \c DEShybrid scheme specification using \c linear
|
||||
within the LES region and \c linearUpwind within the RAS region:
|
||||
\verbatim
|
||||
divSchemes
|
||||
{
|
||||
@ -100,12 +101,12 @@ Notes
|
||||
be used in the detached/vortex shedding regions.
|
||||
- Scheme 2 should be an upwind/deferred correction/TVD scheme which will
|
||||
be used in the free-stream/Euler/boundary layer regions.
|
||||
- the scheme is compiled into a separate library, and not available to
|
||||
- The scheme is compiled into a separate library, and not available to
|
||||
solvers by default. In order to use the scheme, add the library as a
|
||||
run-time loaded library in the \$FOAM\_CASE/system/controlDict
|
||||
dictionary, e.g.:
|
||||
\verbatim
|
||||
libs ("libturbulenceModelSchemes.so");
|
||||
libs (turbulenceModelSchemes);
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
@ -187,6 +188,7 @@ class DEShybrid
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Check the scheme coefficients
|
||||
void checkValues()
|
||||
{
|
||||
if (U0_.value() <= 0)
|
||||
@ -231,8 +233,8 @@ class DEShybrid
|
||||
Info<< type() << "coefficients:" << nl
|
||||
<< " delta : " << deltaName_ << nl
|
||||
<< " CDES : " << CDES_ << nl
|
||||
<< " U0 : " << U0_ << nl
|
||||
<< " LO : " << L0_ << nl
|
||||
<< " U0 : " << U0_.value() << nl
|
||||
<< " L0 : " << L0_.value() << nl
|
||||
<< " sigmaMin : " << sigmaMin_ << nl
|
||||
<< " sigmaMax : " << sigmaMax_ << nl
|
||||
<< " OmegaLim : " << OmegaLim_ << nl
|
||||
@ -256,63 +258,95 @@ class DEShybrid
|
||||
const volScalarField& delta
|
||||
) const
|
||||
{
|
||||
tmp<volTensorField> gradU(fvc::grad(U));
|
||||
const volScalarField S(sqrt(2.0)*mag(symm(gradU())));
|
||||
const volScalarField Omega(sqrt(2.0)*mag(skew(gradU())));
|
||||
tmp<volTensorField> tgradU = fvc::grad(U);
|
||||
const volTensorField& gradU = tgradU.cref();
|
||||
const volScalarField S(sqrt(2.0)*mag(symm(gradU)));
|
||||
const volScalarField Omega(sqrt(2.0)*mag(skew(tgradU)));
|
||||
const dimensionedScalar tau0_ = L0_/U0_;
|
||||
gradU.clear();
|
||||
|
||||
const volScalarField B
|
||||
(
|
||||
tmp<volScalarField> tB =
|
||||
CH3_*Omega*max(S, Omega)
|
||||
/max(0.5*(sqr(S) + sqr(Omega)), sqr(OmegaLim_/tau0_))
|
||||
);
|
||||
/max(0.5*(sqr(S) + sqr(Omega)), sqr(OmegaLim_/tau0_));
|
||||
|
||||
const volScalarField K
|
||||
(
|
||||
max(Foam::sqrt(0.5*(sqr(S) + sqr(Omega))), 0.1/tau0_)
|
||||
);
|
||||
tmp<volScalarField> tg = tanh(pow4(tB));
|
||||
|
||||
const volScalarField lTurb
|
||||
(
|
||||
tmp<volScalarField> tK =
|
||||
max(Foam::sqrt(0.5*(sqr(S) + sqr(Omega))), 0.1/tau0_);
|
||||
|
||||
tmp<volScalarField> tlTurb =
|
||||
Foam::sqrt
|
||||
(
|
||||
max
|
||||
(
|
||||
(max(nut, min(sqr(Cs_*delta)*S, nutLim_*nut)) + nu)
|
||||
/(pow(0.09, 1.5)*K),
|
||||
/(pow(0.09, 1.5)*tK),
|
||||
dimensionedScalar(sqr(dimLength), Zero)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
const volScalarField g(tanh(pow4(B)));
|
||||
);
|
||||
|
||||
const volScalarField A
|
||||
(
|
||||
CH2_*max
|
||||
(
|
||||
scalar(0),
|
||||
CDES_*delta/max(lTurb*g, SMALL*L0_) - 0.5
|
||||
CDES_*delta/max(tlTurb*tg, SMALL*L0_) - 0.5
|
||||
)
|
||||
);
|
||||
|
||||
const volScalarField factor
|
||||
|
||||
const word factorName(IOobject::scopedName(typeName, "Factor"));
|
||||
const fvMesh& mesh = this->mesh();
|
||||
|
||||
const IOobject factorIO
|
||||
(
|
||||
IOobject::scopedName(typeName, "Factor"),
|
||||
max(sigmaMax_*tanh(pow(A, CH1_)), sigmaMin_)
|
||||
factorName,
|
||||
mesh.time().timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
);
|
||||
|
||||
if (blendedSchemeBaseName::debug)
|
||||
{
|
||||
factor.write();
|
||||
}
|
||||
auto* factorPtr = mesh.getObjectPtr<volScalarField>(factorName);
|
||||
|
||||
return tmp<surfaceScalarField>::New
|
||||
(
|
||||
vf.name() + "BlendingFactor",
|
||||
fvc::interpolate(factor)
|
||||
);
|
||||
if (!factorPtr)
|
||||
{
|
||||
factorPtr =
|
||||
new volScalarField
|
||||
(
|
||||
factorIO,
|
||||
mesh,
|
||||
dimensionedScalar(dimless, Zero)
|
||||
);
|
||||
|
||||
const_cast<fvMesh&>(mesh).objectRegistry::store(factorPtr);
|
||||
}
|
||||
|
||||
auto& factor = *factorPtr;
|
||||
|
||||
factor = max(sigmaMax_*tanh(pow(A, CH1_)), sigmaMin_);
|
||||
|
||||
return tmp<surfaceScalarField>::New
|
||||
(
|
||||
vf.name() + "BlendingFactor",
|
||||
fvc::interpolate(factor)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
const volScalarField factor
|
||||
(
|
||||
factorIO,
|
||||
max(sigmaMax_*tanh(pow(A, CH1_)), sigmaMin_)
|
||||
);
|
||||
|
||||
return tmp<surfaceScalarField>::New
|
||||
(
|
||||
vf.name() + "BlendingFactor",
|
||||
fvc::interpolate(factor)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -434,10 +468,10 @@ public:
|
||||
|
||||
|
||||
//- Return the face-interpolate of the given cell field
|
||||
// with explicit correction
|
||||
//- with explicit correction
|
||||
tmp<SurfaceFieldType> interpolate(const VolFieldType& vf) const
|
||||
{
|
||||
surfaceScalarField bf(blendingFactor(vf));
|
||||
const surfaceScalarField bf(blendingFactor(vf));
|
||||
|
||||
return
|
||||
(scalar(1) - bf)*tScheme1_().interpolate(vf)
|
||||
@ -498,4 +532,3 @@ public:
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
|
@ -85,7 +85,8 @@ tmp<volScalarField> SpalartAllmarasBase<BasicEddyViscosityModel>::ft2
|
||||
"ft2",
|
||||
this->runTime_.timeName(),
|
||||
this->mesh_,
|
||||
IOobject::NO_READ
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
this->mesh_,
|
||||
dimensionedScalar(dimless, Zero)
|
||||
@ -111,7 +112,7 @@ tmp<volScalarField> SpalartAllmarasBase<BasicEddyViscosityModel>::r
|
||||
const volScalarField& dTilda
|
||||
) const
|
||||
{
|
||||
const dimensionedScalar eps("SMALL", Stilda.dimensions(), SMALL);
|
||||
const dimensionedScalar eps(Stilda.dimensions(), SMALL);
|
||||
|
||||
tmp<volScalarField> tr =
|
||||
min(nur/(max(Stilda, eps)*sqr(kappa_*dTilda)), scalar(10));
|
||||
@ -346,7 +347,7 @@ bool SpalartAllmarasBase<BasicEddyViscosityModel>::read()
|
||||
if (BasicEddyViscosityModel::read())
|
||||
{
|
||||
sigmaNut_.readIfPresent(this->coeffDict());
|
||||
kappa_.readIfPresent(*this);
|
||||
kappa_.readIfPresent(this->coeffDict());
|
||||
|
||||
Cb1_.readIfPresent(this->coeffDict());
|
||||
Cb2_.readIfPresent(this->coeffDict());
|
||||
@ -355,14 +356,13 @@ bool SpalartAllmarasBase<BasicEddyViscosityModel>::read()
|
||||
Cw3_.readIfPresent(this->coeffDict());
|
||||
Cv1_.readIfPresent(this->coeffDict());
|
||||
Cs_.readIfPresent(this->coeffDict());
|
||||
|
||||
ck_.readIfPresent(this->coeffDict());
|
||||
|
||||
ft2_.readIfPresent("ft2", this->coeffDict());
|
||||
Ct3_.readIfPresent(this->coeffDict());
|
||||
Ct4_.readIfPresent(this->coeffDict());
|
||||
|
||||
if (mag(Ct3_.value()) > SMALL)
|
||||
if (ft2_)
|
||||
{
|
||||
Info<< " ft2 term: active" << nl;
|
||||
}
|
||||
@ -444,47 +444,49 @@ void SpalartAllmarasBase<BasicEddyViscosityModel>::correct()
|
||||
return;
|
||||
}
|
||||
|
||||
// Local references
|
||||
const alphaField& alpha = this->alpha_;
|
||||
const rhoField& rho = this->rho_;
|
||||
const surfaceScalarField& alphaRhoPhi = this->alphaRhoPhi_;
|
||||
const volVectorField& U = this->U_;
|
||||
fv::options& fvOptions(fv::options::New(this->mesh_));
|
||||
{
|
||||
// Local references
|
||||
const alphaField& alpha = this->alpha_;
|
||||
const rhoField& rho = this->rho_;
|
||||
const surfaceScalarField& alphaRhoPhi = this->alphaRhoPhi_;
|
||||
const volVectorField& U = this->U_;
|
||||
fv::options& fvOptions(fv::options::New(this->mesh_));
|
||||
|
||||
BasicEddyViscosityModel::correct();
|
||||
BasicEddyViscosityModel::correct();
|
||||
|
||||
const volScalarField chi(this->chi());
|
||||
const volScalarField fv1(this->fv1(chi));
|
||||
const volScalarField ft2(this->ft2(chi));
|
||||
const volScalarField chi(this->chi());
|
||||
const volScalarField fv1(this->fv1(chi));
|
||||
const volScalarField ft2(this->ft2(chi));
|
||||
|
||||
tmp<volTensorField> tgradU = fvc::grad(U);
|
||||
volScalarField dTilda(this->dTilda(chi, fv1, tgradU()));
|
||||
volScalarField Stilda(this->Stilda(chi, fv1, tgradU(), dTilda));
|
||||
tgradU.clear();
|
||||
tmp<volTensorField> tgradU = fvc::grad(U);
|
||||
volScalarField dTilda(this->dTilda(chi, fv1, tgradU()));
|
||||
volScalarField Stilda(this->Stilda(chi, fv1, tgradU(), dTilda));
|
||||
tgradU.clear();
|
||||
|
||||
tmp<fvScalarMatrix> nuTildaEqn
|
||||
(
|
||||
fvm::ddt(alpha, rho, nuTilda_)
|
||||
+ fvm::div(alphaRhoPhi, nuTilda_)
|
||||
- fvm::laplacian(alpha*rho*DnuTildaEff(), nuTilda_)
|
||||
- Cb2_/sigmaNut_*alpha()*rho()*magSqr(fvc::grad(nuTilda_)()())
|
||||
==
|
||||
Cb1_*alpha()*rho()*Stilda()*nuTilda_()*(scalar(1) - ft2())
|
||||
- fvm::Sp
|
||||
tmp<fvScalarMatrix> nuTildaEqn
|
||||
(
|
||||
(Cw1_*fw(Stilda, dTilda) - Cb1_/sqr(kappa_)*ft2())
|
||||
*alpha()*rho()*nuTilda_()/sqr(dTilda()),
|
||||
nuTilda_
|
||||
)
|
||||
+ fvOptions(alpha, rho, nuTilda_)
|
||||
);
|
||||
fvm::ddt(alpha, rho, nuTilda_)
|
||||
+ fvm::div(alphaRhoPhi, nuTilda_)
|
||||
- fvm::laplacian(alpha*rho*DnuTildaEff(), nuTilda_)
|
||||
- Cb2_/sigmaNut_*alpha()*rho()*magSqr(fvc::grad(nuTilda_)()())
|
||||
==
|
||||
Cb1_*alpha()*rho()*Stilda()*nuTilda_()*(scalar(1) - ft2())
|
||||
- fvm::Sp
|
||||
(
|
||||
(Cw1_*fw(Stilda, dTilda) - Cb1_/sqr(kappa_)*ft2())
|
||||
*alpha()*rho()*nuTilda_()/sqr(dTilda()),
|
||||
nuTilda_
|
||||
)
|
||||
+ fvOptions(alpha, rho, nuTilda_)
|
||||
);
|
||||
|
||||
nuTildaEqn.ref().relax();
|
||||
fvOptions.constrain(nuTildaEqn.ref());
|
||||
solve(nuTildaEqn);
|
||||
fvOptions.correct(nuTilda_);
|
||||
bound(nuTilda_, dimensionedScalar(nuTilda_.dimensions(), Zero));
|
||||
nuTilda_.correctBoundaryConditions();
|
||||
nuTildaEqn.ref().relax();
|
||||
fvOptions.constrain(nuTildaEqn.ref());
|
||||
solve(nuTildaEqn);
|
||||
fvOptions.correct(nuTilda_);
|
||||
bound(nuTilda_, dimensionedScalar(nuTilda_.dimensions(), Zero));
|
||||
nuTilda_.correctBoundaryConditions();
|
||||
}
|
||||
|
||||
correctNut();
|
||||
}
|
||||
|
@ -31,15 +31,33 @@ Group
|
||||
grpDESTurbulence
|
||||
|
||||
Description
|
||||
SpalartAllmarasBase DES turbulence model for incompressible and
|
||||
compressible flows
|
||||
Base class to handle various characteristics for \c SpalartAllmaras based
|
||||
LES/DES turbulence models for incompressible and compressible flows.
|
||||
|
||||
Reference:
|
||||
References:
|
||||
\verbatim
|
||||
Spalart, P. R., Jou, W. H., Strelets, M., & Allmaras, S. R. (1997).
|
||||
Comments on the feasibility of LES for wings, and on a hybrid
|
||||
RANS/LES approach.
|
||||
Advances in DNS/LES, 1, 4-8.
|
||||
Standard model:
|
||||
Spalart, P.R., & Allmaras, S.R. (1994).
|
||||
A one-equation turbulence model for aerodynamic flows.
|
||||
La Recherche Aerospatiale, 1, 5-21.
|
||||
|
||||
Standard model:
|
||||
Spalart, P. R., Jou, W. H., Strelets, M., & Allmaras, S. R. (1997).
|
||||
Comments on the feasibility of LES for wings, and on a hybrid
|
||||
RANS/LES approach.
|
||||
Advances in DNS/LES, 1, 4-8.
|
||||
|
||||
Estimation expression for k and epsilon (tag:B), Eq. 4.50:
|
||||
Bourgoin, A. (2019).
|
||||
Bathymetry induced turbulence modelling the
|
||||
Alderney Race site: regional approach with TELEMAC-LES.
|
||||
Normandie Université.
|
||||
|
||||
Estimation expressions for omega (tag:P):
|
||||
Pope, S. B. (2000).
|
||||
Turbulent flows.
|
||||
Cambridge, UK: Cambridge Univ. Press
|
||||
DOI:10.1017/CBO9780511840531
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
@ -56,7 +74,7 @@ namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class SpalartAllmarasBase Declaration
|
||||
Class SpalartAllmarasBase Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class BasicEddyViscosityModel>
|
||||
@ -75,7 +93,7 @@ class SpalartAllmarasBase
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
// Model constants
|
||||
|
||||
@ -98,6 +116,7 @@ protected:
|
||||
|
||||
// Fields
|
||||
|
||||
//- Modified kinematic viscosity [m^2/s]
|
||||
volScalarField nuTilda_;
|
||||
|
||||
//- Wall distance
|
||||
@ -199,6 +218,7 @@ public:
|
||||
//- Return the (estimated) specific dissipation rate
|
||||
virtual tmp<volScalarField> omega() const;
|
||||
|
||||
//- Return the modified kinematic viscosity
|
||||
tmp<volScalarField> nuTilda() const
|
||||
{
|
||||
return nuTilda_;
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -48,7 +48,7 @@ tmp<volScalarField> kOmegaSSTBase<BasicEddyViscosityModel>::F1
|
||||
tmp<volScalarField> CDkOmegaPlus = max
|
||||
(
|
||||
CDkOmega,
|
||||
dimensionedScalar("1.0e-10", dimless/sqr(dimTime), 1.0e-10)
|
||||
dimensionedScalar(dimless/sqr(dimTime), 1.0e-10)
|
||||
);
|
||||
|
||||
tmp<volScalarField> arg1 = min
|
||||
@ -406,6 +406,7 @@ kOmegaSSTBase<BasicEddyViscosityModel>::kOmegaSSTBase
|
||||
),
|
||||
this->mesh_
|
||||
),
|
||||
|
||||
decayControl_
|
||||
(
|
||||
Switch::getOrAddToDict
|
||||
@ -515,18 +516,21 @@ void kOmegaSSTBase<BasicEddyViscosityModel>::correct()
|
||||
|
||||
BasicEddyViscosityModel::correct();
|
||||
|
||||
volScalarField::Internal divU(fvc::div(fvc::absolute(this->phi(), U)));
|
||||
const volScalarField::Internal divU
|
||||
(
|
||||
fvc::div(fvc::absolute(this->phi(), U))
|
||||
);
|
||||
|
||||
volScalarField CDkOmega
|
||||
const volScalarField CDkOmega
|
||||
(
|
||||
(2*alphaOmega2_)*(fvc::grad(k_) & fvc::grad(omega_))/omega_
|
||||
);
|
||||
|
||||
volScalarField F1(this->F1(CDkOmega));
|
||||
volScalarField F23(this->F23());
|
||||
const volScalarField F1(this->F1(CDkOmega));
|
||||
const volScalarField F23(this->F23());
|
||||
|
||||
tmp<volTensorField> tgradU = fvc::grad(U);
|
||||
volScalarField S2(this->S2(F1, tgradU()));
|
||||
const volScalarField S2(this->S2(F1, tgradU()));
|
||||
volScalarField::Internal GbyNu0(this->GbyNu0(tgradU(), F1, S2));
|
||||
volScalarField::Internal G(this->GName(), nut*GbyNu0);
|
||||
|
||||
@ -534,8 +538,8 @@ void kOmegaSSTBase<BasicEddyViscosityModel>::correct()
|
||||
omega_.boundaryFieldRef().updateCoeffs();
|
||||
|
||||
{
|
||||
volScalarField::Internal gamma(this->gamma(F1));
|
||||
volScalarField::Internal beta(this->beta(F1));
|
||||
const volScalarField::Internal gamma(this->gamma(F1));
|
||||
const volScalarField::Internal beta(this->beta(F1));
|
||||
|
||||
GbyNu0 = GbyNu(GbyNu0, F23(), S2());
|
||||
|
||||
@ -568,28 +572,30 @@ void kOmegaSSTBase<BasicEddyViscosityModel>::correct()
|
||||
bound(omega_, this->omegaMin_);
|
||||
}
|
||||
|
||||
// Turbulent kinetic energy equation
|
||||
tmp<fvScalarMatrix> kEqn
|
||||
(
|
||||
fvm::ddt(alpha, rho, k_)
|
||||
+ fvm::div(alphaRhoPhi, k_)
|
||||
- fvm::laplacian(alpha*rho*DkEff(F1), k_)
|
||||
==
|
||||
alpha()*rho()*Pk(G)
|
||||
- fvm::SuSp((2.0/3.0)*alpha()*rho()*divU, k_)
|
||||
- fvm::Sp(alpha()*rho()*epsilonByk(F1, tgradU()), k_)
|
||||
+ alpha()*rho()*betaStar_*omegaInf_*kInf_
|
||||
+ kSource()
|
||||
+ fvOptions(alpha, rho, k_)
|
||||
);
|
||||
{
|
||||
// Turbulent kinetic energy equation
|
||||
tmp<fvScalarMatrix> kEqn
|
||||
(
|
||||
fvm::ddt(alpha, rho, k_)
|
||||
+ fvm::div(alphaRhoPhi, k_)
|
||||
- fvm::laplacian(alpha*rho*DkEff(F1), k_)
|
||||
==
|
||||
alpha()*rho()*Pk(G)
|
||||
- fvm::SuSp((2.0/3.0)*alpha()*rho()*divU, k_)
|
||||
- fvm::Sp(alpha()*rho()*epsilonByk(F1, tgradU()), k_)
|
||||
+ alpha()*rho()*betaStar_*omegaInf_*kInf_
|
||||
+ kSource()
|
||||
+ fvOptions(alpha, rho, k_)
|
||||
);
|
||||
|
||||
tgradU.clear();
|
||||
tgradU.clear();
|
||||
|
||||
kEqn.ref().relax();
|
||||
fvOptions.constrain(kEqn.ref());
|
||||
solve(kEqn);
|
||||
fvOptions.correct(k_);
|
||||
bound(k_, this->kMin_);
|
||||
kEqn.ref().relax();
|
||||
fvOptions.constrain(kEqn.ref());
|
||||
solve(kEqn);
|
||||
fvOptions.correct(k_);
|
||||
bound(k_, this->kMin_);
|
||||
}
|
||||
|
||||
correctNut(S2);
|
||||
}
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2017-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2017-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -142,7 +142,7 @@ class kOmegaSSTBase
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
// Model coefficients
|
||||
|
||||
@ -175,7 +175,10 @@ protected:
|
||||
// which is for near-wall cells only
|
||||
const volScalarField& y_;
|
||||
|
||||
//- Turbulent kinetic energy field [m^2/s^2]
|
||||
volScalarField k_;
|
||||
|
||||
//- Specific dissipation rate field [1/s]
|
||||
volScalarField omega_;
|
||||
|
||||
|
||||
@ -189,6 +192,7 @@ protected:
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Set decay control with kInf and omegaInf
|
||||
void setDecayControl(const dictionary& dict);
|
||||
|
||||
virtual tmp<volScalarField> F1(const volScalarField& CDkOmega) const;
|
||||
@ -196,6 +200,7 @@ protected:
|
||||
virtual tmp<volScalarField> F3() const;
|
||||
virtual tmp<volScalarField> F23() const;
|
||||
|
||||
//- Return the blended field
|
||||
tmp<volScalarField> blend
|
||||
(
|
||||
const volScalarField& F1,
|
||||
@ -206,6 +211,7 @@ protected:
|
||||
return F1*(psi1 - psi2) + psi2;
|
||||
}
|
||||
|
||||
//- Return the internal blended field
|
||||
tmp<volScalarField::Internal> blend
|
||||
(
|
||||
const volScalarField::Internal& F1,
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2012-2015 OpenFOAM Foundation
|
||||
Copyright (C) 2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -92,19 +92,17 @@ tmp<volScalarField> DESModel<BasicTurbulenceModel>::Ssigma
|
||||
)
|
||||
{
|
||||
// Limiter
|
||||
const dimensionedScalar eps0("eps0", dimless, SMALL);
|
||||
const dimensionedScalar eps2("eps2", dimless/sqr(dimTime), SMALL);
|
||||
const dimensionedScalar eps4("eps4", dimless/pow4(dimTime), SMALL);
|
||||
const dimensionedScalar max2("max2", dimless/sqr(dimTime), GREAT);
|
||||
const dimensionedScalar eps0(dimless, SMALL);
|
||||
const dimensionedScalar eps2(dimless/sqr(dimTime), SMALL);
|
||||
const dimensionedScalar eps4(dimless/pow4(dimTime), SMALL);
|
||||
const dimensionedScalar max2(dimless/sqr(dimTime), GREAT);
|
||||
const dimensionedTensor maxTen2
|
||||
(
|
||||
"maxTen2",
|
||||
dimless/sqr(dimTime),
|
||||
tensor::max
|
||||
);
|
||||
const dimensionedTensor minTen2
|
||||
(
|
||||
"minTen2",
|
||||
dimless/sqr(dimTime),
|
||||
tensor::min
|
||||
);
|
||||
@ -114,11 +112,12 @@ tmp<volScalarField> DESModel<BasicTurbulenceModel>::Ssigma
|
||||
// Tensor invariants
|
||||
const volScalarField I1(tr(G));
|
||||
const volScalarField I2(0.5*(sqr(I1) - tr(G & G)));
|
||||
const volScalarField I3(det(G));
|
||||
tmp<volScalarField> tI3 = det(G);
|
||||
|
||||
const volScalarField alpha1(max(sqr(I1)/9.0 - I2/3.0, eps4));
|
||||
|
||||
const volScalarField alpha2(pow3(min(I1, max2))/27.0 - I1*I2/6.0 + I3/2.0);
|
||||
tmp<volScalarField> talpha2 =
|
||||
pow3(min(I1, max2))/27.0 - I1*I2/6.0 + 0.5*tI3;
|
||||
|
||||
const volScalarField alpha3
|
||||
(
|
||||
@ -128,7 +127,7 @@ tmp<volScalarField> DESModel<BasicTurbulenceModel>::Ssigma
|
||||
max
|
||||
(
|
||||
scalar(-1) + eps0,
|
||||
min(scalar(1) - eps0, alpha2/pow(alpha1, 3.0/2.0))
|
||||
min(scalar(1) - eps0, talpha2/pow(alpha1, 3.0/2.0))
|
||||
)
|
||||
)
|
||||
);
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2012-2015 OpenFOAM Foundation
|
||||
Copyright (C) 2016, 2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2016, 2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -58,9 +58,6 @@ class DESModel
|
||||
public DESModelBase,
|
||||
public LESeddyViscosity<BasicTurbulenceModel>
|
||||
{
|
||||
|
||||
private:
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- No copy construct
|
||||
@ -74,6 +71,7 @@ protected:
|
||||
|
||||
// Protected Data
|
||||
|
||||
//- Model-specific transition constant
|
||||
dimensionedScalar Ctrans_;
|
||||
|
||||
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2015-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2015-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -141,8 +141,8 @@ SpalartAllmarasDDES<BasicTurbulenceModel>::SpalartAllmarasDDES
|
||||
|
||||
Cd1_
|
||||
(
|
||||
this->useSigma_ ?
|
||||
dimensioned<scalar>::getOrAddToDict
|
||||
this->useSigma_
|
||||
? dimensioned<scalar>::getOrAddToDict
|
||||
(
|
||||
"Cd1Sigma",
|
||||
this->coeffDict_,
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2019-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2019-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -33,15 +33,16 @@ Group
|
||||
|
||||
Description
|
||||
SpalartAllmaras DDES turbulence model for incompressible and compressible
|
||||
flows
|
||||
flows.
|
||||
|
||||
Reference:
|
||||
\verbatim
|
||||
Spalart, P. R., Deck, S., Shur, M. L., Squires, K. D., Strelets, M. K.,
|
||||
& Travin, A. (2006).
|
||||
A new version of detached-eddy simulation, resistant to ambiguous grid
|
||||
densities.
|
||||
Spalart, P. R., Deck, S., Shur, M. L., Squires,
|
||||
K. D., Strelets, M. K., & Travin, A. (2006).
|
||||
A new version of detached-eddy simulation,
|
||||
resistant to ambiguous grid densities.
|
||||
Theoretical and computational fluid dynamics, 20(3), 181-195.
|
||||
DOI:10.1007/s00162-006-0015-0
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
@ -72,7 +73,7 @@ class SpalartAllmarasDDES
|
||||
{
|
||||
// Private Member Functions
|
||||
|
||||
//- Shielding function
|
||||
//- Return the shielding function
|
||||
tmp<volScalarField> fd(const volScalarField& magGradU) const;
|
||||
|
||||
//- No copy construct
|
||||
@ -84,7 +85,7 @@ class SpalartAllmarasDDES
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
// Model coefficients
|
||||
|
||||
@ -94,7 +95,7 @@ protected:
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Production term
|
||||
//- Return the production term
|
||||
virtual tmp<volScalarField> Stilda
|
||||
(
|
||||
const volScalarField& chi,
|
||||
@ -103,7 +104,7 @@ protected:
|
||||
const volScalarField& dTilda
|
||||
) const;
|
||||
|
||||
//- Length scale
|
||||
//- Return the length scale
|
||||
virtual tmp<volScalarField> dTilda
|
||||
(
|
||||
const volScalarField& chi,
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
@ -32,7 +32,7 @@ Group
|
||||
|
||||
Description
|
||||
SpalartAllmarasDES DES turbulence model for incompressible and
|
||||
compressible flows
|
||||
compressible flows.
|
||||
|
||||
Reference:
|
||||
\verbatim
|
||||
@ -44,11 +44,12 @@ Description
|
||||
|
||||
Including the low Reynolds number correction documented in
|
||||
\verbatim
|
||||
Spalart, P. R., Deck, S., Shur, M.L., Squires, K.D., Strelets, M.Kh,
|
||||
Travin, A. (2006).
|
||||
A new version of detached-eddy simulation, resistant to ambiguous grid
|
||||
densities.
|
||||
Theor. Comput. Fluid Dyn., 20, 181-195.
|
||||
Spalart, P. R., Deck, S., Shur, M. L., Squires,
|
||||
K. D., Strelets, M. K., & Travin, A. (2006).
|
||||
A new version of detached-eddy simulation,
|
||||
resistant to ambiguous grid densities.
|
||||
Theoretical and computational fluid dynamics, 20(3), 181-195.
|
||||
DOI:10.1007/s00162-006-0015-0
|
||||
\endverbatim
|
||||
|
||||
Note
|
||||
@ -94,38 +95,38 @@ class SpalartAllmarasDES
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
//- Switch to activate grey-area enhanced sigma-(D)DES
|
||||
Switch useSigma_;
|
||||
|
||||
// Model constants
|
||||
|
||||
// DES coefficient
|
||||
//- DES coefficient
|
||||
dimensionedScalar CDES_;
|
||||
|
||||
// Low Reynolds number correction
|
||||
//- Flag for low Reynolds number correction
|
||||
Switch lowReCorrection_;
|
||||
dimensionedScalar fwStar_;
|
||||
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Low Reynolds number correction function
|
||||
//- Return the low Reynolds number correction function
|
||||
virtual tmp<volScalarField> psi
|
||||
(
|
||||
const volScalarField& chi,
|
||||
const volScalarField& fv1
|
||||
) const;
|
||||
|
||||
//- LES length scale
|
||||
//- Return the LES length scale
|
||||
virtual tmp<volScalarField> lengthScaleLES
|
||||
(
|
||||
const volScalarField& chi,
|
||||
const volScalarField& fv1
|
||||
) const;
|
||||
|
||||
//- Production term
|
||||
//- Return the production term
|
||||
virtual tmp<volScalarField> Stilda
|
||||
(
|
||||
const volScalarField& chi,
|
||||
@ -134,7 +135,7 @@ protected:
|
||||
const volScalarField& dTilda
|
||||
) const;
|
||||
|
||||
//- Length scale
|
||||
//- Return the length scale
|
||||
virtual tmp<volScalarField> dTilda
|
||||
(
|
||||
const volScalarField& chi,
|
||||
|
@ -31,15 +31,16 @@ Group
|
||||
grpDESTurbulence
|
||||
|
||||
Description
|
||||
SpalartAllmaras IDDES turbulence model for incompressible and compressible
|
||||
flows
|
||||
SpalartAllmaras IDDES turbulence model
|
||||
for incompressible and compressible flows.
|
||||
|
||||
Reference:
|
||||
\verbatim
|
||||
Shur, M. L., Spalart, P. R., Strelets, M. K., & Travin, A. K. (2008).
|
||||
A hybrid RANS-LES approach with delayed-DES and wall-modelled LES
|
||||
capabilities.
|
||||
International Journal of Heat and Fluid Flow, 29(6), 1638-1649.
|
||||
A hybrid RANS-LES approach with delayed-DES
|
||||
and wall-modelled LES capabilities.
|
||||
International journal of heat and fluid flow, 29(6), 1638-1649.
|
||||
DOI:10.1016/j.ijheatfluidflow.2008.07.001
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
@ -92,7 +93,7 @@ class SpalartAllmarasIDDES
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
// Model coefficients
|
||||
|
||||
@ -109,7 +110,7 @@ protected:
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Length scale
|
||||
//- Return the length scale
|
||||
virtual tmp<volScalarField> dTilda
|
||||
(
|
||||
const volScalarField& chi,
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2015 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -153,8 +153,8 @@ kOmegaSSTDDES<BasicTurbulenceModel>::kOmegaSSTDDES
|
||||
|
||||
Cd1_
|
||||
(
|
||||
this->useSigma_ ?
|
||||
dimensioned<scalar>::getOrAddToDict
|
||||
this->useSigma_
|
||||
? dimensioned<scalar>::getOrAddToDict
|
||||
(
|
||||
"Cd1Sigma",
|
||||
this->coeffDict_,
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2015 OpenFOAM Foundation
|
||||
Copyright (C) 2019, 2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2019, 2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -32,14 +32,16 @@ Group
|
||||
grpDESTurbulence
|
||||
|
||||
Description
|
||||
k-omega-SST DDES turbulence model for incompressible and compressible flows
|
||||
k-omega-SST DDES turbulence model for incompressible and compressible flows.
|
||||
|
||||
Reference:
|
||||
\verbatim
|
||||
Gritskevich, M.S., Garbaruk, A.V., Schuetze, J., Menter, F.R. (2011)
|
||||
Development of DDES and IDDES Formulations for the k-omega
|
||||
Shear Stress Transport Model, Flow, Turbulence and Combustion,
|
||||
pp. 1-19
|
||||
Gritskevich, M. S., Garbaruk, A. V.,
|
||||
Schütze, J., & Menter, F. R. (2012).
|
||||
Development of DDES and IDDES formulations for
|
||||
the k-ω shear stress transport model.
|
||||
Flow, turbulence and combustion, 88(3), 431-449.
|
||||
DOI:10.1007/s10494-011-9378-4
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
@ -70,7 +72,7 @@ class kOmegaSSTDDES
|
||||
{
|
||||
// Private Member Functions
|
||||
|
||||
//- Shielding function
|
||||
//- Return the shielding function field
|
||||
tmp<volScalarField> fd(const volScalarField& magGradU) const;
|
||||
|
||||
//- No copy construct
|
||||
@ -82,7 +84,7 @@ class kOmegaSSTDDES
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
// Model coefficients
|
||||
|
||||
|
@ -6,8 +6,8 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2015 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2022 Upstream CFD GmbH
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -63,7 +63,7 @@ tmp<volScalarField> kOmegaSSTDES<BasicTurbulenceModel>::r
|
||||
const volScalarField& magGradU
|
||||
) const
|
||||
{
|
||||
const dimensionedScalar eps("SMALL", magGradU.dimensions(), SMALL);
|
||||
const dimensionedScalar eps(magGradU.dimensions(), SMALL);
|
||||
|
||||
tmp<volScalarField> tr =
|
||||
min(nur/(max(magGradU, eps)*sqr(this->kappa_*this->y_)), scalar(10));
|
||||
@ -71,7 +71,6 @@ tmp<volScalarField> kOmegaSSTDES<BasicTurbulenceModel>::r
|
||||
tr.ref().boundaryFieldRef() == 0;
|
||||
|
||||
return tr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -31,13 +31,13 @@ Group
|
||||
grpDESTurbulence
|
||||
|
||||
Description
|
||||
k-omega-SST DES turbulence model for incompressible and compressible flows
|
||||
k-omega-SST DES turbulence model for incompressible and compressible flows.
|
||||
|
||||
Reference:
|
||||
\verbatim
|
||||
Strelets, M. (2001)
|
||||
Detached Eddy Simulation of Massively Separated Flows,
|
||||
39th AIAA Aerospace Sciences Meeting and Exhibit, Reno, NV
|
||||
Strelets, M. (2001).
|
||||
Detached Eddy Simulation of Massively Separated Flows.
|
||||
39th AIAA Aerospace Sciences Meeting and Exhibit, Reno, NV.
|
||||
\endverbatim
|
||||
|
||||
Note
|
||||
@ -51,8 +51,8 @@ SourceFiles
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef kOmegaSSTDES_H
|
||||
#define kOmegaSSTDES_H
|
||||
#ifndef Foam_kOmegaSSTDES_H
|
||||
#define Foam_kOmegaSSTDES_H
|
||||
|
||||
#include "DESModel.H"
|
||||
#include "kOmegaSSTBase.H"
|
||||
@ -65,7 +65,7 @@ namespace LESModels
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
class kOmegaSSTDES Declaration
|
||||
Class kOmegaSSTDES Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class BasicTurbulenceModel>
|
||||
@ -84,7 +84,7 @@ class kOmegaSSTDES
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
//- Switch to activate grey-area enhanced sigma-(D)DES
|
||||
Switch useSigma_;
|
||||
@ -122,7 +122,7 @@ protected:
|
||||
const volTensorField& gradU
|
||||
) const;
|
||||
|
||||
//- Length scale
|
||||
//- Return length scale
|
||||
virtual tmp<volScalarField> dTilda
|
||||
(
|
||||
const volScalarField& magGradU,
|
||||
|
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2015 OpenFOAM Foundation
|
||||
Copyright (C) 2015-2020 OpenCFD Ltd.
|
||||
Copyright (C) 2015-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -117,7 +117,7 @@ tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::dTilda
|
||||
return max
|
||||
(
|
||||
fdTilda*(1 + fe)*lRAS + (1 - fdTilda)*lLES,
|
||||
dimensionedScalar("SMALL", dimLength, SMALL)
|
||||
dimensionedScalar(dimLength, SMALL)
|
||||
);
|
||||
}
|
||||
|
||||
@ -125,7 +125,7 @@ tmp<volScalarField> kOmegaSSTIDDES<BasicTurbulenceModel>::dTilda
|
||||
return max
|
||||
(
|
||||
fdTilda*lRAS + (1 - fdTilda)*lLES,
|
||||
dimensionedScalar("SMALL", dimLength, SMALL)
|
||||
dimensionedScalar(dimLength, SMALL)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2015 OpenFOAM Foundation
|
||||
Copyright (C) 2019 OpenCFD Ltd.
|
||||
Copyright (C) 2019-2022 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -31,15 +31,17 @@ Group
|
||||
grpDESTurbulence
|
||||
|
||||
Description
|
||||
k-omega-SST IDDES turbulence model for incompressible and compressible
|
||||
flows
|
||||
k-omega-SST IDDES turbulence model for
|
||||
incompressible and compressible flows.
|
||||
|
||||
Reference:
|
||||
\verbatim
|
||||
Gritskevich, M.S., Garbaruk, A.V., Schuetze, J., Menter, F.R. (2011)
|
||||
Development of DDES and IDDES Formulations for the k-omega
|
||||
Shear Stress Transport Model, Flow, Turbulence and Combustion,
|
||||
pp. 1-19
|
||||
Gritskevich, M. S., Garbaruk, A. V.,
|
||||
Schütze, J., & Menter, F. R. (2012).
|
||||
Development of DDES and IDDES formulations for
|
||||
the k-ω shear stress transport model.
|
||||
Flow, turbulence and combustion, 88(3), 431-449.
|
||||
DOI:10.1007/s10494-011-9378-4
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
@ -47,8 +49,8 @@ SourceFiles
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef kOmegaSSTIDDES_H
|
||||
#define kOmegaSSTIDDES_H
|
||||
#ifndef Foam_kOmegaSSTIDDES_H
|
||||
#define Foam_kOmegaSSTIDDES_H
|
||||
|
||||
#include "kOmegaSSTDES.H"
|
||||
|
||||
@ -89,7 +91,7 @@ class kOmegaSSTIDDES
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
// Model coefficients
|
||||
|
||||
@ -106,7 +108,7 @@ protected:
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Length scale
|
||||
//- Return the length scale
|
||||
virtual tmp<volScalarField> dTilda
|
||||
(
|
||||
const volScalarField& magGradU,
|
||||
|
@ -50,7 +50,8 @@ void Foam::LESModels::DeltaOmegaTildeDelta::calcDelta()
|
||||
const fvMesh& mesh = turbulenceModel_.mesh();
|
||||
|
||||
const volVectorField& U0 = turbulenceModel_.U();
|
||||
const volVectorField vorticity(fvc::curl(U0));
|
||||
tmp<volVectorField> tvorticity = fvc::curl(U0);
|
||||
const volVectorField& vorticity = tvorticity.cref();
|
||||
const volVectorField nvecvort
|
||||
(
|
||||
vorticity
|
||||
@ -58,10 +59,11 @@ void Foam::LESModels::DeltaOmegaTildeDelta::calcDelta()
|
||||
max
|
||||
(
|
||||
mag(vorticity),
|
||||
dimensionedScalar("SMALL", dimless/dimTime, SMALL)
|
||||
dimensionedScalar(dimless/dimTime, SMALL)
|
||||
)
|
||||
)
|
||||
);
|
||||
tvorticity.clear();
|
||||
|
||||
const cellList& cells = mesh.cells();
|
||||
const vectorField& cellCentres = mesh.cellCentres();
|
||||
@ -73,12 +75,12 @@ void Foam::LESModels::DeltaOmegaTildeDelta::calcDelta()
|
||||
const point& cc = cellCentres[celli];
|
||||
const vector& nv = nvecvort[celli];
|
||||
|
||||
scalar deltaMaxTmp = 0.0;
|
||||
scalar deltaMaxTmp = 0;
|
||||
|
||||
for (const label facei : cFaces)
|
||||
{
|
||||
const point& fc = faceCentres[facei];
|
||||
scalar tmp = 2.0*mag(nv ^ (fc - cc));
|
||||
const scalar tmp = 2.0*mag(nv ^ (fc - cc));
|
||||
|
||||
if (tmp > deltaMaxTmp)
|
||||
{
|
||||
@ -171,7 +173,7 @@ Foam::LESModels::DeltaOmegaTildeDelta::DeltaOmegaTildeDelta
|
||||
|
||||
void Foam::LESModels::DeltaOmegaTildeDelta::read(const dictionary& dict)
|
||||
{
|
||||
const dictionary& coeffsDict(dict.optionalSubDict(type() + "Coeffs"));
|
||||
const dictionary& coeffsDict = dict.optionalSubDict(type() + "Coeffs");
|
||||
|
||||
coeffsDict.readIfPresent<scalar>("deltaCoeff", deltaCoeff_);
|
||||
coeffsDict.readIfPresent<bool>("requireUpdate", requireUpdate_);
|
||||
|
@ -25,7 +25,7 @@ License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::DeltaOmegaTildeDelta
|
||||
Foam::LESModels::DeltaOmegaTildeDelta
|
||||
|
||||
Description
|
||||
Delta formulation that accounts for the orientation of the vorticity
|
||||
@ -37,9 +37,10 @@ Description
|
||||
Reference:
|
||||
\verbatim
|
||||
Shur, M. L., Spalart, P. R., Strelets, M. K., & Travin, A. K. (2015).
|
||||
An enhanced version of DES with rapid transition from RANS to LES in
|
||||
separated flows.
|
||||
Flow, Turbulence and Combustion, 95, 709-737, 2015.
|
||||
An enhanced version of DES with rapid transition
|
||||
from RANS to LES in separated flows.
|
||||
Flow, turbulence and combustion, 95(4), 709-737.
|
||||
DOI:10.1007/s10494-015-9618-0
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
@ -67,7 +68,7 @@ class DeltaOmegaTildeDelta
|
||||
:
|
||||
public LESdelta
|
||||
{
|
||||
// Private data
|
||||
// Private Data
|
||||
|
||||
//- Run-time selectable delta for hmax
|
||||
// Defaults to the maxDeltaxyz model if not supplied
|
||||
@ -82,15 +83,15 @@ class DeltaOmegaTildeDelta
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Calculate the delta values
|
||||
void calcDelta();
|
||||
|
||||
//- No copy construct
|
||||
DeltaOmegaTildeDelta(const DeltaOmegaTildeDelta&) = delete;
|
||||
|
||||
//- No copy assignment
|
||||
void operator=(const DeltaOmegaTildeDelta&) = delete;
|
||||
|
||||
//- Calculate the delta values
|
||||
void calcDelta();
|
||||
|
||||
|
||||
public:
|
||||
|
||||
|
@ -93,7 +93,8 @@ tmp<scalarField> sumNeighbours
|
||||
return tscaling;
|
||||
}
|
||||
|
||||
}
|
||||
} // End namespace Foam
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
@ -101,31 +102,36 @@ namespace Foam
|
||||
{
|
||||
namespace LESModels
|
||||
{
|
||||
defineTypeNameAndDebug(DeltaSLA, 0);
|
||||
addToRunTimeSelectionTable(LESdelta, DeltaSLA, dictionary);
|
||||
defineTypeNameAndDebug(SLADelta, 0);
|
||||
addToRunTimeSelectionTable(LESdelta, SLADelta, dictionary);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
void Foam::LESModels::DeltaSLA::calcDelta()
|
||||
void Foam::LESModels::SLADelta::calcDelta()
|
||||
{
|
||||
const fvMesh& mesh = turbulenceModel_.mesh();
|
||||
|
||||
const volVectorField& U0 = turbulenceModel_.U();
|
||||
const volVectorField vorticity(fvc::curl(U0));
|
||||
const volSymmTensorField S(symm(fvc::grad(U0)));
|
||||
const volScalarField magGradU(mag(fvc::grad(U0)));
|
||||
|
||||
tmp<volScalarField> tnut = turbulenceModel_.nut();
|
||||
const auto& nut = tnut();
|
||||
tmp<volScalarField> tnu = turbulenceModel_.nu();
|
||||
const auto& nu = tnu();
|
||||
const volScalarField& nut = tnut.cref();
|
||||
|
||||
tmp<volScalarField> tnu = turbulenceModel_.nu();
|
||||
const volScalarField& nu = tnu.cref();
|
||||
|
||||
// Calculate vortex tilting measure, VTM
|
||||
const volVectorField& U0 = turbulenceModel_.U();
|
||||
|
||||
tmp<volVectorField> tvorticity = fvc::curl(U0);
|
||||
const volVectorField& vorticity = tvorticity.cref();
|
||||
|
||||
tmp<volSymmTensorField> tS = symm(fvc::grad(U0));
|
||||
const volSymmTensorField& S = tS.cref();
|
||||
|
||||
const dimensionedScalar nuMin(nu.dimensions(), SMALL);
|
||||
const dimensionedScalar eps(dimless/pow3(dimTime), SMALL);
|
||||
|
||||
// Vortex tilting measure, VTM
|
||||
const dimensionedScalar nuMin("SMALL", nu.dimensions(), SMALL);
|
||||
const dimensionedScalar eps("SMALL", dimless/pow3(dimTime), SMALL);
|
||||
volScalarField vtm
|
||||
(
|
||||
max(scalar(1), 0.2*nu/max(nut, nuMin))
|
||||
@ -133,38 +139,45 @@ void Foam::LESModels::DeltaSLA::calcDelta()
|
||||
/max(magSqr(vorticity)*sqrt(3*magSqr(S) - sqr(tr(S))), eps)
|
||||
);
|
||||
vtm.correctBoundaryConditions();
|
||||
tS.clear();
|
||||
|
||||
const dimensionedScalar vortMin(dimless/dimTime, SMALL);
|
||||
const volVectorField nVecVort(vorticity/(max(mag(vorticity), vortMin)));
|
||||
tvorticity.clear();
|
||||
|
||||
|
||||
// Averaged VTM
|
||||
|
||||
// Calculate averaged VTM
|
||||
volScalarField vtmAve("vtmAve", vtm);
|
||||
tmp<scalarField> weights = sumNeighbours(vtm, vtmAve);
|
||||
tmp<scalarField> tweights = sumNeighbours(vtm, vtmAve);
|
||||
|
||||
// Add cell centre values
|
||||
vtmAve += vtm;
|
||||
|
||||
// Weights normalisation (add 1 for cell centres)
|
||||
vtmAve.primitiveFieldRef() /= weights + 1;
|
||||
vtmAve.primitiveFieldRef() /= tweights + 1;
|
||||
|
||||
|
||||
// Compute DDES shielding function
|
||||
// Calculate DDES shielding function, fd
|
||||
const volScalarField& y = wallDist::New(mesh).y();
|
||||
const dimensionedScalar Ueps("eps", magGradU.dimensions(), SMALL);
|
||||
const dimensionedScalar nuEps("eps", nu.dimensions(), ROOTSMALL);
|
||||
const volScalarField rd
|
||||
(
|
||||
|
||||
const dimensionedScalar magGradUeps(dimless/dimTime, SMALL);
|
||||
const dimensionedScalar nuEps(nu.dimensions(), ROOTSMALL);
|
||||
|
||||
tmp<volScalarField> tmagGradU = mag(fvc::grad(U0));
|
||||
|
||||
tmp<volScalarField> trd =
|
||||
min
|
||||
(
|
||||
(nut + nu)/(max(magGradU, Ueps)*sqr(kappa_*y) + nuEps),
|
||||
(nut + nu)/(max(tmagGradU, magGradUeps)*sqr(kappa_*y) + nuEps),
|
||||
scalar(10)
|
||||
)
|
||||
);
|
||||
const volScalarField fd(1.0 - tanh(pow(Cd1_*rd, Cd2_)));
|
||||
);
|
||||
tnut.clear();
|
||||
tnu.clear();
|
||||
|
||||
const volScalarField fd(1.0 - tanh(pow(Cd1_*trd, Cd2_)));
|
||||
|
||||
|
||||
// Assemble delta
|
||||
const dimensionedScalar vortMin("SMALL", dimless/dimTime, SMALL);
|
||||
const volVectorField nVecVort(vorticity/(max(mag(vorticity), vortMin)));
|
||||
|
||||
const cellList& cells = mesh.cells();
|
||||
const vectorField& cellCentres = mesh.cellCentres();
|
||||
const vectorField& faceCentres = mesh.faceCentres();
|
||||
@ -175,12 +188,12 @@ void Foam::LESModels::DeltaSLA::calcDelta()
|
||||
const point& cc = cellCentres[celli];
|
||||
const vector& nv = nVecVort[celli];
|
||||
|
||||
scalar deltaMaxTmp = 0.0;
|
||||
scalar deltaMaxTmp = 0;
|
||||
|
||||
for (const label facei : cFaces)
|
||||
{
|
||||
const point& fc = faceCentres[facei];
|
||||
scalar tmp = 2.0*mag(nv ^ (fc - cc));
|
||||
const scalar tmp = 2.0*mag(nv ^ (fc - cc));
|
||||
|
||||
if (tmp > deltaMaxTmp)
|
||||
{
|
||||
@ -208,7 +221,7 @@ void Foam::LESModels::DeltaSLA::calcDelta()
|
||||
delta_[celli] = deltaCoeff_*deltaMaxTmp*FKH;
|
||||
}
|
||||
|
||||
label nD = mesh.nGeometricD();
|
||||
const label nD = mesh.nGeometricD();
|
||||
|
||||
if (nD == 2)
|
||||
{
|
||||
@ -229,7 +242,7 @@ void Foam::LESModels::DeltaSLA::calcDelta()
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::LESModels::DeltaSLA::DeltaSLA
|
||||
Foam::LESModels::SLADelta::SLADelta
|
||||
(
|
||||
const word& name,
|
||||
const turbulenceModel& turbulence,
|
||||
@ -240,7 +253,7 @@ Foam::LESModels::DeltaSLA::DeltaSLA
|
||||
hmaxPtr_(nullptr),
|
||||
deltaCoeff_
|
||||
(
|
||||
dict.optionalSubDict(type() + "Coeffs").lookupOrDefault<scalar>
|
||||
dict.optionalSubDict(type() + "Coeffs").getOrDefault<scalar>
|
||||
(
|
||||
"deltaCoeff",
|
||||
1.035
|
||||
@ -353,12 +366,20 @@ Foam::LESModels::DeltaSLA::DeltaSLA
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if (mag(a2_ - a1_) < SMALL)
|
||||
{
|
||||
FatalIOErrorInFunction(dict)
|
||||
<< "Model coefficients a1 = " << a1_
|
||||
<< ", and a2 = " << a2_ << " cannot be equal."
|
||||
<< abort(FatalIOError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void Foam::LESModels::DeltaSLA::read(const dictionary& dict)
|
||||
void Foam::LESModels::SLADelta::read(const dictionary& dict)
|
||||
{
|
||||
const dictionary& coeffsDict(dict.optionalSubDict(type() + "Coeffs"));
|
||||
|
||||
@ -377,7 +398,7 @@ void Foam::LESModels::DeltaSLA::read(const dictionary& dict)
|
||||
}
|
||||
|
||||
|
||||
void Foam::LESModels::DeltaSLA::correct()
|
||||
void Foam::LESModels::SLADelta::correct()
|
||||
{
|
||||
if (turbulenceModel_.mesh().changing() && requireUpdate_)
|
||||
{
|
||||
|
@ -25,7 +25,7 @@ License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::LESModels::DeltaSLA
|
||||
Foam::LESModels::SLADelta
|
||||
|
||||
Description
|
||||
Delta formulation that accounts for the orientation of the vorticity vector
|
||||
@ -36,9 +36,10 @@ Description
|
||||
Reference:
|
||||
\verbatim
|
||||
Shur, M. L., Spalart, P. R., Strelets, M. K., & Travin, A. K. (2015).
|
||||
An enhanced version of DES with rapid transition from RANS to LES in
|
||||
separated flows.
|
||||
Flow, Turbulence and Combustion, 95, 709–737, 2015.
|
||||
An enhanced version of DES with rapid transition
|
||||
from RANS to LES in separated flows.
|
||||
Flow, turbulence and combustion, 95(4), 709-737.
|
||||
DOI:10.1007/s10494-015-9618-0
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
@ -46,8 +47,8 @@ SourceFiles
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef LESModels_DeltaSLADelta_H
|
||||
#define LESModels_DeltaSLADelta_H
|
||||
#ifndef LESModels_SLADelta_H
|
||||
#define LESModels_SLADelta_H
|
||||
|
||||
#include "LESdelta.H"
|
||||
|
||||
@ -59,14 +60,14 @@ namespace LESModels
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class DeltaSLA Declaration
|
||||
Class SLADelta Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class DeltaSLA
|
||||
class SLADelta
|
||||
:
|
||||
public LESdelta
|
||||
{
|
||||
// Private data
|
||||
// Private Data
|
||||
|
||||
//- Run-time selectable delta for hmax
|
||||
// Defaults to the maxDeltaxyz model if not supplied
|
||||
@ -89,15 +90,15 @@ class DeltaSLA
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- No copy construct
|
||||
DeltaSLA(const DeltaSLA&) = delete;
|
||||
|
||||
//- No copy assignment
|
||||
void operator=(const DeltaSLA&) = delete;
|
||||
|
||||
// Calculate the delta values
|
||||
void calcDelta();
|
||||
|
||||
//- No copy construct
|
||||
SLADelta(const SLADelta&) = delete;
|
||||
|
||||
//- No copy assignment
|
||||
void operator=(const SLADelta&) = delete;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
@ -108,7 +109,7 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from name, turbulenceModel and IOdictionary
|
||||
DeltaSLA
|
||||
SLADelta
|
||||
(
|
||||
const word& name,
|
||||
const turbulenceModel& turbulence,
|
||||
@ -117,7 +118,7 @@ public:
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~DeltaSLA() = default;
|
||||
virtual ~SLADelta() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
@ -128,10 +128,8 @@ bool sigma<BasicTurbulenceModel>::read()
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
@ -35,10 +35,11 @@ Description
|
||||
|
||||
Reference:
|
||||
\verbatim
|
||||
Nicoud, F., Toda, H., Cabrit, O., Bose, S., & Lee, J. (2011).
|
||||
Using singular values to build a subgrid-scale model for large
|
||||
eddy simulations.
|
||||
Physics of Fluids, 23(8), 5106, 2011.
|
||||
Nicoud, F., Toda, H. B., Cabrit, O., Bose, S., & Lee, J. (2011).
|
||||
Using singular values to build a subgrid-scale
|
||||
model for large eddy simulations.
|
||||
Physics of fluids, 23(8), 085106.
|
||||
DOI:10.1063/1.3623274
|
||||
\endverbatim
|
||||
|
||||
The default model coefficients correspond to the following:
|
||||
@ -93,7 +94,7 @@ class sigma
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
// Protected Data
|
||||
|
||||
dimensionedScalar Ck_;
|
||||
dimensionedScalar Cw_;
|
||||
|
@ -52,18 +52,6 @@ Description
|
||||
Spalart-Allmaras One-Equation Model without ft2 Term (SA-noft2).
|
||||
https://turbmodels.larc.nasa.gov/spalart.html#sanoft2
|
||||
(Retrieved:12-01-2021).
|
||||
|
||||
Estimation expression for k and epsilon (tag:B), Eq. 4.50:
|
||||
Bourgoin, A. (2019).
|
||||
Bathymetry induced turbulence modelling the
|
||||
Alderney Race site: regional approach with TELEMAC-LES.
|
||||
Normandie Université.
|
||||
|
||||
Estimation expressions for omega (tag:P):
|
||||
Pope, S. B. (2000).
|
||||
Turbulent flows.
|
||||
Cambridge, UK: Cambridge Univ. Press
|
||||
DOI:10.1017/CBO9780511840531
|
||||
\endverbatim
|
||||
|
||||
Usage
|
||||
@ -146,7 +134,7 @@ protected:
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Length scale
|
||||
//- Return the length scale
|
||||
virtual tmp<volScalarField> dTilda
|
||||
(
|
||||
const volScalarField& chi,
|
||||
|
Loading…
Reference in New Issue
Block a user