Neko 1.99.6
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
lpt_periodic_bc_device.F90
Go to the documentation of this file.
1! Copyright (c) 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 num_types, only : rp, c_rp
36 use vector, only : vector_t
37 use utils, only : neko_error
38 use device, only : glb_cmd_queue
39 use, intrinsic :: iso_c_binding, only : c_int, c_ptr, c_null_ptr
40 implicit none
41 private
42
43#ifdef HAVE_HIP
44 interface
45
47 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
48 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
49 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
50 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
51 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
52 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
53 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
54 periodic_len1, periodic_len2, periodic_len3, strm) &
55 bind(c, name = 'hip_lpt_periodic_bc_wrap_translational')
56 use, intrinsic :: iso_c_binding
57 use num_types, only : c_rp
58 implicit none
59 integer(c_int) :: n, n_periodic_dirs
60 real(c_rp) :: periodic_dir_x1, periodic_dir_y1, periodic_dir_z1
61 real(c_rp) :: periodic_dir_x2, periodic_dir_y2, periodic_dir_z2
62 real(c_rp) :: periodic_dir_x3, periodic_dir_y3, periodic_dir_z3
63 real(c_rp) :: periodic_min1, periodic_min2, periodic_min3
64 real(c_rp) :: periodic_max1, periodic_max2, periodic_max3
65 real(c_rp) :: periodic_shift_x1, periodic_shift_y1, periodic_shift_z1
66 real(c_rp) :: periodic_shift_x2, periodic_shift_y2, periodic_shift_z2
67 real(c_rp) :: periodic_shift_x3, periodic_shift_y3, periodic_shift_z3
68 real(c_rp) :: periodic_len1, periodic_len2, periodic_len3
69 type(c_ptr), value :: x, y, z, strm
71
73 subroutine hip_lpt_periodic_bc_wrap_rotational(x, y, z, n, theta_min, &
74 theta_max, theta_len, u, v, w, u_lag, v_lag, w_lag, u_laglag, &
75 v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, &
76 acc_ylaglag, acc_zlaglag, strm) &
77 bind(c, name = 'hip_lpt_periodic_bc_wrap_rotational')
78 use, intrinsic :: iso_c_binding
79 use num_types, only : c_rp
80 implicit none
81 integer(c_int) :: n
82 real(c_rp) :: theta_min, theta_max, theta_len
83 type(c_ptr), value :: x, y, z, u, v, w, u_lag, v_lag, w_lag
84 type(c_ptr), value :: u_laglag, v_laglag, w_laglag
85 type(c_ptr), value :: acc_xlag, acc_ylag, acc_zlag
86 type(c_ptr), value :: acc_xlaglag, acc_ylaglag, acc_zlaglag, strm
88 end interface
89#elif HAVE_CUDA
90 interface
91
92 subroutine cuda_lpt_periodic_bc_wrap_translational(x, y, z, n, &
93 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
94 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
95 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
96 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
97 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
98 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
99 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
100 periodic_len1, periodic_len2, periodic_len3, strm) &
101 bind(c, name = 'cuda_lpt_periodic_bc_wrap_translational')
102 use, intrinsic :: iso_c_binding
103 use num_types, only : c_rp
104 implicit none
105 integer(c_int) :: n, n_periodic_dirs
106 real(c_rp) :: periodic_dir_x1, periodic_dir_y1, periodic_dir_z1
107 real(c_rp) :: periodic_dir_x2, periodic_dir_y2, periodic_dir_z2
108 real(c_rp) :: periodic_dir_x3, periodic_dir_y3, periodic_dir_z3
109 real(c_rp) :: periodic_min1, periodic_min2, periodic_min3
110 real(c_rp) :: periodic_max1, periodic_max2, periodic_max3
111 real(c_rp) :: periodic_shift_x1, periodic_shift_y1, periodic_shift_z1
112 real(c_rp) :: periodic_shift_x2, periodic_shift_y2, periodic_shift_z2
113 real(c_rp) :: periodic_shift_x3, periodic_shift_y3, periodic_shift_z3
114 real(c_rp) :: periodic_len1, periodic_len2, periodic_len3
115 type(c_ptr), value :: x, y, z, strm
117
119 subroutine cuda_lpt_periodic_bc_wrap_rotational(x, y, z, n, theta_min, &
120 theta_max, theta_len, u, v, w, u_lag, v_lag, w_lag, u_laglag, &
121 v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, &
122 acc_ylaglag, acc_zlaglag, strm) &
123 bind(c, name = 'cuda_lpt_periodic_bc_wrap_rotational')
124 use, intrinsic :: iso_c_binding
125 use num_types, only : c_rp
126 implicit none
127 integer(c_int) :: n
128 real(c_rp) :: theta_min, theta_max, theta_len
129 type(c_ptr), value :: x, y, z, u, v, w, u_lag, v_lag, w_lag
130 type(c_ptr), value :: u_laglag, v_laglag, w_laglag
131 type(c_ptr), value :: acc_xlag, acc_ylag, acc_zlag
132 type(c_ptr), value :: acc_xlaglag, acc_ylaglag, acc_zlaglag, strm
134 end interface
135#endif
136
139
140contains
141
149 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
150 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
151 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
152 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
153 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
154 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
155 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
156 periodic_len1, periodic_len2, periodic_len3, strm)
157 type(vector_t), intent(inout) :: x, y, z
158 integer, intent(in) :: n
159 integer, intent(in) :: n_periodic_dirs
160 real(kind=rp), intent(in) :: periodic_dir_x1, periodic_dir_y1
161 real(kind=rp), intent(in) :: periodic_dir_z1, periodic_dir_x2
162 real(kind=rp), intent(in) :: periodic_dir_y2, periodic_dir_z2
163 real(kind=rp), intent(in) :: periodic_dir_x3, periodic_dir_y3
164 real(kind=rp), intent(in) :: periodic_dir_z3
165 real(kind=rp), intent(in) :: periodic_min1, periodic_min2, periodic_min3
166 real(kind=rp), intent(in) :: periodic_max1, periodic_max2, periodic_max3
167 real(kind=rp), intent(in) :: periodic_shift_x1, periodic_shift_y1
168 real(kind=rp), intent(in) :: periodic_shift_z1, periodic_shift_x2
169 real(kind=rp), intent(in) :: periodic_shift_y2, periodic_shift_z2
170 real(kind=rp), intent(in) :: periodic_shift_x3, periodic_shift_y3
171 real(kind=rp), intent(in) :: periodic_shift_z3
172 real(kind=rp), intent(in) :: periodic_len1, periodic_len2, periodic_len3
173 type(c_ptr), optional :: strm
174 type(c_ptr) :: strm_
175
176 if (n .lt. 1 .or. n_periodic_dirs .lt. 1) return
177 strm_ = glb_cmd_queue
178 if (present(strm)) strm_ = strm
179
180#ifdef HAVE_HIP
181 call hip_lpt_periodic_bc_wrap_translational(x%x_d, y%x_d, z%x_d, n, &
182 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
183 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
184 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
185 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
186 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
187 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
188 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
189 periodic_len1, periodic_len2, periodic_len3, strm_)
190#elif HAVE_CUDA
191 call cuda_lpt_periodic_bc_wrap_translational(x%x_d, y%x_d, z%x_d, n, &
192 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
193 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
194 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
195 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
196 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
197 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
198 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
199 periodic_len1, periodic_len2, periodic_len3, strm_)
200#else
201 call neko_error('LPT periodic BC device wrapping requires CUDA or HIP')
202#endif
204
213 subroutine lpt_periodic_bc_wrap_rotational_device(x, y, z, n, theta_min, &
214 theta_max, theta_len, u, v, w, u_lag, v_lag, w_lag, u_laglag, &
215 v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, &
216 acc_ylaglag, acc_zlaglag, strm)
217 type(vector_t), intent(inout) :: x, y, z
218 integer, intent(in) :: n
219 real(kind=rp), intent(in) :: theta_min
220 real(kind=rp), intent(in) :: theta_max
221 real(kind=rp), intent(in) :: theta_len
222 type(vector_t), intent(inout), optional :: u, v, w
223 type(vector_t), intent(inout), optional :: u_lag, v_lag, w_lag
224 type(vector_t), intent(inout), optional :: u_laglag, v_laglag, w_laglag
225 type(vector_t), intent(inout), optional :: acc_xlag, acc_ylag, acc_zlag
226 type(vector_t), intent(inout), optional :: acc_xlaglag
227 type(vector_t), intent(inout), optional :: acc_ylaglag
228 type(vector_t), intent(inout), optional :: acc_zlaglag
229 type(c_ptr), optional :: strm
230 type(c_ptr) :: strm_
231 type(c_ptr) :: u_d, v_d, w_d
232 type(c_ptr) :: u_lag_d, v_lag_d, w_lag_d
233 type(c_ptr) :: u_laglag_d, v_laglag_d, w_laglag_d
234 type(c_ptr) :: acc_xlag_d, acc_ylag_d, acc_zlag_d
235 type(c_ptr) :: acc_xlaglag_d, acc_ylaglag_d, acc_zlaglag_d
236
237 if (n .lt. 1) return
238 strm_ = glb_cmd_queue
239 if (present(strm)) strm_ = strm
240
241 u_d = c_null_ptr
242 v_d = c_null_ptr
243 w_d = c_null_ptr
244 u_lag_d = c_null_ptr
245 v_lag_d = c_null_ptr
246 w_lag_d = c_null_ptr
247 u_laglag_d = c_null_ptr
248 v_laglag_d = c_null_ptr
249 w_laglag_d = c_null_ptr
250 acc_xlag_d = c_null_ptr
251 acc_ylag_d = c_null_ptr
252 acc_zlag_d = c_null_ptr
253 acc_xlaglag_d = c_null_ptr
254 acc_ylaglag_d = c_null_ptr
255 acc_zlaglag_d = c_null_ptr
256
257 if (present(u)) u_d = u%x_d
258 if (present(v)) v_d = v%x_d
259 if (present(w)) w_d = w%x_d
260 if (present(u_lag)) u_lag_d = u_lag%x_d
261 if (present(v_lag)) v_lag_d = v_lag%x_d
262 if (present(w_lag)) w_lag_d = w_lag%x_d
263 if (present(u_laglag)) u_laglag_d = u_laglag%x_d
264 if (present(v_laglag)) v_laglag_d = v_laglag%x_d
265 if (present(w_laglag)) w_laglag_d = w_laglag%x_d
266 if (present(acc_xlag)) acc_xlag_d = acc_xlag%x_d
267 if (present(acc_ylag)) acc_ylag_d = acc_ylag%x_d
268 if (present(acc_zlag)) acc_zlag_d = acc_zlag%x_d
269 if (present(acc_xlaglag)) acc_xlaglag_d = acc_xlaglag%x_d
270 if (present(acc_ylaglag)) acc_ylaglag_d = acc_ylaglag%x_d
271 if (present(acc_zlaglag)) acc_zlaglag_d = acc_zlaglag%x_d
272
273#ifdef HAVE_HIP
274 call hip_lpt_periodic_bc_wrap_rotational(x%x_d, y%x_d, z%x_d, n, &
275 theta_min, theta_max, theta_len, u_d, v_d, w_d, u_lag_d, v_lag_d, &
276 w_lag_d, u_laglag_d, v_laglag_d, w_laglag_d, acc_xlag_d, &
277 acc_ylag_d, acc_zlag_d, acc_xlaglag_d, acc_ylaglag_d, &
278 acc_zlaglag_d, strm_)
279#elif HAVE_CUDA
280 call cuda_lpt_periodic_bc_wrap_rotational(x%x_d, y%x_d, z%x_d, n, &
281 theta_min, theta_max, theta_len, u_d, v_d, w_d, u_lag_d, v_lag_d, &
282 w_lag_d, u_laglag_d, v_laglag_d, w_laglag_d, acc_xlag_d, &
283 acc_ylag_d, acc_zlag_d, acc_xlaglag_d, acc_ylaglag_d, &
284 acc_zlaglag_d, strm_)
285#else
286 call neko_error('LPT periodic BC device wrapping requires CUDA or HIP')
287#endif
289
290end module lpt_periodic_bc_device
HIP kernel entry point for rotational periodic wrapping.
HIP kernel entry point for translational periodic wrapping.
void cuda_lpt_periodic_bc_wrap_rotational(void *x, void *y, void *z, int *n, real *theta_min, real *theta_max, real *theta_len, void *u, void *v, void *w, void *u_lag, void *v_lag, void *w_lag, void *u_laglag, void *v_laglag, void *w_laglag, void *acc_xlag, void *acc_ylag, void *acc_zlag, void *acc_xlaglag, void *acc_ylaglag, void *acc_zlaglag, cudaStream_t strm)
void cuda_lpt_periodic_bc_wrap_translational(void *x, void *y, void *z, int *n, int *n_periodic_dirs, real *periodic_dir_x1, real *periodic_dir_y1, real *periodic_dir_z1, real *periodic_dir_x2, real *periodic_dir_y2, real *periodic_dir_z2, real *periodic_dir_x3, real *periodic_dir_y3, real *periodic_dir_z3, real *periodic_min1, real *periodic_min2, real *periodic_min3, real *periodic_max1, real *periodic_max2, real *periodic_max3, real *periodic_shift_x1, real *periodic_shift_y1, real *periodic_shift_z1, real *periodic_shift_x2, real *periodic_shift_y2, real *periodic_shift_z2, real *periodic_shift_x3, real *periodic_shift_y3, real *periodic_shift_z3, real *periodic_len1, real *periodic_len2, real *periodic_len3, cudaStream_t strm)
Device abstraction, common interface for various accelerators.
Definition device.F90:34
type(c_ptr), bind(C), public glb_cmd_queue
Global command queue.
Definition device.F90:52
Device dispatch for LPT periodic boundary-condition wrapping.
subroutine, public lpt_periodic_bc_wrap_rotational_device(x, y, z, n, theta_min, theta_max, theta_len, u, v, w, u_lag, v_lag, w_lag, u_laglag, v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, acc_ylaglag, acc_zlaglag, strm)
Launch device kernel for rotational periodic wrapping.
subroutine, public lpt_periodic_bc_wrap_translational_device(x, y, z, n, n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, periodic_min3, periodic_max1, periodic_max2, periodic_max3, periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, periodic_len1, periodic_len2, periodic_len3, strm)
Launch device kernel for translational periodic wrapping.
integer, parameter, public c_rp
Definition num_types.f90:13
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Utilities.
Definition utils.f90:35
Defines a vector.
Definition vector.f90:34