From 2fe4ba82d6ae59e51f5c9cf7496a262aa237858b Mon Sep 17 00:00:00 2001
From: henry <Henry Weller h.weller@opencfd.co.uk>
Date: Wed, 29 Oct 2008 13:17:24 +0000
Subject: [PATCH] Added SAS LES model.

---
 .../kOmegaSSTSAS/kOmegaSSTSAS.C               | 447 ++++++++++++++++++
 .../kOmegaSSTSAS/kOmegaSSTSAS.H               | 258 ++++++++++
 2 files changed, 705 insertions(+)
 create mode 100644 src/turbulenceModels/LES/incompressible/kOmegaSSTSAS/kOmegaSSTSAS.C
 create mode 100644 src/turbulenceModels/LES/incompressible/kOmegaSSTSAS/kOmegaSSTSAS.H

diff --git a/src/turbulenceModels/LES/incompressible/kOmegaSSTSAS/kOmegaSSTSAS.C b/src/turbulenceModels/LES/incompressible/kOmegaSSTSAS/kOmegaSSTSAS.C
new file mode 100644
index 00000000000..a06f4298c64
--- /dev/null
+++ b/src/turbulenceModels/LES/incompressible/kOmegaSSTSAS/kOmegaSSTSAS.C
@@ -0,0 +1,447 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "kOmegaSSTSAS.H"
+#include "addToRunTimeSelectionTable.H"
+#include "wallDist.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace incompressible
+{
+namespace LESModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(kOmegaSSTSAS, 0);
+addToRunTimeSelectionTable(LESModel, kOmegaSSTSAS, dictionary);
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+tmp<volScalarField> kOmegaSSTSAS::F1(const volScalarField& CDkOmega) const
+{
+    volScalarField CDkOmegaPlus = max
+    (
+        CDkOmega,
+        dimensionedScalar("1.0e-10", dimless/sqr(dimTime), 1.0e-10)
+    );
+
+    volScalarField arg1 = min
+    (
+        min
+        (
+            max
+            (
+                (scalar(1)/betaStar_)*sqrt(k_)/(omega_*y_),
+                scalar(500)*nu()/(sqr(y_)*omega_)
+            ),
+            (4*alphaOmega2_)*k_/(CDkOmegaPlus*sqr(y_))
+        ),
+        scalar(10)
+    );
+
+    return tanh(pow4(arg1));
+}
+
+
+tmp<volScalarField> kOmegaSSTSAS::F2() const
+{
+    volScalarField arg2 = min
+    (
+        max
+        (
+            (scalar(2)/betaStar_)*sqrt(k_)/(omega_*y_),
+            scalar(500)*nu()/(sqr(y_)*omega_)
+        ),
+        scalar(100)
+    );
+
+    return tanh(sqr(arg2));
+}
+
+
+tmp<volScalarField> kOmegaSSTSAS::Lvk2
+(
+    const volScalarField& S2
+) const
+{
+    return kappa_*sqrt(S2)
+   /(
+       mag(fvc::laplacian(U()))
+     + dimensionedScalar
+       (
+           "ROOTVSMALL",
+           dimensionSet(0, -1 , -1, 0, 0, 0, 0),
+           ROOTVSMALL
+       )
+   );
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+kOmegaSSTSAS::kOmegaSSTSAS
+(
+    const volVectorField& U,
+    const surfaceScalarField& phi,
+    transportModel& transport,
+    const word& modelName
+)
+:
+    LESModel(modelName, U, phi, transport),
+
+    alphaK1_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "alphaK1",
+            coeffDict(),
+            0.85034
+        )
+    ),
+    alphaK2_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "alphaK2",
+            coeffDict(),
+            1.0
+        )
+    ),
+    alphaOmega1_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "alphaOmega1",
+            coeffDict(),
+            0.5
+        )
+    ),
+    alphaOmega2_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "alphaOmega2",
+            coeffDict(),
+            0.85616
+        )
+    ),
+    gamma1_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "gamma1",
+            coeffDict(),
+            0.5532
+        )
+    ),
+    gamma2_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "gamma2",
+            coeffDict(),
+            0.4403
+        )
+    ),
+    beta1_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "beta1",
+            coeffDict(),
+            0.075
+        )
+    ),
+    beta2_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "beta2",
+            coeffDict(),
+            0.0828
+        )
+    ),
+    betaStar_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "betaStar",
+            coeffDict(),
+            0.09
+        )
+    ),
+    a1_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "a1",
+            coeffDict(),
+            0.31
+        )
+    ),
+    c1_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "c1",
+            coeffDict(),
+            10.0
+        )
+    ),
+    alphaPhi_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "alphaPhi",
+            coeffDict(),
+            0.666667
+        )
+    ),
+    zetaTilda2_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "zetaTilda2",
+            coeffDict(),
+            1.755
+        )
+    ),
+    FSAS_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "FSAS",
+            coeffDict(),
+            1.25
+        )
+    ),
+
+    omega0_("omega0", dimless/dimTime, SMALL),
+    omegaSmall_("omegaSmall", dimless/dimTime, SMALL),
+    y_(mesh_),
+    Cmu_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "Cmu",
+            coeffDict(),
+            0.09
+         )
+    ),
+    kappa_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "kappa",
+            *this,
+            0.4187
+        )
+    ),
+
+    k_
+    (
+        IOobject
+        (
+            "k",
+            runTime_.timeName(),
+            mesh_,
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        mesh_
+    ),
+
+    omega_
+    (
+        IOobject
+        (
+            "omega",
+            runTime_.timeName(),
+            mesh_,
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        mesh_
+    ),
+
+    nuSgs_
+    (
+        IOobject
+        (
+            "nuSgs",
+            runTime_.timeName(),
+            mesh_,
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        mesh_
+    )
+{
+    printCoeffs();
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void kOmegaSSTSAS::correct(const tmp<volTensorField>& gradU)
+{
+    LESModel::correct(gradU);
+
+    if (mesh_.changing())
+    {
+        y_.correct();
+    }
+
+    volScalarField S2 = magSqr(symm(gradU()));
+    gradU.clear();
+
+    volVectorField gradK = fvc::grad(k_);
+    volVectorField gradOmega = fvc::grad(omega_);
+    volScalarField L = sqrt(k_)/(pow(Cmu_, 0.25)*(omega_ + omegaSmall_));
+    volScalarField CDkOmega = (2.0*alphaOmega2_)*(gradK & gradOmega)/(omega_ + omegaSmall_);
+    volScalarField F1 = this->F1(CDkOmega);
+    volScalarField G = nuSgs_*2.0*S2;
+
+    // Turbulent kinetic energy equation
+    solve
+    (
+        fvm::ddt(k_)
+      + fvm::div(phi(), k_)
+      - fvm::Sp(fvc::div(phi()), k_)
+      - fvm::laplacian(DkEff(F1), k_)
+    ==
+        min(G, c1_*betaStar_*k_*omega_)
+      - fvm::Sp(betaStar_*omega_, k_)
+    );
+
+
+    bound(k_, k0());
+
+    volScalarField grad_omega_k = max
+    (
+        magSqr(gradOmega)/
+        sqr(omega_ + omegaSmall_),
+        magSqr(gradK)/
+        sqr(k_ + k0())
+    );
+
+    // Turbulent frequency equation
+    solve
+    (
+        fvm::ddt(omega_)
+      + fvm::div(phi(), omega_)
+      - fvm::Sp(fvc::div(phi()), omega_)
+      - fvm::laplacian(DomegaEff(F1), omega_)
+     ==
+        gamma(F1)*2.0*S2
+      - fvm::Sp(beta(F1)*omega_, omega_)
+      - fvm::SuSp       // cross diffusion term
+        (
+            (F1 - scalar(1))*CDkOmega/omega_,
+            omega_
+        )
+      + FSAS_
+       *max
+        (
+            dimensionedScalar("zero",dimensionSet(0, 0 , -2, 0, 0),0. ),
+            zetaTilda2_*kappa_*S2*(L/Lvk2(S2))- 2.0/alphaPhi_*k_*grad_omega_k
+        )
+
+    );
+    bound(omega_, omega0_);
+
+    // Re-calculate viscosity
+    nuSgs_ == a1_*k_/max(a1_*omega_, F2()*sqrt(S2));
+    nuSgs_.correctBoundaryConditions();
+}
+
+
+tmp<volScalarField> kOmegaSSTSAS::epsilon() const
+{
+    return 2.0*nuEff()*magSqr(symm(fvc::grad(U())));
+}
+
+
+tmp<volSymmTensorField> kOmegaSSTSAS::B() const
+{
+    return ((2.0/3.0)*I)*k() - nuSgs()*twoSymm(fvc::grad(U()));
+}
+
+
+tmp<volSymmTensorField> kOmegaSSTSAS::devBeff() const
+{
+    return -nuEff()*dev(twoSymm(fvc::grad(U())));
+}
+
+
+tmp<fvVectorMatrix> kOmegaSSTSAS::divDevBeff(volVectorField& U) const
+{
+    return
+    (
+      - fvm::laplacian(nuEff(), U) - fvc::div(nuEff()*dev(fvc::grad(U)().T()))
+    );
+}
+
+
+bool kOmegaSSTSAS::read()
+{
+    if (LESModel::read())
+    {
+        alphaK1_.readIfPresent(coeffDict());
+        alphaK2_.readIfPresent(coeffDict());
+        alphaOmega1_.readIfPresent(coeffDict());
+        alphaOmega2_.readIfPresent(coeffDict());
+        gamma1_.readIfPresent(coeffDict());
+        gamma2_.readIfPresent(coeffDict());
+        beta1_.readIfPresent(coeffDict());
+        beta2_.readIfPresent(coeffDict());
+        betaStar_.readIfPresent(coeffDict());
+        a1_.readIfPresent(coeffDict());
+        c1_.readIfPresent(coeffDict());
+        alphaPhi_.readIfPresent(coeffDict());
+        zetaTilda2_.readIfPresent(coeffDict());
+        FSAS_.readIfPresent(coeffDict());
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace LESModels
+} // End namespace incompressible
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/turbulenceModels/LES/incompressible/kOmegaSSTSAS/kOmegaSSTSAS.H b/src/turbulenceModels/LES/incompressible/kOmegaSSTSAS/kOmegaSSTSAS.H
new file mode 100644
index 00000000000..8048be0adf7
--- /dev/null
+++ b/src/turbulenceModels/LES/incompressible/kOmegaSSTSAS/kOmegaSSTSAS.H
@@ -0,0 +1,258 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2007 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::LESmodels::kOmegaSSTSAS
+
+Description
+    kOmegaSSTSAS LES turbulence model for incompressible flows
+
+    Note: does not have an explicit dependency on spatial discretisation
+          i.e. LESdelta not used.
+
+SourceFiles
+    kOmegaSSTSAS.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef kOmegaSSTSAS_H
+#define kOmegaSSTSAS_H
+
+#include "LESModel.H"
+#include "volFields.H"
+#include "wallDist.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace incompressible
+{
+namespace LESModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class kOmegaSSTSAS Declaration
+\*---------------------------------------------------------------------------*/
+
+class kOmegaSSTSAS
+:
+    public LESModel
+{
+    // Private member functions
+
+        // Disallow default bitwise copy construct and assignment
+        kOmegaSSTSAS(const kOmegaSSTSAS&);
+        kOmegaSSTSAS& operator=(const kOmegaSSTSAS&);
+
+
+protected:
+
+    // Protected data
+
+        // Model constants
+
+            dimensionedScalar alphaK1_;
+            dimensionedScalar alphaK2_;
+
+            dimensionedScalar alphaOmega1_;
+            dimensionedScalar alphaOmega2_;
+
+            dimensionedScalar gamma1_;
+            dimensionedScalar gamma2_;
+
+            dimensionedScalar beta1_;
+            dimensionedScalar beta2_;
+
+            dimensionedScalar betaStar_;
+
+            dimensionedScalar a1_;
+            dimensionedScalar c1_;
+
+            dimensionedScalar alphaPhi_;
+            dimensionedScalar zetaTilda2_;
+            dimensionedScalar FSAS_;
+
+            dimensionedScalar omega0_;
+            dimensionedScalar omegaSmall_;
+
+            wallDist y_;
+            dimensionedScalar Cmu_;
+            dimensionedScalar kappa_;
+
+
+        // Fields
+
+            volScalarField k_;
+            volScalarField omega_;
+            volScalarField nuSgs_;
+
+
+    // Protected member functions
+
+        tmp<volScalarField> Lvk2
+        (
+            const volScalarField& S2
+        ) const;
+
+        tmp<volScalarField> F1(const volScalarField& CDkOmega) const;
+        tmp<volScalarField> F2() const;
+
+        tmp<volScalarField> blend
+        (
+            const volScalarField& F1,
+            const dimensionedScalar& psi1,
+            const dimensionedScalar& psi2
+        ) const
+        {
+            return F1*(psi1 - psi2) + psi2;
+        }
+
+        tmp<volScalarField> alphaK
+        (
+            const volScalarField& F1
+        ) const
+        {
+            return blend(F1, alphaK1_, alphaK2_);
+        }
+
+        tmp<volScalarField> alphaOmega
+        (
+             const volScalarField& F1
+        ) const
+        {
+            return blend(F1, alphaOmega1_, alphaOmega2_);
+        }
+
+        tmp<volScalarField> beta
+        (
+            const volScalarField& F1
+        ) const
+        {
+            return blend(F1, beta1_, beta2_);
+        }
+
+        tmp<volScalarField> gamma
+        (
+            const volScalarField& F1
+        ) const
+        {
+            return blend(F1, gamma1_, gamma2_);
+        }
+
+
+public:
+
+    //- Runtime type information
+    TypeName("kOmegaSSTSAS");
+
+
+    // Constructors
+
+        //- Constructor from components
+        kOmegaSSTSAS
+        (
+            const volVectorField& U,
+            const surfaceScalarField& phi,
+            transportModel& transport,
+            const word& modelName = typeName
+        );
+
+
+    //- Destructor
+    virtual ~kOmegaSSTSAS()
+    {}
+
+
+    // Member Functions
+
+        //- Return SGS kinetic energy
+        tmp<volScalarField> k() const
+        {
+            return k_;
+        }
+
+        //- Return omega
+        tmp<volScalarField> omega() const
+        {
+            return omega_;
+        }
+
+        //- Return the effective diffusivity for k
+        tmp<volScalarField> DkEff(const volScalarField& F1) const
+        {
+            return tmp<volScalarField>
+            (
+                 new volScalarField("DkEff", alphaK(F1)*nuSgs_ + nu())
+            );
+        }
+
+        //- Return the effective diffusivity for omega
+        tmp<volScalarField> DomegaEff(const volScalarField& F1) const
+        {
+            return tmp<volScalarField>
+            (
+                new volScalarField("DomegaEff", alphaOmega(F1)*nuSgs_ + nu())
+            );
+        }
+
+        //- Return sub-grid disipation rate
+        tmp<volScalarField> epsilon() const;
+
+        //- Return SGS viscosity
+        tmp<volScalarField> nuSgs() const
+        {
+            return nuSgs_;
+        }
+
+        //- Return the sub-grid stress tensor.
+        tmp<volSymmTensorField> B() const;
+
+        //- Return the effective sub-grid turbulence stress tensor
+        //  including the laminar stress
+        tmp<volSymmTensorField> devBeff() const;
+
+        //- Return the deviatoric part of the divergence of Beff
+        //  i.e. the additional term in the filtered NSE.
+        tmp<fvVectorMatrix> divDevBeff(volVectorField& U) const;
+
+        //- Solve the turbulence equations (k-w) and correct the turbulence viscosity
+        virtual void correct(const tmp<volTensorField>& gradU);
+
+        //- Read turbulenceProperties dictionary
+        virtual bool read();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace LESModels
+} // End namespace incompressible
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
-- 
GitLab