1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "kOmegaSST.H"
28 #include "addToRunTimeSelectionTable.H"
29 #include "wallFvPatch.H"
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
35 namespace compressible
40 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
42 defineTypeNameAndDebug(kOmegaSST, 0);
43 addToRunTimeSelectionTable(RASModel, kOmegaSST, dictionary);
45 // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
47 tmp<volScalarField> kOmegaSST::F1(const volScalarField& CDkOmega) const
49 volScalarField CDkOmegaPlus = max
52 dimensionedScalar("1.0e-10", dimless/sqr(dimTime), 1.0e-10)
55 volScalarField arg1 = min
61 (scalar(1)/betaStar_)*sqrt(k_)/(omega_*y_),
62 scalar(500)*(mu()/rho_)/(sqr(y_)*omega_)
64 (4*alphaOmega2_)*k_/(CDkOmegaPlus*sqr(y_))
69 return tanh(pow4(arg1));
72 tmp<volScalarField> kOmegaSST::F2() const
74 volScalarField arg2 = min
78 (scalar(2)/betaStar_)*sqrt(k_)/(omega_*y_),
79 scalar(500)*(mu()/rho_)/(sqr(y_)*omega_)
84 return tanh(sqr(arg2));
88 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
92 const volScalarField& rho,
93 const volVectorField& U,
94 const surfaceScalarField& phi,
95 basicThermo& thermophysicalModel
98 RASModel(typeName, rho, U, phi, thermophysicalModel),
102 dimensioned<scalar>::lookupOrAddToDict
111 dimensioned<scalar>::lookupOrAddToDict
120 dimensioned<scalar>::lookupOrAddToDict
129 dimensioned<scalar>::lookupOrAddToDict
138 dimensioned<scalar>::lookupOrAddToDict
147 dimensioned<scalar>::lookupOrAddToDict
156 dimensioned<scalar>::lookupOrAddToDict
165 dimensioned<scalar>::lookupOrAddToDict
174 dimensioned<scalar>::lookupOrAddToDict
183 dimensioned<scalar>::lookupOrAddToDict
192 dimensioned<scalar>::lookupOrAddToDict
201 dimensioned<scalar>::lookupOrAddToDict
209 omega0_("omega0", dimless/dimTime, SMALL),
210 omegaSmall_("omegaSmall", dimless/dimTime, SMALL),
214 dimensioned<scalar>::lookupOrAddToDict
260 a1_*rho_*k_/max(a1_*omega_, F2()*sqrt(magSqr(symm(fvc::grad(U_)))))
263 # include "kOmegaWallViscosityI.H"
269 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
271 tmp<volSymmTensorField> kOmegaSST::R() const
273 return tmp<volSymmTensorField>
275 new volSymmTensorField
285 ((2.0/3.0)*I)*k_ - (mut_/rho_)*dev(twoSymm(fvc::grad(U_))),
286 k_.boundaryField().types()
292 tmp<volSymmTensorField> kOmegaSST::devRhoReff() const
294 return tmp<volSymmTensorField>
296 new volSymmTensorField
306 -muEff()*dev(twoSymm(fvc::grad(U_)))
312 tmp<fvVectorMatrix> kOmegaSST::divDevRhoReff(volVectorField& U) const
316 - fvm::laplacian(muEff(), U) - fvc::div(muEff()*dev2(fvc::grad(U)().T()))
321 bool kOmegaSST::read()
323 if (RASModel::read())
325 alphaK1_.readIfPresent(coeffDict_);
326 alphaK2_.readIfPresent(coeffDict_);
327 alphaOmega1_.readIfPresent(coeffDict_);
328 alphaOmega2_.readIfPresent(coeffDict_);
329 alphah_.readIfPresent(coeffDict_);
330 gamma1_.readIfPresent(coeffDict_);
331 gamma2_.readIfPresent(coeffDict_);
332 beta1_.readIfPresent(coeffDict_);
333 beta2_.readIfPresent(coeffDict_);
334 betaStar_.readIfPresent(coeffDict_);
335 a1_.readIfPresent(coeffDict_);
336 c1_.readIfPresent(coeffDict_);
337 Cmu_.readIfPresent(coeffDict_);
348 void kOmegaSST::correct()
352 // Re-calculate viscosity
355 /max(a1_*omega_, F2()*sqrt(magSqr(symm(fvc::grad(U_)))));
356 # include "kOmegaWallViscosityI.H"
362 volScalarField divU = fvc::div(phi_/fvc::interpolate(rho_));
364 if (mesh_.changing())
371 divU += fvc::div(mesh_.phi());
374 tmp<volTensorField> tgradU = fvc::grad(U_);
375 volScalarField S2 = magSqr(symm(tgradU()));
376 volScalarField GbyMu = (tgradU() && dev(twoSymm(tgradU())));
377 volScalarField G = mut_*GbyMu;
380 # include "kOmegaWallFunctionsI.H"
382 volScalarField CDkOmega =
383 (2*alphaOmega2_)*(fvc::grad(k_) & fvc::grad(omega_))/omega_;
385 volScalarField F1 = this->F1(CDkOmega);
386 volScalarField rhoGammaF1 = rho_*gamma(F1);
388 // Turbulent frequency equation
389 tmp<fvScalarMatrix> omegaEqn
391 fvm::ddt(rho_, omega_)
392 + fvm::div(phi_, omega_)
393 - fvm::laplacian(DomegaEff(F1), omega_)
396 - fvm::SuSp((2.0/3.0)*rhoGammaF1*divU, omega_)
397 - fvm::Sp(rho_*beta(F1)*omega_, omega_)
400 rho_*(F1 - scalar(1))*CDkOmega/omega_,
407 # include "wallOmegaI.H"
410 bound(omega_, omega0_);
412 // Turbulent kinetic energy equation
413 tmp<fvScalarMatrix> kEqn
417 - fvm::laplacian(DkEff(F1), k_)
419 min(G, (c1_*betaStar_)*rho_*k_*omega_)
420 - fvm::SuSp(2.0/3.0*rho_*divU, k_)
421 - fvm::Sp(rho_*betaStar_*omega_, k_)
429 // Re-calculate viscosity
430 mut_ = a1_*rho_*k_/max(a1_*omega_, F2()*sqrt(S2));
432 # include "kOmegaWallViscosityI.H"
437 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
439 } // End namespace RASModels
440 } // End namespace compressible
441 } // End namespace Foam
443 // ************************************************************************* //