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 incompressible
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)*nu()/(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)*nu()/(sqr(y_)*omega_)
84 return tanh(sqr(arg2));
88 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
92 const volVectorField& U,
93 const surfaceScalarField& phi,
94 transportModel& lamTransportModel
97 RASModel(typeName, U, phi, lamTransportModel),
101 dimensioned<scalar>::lookupOrAddToDict
110 dimensioned<scalar>::lookupOrAddToDict
119 dimensioned<scalar>::lookupOrAddToDict
128 dimensioned<scalar>::lookupOrAddToDict
137 dimensioned<scalar>::lookupOrAddToDict
146 dimensioned<scalar>::lookupOrAddToDict
155 dimensioned<scalar>::lookupOrAddToDict
164 dimensioned<scalar>::lookupOrAddToDict
173 dimensioned<scalar>::lookupOrAddToDict
182 dimensioned<scalar>::lookupOrAddToDict
191 dimensioned<scalar>::lookupOrAddToDict
199 omega0_("omega0", dimless/dimTime, SMALL),
200 omegaSmall_("omegaSmall", dimless/dimTime, SMALL),
204 dimensioned<scalar>::lookupOrAddToDict
240 nut_(a1_*k_/max(a1_*(omega_ + omegaSmall_), F2()*mag(symm(fvc::grad(U_)))))
242 # include "kOmegaWallViscosityI.H"
248 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
250 tmp<volSymmTensorField> kOmegaSST::R() const
252 return tmp<volSymmTensorField>
254 new volSymmTensorField
264 ((2.0/3.0)*I)*k_ - nut_*twoSymm(fvc::grad(U_)),
265 k_.boundaryField().types()
271 tmp<volSymmTensorField> kOmegaSST::devReff() const
273 return tmp<volSymmTensorField>
275 new volSymmTensorField
285 -nuEff()*dev(twoSymm(fvc::grad(U_)))
291 tmp<fvVectorMatrix> kOmegaSST::divDevReff(volVectorField& U) const
295 - fvm::laplacian(nuEff(), U)
296 - fvc::div(nuEff()*dev(fvc::grad(U)().T()))
301 bool kOmegaSST::read()
303 if (RASModel::read())
305 alphaK1_.readIfPresent(coeffDict_);
306 alphaK2_.readIfPresent(coeffDict_);
307 alphaOmega1_.readIfPresent(coeffDict_);
308 alphaOmega2_.readIfPresent(coeffDict_);
309 gamma1_.readIfPresent(coeffDict_);
310 gamma2_.readIfPresent(coeffDict_);
311 beta1_.readIfPresent(coeffDict_);
312 beta2_.readIfPresent(coeffDict_);
313 betaStar_.readIfPresent(coeffDict_);
314 a1_.readIfPresent(coeffDict_);
315 c1_.readIfPresent(coeffDict_);
316 Cmu_.readIfPresent(coeffDict_);
327 void kOmegaSST::correct()
329 transportModel_.correct();
338 if (mesh_.changing())
343 volScalarField S2 = magSqr(symm(fvc::grad(U_)));
344 volScalarField G = nut_*2*S2;
346 # include "kOmegaWallFunctionsI.H"
348 volScalarField CDkOmega =
349 (2*alphaOmega2_)*(fvc::grad(k_) & fvc::grad(omega_))/omega_;
351 volScalarField F1 = this->F1(CDkOmega);
353 // Turbulent frequency equation
354 tmp<fvScalarMatrix> omegaEqn
357 + fvm::div(phi_, omega_)
358 - fvm::Sp(fvc::div(phi_), omega_)
359 - fvm::laplacian(DomegaEff(F1), omega_)
362 - fvm::Sp(beta(F1)*omega_, omega_)
365 (F1 - scalar(1))*CDkOmega/omega_,
372 # include "wallOmegaI.H"
375 bound(omega_, omega0_);
377 // Turbulent kinetic energy equation
378 tmp<fvScalarMatrix> kEqn
382 - fvm::Sp(fvc::div(phi_), k_)
383 - fvm::laplacian(DkEff(F1), k_)
385 min(G, c1_*betaStar_*k_*omega_)
386 - fvm::Sp(betaStar_*omega_, k_)
394 // Re-calculate viscosity
395 nut_ = a1_*k_/max(a1_*omega_, F2()*sqrt(S2));
397 # include "kOmegaWallViscosityI.H"
402 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
404 } // End namespace RASModels
405 } // End namespace incompressible
406 } // End namespace Foam
408 // ************************************************************************* //