nutUSpaldingWallFunctionFvPatchScalarField.H
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9  Copyright (C) 2019-2022 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 Class
28  Foam::nutUSpaldingWallFunctionFvPatchScalarField
29 
30 Group
31  grpWallFunctions
32 
33 Description
34  This boundary condition provides a wall function for the turbulent
35  viscosity (i.e. \c nut) based on velocity (i.e. \c U). Using Spalding's
36  law gives a continuous \c nut profile to the wall.
37 
38  \f[
39  y^+ = u^+ + \frac{1}{E} \left[exp(\kappa u^+) - 1 - \kappa u^+\,
40  - 0.5 (\kappa u^+)^2 - \frac{1}{6} (\kappa u^+)^3\right]
41  \f]
42 
43  where
44  \vartable
45  y^+ | Wall-normal height of a cell centre in wall units
46  u^+ | Velocity at \f$y^+\f$ in wall units
47  \kappa | von Karman constant
48  \endvartable
49 
50 Usage
51  Example of the boundary condition specification:
52  \verbatim
53  <patchName>
54  {
55  // Mandatory entries
56  type nutUSpaldingWallFunction;
57 
58  // Optional entries
59  maxIter 10;
60  tolerance 0.0001;
61 
62  // Inherited entries
63  ...
64  }
65  \endverbatim
66 
67  where the entries mean:
68  \table
69  Property | Description | Type | Reqd | Deflt
70  type | Type name: nutUSpaldingWallFunction | word | yes | -
71  maxIter | Number of Newton-Raphson iterations | label | no | 10
72  tolerance | Convergence tolerance | scalar | no | 0.0001
73  \endtable
74 
75  The inherited entries are elaborated in:
76  - \link nutWallFunctionFvPatchScalarField.H \endlink
77 
78 Note
79  - Suffers from non-exact restart since \c correctNut() (called through
80  \c turbulence->validate) returns a slightly different value every time
81  it is called. This is since the seed for the Newton-Raphson iteration
82  uses the current value of \c *this (\c =nut ).
83  - This can be avoided by overriding the tolerance. This also switches on
84  a pre-detection whether the current nut already satisfies the turbulence
85  conditions and if so does not change it at all. This means that the nut
86  only changes if it 'has really changed'. This probably should be used with
87  a tight tolerance, to make sure to kick every iteration, e.g.
88  maxIter 100;
89  tolerance 1e-7;
90 
91 SourceFiles
92  nutUSpaldingWallFunctionFvPatchScalarField.C
93 
94 \*---------------------------------------------------------------------------*/
95 
96 #ifndef nutUSpaldingWallFunctionFvPatchScalarField_H
97 #define nutUSpaldingWallFunctionFvPatchScalarField_H
98 
100 
101 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
102 
103 namespace Foam
104 {
105 
106 /*---------------------------------------------------------------------------*\
107  Class nutUSpaldingWallFunctionFvPatchScalarField Declaration
108 \*---------------------------------------------------------------------------*/
109 
110 class nutUSpaldingWallFunctionFvPatchScalarField
111 :
112  public nutWallFunctionFvPatchScalarField
113 {
114 protected:
115 
116  // Protected Data
117 
118  //- Max iterations in calcNut
119  const label maxIter_;
120 
121  //- Convergence tolerance
122  const scalar tolerance_;
123 
124  //- Uncomment in case of intrumentation
125  //mutable uint64_t invocations_;
126  //mutable uint64_t nontrivial_;
127  //mutable uint64_t nonconvergence_;
128  //mutable uint64_t iterations_;
129 
130 
131  // Protected Member Functions
132 
133  //- Calculate the turbulent viscosity
134  virtual tmp<scalarField> calcNut() const;
135 
136  //- Calculate the friction velocity
137  tmp<scalarField> calcUTau(const scalarField& magGradU) const;
138 
139  //- Calculate the friction velocity and number of iterations for
140  //- convergence
142  (
143  const scalarField& magGradU,
144  const label maxIter,
145  scalarField& err
146  ) const;
147 
148  //- Write local wall function variables
149  void writeLocalEntries(Ostream&) const;
150 
151 
152 public:
153 
154  //- Runtime type information
155  TypeName("nutUSpaldingWallFunction");
156 
158  // Constructors
159 
160  //- Construct from patch and internal field
162  (
163  const fvPatch&,
165  );
166 
167  //- Construct from patch, internal field and dictionary
169  (
170  const fvPatch&,
172  const dictionary&
173  );
174 
175  //- Construct by mapping given
176  //- nutUSpaldingWallFunctionFvPatchScalarField
177  //- onto a new patch
179  (
181  const fvPatch&,
183  const fvPatchFieldMapper&
184  );
185 
186  //- Construct as copy
188  (
190  );
191 
192  //- Construct and return a clone
193  virtual tmp<fvPatchScalarField> clone() const
194  {
196  (
198  );
199  }
200 
201  //- Construct as copy setting internal field reference
203  (
206  );
207 
208  //- Construct and return a clone setting internal field reference
210  (
212  ) const
213  {
215  (
217  );
218  }
219 
220 
221  //- Destructor
223 
224 
225  // Member Functions
226 
227  // Evaluation
228 
229  //- Calculate and return the yPlus at the boundary
230  virtual tmp<scalarField> yPlus() const;
231 
232 
233  // I-O
234 
235  //- Write
236  virtual void write(Ostream& os) const;
237 };
238 
239 
240 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
241 
242 } // End namespace Foam
243 
244 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
245 
246 #endif
247 
248 // ************************************************************************* //
void writeLocalEntries(Ostream &) const
Write local wall function variables.
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:129
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition: fvPatch.H:70
This boundary condition provides a wall function for the turbulent viscosity (i.e. nut) based on velocity (i.e. U). Using Spalding&#39;s law gives a continuous nut profile to the wall.
tmp< scalarField > calcUTau(const scalarField &magGradU) const
Calculate the friction velocity.
nutUSpaldingWallFunctionFvPatchScalarField(const fvPatch &, const DimensionedField< scalar, volMesh > &)
Construct from patch and internal field.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
A FieldMapper for finite-volume patch fields.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
Definition: Ostream.H:56
virtual tmp< scalarField > calcNut() const
Uncomment in case of intrumentation.
OBJstream os(runTime.globalPath()/outputName)
virtual tmp< fvPatchScalarField > clone() const
Construct and return a clone.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Definition: areaFieldsFwd.H:42
virtual tmp< scalarField > yPlus() const
Calculate and return the yPlus at the boundary.
A class for managing temporary objects.
Definition: HashPtrTable.H:50
TypeName("nutUSpaldingWallFunction")
Runtime type information.
Namespace for OpenFOAM.