Neko 1.99.3
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
user_stats.f90
Go to the documentation of this file.
1! Copyright (c) 2024-2025, 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!
35
37 use num_types, only : rp, dp, sp
38 use json_module, only : json_file
40 use registry, only : neko_registry
41 use field, only : field_t
42 use case, only : case_t
45 use mean_field, only : mean_field_t
46 use coefs, only : coef_t
47 use time_state, only : time_state_t
51 implicit none
52 private
53
55 type, public, extends(simulation_component_t) :: user_stats_t
56
58 real(kind=rp) :: start_time
60 real(kind=rp) :: time
62 type(mean_field_t), allocatable :: mean_fields(:)
64 integer :: n_avg_fields = 0
66 character(len=NEKO_VARNAME_LEN), allocatable :: field_names(:)
68 type(mean_field_output_t), private :: output
69 logical :: default_fname = .true.
70
71 contains
73 procedure, pass(this) :: init => user_stats_init_from_json
75 generic :: init_from_components => &
76 init_from_controllers, init_from_controllers_properties
78 procedure, pass(this) :: init_from_controllers => &
82 procedure, pass(this) :: init_from_controllers_properties => &
85 procedure, private, pass(this) :: init_common => user_stats_init_common
87 procedure, pass(this) :: free => user_stats_free
89 procedure, pass(this) :: compute_ => user_stats_compute
90 procedure, pass(this) :: restart_ => user_stats_restart
91 end type user_stats_t
92
93contains
94
98 subroutine user_stats_init_from_json(this, json, case)
99 class(user_stats_t), intent(inout), target :: this
100 type(json_file), intent(inout) :: json
101 class(case_t), intent(inout), target :: case
102 character(len=:), allocatable :: filename
103 character(len=:), allocatable :: avg_dir
104 character(len=:), allocatable :: name
105
106 call json_get_or_default(json, "name", name, "user_stats")
107 call this%init_base(json, case)
108
110 call json%info('fields', n_children = this%n_avg_fields)
111 call json_get(json, 'fields', this%field_names)
112 call json_get_or_default(json, 'start_time', this%start_time, 0.0_rp)
113 call json_get_or_default(json, 'avg_direction', avg_dir, 'none')
114
115 if (json%valid_path('output_filename')) then
116 call json_get(json, 'output_filename', filename)
117 call user_stats_init_common(this, name, this%start_time, &
118 case%fluid%c_Xh, avg_dir, filename = filename)
119 else
120 call user_stats_init_common(this, name, this%start_time, &
121 case%fluid%c_Xh, avg_dir)
122 end if
123
124 end subroutine user_stats_init_from_json
125
126 subroutine user_stats_restart(this, time)
127 class(user_stats_t), intent(inout) :: this
128 type(time_state_t), intent(in) :: time
129 character(len=NEKO_FNAME_LEN) :: fname
130 character(len=5) :: prefix, suffix
131 integer :: last_slash_pos
132 real(kind=rp) :: t
133 t = time%t
134 if (t .gt. this%time) this%time = t
135 if (this%default_fname) then
136 fname = this%output%file_%get_base_fname()
137 write (prefix, '(I5)') &
138 this%output%file_%file_type%get_start_counter()
139 call filename_suffix(fname, suffix)
140 last_slash_pos = &
142 if (last_slash_pos .ne. 0) then
143 fname = &
144 trim(fname(1:last_slash_pos))// &
145 "user_stats"//trim(adjustl(prefix))//"."//suffix
146 else
147 fname = "user_stats"// &
148 trim(adjustl(prefix))//"."//suffix
149 end if
150 call this%output%init_base(fname)
151 end if
152 end subroutine user_stats_restart
153
167 subroutine user_stats_init_from_controllers(this, name, case, order, &
168 preprocess_controller, compute_controller, output_controller, &
169 start_time, coef, avg_dir, filename, precision)
170 class(user_stats_t), intent(inout) :: this
171 character(len=*), intent(in) :: name
172 class(case_t), intent(inout), target :: case
173 integer :: order
174 type(time_based_controller_t), intent(in) :: preprocess_controller
175 type(time_based_controller_t), intent(in) :: compute_controller
176 type(time_based_controller_t), intent(in) :: output_controller
177 real(kind=rp), intent(in) :: start_time
178 character(len=*), intent(in) :: avg_dir
179 type(coef_t), intent(inout) :: coef
180 character(len=*), intent(in), optional :: filename
181 integer, intent(in), optional :: precision
182
183 call this%init_base_from_components(case, order, preprocess_controller, &
184 compute_controller, output_controller)
185 call this%init_common(name, start_time, coef, avg_dir, filename, precision)
186
188
208 case, order, preprocess_control, preprocess_value, compute_control, &
209 compute_value, output_control, output_value, start_time, coef, avg_dir, &
210 filename, precision)
211 class(user_stats_t), intent(inout) :: this
212 character(len=*), intent(in) :: name
213 class(case_t), intent(inout), target :: case
214 integer :: order
215 character(len=*), intent(in) :: preprocess_control
216 real(kind=rp), intent(in) :: preprocess_value
217 character(len=*), intent(in) :: compute_control
218 real(kind=rp), intent(in) :: compute_value
219 character(len=*), intent(in) :: output_control
220 real(kind=rp), intent(in) :: output_value
221 real(kind=rp), intent(in) :: start_time
222 character(len=*), intent(in) :: avg_dir
223 type(coef_t), intent(inout) :: coef
224 character(len=*), intent(in), optional :: filename
225 integer, intent(in), optional :: precision
226
227 call this%init_base_from_components(case, order, preprocess_control, &
228 preprocess_value, compute_control, compute_value, output_control, &
229 output_value)
230 call this%init_common(name, start_time, coef, avg_dir, filename, precision)
231
233
234
240 subroutine user_stats_init_common(this, name, start_time, coef, avg_dir, &
241 filename, precision)
242 class(user_stats_t), intent(inout) :: this
243 character(len=*), intent(in) :: name
244 character(len=*), intent(in), optional :: filename
245 integer, intent(in), optional :: precision
246 real(kind=rp), intent(in) :: start_time
247 character(len=*), intent(in) :: avg_dir
248 type(coef_t), intent(inout) :: coef
249 integer :: i
250 type(field_t), pointer :: field_to_avg
251 character(len=NEKO_FNAME_LEN) :: stats_fname
252
253 character(len=1024) :: unique_name
254 unique_name = name // "/"
255
256 this%name = name
257 this%start_time = start_time
258 this%time = start_time
259
260 if (present(filename)) then
261 this%default_fname = .false.
262 stats_fname = filename
263 else
264 stats_fname = "user_stats0"
265 this%default_fname = .true.
266 end if
267
269 allocate(this%mean_fields(this%n_avg_fields))
270 do i = 1, this%n_avg_fields
271 field_to_avg => neko_registry%get_field(trim(this%field_names(i)))
272 call this%mean_fields(i)%init(field_to_avg, trim(unique_name) // &
273 "mean_" // trim(this%field_names(i)))
274 end do
275
276 call this%output%init(this%mean_fields, this%n_avg_fields, &
277 this%start_time, coef, avg_dir, name = filename)
278 call this%case%output_controller%add(this%output, &
279 this%output_controller%control_value, &
280 this%output_controller%control_mode)
281 end subroutine user_stats_init_common
282
284 subroutine user_stats_free(this)
285 class(user_stats_t), intent(inout) :: this
286 integer :: i
287
288 call this%free_base()
289
290 if (allocated(this%mean_fields)) then
291 do i = 1, this%n_avg_fields
292 call this%mean_fields(i)%free()
293 end do
294 deallocate(this%mean_fields)
295 end if
296
297 if (allocated(this%field_names)) then
298 deallocate(this%field_names)
299 end if
300
301 end subroutine user_stats_free
302
305 subroutine user_stats_compute(this, time)
306 class(user_stats_t), intent(inout) :: this
307 type(time_state_t), intent(in) :: time
308 integer :: i
309
311 if (time%t .ge. this%start_time) then
312 do i = 1, this%n_avg_fields
313 call this%mean_fields(i)%update(time%t - this%time)
314 end do
315 this%time = time%t
316 end if
317
318 end subroutine user_stats_compute
319
320end module user_stats
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
Defines a field.
Definition field.f90:34
Utilities for retrieving parameters from the case files.
Defines an output for a list of mean fields.
Implements mean_field_t.
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
Implements output_controller_t
Defines an output.
Definition output.f90:34
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.
Contains the time_based_controller_t type.
Module with things related to the simulation time.
Implements the user_stats_t type.
subroutine user_stats_free(this)
Destructor.
subroutine user_stats_compute(this, time)
Update the running averages.
subroutine user_stats_restart(this, time)
subroutine user_stats_init_from_controllers_properties(this, name, case, order, preprocess_control, preprocess_value, compute_control, compute_value, output_control, output_value, start_time, coef, avg_dir, filename, precision)
Constructor from components, passing properties to the time_based_controller` components in the base ...
subroutine user_stats_init_from_json(this, json, case)
Constructor from json.
subroutine user_stats_init_common(this, name, start_time, coef, avg_dir, filename, precision)
Common part of constructors.
subroutine user_stats_init_from_controllers(this, name, case, order, preprocess_controller, compute_controller, output_controller, start_time, coef, avg_dir, filename, precision)
Constructor from components, passing controllers.
Utilities.
Definition utils.f90:35
integer, parameter, public neko_fname_len
Definition utils.f90:41
subroutine, public filename_suffix(fname, suffix)
Extract a filename's suffix.
Definition utils.f90:118
integer, parameter, public neko_varname_len
Definition utils.f90:42
pure integer function, public filename_tslash_pos(fname)
Find position (in the string) of a filename's trailing slash.
Definition utils.f90:75
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:63
Computes the temporal mean of a field.
Output for a list of mean fields.
Base abstract class for simulation components.
A utility type for determining whether an action should be executed based on the current time value....
A struct that contains all info about the time, expand as needed.
A simulation component that computes the averages of fields in the registry.