From 267c65e03560bd0b2292944e0109601e94432876 Mon Sep 17 00:00:00 2001 From: Henry <Henry> Date: Thu, 22 Jan 2015 08:53:10 +0000 Subject: [PATCH] Added realizableKE to new turbulence library --- .../turbulentFluidThermoModels.C | 3 + .../turbulentTransportModels.C | 3 + .../RAS/realizableKE/realizableKE.C | 337 ++++++++++++++++++ .../RAS/realizableKE/realizableKE.H | 219 ++++++++++++ 4 files changed, 562 insertions(+) create mode 100644 src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.C create mode 100644 src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.H diff --git a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C index ad86b169aa2..519e15be4aa 100644 --- a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C +++ b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C @@ -57,6 +57,9 @@ makeRASModel(SpalartAllmaras); #include "kEpsilon.H" makeRASModel(kEpsilon); +#include "realizableKE.H" +makeRASModel(realizableKE); + #include "buoyantKEpsilon.H" makeRASModel(buoyantKEpsilon); diff --git a/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C b/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C index c97c42fdbd8..c881910b360 100644 --- a/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C +++ b/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C @@ -55,6 +55,9 @@ makeRASModel(SpalartAllmaras); #include "kEpsilon.H" makeRASModel(kEpsilon); +#include "realizableKE.H" +makeRASModel(realizableKE); + #include "LaunderSharmaKE.H" makeRASModel(LaunderSharmaKE); diff --git a/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.C b/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.C new file mode 100644 index 00000000000..397847bbf63 --- /dev/null +++ b/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.C @@ -0,0 +1,337 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "realizableKE.H" +#include "bound.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace RASModels +{ + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +template<class BasicTurbulenceModel> +tmp<volScalarField> realizableKE<BasicTurbulenceModel>::rCmu +( + const volTensorField& gradU, + const volScalarField& S2, + const volScalarField& magS +) +{ + tmp<volSymmTensorField> tS = dev(symm(gradU)); + const volSymmTensorField& S = tS(); + + volScalarField W + ( + (2*sqrt(2.0))*((S&S)&&S) + /( + magS*S2 + + dimensionedScalar("small", dimensionSet(0, 0, -3, 0, 0), SMALL) + ) + ); + + tS.clear(); + + volScalarField phis + ( + (1.0/3.0)*acos(min(max(sqrt(6.0)*W, -scalar(1)), scalar(1))) + ); + volScalarField As(sqrt(6.0)*cos(phis)); + volScalarField Us(sqrt(S2/2.0 + magSqr(skew(gradU)))); + + return 1.0/(A0_ + As*Us*k_/epsilon_); +} + + +template<class BasicTurbulenceModel> +void realizableKE<BasicTurbulenceModel>::correctNut +( + const volTensorField& gradU, + const volScalarField& S2, + const volScalarField& magS +) +{ + this->nut_ = rCmu(gradU, S2, magS)*sqr(k_)/epsilon_; + this->nut_.correctBoundaryConditions(); +} + + +template<class BasicTurbulenceModel> +void realizableKE<BasicTurbulenceModel>::correctNut() +{ + tmp<volTensorField> tgradU = fvc::grad(this->U_); + volScalarField S2(2*magSqr(dev(symm(tgradU())))); + volScalarField magS(sqrt(S2)); + correctNut(tgradU(), S2, magS); +} + + +template<class BasicTurbulenceModel> +tmp<fvScalarMatrix> realizableKE<BasicTurbulenceModel>::kSource() const +{ + return tmp<fvScalarMatrix> + ( + new fvScalarMatrix + ( + k_, + dimVolume*this->rho_.dimensions()*k_.dimensions() + /dimTime + ) + ); +} + + +template<class BasicTurbulenceModel> +tmp<fvScalarMatrix> realizableKE<BasicTurbulenceModel>::epsilonSource() const +{ + return tmp<fvScalarMatrix> + ( + new fvScalarMatrix + ( + epsilon_, + dimVolume*this->rho_.dimensions()*epsilon_.dimensions() + /dimTime + ) + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class BasicTurbulenceModel> +realizableKE<BasicTurbulenceModel>::realizableKE +( + const alphaField& alpha, + const rhoField& rho, + const volVectorField& U, + const surfaceScalarField& alphaRhoPhi, + const surfaceScalarField& phi, + const transportModel& transport, + const word& propertiesName, + const word& type +) +: + eddyViscosity<RASModel<BasicTurbulenceModel> > + ( + type, + alpha, + rho, + U, + alphaRhoPhi, + phi, + transport, + propertiesName + ), + + Cmu_ + ( + dimensioned<scalar>::lookupOrAddToDict + ( + "Cmu", + this->coeffDict_, + 0.09 + ) + ), + A0_ + ( + dimensioned<scalar>::lookupOrAddToDict + ( + "A0", + this->coeffDict_, + 4.0 + ) + ), + C2_ + ( + dimensioned<scalar>::lookupOrAddToDict + ( + "C2", + this->coeffDict_, + 1.9 + ) + ), + sigmak_ + ( + dimensioned<scalar>::lookupOrAddToDict + ( + "sigmak", + this->coeffDict_, + 1.0 + ) + ), + sigmaEps_ + ( + dimensioned<scalar>::lookupOrAddToDict + ( + "sigmaEps", + this->coeffDict_, + 1.2 + ) + ), + + k_ + ( + IOobject + ( + "k", + this->runTime_.timeName(), + this->mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + this->mesh_ + ), + epsilon_ + ( + IOobject + ( + "epsilon", + this->runTime_.timeName(), + this->mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + this->mesh_ + ) +{ + bound(k_, this->kMin_); + bound(epsilon_, this->epsilonMin_); + + if (type == typeName) + { + correctNut(); + this->printCoeffs(type); + } +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class BasicTurbulenceModel> +bool realizableKE<BasicTurbulenceModel>::read() +{ + if (eddyViscosity<RASModel<BasicTurbulenceModel> >::read()) + { + Cmu_.readIfPresent(this->coeffDict()); + A0_.readIfPresent(this->coeffDict()); + C2_.readIfPresent(this->coeffDict()); + sigmak_.readIfPresent(this->coeffDict()); + sigmaEps_.readIfPresent(this->coeffDict()); + + return true; + } + else + { + return false; + } +} + + +template<class BasicTurbulenceModel> +void realizableKE<BasicTurbulenceModel>::correct() +{ + if (!this->turbulence_) + { + return; + } + + // Local references + const alphaField& alpha = this->alpha_; + const rhoField& rho = this->rho_; + const surfaceScalarField& alphaRhoPhi = this->alphaRhoPhi_; + const volVectorField& U = this->U_; + volScalarField& nut = this->nut_; + + eddyViscosity<RASModel<BasicTurbulenceModel> >::correct(); + + volScalarField divU(fvc::div(fvc::absolute(this->phi(), U))); + + tmp<volTensorField> tgradU = fvc::grad(U); + volScalarField S2(2*magSqr(dev(symm(tgradU())))); + volScalarField magS(sqrt(S2)); + + volScalarField eta(magS*k_/epsilon_); + volScalarField C1(max(eta/(scalar(5) + eta), scalar(0.43))); + + volScalarField G(this->GName(), nut*(tgradU() && dev(twoSymm(tgradU())))); + + // Update epsilon and G at the wall + epsilon_.boundaryField().updateCoeffs(); + + // Dissipation equation + tmp<fvScalarMatrix> epsEqn + ( + fvm::ddt(alpha, rho, epsilon_) + + fvm::div(alphaRhoPhi, epsilon_) + - fvm::laplacian(alpha*rho*DepsilonEff(), epsilon_) + == + C1*alpha*rho*magS*epsilon_ + - fvm::Sp + ( + C2_*alpha*rho*epsilon_/(k_ + sqrt(this->nu()*epsilon_)), + epsilon_ + ) + + epsilonSource() + ); + + epsEqn().relax(); + + epsEqn().boundaryManipulate(epsilon_.boundaryField()); + + solve(epsEqn); + bound(epsilon_, this->epsilonMin_); + + + // Turbulent kinetic energy equation + + tmp<fvScalarMatrix> kEqn + ( + fvm::ddt(alpha, rho, k_) + + fvm::div(alphaRhoPhi, k_) + - fvm::laplacian(alpha*rho*DkEff(), k_) + == + alpha*rho*G + - fvm::SuSp(2.0/3.0*alpha*rho*divU, k_) + - fvm::Sp(alpha*rho*epsilon_/k_, k_) + + kSource() + ); + + kEqn().relax(); + solve(kEqn); + bound(k_, this->kMin_); + + correctNut(tgradU(), S2, magS); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace RASModels +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.H b/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.H new file mode 100644 index 00000000000..2279145b265 --- /dev/null +++ b/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.H @@ -0,0 +1,219 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::RASModels::realizableKE + +Group + grpRASTurbulence + +Description + Realizable k-epsilon turbulence model for incompressible and compressible + flows. + + Model described in the paper: + \verbatim + "A New k-epsilon Eddy Viscosity Model for High Reynolds Number + Turbulent Flows" + + Tsan-Hsing Shih, William W. Liou, Aamir Shabbir, Zhigang Tang and + Jiang Zhu + + Computers and Fluids Vol. 24, No. 3, pp. 227-238, 1995 + \endverbatim + + The default model coefficients correspond to the following: + \verbatim + realizableKECoeffs + { + Cmu 0.09; + A0 4.0; + C2 1.9; + sigmak 1.0; + sigmaEps 1.2; + } + \endverbatim + +SourceFiles + realizableKE.C + +\*---------------------------------------------------------------------------*/ + +#ifndef realizableKE_H +#define realizableKE_H + +#include "RASModel.H" +#include "eddyViscosity.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace RASModels +{ + +/*---------------------------------------------------------------------------*\ + Class realizableKE Declaration +\*---------------------------------------------------------------------------*/ + +template<class BasicTurbulenceModel> +class realizableKE +: + public eddyViscosity<RASModel<BasicTurbulenceModel> > +{ + +protected: + + // Protected data + + // Model coefficients + + dimensionedScalar Cmu_; + dimensionedScalar A0_; + dimensionedScalar C2_; + dimensionedScalar sigmak_; + dimensionedScalar sigmaEps_; + + + // Fields + + volScalarField k_; + volScalarField epsilon_; + + + // Protected Member Functions + + tmp<volScalarField> rCmu + ( + const volTensorField& gradU, + const volScalarField& S2, + const volScalarField& magS + ); + + virtual void correctNut + ( + const volTensorField& gradU, + const volScalarField& S2, + const volScalarField& magS + ); + + virtual void correctNut(); + virtual tmp<fvScalarMatrix> kSource() const; + virtual tmp<fvScalarMatrix> epsilonSource() const; + + +public: + + typedef typename BasicTurbulenceModel::alphaField alphaField; + typedef typename BasicTurbulenceModel::rhoField rhoField; + typedef typename BasicTurbulenceModel::transportModel transportModel; + + + //- Runtime type information + TypeName("realizableKE"); + + // Constructors + + //- Construct from components + realizableKE + ( + const alphaField& alpha, + const rhoField& rho, + const volVectorField& U, + const surfaceScalarField& alphaRhoPhi, + const surfaceScalarField& phi, + const transportModel& transport, + const word& propertiesName = turbulenceModel::propertiesName, + const word& type = typeName + ); + + + //- Destructor + virtual ~realizableKE() + {} + + + // Member Functions + + //- Re-read model coefficients if they have changed + virtual bool read(); + + //- Return the effective diffusivity for k + tmp<volScalarField> DkEff() const + { + return tmp<volScalarField> + ( + new volScalarField + ( + "DkEff", + (this->nut_/sigmak_ + this->nu()) + ) + ); + } + + //- Return the effective diffusivity for epsilon + tmp<volScalarField> DepsilonEff() const + { + return tmp<volScalarField> + ( + new volScalarField + ( + "DepsilonEff", + (this->nut_/sigmaEps_ + this->nu()) + ) + ); + } + + //- Return the turbulence kinetic energy + virtual tmp<volScalarField> k() const + { + return k_; + } + + //- Return the turbulence kinetic energy dissipation rate + virtual tmp<volScalarField> epsilon() const + { + return epsilon_; + } + + //- Solve the turbulence equations and correct the turbulence viscosity + virtual void correct(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace RASModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "realizableKE.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // -- GitLab