Neko 1.99.5
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
scalar_stats_simcomp.f90
Go to the documentation of this file.
1! Copyright (c) 2025-2026, The Neko Authors
2! All rights reserved.
3!
4! Redistribution and use in source and binary forms, with or without
5! modification, are permitted provided that the following conditions
6! are met:
7!
8! * Redistributions of source code must retain the above copyright
9! notice, this list of conditions and the following disclaimer.
10!
11! * Redistributions in binary form must reproduce the above
12! copyright notice, this list of conditions and the following
13! disclaimer in the documentation and/or other materials provided
14! with the distribution.
15!
16! * Neither the name of the authors nor the names of its
17! contributors may be used to endorse or promote products derived
18! from this software without specific prior written permission.
19!
20! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24! COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30! ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31! POSSIBILITY OF SUCH DAMAGE.
32!
33!
36 use num_types, only : rp, dp, sp
37 use json_module, only : json_file
39 use registry, only : neko_registry
40 use time_state, only : time_state_t
41 use field, only : field_t
44 use case, only : case_t
45 use coefs, only : coef_t
48 use logger, only : log_size, neko_log
51 use comm, only : neko_comm
52 use mpi_f08, only : mpi_wtime, mpi_barrier
53 implicit none
54 private
55
68 type(scalar_stats_output_t) :: stats_output
70 real(kind=rp) :: start_time
71 real(kind=rp) :: time
72 character(len=:), allocatable :: base_filename
73
74 contains
76 procedure, pass(this) :: init => scalar_stats_simcomp_init_from_json
78 procedure, pass(this) :: init_from_components => &
81 procedure, pass(this) :: free => scalar_stats_simcomp_free
83 procedure, pass(this) :: compute_ => scalar_stats_simcomp_compute
85 procedure, pass(this) :: output_ => scalar_stats_simcomp_compute
87 procedure, pass(this) :: restart_ => scalar_stats_simcomp_restart
89
90contains
91
95 subroutine scalar_stats_simcomp_init_from_json(this, json, case)
96 class(scalar_stats_simcomp_t), target, intent(inout) :: this
97 type(json_file), intent(inout) :: json
98 class(case_t), intent(inout), target :: case
99 character(len=:), allocatable :: filename
100 character(len=NEKO_VARNAME_LEN), allocatable :: fields(:)
101 character(len=:), allocatable :: hom_dir
102 character(len=:), allocatable :: stat_set
103 character(len=:), allocatable :: sname
104 character(len=:), allocatable :: name
105 real(kind=rp) :: start_time
106 type(field_t), pointer :: s, u, v, w, p
107 type(coef_t), pointer :: coef
108
109 call json_get_or_default(json, 'field', &
110 sname, 's')
111 call json_get_or_default(json, "name", &
112 name, "scalar_stats_" // trim(sname))
113
114 call this%init_base(json, case)
115 call json_get_or_default(json, 'avg_direction', &
116 hom_dir, 'none')
117 call json_get_or_lookup_or_default(json, 'start_time', &
118 start_time, 0.0_rp)
119 call json_get_or_default(json, 'set_of_stats', &
120 stat_set, 'full')
121
122 s => neko_registry%get_field_by_name(sname)
123 u => neko_registry%get_field("u")
124 v => neko_registry%get_field("v")
125 w => neko_registry%get_field("w")
126 p => neko_registry%get_field("p")
127 coef => case%fluid%c_Xh
128 this%name = name
129
130 if (json%valid_path("output_filename")) then
131 call json_get(json, "output_filename", filename)
132 call scalar_stats_simcomp_init_from_components(this, name, s, u, v, w, &
133 p, coef, start_time, hom_dir, stat_set, filename)
134 else
135 call scalar_stats_simcomp_init_from_components(this, name, s, u, v, w, &
136 p, coef, start_time, hom_dir, stat_set, "scalar_stats_" // &
137 trim(sname))
138 end if
139
140 nullify(s, u, v, w, p, coef)
141
143
155 subroutine scalar_stats_simcomp_init_from_components(this, name, s, u, v, w, &
156 p, coef, start_time, hom_dir, stat_set, fname)
157 class(scalar_stats_simcomp_t), target, intent(inout) :: this
158 character(len=*), intent(in) :: name
159 character(len=*), intent(in) :: hom_dir
160 character(len=*), intent(in) :: stat_set
161 real(kind=rp), intent(in) :: start_time
162 type(field_t), intent(in), target :: s, u, v, w, p
163 type(coef_t), intent(in), target :: coef
164 character(len=*), intent(in) :: fname
165 character(len=NEKO_FNAME_LEN) :: stats_fname
166 character(len=LOG_SIZE) :: log_buf
167 character(len=5) :: prefix
168
169 this%name = name
170 call neko_log%section('Scalar stats')
171 write(log_buf, '(A,A)') 'Scalar field: ', trim(s%name)
172 call neko_log%message(log_buf)
173 write(log_buf, '(A,E15.7)') 'Start time: ', start_time
174 call neko_log%message(log_buf)
175 write(log_buf, '(A,A)') 'Set of statistics: ', trim(stat_set)
176 call neko_log%message(log_buf)
177 write(log_buf, '(A,A)') 'Averaging in direction: ', trim(hom_dir)
178 call neko_log%message(log_buf)
179
180
181 call this%stats%init(coef, s, u, v, w, p, stat_set, name)
182
183 this%start_time = start_time
184 this%time = start_time
185 this%base_filename = fname
186 stats_fname = trim(fname) // "0"
187
188 call this%stats_output%init(this%stats, this%start_time, &
189 hom_dir = hom_dir, name = stats_fname, &
190 path = this%case%output_directory)
191
192 call this%case%output_controller%add(this%stats_output, &
193 this%output_controller%control_value, &
194 this%output_controller%control_mode)
195
196 call neko_log%end_section()
197
199
202 class(scalar_stats_simcomp_t), intent(inout) :: this
203 call this%free_base()
204 call this%stats%free()
205 end subroutine scalar_stats_simcomp_free
206
207 subroutine scalar_stats_simcomp_restart(this, time)
208 class(scalar_stats_simcomp_t), intent(inout) :: this
209 type(time_state_t), intent(in) :: time
210 character(len=NEKO_FNAME_LEN) :: fname
211 character(len=5) :: prefix, suffix
212 integer :: last_slash_pos
213 real(kind=rp) :: t
214 integer :: i
215
216 t = time%t
217 if (t .gt. this%time) this%time = t
218
219 fname = this%stats_output%file_%get_base_fname()
220 write (prefix, '(I5)') &
221 this%stats_output%file_%file_type%get_start_counter()
222 call filename_suffix(fname, suffix)
223
224 last_slash_pos = &
226 if (last_slash_pos .ne. 0) then
227 fname = &
228 trim(fname(1:last_slash_pos))// &
229 trim(this%base_filename)// &
230 trim(adjustl(prefix))//"."//suffix
231 else
232 fname = trim(this%base_filename)// &
233 trim(adjustl(prefix))//"."//suffix
234 end if
235 call this%stats_output%init_base(fname)
236 end subroutine scalar_stats_simcomp_restart
237
240 subroutine scalar_stats_simcomp_compute(this, time)
241 class(scalar_stats_simcomp_t), intent(inout) :: this
242 type(time_state_t), intent(in) :: time
243 real(kind=rp) :: delta_t, t
244 real(kind=rp) :: sample_start_time, sample_time
245 character(len=LOG_SIZE) :: log_buf
246 integer :: ierr
247
248 if (time%start_time .gt. this%start_time) then
249 write(log_buf, '(A)') 'Simulation start time is later than the ' &
250 // 'scalar stats start time.'
251 call neko_log%warning(log_buf)
252 write(log_buf, '(A,E15.7)') 'Simulation start time:', time%start_time
253 call neko_log%warning(log_buf)
254 write(log_buf, '(A,E15.7)') 'Scalar stats start time:', this%start_time
255 call neko_log%warning(log_buf)
256 write(log_buf, '(A)') 'Assigning the statistics start time to ' &
257 // 'the simulation start time.'
258 call neko_log%warning(log_buf)
259 this%start_time = time%start_time
260 this%time = time%start_time
261 end if
262
263 t = time%t
264
265 if (t .ge. this%start_time) then
266 delta_t = t - this%time !This is only a real number
267
268 call mpi_barrier(neko_comm, ierr)
269
270 sample_start_time = mpi_wtime()
271
272 call this%stats%update(delta_t)
273 call mpi_barrier(neko_comm, ierr)
274 this%time = t
275
276 sample_time = mpi_wtime() - sample_start_time
277
278 call neko_log%section('Scalar stats')
279 write(log_buf, '(A,E15.7)') 'Sampling at time:', t
280 call neko_log%message(log_buf)
281 write(log_buf, '(A33,E15.7)') 'Simulationtime since last sample:', &
282 delta_t
283 call neko_log%message(log_buf)
284 write(log_buf, '(A,E15.7)') 'Sampling time (s):', sample_time
285 call neko_log%message(log_buf)
286 call neko_log%end_section()
287 end if
288
289 end subroutine scalar_stats_simcomp_compute
290
291end module scalar_stats_simcomp
Retrieves a parameter by name or assigns a provided default value. In the latter case also adds the m...
Retrieves a parameter by name or throws an error.
Defines a simulation case.
Definition case.f90:34
Coefficients.
Definition coef.f90:34
Definition comm.F90:1
type(mpi_comm), public neko_comm
MPI communicator.
Definition comm.F90:45
Defines a field.
Definition field.f90:34
Utilities for retrieving parameters from the case files.
Logging routines.
Definition log.f90:34
type(log_t), public neko_log
Global log stream.
Definition log.f90:80
integer, parameter, public log_size
Definition log.f90:46
integer, parameter, public dp
Definition num_types.f90:9
integer, parameter, public sp
Definition num_types.f90:8
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Defines a registry for storing solution fields.
Definition registry.f90:34
type(registry_t), target, public neko_registry
Global field registry.
Definition registry.f90:144
Implements scalar_stats_ouput_t.
Implements the scalar_stats_simcomp_t type.
subroutine scalar_stats_simcomp_free(this)
Destructor.
subroutine scalar_stats_simcomp_init_from_json(this, json, case)
Constructor from json.
subroutine scalar_stats_simcomp_restart(this, time)
subroutine scalar_stats_simcomp_init_from_components(this, name, s, u, v, w, p, coef, start_time, hom_dir, stat_set, fname)
Actual constructor.
subroutine scalar_stats_simcomp_compute(this, time)
scalar_stats, called depending on compute_control and compute_value
Computes various statistics for the scalar fields. We use the Reynolds decomposition for a field u = ...
Simulation components are objects that encapsulate functionality that can be fit to a particular comp...
subroutine restart_(this, time)
Dummy restart function.
subroutine compute_(this, time)
Dummy compute function.
Defines a container for all statistics.
Module with things related to the simulation time.
Utilities.
Definition utils.f90:35
subroutine, public filename_name(fname, name)
Extract the base name of a file (without path and suffix)
Definition utils.f90:103
integer, parameter, public neko_fname_len
Definition utils.f90:42
subroutine, public filename_suffix(fname, suffix)
Extract a filename's suffix.
Definition utils.f90:124
integer, parameter, public neko_varname_len
Definition utils.f90:43
pure integer function, public filename_tslash_pos(fname)
Find position (in the string) of a filename's trailing slash.
Definition utils.f90:81
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:62
Defines an output for the scalar statistics computed using the scalar_stats_t object.
A simulation component that computes the scalar statistics for the skewness, kurtosis,...
Base abstract class for simulation components.
A struct that contains all info about the time, expand as needed.