initial commit for version 1.5.x patch release
[OpenFOAM-1.5.x.git] / src / turbulenceModels / RAS / incompressible / NonlinearKEShih / NonlinearKEShih.C
blobcef22b9d84e0bc9939843b0273075ff057eb261c
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2008 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 "NonlinearKEShih.H"
28 #include "addToRunTimeSelectionTable.H"
29 #include "wallFvPatch.H"
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
33 namespace Foam
35 namespace incompressible
37 namespace RASModels
40 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
42 defineTypeNameAndDebug(NonlinearKEShih, 0);
43 addToRunTimeSelectionTable(RASModel, NonlinearKEShih, dictionary);
45 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
47 // from components
48 NonlinearKEShih::NonlinearKEShih
50     const volVectorField& U,
51     const surfaceScalarField& phi,
52     transportModel& lamTransportModel
55     RASModel(typeName, U, phi, lamTransportModel),
57     C1_
58     (
59         dimensioned<scalar>::lookupOrAddToDict
60         (
61             "C1",
62             coeffDict_,
63             1.44
64         )
65     ),
66     C2_
67     (
68         dimensioned<scalar>::lookupOrAddToDict
69         (
70             "C2",
71             coeffDict_,
72             1.92
73         )
74     ),
75     alphak_
76     (
77         dimensioned<scalar>::lookupOrAddToDict
78         (
79             "alphak",
80             coeffDict_,
81             1.0
82         )
83     ),
84     alphaEps_
85     (
86         dimensioned<scalar>::lookupOrAddToDict
87         (
88             "alphaEps",
89             coeffDict_,
90             0.76923
91         )
92     ),
93     A1_
94     (
95         dimensioned<scalar>::lookupOrAddToDict
96         (
97             "A1",
98             coeffDict_,
99             1.25
100         )
101     ),
102     A2_
103     (
104         dimensioned<scalar>::lookupOrAddToDict
105         (
106             "A2",
107             coeffDict_,
108             1000.0
109         )
110     ),
111     Ctau1_
112     (
113         dimensioned<scalar>::lookupOrAddToDict
114         (
115             "Ctau1",
116             coeffDict_,
117             -4.0
118         )
119     ),
120     Ctau2_
121     (
122         dimensioned<scalar>::lookupOrAddToDict
123         (
124             "Ctau2",
125             coeffDict_,
126             13.0
127         )
128     ),
129     Ctau3_
130     (
131         dimensioned<scalar>::lookupOrAddToDict
132         (
133             "Ctau3",
134             coeffDict_,
135             -2.0
136         )
137     ),
138     alphaKsi_
139     (
140         dimensioned<scalar>::lookupOrAddToDict
141         (
142             "alphaKsi",
143             coeffDict_,
144             0.9
145         )
146     ),
148     k_
149     (
150         IOobject
151         (
152             "k",
153             runTime_.timeName(),
154             mesh_,
155             IOobject::MUST_READ,
156             IOobject::AUTO_WRITE
157         ),
158         mesh_
159     ),
161     epsilon_
162     (
163         IOobject
164         (
165             "epsilon",
166             runTime_.timeName(),
167             mesh_,
168             IOobject::MUST_READ,
169             IOobject::AUTO_WRITE
170         ),
171         mesh_
172     ),
174     gradU_(fvc::grad(U)),
175     eta_(k_/epsilon_*sqrt(2.0*magSqr(0.5*(gradU_ + gradU_.T())))),
176     ksi_(k_/epsilon_*sqrt(2.0*magSqr(0.5*(gradU_ - gradU_.T())))),
177     Cmu_(2.0/(3.0*(A1_ + eta_ + alphaKsi_*ksi_))),
178     fEta_(A2_ + pow(eta_, 3.0)),
180     nut_(Cmu_*sqr(k_)/(epsilon_ + epsilonSmall_)),
182     nonlinearStress_
183     (
184         "nonlinearStress",
185         symm
186         (
187             pow(k_, 3.0)/sqr(epsilon_)
188            *(
189                 Ctau1_/fEta_
190                *(
191                     (gradU_ & gradU_)
192                   + (gradU_ & gradU_)().T()
193                 )
194               + Ctau2_/fEta_*(gradU_ & gradU_.T())
195               + Ctau3_/fEta_*(gradU_.T() & gradU_)
196             )
197         )
198     )
200 #   include "wallNonlinearViscosityI.H"
202     printCoeffs();
206 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
208 tmp<volSymmTensorField> NonlinearKEShih::R() const
210     volTensorField gradU_ = fvc::grad(U_);
212     return tmp<volSymmTensorField>
213     (
214         new volSymmTensorField
215         (
216             IOobject
217             (
218                 "R",
219                 runTime_.timeName(),
220                 mesh_,
221                 IOobject::NO_READ,
222                 IOobject::NO_WRITE
223             ),
224             ((2.0/3.0)*I)*k_ - nut_*twoSymm(gradU_) + nonlinearStress_,
225             k_.boundaryField().types()
226         )
227     );
231 tmp<volSymmTensorField> NonlinearKEShih::devReff() const
233     return tmp<volSymmTensorField>
234     (
235         new volSymmTensorField
236         (
237             IOobject
238             (
239                 "devRhoReff",
240                 runTime_.timeName(),
241                 mesh_,
242                 IOobject::NO_READ,
243                 IOobject::NO_WRITE
244             ),
245            -nuEff()*dev(twoSymm(fvc::grad(U_))) + nonlinearStress_
246         )
247     );
251 tmp<fvVectorMatrix> NonlinearKEShih::divDevReff(volVectorField& U) const
253     return
254     (
255         fvc::div(nonlinearStress_)
256       - fvm::laplacian(nuEff(), U)
257       - fvc::div(nuEff()*dev(fvc::grad(U)().T()))
258     );
262 bool NonlinearKEShih::read()
264     if (RASModel::read())
265     {
266         C1_.readIfPresent(coeffDict_);
267         C2_.readIfPresent(coeffDict_);
268         alphak_.readIfPresent(coeffDict_);
269         alphaEps_.readIfPresent(coeffDict_);
270         A1_.readIfPresent(coeffDict_);
271         A2_.readIfPresent(coeffDict_);
272         Ctau1_.readIfPresent(coeffDict_);
273         Ctau2_.readIfPresent(coeffDict_);
274         Ctau3_.readIfPresent(coeffDict_);
275         alphaKsi_.readIfPresent(coeffDict_);
277         return true;
278     }
279     else
280     {
281         return false;
282     }
286 void NonlinearKEShih::correct()
288     transportModel_.correct();
290     if (!turbulence_)
291     {
292         return;
293     }
295     RASModel::correct();
297     gradU_ = fvc::grad(U_);
299     // generation term
300     volScalarField S2 = symm(gradU_) && gradU_;
302     volScalarField G =
303         Cmu_*sqr(k_)/epsilon_*S2
304       - (nonlinearStress_ && gradU_);
306 #   include "nonLinearWallFunctionsI.H"
308     // Dissipation equation
309     tmp<fvScalarMatrix> epsEqn
310     (
311         fvm::ddt(epsilon_)
312       + fvm::div(phi_, epsilon_)
313       - fvm::laplacian(DepsilonEff(), epsilon_)
314       ==
315         C1_*G*epsilon_/k_
316       - fvm::Sp(C2_*epsilon_/k_, epsilon_)
317     );
319     epsEqn().relax();
321 #   include "wallDissipationI.H"
323     solve(epsEqn);
324     bound(epsilon_, epsilon0_);
327     // Turbulent kinetic energy equation
329     tmp<fvScalarMatrix> kEqn
330     (
331         fvm::ddt(k_)
332       + fvm::div(phi_, k_)
333       - fvm::laplacian(DkEff(), k_)
334       ==
335         G
336       - fvm::Sp(epsilon_/k_, k_)
337     );
339     kEqn().relax();
340     solve(kEqn);
341     bound(k_, k0_);
344     // Re-calculate viscosity
346     eta_ = k_/epsilon_*sqrt(2.0*magSqr(0.5*(gradU_ + gradU_.T())));
347     ksi_ = k_/epsilon_*sqrt(2.0*magSqr(0.5*(gradU_ - gradU_.T())));
348     Cmu_ = 2.0/(3.0*(A1_ + eta_ + alphaKsi_*ksi_));
349     fEta_ = A2_ + pow(eta_, 3.0);
351     nut_ = Cmu_*sqr(k_)/epsilon_;
353 #   include "wallNonlinearViscosityI.H"
355     nonlinearStress_ = symm
356     (
357         pow(k_, 3.0)/sqr(epsilon_)
358        *(
359             Ctau1_/fEta_
360            *(
361                 (gradU_ & gradU_)
362               + (gradU_ & gradU_)().T()
363             )
364           + Ctau2_/fEta_*(gradU_ & gradU_.T())
365           + Ctau3_/fEta_*(gradU_.T() & gradU_)
366         )
367     );
371 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
373 } // End namespace RASModels
374 } // End namespace incompressible
375 } // End namespace Foam
377 // ************************************************************************* //