Neko 1.99.5
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
56 type, public, extends(simulation_component_t) :: user_stats_t
57
59 real(kind=rp) :: start_time
61 real(kind=rp) :: time
63 type(mean_field_t), allocatable :: mean_fields(:)
65 integer :: n_avg_fields = 0
67 character(len=NEKO_VARNAME_LEN), allocatable :: field_names(:)
69 type(mean_field_output_t), private :: output
70 logical :: default_fname = .true.
71
72 contains
74 procedure, pass(this) :: init => user_stats_init_from_json
76 generic :: init_from_components => &
77 init_from_controllers, init_from_controllers_properties
79 procedure, pass(this) :: init_from_controllers => &
83 procedure, pass(this) :: init_from_controllers_properties => &
86 procedure, private, pass(this) :: init_common => user_stats_init_common
88 procedure, pass(this) :: free => user_stats_free
90 procedure, pass(this) :: compute_ => user_stats_compute
91 procedure, pass(this) :: restart_ => user_stats_restart
92 end type user_stats_t
93
94contains
95
99 subroutine user_stats_init_from_json(this, json, case)
100 class(user_stats_t), intent(inout), target :: this
101 type(json_file), intent(inout) :: json
102 class(case_t), intent(inout), target :: case
103 character(len=:), allocatable :: filename
104 character(len=:), allocatable :: avg_dir
105 character(len=:), allocatable :: name
106
107 call json_get_or_default(json, "name", name, "user_stats")
108 call this%init_base(json, case)
109
111 call json%info('fields', n_children = this%n_avg_fields)
112 call json_get(json, 'fields', this%field_names)
113 call json_get_or_default(json, 'start_time', this%start_time, 0.0_rp)
114 call json_get_or_default(json, 'avg_direction', avg_dir, 'none')
115
116 if (json%valid_path('output_filename')) then
117 call json_get(json, 'output_filename', filename)
118 call user_stats_init_common(this, name, this%start_time, &
119 case%fluid%c_Xh, avg_dir, filename = filename)
120 else
121 call user_stats_init_common(this, name, this%start_time, &
122 case%fluid%c_Xh, avg_dir)
123 end if
124
125 end subroutine user_stats_init_from_json
126
127 subroutine user_stats_restart(this, time)
128 class(user_stats_t), intent(inout) :: this
129 type(time_state_t), intent(in) :: time
130 character(len=NEKO_FNAME_LEN) :: fname
131 character(len=5) :: prefix, suffix
132 integer :: last_slash_pos
133 real(kind=rp) :: t
134 t = time%t
135 if (t .gt. this%time) this%time = t
136 if (this%default_fname) then
137 fname = this%output%file_%get_base_fname()
138 write (prefix, '(I5)') &
139 this%output%file_%file_type%get_start_counter()
140 call filename_suffix(fname, suffix)
141 last_slash_pos = &
143 if (last_slash_pos .ne. 0) then
144 fname = &
145 trim(fname(1:last_slash_pos))// &
146 "user_stats"//trim(adjustl(prefix))//"."//suffix
147 else
148 fname = "user_stats"// &
149 trim(adjustl(prefix))//"."//suffix
150 end if
151 call this%output%init_base(fname)
152 end if
153 end subroutine user_stats_restart
154
168 subroutine user_stats_init_from_controllers(this, name, case, order, &
169 preprocess_controller, compute_controller, output_controller, &
170 start_time, coef, avg_dir, filename, precision)
171 class(user_stats_t), intent(inout) :: this
172 character(len=*), intent(in) :: name
173 class(case_t), intent(inout), target :: case
174 integer :: order
175 type(time_based_controller_t), intent(in) :: preprocess_controller
176 type(time_based_controller_t), intent(in) :: compute_controller
177 type(time_based_controller_t), intent(in) :: output_controller
178 real(kind=rp), intent(in) :: start_time
179 character(len=*), intent(in) :: avg_dir
180 type(coef_t), intent(inout) :: coef
181 character(len=*), intent(in), optional :: filename
182 integer, intent(in), optional :: precision
183
184 call this%init_base_from_components(case, order, preprocess_controller, &
185 compute_controller, output_controller)
186 call this%init_common(name, start_time, coef, avg_dir, filename, precision)
187
189
209 case, order, preprocess_control, preprocess_value, compute_control, &
210 compute_value, output_control, output_value, start_time, coef, avg_dir, &
211 filename, precision)
212 class(user_stats_t), intent(inout) :: this
213 character(len=*), intent(in) :: name
214 class(case_t), intent(inout), target :: case
215 integer :: order
216 character(len=*), intent(in) :: preprocess_control
217 real(kind=rp), intent(in) :: preprocess_value
218 character(len=*), intent(in) :: compute_control
219 real(kind=rp), intent(in) :: compute_value
220 character(len=*), intent(in) :: output_control
221 real(kind=rp), intent(in) :: output_value
222 real(kind=rp), intent(in) :: start_time
223 character(len=*), intent(in) :: avg_dir
224 type(coef_t), intent(inout) :: coef
225 character(len=*), intent(in), optional :: filename
226 integer, intent(in), optional :: precision
227
228 call this%init_base_from_components(case, order, preprocess_control, &
229 preprocess_value, compute_control, compute_value, output_control, &
230 output_value)
231 call this%init_common(name, start_time, coef, avg_dir, filename, precision)
232
234
235
241 subroutine user_stats_init_common(this, name, start_time, coef, avg_dir, &
242 filename, precision)
243 class(user_stats_t), intent(inout) :: this
244 character(len=*), intent(in) :: name
245 character(len=*), intent(in), optional :: filename
246 integer, intent(in), optional :: precision
247 real(kind=rp), intent(in) :: start_time
248 character(len=*), intent(in) :: avg_dir
249 type(coef_t), intent(inout) :: coef
250 integer :: i
251 type(field_t), pointer :: field_to_avg
252 character(len=NEKO_FNAME_LEN) :: stats_fname
253
254 character(len=1024) :: unique_name
255 unique_name = name // "/"
256
257 this%name = name
258 this%start_time = start_time
259 this%time = start_time
260
261 if (present(filename)) then
262 this%default_fname = .false.
263 stats_fname = filename
264 else
265 stats_fname = "user_stats0"
266 this%default_fname = .true.
267 end if
268
270 allocate(this%mean_fields(this%n_avg_fields))
271 do i = 1, this%n_avg_fields
272 field_to_avg => neko_registry%get_field(trim(this%field_names(i)))
273 call this%mean_fields(i)%init(field_to_avg, trim(unique_name) // &
274 "mean_" // trim(this%field_names(i)))
275 end do
276
277 call this%output%init(this%mean_fields, this%n_avg_fields, &
278 this%start_time, coef, avg_dir, name = filename)
279 call this%case%output_controller%add(this%output, &
280 this%output_controller%control_value, &
281 this%output_controller%control_mode)
282
283 nullify(field_to_avg)
284
285 end subroutine user_stats_init_common
286
288 subroutine user_stats_free(this)
289 class(user_stats_t), intent(inout) :: this
290 integer :: i
291
292 call this%free_base()
293
294 if (allocated(this%mean_fields)) then
295 do i = 1, this%n_avg_fields
296 call this%mean_fields(i)%free()
297 end do
298 deallocate(this%mean_fields)
299 end if
300
301 if (allocated(this%field_names)) then
302 deallocate(this%field_names)
303 end if
304
305 end subroutine user_stats_free
306
309 subroutine user_stats_compute(this, time)
310 class(user_stats_t), intent(inout) :: this
311 type(time_state_t), intent(in) :: time
312 integer :: i
313
315 if (time%t .ge. this%start_time) then
316 do i = 1, this%n_avg_fields
317 call this%mean_fields(i)%update(time%t - this%time)
318 end do
319 this%time = time%t
320 end if
321
322 end subroutine user_stats_compute
323
324end 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: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
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.