Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
fluid_stats_output.f90
Go to the documentation of this file.
1! Copyright (c) 2024-2026, 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!
35 use fluid_stats, only : fluid_stats_t
37 use num_types, only : rp, dp
38 use map_1d, only : map_1d_t
39 use map_2d, only : map_2d_t
42 use output, only : output_t
43 use matrix, only : matrix_t
44 use fld_file, only : fld_file_t
45 implicit none
46 private
47
50 type, public, extends(output_t) :: fluid_stats_output_t
52 type(fluid_stats_t), pointer :: stats => null()
57 real(kind=dp) :: t_begin
59 integer :: output_dim
60 contains
62 procedure, pass(this) :: init => fluid_stats_output_init
64 procedure, pass(this) :: free => fluid_stats_output_free
66 procedure, pass(this) :: sample => fluid_stats_output_sample
68 procedure, pass(this) :: configure_file => &
71
72
73contains
74
76 subroutine fluid_stats_output_init(this, stats, T_begin, hom_dir, name, path)
77 class(fluid_stats_output_t), intent(inout) :: this
78 type(fluid_stats_t), intent(inout), target :: stats
79 real(kind=dp), intent(in) :: t_begin
80 character(len=*), intent(in) :: hom_dir
81 character(len=*), intent(in), optional :: name
82 character(len=*), intent(in), optional :: path
83 character(len=1024) :: fname
84
85 if (trim(hom_dir) .eq. 'none' .or. &
86 trim(hom_dir) .eq. 'x' .or.&
87 trim(hom_dir) .eq. 'y' .or.&
88 trim(hom_dir) .eq. 'z'&
89 ) then
90 if (present(name) .and. present(path)) then
91 fname = trim(path) // trim(name) // '.fld'
92 else if (present(name)) then
93 fname = trim(name) // '.fld'
94 else if (present(path)) then
95 fname = trim(path) // 'fluid_stats.fld'
96 else
97 fname = 'fluid_stats.fld'
98 end if
99
100 this%output_dim = 3
101
102 if (trim(hom_dir) .eq. 'x' .or.&
103 trim(hom_dir) .eq. 'y' .or.&
104 trim(hom_dir) .eq. 'z' ) then
105 call this%map_2d%init_char(stats%coef, hom_dir, 1e-7_rp)
106 this%output_dim = 2
107 end if
108 else
109 if (present(name) .and. present(path)) then
110 fname = trim(path) // trim(name) // '.csv'
111 else if (present(name)) then
112 fname = trim(name) // '.csv'
113 else if (present(path)) then
114 fname = trim(path) // 'fluid_stats.csv'
115 else
116 fname = 'fluid_stats.csv'
117 end if
118 call this%map_1d%init_char(stats%coef, hom_dir, 1e-7_rp)
119 this%output_dim = 1
120 end if
121
122 call this%init_base(fname)
123 this%stats => stats
124 this%T_begin = t_begin
125 end subroutine fluid_stats_output_init
126
128 subroutine fluid_stats_output_free(this)
129 class(fluid_stats_output_t), intent(inout) :: this
130
131 call this%free_base()
132
133 nullify(this%stats)
134 call this%map_1d%free()
135 call this%map_2d%free()
136
137 end subroutine fluid_stats_output_free
138
140 subroutine fluid_stats_output_sample(this, t)
141 class(fluid_stats_output_t), intent(inout) :: this
142 real(kind=dp), intent(in) :: t
143 integer :: i
144 type(matrix_t) :: avg_output_1d
145 type(fld_file_data_t) :: output_2d
146 real(kind=rp) :: u, v, w, p
147
148 associate(out_fields => this%stats%stat_fields%items)
149 if (t .ge. this%T_begin) then
150 call this%stats%make_strong_grad()
151 if ( neko_bcknd_device .eq. 1) then
152 do i = 1, size(out_fields)
153 call device_memcpy(out_fields(i)%ptr%x, out_fields(i)%ptr%x_d,&
154 out_fields(i)%ptr%dof%size(), device_to_host, &
155 sync = (i .eq. size(out_fields))) ! Sync on last field
156 end do
157 end if
158 if (this%output_dim .eq. 1) then
159 call this%map_1d%average_planes(avg_output_1d, &
160 this%stats%stat_fields)
161 call this%file_%write(avg_output_1d, t)
162 call avg_output_1d%free()
163 else if (this%output_dim .eq. 2) then
164 call this%map_2d%average(output_2d, this%stats%stat_fields)
165 !Switch around fields to get correct orders
166 !Put average direction mean_vel in scalar45
167 do i = 1, this%map_2d%n_2d
168 u = output_2d%v%x(i)
169 v = output_2d%w%x(i)
170 w = output_2d%p%x(i)
171 p = output_2d%u%x(i)
172 output_2d%p%x(i) = p
173 output_2d%u%x(i) = u
174 output_2d%v%x(i) = v
175 output_2d%w%x(i) = w
176 end do
177
178 call this%file_%write(output_2d, t)
179 call output_2d%free()
180 else
181 call this%file_%write(this%stats%stat_fields, t)
182 end if
183 call this%stats%reset()
184 end if
185 end associate
186 end subroutine fluid_stats_output_sample
187
191 class(fluid_stats_output_t), intent(inout) :: this
192
193 select type (ft => this%file_%file_type)
194 type is (fld_file_t)
195 ft%skip_pressure = .false.
196 ft%skip_velocity = .false.
197 ft%skip_temperature = .false.
198 end select
199
201
202end module fluid_stats_output
Copy data between host and device (or device and device)
Definition device.F90:72
Device abstraction, common interface for various accelerators.
Definition device.F90:34
integer, parameter, public device_to_host
Definition device.F90:48
Simple module to handle fld file series. Provides an interface to the different fields sotred in a fl...
NEKTON fld file format.
Definition fld_file.f90:35
Implements fluid_stats_ouput_t.
subroutine fluid_stats_output_configure_file(this)
Puts the leading fields in the UVW, P and T slots rather than the scalar block.
subroutine fluid_stats_output_free(this)
Destructor.
subroutine fluid_stats_output_sample(this, t)
Sample fluid_stats at time t.
subroutine fluid_stats_output_init(this, stats, t_begin, hom_dir, name, path)
Constructor.
Computes various statistics for the fluid fields. We use the Reynolds decomposition for a field u = ...
Creates a 1d GLL point map along a specified direction based on the connectivity in the mesh.
Definition map_1d.f90:36
Maps a 3D dofmap to a 2D spectral element grid.
Definition map_2d.f90:36
Defines a matrix.
Definition matrix.f90:34
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public dp
Definition num_types.f90:10
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Defines an output.
Definition output.f90:34
Defines a container for all statistics.
Interface for NEKTON fld files.
Definition fld_file.f90:66
Defines an output for the fluid statistics computed using the fluid_stats_t object.
Map every GLL point in the mesh to a level in one physical direction. Can be used to average across t...
Definition map_1d.f90:96
Abstract type defining an output type.
Definition output.f90:41