From 5f464d11699834576fc90477a1fc21b5b05cd5e3 Mon Sep 17 00:00:00 2001
From: Henry <Henry>
Date: Wed, 28 Jan 2015 09:18:06 +0000
Subject: [PATCH] TurbulenceModels: Templated kOmega and instantiated both
 incompressible and compressible forms

---
 .../turbulentFluidThermoModels.C              |   3 +
 .../incompressible/Make/files                 |   1 -
 .../turbulentTransportModels.C                |   3 +
 .../RAS/kOmega/kOmega.C                       | 122 ++++++++++--------
 .../RAS/kOmega/kOmega.H                       |  46 ++++---
 .../RAS/kOmegaSST/kOmegaSST.C                 |  24 ++--
 .../RAS/kOmegaSST/kOmegaSST.H                 |   4 +-
 7 files changed, 115 insertions(+), 88 deletions(-)
 rename src/TurbulenceModels/{incompressible/turbulentTransportModels => turbulenceModels}/RAS/kOmega/kOmega.C (60%)
 rename src/TurbulenceModels/{incompressible/turbulentTransportModels => turbulenceModels}/RAS/kOmega/kOmega.H (81%)

diff --git a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C
index 8fa15bfe410..def8a371a0c 100644
--- a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C
+++ b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C
@@ -69,6 +69,9 @@ makeRASModel(buoyantKEpsilon);
 #include "LaunderSharmaKE.H"
 makeRASModel(LaunderSharmaKE);
 
+#include "kOmega.H"
+makeRASModel(kOmega);
+
 #include "kOmegaSST.H"
 makeRASModel(kOmegaSST);
 
diff --git a/src/TurbulenceModels/incompressible/Make/files b/src/TurbulenceModels/incompressible/Make/files
index 2f51417aea8..afb44e8a105 100644
--- a/src/TurbulenceModels/incompressible/Make/files
+++ b/src/TurbulenceModels/incompressible/Make/files
@@ -1,7 +1,6 @@
 incompressibleTurbulenceModel.C
 
 turbulentTransportModels/turbulentTransportModels.C
-turbulentTransportModels/RAS/kOmega/kOmega.C
 turbulentTransportModels/RAS/qZeta/qZeta.C
 turbulentTransportModels/RAS/kkLOmega/kkLOmega.C
 turbulentTransportModels/RAS/LamBremhorstKE/LamBremhorstKE.C
diff --git a/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C b/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C
index 6ae16a78644..b6715827695 100644
--- a/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C
+++ b/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C
@@ -64,6 +64,9 @@ makeRASModel(realizableKE);
 #include "LaunderSharmaKE.H"
 makeRASModel(LaunderSharmaKE);
 
+#include "kOmega.H"
+makeRASModel(kOmega);
+
 #include "kOmegaSST.H"
 makeRASModel(kOmegaSST);
 
diff --git a/src/TurbulenceModels/incompressible/turbulentTransportModels/RAS/kOmega/kOmega.C b/src/TurbulenceModels/turbulenceModels/RAS/kOmega/kOmega.C
similarity index 60%
rename from src/TurbulenceModels/incompressible/turbulentTransportModels/RAS/kOmega/kOmega.C
rename to src/TurbulenceModels/turbulenceModels/RAS/kOmega/kOmega.C
index 12a95d07f6b..412a6b3e6b4 100644
--- a/src/TurbulenceModels/incompressible/turbulentTransportModels/RAS/kOmega/kOmega.C
+++ b/src/TurbulenceModels/turbulenceModels/RAS/kOmega/kOmega.C
@@ -25,37 +25,32 @@ License
 
 #include "kOmega.H"
 #include "bound.H"
