TurbulenceModels::kOmegaSST.*: Updated source-terms and associated functions to use volScalarField::Internal

This is more efficient, avoids divide-by-0 when evaluating unnecessary
boundary values and avoids unnecessary communications when running in parallel.
This commit is contained in:
Henry Weller 2016-07-28 13:48:38 +01:00
parent 4f6117e973
commit 02dd85167e
7 changed files with 109 additions and 73 deletions

View file

@ -150,6 +150,7 @@ protected:
// Protected data // Protected data
// Model coefficients // Model coefficients
dimensionedScalar Cmub_; dimensionedScalar Cmub_;

View file

@ -135,13 +135,25 @@ void kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::correctNut()
template<class TurbulenceModel, class BasicTurbulenceModel> template<class TurbulenceModel, class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::epsilonByk tmp<volScalarField::Internal>
kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::Pk
( (
const volScalarField& F1, const volScalarField::Internal& G
const volScalarField& F2
) const ) const
{ {
return betaStar_*omega_; return min(G, (c1_*betaStar_)*this->k_()*this->omega_());
}
template<class TurbulenceModel, class BasicTurbulenceModel>
tmp<volScalarField::Internal>
kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::epsilonByk
(
const volScalarField::Internal& F1,
const volScalarField::Internal& F2
) const
{
return betaStar_*omega_();
} }
@ -178,9 +190,9 @@ kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::omegaSource() const
template<class TurbulenceModel, class BasicTurbulenceModel> template<class TurbulenceModel, class BasicTurbulenceModel>
tmp<fvScalarMatrix> kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::Qsas tmp<fvScalarMatrix> kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::Qsas
( (
const volScalarField& S2, const volScalarField::Internal& S2,
const volScalarField& gamma, const volScalarField::Internal& gamma,
const volScalarField& beta const volScalarField::Internal& beta
) const ) const
{ {
return tmp<fvScalarMatrix> return tmp<fvScalarMatrix>
@ -419,12 +431,15 @@ void kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::correct()
BasicTurbulenceModel::correct(); BasicTurbulenceModel::correct();
volScalarField divU(fvc::div(fvc::absolute(this->phi(), U))); volScalarField::Internal divU
(
fvc::div(fvc::absolute(this->phi(), U))()()
);
tmp<volTensorField> tgradU = fvc::grad(U); tmp<volTensorField> tgradU = fvc::grad(U);
volScalarField S2(2*magSqr(symm(tgradU()))); volScalarField S2(2*magSqr(symm(tgradU())));
volScalarField GbyNu((tgradU() && dev(twoSymm(tgradU())))); volScalarField::Internal GbyNu(dev(twoSymm(tgradU()())) && tgradU()());
volScalarField G(this->GName(), nut*GbyNu); volScalarField::Internal G(this->GName(), nut()*GbyNu);
tgradU.clear(); tgradU.clear();
// Update omega and G at the wall // Update omega and G at the wall
@ -439,8 +454,8 @@ void kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::correct()
volScalarField F23(this->F23()); volScalarField F23(this->F23());
{ {
volScalarField gamma(this->gamma(F1)); volScalarField::Internal gamma(this->gamma(F1));
volScalarField beta(this->beta(F1)); volScalarField::Internal beta(this->beta(F1));
// Turbulent frequency equation // Turbulent frequency equation
tmp<fvScalarMatrix> omegaEqn tmp<fvScalarMatrix> omegaEqn
@ -449,20 +464,21 @@ void kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::correct()
+ fvm::div(alphaRhoPhi, omega_) + fvm::div(alphaRhoPhi, omega_)
- fvm::laplacian(alpha*rho*DomegaEff(F1), omega_) - fvm::laplacian(alpha*rho*DomegaEff(F1), omega_)
== ==
alpha*rho*gamma alpha()*rho()*gamma
*min *min
( (
GbyNu, GbyNu,
(c1_/a1_)*betaStar_*omega_*max(a1_*omega_, b1_*F23*sqrt(S2)) (c1_/a1_)*betaStar_*omega_()
*max(a1_*omega_(), b1_*F23()*sqrt(S2()))
) )
- fvm::SuSp((2.0/3.0)*alpha*rho*gamma*divU, omega_) - fvm::SuSp((2.0/3.0)*alpha()*rho()*gamma*divU, omega_)
- fvm::Sp(alpha*rho*beta*omega_, omega_) - fvm::Sp(alpha()*rho()*beta*omega_(), omega_)
- fvm::SuSp - fvm::SuSp
( (
alpha*rho*(F1 - scalar(1))*CDkOmega/omega_, alpha()*rho()*(F1() - scalar(1))*CDkOmega()/omega_(),
omega_ omega_
) )
+ Qsas(S2, gamma, beta) + Qsas(S2(), gamma, beta)
+ omegaSource() + omegaSource()
+ fvOptions(alpha, rho, omega_) + fvOptions(alpha, rho, omega_)
); );
@ -482,9 +498,9 @@ void kOmegaSST<TurbulenceModel, BasicTurbulenceModel>::correct()
+ fvm::div(alphaRhoPhi, k_) + fvm::div(alphaRhoPhi, k_)
- fvm::laplacian(alpha*rho*DkEff(F1), k_) - fvm::laplacian(alpha*rho*DkEff(F1), k_)
== ==
min(alpha*rho*G, (c1_*betaStar_)*alpha*rho*k_*omega_) alpha()*rho()*Pk(G)
- fvm::SuSp((2.0/3.0)*alpha*rho*divU, k_) - fvm::SuSp((2.0/3.0)*alpha()*rho()*divU, k_)
- fvm::Sp(alpha*rho*epsilonByk(F1, F23), k_) - fvm::Sp(alpha()*rho()*epsilonByk(F1, F23), k_)
+ kSource() + kSource()
+ fvOptions(alpha, rho, k_) + fvOptions(alpha, rho, k_)
); );

