Neko 0.9.99
A portable framework for high-order spectral element flow simulations
|
Statistics in the context of Neko, is the common name for fields that are averaged in time and possible also space.
The statistics module in Neko computes the temporal average of a wide range of fields.
In this page we use the following convention for a field
The temporal average of a field \(u\) is the approximation of the integral
$$ \langle u \rangle_t = \int_{T_0}^{T_N} u dt $$
In Neko, this is computed as
$$ \langle u \rangle_t = \sum_{i=0}^N u_i \Delta t_i $$ where \( u_0 \) is the fields value at \( T_0 \) and \( N \) is the number of time steps needed to reach \( T_N \), \( T_N = T_0 + \sum_{i=0}^N \Delta t_i \).
In the statistics in Neko, various averages of the the different velocity components, derivatives and pressure are computed. In total, 44 "raw statistics" are computed that are required to compute the Reynolds stress budgets, mean fields, and the different terms in the turbulent kinetic energy equation.
Statistics are enable in the the case file as a simcomp with the added argument avg_direction
, set_of_stats
, and start_time
:
Name | Description | Admissible values | Default value |
---|---|---|---|
start_time | Time at which to start gathering statistics. | Positive real | 0 |
avg_direction | Directions to compute spatial average. | x,y,z,xy,xz,yz | No spatial average |
set_of_stats | What set of stats to compute. | basic, full | full |
compute_value | Interval, in timesteps or simulationtime, depending on compute_control, for sampling the flow fields for statistics. | Positive real or int | Not set (but recommended with every 50 timesteps or so |
In addition to the usual controls for the output, which then outputs the averages computes from the last time the statistics were written to file.
For example, if one wants to compute only the basic statistics and sample the fields every 4 time steps and compute and output batches every 20 time units and have an initial transient of 60 time units the following would work:
Preferably set the initial transient to a multiple of output_value as otherwise the first output will be slightly shorter than the rest. The code related to fluid statistics are located in fluid_stats and fluid_stats_simcomp.
The argument "avg_direction" is optional and if ignored we output 3d fields. The statistics are saved in a fld file according to the following in 2D and 3D. Observe that in 2D the mean Z-velocity is stored in a last scalar field. All other fields are kept the same. This is due to a limitation of the fld file format.
For 1D statistics a CSV file is outputted. The first column is the time at which the statistics are collected, the second column the spatial coordinate, and the rest of the data is stored in the order below. In this case all statistics are kept in the same order as in 3D.
When only the basic set of stats is enabled, only stats 1-11 are computed. When 2D stats are enabled \( \langle w \rangle \) is stored in s7 for basic stats and in s40 for the full set of statistics.
Number | Statistic | Stored in variable (for fld files) |
---|---|---|
1 | \( \langle p \rangle \) | Pressure |
2 | \( \langle u \rangle \) | X-Velocity |
3 | \( \langle v \rangle \) | Y-Velocity |
4 | \( \langle w \rangle \) | Z-Velocity |
5 | \( \langle pp \rangle \) | Temperature |
6 | \( \langle uu \rangle \) | Scalar 1 (s1) |
7 | \( \langle vv \rangle \) | Scalar 2 (s2) |
8 | \( \langle ww \rangle \) | s3 |
9 | \( \langle uv \rangle \) | s4 |
10 | \( \langle uw \rangle \) | s5 |
11 | \( \langle vw \rangle \) | s6 |
12 | \( \langle uuu \rangle \) | s7 |
13 | \( \langle vvv \rangle \) | s8 |
14 | \( \langle www \rangle \) | s9 |
15 | \( \langle uuv \rangle \) | s10 |
16 | \( \langle uuw \rangle \) | s11 |
17 | \( \langle uvv \rangle \) | s12 |
18 | \( \langle uvw \rangle \) | s13 |
19 | \( \langle vvw \rangle \) | s14 |
20 | \( \langle uww \rangle \) | s15 |
21 | \( \langle vww \rangle \) | s16 |
22 | \( \langle uuuu \rangle \) | s17 |
23 | \( \langle vvvv \rangle \) | s18 |
24 | \( \langle wwww \rangle \) | s19 |
25 | \( \langle ppp \rangle \) | s20 |
26 | \( \langle pppp \rangle \) | s21 |
27 | \( \langle pu \rangle \) | s22 |
28 | \( \langle pv \rangle \) | s23 |
29 | \( \langle pw \rangle \) | s24 |
30 | \( \langle p \frac{\partial u} {\partial x} \rangle \) | s25 |
31 | \( \langle p \frac{\partial u} {\partial y}\rangle \) | s26 |
32 | \( \langle p \frac{\partial u} {\partial z}\rangle \) | s27 |
33 | \( \langle p \frac{\partial v} {\partial x}\rangle \) | s28 |
34 | \( \langle p \frac{\partial v} {\partial y}\rangle \) | s29 |
35 | \( \langle p \frac{\partial v} {\partial z}\rangle \) | s30 |
36 | \( \langle p \frac{\partial w} {\partial x}\rangle \) | s31 |
37 | \( \langle p \frac{\partial w} {\partial y}\rangle \) | s32 |
38 | \( \langle p \frac{\partial w} {\partial z}\rangle \) | s33 |
39 | \( \langle e11 \rangle \) | s34 |
40 | \( \langle e22 \rangle \) | s35 |
41 | \( \langle e33 \rangle \) | s36 |
42 | \( \langle e12 \rangle \) | s37 |
43 | \( \langle e13 \rangle \) | s38 |
44 | \( \langle e23 \rangle \) | s39 |
where \(e11,e22...\) is computed as: $$ \begin{aligned} e11 &= \left(\frac{\partial u}{\partial x}\right)^2 + \left(\frac{\partial u}{\partial y}\right)^2 + \left(\frac{\partial u}{\partial z}\right)^2 \\ e22 &= \left(\frac{\partial v}{\partial x}\right)^2 + \left(\frac{\partial v}{\partial y}\right)^2 + \left(\frac{\partial v}{\partial z}\right)^2 \\ e33 &= \left(\frac{\partial w}{\partial x}\right)^2 + \left(\frac{\partial w}{\partial y}\right)^2 + \left(\frac{\partial w}{\partial z}\right)^2 \\ e12 &= \frac{\partial u}{\partial x} \frac{\partial v}{\partial x} + \frac{\partial u}{\partial y}\frac{\partial v}{\partial y}+ \frac{\partial u}{\partial z}\frac{\partial v}{\partial z} \\ e13 &= \frac{\partial u}{\partial x} \frac{\partial w}{\partial x} + \frac{\partial u}{\partial y}\frac{\partial w}{\partial y}+ \frac{\partial u}{\partial z}\frac{\partial w}{\partial z} \\ e23 &= \frac{\partial v}{\partial x} \frac{\partial w}{\partial x} + \frac{\partial v}{\partial y}\frac{\partial w}{\partial y}+ \frac{\partial v}{\partial z}\frac{\partial w}{\partial z} \\ \end{aligned} $$
These statistics are only the "raw statistics" in the sense that in general we are not interested in \( \langle uu\rangle \), but rather say \( \langle u'u'\rangle\). For this we need to postprocess the statistics.
There is some rudimentary postprocessing to compute the spatial averages of fld files and also to combine the statistics collected from several runs (compute average in time) and also compute both the mean velocity gradient and the Reynolds stresses available in the contrib scripts. By running the contrib scripts without any arguments one gets a hint on their usage, (e.g. by running ./average_fields_in_time
will give the options).
To further postprocess the statistics it is suggested to look into PyNekTools which introduces convenient functions for postprocessing, largely based on the PyMech library with the addition of an expanding set of tools for interpolation, computing derivatives and more advanced functionality. PyNekTools is entirely parallelized in MPI and can also handle large data sets for postprocessing.