-#include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
-namespace incompressible
-{
 namespace RASModels
 {
 
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
-
-defineTypeNameAndDebug(kOmega, 0);
-addToRunTimeSelectionTable(RASModel, kOmega, dictionary);
 
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
-void kOmega::correctNut()
+template<class BasicTurbulenceModel>
+void kOmega<BasicTurbulenceModel>::correctNut()
 {
-    nut_ = k_/omega_;
-    nut_.correctBoundaryConditions();
+    this->nut_ = k_/omega_;
+    this->nut_.correctBoundaryConditions();
 }
 
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-kOmega::kOmega
+template<class BasicTurbulenceModel>
+kOmega<BasicTurbulenceModel>::kOmega
 (
-    const geometricOneField& alpha,
-    const geometricOneField& rho,
+    const alphaField& alpha,
+    const rhoField& rho,
     const volVectorField& U,
     const surfaceScalarField& alphaRhoPhi,
     const surfaceScalarField& phi,
@@ -64,7 +59,7 @@ kOmega::kOmega
     const word& type
 )
 :
-    eddyViscosity<incompressible::RASModel>
+    eddyViscosity<RASModel<BasicTurbulenceModel> >
     (
         type,
         alpha,
@@ -81,7 +76,7 @@ kOmega::kOmega
         dimensioned<scalar>::lookupOrAddToDict
         (
             "betaStar",
-            coeffDict_,
+            this->coeffDict_,
             0.09
         )
     ),
@@ -90,16 +85,16 @@ kOmega::kOmega
         dimensioned<scalar>::lookupOrAddToDict
         (
             "beta",
-            coeffDict_,
+            this->coeffDict_,
             0.072
         )
     ),
-    alpha_
+    gamma_
     (
         dimensioned<scalar>::lookupOrAddToDict
         (
-            "alpha",
-            coeffDict_,
+            "gamma",
+            this->coeffDict_,
             0.52
         )
     ),
@@ -108,7 +103,7 @@ kOmega::kOmega
         dimensioned<scalar>::lookupOrAddToDict
         (
             "alphaK",
-            coeffDict_,
+            this->coeffDict_,
             0.5
         )
     ),
@@ -117,7 +112,7 @@ kOmega::kOmega
         dimensioned<scalar>::lookupOrAddToDict
         (
             "alphaOmega",
-            coeffDict_,
+            this->coeffDict_,
             0.5
         )
     ),
@@ -127,47 +122,49 @@ kOmega::kOmega
         IOobject
         (
             IOobject::groupName("k", U.group()),
-            runTime_.timeName(),
-            mesh_,
+            this->runTime_.timeName(),
+            this->mesh_,
             IOobject::MUST_READ,
             IOobject::AUTO_WRITE
         ),
-        mesh_
+        this->mesh_
     ),
     omega_
     (
         IOobject
         (
             IOobject::groupName("omega", U.group()),
-            runTime_.timeName(),
-            mesh_,
+            this->runTime_.timeName(),
+            this->mesh_,
             IOobject::MUST_READ,
             IOobject::AUTO_WRITE
         ),
-        mesh_
+        this->mesh_
     )
 {
-    bound(k_, kMin_);
-    bound(omega_, omegaMin_);
+    bound(k_, this->kMin_);
+    bound(omega_, this->omegaMin_);
 
     if (type == typeName)
     {
         correctNut();
-        printCoeffs(type);
+        this->printCoeffs(type);
     }
 }
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-bool kOmega::read()
+template<class BasicTurbulenceModel>
+bool kOmega<BasicTurbulenceModel>::read()
 {
-    if (eddyViscosity<incompressible::RASModel>::read())
+    if (eddyViscosity<RASModel<BasicTurbulenceModel> >::read())
     {
-        Cmu_.readIfPresent(coeffDict());
-        beta_.readIfPresent(coeffDict());
-        alphaK_.readIfPresent(coeffDict());
-        alphaOmega_.readIfPresent(coeffDict());
+        Cmu_.readIfPresent(this->coeffDict());
+        beta_.readIfPresent(this->coeffDict());
+        gamma_.readIfPresent(this->coeffDict());
+        alphaK_.readIfPresent(this->coeffDict());
+        alphaOmega_.readIfPresent(this->coeffDict());
 
         return true;
     }
@@ -178,16 +175,32 @@ bool kOmega::read()
 }
 
 
-void kOmega::correct()
+template<class BasicTurbulenceModel>
+void kOmega<BasicTurbulenceModel>::correct()
 {
-    eddyViscosity<incompressible::RASModel>::correct();
-
-    if (!turbulence_)
+    if (!this->turbulence_)
     {
         return;
     }
 
-    volScalarField G(GName(), nut_*2*magSqr(symm(fvc::grad(U_))));
+    // 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 G
+    (
+        this->GName(),
+        nut*(tgradU() && dev(twoSymm(tgradU())))
+    );
+    tgradU.clear();
 
     // Update omega and G at the wall
     omega_.boundaryField().updateCoeffs();
@@ -195,12 +208,13 @@ void kOmega::correct()
     // Turbulence specific dissipation rate equation
     tmp<fvScalarMatrix> omegaEqn
     (
-        fvm::ddt(omega_)
-      + fvm::div(phi_, omega_)
-      - fvm::laplacian(DomegaEff(), omega_)
+        fvm::ddt(alpha, rho, omega_)
+      + fvm::div(alphaRhoPhi, omega_)
+      - fvm::laplacian(alpha*rho*DomegaEff(), omega_)
      ==
-        alpha_*G*omega_/k_
-      - fvm::Sp(beta_*omega_, omega_)
+        gamma_*alpha*rho*G*omega_/k_
+      - fvm::SuSp(((2.0/3.0)*gamma_)*alpha*rho*divU, omega_)
+      - fvm::Sp(beta_*alpha*rho*omega_, omega_)
     );
 
     omegaEqn().relax();
@@ -208,23 +222,24 @@ void kOmega::correct()
     omegaEqn().boundaryManipulate(omega_.boundaryField());
 
     solve(omegaEqn);
-    bound(omega_, omegaMin_);
+    bound(omega_, this->omegaMin_);
 
 
     // Turbulent kinetic energy equation
     tmp<fvScalarMatrix> kEqn
     (
-        fvm::ddt(k_)
-      + fvm::div(phi_, k_)
-      - fvm::laplacian(DkEff(), k_)
+        fvm::ddt(alpha, rho, k_)
+      + fvm::div(alphaRhoPhi, k_)
+      - fvm::laplacian(alpha*rho*DkEff(), k_)
      ==
-        G
-      - fvm::Sp(Cmu_*omega_, k_)
+        alpha*rho*G
+      - fvm::SuSp((2.0/3.0)*alpha*rho*divU, k_)
+      - fvm::Sp(Cmu_*alpha*rho*omega_, k_)
     );
 
     kEqn().relax();
     solve(kEqn);
-    bound(k_, kMin_);
+    bound(k_, this->kMin_);
 
     correctNut();
 }
