Neko 1.99.2
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 implicit none
50 private
51
53 type, public, extends(simulation_component_t) :: user_stats_t
54
56 real(kind=rp) :: start_time
58 real(kind=rp) :: time
60 type(mean_field_t), allocatable :: mean_fields(:)
62 integer :: n_avg_fields = 0
64 character(len=20), allocatable :: field_names(:)
66 type(mean_field_output_t), private :: output
67
68 contains
70 procedure, pass(this) :: init => user_stats_init_from_json
72 generic :: init_from_components => &
73 init_from_controllers, init_from_controllers_properties
75 procedure, pass(this) :: init_from_controllers => &
79 procedure, pass(this) :: init_from_controllers_properties => &
82 procedure, private, pass(this) :: init_common => user_stats_init_common
84 procedure, pass(this) :: free => user_stats_free
86 procedure, pass(this) :: compute_ => user_stats_compute
87 procedure, pass(this) :: restart_ => user_stats_restart
88 end type user_stats_t
89
90contains
91
95 subroutine user_stats_init_from_json(this, json, case)
96 class(user_stats_t), intent(inout), target :: this
97 type(json_file), intent(inout) :: json
98 class(case_t), intent(inout), target :: case
99 character(len=:), allocatable :: filename
100 character(len=:), allocatable :: avg_dir
101 character(len=:), allocatable :: name
102
103 call json_get_or_default(json, "name", name, "user_stats")
104 call this%init_base(json, case)
105
107 call json%info('fields', n_children = this%n_avg_fields)
108 call json_get(json, 'fields', this%field_names)
109 call json_get_or_default(json, 'start_time', this%start_time, 0.0_rp)
110 call json_get_or_default(json, 'avg_direction', avg_dir, 'none')
111 call json_get_or_default(json, 'output_file', filename, 'user_stats')
112
113 call user_stats_init_common(this, name, this%start_time, &
114 case%fluid%c_Xh, avg_dir, filename = filename)
115 end subroutine user_stats_init_from_json
116
117 subroutine user_stats_restart(this, time)
118 class(user_stats_t), intent(inout) :: this
119 type(time_state_t), intent(in) :: time
120
121 if (time%t .gt. this%time) this%time = time%t
122 end subroutine user_stats_restart
123
137 subroutine user_stats_init_from_controllers(this, name, case, order, &
138 preprocess_controller, compute_controller, output_controller, &
139 start_time, coef, avg_dir, filename, precision)
140 class(user_stats_t), intent(inout) :: this
141 character(len=*), intent(in) :: name
142 class(case_t), intent(inout), target :: case
143 integer :: order
144 type(time_based_controller_t), intent(in) :: preprocess_controller
145 type(time_based_controller_t), intent(in) :: compute_controller
146 type(time_based_controller_t), intent(in) :: output_controller
147 real(kind=rp), intent(in) :: start_time
148 character(len=*), intent(in) :: avg_dir
149 type(coef_t), intent(inout) :: coef
150 character(len=*), intent(in), optional :: filename
151 integer, intent(in), optional :: precision
152
153 call this%init_base_from_components(case, order, preprocess_controller, &
154 compute_controller, output_controller)
155 call this%init_common(name, start_time, coef, avg_dir, filename, precision)
156
158
178 case, order, preprocess_control, preprocess_value, compute_control, &
179 compute_value, output_control, output_value, start_time, coef, avg_dir, &
180 filename, precision)
181 class(user_stats_t), intent(inout) :: this
182 character(len=*), intent(in) :: name
183 class(case_t), intent(inout), target :: case
184 integer :: order
185 character(len=*), intent(in) :: preprocess_control
186 real(kind=rp), intent(in) :: preprocess_value
187 character(len=*), intent(in) :: compute_control
188 real(kind=rp), intent(in) :: compute_value
189 character(len=*), intent(in) :: output_control
190 real(kind=rp), intent(in) :: output_value
191 real(kind=rp), intent(in) :: start_time
192 character(len=*), intent(in) :: avg_dir
193 type(coef_t), intent(inout) :: coef
194 character(len=*), intent(in), optional :: filename
195 integer, intent(in), optional :: precision
196
197 call this%init_base_from_components(case, order, preprocess_control, &
198 preprocess_value, compute_control, compute_value, output_control, &
199 output_value)
200 call this%init_common(name, start_time, coef, avg_dir, filename, precision)
201
203
204
210 subroutine user_stats_init_common(this, name, start_time, coef, avg_dir, &
211 filename, precision)
212 class(user_stats_t), intent(inout) :: this
213 character(len=*), intent(in) :: name
214 character(len=*), intent(in) :: filename
215 integer, intent(in), optional :: precision
216 real(kind=rp), intent(in) :: start_time
217 character(len=*), intent(in) :: avg_dir
218 type(coef_t), intent(inout) :: coef
219 integer :: i
220 type(field_t), pointer :: field_to_avg
221
222 character(len=1024) :: unique_name
223 unique_name = name // "/"
224
225 this%name = name
226 this%start_time = start_time
227 this%time = start_time
228
230 allocate(this%mean_fields(this%n_avg_fields))
231 do i = 1, this%n_avg_fields
232 field_to_avg => neko_registry%get_field(trim(this%field_names(i)))
233 call this%mean_fields(i)%init(field_to_avg, trim(unique_name) // "mean_" // trim(this%field_names(i)))
234 end do
235
236 call this%output%init(this%mean_fields, this%n_avg_fields, &
237 this%start_time, coef, avg_dir, name = filename)
238 call this%case%output_controller%add(this%output, &
239 this%output_controller%control_value, &
240 this%output_controller%control_mode)
241 end subroutine user_stats_init_common
242
244 subroutine user_stats_free(this)
245 class(user_stats_t), intent(inout) :: this
246 integer :: i
247
248 call this%free_base()
249
250 if (allocated(this%mean_fields)) then
251 do i = 1, this%n_avg_fields
252 call this%mean_fields(i)%free()
253 end do
254 deallocate(this%mean_fields)
255 end if
256
257 if (allocated(this%field_names)) then
258 deallocate(this%field_names)
259 end if
260
261 end subroutine user_stats_free
262
265 subroutine user_stats_compute(this, time)
266 class(user_stats_t), intent(inout) :: this
267 type(time_state_t), intent(in) :: time
268 integer :: i
269
271 if (time%t .ge. this%start_time) then
272 do i = 1, this%n_avg_fields
273 call this%mean_fields(i)%update(time%t - this%time)
274 end do
275 this%time = time%t
276 end if
277
278 end subroutine user_stats_compute
279
280end 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:149
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.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:56
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.