From 981b6303a4de950397a939e0c1e22b0547c8dd11 Mon Sep 17 00:00:00 2001
From: Andrew Heather <a.heather@opencfd.co.uk>
Date: Mon, 30 Nov 2015 12:48:20 +0000
Subject: [PATCH] ENH: Spalart-Allmaras DES, DDES and IDDES model updates

Included option to use the low Reynolds number correction, with a
default value of 'on'.  Further details can be found in the reference:

    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.

Set using the entry:

    lowReCorrection on; // off
---
 .../SpalartAllmarasDDES/SpalartAllmarasDDES.C |   4 +-
 .../SpalartAllmarasDES/SpalartAllmarasDES.C   | 108 +++++++++++++++++-
 .../SpalartAllmarasDES/SpalartAllmarasDES.H   |  28 ++++-
 .../SpalartAllmarasIDDES.C                    |   4 +-
 4 files changed, 135 insertions(+), 9 deletions(-)

diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.C b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.C
index 075b61388d1..3339dd4ce5a 100644
--- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.C
+++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDDES/SpalartAllmarasDDES.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -88,7 +88,7 @@ tmp<volScalarField> SpalartAllmarasDDES<BasicTurbulenceModel>::dTilda
       - fd(mag(gradU))
        *max
         (
-            this->y_ - this->CDES_*this->delta(),
+            this->y_ - this->psi(chi, fv1)*this->CDES_*this->delta(),
             dimensionedScalar("zero", dimLength, 0)
         ),
         dimensionedScalar("small", dimLength, SMALL)
diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.C b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.C
index d1b0da83418..5bf1780bff1 100644
--- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.C
+++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -63,6 +63,16 @@ tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::fv2
 }
 
 
+template<class BasicTurbulenceModel>
+tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::ft2
+(
+    const volScalarField& chi
+) const
+{
+    return Ct3_*exp(-Ct4_*sqr(chi));
+}
+
+
 template<class BasicTurbulenceModel>
 tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::S
 (
@@ -148,6 +158,53 @@ tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::fw
 }
 
 
+template<class BasicTurbulenceModel>
+tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::psi
+(
+    const volScalarField& chi,
+    const volScalarField& fv1
+) const
+{
+    tmp<volScalarField> tpsi
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                type() + ":psi",
+                this->time().timeName(),
+                this->mesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            this->mesh(),
+            dimensionedScalar("one", dimless, 1)
+        )
+    );
+
+    if (lowReCorrection_)
+    {
+        volScalarField& psi = tpsi();
+
+        const volScalarField fv2(this->fv2(chi, fv1));
+        const volScalarField ft2(this->ft2(chi));
+
+        psi =
+            sqrt
+            (
+                min
+                (
+                    scalar(100),
+                    (1 - Cb1_/(Cw1_*sqr(kappa_)*fwStar_)*(ft2 + (1 - ft2)*fv2))
+                   /max(SMALL, (fv1*max(1e-10, 1 - ft2)))
+                )
+            );
+    }
+
+    return tpsi;
+}
+
+
 template<class BasicTurbulenceModel>
 tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::dTilda
 (
@@ -156,7 +213,7 @@ tmp<volScalarField> SpalartAllmarasDES<BasicTurbulenceModel>::dTilda
     const volTensorField& gradU
 ) const
 {
-    tmp<volScalarField> tdTilda(CDES_*this->delta());
+    tmp<volScalarField> tdTilda(psi(chi, fv1)*CDES_*this->delta());
     min(tdTilda().dimensionedInternalField(), tdTilda(), y_);
     return tdTilda;
 }
@@ -300,6 +357,42 @@ SpalartAllmarasDES<BasicTurbulenceModel>::SpalartAllmarasDES
             0.07
         )
     ),
