1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 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"
30 #include "backwardsCompatibilityWallFunctions.H"
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 namespace compressible
41 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
43 defineTypeNameAndDebug(kOmegaSST, 0);
44 addToRunTimeSelectionTable(RASModel, kOmegaSST, dictionary);
46 // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
48 tmp<volScalarField> kOmegaSST::F1(const volScalarField& CDkOmega) const
50 volScalarField CDkOmegaPlus = max
53 dimensionedScalar("1.0e-10", dimless/sqr(dimTime), 1.0e-10)
56 volScalarField arg1 = min
62 (scalar(1)/betaStar_)*sqrt(k_)/(omega_*y_),
63 scalar(500)*(mu()/rho_)/(sqr(y_)*omega_)
65 (4*alphaOmega2_)*k_/(CDkOmegaPlus*sqr(y_))
70 return tanh(pow4(arg1));
73 tmp<volScalarField> kOmegaSST::F2() const
75 volScalarField arg2 = min
79 (scalar(2)/betaStar_)*sqrt(k_)/(omega_*y_),
80 scalar(500)*(mu()/rho_)/(sqr(y_)*omega_)
85 return tanh(sqr(arg2));
89 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
93 const volScalarField& rho,
94 const volVectorField& U,
95 const surfaceScalarField& phi,
96 const basicThermo& thermophysicalModel
99 RASModel(typeName, rho, U, phi, thermophysicalModel),
103 dimensioned<scalar>::lookupOrAddToDict
112 dimensioned<scalar>::lookupOrAddToDict
121 dimensioned<scalar>::lookupOrAddToDict
130 dimensioned<scalar>::lookupOrAddToDict
139 dimensioned<scalar>::lookupOrAddToDict
148 dimensioned<scalar>::lookupOrAddToDict
157 dimensioned<scalar>::lookupOrAddToDict
166 dimensioned<scalar>::lookupOrAddToDict
175 dimensioned<scalar>::lookupOrAddToDict
184 dimensioned<scalar>::lookupOrAddToDict
193 dimensioned<scalar>::lookupOrAddToDict
202 dimensioned<scalar>::lookupOrAddToDict
222 autoCreateK("k", mesh_)
234 autoCreateOmega("omega", mesh_)
246 autoCreateMut("mut", mesh_)
258 autoCreateAlphat("alphat", mesh_)
261 mut_ = a1_*rho_*k_/max(a1_*omega_, F2()*sqrt(magSqr(symm(fvc::grad(U_)))));
262 mut_.correctBoundaryConditions();
265 alphat_.correctBoundaryConditions();
271 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
273 tmp<volSymmTensorField> kOmegaSST::R() const
275 return tmp<volSymmTensorField>
277 new volSymmTensorField
287 ((2.0/3.0)*I)*k_ - (mut_/rho_)*dev(twoSymm(fvc::grad(U_))),
288 k_.boundaryField().types()
294 tmp<volSymmTensorField> kOmegaSST::devRhoReff() const
296 return tmp<volSymmTensorField>
298 new volSymmTensorField
308 -muEff()*dev(twoSymm(fvc::grad(U_)))
314 tmp<fvVectorMatrix> kOmegaSST::divDevRhoReff(volVectorField& U) const
318 - fvm::laplacian(muEff(), U) - fvc::div(muEff()*dev2(fvc::grad(U)().T()))
323 bool kOmegaSST::read()
325 if (RASModel::read())
327 alphaK1_.readIfPresent(coeffDict());
328 alphaK2_.readIfPresent(coeffDict());
329 alphaOmega1_.readIfPresent(coeffDict());
330 alphaOmega2_.readIfPresent(coeffDict());
331 Prt_.readIfPresent(coeffDict());
332 gamma1_.readIfPresent(coeffDict());
333 gamma2_.readIfPresent(coeffDict());
334 beta1_.readIfPresent(coeffDict());
335 beta2_.readIfPresent(coeffDict());
336 betaStar_.readIfPresent(coeffDict());
337 a1_.readIfPresent(coeffDict());
338 c1_.readIfPresent(coeffDict());
349 void kOmegaSST::correct()
353 // Re-calculate viscosity
356 /max(a1_*omega_, F2()*sqrt(magSqr(symm(fvc::grad(U_)))));
357 mut_.correctBoundaryConditions();
359 // Re-calculate thermal diffusivity
361 alphat_.correctBoundaryConditions();
368 volScalarField divU = fvc::div(phi_/fvc::interpolate(rho_));
370 if (mesh_.changing())
377 divU += fvc::div(mesh_.phi());
380 tmp<volTensorField> tgradU = fvc::grad(U_);
381 volScalarField S2 = magSqr(symm(tgradU()));
382 volScalarField GbyMu = (tgradU() && dev(twoSymm(tgradU())));
383 volScalarField G("RASModel::G", mut_*GbyMu);
386 // Update omega and G at the wall
387 omega_.boundaryField().updateCoeffs();
389 volScalarField CDkOmega =
390 (2*alphaOmega2_)*(fvc::grad(k_) & fvc::grad(omega_))/omega_;
392 volScalarField F1 = this->F1(CDkOmega);
393 volScalarField rhoGammaF1 = rho_*gamma(F1);
395 // Turbulent frequency equation
396 tmp<fvScalarMatrix> omegaEqn
398 fvm::ddt(rho_, omega_)
399 + fvm::div(phi_, omega_)
400 - fvm::laplacian(DomegaEff(F1), omega_)
403 - fvm::SuSp((2.0/3.0)*rhoGammaF1*divU, omega_)
404 - fvm::Sp(rho_*beta(F1)*omega_, omega_)
407 rho_*(F1 - scalar(1))*CDkOmega/omega_,
414 omegaEqn().boundaryManipulate(omega_.boundaryField());
417 bound(omega_, omega0_);
419 // Turbulent kinetic energy equation
420 tmp<fvScalarMatrix> kEqn
424 - fvm::laplacian(DkEff(F1), k_)
426 min(G, (c1_*betaStar_)*rho_*k_*omega_)
427 - fvm::SuSp(2.0/3.0*rho_*divU, k_)
428 - fvm::Sp(rho_*betaStar_*omega_, k_)
436 // Re-calculate viscosity
437 mut_ = a1_*rho_*k_/max(a1_*omega_, F2()*sqrt(S2));
438 mut_.correctBoundaryConditions();
440 // Re-calculate thermal diffusivity
442 alphat_.correctBoundaryConditions();
446 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
448 } // End namespace RASModels
449 } // End namespace compressible
450 } // End namespace Foam
452 // ************************************************************************* //