View file

@ -162,12 +162,12 @@ protected:
volScalarField omega_; volScalarField omega_;
// Private Member Functions // Protected Member Functions
tmp<volScalarField> F1(const volScalarField& CDkOmega) const; virtual tmp<volScalarField> F1(const volScalarField& CDkOmega) const;
tmp<volScalarField> F2() const; virtual tmp<volScalarField> F2() const;
tmp<volScalarField> F3() const; virtual tmp<volScalarField> F3() const;
tmp<volScalarField> F23() const; virtual tmp<volScalarField> F23() const;
tmp<volScalarField> blend tmp<volScalarField> blend
( (
@ -179,6 +179,16 @@ protected:
return F1*(psi1 - psi2) + psi2; return F1*(psi1 - psi2) + psi2;
} }
tmp<volScalarField::Internal> blend
(
const volScalarField::Internal& F1,
const dimensionedScalar& psi1,
const dimensionedScalar& psi2
) const
{
return F1*(psi1 - psi2) + psi2;
}
tmp<volScalarField> alphaK(const volScalarField& F1) const tmp<volScalarField> alphaK(const volScalarField& F1) const
{ {
return blend(F1, alphaK1_, alphaK2_); return blend(F1, alphaK1_, alphaK2_);
@ -189,28 +199,37 @@ protected:
return blend(F1, alphaOmega1_, alphaOmega2_); return blend(F1, alphaOmega1_, alphaOmega2_);
} }
tmp<volScalarField> beta(const volScalarField& F1) const tmp<volScalarField::Internal> beta
(
const volScalarField::Internal& F1
) const
{ {
return blend(F1, beta1_, beta2_); return blend(F1, beta1_, beta2_);
} }
tmp<volScalarField> gamma(const volScalarField& F1) const tmp<volScalarField::Internal> gamma
(
const volScalarField::Internal& F1
) const
{ {
return blend(F1, gamma1_, gamma2_); return blend(F1, gamma1_, gamma2_);
} }
void correctNut(const volScalarField& S2, const volScalarField& F2); void correctNut(const volScalarField& S2, const volScalarField& F2);
// Protected Member Functions
virtual void correctNut(); virtual void correctNut();
//- Return epsilon/k which for standard RAS is betaStar*omega //- Return k production rate
virtual tmp<volScalarField> epsilonByk virtual tmp<volScalarField::Internal> Pk
( (
const volScalarField& F1, const volScalarField::Internal& G
const volScalarField& F2 ) const;
//- Return epsilon/k which for standard RAS is betaStar*omega
virtual tmp<volScalarField::Internal> epsilonByk
(
const volScalarField::Internal& F1,
const volScalarField::Internal& F2
) const; ) const;
virtual tmp<fvScalarMatrix> kSource() const; virtual tmp<fvScalarMatrix> kSource() const;
@ -219,9 +238,9 @@ protected:
virtual tmp<fvScalarMatrix> Qsas virtual tmp<fvScalarMatrix> Qsas
( (
const volScalarField& S2, const volScalarField::Internal& S2,
const volScalarField& gamma, const volScalarField::Internal& gamma,
const volScalarField& beta const volScalarField::Internal& beta
) const; ) const;

