Neko 1.99.1
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, 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
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
47 use logger, only : log_size, neko_log
49 use comm, only : neko_comm
50 use mpi_f08, only : mpi_wtime, mpi_barrier
51 implicit none
52 private
53
68 type(fluid_stats_output_t) :: stats_output
70 real(kind=rp) :: start_time
71 real(kind=rp) :: time
72 logical :: default_fname = .true.
73
74 contains
76 procedure, pass(this) :: init => fluid_stats_simcomp_init_from_json
78 procedure, pass(this) :: init_from_components => &
81 procedure, pass(this) :: free => fluid_stats_simcomp_free
83 procedure, pass(this) :: compute_ => fluid_stats_simcomp_compute
85 procedure, pass(this) :: output_ => fluid_stats_simcomp_compute
87 procedure, pass(this) :: restart_ => fluid_stats_simcomp_restart
89
90contains
91
95 subroutine fluid_stats_simcomp_init_from_json(this, json, case)
96 class(fluid_stats_simcomp_t), target, intent(inout) :: this
97 type(json_file), intent(inout) :: json
98 class(case_t), intent(inout), target :: case
99 character(len=:), allocatable :: filename
100 character(len=20), allocatable :: fields(:)
101 character(len=:), allocatable :: hom_dir
102 character(len=:), allocatable :: stat_set
103 real(kind=rp) :: start_time
104 type(field_t), pointer :: u, v, w, p
105 type(coef_t), pointer :: coef
106
107 call this%init_base(json, case)
108 call json_get_or_default(json, 'avg_direction', &
109 hom_dir, 'none')
110 call json_get_or_default(json, 'start_time', &
111 start_time, 0.0_rp)
112 call json_get_or_default(json, 'set_of_stats', &
113 stat_set, 'full')
114
115
116 u => neko_field_registry%get_field("u")
117 v => neko_field_registry%get_field("v")
118 w => neko_field_registry%get_field("w")
119 p => neko_field_registry%get_field("p")
120 coef => case%fluid%c_Xh
121
122 if (json%valid_path("output_filename")) then
123 call json_get(json, "output_filename", filename)
124 call fluid_stats_simcomp_init_from_components(this, u, v, w, p, coef, &
125 start_time, hom_dir, stat_set,filename)
126 else
127 call fluid_stats_simcomp_init_from_components(this, u, v, w, p, coef, &
128 start_time, hom_dir, stat_set)
129 end if
130
132
141 subroutine fluid_stats_simcomp_init_from_components(this, u, v, w, p, coef, &
142 start_time, hom_dir, stat_set, fname)
143 class(fluid_stats_simcomp_t), target, intent(inout) :: this
144 character(len=*), intent(in) :: hom_dir
145 character(len=*), intent(in) :: stat_set
146 real(kind=rp), intent(in) :: start_time
147 type(field_t), intent(in), target :: u, v, w, p
148 type(coef_t), intent(in), target :: coef
149 character(len=*), intent(in), optional :: fname
150 character(len=NEKO_FNAME_LEN) :: stats_fname
151 character(len=LOG_SIZE) :: log_buf
152 character(len=5) :: prefix
153
154 call neko_log%section('Fluid stats')
155 write(log_buf, '(A,E15.7)') 'Start time: ', start_time
156 call neko_log%message(log_buf)
157 write(log_buf, '(A,A)') 'Set of statistics: ', trim(stat_set)
158 call neko_log%message(log_buf)
159 write(log_buf, '(A,A)') 'Averaging in direction: ', trim(hom_dir)
160 call neko_log%message(log_buf)
161
162
163 call this%stats%init(coef, u, v, w, p, stat_set)
164
165 this%start_time = start_time
166 this%time = start_time
167 if (present(fname)) then
168 this%default_fname = .false.
169 stats_fname = fname
170 else
171 stats_fname = "fluid_stats0"
172 this%default_fname = .true.
173 end if
174
175 call this%stats_output%init(this%stats, this%start_time, &
176 hom_dir = hom_dir,name = stats_fname, &
177 path = this%case%output_directory)
178
179 call this%case%output_controller%add(this%stats_output, &
180 this%output_controller%control_value, &
181 this%output_controller%control_mode)
182
183 call neko_log%end_section()
184
186
189 class(fluid_stats_simcomp_t), intent(inout) :: this
190 call this%free_base()
191 call this%stats%free()
192 end subroutine fluid_stats_simcomp_free
193
194 subroutine fluid_stats_simcomp_restart(this, time)
195 class(fluid_stats_simcomp_t), intent(inout) :: this
196 type(time_state_t), intent(in) :: time
197 character(len=NEKO_FNAME_LEN) :: fname
198 character(len=5) :: prefix,suffix
199 integer :: last_slash_pos
200 real(kind=rp) :: t
201 t = time%t
202 if (t .gt. this%time) this%time = t
203 if (this%default_fname) then
204 write (prefix, '(I5)') this%stats_output%file_%get_counter()
205 call filename_suffix(this%stats_output%file_%file_type%fname,suffix)
206 last_slash_pos = &
207 filename_tslash_pos(this%stats_output%file_%file_type%fname)
208 if (last_slash_pos .ne. 0) then
209 fname = &
210 trim(this%stats_output%file_%file_type%fname(1:last_slash_pos))// &
211 "fluid_stats"//trim(adjustl(prefix))//"."//suffix
212 else
213 fname = "fluid_stats"// &
214 trim(adjustl(prefix))//"."//suffix
215 end if
216 call this%stats_output%init_base(fname)
217 end if
218 end subroutine fluid_stats_simcomp_restart
219
223 subroutine fluid_stats_simcomp_compute(this, time)
224 class(fluid_stats_simcomp_t), intent(inout) :: this
225 type(time_state_t), intent(in) :: time
226 real(kind=rp) :: delta_t, t
227 real(kind=rp) :: sample_start_time, sample_time
228 character(len=LOG_SIZE) :: log_buf
229 integer :: ierr
230
231 if (time%start_time .gt. this%start_time) then
232 write(log_buf, '(A)') 'Simulation start time is later than the ' &
233 // 'fluid stats start time.'
234 call neko_log%warning(log_buf)
235 write(log_buf, '(A,E15.7)') 'Simulation start time:', time%start_time
236 call neko_log%warning(log_buf)
237 write(log_buf, '(A,E15.7)') 'Fluid stats start time:', this%start_time
238 call neko_log%warning(log_buf)
239 write(log_buf, '(A)') 'Assigning the statistics start time to ' &
240 // 'the simulation start time.'
241 call neko_log%warning(log_buf)
242 this%start_time = time%start_time
243 this%time = time%start_time
244 end if
245
246 t = time%t
247
248 if (t .ge. this%start_time) then
249 delta_t = t - this%time !This is only a real number
250
251 call mpi_barrier(neko_comm, ierr)
252
253 sample_start_time = mpi_wtime()
254
255 call this%stats%update(delta_t)
256 call mpi_barrier(neko_comm, ierr)
257 this%time = t
258
259 sample_time = mpi_wtime() - sample_start_time
260
261 call neko_log%section('Fluid stats')
262 write(log_buf, '(A,E15.7)') 'Sampling at time:', t
263 call neko_log%message(log_buf)
264 write(log_buf, '(A33,E15.7)') 'Simulationtime since last sample:', &
265 delta_t
266 call neko_log%message(log_buf)
267 write(log_buf, '(A,E15.7)') 'Sampling time (s):', sample_time
268 call neko_log%message(log_buf)
269 call neko_log%end_section()
270 end if
271
272 end subroutine fluid_stats_simcomp_compute
273
274end 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:42
Defines a registry for storing solution fields.
type(field_registry_t), target, public neko_field_registry
Global field registry.
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, 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:70
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
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:40
subroutine, public filename_suffix(fname, suffix)
Extract a filename's suffix.
Definition utils.f90:71
pure integer function, public filename_tslash_pos(fname)
Find position (in the string) of a filename's trailing slash.
Definition utils.f90:64
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:55
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.