Neko 1.99.5
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
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
70 type(fluid_stats_output_t) :: stats_output
72 real(kind=rp) :: start_time
73 real(kind=rp) :: time
74 logical :: default_fname = .true.
75
76 contains
78 procedure, pass(this) :: init => fluid_stats_simcomp_init_from_json
80 procedure, pass(this) :: init_from_components => &
83 procedure, pass(this) :: free => fluid_stats_simcomp_free
85 procedure, pass(this) :: compute_ => fluid_stats_simcomp_compute
87 procedure, pass(this) :: output_ => fluid_stats_simcomp_compute
89 procedure, pass(this) :: restart_ => fluid_stats_simcomp_restart
91
92contains
93
97 subroutine fluid_stats_simcomp_init_from_json(this, json, case)
98 class(fluid_stats_simcomp_t), target, intent(inout) :: this
99 type(json_file), intent(inout) :: json
100 class(case_t), intent(inout), target :: case
101 character(len=:), allocatable :: filename
102 character(len=NEKO_VARNAME_LEN), allocatable :: fields(:)
103 character(len=:), allocatable :: hom_dir
104 character(len=:), allocatable :: stat_set
105 character(len=:), allocatable :: name
106 real(kind=rp) :: start_time
107 type(field_t), pointer :: u, v, w, p
108 type(coef_t), pointer :: coef
109
110 call json_get_or_default(json, "name", name, "fluid_stats")
111 call this%init_base(json, case)
112 call json_get_or_default(json, 'avg_direction', &
113 hom_dir, 'none')
114 call json_get_or_lookup_or_default(json, 'start_time', &
115 start_time, 0.0_rp)
116 call json_get_or_default(json, 'set_of_stats', &
117 stat_set, 'full')
118
119
120 u => neko_registry%get_field("u")
121 v => neko_registry%get_field("v")
122 w => neko_registry%get_field("w")
123 p => neko_registry%get_field("p")
124 coef => case%fluid%c_Xh
125 this%name = name
126
127 if (json%valid_path("output_filename")) then
128 call json_get(json, "output_filename", filename)
129 call fluid_stats_simcomp_init_from_components(this, name, u, v, w, p, &
130 coef, start_time, hom_dir, stat_set, filename)
131 else
132 call fluid_stats_simcomp_init_from_components(this, name, u, v, w, p, &
133 coef, start_time, hom_dir, stat_set)
134 end if
135
136 nullify(u, v, w, p, coef)
137
139
150 subroutine fluid_stats_simcomp_init_from_components(this, name, u, v, w, p, &
151 coef, start_time, hom_dir, stat_set, fname)
152 class(fluid_stats_simcomp_t), target, intent(inout) :: this
153 character(len=*), intent(in) :: name
154 character(len=*), intent(in) :: hom_dir
155 character(len=*), intent(in) :: stat_set
156 real(kind=rp), intent(in) :: start_time
157 type(field_t), intent(in), target :: u, v, w, p
158 type(coef_t), intent(in), target :: coef
159 character(len=*), intent(in), optional :: fname
160 character(len=NEKO_FNAME_LEN) :: stats_fname
161 character(len=LOG_SIZE) :: log_buf
162 character(len=5) :: prefix
163
164 call neko_log%section('Fluid stats')
165 write(log_buf, '(A,E15.7)') 'Start time: ', start_time
166 call neko_log%message(log_buf)
167 write(log_buf, '(A,A)') 'Set of statistics: ', trim(stat_set)
168 call neko_log%message(log_buf)
169 write(log_buf, '(A,A)') 'Averaging in direction: ', trim(hom_dir)
170 call neko_log%message(log_buf)
171
172 call this%stats%init(coef, u, v, w, p, stat_set, name)
173
174 this%name = name
175 this%start_time = start_time
176 this%time = start_time
177 if (present(fname)) then
178 this%default_fname = .false.
179 stats_fname = fname
180 else
181 stats_fname = "fluid_stats0"
182 this%default_fname = .true.
183 end if
184
185 call this%stats_output%init(this%stats, this%start_time, &
186 hom_dir = hom_dir, name = stats_fname, &
187 path = this%case%output_directory)
188
189 call this%case%output_controller%add(this%stats_output, &
190 this%output_controller%control_value, &
191 this%output_controller%control_mode)
192
193 call neko_log%end_section()
194
196
199 class(fluid_stats_simcomp_t), intent(inout) :: this
200 call this%free_base()
201 call this%stats%free()
202 call this%stats_output%free()
203 end subroutine fluid_stats_simcomp_free
204
205 subroutine fluid_stats_simcomp_restart(this, time)
206 class(fluid_stats_simcomp_t), intent(inout) :: this
207 type(time_state_t), intent(in) :: time
208 character(len=NEKO_FNAME_LEN) :: fname
209 character(len=5) :: prefix, suffix
210 integer :: last_slash_pos
211 real(kind=rp) :: t
212 t = time%t
213 if (t .gt. this%time) this%time = t
214 if (this%default_fname) then
215 fname = this%stats_output%file_%get_base_fname()
216 write (prefix, '(I5)') &
217 this%stats_output%file_%file_type%get_start_counter()
218 call filename_suffix(fname, suffix)
219 last_slash_pos = &
221 if (last_slash_pos .ne. 0) then
222 fname = &
223 trim(fname(1:last_slash_pos))// &
224 "fluid_stats"//trim(adjustl(prefix))//"."//suffix
225 else
226 fname = "fluid_stats"// &
227 trim(adjustl(prefix))//"."//suffix
228 end if
229 call this%stats_output%init_base(fname)
230 end if
231 end subroutine fluid_stats_simcomp_restart
232
235 subroutine fluid_stats_simcomp_compute(this, time)
236 class(fluid_stats_simcomp_t), intent(inout) :: this
237 type(time_state_t), intent(in) :: time
238 real(kind=rp) :: delta_t, t
239 real(kind=rp) :: sample_start_time, sample_time
240 character(len=LOG_SIZE) :: log_buf
241 integer :: ierr
242
243 if (time%start_time .gt. this%start_time) then
244 write(log_buf, '(A)') 'Simulation start time is later than the ' &
245 // 'fluid stats start time.'
246 call neko_log%warning(log_buf)
247 write(log_buf, '(A,E15.7)') 'Simulation start time:', time%start_time
248 call neko_log%warning(log_buf)
249 write(log_buf, '(A,E15.7)') 'Fluid stats start time:', this%start_time
250 call neko_log%warning(log_buf)
251 write(log_buf, '(A)') 'Assigning the statistics start time to ' &
252 // 'the simulation start time.'
253 call neko_log%warning(log_buf)
254 this%start_time = time%start_time
255 this%time = time%start_time
256 end if
257
258 t = time%t
259
260 if (t .ge. this%start_time) then
261 delta_t = t - this%time !This is only a real number
262
263 call mpi_barrier(neko_comm, ierr)
264
265 sample_start_time = mpi_wtime()
266
267 call this%stats%update(delta_t)
268 call mpi_barrier(neko_comm, ierr)
269 this%time = t
270
271 sample_time = mpi_wtime() - sample_start_time
272
273 call neko_log%section('Fluid stats')
274 write(log_buf, '(A,E15.7)') 'Sampling at time:', t
275 call neko_log%message(log_buf)
276 write(log_buf, '(A33,E15.7)') 'Simulationtime since last sample:', &
277 delta_t
278 call neko_log%message(log_buf)
279 write(log_buf, '(A,E15.7)') 'Sampling time (s):', sample_time
280 call neko_log%message(log_buf)
281 call neko_log%end_section()
282 end if
283
284 end subroutine fluid_stats_simcomp_compute
285
286end 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:45
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: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
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: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 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.