@@ -233,7 +248,6 @@ void kOmega::correct()
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace RASModels
-} // End namespace incompressible
 } // End namespace Foam
 
 // ************************************************************************* //
diff --git a/src/TurbulenceModels/incompressible/turbulentTransportModels/RAS/kOmega/kOmega.H b/src/TurbulenceModels/turbulenceModels/RAS/kOmega/kOmega.H
similarity index 81%
rename from src/TurbulenceModels/incompressible/turbulentTransportModels/RAS/kOmega/kOmega.H
rename to src/TurbulenceModels/turbulenceModels/RAS/kOmega/kOmega.H
index 937869f3650..5c297a02d4f 100644
--- a/src/TurbulenceModels/incompressible/turbulentTransportModels/RAS/kOmega/kOmega.H
+++ b/src/TurbulenceModels/turbulenceModels/RAS/kOmega/kOmega.H
@@ -22,14 +22,14 @@ License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
 Class
-    Foam::incompressible::RASModels::kOmega
+    Foam::RASModels::kOmega
 
 Group
-    grpIcoRASTurbulence
+    grpRASTurbulence
 
 Description
     Standard high Reynolds-number k-omega turbulence model for
-    incompressible flows.
+    incompressible and compressible flows.
 
     References:
     \verbatim
@@ -58,15 +58,13 @@ SourceFiles
 #ifndef kOmega_H
 #define kOmega_H
 
-#include "turbulentTransportModel.H"
+#include "RASModel.H"
 #include "eddyViscosity.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
