Loading...
Searching...
No Matches
IntegralScaleBox.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) 2022-2025 OpenCFD Ltd.
9-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26Class
27 Foam::turbulence::IntegralScaleBox
28
29Description
30 Class to describe the integral-scale container being used in the
31 \c turbulentDigitalFilterInletFvPatchField boundary condition.
32
33SourceFiles
34 IntegralScaleBox.C
35
36\*---------------------------------------------------------------------------*/
37
38#ifndef Foam_IntegralScaleBox_H
39#define Foam_IntegralScaleBox_H
40
41#include "Random.H"
42#include "primitivePatch.H"
43#include "boundBox.H"
44#include "coordinateSystem.H"
46// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
47
48namespace Foam
49{
50namespace turbulence
51{
52
53/*---------------------------------------------------------------------------*\
54 Class IntegralScaleBox Declaration
55\*---------------------------------------------------------------------------*/
56
57template<class Type>
59{
60 // Private Typedefs
61
62 //- Type of input set of integral scales
63 using TypeL = std::conditional_t
64 <
65 std::is_same_v<scalar, Type>,
66 vector,
67 tensor
68 >;
69
70
71 // Private Enumerations
72
73 //- Options for the correlation function form
74 enum kernelType : bool
75 {
76 GAUSSIAN = true,
77 EXPONENTIAL = false
78 };
79
80 //- Names for kernelType
81 static const Enum<kernelType> kernelTypeNames;
82
83
84 // Private Data
85
86 //- Const reference to patch
87 const fvPatch& p_;
88
89 //- Virtual patch of the integral-scale box
91
92 //- Local coordinate system
94
95 //- Correlation function form of the kernel
96 const enum kernelType kernelType_;
97
98 //- Random number generator
99 Random rndGen_;
100
101 //- Number of faces on integral-scale box inlet plane (<e2> <e3>)
102 const Vector2D<label> n_;
103
104 //- Uniform cell size on integral-scale box inlet plane [m]
105 Vector2D<scalar> delta_;
106
107 //- Span of patch bounding box in local coordinate system
108 vector boundingBoxSpan_;
109
110 //- Min point of patch bounding box in local coordinate system
111 vector boundingBoxMin_;
112
113 //- Integral scale set in local coordinates
114 const TypeL L_;
115
116 //- Random-number box ranges to be filtered by corresponding kernels
117 // e.g. for U: (Lxu, Lxv, Lxw, Lyu, Lyv, Lyw, Lzu, Lzv, Lzw)
118 labelList spans_;
119
120 //- Random-number box
121 // First List: Components of physical variable, e.g. (u,v,w)
122 // Second List: Containing all random numbers in a continuous list
123 // for each component of Cartesian coordinate system, e.g. (x,y,z)
124 // e.g. for U, box_[0] contains sets for u-component in x-y-z order
125 scalarListList box_;
126
127 //- Kernel coefficients corresponding to L [-]
128 scalarListList kernel_;
129
130 //- Vertices of virtual patch of the integral-scale box
131 pointField patchPoints_;
132
133 //- Faces of virtual patch of the integral-scale box
134 faceList patchFaces_;
135
136 // Forward-stepwise method information
137
138 //- Flag to enable the forward-stepwise method
139 const bool fsm_;
140
141 //- One of the two exponential functions in FSM
142 Type C1_;
143
144 //- One of the two exponential functions in FSM
145 Type C2_;
146
147 //- Kernel-applied previous-time-step slice field in FSM
148 Field<Type> slice_;
149
150
151 // Private Member Functions
152
153 //- Initialise the local coordinate system with dictionary
154 autoPtr<coordinateSystem> calcCoordinateSystem
155 (
156 const dictionary& dict
157 ) const;
158
159 //- Initialise the local coordinate system with patch properties
160 void calcCoordinateSystem();
161
162 //- Initialise the bounding box in local coordinates
163 Vector2D<vector> calcBoundBox() const;
164
165 //- Initialise the object: delta
166 Vector2D<scalar> calcDelta() const;
167
168 //- Initialise the object: spans
169 labelList calcSpans() const;
170
171 //- Return the kernel once per simulation
172 scalarListList calcKernel() const;
173
174 //- Initialise the object: box
175 scalarListList calcBox();
176
177 //- Initialise the object: patchPoints
178 pointField calcPatchPoints() const;
179
180 //- Initialise the object: patchFaces
181 faceList calcPatchFaces() const;
182
183 //- Initialise the object: virtual patch
184 void calcPatch();
185
186 //- Convert integral scales in seconds/meters
187 //- to time-step units/integral-scale box inlet cell-size units
188 TypeL convert(const TypeL& L) const;
189
190 // Forward-stepwise method
191
192 //- Initialise the object: C1 for scalar fields
193 scalar calcC1(const vector& L) const;
194
195 //- Initialise the object: C1 for vector fields
196 vector calcC1(const tensor& L) const;
197
198 //- Initialise the object: C2 for scalar fields
199 scalar calcC2(const vector& L) const;
200
201 //- Initialise the object: C2 for vector fields
202 vector calcC2(const tensor& L) const;
203
204 //- Update C1 and C2 coefficients
205 void updateC1C2();
206
207
208 //- No copy assignment
209 void operator=(const IntegralScaleBox&) = delete;
210
211
212public:
213
214 // Constructors
215
216 //- Construct from patch
217 explicit IntegralScaleBox(const fvPatch& p);
218
219 //- Copy construct with patch
221
222 //- Construct from patch and dictionary
223 IntegralScaleBox(const fvPatch& p, const dictionary& dict);
224
225 //- Copy construct
227
228
229 // Public Data
230
231 //- Flag to activate debug statements
232 static int debug;
233
234
235 // Member Functions
236
237 // Access
238
239 //- Return const reference to integral-scale box inlet patch
240 const primitivePatch& patch()
241 {
242 if (!patchPtr_)
243 {
244 calcPatch();
245 }
246
247 return *patchPtr_;
248 }
249
250 //- Return the object: fsm
251 bool fsm() const noexcept
252 {
253 return fsm_;
254 }
255
256
257 // Evaluation
258
259 //- Initialise integral-scale box properties
260 // Avoid constructor level evaluations
261 void initialise();
262
263 //- Discard current time-step integral-scale box slice (the closest
264 //- to the patch) by shifting from the back to the front
265 void shift();
266
267 //- Add a new integral-scale box slice to the rear of the box
268 void refill();
269
270 //- Embed two-point correlations, i.e. L
271 // Apply three-dimensional "valid"-type separable
272 // convolution summation algorithm
273 Field<Type> convolve() const;
274
275 // Forward-stepwise method
276
277 //- Apply forward-stepwise correlation for scalar fields
279
280 //- Apply forward-stepwise correlation for vector fields
282
283
284 // I-O
285
286 //- Write integral-scale box settings
287 void write(Ostream&) const;
288};
289
290
291// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
292
293} // End namespace turbulence
294} // End namespace Foam
295
296// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
297
298#ifdef NoRepository
299 #include "IntegralScaleBox.C"
300#endif
301
302#endif
303
304// ************************************************************************* //
Info<< nl;Info<< "Write faMesh in vtk format:"<< nl;{ vtk::uindirectPatchWriter writer(aMesh.patch(), fileName(aMesh.time().globalPath()/vtkBaseFileName));writer.writeGeometry();globalIndex procAddr(aMesh.nFaces());labelList cellIDs;if(UPstream::master()) { cellIDs.resize(procAddr.totalSize());for(const labelRange &range :procAddr.ranges()) { auto slice=cellIDs.slice(range);slice=identity(range);} } writer.beginCellData(4);writer.writeProcIDs();writer.write("cellID", cellIDs);writer.write("area", aMesh.S().field());writer.write("normal", aMesh.faceAreaNormals());writer.beginPointData(1);writer.write("normal", aMesh.pointAreaNormals());Info<< " "<< writer.output().name()<< nl;}{ vtk::lineWriter writer(aMesh.points(), aMesh.edges(), fileName(aMesh.time().globalPath()/(vtkBaseFileName+"-edges")));writer.writeGeometry();writer.beginCellData(4);writer.writeProcIDs();{ Field< scalar > fld(faMeshTools::flattenEdgeField(aMesh.magLe(), true))
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
Definition Enum.H:57
Generic templated field type that is much like a Foam::List except that it is expected to hold numeri...
Definition Field.H:172
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition Ostream.H:59
Random number generator.
Definition Random.H:56
Templated 2D Vector derived from VectorSpace adding construction from 2 components,...
Definition Vector2D.H:54
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
Definition autoPtr.H:65
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition dictionary.H:133
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition fvPatch.H:71
void initialise()
Initialise integral-scale box properties.
void refill()
Add a new integral-scale box slice to the rear of the box.
const primitivePatch & patch()
Return const reference to integral-scale box inlet patch.
void shift()
Discard current time-step integral-scale box slice (the closest to the patch) by shifting from the ba...
IntegralScaleBox(const fvPatch &p)
Construct from patch.
bool fsm() const noexcept
Return the object: fsm.
void correlate(scalarField &fld)
Apply forward-stepwise correlation for scalar fields.
static int debug
Flag to activate debug statements.
Field< Type > convolve() const
Embed two-point correlations, i.e. L.
volScalarField & p
Namespace for OpenFOAM.
List< scalarList > scalarListList
List of scalarList.
Definition scalarList.H:35
List< label > labelList
A List of labels.
Definition List.H:62
PrimitivePatch< SubList< face >, const pointField & > primitivePatch
A PrimitivePatch with a SubList addressing for the faces, const reference for the point field.
List< face > faceList
List of faces.
Definition faceListFwd.H:41
Tensor< scalar > tensor
Definition symmTensor.H:57
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
Field< vector > vectorField
Specialisation of Field<T> for vector.
const direction noexcept
Definition scalarImpl.H:265
vectorField pointField
pointField is a vectorField.
Vector< scalar > vector
Definition vector.H:57
runTime write()
dictionary dict
volScalarField & b
const vector L(dict.get< vector >("L"))