FreeFOAM The Cross-Platform CFD Toolkit
epsilonWallFunctionFvPatchScalarField.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | Copyright (C) 2008-2010 OpenCFD Ltd.
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
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
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
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.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
29 #include <finiteVolume/volFields.H>
32 
33 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 
35 namespace Foam
36 {
37 namespace compressible
38 {
39 namespace RASModels
40 {
41 
42 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
43 
44 void epsilonWallFunctionFvPatchScalarField::checkType()
45 {
46  if (!isA<wallFvPatch>(patch()))
47  {
48  FatalErrorIn("epsilonWallFunctionFvPatchScalarField::checkType()")
49  << "Invalid wall function specification" << nl
50  << " Patch type for patch " << patch().name()
51  << " must be wall" << nl
52  << " Current patch type is " << patch().type() << nl << endl
53  << abort(FatalError);
54  }
55 }
56 
57 
58 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
59 
60 epsilonWallFunctionFvPatchScalarField::epsilonWallFunctionFvPatchScalarField
61 (
62  const fvPatch& p,
64 )
65 :
67  UName_("U"),
68  kName_("k"),
69  GName_("RASModel::G"),
70  muName_("mu"),
71  mutName_("mut"),
72  Cmu_(0.09),
73  kappa_(0.41),
74  E_(9.8)
75 {
76  checkType();
77 }
78 
79 
80 epsilonWallFunctionFvPatchScalarField::epsilonWallFunctionFvPatchScalarField
81 (
83  const fvPatch& p,
85  const fvPatchFieldMapper& mapper
86 )
87 :
88  fixedInternalValueFvPatchField<scalar>(ptf, p, iF, mapper),
89  UName_(ptf.UName_),
90  kName_(ptf.kName_),
91  GName_(ptf.GName_),
92  muName_(ptf.muName_),
93  mutName_(ptf.mutName_),
94  Cmu_(ptf.Cmu_),
95  kappa_(ptf.kappa_),
96  E_(ptf.E_)
97 {
98  checkType();
99 }
100 
101 
102 epsilonWallFunctionFvPatchScalarField::epsilonWallFunctionFvPatchScalarField
103 (
104  const fvPatch& p,
106  const dictionary& dict
107 )
108 :
110  UName_(dict.lookupOrDefault<word>("U", "U")),
111  kName_(dict.lookupOrDefault<word>("k", "k")),
112  GName_(dict.lookupOrDefault<word>("G", "RASModel::G")),
113  muName_(dict.lookupOrDefault<word>("mu", "mu")),
114  mutName_(dict.lookupOrDefault<word>("mut", "mut")),
115  Cmu_(dict.lookupOrDefault<scalar>("Cmu", 0.09)),
116  kappa_(dict.lookupOrDefault<scalar>("kappa", 0.41)),
117  E_(dict.lookupOrDefault<scalar>("E", 9.8))
118 {
119  checkType();
120 }
121 
122 
123 epsilonWallFunctionFvPatchScalarField::epsilonWallFunctionFvPatchScalarField
124 (
126 )
127 :
129  UName_(ewfpsf.UName_),
130  kName_(ewfpsf.kName_),
131  GName_(ewfpsf.GName_),
132  muName_(ewfpsf.muName_),
133  mutName_(ewfpsf.mutName_),
134  Cmu_(ewfpsf.Cmu_),
135  kappa_(ewfpsf.kappa_),
136  E_(ewfpsf.E_)
137 {
138  checkType();
139 }
140 
141 
142 epsilonWallFunctionFvPatchScalarField::epsilonWallFunctionFvPatchScalarField
143 (
146 )
147 :
149  UName_(ewfpsf.UName_),
150  kName_(ewfpsf.kName_),
151  GName_(ewfpsf.GName_),
152  muName_(ewfpsf.muName_),
153  mutName_(ewfpsf.mutName_),
154  Cmu_(ewfpsf.Cmu_),
155  kappa_(ewfpsf.kappa_),
156  E_(ewfpsf.E_)
157 {
158  checkType();
159 }
160 
161 
162 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
163 
164 void epsilonWallFunctionFvPatchScalarField::updateCoeffs()
165 {
166  if (updated())
167  {
168  return;
169  }
170 
171  const RASModel& rasModel = db().lookupObject<RASModel>("RASProperties");
172 
173  const scalar Cmu25 = pow(Cmu_, 0.25);
174  const scalar Cmu75 = pow(Cmu_, 0.75);
175 
176  const scalarField& y = rasModel.y()[patch().index()];
177 
178  volScalarField& G = const_cast<volScalarField&>
179  (db().lookupObject<volScalarField>(GName_));
180 
181  volScalarField& epsilon = const_cast<volScalarField&>
182  (db().lookupObject<volScalarField>(dimensionedInternalField().name()));
183 
184  const volScalarField& k = db().lookupObject<volScalarField>(kName_);
185 
186  const scalarField& muw =
187  patch().lookupPatchField<volScalarField, scalar>(muName_);
188 
189  const scalarField& mutw =
190  patch().lookupPatchField<volScalarField, scalar>(mutName_);
191 
192  const fvPatchVectorField& Uw =
193  patch().lookupPatchField<volVectorField, vector>(UName_);
194 
195  const scalarField magGradUw = mag(Uw.snGrad());
196 
197  // Set epsilon and G
198  forAll(mutw, faceI)
199  {
200  label faceCellI = patch().faceCells()[faceI];
201 
202  epsilon[faceCellI] = Cmu75*pow(k[faceCellI], 1.5)/(kappa_*y[faceI]);
203 
204  G[faceCellI] =
205  (mutw[faceI] + muw[faceI])
206  *magGradUw[faceI]
207  *Cmu25*sqrt(k[faceCellI])
208  /(kappa_*y[faceI]);
209  }
210 
211  // TODO: perform averaging for cells sharing more than one boundary face
212 
214 }
215 
216 
217 void epsilonWallFunctionFvPatchScalarField::evaluate
218 (
219  const Pstream::commsTypes commsType
220 )
221 {
223 }
224 
225 
226 void epsilonWallFunctionFvPatchScalarField::write(Ostream& os) const
227 {
229  writeEntryIfDifferent<word>(os, "U", "U", UName_);
230  writeEntryIfDifferent<word>(os, "k", "k", kName_);
231  writeEntryIfDifferent<word>(os, "G", "RASModel::G", GName_);
232  writeEntryIfDifferent<word>(os, "mu", "mu", muName_);
233  writeEntryIfDifferent<word>(os, "mut", "mut", mutName_);
234  os.writeKeyword("Cmu") << Cmu_ << token::END_STATEMENT << nl;
235  os.writeKeyword("kappa") << kappa_ << token::END_STATEMENT << nl;
236  os.writeKeyword("E") << E_ << token::END_STATEMENT << nl;
237  writeEntry("value", os);
238 }
239 
240 
241 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
242 
244 (
247 );
248 
249 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
250 
251 } // End namespace RASModels
252 } // End namespace compressible
253 } // End namespace Foam
254 
255 // ************************ vim: set sw=4 sts=4 et: ************************ //