-namespace incompressible
-{
 namespace RASModels
 {
 
@@ -74,9 +72,10 @@ namespace RASModels
                            Class kOmega Declaration
 \*---------------------------------------------------------------------------*/
 
+template<class BasicTurbulenceModel>
 class kOmega
 :
-    public eddyViscosity<incompressible::RASModel>
+    public eddyViscosity<RASModel<BasicTurbulenceModel> >
 {
 
 protected:
@@ -87,7 +86,7 @@ protected:
 
             dimensionedScalar Cmu_;
             dimensionedScalar beta_;
-            dimensionedScalar alpha_;
+            dimensionedScalar gamma_;
             dimensionedScalar alphaK_;
             dimensionedScalar alphaOmega_;
 
@@ -105,6 +104,11 @@ protected:
 
 public:
 
+    typedef typename BasicTurbulenceModel::alphaField alphaField;
+    typedef typename BasicTurbulenceModel::rhoField rhoField;
+    typedef typename BasicTurbulenceModel::transportModel transportModel;
+
+
     //- Runtime type information
     TypeName("kOmega");
 
@@ -114,8 +118,8 @@ public:
         //- Construct from components
         kOmega
         (
-            const geometricOneField& alpha,
-            const geometricOneField& rho,
+            const alphaField& alpha,
+            const rhoField& rho,
             const volVectorField& U,
             const surfaceScalarField& alphaRhoPhi,
             const surfaceScalarField& phi,
@@ -140,7 +144,11 @@ public:
         {
             return tmp<volScalarField>
             (
-                new volScalarField("DkEff", alphaK_*nut_ + nu())
+                new volScalarField
+                (
+                    "DkEff",
+                    alphaK_*this->nut_ + this->nu()
+                )
             );
         }
 
@@ -149,7 +157,11 @@ public:
         {
             return tmp<volScalarField>
             (
-                new volScalarField("DomegaEff", alphaOmega_*nut_ + nu())
+                new volScalarField
+                (
+                    "DomegaEff",
+                    alphaOmega_*this->nut_ + this->nu()
+                )
             );
         }
 
@@ -175,8 +187,8 @@ public:
                     IOobject
                     (
                         "epsilon",
-                        mesh_.time().timeName(),
-                        mesh_
+                        this->mesh_.time().timeName(),
+                        this->mesh_
                     ),
                     Cmu_*k_*omega_,
                     omega_.boundaryField().types()
@@ -192,9 +204,13 @@ public:
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace RASModels
-} // End namespace incompressible
 } // End namespace Foam
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+#ifdef NoRepository
+#   include "kOmega.C"
+#endif
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #endif
diff --git a/src/TurbulenceModels/turbulenceModels/RAS/kOmegaSST/kOmegaSST.C b/src/TurbulenceModels/turbulenceModels/RAS/kOmegaSST/kOmegaSST.C
index 1c3babf681e..aab8941a4f8 100644
--- a/src/TurbulenceModels/turbulenceModels/RAS/kOmegaSST/kOmegaSST.C
+++ b/src/TurbulenceModels/turbulenceModels/RAS/kOmegaSST/kOmegaSST.C
@@ -328,20 +328,14 @@ kOmegaSST<BasicTurbulenceModel>::kOmegaSST
         this->mesh_
     )
 {
-
     bound(k_, this->kMin_);
     bound(omega_, this->omegaMin_);
 
-    this->nut_ =
-    (
-        a1_*k_
-       /max
-        (
-            a1_*omega_,
-            b1_*F23()*sqrt(2.0)*mag(symm(fvc::grad(this->U_)))
-        )
-    );
-    this->nut_.correctBoundaryConditions();
+    if (type == typeName)
+    {
+        correctNut();
+        this->printCoeffs(type);
+    }
 }
 
 
@@ -396,8 +390,8 @@ void kOmegaSST<BasicTurbulenceModel>::correct()
 
     tmp<volTensorField> tgradU = fvc::grad(U);
     volScalarField S2(2*magSqr(symm(tgradU())));
-    volScalarField GbyMu((tgradU() && dev(twoSymm(tgradU()))));
-    volScalarField G(this->GName(), nut*GbyMu);
+    volScalarField GbyNu((tgradU() && dev(twoSymm(tgradU()))));
+    volScalarField G(this->GName(), nut*GbyNu);
     tgradU.clear();
 
     // Update omega and G at the wall
@@ -416,10 +410,9 @@ void kOmegaSST<BasicTurbulenceModel>::correct()
     (
         fvm::ddt(alpha, rho, omega_)
       + fvm::div(alphaRhoPhi, omega_)
-      - fvm::Sp(fvc::ddt(alpha, rho) + fvc::div(alphaRhoPhi), omega_)
       - fvm::laplacian(alpha*rho*DomegaEff(F1), omega_)
      ==
-        alpha*rhoGammaF1*GbyMu
+        alpha*rhoGammaF1*GbyNu
       - fvm::SuSp((2.0/3.0)*alpha*rhoGammaF1*divU, omega_)
       - fvm::Sp(alpha*rho*beta(F1)*omega_, omega_)
       - fvm::SuSp
@@ -442,7 +435,6 @@ void kOmegaSST<BasicTurbulenceModel>::correct()
     (
         fvm::ddt(alpha, rho, k_)
       + fvm::div(alphaRhoPhi, k_)
-      - fvm::Sp(fvc::ddt(alpha, rho) + fvc::div(alphaRhoPhi), k_)
       - fvm::laplacian(alpha*rho*DkEff(F1), k_)
      ==
         min(alpha*rho*G, (c1_*betaStar_)*alpha*rho*k_*omega_)
diff --git a/src/TurbulenceModels/turbulenceModels/RAS/kOmegaSST/kOmegaSST.H b/src/TurbulenceModels/turbulenceModels/RAS/kOmegaSST/kOmegaSST.H
index 3dc734a906c..c70413d1dca 100644
--- a/src/TurbulenceModels/turbulenceModels/RAS/kOmegaSST/kOmegaSST.H
+++ b/src/TurbulenceModels/turbulenceModels/RAS/kOmegaSST/kOmegaSST.H
@@ -28,7 +28,8 @@ Group
     grpRASTurbulence
 
 Description
-    Implementation of the k-omega-SST turbulence model for compressible flows.
+    Implementation of the k-omega-SST turbulence model for
+    incompressible and compressible flows.
 
     Turbulence model described in:
     \verbatim
@@ -96,7 +97,6 @@ SourceFiles
 
 #include "RASModel.H"
 #include "eddyViscosity.H"
-#include "wallDist.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-- 
GitLab