Neko 1.99.3
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
fluid_stats_simcomp.f90
Go to the documentation of this file.
1! Copyright (c) 2024-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
42 use fluid_stats, only : fluid_stats_t
44 use case, only : case_t
45 use coefs, only : coef_t
47 use logger, only : log_size, neko_log
50 use comm, only : neko_comm
51 use mpi_f08, only : mpi_wtime, mpi_barrier
52 implicit none
53 private
54
69 type(fluid_stats_output_t) :: stats_output
71 real(kind=rp) :: start_time
72 real(kind=rp) :: time
73 logical :: default_fname = .true.
74
75 contains
77 procedure, pass(this) :: init => fluid_stats_simcomp_init_from_json
79 procedure, pass(this) :: init_from_components => &
82 procedure, pass(this) :: free => fluid_stats_simcomp_free
84 procedure, pass(this) :: compute_ => fluid_stats_simcomp_compute
86 procedure, pass(this) :: output_ => fluid_stats_simcomp_compute
88 procedure, pass(this) :: restart_ => fluid_stats_simcomp_restart
90
91contains
92
96 subroutine fluid_stats_simcomp_init_from_json(this, json, case)
97 class(fluid_stats_simcomp_t), target, intent(inout) :: this
98 type(json_file), intent(inout) :: json
99 class(case_t), intent(inout), target :: case
100 character(len=:), allocatable :: filename
101 character(len=20), allocatable :: fields(:)
102 character(len=:), allocatable :: hom_dir
103 character(len=:), allocatable :: stat_set
104 character(len=:), allocatable :: name
105 real(kind=rp) :: start_time
106 type(field_t), pointer :: u, v, w, p
107 type(coef_t), pointer :: coef
108
109 call json_get_or_default(json, "name", name, "fluid_stats")
110 call this%init_base(json, case)
111 call json_get_or_default(json, 'avg_direction', &
112 hom_dir, 'none')
113 call json_get_or_lookup_or_default(json, 'start_time', &
114 start_time, 0.0_rp)
115 call json_get_or_default(json, 'set_of_stats', &
116 stat_set, 'full')
117
118
119 u => neko_registry%get_field("u")
120 v => neko_registry%get_field("v")
121 w => neko_registry%get_field("w")
122 p => neko_registry%get_field("p")
123 coef => case%fluid%c_Xh
124 this%name = name
125
126 if (json%valid_path("output_filename")) then
127 call json_get(json, "output_filename", filename)
128 call fluid_stats_simcomp_init_from_components(this, name, u, v, w, p, &
129 coef, start_time, hom_dir, stat_set, filename)
130 else
131 call fluid_stats_simcomp_init_from_components(this, name, u, v, w, p, &
132 coef, start_time, hom_dir, stat_set)
133 end if
134
136
147 subroutine fluid_stats_simcomp_init_from_components(this, name, u, v, w, p, &
148 coef, start_time, hom_dir, stat_set, fname)
149 class(fluid_stats_simcomp_t), target, intent(inout) :: this
150 character(len=*), intent(in) :: name
151 character(len=*), intent(in) :: hom_dir
152 character(len=*), intent(in) :: stat_set
153 real(kind=rp), intent(in) :: start_time
154 type(field_t), intent(in), target :: u, v, w, p
155 type(coef_t), intent(in), target :: coef
156 character(len=*), intent(in), optional :: fname
157 character(len=NEKO_FNAME_LEN) :: stats_fname
158 character(len=LOG_SIZE) :: log_buf
159 character(len=5) :: prefix
160
161 call neko_log%section('Fluid stats')
162 write(log_buf, '(A,E15.7)') 'Start time: ', start_time
163 call neko_log%message(log_buf)
164 write(log_buf, '(A,A)') 'Set of statistics: ', trim(stat_set)
165 call neko_log%message(log_buf)
166 write(log_buf, '(A,A)') 'Averaging in direction: ', trim(hom_dir)
167 call neko_log%message(log_buf)
168
169 call this%stats%init(coef, u, v, w, p, stat_set, name)
170
171 this%name = name
172 this%start_time = start_time
173 this%time = start_time
174 if (present(fname)) then
175 this%default_fname = .false.
176 stats_fname = fname
177 else
178 stats_fname = "fluid_stats0"
179 this%default_fname = .true.
180 end if
181
182 call this%stats_output%init(this%stats, this%start_time, &
183 hom_dir = hom_dir, name = stats_fname, &
184 path = this%case%output_directory)
185
186 call this%case%output_controller%add(this%stats_output, &
187 this%output_controller%control_value, &
188 this%output_controller%control_mode)
189
190 call neko_log%end_section()
191
193
196 class(fluid_stats_simcomp_t), intent(inout) :: this
197 call this%free_base()
198 call this%stats%free()
199 call this%stats_output%free()
200 end subroutine fluid_stats_simcomp_free
201
202 subroutine fluid_stats_simcomp_restart(this, time)
203 class(fluid_stats_simcomp_t), intent(inout) :: this
204 type(time_state_t), intent(in) :: time
205 character(len=NEKO_FNAME_LEN) :: fname
206 character(len=5) :: prefix, suffix
207 integer :: last_slash_pos
208 real(kind=rp) :: t
209 t = time%t
210 if (t .gt. this%time) this%time = t
211 if (this%default_fname) then
212 fname = this%stats_output%file_%get_base_fname()
213 write (prefix, '(I5)') this%stats_output%file_%get_counter()
214 call filename_suffix(fname, suffix)
215 last_slash_pos = &
217 if (last_slash_pos .ne. 0) then
218 fname = &
219 trim(fname(1:last_slash_pos))// &
220 "fluid_stats"//trim(adjustl(prefix))//"."//suffix
221 else
222 fname = "fluid_stats"// &
223 trim(adjustl(prefix))//"."//suffix
224 end if
225 call this%stats_output%init_base(fname)
226 end if
227 end subroutine fluid_stats_simcomp_restart
228
231 subroutine fluid_stats_simcomp_compute(this, time)
232 class(fluid_stats_simcomp_t), intent(inout) :: this
233 type(time_state_t), intent(in) :: time
234 real(kind=rp) :: delta_t, t
235 real(kind=rp) :: sample_start_time, sample_time
236 character(len=LOG_SIZE) :: log_buf
237 integer :: ierr
238
239 if (time%start_time .gt. this%start_time) then
240 write(log_buf, '(A)') 'Simulation start time is later than the ' &
241 // 'fluid stats start time.'
242 call neko_log%warning(log_buf)
243 write(log_buf, '(A,E15.7)') 'Simulation start time:', time%start_time
244 call neko_log%warning(log_buf)
245 write(log_buf, '(A,E15.7)') 'Fluid stats start time:', this%start_time
246 call neko_log%warning(log_buf)
247 write(log_buf, '(A)') 'Assigning the statistics start time to ' &
248 // 'the simulation start time.'
249 call neko_log%warning(log_buf)
250 this%start_time = time%start_time
251 this%time = time%start_time
252 end if
253
254 t = time%t
255
256 if (t .ge. this%start_time) then
257 delta_t = t - this%time !This is only a real number
258
259 call mpi_barrier(neko_comm, ierr)
260
261 sample_start_time = mpi_wtime()
262
263 call this%stats%update(delta_t)
264 call mpi_barrier(neko_comm, ierr)
265 this%time = t
266
267 sample_time = mpi_wtime() - sample_start_time
268
269 call neko_log%section('Fluid stats')
270 write(log_buf, '(A,E15.7)') 'Sampling at time:', t
271 call neko_log%message(log_buf)
272 write(log_buf, '(A33,E15.7)') 'Simulationtime since last sample:', &
273 delta_t
274 call neko_log%message(log_buf)
275 write(log_buf, '(A,E15.7)') 'Sampling time (s):', sample_time
276 call neko_log%message(log_buf)
277 call neko_log%end_section()
278 end if
279
280 end subroutine fluid_stats_simcomp_compute
281
282end module fluid_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:43
Defines a field.
Definition field.f90:34
Implements fluid_stats_ouput_t.
Implements the fluid_stats_simcomp_t type.
subroutine fluid_stats_simcomp_free(this)
Destructor.
subroutine fluid_stats_simcomp_restart(this, time)
subroutine fluid_stats_simcomp_init_from_json(this, json, case)
Constructor from json.
subroutine fluid_stats_simcomp_compute(this, time)
fluid_stats, called depending on compute_control and compute_value
subroutine fluid_stats_simcomp_init_from_components(this, name, u, v, w, p, coef, start_time, hom_dir, stat_set, fname)
Actual constructor.
Computes various statistics for the fluid fields. We use the Reynolds decomposition for a field u = ...
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:79
integer, parameter, public log_size
Definition log.f90:45
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
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
integer, parameter, public neko_fname_len
Definition utils.f90:40
subroutine, public filename_suffix(fname, suffix)
Extract a filename's suffix.
Definition utils.f90:108
pure integer function, public filename_tslash_pos(fname)
Find position (in the string) of a filename's trailing slash.
Definition utils.f90:65
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 fluid statistics computed using the fluid_stats_t object.
A simulation component that computes the velocity and pressure statistics up to 4th order....
Base abstract class for simulation components.
A struct that contains all info about the time, expand as needed.