View file

@ -35,27 +35,27 @@ namespace LESModels
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTDES<BasicTurbulenceModel>::Lt() const tmp<volScalarField::Internal> kOmegaSSTDES<BasicTurbulenceModel>::Lt() const
{ {
return sqrt(this->k_)/(this->betaStar_*this->omega_); return sqrt(this->k_())/(this->betaStar_*this->omega_());
} }
template<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTDES<BasicTurbulenceModel>::FDES tmp<volScalarField::Internal> kOmegaSSTDES<BasicTurbulenceModel>::FDES
( (
const volScalarField& F1, const volScalarField::Internal& F1,
const volScalarField& F2 const volScalarField::Internal& F2
) const ) const
{ {
switch (FSST_) switch (FSST_)
{ {
case 0: case 0:
return max(Lt()/(CDES_*this->delta()), scalar(1)); return max(Lt()/(CDES_*this->delta()()), scalar(1));
case 1: case 1:
return max(Lt()*(1 - F1)/(CDES_*this->delta()), scalar(1)); return max(Lt()*(1 - F1)/(CDES_*this->delta()()), scalar(1));
case 2: case 2:
return max(Lt()*(1 - F2)/(CDES_*this->delta()), scalar(1)); return max(Lt()*(1 - F2)/(CDES_*this->delta()()), scalar(1));
default: default:
FatalErrorInFunction FatalErrorInFunction
<< "Incorrect FSST = " << FSST_ << ", should be 0, 1 or 2" << "Incorrect FSST = " << FSST_ << ", should be 0, 1 or 2"
@ -66,13 +66,13 @@ tmp<volScalarField> kOmegaSSTDES<BasicTurbulenceModel>::FDES
template<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<volScalarField> kOmegaSSTDES<BasicTurbulenceModel>::epsilonByk tmp<volScalarField::Internal> kOmegaSSTDES<BasicTurbulenceModel>::epsilonByk
( (
const volScalarField& F1, const volScalarField::Internal& F1,
const volScalarField& F2 const volScalarField::Internal& F2
) const ) const
{ {
return this->betaStar_*this->omega_*FDES(F1, F2); return this->betaStar_*this->omega_()*FDES(F1, F2);
} }

View file

@ -101,21 +101,21 @@ protected:
// Protected Member Functions // Protected Member Functions
//- Return the turbulent length-scale //- Return the turbulent length-scale
tmp<volScalarField> Lt() const; tmp<volScalarField::Internal> Lt() const;
//- The DES dissipation-rate multiplier with options zonal filtering //- The DES dissipation-rate multiplier with options zonal filtering
// based on either F1 or F2 // based on either F1 or F2
virtual tmp<volScalarField> FDES virtual tmp<volScalarField::Internal> FDES
( (
const volScalarField& F1, const volScalarField::Internal& F1,
const volScalarField& F2 const volScalarField::Internal& F2
) const; ) const;
//- Return epsilon/k which for standard RAS is betaStar*omega //- Return epsilon/k which for standard RAS is betaStar*omega
virtual tmp<volScalarField> epsilonByk virtual tmp<volScalarField::Internal> epsilonByk
( (
const volScalarField& F1, const volScalarField::Internal& F1,
const volScalarField& F2 const volScalarField::Internal& F2
) const; ) const;

View file

@ -37,23 +37,23 @@ namespace RASModels
template<class BasicTurbulenceModel> template<class BasicTurbulenceModel>
tmp<fvScalarMatrix> kOmegaSSTSAS<BasicTurbulenceModel>::Qsas tmp<fvScalarMatrix> kOmegaSSTSAS<BasicTurbulenceModel>::Qsas
( (
const volScalarField& S2, const volScalarField::Internal& S2,
const volScalarField& gamma, const volScalarField::Internal& gamma,
const volScalarField& beta const volScalarField::Internal& beta
) const ) const
{ {
volScalarField L volScalarField::Internal L
( (
sqrt(this->k_)/(pow025(this->betaStar_)*this->omega_) sqrt(this->k_())/(pow025(this->betaStar_)*this->omega_())
); );
volScalarField Lvk volScalarField::Internal Lvk
( (
max max
( (
kappa_*sqrt(S2) kappa_*sqrt(S2)
/( /(
mag(fvc::laplacian(this->U_)) mag(fvc::laplacian(this->U_))()()
+ dimensionedScalar + dimensionedScalar
( (
"ROOTVSMALL", "ROOTVSMALL",
@ -61,29 +61,29 @@ tmp<fvScalarMatrix> kOmegaSSTSAS<BasicTurbulenceModel>::Qsas
ROOTVSMALL ROOTVSMALL
) )
), ),
Cs_*sqrt(kappa_*zeta2_/(beta/this->betaStar_ - gamma))*delta() Cs_*sqrt(kappa_*zeta2_/(beta/this->betaStar_ - gamma))*delta()()
) )
); );
return fvm::Su return fvm::Su
( (
this->alpha_*this->rho_ this->alpha_()*this->rho_()
*min *min
( (
max max
( (
zeta2_*kappa_*S2*sqr(L/Lvk) zeta2_*kappa_*S2*sqr(L/Lvk)
- (2*C_/sigmaPhi_)*this->k_ - (2*C_/sigmaPhi_)*this->k_()
*max *max
( (
magSqr(fvc::grad(this->omega_))/sqr(this->omega_), magSqr(fvc::grad(this->omega_)()())/sqr(this->omega_()),
magSqr(fvc::grad(this->k_))/sqr(this->k_) magSqr(fvc::grad(this->k_)()())/sqr(this->k_())
), ),
dimensionedScalar("0", dimensionSet(0, 0, -2, 0, 0), 0) dimensionedScalar("0", dimensionSet(0, 0, -2, 0, 0), 0)
), ),
// Limit SAS production of omega for numerical stability, // Limit SAS production of omega for numerical stability,
// particularly during start-up // particularly during start-up
this->omega_/(0.1*this->omega_.time().deltaT()) this->omega_()/(0.1*this->omega_.time().deltaT())
), ),
this->omega_ this->omega_
); );

View file

@ -131,9 +131,9 @@ protected:
//- SAS omega source //- SAS omega source
virtual tmp<fvScalarMatrix> Qsas virtual tmp<fvScalarMatrix> Qsas
( (
const volScalarField& S2, const volScalarField::Internal& S2,
const volScalarField& gamma, const volScalarField::Internal& gamma,
const volScalarField& beta const volScalarField::Internal& beta
) const; ) const;