+    lowReCorrection_
+    (
+        Switch::lookupOrAddToDict
+        (
+            "lowReCorrection",
+            this->coeffDict_,
+            true
+        )
+    ),
+    Ct3_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "Ct3",
+            this->coeffDict_,
+            1.2
+        )
+    ),
+    Ct4_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "Ct4",
+            this->coeffDict_,
+            0.5
+        )
+    ),
+    fwStar_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "fwStar",
+            this->coeffDict_,
+            0.424
+        )
+    ),
 
     nuTilda_
     (
@@ -345,6 +438,11 @@ bool SpalartAllmarasDES<BasicTurbulenceModel>::read()
         CDES_.readIfPresent(this->coeffDict());
         ck_.readIfPresent(this->coeffDict());
 
+        lowReCorrection_.readIfPresent("lowReCorrection", this->coeffDict());
+        Ct3_.readIfPresent(this->coeffDict());
+        Ct4_.readIfPresent(this->coeffDict());
+        fwStar_.readIfPresent(this->coeffDict());
+
         return true;
     }
     else
@@ -418,6 +516,7 @@ void SpalartAllmarasDES<BasicTurbulenceModel>::correct()
 
     const volScalarField chi(this->chi());
     const volScalarField fv1(this->fv1(chi));
+    const volScalarField ft2(this->ft2(chi));
 
     tmp<volTensorField> tgradU = fvc::grad(U);
     const volScalarField Omega(this->Omega(tgradU()));
@@ -431,10 +530,11 @@ void SpalartAllmarasDES<BasicTurbulenceModel>::correct()
       - fvm::laplacian(alpha*rho*DnuTildaEff(), nuTilda_)
       - Cb2_/sigmaNut_*alpha*rho*magSqr(fvc::grad(nuTilda_))
      ==
-        Cb1_*alpha*rho*Stilda*nuTilda_
+        Cb1_*alpha*rho*Stilda*nuTilda_*(scalar(1) - ft2)
       - fvm::Sp
         (
-            Cw1_*alpha*rho*fw(Stilda, dTilda)*nuTilda_/sqr(dTilda),
+            (Cw1_*fw(Stilda, dTilda) - Cb1_/sqr(kappa_)*ft2)
+           *alpha*rho*nuTilda_/sqr(dTilda),
             nuTilda_
         )
     );
diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.H b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.H
index 3a560be0c8e..60294f61d86 100644
--- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.H
+++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasDES/SpalartAllmarasDES.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -39,6 +39,15 @@ Description
         Advances in DNS/LES, 1, 4-8.
     \endverbatim
 
+    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.
+    \endverbatim
+
 SourceFiles
     SpalartAllmarasDES.C
 
@@ -91,6 +100,15 @@ protected:
             dimensionedScalar CDES_;
             dimensionedScalar ck_;
 
+
+            // Low Reynolds number correction
+
+                Switch lowReCorrection_;
+                dimensionedScalar Ct3_;
+                dimensionedScalar Ct4_;
+                dimensionedScalar fwStar_;
+
+
         // Fields
 
             volScalarField nuTilda_;
@@ -113,6 +131,8 @@ protected:
             const volScalarField& fv1
         ) const;
 
+        tmp<volScalarField> ft2(const volScalarField& chi) const;
+
         tmp<volScalarField> S(const volTensorField& gradU) const;
 
         tmp<volScalarField> Omega(const volTensorField& gradU) const;
@@ -138,6 +158,12 @@ protected:
             const volScalarField& dTilda
         ) const;
 
+        tmp<volScalarField> psi
+        (
+            const volScalarField& chi,
+            const volScalarField& fv1
+        ) const;
+
         //- Length scale
         virtual tmp<volScalarField> dTilda
         (
diff --git a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C
index f96cdc6a161..0a1015cfdb7 100644
--- a/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C
+++ b/src/TurbulenceModels/turbulenceModels/DES/SpalartAllmarasIDDES/SpalartAllmarasIDDES.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -140,7 +140,7 @@ tmp<volScalarField> SpalartAllmarasIDDES<BasicTurbulenceModel>::dTilda
     (
         dimensionedScalar("SMALL", dimLength, SMALL),
         fHyb*(1 + fRestore*Psi)*this->y_
-      + (1 - fHyb)*this->CDES_*Psi*this->delta()
+      + (1 - fHyb)*this->psi(chi, fv1)*this->CDES_*Psi*this->delta()
     );
 }
 
-- 
GitLab