Neko 1.99.2
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-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!
35 use fluid_stats, only : fluid_stats_t
37 use num_types, only : rp
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 implicit none
45 private
46
49 type, public, extends(output_t) :: fluid_stats_output_t
51 type(fluid_stats_t), pointer :: stats => null()
56 real(kind=rp) :: t_begin
58 integer :: output_dim
59 contains
61 procedure, pass(this) :: init => fluid_stats_output_init
63 procedure, pass(this) :: free => fluid_stats_output_free
65 procedure, pass(this) :: sample => fluid_stats_output_sample
67
68
69contains
70
72 subroutine fluid_stats_output_init(this, stats, T_begin, hom_dir, name, path)
73 class(fluid_stats_output_t), intent(inout) :: this
74 type(fluid_stats_t), intent(inout), target :: stats
75 real(kind=rp), intent(in) :: t_begin
76 character(len=*), intent(in) :: hom_dir
77 character(len=*), intent(in), optional :: name
78 character(len=*), intent(in), optional :: path
79 character(len=1024) :: fname
80
81 if (trim(hom_dir) .eq. 'none' .or. &
82 trim(hom_dir) .eq. 'x' .or.&
83 trim(hom_dir) .eq. 'y' .or.&
84 trim(hom_dir) .eq. 'z'&
85 ) then
86 if (present(name) .and. present(path)) then
87 fname = trim(path) // trim(name) // '.fld'
88 else if (present(name)) then
89 fname = trim(name) // '.fld'
90 else if (present(path)) then
91 fname = trim(path) // 'fluid_stats.fld'
92 else
93 fname = 'fluid_stats.fld'
94 end if
95
96 this%output_dim = 3
97
98 if (trim(hom_dir) .eq. 'x' .or.&
99 trim(hom_dir) .eq. 'y' .or.&
100 trim(hom_dir) .eq. 'z' ) then
101 call this%map_2d%init_char(stats%coef, hom_dir, 1e-7_rp)
102 this%output_dim = 2
103 end if
104 else
105 if (present(name) .and. present(path)) then
106 fname = trim(path) // trim(name) // '.csv'
107 else if (present(name)) then
108 fname = trim(name) // '.csv'
109 else if (present(path)) then
110 fname = trim(path) // 'fluid_stats.csv'
111 else
112 fname = 'fluid_stats.csv'
113 end if
114 call this%map_1d%init_char(stats%coef, hom_dir, 1e-7_rp)
115 this%output_dim = 1
116 end if
117
118 call this%init_base(fname)
119 this%stats => stats
120 this%T_begin = t_begin
121 end subroutine fluid_stats_output_init
122
124 subroutine fluid_stats_output_free(this)
125 class(fluid_stats_output_t), intent(inout) :: this
126 nullify(this%stats)
127 call this%map_1d%free()
128 call this%map_2d%free()
129 end subroutine fluid_stats_output_free
130
132 subroutine fluid_stats_output_sample(this, t)
133 class(fluid_stats_output_t), intent(inout) :: this
134 real(kind=rp), intent(in) :: t
135 integer :: i
136 type(matrix_t) :: avg_output_1d
137 type(fld_file_data_t) :: output_2d
138 real(kind=rp) :: u, v, w, p
139 associate(out_fields => this%stats%stat_fields%items)
140 if (t .ge. this%T_begin) then
141 call this%stats%make_strong_grad()
142 if ( neko_bcknd_device .eq. 1) then
143 do i = 1, size(out_fields)
144 call device_memcpy(out_fields(i)%ptr%x, out_fields(i)%ptr%x_d,&
145 out_fields(i)%ptr%dof%size(), device_to_host, &
146 sync = (i .eq. size(out_fields))) ! Sync on last field
147 end do
148 end if
149 if (this%output_dim .eq. 1) then
150 call this%map_1d%average_planes(avg_output_1d, &
151 this%stats%stat_fields)
152 call this%file_%write(avg_output_1d, t)
153 else if (this%output_dim .eq. 2) then
154 call this%map_2d%average(output_2d, this%stats%stat_fields)
155 !Switch around fields to get correct orders
156 !Put average direction mean_vel in scalar45
157 do i = 1, this%map_2d%n_2d
158 u = output_2d%v%x(i)
159 v = output_2d%w%x(i)
160 w = output_2d%p%x(i)
161 p = output_2d%u%x(i)
162 output_2d%p%x(i) = p
163 output_2d%u%x(i) = u
164 output_2d%v%x(i) = v
165 output_2d%w%x(i) = w
166 end do
167
168 call this%file_%write(output_2d, t)
169 else
170 call this%file_%write(this%stats%stat_fields, t)
171 end if
172 call this%stats%reset()
173 end if
174 end associate
175 end subroutine fluid_stats_output_sample
176
177end module fluid_stats_output
Copy data between host and device (or device and device)
Definition device.F90:71
Device abstraction, common interface for various accelerators.
Definition device.F90:34
integer, parameter, public device_to_host
Definition device.F90:47
Simple module to handle fld file series. Provides an interface to the different fields sotred in a fl...
Implements fluid_stats_ouput_t.
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:3
Maps a 3D dofmap to a 2D spectral element grid.
Definition map_2d.f90:3
Defines a matrix.
Definition matrix.f90:34
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Defines an output.
Definition output.f90:34
Defines a container for all statistics.
Defines an output for the fluid statistics computed using the fluid_stats_t object.
Type that encapsulates a mapping from each gll point in the mesh to its corresponding (global) GLL po...
Definition map_1d.f90:27
Abstract type defining an output type.
Definition output.f90:41