diff --git a/src/turbulenceModels/LES/LESdeltas/Make/files b/src/turbulenceModels/LES/LESdeltas/Make/files index a251397639..b7d627cb48 100644 --- a/src/turbulenceModels/LES/LESdeltas/Make/files +++ b/src/turbulenceModels/LES/LESdeltas/Make/files @@ -2,5 +2,6 @@ LESdelta/LESdelta.C cubeRootVolDelta/cubeRootVolDelta.C PrandtlDelta/PrandtlDelta.C smoothDelta/smoothDelta.C +maxhxhyhzDelta/maxhxhyhzDelta.C LIB = $(FOAM_LIBBIN)/libLESdeltas diff --git a/src/turbulenceModels/LES/LESdeltas/maxhxhyhzDelta/maxhxhyhzDelta.C b/src/turbulenceModels/LES/LESdeltas/maxhxhyhzDelta/maxhxhyhzDelta.C new file mode 100644 index 0000000000..0ba1d63b1a --- /dev/null +++ b/src/turbulenceModels/LES/LESdeltas/maxhxhyhzDelta/maxhxhyhzDelta.C @@ -0,0 +1,142 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd. + \\/ 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 . + +\*---------------------------------------------------------------------------*/ + +#include "maxhxhyhzDelta.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(maxhxhyhzDelta, 0); +addToRunTimeSelectionTable(LESdelta, maxhxhyhzDelta, dictionary); + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void maxhxhyhzDelta::calcDelta() +{ + label nD = mesh().nGeometricD(); + + tmp hmax + ( + new volScalarField + ( + IOobject + ( + "hmax", + mesh().time().timeName(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensionedScalar("zrero", dimLength, 0.0) + ) + ); + + const cellList& cells = mesh().cells(); + + forAll(cells,cellI) + { + scalar deltaMaxTmp = 0.0; + const labelList& cFaces = mesh().cells()[cellI]; + const point& centrevector = mesh().cellCentres()[cellI]; + + forAll(cFaces, cFaceI) + { + label faceI = cFaces[cFaceI]; + const point& facevector = mesh().faceCentres()[faceI]; + scalar tmp = mag(facevector - centrevector); + if (tmp > deltaMaxTmp) + { + deltaMaxTmp = tmp; + } + } + hmax()[cellI] = deltaCoeff_*deltaMaxTmp; + } + + if (nD == 3) + { + delta_.internalField() = hmax(); + } + else if (nD == 2) + { + WarningIn("maxhxhyhzDelta::calcDelta()") + << "Case is 2D, LES is not strictly applicable\n" + << endl; + + delta_.internalField() = hmax(); + } + else + { + FatalErrorIn("maxhxhyhzDelta::calcDelta()") + << "Case is not 3D or 2D, LES is not applicable" + << exit(FatalError); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +maxhxhyhzDelta::maxhxhyhzDelta +( + const word& name, + const fvMesh& mesh, + const dictionary& dd +) +: + LESdelta(name, mesh), + deltaCoeff_(readScalar(dd.subDict(type() + "Coeffs").lookup("deltaCoeff"))) +{ + calcDelta(); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void maxhxhyhzDelta::read(const dictionary& dd) +{ + dd.subDict(type() + "Coeffs").lookup("deltaCoeff") >> deltaCoeff_; + calcDelta(); +} + + +void maxhxhyhzDelta::correct() +{ + if (mesh_.changing()) + { + calcDelta(); + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/turbulenceModels/LES/LESdeltas/maxhxhyhzDelta/maxhxhyhzDelta.H b/src/turbulenceModels/LES/LESdeltas/maxhxhyhzDelta/maxhxhyhzDelta.H new file mode 100644 index 0000000000..30f26e6bd0 --- /dev/null +++ b/src/turbulenceModels/LES/LESdeltas/maxhxhyhzDelta/maxhxhyhzDelta.H @@ -0,0 +1,111 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd. + \\/ 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 . + +Class + Foam::maxhxhyhzDelta + +Description + maxhxhyhzDelta takes the maximum of the three dimensions per cell: + max(hx, hy, hz). Valid for structures hexahedral cells only. + + +SourceFiles + maxhxhyhzDelta.C + +\*---------------------------------------------------------------------------*/ + +#ifndef maxhxhyhzDeltaDelta_H +#define maxhxhyhzDeltaDelta_H + +#include "LESdelta.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class maxhxhyhzDelta Declaration +\*---------------------------------------------------------------------------*/ + +class maxhxhyhzDelta +: + public LESdelta +{ + // Private data + + scalar deltaCoeff_; // + + + // Private Member Functions + + //- Disallow default bitwise copy construct and assignment + maxhxhyhzDelta(const maxhxhyhzDelta&); + void operator=(const maxhxhyhzDelta&); + + // Calculate the delta values + void calcDelta(); + + +public: + + //- Runtime type information + TypeName("maxhxhyhzDelta"); + + + // Constructors + + //- Construct from name, mesh and IOdictionary + maxhxhyhzDelta + ( + const word& name, + const fvMesh& mesh, + const dictionary& + ); + + + //- Destructor + virtual ~maxhxhyhzDelta() + {} + + + // Member Functions + + //- Read the LESdelta dictionary + virtual void read(const dictionary&); + + // Correct values + virtual void correct(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#endif + +// ************************************************************************* // diff --git a/src/turbulenceModels/incompressible/LES/LESModel/LESModel.H b/src/turbulenceModels/incompressible/LES/LESModel/LESModel.H index eafb352fb2..9e6c8845ec 100644 --- a/src/turbulenceModels/incompressible/LES/LESModel/LESModel.H +++ b/src/turbulenceModels/incompressible/LES/LESModel/LESModel.H @@ -182,7 +182,7 @@ public: } //- Access function to filter width - inline const volScalarField& delta() const + virtual const volScalarField& delta() const { return delta_(); } diff --git a/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.C b/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.C index a7de909e45..f1e008eab1 100644 --- a/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.C +++ b/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.C @@ -25,6 +25,7 @@ License #include "IDDESDelta.H" #include "addToRunTimeSelectionTable.H" +#include "wallDistReflection.H" #include "wallDist.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -42,25 +43,50 @@ void Foam::IDDESDelta::calcDelta() { label nD = mesh().nGeometricD(); - volScalarField delta + const volScalarField& hmax = hmax_(); + + // initialise wallNorm + wallDistReflection wallNorm(mesh()); + + const volVectorField& n = wallNorm.n(); + + tmp faceToFacenMax ( - IOobject + new volScalarField ( - "delta", - mesh_.time().timeName(), - mesh_, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh_, - dimensionedScalar("zero", dimLength, SMALL), - calculatedFvPatchScalarField::typeName + IOobject + ( + "faceToFaceMax", + mesh().time().timeName(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensionedScalar("zrero", dimLength, 0.0) + ) ); - delta.internalField() = pow(mesh_.V(), 1.0/3.0); + const cellList& cells = mesh().cells(); - // initialise hwn as wall distance - volScalarField hwn = wallDist(mesh()).y(); + forAll(cells,cellI) + { + scalar deltaMaxTmp = 0.0; + const labelList& cFaces = mesh().cells()[cellI]; + const point& faceCentre = mesh().faceCentres()[cFaces[0]]; + const vector nCell = n[cellI]; + forAll(cFaces, cFaceI) + { + label faceI = cFaces[cFaceI]; + const point& faceCentreTwo = mesh().faceCentres()[faceI]; + scalar tmp = (faceCentre - faceCentreTwo) & nCell; + if (tmp > deltaMaxTmp) + { + deltaMaxTmp = tmp; + } + } + faceToFacenMax()[cellI] = deltaMaxTmp; + } if (nD == 3) { @@ -68,8 +94,12 @@ void Foam::IDDESDelta::calcDelta() deltaCoeff_ *min ( - max(max(cw_*wallDist(mesh()).y(), cw_*delta), hwn), - delta + max + ( + max(cw_*wallDist(mesh()).y(), cw_*hmax), + faceToFacenMax() + ), + hmax ); } else if (nD == 2) @@ -82,8 +112,8 @@ void Foam::IDDESDelta::calcDelta() deltaCoeff_ *min ( - max(max(cw_*wallDist(mesh()).y(), cw_*delta), hwn), - delta + max(max(cw_*wallDist(mesh()).y(), cw_*hmax), faceToFacenMax()), + hmax ); } else @@ -105,8 +135,12 @@ Foam::IDDESDelta::IDDESDelta ) : LESdelta(name, mesh), - deltaCoeff_(readScalar(dd.subDict(type() + "Coeffs").lookup("deltaCoeff"))), - cw_(0) + hmax_(LESdelta::New("hmax", mesh, dd.parent())), + deltaCoeff_ + ( + readScalar(dd.subDict(type()+"Coeffs").lookup("deltaCoeff")) + ), + cw_(0.15) { dd.subDict(type() + "Coeffs").readIfPresent("cw", cw_); calcDelta(); @@ -127,6 +161,7 @@ void Foam::IDDESDelta::correct() if (mesh_.changing()) { calcDelta(); + hmax_().correct(); } } diff --git a/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.H b/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.H index e738f6740c..8f74dbacc9 100644 --- a/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.H +++ b/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.H @@ -54,6 +54,7 @@ class IDDESDelta { // Private data + autoPtr hmax_; scalar deltaCoeff_; scalar cw_; @@ -85,9 +86,10 @@ public: ); - //- Destructor - ~IDDESDelta() - {} + // Destructor + + ~IDDESDelta() + {} // Member Functions diff --git a/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C b/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C index 50ea893c03..e06b1d2615 100644 --- a/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C +++ b/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C @@ -44,26 +44,9 @@ addToRunTimeSelectionTable(LESModel, SpalartAllmarasIDDES, dictionary); tmp SpalartAllmarasIDDES::alpha() const { - volScalarField delta - ( - IOobject - ( - "delta", - mesh_.time().timeName(), - mesh_, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh_, - dimensionedScalar("zero", dimLength, SMALL), - calculatedFvPatchScalarField::typeName - ); - - delta.internalField() = pow(mesh_.V(), 1.0/3.0); - return max ( - 0.25 - y_/delta, + 0.25 - y_/static_cast(hmax_()), scalar(-5) ); } @@ -166,7 +149,24 @@ SpalartAllmarasIDDES::SpalartAllmarasIDDES ) : SpalartAllmaras(U, phi, transport, turbulenceModelName, modelName), - + hmax_ + ( + LESdelta::New + ( + "hmax", + mesh_, + *this + ) + ), + IDDESDelta_ + ( + LESdelta::New + ( + "IDDESDelta", + mesh_, + this->subDict(typeName + "Coeffs") + ) + ), fwStar_ ( dimensioned::lookupOrAddToDict diff --git a/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H b/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H index 832b4947c5..80b13e1ec0 100644 --- a/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H +++ b/src/turbulenceModels/incompressible/LES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.H @@ -58,6 +58,8 @@ class SpalartAllmarasIDDES // Model constants + autoPtr hmax_; + autoPtr IDDESDelta_; dimensionedScalar fwStar_; dimensionedScalar cl_; dimensionedScalar ct_; @@ -117,6 +119,12 @@ public: // Member Functions + //- Access function to filter width + virtual const volScalarField& delta() const + { + return IDDESDelta_(); + } + //- Read LESProperties dictionary virtual bool read(); };