Neko 1.99.9
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#elif HAVE_OPENCL
136 interface
137
138 subroutine opencl_lpt_periodic_bc_wrap_translational(x, y, z, n, &
139 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
140 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
141 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
142 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
143 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
144 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
145 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
146 periodic_len1, periodic_len2, periodic_len3, strm) &
147 bind(c, name = 'opencl_lpt_periodic_bc_wrap_translational')
148 use, intrinsic :: iso_c_binding
149 use num_types, only : c_rp
150 implicit none
151 integer(c_int) :: n, n_periodic_dirs
152 real(c_rp) :: periodic_dir_x1, periodic_dir_y1, periodic_dir_z1
153 real(c_rp) :: periodic_dir_x2, periodic_dir_y2, periodic_dir_z2
154 real(c_rp) :: periodic_dir_x3, periodic_dir_y3, periodic_dir_z3
155 real(c_rp) :: periodic_min1, periodic_min2, periodic_min3
156 real(c_rp) :: periodic_max1, periodic_max2, periodic_max3
157 real(c_rp) :: periodic_shift_x1, periodic_shift_y1, periodic_shift_z1
158 real(c_rp) :: periodic_shift_x2, periodic_shift_y2, periodic_shift_z2
159 real(c_rp) :: periodic_shift_x3, periodic_shift_y3, periodic_shift_z3
160 real(c_rp) :: periodic_len1, periodic_len2, periodic_len3
161 type(c_ptr), value :: x, y, z, strm
163
165 subroutine opencl_lpt_periodic_bc_wrap_rotational(x, y, z, n, theta_min, &
166 theta_max, theta_len, u, v, w, u_lag, v_lag, w_lag, u_laglag, &
167 v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, &
168 acc_ylaglag, acc_zlaglag, strm) &
169 bind(c, name = 'opencl_lpt_periodic_bc_wrap_rotational')
170 use, intrinsic :: iso_c_binding
171 use num_types, only : c_rp
172 implicit none
173 integer(c_int) :: n
174 real(c_rp) :: theta_min, theta_max, theta_len
175 type(c_ptr), value :: x, y, z, u, v, w, u_lag, v_lag, w_lag
176 type(c_ptr), value :: u_laglag, v_laglag, w_laglag
177 type(c_ptr), value :: acc_xlag, acc_ylag, acc_zlag
178 type(c_ptr), value :: acc_xlaglag, acc_ylaglag, acc_zlaglag, strm
180 end interface
181#elif HAVE_METAL
182 interface
183
184 subroutine metal_lpt_periodic_bc_wrap_translational(x, y, z, n, &
185 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
186 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
187 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
188 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
189 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
190 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
191 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
192 periodic_len1, periodic_len2, periodic_len3, strm) &
193 bind(c, name = 'metal_lpt_periodic_bc_wrap_translational')
194 use, intrinsic :: iso_c_binding
195 use num_types, only : c_rp
196 implicit none
197 integer(c_int) :: n, n_periodic_dirs
198 real(c_rp) :: periodic_dir_x1, periodic_dir_y1, periodic_dir_z1
199 real(c_rp) :: periodic_dir_x2, periodic_dir_y2, periodic_dir_z2
200 real(c_rp) :: periodic_dir_x3, periodic_dir_y3, periodic_dir_z3
201 real(c_rp) :: periodic_min1, periodic_min2, periodic_min3
202 real(c_rp) :: periodic_max1, periodic_max2, periodic_max3
203 real(c_rp) :: periodic_shift_x1, periodic_shift_y1, periodic_shift_z1
204 real(c_rp) :: periodic_shift_x2, periodic_shift_y2, periodic_shift_z2
205 real(c_rp) :: periodic_shift_x3, periodic_shift_y3, periodic_shift_z3
206 real(c_rp) :: periodic_len1, periodic_len2, periodic_len3
207 type(c_ptr), value :: x, y, z, strm
208 end subroutine metal_lpt_periodic_bc_wrap_translational
209
211 subroutine metal_lpt_periodic_bc_wrap_rotational(x, y, z, n, theta_min, &
212 theta_max, theta_len, u, v, w, u_lag, v_lag, w_lag, u_laglag, &
213 v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, &
214 acc_ylaglag, acc_zlaglag, strm) &
215 bind(c, name = 'metal_lpt_periodic_bc_wrap_rotational')
216 use, intrinsic :: iso_c_binding
217 use num_types, only : c_rp
218 implicit none
219 integer(c_int) :: n
220 real(c_rp) :: theta_min, theta_max, theta_len
221 type(c_ptr), value :: x, y, z, u, v, w, u_lag, v_lag, w_lag
222 type(c_ptr), value :: u_laglag, v_laglag, w_laglag
223 type(c_ptr), value :: acc_xlag, acc_ylag, acc_zlag
224 type(c_ptr), value :: acc_xlaglag, acc_ylaglag, acc_zlaglag, strm
225 end subroutine metal_lpt_periodic_bc_wrap_rotational
226 end interface
227#endif
228
231
232contains
233
241 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
242 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
243 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
244 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
245 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
246 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
247 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
248 periodic_len1, periodic_len2, periodic_len3, strm)
249 type(vector_t), intent(inout) :: x, y, z
250 integer, intent(in) :: n
251 integer, intent(in) :: n_periodic_dirs
252 real(kind=rp), intent(in) :: periodic_dir_x1, periodic_dir_y1
253 real(kind=rp), intent(in) :: periodic_dir_z1, periodic_dir_x2
254 real(kind=rp), intent(in) :: periodic_dir_y2, periodic_dir_z2
255 real(kind=rp), intent(in) :: periodic_dir_x3, periodic_dir_y3
256 real(kind=rp), intent(in) :: periodic_dir_z3
257 real(kind=rp), intent(in) :: periodic_min1, periodic_min2, periodic_min3
258 real(kind=rp), intent(in) :: periodic_max1, periodic_max2, periodic_max3
259 real(kind=rp), intent(in) :: periodic_shift_x1, periodic_shift_y1
260 real(kind=rp), intent(in) :: periodic_shift_z1, periodic_shift_x2
261 real(kind=rp), intent(in) :: periodic_shift_y2, periodic_shift_z2
262 real(kind=rp), intent(in) :: periodic_shift_x3, periodic_shift_y3
263 real(kind=rp), intent(in) :: periodic_shift_z3
264 real(kind=rp), intent(in) :: periodic_len1, periodic_len2, periodic_len3
265 type(c_ptr), optional :: strm
266 type(c_ptr) :: strm_
267
268 if (n .lt. 1 .or. n_periodic_dirs .lt. 1) return
269 strm_ = glb_cmd_queue
270 if (present(strm)) strm_ = strm
271
272#ifdef HAVE_HIP
273 call hip_lpt_periodic_bc_wrap_translational(x%x_d, y%x_d, z%x_d, n, &
274 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
275 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
276 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
277 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
278 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
279 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
280 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
281 periodic_len1, periodic_len2, periodic_len3, strm_)
282#elif HAVE_CUDA
283 call cuda_lpt_periodic_bc_wrap_translational(x%x_d, y%x_d, z%x_d, n, &
284 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
285 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
286 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
287 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
288 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
289 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
290 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
291 periodic_len1, periodic_len2, periodic_len3, strm_)
292#elif HAVE_OPENCL
293 call opencl_lpt_periodic_bc_wrap_translational(x%x_d, y%x_d, z%x_d, n, &
294 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
295 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
296 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
297 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
298 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
299 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
300 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
301 periodic_len1, periodic_len2, periodic_len3, strm_)
302#elif HAVE_METAL
303 call metal_lpt_periodic_bc_wrap_translational(x%x_d, y%x_d, z%x_d, n, &
304 n_periodic_dirs, periodic_dir_x1, periodic_dir_y1, periodic_dir_z1, &
305 periodic_dir_x2, periodic_dir_y2, periodic_dir_z2, periodic_dir_x3, &
306 periodic_dir_y3, periodic_dir_z3, periodic_min1, periodic_min2, &
307 periodic_min3, periodic_max1, periodic_max2, periodic_max3, &
308 periodic_shift_x1, periodic_shift_y1, periodic_shift_z1, &
309 periodic_shift_x2, periodic_shift_y2, periodic_shift_z2, &
310 periodic_shift_x3, periodic_shift_y3, periodic_shift_z3, &
311 periodic_len1, periodic_len2, periodic_len3, strm_)
312#else
313 call neko_error('No device backend configured')
314#endif
316
325 subroutine lpt_periodic_bc_wrap_rotational_device(x, y, z, n, theta_min, &
326 theta_max, theta_len, u, v, w, u_lag, v_lag, w_lag, u_laglag, &
327 v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, &
328 acc_ylaglag, acc_zlaglag, strm)
329 type(vector_t), intent(inout) :: x, y, z
330 integer, intent(in) :: n
331 real(kind=rp), intent(in) :: theta_min
332 real(kind=rp), intent(in) :: theta_max
333 real(kind=rp), intent(in) :: theta_len
334 type(vector_t), intent(inout), optional :: u, v, w
335 type(vector_t), intent(inout), optional :: u_lag, v_lag, w_lag
336 type(vector_t), intent(inout), optional :: u_laglag, v_laglag, w_laglag
337 type(vector_t), intent(inout), optional :: acc_xlag, acc_ylag, acc_zlag
338 type(vector_t), intent(inout), optional :: acc_xlaglag
339 type(vector_t), intent(inout), optional :: acc_ylaglag
340 type(vector_t), intent(inout), optional :: acc_zlaglag
341 type(c_ptr), optional :: strm
342 type(c_ptr) :: strm_
343 type(c_ptr) :: u_d, v_d, w_d
344 type(c_ptr) :: u_lag_d, v_lag_d, w_lag_d
345 type(c_ptr) :: u_laglag_d, v_laglag_d, w_laglag_d
346 type(c_ptr) :: acc_xlag_d, acc_ylag_d, acc_zlag_d
347 type(c_ptr) :: acc_xlaglag_d, acc_ylaglag_d, acc_zlaglag_d
348
349 if (n .lt. 1) return
350 strm_ = glb_cmd_queue
351 if (present(strm)) strm_ = strm
352
353 u_d = c_null_ptr
354 v_d = c_null_ptr
355 w_d = c_null_ptr
356 u_lag_d = c_null_ptr
357 v_lag_d = c_null_ptr
358 w_lag_d = c_null_ptr
359 u_laglag_d = c_null_ptr
360 v_laglag_d = c_null_ptr
361 w_laglag_d = c_null_ptr
362 acc_xlag_d = c_null_ptr
363 acc_ylag_d = c_null_ptr
364 acc_zlag_d = c_null_ptr
365 acc_xlaglag_d = c_null_ptr
366 acc_ylaglag_d = c_null_ptr
367 acc_zlaglag_d = c_null_ptr
368
369 if (present(u)) u_d = u%x_d
370 if (present(v)) v_d = v%x_d
371 if (present(w)) w_d = w%x_d
372 if (present(u_lag)) u_lag_d = u_lag%x_d
373 if (present(v_lag)) v_lag_d = v_lag%x_d
374 if (present(w_lag)) w_lag_d = w_lag%x_d
375 if (present(u_laglag)) u_laglag_d = u_laglag%x_d
376 if (present(v_laglag)) v_laglag_d = v_laglag%x_d
377 if (present(w_laglag)) w_laglag_d = w_laglag%x_d
378 if (present(acc_xlag)) acc_xlag_d = acc_xlag%x_d
379 if (present(acc_ylag)) acc_ylag_d = acc_ylag%x_d
380 if (present(acc_zlag)) acc_zlag_d = acc_zlag%x_d
381 if (present(acc_xlaglag)) acc_xlaglag_d = acc_xlaglag%x_d
382 if (present(acc_ylaglag)) acc_ylaglag_d = acc_ylaglag%x_d
383 if (present(acc_zlaglag)) acc_zlaglag_d = acc_zlaglag%x_d
384
385#ifdef HAVE_HIP
386 call hip_lpt_periodic_bc_wrap_rotational(x%x_d, y%x_d, z%x_d, n, &
387 theta_min, theta_max, theta_len, u_d, v_d, w_d, u_lag_d, v_lag_d, &
388 w_lag_d, u_laglag_d, v_laglag_d, w_laglag_d, acc_xlag_d, &
389 acc_ylag_d, acc_zlag_d, acc_xlaglag_d, acc_ylaglag_d, &
390 acc_zlaglag_d, strm_)
391#elif HAVE_CUDA
392 call cuda_lpt_periodic_bc_wrap_rotational(x%x_d, y%x_d, z%x_d, n, &
393 theta_min, theta_max, theta_len, u_d, v_d, w_d, u_lag_d, v_lag_d, &
394 w_lag_d, u_laglag_d, v_laglag_d, w_laglag_d, acc_xlag_d, &
395 acc_ylag_d, acc_zlag_d, acc_xlaglag_d, acc_ylaglag_d, &
396 acc_zlaglag_d, strm_)
397#elif HAVE_OPENCL
398 call opencl_lpt_periodic_bc_wrap_rotational(x%x_d, y%x_d, z%x_d, n, &
399 theta_min, theta_max, theta_len, u_d, v_d, w_d, u_lag_d, v_lag_d, &
400 w_lag_d, u_laglag_d, v_laglag_d, w_laglag_d, acc_xlag_d, &
401 acc_ylag_d, acc_zlag_d, acc_xlaglag_d, acc_ylaglag_d, &
402 acc_zlaglag_d, strm_)
403#elif HAVE_METAL
404 call metal_lpt_periodic_bc_wrap_rotational(x%x_d, y%x_d, z%x_d, n, &
405 theta_min, theta_max, theta_len, u_d, v_d, w_d, u_lag_d, v_lag_d, &
406 w_lag_d, u_laglag_d, v_laglag_d, w_laglag_d, acc_xlag_d, &
407 acc_ylag_d, acc_zlag_d, acc_xlaglag_d, acc_ylaglag_d, &
408 acc_zlaglag_d, strm_)
409#else
410 call neko_error('No device backend configured')
411#endif
413
414end module lpt_periodic_bc_device
HIP kernel entry point for rotational periodic wrapping.
HIP kernel entry point for translational periodic wrapping.
void opencl_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, void *strm)
void opencl_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, void *strm)
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:15
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Utilities.
Definition utils.f90:35
Defines a vector.
Definition vector.f90:34