diff --git a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C index 048ea5ee57ca3847b318b6a5ee78238b5e31aa0e..ae6604679c3e50f00545e623a11365ffd932e43f 100644 --- a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C +++ b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C @@ -34,6 +34,8 @@ License #include "RASModel.H" #include "LESModel.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + makeBaseTurbulenceModel ( geometricOneField, @@ -51,6 +53,11 @@ makeBaseTurbulenceModel makeTemplatedTurbulenceModel \ (fluidThermothermalDiffusivity, LES, Type) + +// -------------------------------------------------------------------------- // +// RAS models +// -------------------------------------------------------------------------- // + #include "SpalartAllmaras.H" makeRASModel(SpalartAllmaras); @@ -85,12 +92,19 @@ makeRASModel(LRR); makeRASModel(SSG); +// -------------------------------------------------------------------------- // +// LES models +// -------------------------------------------------------------------------- // + #include "Smagorinsky.H" makeLESModel(Smagorinsky); #include "WALE.H" makeLESModel(WALE); +#include "dynamicLagrangian.H" +makeLESModel(dynamicLagrangian); + #include "kEqn.H" makeLESModel(kEqn); diff --git a/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C b/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C index ac9c460de2334df56164fa52218122b3cc2f25ae..521ae9d4dd1632b3e5e1214f879664e1d6024126 100644 --- a/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C +++ b/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C @@ -32,6 +32,8 @@ License #include "RASModel.H" #include "LESModel.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + makeBaseTurbulenceModel ( geometricOneField, @@ -49,6 +51,11 @@ makeBaseTurbulenceModel makeTemplatedTurbulenceModel \ (transportModelIncompressibleTurbulenceModel, LES, Type) + +// -------------------------------------------------------------------------- // +// RAS models +// -------------------------------------------------------------------------- // + #include "SpalartAllmaras.H" makeRASModel(SpalartAllmaras); @@ -80,12 +87,19 @@ makeRASModel(LRR); makeRASModel(SSG); +// -------------------------------------------------------------------------- // +// LES models +// -------------------------------------------------------------------------- // + #include "Smagorinsky.H" makeLESModel(Smagorinsky); #include "WALE.H" makeLESModel(WALE); +#include "dynamicLagrangian.H" +makeLESModel(dynamicLagrangian); + #include "kEqn.H" makeLESModel(kEqn); diff --git a/src/TurbulenceModels/turbulenceModels/LES/dynamicKEqn/dynamicKEqn.H b/src/TurbulenceModels/turbulenceModels/LES/dynamicKEqn/dynamicKEqn.H index 4c2ec87683bd803320bc8dde374d435a9e55a68f..d9e9ef47cb2563426a0f95186e7a7b61fb038f14 100644 --- a/src/TurbulenceModels/turbulenceModels/LES/dynamicKEqn/dynamicKEqn.H +++ b/src/TurbulenceModels/turbulenceModels/LES/dynamicKEqn/dynamicKEqn.H @@ -61,7 +61,6 @@ SourceFiles #include "LESeddyViscosity.H" #include "simpleFilter.H" -#include "LESfilter.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/TurbulenceModels/turbulenceModels/LES/dynamicLagrangian/dynamicLagrangian.C b/src/TurbulenceModels/turbulenceModels/LES/dynamicLagrangian/dynamicLagrangian.C new file mode 100644 index 0000000000000000000000000000000000000000..4e5039d994732f9f534614918434762bbae434a3 --- /dev/null +++ b/src/TurbulenceModels/turbulenceModels/LES/dynamicLagrangian/dynamicLagrangian.C @@ -0,0 +1,229 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 "dynamicLagrangian.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace LESModels +{ + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class BasicTurbulenceModel> +void dynamicLagrangian<BasicTurbulenceModel>::correctNut +( + const tmp<volTensorField>& gradU +) +{ + this->nut_ = (flm_/fmm_)*sqr(this->delta())*mag(dev(symm(gradU))); + this->nut_.correctBoundaryConditions(); +} + + +template<class BasicTurbulenceModel> +void dynamicLagrangian<BasicTurbulenceModel>::correctNut() +{ + correctNut(fvc::grad(this->U_)); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class BasicTurbulenceModel> +dynamicLagrangian<BasicTurbulenceModel>::dynamicLagrangian +( + const alphaField& alpha, + const rhoField& rho, + const volVectorField& U, + const surfaceScalarField& alphaRhoPhi, + const surfaceScalarField& phi, + const transportModel& transport, + const word& propertiesName, + const word& type +) +: + LESeddyViscosity<BasicTurbulenceModel> + ( + type, + alpha, + rho, + U, + alphaRhoPhi, + phi, + transport, + propertiesName + ), + + flm_ + ( + IOobject + ( + IOobject::groupName("flm", this->U_.group()), + this->runTime_.timeName(), + this->mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + this->mesh_ + ), + fmm_ + ( + IOobject + ( + IOobject::groupName("fmm", this->U_.group()), + this->runTime_.timeName(), + this->mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + this->mesh_ + ), + theta_ + ( + dimensioned<scalar>::lookupOrAddToDict + ( + "theta", + this->coeffDict_, + 1.5 + ) + ), + + simpleFilter_(U.mesh()), + filterPtr_(LESfilter::New(U.mesh(), this->coeffDict())), + filter_(filterPtr_()), + + flm0_("flm0", flm_.dimensions(), 0.0), + fmm0_("fmm0", fmm_.dimensions(), VSMALL) +{ + if (type == typeName) + { + correctNut(); + this->printCoeffs(type); + } +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class BasicTurbulenceModel> +bool dynamicLagrangian<BasicTurbulenceModel>::read() +{ + if (LESeddyViscosity<BasicTurbulenceModel>::read()) + { + filter_.read(this->coeffDict()); + theta_.readIfPresent(this->coeffDict()); + + return true; + } + else + { + return false; + } +} + + +template<class BasicTurbulenceModel> +void dynamicLagrangian<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_; + + LESeddyViscosity<BasicTurbulenceModel>::correct(); + + tmp<volTensorField> tgradU(fvc::grad(U)); + const volTensorField& gradU = tgradU(); + + volSymmTensorField S(dev(symm(gradU()))); + volScalarField magS(mag(S)); + + volVectorField Uf(filter_(U)); + volSymmTensorField Sf(dev(symm(fvc::grad(Uf)))); + volScalarField magSf(mag(Sf)); + + volSymmTensorField L(dev(filter_(sqr(U)) - (sqr(filter_(U))))); + volSymmTensorField M + ( + 2.0*sqr(this->delta())*(filter_(magS*S) - 4.0*magSf*Sf) + ); + + volScalarField invT + ( + (1.0/(theta_.value()*this->delta()))*pow(flm_*fmm_, 1.0/8.0) + ); + + volScalarField LM(L && M); + + fvScalarMatrix flmEqn + ( + fvm::ddt(flm_) + + fvm::div(phi(), flm_) + == + invT*LM + - fvm::Sp(invT, flm_) + ); + + flmEqn.relax(); + flmEqn.solve(); + + bound(flm_, flm0_); + + volScalarField MM(M && M); + + fvScalarMatrix fmmEqn + ( + fvm::ddt(fmm_) + + fvm::div(phi(), fmm_) + == + invT*MM + - fvm::Sp(invT, fmm_) + ); + + fmmEqn.relax(); + fmmEqn.solve(); + + bound(fmm_, fmm0_); + + correctNut(gradU); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace LESModels +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/TurbulenceModels/turbulenceModels/LES/dynamicLagrangian/dynamicLagrangian.H b/src/TurbulenceModels/turbulenceModels/LES/dynamicLagrangian/dynamicLagrangian.H new file mode 100644 index 0000000000000000000000000000000000000000..8b20d6207d45fd248197a12508b9f66a38c64196 --- /dev/null +++ b/src/TurbulenceModels/turbulenceModels/LES/dynamicLagrangian/dynamicLagrangian.H @@ -0,0 +1,173 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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::LESModels::dynamicLagrangian + +Group + grpLESTurbulence + +Description + Dynamic SGS model with Lagrangian averaging + + Reference: + \verbatim + Meneveau, C., Lund, T. S., & Cabot, W. H. (1996). + A Lagrangian dynamic subgrid-scale model of turbulence. + Journal of Fluid Mechanics, 319, 353-385. + \endverbatim + +SourceFiles + dynamicLagrangian.C + +\*---------------------------------------------------------------------------*/ + +#ifndef dynamicLagrangian_H +#define dynamicLagrangian_H + +#include "LESeddyViscosity.H" +#include "simpleFilter.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace LESModels +{ + +/*---------------------------------------------------------------------------*\ + Class dynamicLagrangian Declaration +\*---------------------------------------------------------------------------*/ + +template<class BasicTurbulenceModel> +class dynamicLagrangian +: + public LESeddyViscosity<BasicTurbulenceModel> +{ + // Private Member Functions + + // Disallow default bitwise copy construct and assignment + dynamicLagrangian(const dynamicLagrangian&); + dynamicLagrangian& operator=(const dynamicLagrangian&); + + +protected: + + // Protected data + + volScalarField flm_; + volScalarField fmm_; + + dimensionedScalar theta_; + + simpleFilter simpleFilter_; + autoPtr<LESfilter> filterPtr_; + LESfilter& filter_; + + dimensionedScalar flm0_; + dimensionedScalar fmm0_; + + + // Protected Member Functions + + //- Update sub-grid eddy-viscosity + void correctNut(const tmp<volTensorField>& gradU); + + virtual void correctNut(); + + +public: + + typedef typename BasicTurbulenceModel::alphaField alphaField; + typedef typename BasicTurbulenceModel::rhoField rhoField; + typedef typename BasicTurbulenceModel::transportModel transportModel; + + //- Runtime type information + TypeName("dynamicLagrangian"); + + + // Constructors + + //- Construct from components + dynamicLagrangian + ( + 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 ~dynamicLagrangian() + {} + + + // Member Functions + + //- Read model coefficients if they have changed + virtual bool read(); + + //- Return SGS kinetic energy + tmp<volScalarField> k(const tmp<volTensorField>& gradU) const + { + return + pow(2.0*flm_/fmm_, 2.0/3.0) + * pow(this->Ce_, -2.0/3.0) + * sqr(this->delta())*magSqr(dev(symm(gradU))); + } + + //- Return SGS kinetic energy + virtual tmp<volScalarField> k() const + { + return k(fvc::grad(this->U_)); + } + + //- Return the effective diffusivity for k + tmp<volScalarField> DkEff() const + { + return tmp<volScalarField> + ( + new volScalarField("DkEff", this->nut_ + this->nu()) + ); + } + + //- Correct Eddy-Viscosity and related properties + virtual void correct(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace LESModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //