initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / src / turbulenceModels / compressible / RAS / SpalartAllmaras / SpalartAllmaras.C
blob603ed83962dcf182fc74ed49178fd8af9fb7f1f3
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
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
19     for more details.
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 "SpalartAllmaras.H"
28 #include "addToRunTimeSelectionTable.H"
30 #include "backwardsCompatibilityWallFunctions.H"
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 namespace Foam
36 namespace compressible
38 namespace RASModels
41 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
43 defineTypeNameAndDebug(SpalartAllmaras, 0);
44 addToRunTimeSelectionTable(RASModel, SpalartAllmaras, dictionary);
46 // * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
48 tmp<volScalarField> SpalartAllmaras::chi() const
50     return rho_*nuTilda_/mu();
54 tmp<volScalarField> SpalartAllmaras::fv1(const volScalarField& chi) const
56     volScalarField chi3 = pow3(chi);
57     return chi3/(chi3 + pow3(Cv1_));
61 tmp<volScalarField> SpalartAllmaras::fv2
63     const volScalarField& chi,
64     const volScalarField& fv1
65 ) const
67     return 1.0/pow3(scalar(1) + chi/Cv2_);
71 tmp<volScalarField> SpalartAllmaras::fv3
73     const volScalarField& chi,
74     const volScalarField& fv1
75 ) const
77     volScalarField chiByCv2 = (1/Cv2_)*chi;
79     return
80         (scalar(1) + chi*fv1)
81        *(1/Cv2_)
82        *(3*(scalar(1) + chiByCv2) + sqr(chiByCv2))
83        /pow3(scalar(1) + chiByCv2);
87 tmp<volScalarField> SpalartAllmaras::fw(const volScalarField& Stilda) const
89     volScalarField r = min
90     (
91         nuTilda_
92        /(
93            max(Stilda, dimensionedScalar("SMALL", Stilda.dimensions(), SMALL))
94            *sqr(kappa_*d_)
95         ),
96         scalar(10.0)
97     );
98     r.boundaryField() == 0.0;
100     volScalarField g = r + Cw2_*(pow6(r) - r);
102     return g*pow((1.0 + pow6(Cw3_))/(pow6(g) + pow6(Cw3_)), 1.0/6.0);
106 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
108 SpalartAllmaras::SpalartAllmaras
110     const volScalarField& rho,
111     const volVectorField& U,
112     const surfaceScalarField& phi,
113     const basicThermo& thermophysicalModel
116     RASModel(typeName, rho, U, phi, thermophysicalModel),
118     sigmaNut_
119     (
120         dimensioned<scalar>::lookupOrAddToDict
121         (
122             "sigmaNut",
123             coeffDict_,
124             0.66666
125         )
126     ),
127     kappa_
128     (
129         dimensioned<scalar>::lookupOrAddToDict
130         (
131             "kappa",
132             coeffDict_,
133             0.41
134         )
135     ),
136     Prt_
137     (
138         dimensioned<scalar>::lookupOrAddToDict
139         (
140             "Prt",
141             coeffDict_,
142             1.0
143         )
144     ),
146     Cb1_
147     (
148         dimensioned<scalar>::lookupOrAddToDict
149         (
150             "Cb1",
151             coeffDict_,
152             0.1355
153         )
154     ),
155     Cb2_
156     (
157         dimensioned<scalar>::lookupOrAddToDict
158         (
159             "Cb2",
160             coeffDict_,
161             0.622
162         )
163     ),
164     Cw1_(Cb1_/sqr(kappa_) + (1.0 + Cb2_)/sigmaNut_),
165     Cw2_
166     (
167         dimensioned<scalar>::lookupOrAddToDict
168         (
169             "Cw2",
170             coeffDict_,
171             0.3
172         )
173     ),
174     Cw3_
175     (
176         dimensioned<scalar>::lookupOrAddToDict
177         (
178             "Cw3",
179             coeffDict_,
180             2.0
181         )
182     ),
183     Cv1_
184     (
185         dimensioned<scalar>::lookupOrAddToDict
186         (
187             "Cv1",
188             coeffDict_,
189             7.1
190         )
191     ),
192     Cv2_
193     (
194         dimensioned<scalar>::lookupOrAddToDict
195         (
196             "Cv2",
197             coeffDict_,
198             5.0
199         )
200     ),
202     nuTilda_
203     (
204         IOobject
205         (
206             "nuTilda",
207             runTime_.timeName(),
208             mesh_,
209             IOobject::MUST_READ,
210             IOobject::AUTO_WRITE
211         ),
212         mesh_
213     ),
215     mut_
216     (
217         IOobject
218         (
219             "mut",
220             runTime_.timeName(),
221             mesh_,
222             IOobject::MUST_READ,
223             IOobject::AUTO_WRITE
224         ),
225         mesh_
226     ),
228     alphat_
229     (
230         IOobject
231         (
232             "alphat",
233             runTime_.timeName(),
234             mesh_,
235             IOobject::NO_READ,
236             IOobject::AUTO_WRITE
237         ),
238         autoCreateAlphat("alphat", mesh_)
239     ),
241     d_(mesh_)
243     alphat_ = mut_/Prt_;
244     alphat_.correctBoundaryConditions();
246     printCoeffs();
250 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
252 tmp<volSymmTensorField> SpalartAllmaras::R() const
254     return tmp<volSymmTensorField>
255     (
256         new volSymmTensorField
257         (
258             IOobject
259             (
260                 "R",
261                 runTime_.timeName(),
262                 mesh_,
263                 IOobject::NO_READ,
264                 IOobject::NO_WRITE
265             ),
266             ((2.0/3.0)*I)*k() - (mut_/rho_)*dev(twoSymm(fvc::grad(U_)))
267         )
268     );
272 tmp<volSymmTensorField> SpalartAllmaras::devRhoReff() const
274     return tmp<volSymmTensorField>
275     (
276         new volSymmTensorField
277         (
278             IOobject
279             (
280                 "devRhoReff",
281                 runTime_.timeName(),
282                 mesh_,
283                 IOobject::NO_READ,
284                 IOobject::NO_WRITE
285             ),
286            -muEff()*dev(twoSymm(fvc::grad(U_)))
287         )
288     );
292 tmp<fvVectorMatrix> SpalartAllmaras::divDevRhoReff(volVectorField& U) const
294     volScalarField muEff_ = muEff();
296     return
297     (
298       - fvm::laplacian(muEff_, U)
299       - fvc::div(muEff_*dev2(fvc::grad(U)().T()))
300     );
304 bool SpalartAllmaras::read()
306     if (RASModel::read())
307     {
308         sigmaNut_.readIfPresent(coeffDict());
309         kappa_.readIfPresent(coeffDict());
310         Prt_.readIfPresent(coeffDict());
312         Cb1_.readIfPresent(coeffDict());
313         Cb2_.readIfPresent(coeffDict());
314         Cw1_ = Cb1_/sqr(kappa_) + (1.0 + Cb2_)/sigmaNut_;
315         Cw2_.readIfPresent(coeffDict());
316         Cw3_.readIfPresent(coeffDict());
317         Cv1_.readIfPresent(coeffDict());
318         Cv2_.readIfPresent(coeffDict());
320         return true;
321     }
322     else
323     {
324         return false;
325     }
329 void SpalartAllmaras::correct()
331     if (!turbulence_)
332     {
333         // Re-calculate viscosity
334         mut_ = rho_*nuTilda_*fv1(chi());
335         mut_.correctBoundaryConditions();
337         // Re-calculate thermal diffusivity
338         alphat_ = mut_/Prt_;
339         alphat_.correctBoundaryConditions();
341         return;
342     }
344     RASModel::correct();
346     if (mesh_.changing())
347     {
348         d_.correct();
349     }
351     volScalarField chi = this->chi();
352     volScalarField fv1 = this->fv1(chi);
354     volScalarField Stilda =
355         fv3(chi, fv1)*::sqrt(2.0)*mag(skew(fvc::grad(U_)))
356       + fv2(chi, fv1)*nuTilda_/sqr(kappa_*d_);
358     tmp<fvScalarMatrix> nuTildaEqn
359     (
360         fvm::ddt(rho_, nuTilda_)
361       + fvm::div(phi_, nuTilda_)
362       - fvm::laplacian(DnuTildaEff(), nuTilda_)
363       - Cb2_/sigmaNut_*rho_*magSqr(fvc::grad(nuTilda_))
364      ==
365         Cb1_*rho_*Stilda*nuTilda_
366       - fvm::Sp(Cw1_*fw(Stilda)*nuTilda_*rho_/sqr(d_), nuTilda_)
367     );
369     nuTildaEqn().relax();
370     solve(nuTildaEqn);
371     bound(nuTilda_, dimensionedScalar("0", nuTilda_.dimensions(), 0.0));
372     nuTilda_.correctBoundaryConditions();
374     // Re-calculate viscosity
375     mut_.internalField() = fv1*nuTilda_.internalField()*rho_.internalField();
376     mut_.correctBoundaryConditions();
378     // Re-calculate thermal diffusivity
379     alphat_ = mut_/Prt_;
380     alphat_.correctBoundaryConditions();
384 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
386 } // End namespace RASModels
387 } // End namespace compressible
388 } // End namespace Foam
390 // ************************************************************************* //