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
49 use utils, only : neko_varname_len
50 implicit none
51 private
52
54 type, public, extends(simulation_component_t) :: user_stats_t
55
57 real(kind=rp) :: start_time
59 real(kind=rp) :: time
61 type(mean_field_t), allocatable :: mean_fields(:)
63 integer :: n_avg_fields = 0
65 character(len=NEKO_VARNAME_LEN), allocatable :: field_names(:)
67 type(mean_field_output_t), private :: output
68
69 contains
71 procedure, pass(this) :: init => user_stats_init_from_json
73 generic :: init_from_components => &
74 init_from_controllers, init_from_controllers_properties
76 procedure, pass(this) :: init_from_controllers => &
80 procedure, pass(this) :: init_from_controllers_properties => &
83 procedure, private, pass(this) :: init_common => user_stats_init_common
85 procedure, pass(this) :: free => user_stats_free
87 procedure, pass(this) :: compute_ => user_stats_compute
88 procedure, pass(this) :: restart_ => user_stats_restart
89 end type user_stats_t
90
91contains
92
96 subroutine user_stats_init_from_json(this, json, case)
97 class(user_stats_t), intent(inout), target :: this
98 type(json_file), intent(inout) :: json
99 class(case_t), intent(inout), target :: case
100 character(len=:), allocatable :: filename
101 character(len=:), allocatable :: avg_dir
102 character(len=:), allocatable :: name
103
104 call json_get_or_default(json, "name", name, "user_stats")
105 call this%init_base(json, case)
106
108 call json%info('fields', n_children = this%n_avg_fields)
109 call json_get(json, 'fields', this%field_names)
110 call json_get_or_default(json, 'start_time', this%start_time, 0.0_rp)
111 call json_get_or_default(json, 'avg_direction', avg_dir, 'none')
112 call json_get_or_default(json, 'output_file', filename, 'user_stats')
113
114 call user_stats_init_common(this, name, this%start_time, &
115 case%fluid%c_Xh, avg_dir, filename = filename)
116 end subroutine user_stats_init_from_json
117
118 subroutine user_stats_restart(this, time)
119 class(user_stats_t), intent(inout) :: this
120 type(time_state_t), intent(in) :: time
121
122 if (time%t .gt. this%time) this%time = time%t
123 end subroutine user_stats_restart
124
138 subroutine user_stats_init_from_controllers(this, name, case, order, &
139 preprocess_controller, compute_controller, output_controller, &
140 start_time, coef, avg_dir, filename, precision)
141 class(user_stats_t), intent(inout) :: this
142 character(len=*), intent(in) :: name
143 class(case_t), intent(inout), target :: case
144 integer :: order
145 type(time_based_controller_t), intent(in) :: preprocess_controller
146 type(time_based_controller_t), intent(in) :: compute_controller
147 type(time_based_controller_t), intent(in) :: output_controller
148 real(kind=rp), intent(in) :: start_time
149 character(len=*), intent(in) :: avg_dir
150 type(coef_t), intent(inout) :: coef
151 character(len=*), intent(in), optional :: filename
152 integer, intent(in), optional :: precision
153
154 call this%init_base_from_components(case, order, preprocess_controller, &
155 compute_controller, output_controller)
156 call this%init_common(name, start_time, coef, avg_dir, filename, precision)
157
159
179 case, order, preprocess_control, preprocess_value, compute_control, &
180 compute_value, output_control, output_value, start_time, coef, avg_dir, &
181 filename, precision)
182 class(user_stats_t), intent(inout) :: this
183 character(len=*), intent(in) :: name
184 class(case_t), intent(inout), target :: case
185 integer :: order
186 character(len=*), intent(in) :: preprocess_control
187 real(kind=rp), intent(in) :: preprocess_value
188 character(len=*), intent(in) :: compute_control
189 real(kind=rp), intent(in) :: compute_value
190 character(len=*), intent(in) :: output_control
191 real(kind=rp), intent(in) :: output_value
192 real(kind=rp), intent(in) :: start_time
193 character(len=*), intent(in) :: avg_dir
194 type(coef_t), intent(inout) :: coef
195 character(len=*), intent(in), optional :: filename
196 integer, intent(in), optional :: precision
197
198 call this%init_base_from_components(case, order, preprocess_control, &
199 preprocess_value, compute_control, compute_value, output_control, &
200 output_value)
201 call this%init_common(name, start_time, coef, avg_dir, filename, precision)
202
204
205
211 subroutine user_stats_init_common(this, name, start_time, coef, avg_dir, &
212 filename, precision)
213 class(user_stats_t), intent(inout) :: this
214 character(len=*), intent(in) :: name
215 character(len=*), intent(in) :: filename
216 integer, intent(in), optional :: precision
217 real(kind=rp), intent(in) :: start_time
218 character(len=*), intent(in) :: avg_dir
219 type(coef_t), intent(inout) :: coef
220 integer :: i
221 type(field_t), pointer :: field_to_avg
222
223 character(len=1024) :: unique_name
224 unique_name = name // "/"
225
226 this%name = name
227 this%start_time = start_time
228 this%time = start_time
229
231 allocate(this%mean_fields(this%n_avg_fields))
232 do i = 1, this%n_avg_fields
233 field_to_avg => neko_registry%get_field(trim(this%field_names(i)))
234 call this%mean_fields(i)%init(field_to_avg, trim(unique_name) // &
235 "mean_" // trim(this%field_names(i)))
236 end do
237
238 call this%output%init(this%mean_fields, this%n_avg_fields, &
239 this%start_time, coef, avg_dir, name = filename)
240 call this%case%output_controller%add(this%output, &
241 this%output_controller%control_value, &
242 this%output_controller%control_mode)
243 end subroutine user_stats_init_common
244
246 subroutine user_stats_free(this)
247 class(user_stats_t), intent(inout) :: this
248 integer :: i
249
250 call this%free_base()
251
252 if (allocated(this%mean_fields)) then
253 do i = 1, this%n_avg_fields
254 call this%mean_fields(i)%free()
255 end do
256 deallocate(this%mean_fields)
257 end if
258
259 if (allocated(this%field_names)) then
260 deallocate(this%field_names)
261 end if
262
263 end subroutine user_stats_free
264
267 subroutine user_stats_compute(this, time)
268 class(user_stats_t), intent(inout) :: this
269 type(time_state_t), intent(in) :: time
270 integer :: i
271
273 if (time%t .ge. this%start_time) then
274 do i = 1, this%n_avg_fields
275 call this%mean_fields(i)%update(time%t - this%time)
276 end do
277 this%time = time%t
278 end if
279
280 end subroutine user_stats_compute
281
282end 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_varname_len
Definition utils.f90:42
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.