Neko 1.99.6
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
opr_device.F90
Go to the documentation of this file.
1! Copyright (c) 2021-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 gather_scatter, only : gs_op_add
36 use num_types, only : rp, c_rp, i8
38 use space, only : space_t
39 use coefs, only : coef_t
40 use field, only : field_t
41 use vector, only : vector_t
43 use utils, only : neko_error
48 use, intrinsic :: iso_c_binding
49 implicit none
50 private
51
56
57#ifdef HAVE_HIP
58 interface
59 subroutine hip_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, &
60 dx_d, dy_d, dz_d, jacinv_d, nel, lx) &
61 bind(c, name = 'hip_dudxyz')
62 use, intrinsic :: iso_c_binding
63 type(c_ptr), value :: du_d, u_d, dr_d, ds_d, dt_d
64 type(c_ptr), value :: dx_d, dy_d, dz_d, jacinv_d
65 integer(c_int) :: nel, lx
66 end subroutine hip_dudxyz
67 end interface
68
69 interface
70 subroutine hip_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, &
71 dxt_d, dyt_d, dzt_d, w3_d, nel, lx) &
72 bind(c, name = 'hip_cdtp')
73 use, intrinsic :: iso_c_binding
74 type(c_ptr), value :: dtx_d, x_d, dr_d, ds_d, dt_d
75 type(c_ptr), value :: dxt_d, dyt_d, dzt_d, w3_d
76 integer(c_int) :: nel, lx
77 end subroutine hip_cdtp
78 end interface
79
80 interface
81 subroutine hip_conv1(du_d, u_d, vx_d, vy_d, vz_d, &
82 dx_d, dy_d, dz_d, drdx_d, dsdx_d, dtdx_d, &
83 drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d, &
84 jacinv_d, nel, gdim, lx) &
85 bind(c, name = 'hip_conv1')
86 use, intrinsic :: iso_c_binding
87 type(c_ptr), value :: du_d, u_d, vx_d, vy_d, vz_d
88 type(c_ptr), value :: dx_d, dy_d, dz_d, drdx_d, dsdx_d, dtdx_d
89 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d
90 type(c_ptr), value :: jacinv_d
91 integer(c_int) :: nel, gdim, lx
92 end subroutine hip_conv1
93 end interface
94
95 interface
96 subroutine hip_convect_scalar(du_d, u_d, cr_d, cs_d, ct_d, &
97 dx_d, dy_d, dz_d, nel, lx) bind(c, name = 'hip_convect_scalar')
98 use, intrinsic :: iso_c_binding
99 type(c_ptr), value :: du_d, u_d
100 type(c_ptr), value :: cr_d, cs_d, ct_d
101 type(c_ptr), value :: dx_d, dy_d, dz_d
102 integer(c_int) :: nel, lx
103 end subroutine hip_convect_scalar
104 end interface
105
106 interface
107 subroutine hip_opgrad(ux_d, uy_d, uz_d, u_d, &
108 dx_d, dy_d, dz_d, &
109 drdx_d, dsdx_d, dtdx_d, &
110 drdy_d, dsdy_d, dtdy_d, &
111 drdz_d, dsdz_d, dtdz_d, w3_d, nel, lx) &
112 bind(c, name = 'hip_opgrad')
113 use, intrinsic :: iso_c_binding
114 type(c_ptr), value :: ux_d, uy_d, uz_d, u_d
115 type(c_ptr), value :: dx_d, dy_d, dz_d
116 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
117 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
118 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
119 type(c_ptr), value :: w3_d
120 integer(c_int) :: nel, lx
121 end subroutine hip_opgrad
122 end interface
123
124 interface
125 subroutine hip_lambda2(lambda2_d, u_d, v_d, w_d, &
126 dx_d, dy_d, dz_d, &
127 drdx_d, dsdx_d, dtdx_d, &
128 drdy_d, dsdy_d, dtdy_d, &
129 drdz_d, dsdz_d, dtdz_d, jacinv_d, nel, lx) &
130 bind(c, name = 'hip_lambda2')
131 use, intrinsic :: iso_c_binding
132 type(c_ptr), value :: lambda2_d, u_d, v_d, w_d
133 type(c_ptr), value :: dx_d, dy_d, dz_d
134 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
135 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
136 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
137 type(c_ptr), value :: jacinv_d
138 integer(c_int) :: nel, lx
139 end subroutine hip_lambda2
140 end interface
141
142 interface
143 real(c_rp) function hip_cfl(dt, u_d, v_d, w_d, &
144 drdx_d, dsdx_d, dtdx_d, drdy_d, dsdy_d, dtdy_d, &
145 drdz_d, dsdz_d, dtdz_d, dr_inv_d, ds_inv_d, dt_inv_d, &
146 jacinv_d, nel, lx) &
147 bind(c, name = 'hip_cfl')
148 use, intrinsic :: iso_c_binding
149 import c_rp
150 type(c_ptr), value :: u_d, v_d, w_d, drdx_d, dsdx_d, dtdx_d
151 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d
152 type(c_ptr), value :: dr_inv_d, ds_inv_d, dt_inv_d, jacinv_d
153 real(c_rp) :: dt
154 integer(c_int) :: nel, lx
155 end function hip_cfl
156 end interface
157
158 interface
159 subroutine hip_rotate_cyc(vx_d, vy_d, vz_d, &
160 x_d, y_d, z_d, &
161 cyc_msk_d, R11_d, R12_d, ncyc, idir) &
162 bind(c, name = 'hip_rotate_cyc')
163 use, intrinsic :: iso_c_binding
164 type(c_ptr), value :: vx_d, vy_d, vz_d
165 type(c_ptr), value :: x_d, y_d, z_d
166 type(c_ptr), value :: cyc_msk_d, R11_d, R12_d
167 integer(c_int) :: ncyc, idir
168 end subroutine hip_rotate_cyc
169 end interface
170
171 interface
172 subroutine hip_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
173 drdx_d, dsdx_d, dtdx_d, drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, &
174 dtdz_d, w3_d, nel, lx) bind(c, name = 'hip_set_convect_rst')
175 use, intrinsic :: iso_c_binding
176 type(c_ptr), value :: cr_d, cs_d, ct_d
177 type(c_ptr), value :: cx_d, cy_d, cz_d
178 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
179 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
180 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
181 type(c_ptr), value :: w3_d
182 integer(c_int) :: nel, lx
183 end subroutine hip_set_convect_rst
184 end interface
185
186#elif HAVE_CUDA
187 interface
188 subroutine cuda_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, &
189 dx_d, dy_d, dz_d, jacinv_d, nel, lx) &
190 bind(c, name = 'cuda_dudxyz')
191 use, intrinsic :: iso_c_binding
192 type(c_ptr), value :: du_d, u_d, dr_d, ds_d, dt_d
193 type(c_ptr), value :: dx_d, dy_d, dz_d, jacinv_d
194 integer(c_int) :: nel, lx
195 end subroutine cuda_dudxyz
196 end interface
197
198 interface
199 subroutine cuda_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, &
200 dxt_d, dyt_d, dzt_d, w3_d, nel, lx) &
201 bind(c, name = 'cuda_cdtp')
202 use, intrinsic :: iso_c_binding
203 type(c_ptr), value :: dtx_d, x_d, dr_d, ds_d, dt_d
204 type(c_ptr), value :: dxt_d, dyt_d, dzt_d, w3_d
205 integer(c_int) :: nel, lx
206 end subroutine cuda_cdtp
207 end interface
208
209 interface
210 subroutine cuda_conv1(du_d, u_d, vx_d, vy_d, vz_d, &
211 dx_d, dy_d, dz_d, drdx_d, dsdx_d, dtdx_d, &
212 drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d, &
213 jacinv_d, nel, gdim, lx) &
214 bind(c, name = 'cuda_conv1')
215 use, intrinsic :: iso_c_binding
216 type(c_ptr), value :: du_d, u_d, vx_d, vy_d, vz_d
217 type(c_ptr), value :: dx_d, dy_d, dz_d, drdx_d, dsdx_d, dtdx_d
218 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d
219 type(c_ptr), value :: jacinv_d
220 integer(c_int) :: nel, gdim, lx
221 end subroutine cuda_conv1
222 end interface
223
224 interface
225 subroutine cuda_convect_scalar(du_d, u_d, cr_d, cs_d, ct_d, &
226 dx_d, dy_d, dz_d, nel, lx) bind(c, name = 'cuda_convect_scalar')
227 use, intrinsic :: iso_c_binding
228 type(c_ptr), value :: du_d, u_d
229 type(c_ptr), value :: cr_d, cs_d, ct_d
230 type(c_ptr), value :: dx_d, dy_d, dz_d
231 integer(c_int) :: nel, lx
232 end subroutine cuda_convect_scalar
233 end interface
234
235 interface
236 subroutine cuda_opgrad(ux_d, uy_d, uz_d, u_d, &
237 dx_d, dy_d, dz_d, &
238 drdx_d, dsdx_d, dtdx_d, &
239 drdy_d, dsdy_d, dtdy_d, &
240 drdz_d, dsdz_d, dtdz_d, w3_d, nel, lx) &
241 bind(c, name = 'cuda_opgrad')
242 use, intrinsic :: iso_c_binding
243 type(c_ptr), value :: ux_d, uy_d, uz_d, u_d
244 type(c_ptr), value :: dx_d, dy_d, dz_d
245 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
246 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
247 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
248 type(c_ptr), value :: w3_d
249 integer(c_int) :: nel, lx
250 end subroutine cuda_opgrad
251 end interface
252
253 interface
254 subroutine cuda_lambda2(lambda2_d, u_d, v_d, w_d, &
255 dx_d, dy_d, dz_d, &
256 drdx_d, dsdx_d, dtdx_d, &
257 drdy_d, dsdy_d, dtdy_d, &
258 drdz_d, dsdz_d, dtdz_d, jacinv_d, nel, lx) &
259 bind(c, name = 'cuda_lambda2')
260 use, intrinsic :: iso_c_binding
261 type(c_ptr), value :: lambda2_d, u_d, v_d, w_d
262 type(c_ptr), value :: dx_d, dy_d, dz_d
263 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
264 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
265 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
266 type(c_ptr), value :: jacinv_d
267 integer(c_int) :: nel, lx
268 end subroutine cuda_lambda2
269 end interface
270
271 interface
272 real(c_rp) function cuda_cfl(dt, u_d, v_d, w_d, &
273 drdx_d, dsdx_d, dtdx_d, drdy_d, dsdy_d, dtdy_d, &
274 drdz_d, dsdz_d, dtdz_d, dr_inv_d, ds_inv_d, dt_inv_d, &
275 jacinv_d, nel, lx) &
276 bind(c, name = 'cuda_cfl')
277 use, intrinsic :: iso_c_binding
278 import c_rp
279 type(c_ptr), value :: u_d, v_d, w_d, drdx_d, dsdx_d, dtdx_d
280 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d
281 type(c_ptr), value :: dr_inv_d, ds_inv_d, dt_inv_d, jacinv_d
282 real(c_rp) :: dt
283 integer(c_int) :: nel, lx
284 end function cuda_cfl
285 end interface
286
287 interface
288 subroutine cuda_rotate_cyc(vx_d, vy_d, vz_d, &
289 x_d, y_d, z_d, &
290 cyc_msk_d, R11_d, R12_d, ncyc, idir) &
291 bind(c, name = 'cuda_rotate_cyc')
292 use, intrinsic :: iso_c_binding
293 type(c_ptr), value :: vx_d, vy_d, vz_d
294 type(c_ptr), value :: x_d, y_d, z_d
295 type(c_ptr), value :: cyc_msk_d, R11_d, R12_d
296 integer(c_int) :: ncyc, idir
297 end subroutine cuda_rotate_cyc
298 end interface
299
300 interface
301 subroutine cuda_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
302 drdx_d, dsdx_d, dtdx_d, drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, &
303 dtdz_d, w3_d, nel, lx) bind(c, name = 'cuda_set_convect_rst')
304 use, intrinsic :: iso_c_binding
305 type(c_ptr), value :: cr_d, cs_d, ct_d
306 type(c_ptr), value :: cx_d, cy_d, cz_d
307 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
308 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
309 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
310 type(c_ptr), value :: w3_d
311 integer(c_int) :: nel, lx
312 end subroutine cuda_set_convect_rst
313 end interface
314
315#elif HAVE_OPENCL
316 interface
317 subroutine opencl_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, &
318 dx_d, dy_d, dz_d, jacinv_d, nel, lx) &
319 bind(c, name = 'opencl_dudxyz')
320 use, intrinsic :: iso_c_binding
321 type(c_ptr), value :: du_d, u_d, dr_d, ds_d, dt_d
322 type(c_ptr), value :: dx_d, dy_d, dz_d, jacinv_d
323 integer(c_int) :: nel, lx
324 end subroutine opencl_dudxyz
325 end interface
326
327 interface
328 subroutine opencl_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, &
329 dxt_d, dyt_d, dzt_d, w3_d, nel, lx) &
330 bind(c, name = 'opencl_cdtp')
331 use, intrinsic :: iso_c_binding
332 type(c_ptr), value :: dtx_d, x_d, dr_d, ds_d, dt_d
333 type(c_ptr), value :: dxt_d, dyt_d, dzt_d, w3_d
334 integer(c_int) :: nel, lx
335 end subroutine opencl_cdtp
336 end interface
337
338 interface
339 subroutine opencl_conv1(du_d, u_d, vx_d, vy_d, vz_d, &
340 dx_d, dy_d, dz_d, drdx_d, dsdx_d, dtdx_d, &
341 drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d, &
342 jacinv_d, nel, gdim, lx) &
343 bind(c, name = 'opencl_conv1')
344 use, intrinsic :: iso_c_binding
345 type(c_ptr), value :: du_d, u_d, vx_d, vy_d, vz_d
346 type(c_ptr), value :: dx_d, dy_d, dz_d, drdx_d, dsdx_d, dtdx_d
347 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d
348 type(c_ptr), value :: jacinv_d
349 integer(c_int) :: nel, gdim, lx
350 end subroutine opencl_conv1
351 end interface
352
353 interface
354 subroutine opencl_convect_scalar(du_d, u_d, cr_d, cs_d, ct_d, &
355 dx_d, dy_d, dz_d, nel, lx) bind(c, name = 'opencl_convect_scalar')
356 use, intrinsic :: iso_c_binding
357 type(c_ptr), value :: du_d, u_d
358 type(c_ptr), value :: cr_d, cs_d, ct_d
359 type(c_ptr), value :: dx_d, dy_d, dz_d
360 integer(c_int) :: nel, lx
361 end subroutine opencl_convect_scalar
362 end interface
363
364 interface
365 subroutine opencl_opgrad(ux_d, uy_d, uz_d, u_d, &
366 dx_d, dy_d, dz_d, &
367 drdx_d, dsdx_d, dtdx_d, &
368 drdy_d, dsdy_d, dtdy_d, &
369 drdz_d, dsdz_d, dtdz_d, w3_d, nel, lx) &
370 bind(c, name = 'opencl_opgrad')
371 use, intrinsic :: iso_c_binding
372 type(c_ptr), value :: ux_d, uy_d, uz_d, u_d
373 type(c_ptr), value :: dx_d, dy_d, dz_d
374 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
375 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
376 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
377 type(c_ptr), value :: w3_d
378 integer(c_int) :: nel, lx
379 end subroutine opencl_opgrad
380 end interface
381
382 interface
383 real(c_rp) function opencl_cfl(dt, u_d, v_d, w_d, &
384 drdx_d, dsdx_d, dtdx_d, drdy_d, dsdy_d, dtdy_d, &
385 drdz_d, dsdz_d, dtdz_d, dr_inv_d, ds_inv_d, dt_inv_d, &
386 jacinv_d, nel, lx) &
387 bind(c, name = 'opencl_cfl')
388 use, intrinsic :: iso_c_binding
389 import c_rp
390 type(c_ptr), value :: u_d, v_d, w_d, drdx_d, dsdx_d, dtdx_d
391 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d
392 type(c_ptr), value :: dr_inv_d, ds_inv_d, dt_inv_d, jacinv_d
393 real(c_rp) :: dt
394 integer(c_int) :: nel, lx
395 end function opencl_cfl
396 end interface
397
398 interface
399 subroutine opencl_lambda2(lambda2_d, u_d, v_d, w_d, &
400 dx_d, dy_d, dz_d, &
401 drdx_d, dsdx_d, dtdx_d, &
402 drdy_d, dsdy_d, dtdy_d, &
403 drdz_d, dsdz_d, dtdz_d, jacinv_d, nel, lx) &
404 bind(c, name = 'opencl_lambda2')
405 use, intrinsic :: iso_c_binding
406 type(c_ptr), value :: lambda2_d, u_d, v_d, w_d
407 type(c_ptr), value :: dx_d, dy_d, dz_d
408 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
409 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
410 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
411 type(c_ptr), value :: jacinv_d
412 integer(c_int) :: nel, lx
413 end subroutine opencl_lambda2
414 end interface
415
416 interface
417 subroutine opencl_rotate_cyc(vx_d, vy_d, vz_d, &
418 x_d, y_d, z_d, &
419 cyc_msk_d, R11_d, R12_d, ncyc, idir) &
420 bind(c, name = 'opencl_rotate_cyc')
421 use, intrinsic :: iso_c_binding
422 type(c_ptr), value :: vx_d, vy_d, vz_d
423 type(c_ptr), value :: x_d, y_d, z_d
424 type(c_ptr), value :: cyc_msk_d, R11_d, R12_d
425 integer(c_int) :: ncyc, idir
426 end subroutine opencl_rotate_cyc
427 end interface
428
429 interface
430 subroutine opencl_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
431 drdx_d, dsdx_d, dtdx_d, drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, &
432 dtdz_d, w3_d, nel, lx) bind(c, name = 'opencl_set_convect_rst')
433 use, intrinsic :: iso_c_binding
434 type(c_ptr), value :: cr_d, cs_d, ct_d
435 type(c_ptr), value :: cx_d, cy_d, cz_d
436 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
437 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
438 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
439 type(c_ptr), value :: w3_d
440 integer(c_int) :: nel, lx
441 end subroutine opencl_set_convect_rst
442 end interface
443
444#elif HAVE_METAL
445 interface
446 subroutine metal_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, &
447 dx_d, dy_d, dz_d, jacinv_d, nel, lx) &
448 bind(c, name = 'metal_dudxyz')
449 use, intrinsic :: iso_c_binding
450 type(c_ptr), value :: du_d, u_d, dr_d, ds_d, dt_d
451 type(c_ptr), value :: dx_d, dy_d, dz_d, jacinv_d
452 integer(c_int) :: nel, lx
453 end subroutine metal_dudxyz
454 end interface
455
456 interface
457 subroutine metal_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, &
458 dxt_d, dyt_d, dzt_d, w3_d, nel, lx) &
459 bind(c, name = 'metal_cdtp')
460 use, intrinsic :: iso_c_binding
461 type(c_ptr), value :: dtx_d, x_d, dr_d, ds_d, dt_d
462 type(c_ptr), value :: dxt_d, dyt_d, dzt_d, w3_d
463 integer(c_int) :: nel, lx
464 end subroutine metal_cdtp
465 end interface
466
467 interface
468 subroutine metal_conv1(du_d, u_d, vx_d, vy_d, vz_d, &
469 dx_d, dy_d, dz_d, drdx_d, dsdx_d, dtdx_d, &
470 drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d, &
471 jacinv_d, nel, gdim, lx) &
472 bind(c, name = 'metal_conv1')
473 use, intrinsic :: iso_c_binding
474 type(c_ptr), value :: du_d, u_d, vx_d, vy_d, vz_d
475 type(c_ptr), value :: dx_d, dy_d, dz_d, drdx_d, dsdx_d, dtdx_d
476 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d
477 type(c_ptr), value :: jacinv_d
478 integer(c_int) :: nel, gdim, lx
479 end subroutine metal_conv1
480 end interface
481
482 interface
483 subroutine metal_convect_scalar(du_d, u_d, cr_d, cs_d, ct_d, &
484 dx_d, dy_d, dz_d, nel, lx) bind(c, name = 'metal_convect_scalar')
485 use, intrinsic :: iso_c_binding
486 type(c_ptr), value :: du_d, u_d
487 type(c_ptr), value :: cr_d, cs_d, ct_d
488 type(c_ptr), value :: dx_d, dy_d, dz_d
489 integer(c_int) :: nel, lx
490 end subroutine metal_convect_scalar
491 end interface
492
493 interface
494 subroutine metal_opgrad(ux_d, uy_d, uz_d, u_d, &
495 dx_d, dy_d, dz_d, &
496 drdx_d, dsdx_d, dtdx_d, &
497 drdy_d, dsdy_d, dtdy_d, &
498 drdz_d, dsdz_d, dtdz_d, w3_d, nel, lx) &
499 bind(c, name = 'metal_opgrad')
500 use, intrinsic :: iso_c_binding
501 type(c_ptr), value :: ux_d, uy_d, uz_d, u_d
502 type(c_ptr), value :: dx_d, dy_d, dz_d
503 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
504 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
505 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
506 type(c_ptr), value :: w3_d
507 integer(c_int) :: nel, lx
508 end subroutine metal_opgrad
509 end interface
510
511 interface
512 real(c_rp) function metal_cfl(dt, u_d, v_d, w_d, &
513 drdx_d, dsdx_d, dtdx_d, drdy_d, dsdy_d, dtdy_d, &
514 drdz_d, dsdz_d, dtdz_d, dr_inv_d, ds_inv_d, dt_inv_d, &
515 jacinv_d, nel, lx) &
516 bind(c, name = 'metal_cfl')
517 use, intrinsic :: iso_c_binding
518 import c_rp
519 type(c_ptr), value :: u_d, v_d, w_d, drdx_d, dsdx_d, dtdx_d
520 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, dtdz_d
521 type(c_ptr), value :: dr_inv_d, ds_inv_d, dt_inv_d, jacinv_d
522 real(c_rp) :: dt
523 integer(c_int) :: nel, lx
524 end function metal_cfl
525 end interface
526
527 interface
528 subroutine metal_lambda2(lambda2_d, u_d, v_d, w_d, &
529 dx_d, dy_d, dz_d, &
530 drdx_d, dsdx_d, dtdx_d, &
531 drdy_d, dsdy_d, dtdy_d, &
532 drdz_d, dsdz_d, dtdz_d, jacinv_d, nel, lx) &
533 bind(c, name = 'metal_lambda2')
534 use, intrinsic :: iso_c_binding
535 type(c_ptr), value :: lambda2_d, u_d, v_d, w_d
536 type(c_ptr), value :: dx_d, dy_d, dz_d
537 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
538 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
539 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
540 type(c_ptr), value :: jacinv_d
541 integer(c_int) :: nel, lx
542 end subroutine metal_lambda2
543 end interface
544
545 interface
546 subroutine metal_rotate_cyc(vx_d, vy_d, vz_d, &
547 x_d, y_d, z_d, &
548 cyc_msk_d, R11_d, R12_d, ncyc, idir) &
549 bind(c, name = 'metal_rotate_cyc')
550 use, intrinsic :: iso_c_binding
551 type(c_ptr), value :: vx_d, vy_d, vz_d
552 type(c_ptr), value :: x_d, y_d, z_d
553 type(c_ptr), value :: cyc_msk_d, R11_d, R12_d
554 integer(c_int) :: ncyc, idir
555 end subroutine metal_rotate_cyc
556 end interface
557
558 interface
559 subroutine metal_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
560 drdx_d, dsdx_d, dtdx_d, drdy_d, dsdy_d, dtdy_d, drdz_d, dsdz_d, &
561 dtdz_d, w3_d, nel, lx) bind(c, name = 'metal_set_convect_rst')
562 use, intrinsic :: iso_c_binding
563 type(c_ptr), value :: cr_d, cs_d, ct_d
564 type(c_ptr), value :: cx_d, cy_d, cz_d
565 type(c_ptr), value :: drdx_d, dsdx_d, dtdx_d
566 type(c_ptr), value :: drdy_d, dsdy_d, dtdy_d
567 type(c_ptr), value :: drdz_d, dsdz_d, dtdz_d
568 type(c_ptr), value :: w3_d
569 integer(c_int) :: nel, lx
570 end subroutine metal_set_convect_rst
571 end interface
572
573#endif
574
575contains
576
577 subroutine opr_device_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, coef)
578 type(coef_t), intent(in), target :: coef
579 type(c_ptr), intent(inout) :: du_d
580 type(c_ptr), intent(in) :: u_d, dr_d, ds_d, dt_d
581
582 associate(xh => coef%Xh, msh => coef%msh, dof => coef%dof)
583#ifdef HAVE_HIP
584 call hip_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, &
585 xh%dx_d, xh%dy_d, xh%dz_d, coef%jacinv_d, &
586 msh%nelv, xh%lx)
587#elif HAVE_CUDA
588 call cuda_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, &
589 xh%dx_d, xh%dy_d, xh%dz_d, coef%jacinv_d, &
590 msh%nelv, xh%lx)
591#elif HAVE_OPENCL
592 call opencl_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, &
593 xh%dx_d, xh%dy_d, xh%dz_d, coef%jacinv_d, &
594 msh%nelv, xh%lx)
595#elif HAVE_METAL
596 call metal_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, &
597 xh%dx_d, xh%dy_d, xh%dz_d, coef%jacinv_d, &
598 msh%nelv, xh%lx)
599#else
600 call neko_error('No device backend configured')
601#endif
602 end associate
603
604 end subroutine opr_device_dudxyz
605
606 subroutine opr_device_opgrad(ux_d, uy_d, uz_d, u_d, coef)
607 type(coef_t), intent(in), target :: coef
608 type(c_ptr), intent(inout) :: ux_d, uy_d, uz_d
609 type(c_ptr), intent(in) :: u_d
610
611 associate(xh => coef%Xh, msh => coef%msh)
612#ifdef HAVE_HIP
613 call hip_opgrad(ux_d, uy_d, uz_d, u_d, &
614 xh%dx_d, xh%dy_d, xh%dz_d, &
615 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
616 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
617 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
618 xh%w3_d, msh%nelv, xh%lx)
619#elif HAVE_CUDA
620 call cuda_opgrad(ux_d, uy_d, uz_d, u_d, &
621 xh%dx_d, xh%dy_d, xh%dz_d, &
622 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
623 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
624 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
625 xh%w3_d, msh%nelv, xh%lx)
626#elif HAVE_OPENCL
627 call opencl_opgrad(ux_d, uy_d, uz_d, u_d, &
628 xh%dx_d, xh%dy_d, xh%dz_d, &
629 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
630 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
631 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
632 xh%w3_d, msh%nelv, xh%lx)
633#elif HAVE_METAL
634 call metal_opgrad(ux_d, uy_d, uz_d, u_d, &
635 xh%dx_d, xh%dy_d, xh%dz_d, &
636 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
637 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
638 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
639 xh%w3_d, msh%nelv, xh%lx)
640#else
641 call neko_error('No device backend configured')
642#endif
643 end associate
644
645 end subroutine opr_device_opgrad
646
652 subroutine device_ortho(x_d, glb_n_points, n)
653 integer, intent(in) :: n
654 integer(kind=i8), intent(in) :: glb_n_points
655 type(c_ptr), intent(inout) :: x_d
656 real(kind=rp) :: c
657
658 c = device_glsum(x_d, n) / glb_n_points
659 call device_cadd(x_d, -c, n)
660
661 end subroutine device_ortho
662
663 subroutine opr_device_lambda2(lambda2_d, u_d, v_d, w_d, coef)
664 type(coef_t), intent(in) :: coef
665 type(c_ptr), intent(inout) :: lambda2_d
666 type(c_ptr), intent(in) :: u_d, v_d, w_d
667#ifdef HAVE_HIP
668 call hip_lambda2(lambda2_d, u_d, v_d, w_d, &
669 coef%Xh%dx_d, coef%Xh%dy_d, coef%Xh%dz_d, &
670 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
671 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
672 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
673 coef%jacinv_d, coef%msh%nelv, coef%Xh%lx)
674#elif HAVE_CUDA
675 call cuda_lambda2(lambda2_d, u_d, v_d, w_d, &
676 coef%Xh%dx_d, coef%Xh%dy_d, coef%Xh%dz_d, &
677 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
678 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
679 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
680 coef%jacinv_d, coef%msh%nelv, coef%Xh%lx)
681#elif HAVE_OPENCL
682 call opencl_lambda2(lambda2_d, u_d, v_d, w_d, &
683 coef%Xh%dx_d, coef%Xh%dy_d, coef%Xh%dz_d, &
684 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
685 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
686 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
687 coef%jacinv_d, coef%msh%nelv, coef%Xh%lx)
688#elif HAVE_METAL
689 call metal_lambda2(lambda2_d, u_d, v_d, w_d, &
690 coef%Xh%dx_d, coef%Xh%dy_d, coef%Xh%dz_d, &
691 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
692 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
693 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
694 coef%jacinv_d, coef%msh%nelv, coef%Xh%lx)
695#else
696 call neko_error('No device backend configured')
697#endif
698 end subroutine opr_device_lambda2
699
700 subroutine opr_device_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, coef)
701 type(coef_t), intent(in), target :: coef
702 type(c_ptr), intent(inout) :: dtx_d, x_d
703 type(c_ptr), intent(in) :: dr_d, ds_d, dt_d
704
705 associate(xh => coef%Xh, msh => coef%msh, dof => coef%dof)
706#ifdef HAVE_HIP
707 call hip_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, &
708 xh%dxt_d, xh%dyt_d, xh%dzt_d, xh%w3_d, &
709 msh%nelv, xh%lx)
710#elif HAVE_CUDA
711 call cuda_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, &
712 xh%dxt_d, xh%dyt_d, xh%dzt_d, xh%w3_d, &
713 msh%nelv, xh%lx)
714#elif HAVE_OPENCL
715 call opencl_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, &
716 xh%dxt_d, xh%dyt_d, xh%dzt_d, xh%w3_d, &
717 msh%nelv, xh%lx)
718#elif HAVE_METAL
719 call metal_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, &
720 xh%dxt_d, xh%dyt_d, xh%dzt_d, xh%w3_d, &
721 msh%nelv, xh%lx)
722#else
723 call neko_error('No device backend configured')
724#endif
725 end associate
726
727 end subroutine opr_device_cdtp
728
729 subroutine opr_device_conv1(du_d, u_d, vx_d, vy_d, vz_d, Xh, coef, nelv, gdim)
730 type(space_t), intent(in) :: xh
731 type(coef_t), intent(in), target :: coef
732 integer, intent(in) :: nelv, gdim
733 type(c_ptr), intent(inout) :: du_d
734 type(c_ptr), intent(in) :: u_d, vx_d, vy_d, vz_d
735
736 associate(msh => coef%msh, dof => coef%dof)
737#ifdef HAVE_HIP
738 call hip_conv1(du_d, u_d, vx_d, vy_d, vz_d, &
739 xh%dx_d, xh%dy_d, xh%dz_d, &
740 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
741 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
742 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
743 coef%jacinv_d, msh%nelv, msh%gdim, xh%lx)
744#elif HAVE_CUDA
745 call cuda_conv1(du_d, u_d, vx_d, vy_d, vz_d, &
746 xh%dx_d, xh%dy_d, xh%dz_d, &
747 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
748 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
749 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
750 coef%jacinv_d, msh%nelv, msh%gdim, xh%lx)
751#elif HAVE_OPENCL
752 call opencl_conv1(du_d, u_d, vx_d, vy_d, vz_d, &
753 xh%dx_d, xh%dy_d, xh%dz_d, &
754 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
755 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
756 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
757 coef%jacinv_d, msh%nelv, msh%gdim, xh%lx)
758#elif HAVE_METAL
759 call metal_conv1(du_d, u_d, vx_d, vy_d, vz_d, &
760 xh%dx_d, xh%dy_d, xh%dz_d, &
761 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
762 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
763 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
764 coef%jacinv_d, msh%nelv, msh%gdim, xh%lx)
765#else
766 call neko_error('No device backend configured')
767#endif
768 end associate
769
770 end subroutine opr_device_conv1
771
772 subroutine opr_device_convect_scalar(du, u_d, cr_d, cs_d, ct_d, &
773 Xh_GLL, Xh_GL, coef_GLL, coef_GL, GLL_to_GL)
774 type(space_t), intent(in) :: xh_gl
775 type(space_t), intent(in) :: xh_gll
776 type(coef_t), intent(in) :: coef_gll
777 type(coef_t), intent(in) :: coef_gl
778 type(interpolator_t), intent(inout) :: gll_to_gl
779 real(kind=rp), intent(inout) :: &
780 du(xh_gll%lx, xh_gll%ly, xh_gll%lz, coef_gl%msh%nelv)
781 type(c_ptr) :: cr_d, cs_d, ct_d, u_d
782 type(vector_t), pointer :: ud
783 type(c_ptr) :: du_d
784 integer :: temp_index
785 integer :: n_gl, n_gll
786
787 n_gl = coef_gl%msh%nelv * xh_gl%lxyz
788 n_gll = coef_gl%msh%nelv * xh_gll%lxyz
789
790 call neko_scratch_registry%request_vector(ud, temp_index, n_gl, .false.)
791
792 du_d = device_get_ptr(du)
793
794 associate(xh => xh_gl, nelv => coef_gl%msh%nelv, lx => xh_gl%lx, &
795 ud_d => ud%x_d)
796#ifdef HAVE_HIP
797 call hip_convect_scalar(ud_d, u_d, cr_d, cs_d, ct_d, &
798 xh%dx_d, xh%dy_d, xh%dz_d, nelv, lx)
799#elif HAVE_CUDA
800 call cuda_convect_scalar(ud_d, u_d, cr_d, cs_d, ct_d, &
801 xh%dx_d, xh%dy_d, xh%dz_d, nelv, lx)
802#elif HAVE_OPENCL
803 call opencl_convect_scalar(ud_d, u_d, cr_d, cs_d, ct_d, &
804 xh%dx_d, xh%dy_d, xh%dz_d, nelv, lx)
805#elif HAVE_METAL
806 call metal_convect_scalar(ud_d, u_d, cr_d, cs_d, ct_d, &
807 xh%dx_d, xh%dy_d, xh%dz_d, nelv, lx)
808#else
809 call neko_error('No device backend configured')
810#endif
811
812 call gll_to_gl%map(du, ud%x, nelv, xh_gll)
813 call coef_gll%gs_h%op(du, n_gll, gs_op_add)
814 call device_col2(du_d, coef_gll%Binv_d, n_gll)
815
816 end associate
817
818 call neko_scratch_registry%relinquish(temp_index)
819
820 end subroutine opr_device_convect_scalar
821
822 subroutine opr_device_curl(w1, w2, w3, u1, u2, u3, work1, work2, c_Xh, event)
823 type(field_t), intent(inout) :: w1
824 type(field_t), intent(inout) :: w2
825 type(field_t), intent(inout) :: w3
826 type(field_t), intent(in) :: u1
827 type(field_t), intent(in) :: u2
828 type(field_t), intent(in) :: u3
829 type(field_t), intent(inout) :: work1
830 type(field_t), intent(inout) :: work2
831 type(coef_t), intent(in) :: c_xh
832 type(c_ptr), optional, intent(inout) :: event
833 integer :: gdim, n, nelv
834
835 n = w1%dof%size()
836 gdim = c_xh%msh%gdim
837 nelv = c_xh%msh%nelv
838
839 ! this%work1=dw/dy ; this%work2=dv/dz
840#if defined(HAVE_HIP) || defined(HAVE_CUDA) || defined(HAVE_OPENCL) || defined(HAVE_METAL)
841#ifdef HAVE_HIP
842 call hip_dudxyz(work1%x_d, u3%x_d, &
843 c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d,&
844 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
845 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
846#elif HAVE_CUDA
847 call cuda_dudxyz(work1%x_d, u3%x_d, &
848 c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d,&
849 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
850 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
851#elif HAVE_OPENCL
852 call opencl_dudxyz(work1%x_d, u3%x_d, &
853 c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d,&
854 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
855 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
856#elif HAVE_METAL
857 call metal_dudxyz(work1%x_d, u3%x_d, &
858 c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d,&
859 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
860 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
861#endif
862 if (gdim .eq. 3) then
863#ifdef HAVE_HIP
864 call hip_dudxyz(work2%x_d, u2%x_d, &
865 c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d,&
866 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
867 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
868#elif HAVE_CUDA
869 call cuda_dudxyz(work2%x_d, u2%x_d, &
870 c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d,&
871 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
872 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
873#elif HAVE_OPENCL
874 call opencl_dudxyz(work2%x_d, u2%x_d, &
875 c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d,&
876 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
877 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
878#elif HAVE_METAL
879 call metal_dudxyz(work2%x_d, u2%x_d, &
880 c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d,&
881 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
882 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
883#endif
884 call device_sub3(w1%x_d, work1%x_d, work2%x_d, n)
885 else
886 call device_copy(w1%x_d, work1%x_d, n)
887 endif
888 ! this%work1=du/dz ; this%work2=dw/dx
889 if (gdim .eq. 3) then
890#ifdef HAVE_HIP
891 call hip_dudxyz(work1%x_d, u1%x_d, &
892 c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d,&
893 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
894 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
895 call hip_dudxyz(work2%x_d, u3%x_d, &
896 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
897 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
898 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
899#elif HAVE_CUDA
900 call cuda_dudxyz(work1%x_d, u1%x_d, &
901 c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d,&
902 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
903 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
904 call cuda_dudxyz(work2%x_d, u3%x_d, &
905 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
906 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
907 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
908#elif HAVE_OPENCL
909 call opencl_dudxyz(work1%x_d, u1%x_d, &
910 c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d,&
911 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
912 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
913 call opencl_dudxyz(work2%x_d, u3%x_d, &
914 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
915 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
916 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
917#elif HAVE_METAL
918 call metal_dudxyz(work1%x_d, u1%x_d, &
919 c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d,&
920 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
921 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
922 call metal_dudxyz(work2%x_d, u3%x_d, &
923 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
924 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
925 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
926#endif
927 call device_sub3(w2%x_d, work1%x_d, work2%x_d, n)
928 else
929 call device_rzero (work1%x_d, n)
930#ifdef HAVE_HIP
931 call hip_dudxyz(work2%x_d, u3%x_d, &
932 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
933 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
934 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
935#elif HAVE_CUDA
936 call cuda_dudxyz(work2%x_d, u3%x_d, &
937 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
938 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
939 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
940#elif HAVE_OPENCL
941 call opencl_dudxyz(work2%x_d, u3%x_d, &
942 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
943 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
944 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
945#elif HAVE_METAL
946 call metal_dudxyz(work2%x_d, u3%x_d, &
947 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
948 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
949 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
950#endif
951 call device_sub3(w2%x_d, work1%x_d, work2%x_d, n)
952 endif
953 ! this%work1=dv/dx ; this%work2=du/dy
954#ifdef HAVE_HIP
955 call hip_dudxyz(work1%x_d, u2%x_d, &
956 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
957 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
958 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
959 call hip_dudxyz(work2%x_d, u1%x_d, &
960 c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d,&
961 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
962 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
963#elif HAVE_CUDA
964 call cuda_dudxyz(work1%x_d, u2%x_d, &
965 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
966 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
967 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
968 call cuda_dudxyz(work2%x_d, u1%x_d, &
969 c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d,&
970 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
971 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
972#elif HAVE_OPENCL
973 call opencl_dudxyz(work1%x_d, u2%x_d, &
974 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
975 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
976 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
977 call opencl_dudxyz(work2%x_d, u1%x_d, &
978 c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d,&
979 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
980 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
981#elif HAVE_METAL
982 call metal_dudxyz(work1%x_d, u2%x_d, &
983 c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d,&
984 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
985 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
986 call metal_dudxyz(work2%x_d, u1%x_d, &
987 c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d,&
988 c_xh%Xh%dx_d, c_xh%Xh%dy_d, c_xh%Xh%dz_d, &
989 c_xh%jacinv_d, nelv, c_xh%Xh%lx)
990#endif
991 call device_sub3(w3%x_d, work1%x_d, work2%x_d, n)
992 !! BC dependent, Needs to change if cyclic
993
994 call device_opcolv(w1%x_d, w2%x_d, w3%x_d, c_xh%B_d, gdim, n)
995
996 if(c_xh%cyclic) call opr_device_rotate_cyc(w1%x_d, w2%x_d, w3%x_d, 1, c_xh)
997 if (present(event)) then
998 call c_xh%gs_h%op(w1%x, w2%x, w3%x, n, gs_op_add, event)
999 call device_event_sync(event)
1000 else
1001 call c_xh%gs_h%op(w1%x, w2%x, w3%x, n, gs_op_add)
1002 end if
1003 if(c_xh%cyclic) call opr_device_rotate_cyc(w1%x_d, w2%x_d, w3%x_d, 0, c_xh)
1004
1005 call device_opcolv(w1%x_d, w2%x_d, w3%x_d, c_xh%Binv_d, gdim, n)
1006
1007#else
1008 call neko_error('No device backend configured')
1009#endif
1010
1011 end subroutine opr_device_curl
1012
1013 function opr_device_cfl(dt, u_d, v_d, w_d, Xh, coef, nelv, gdim) result(cfl)
1014 type(space_t) :: xh
1015 type(coef_t) :: coef
1016 integer :: nelv, gdim
1017 real(kind=rp) :: dt
1018 type(c_ptr), intent(in) :: u_d, v_d, w_d
1019 real(kind=rp) :: cfl
1020
1021#ifdef HAVE_HIP
1022 cfl = hip_cfl(dt, u_d, v_d, w_d, &
1023 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
1024 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
1025 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
1026 xh%dr_inv_d, xh%ds_inv_d, xh%dt_inv_d, &
1027 coef%jacinv_d, nelv, xh%lx)
1028#elif HAVE_CUDA
1029 cfl = cuda_cfl(dt, u_d, v_d, w_d, &
1030 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
1031 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
1032 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
1033 xh%dr_inv_d, xh%ds_inv_d, xh%dt_inv_d, &
1034 coef%jacinv_d, nelv, xh%lx)
1035#elif HAVE_OPENCL
1036 cfl = opencl_cfl(dt, u_d, v_d, w_d, &
1037 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
1038 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
1039 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
1040 xh%dr_inv_d, xh%ds_inv_d, xh%dt_inv_d, &
1041 coef%jacinv_d, nelv, xh%lx)
1042#elif HAVE_METAL
1043 cfl = metal_cfl(dt, u_d, v_d, w_d, &
1044 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
1045 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
1046 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
1047 xh%dr_inv_d, xh%ds_inv_d, xh%dt_inv_d, &
1048 coef%jacinv_d, nelv, xh%lx)
1049#else
1050 cfl = 0.0_rp
1051 call neko_error('No device backend configured')
1052#endif
1053 end function opr_device_cfl
1054
1055 subroutine opr_device_rotate_cyc(vx_d, vy_d, vz_d, idir, coef)
1056 type(c_ptr), intent(inout) :: vx_d, vy_d, vz_d
1057 integer, intent(in) :: idir
1058 type(coef_t), intent(in) :: coef
1059 integer :: ncyc
1060
1061 ncyc = coef%cyc_msk(0) - 1
1062
1063 if (ncyc .le. 0) return
1064
1065#ifdef HAVE_HIP
1066 call hip_rotate_cyc(vx_d, vy_d, vz_d, &
1067 coef%dof%x_d, coef%dof%y_d, coef%dof%z_d, &
1068 coef%cyc_msk_d, coef%R11_d, coef%R12_d, &
1069 ncyc, idir)
1070#elif HAVE_CUDA
1071 call cuda_rotate_cyc(vx_d, vy_d, vz_d, &
1072 coef%dof%x_d, coef%dof%y_d, coef%dof%z_d, &
1073 coef%cyc_msk_d, coef%R11_d, coef%R12_d, &
1074 ncyc, idir)
1075#elif HAVE_OPENCL
1076 call opencl_rotate_cyc(vx_d, vy_d, vz_d, &
1077 coef%dof%x_d, coef%dof%y_d, coef%dof%z_d, &
1078 coef%cyc_msk_d, coef%R11_d, coef%R12_d, &
1079 ncyc, idir)
1080#elif HAVE_METAL
1081 call metal_rotate_cyc(vx_d, vy_d, vz_d, &
1082 coef%dof%x_d, coef%dof%y_d, coef%dof%z_d, &
1083 coef%cyc_msk_d, coef%R11_d, coef%R12_d, &
1084 ncyc, idir)
1085#else
1086 call neko_error('No device backend configured for rotate_cyc')
1087#endif
1088 end subroutine opr_device_rotate_cyc
1089
1090 subroutine opr_device_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
1091 Xh, coef)
1092 type(space_t), intent(inout) :: xh
1093 type(coef_t), intent(inout) :: coef
1094 type(c_ptr), intent(inout) :: cr_d, cs_d, ct_d, cx_d, cy_d, cz_d
1095
1096#ifdef HAVE_HIP
1097 call hip_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
1098 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
1099 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
1100 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
1101 xh%w3_d, coef%msh%nelv, xh%lx)
1102#elif HAVE_CUDA
1103 call cuda_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
1104 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
1105 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
1106 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
1107 xh%w3_d, coef%msh%nelv, xh%lx)
1108#elif HAVE_OPENCL
1109 call opencl_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
1110 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
1111 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
1112 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
1113 xh%w3_d, coef%msh%nelv, xh%lx)
1114#elif HAVE_METAL
1115 call metal_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, &
1116 coef%drdx_d, coef%dsdx_d, coef%dtdx_d, &
1117 coef%drdy_d, coef%dsdy_d, coef%dtdy_d, &
1118 coef%drdz_d, coef%dsdz_d, coef%dtdz_d, &
1119 xh%w3_d, coef%msh%nelv, xh%lx)
1120#else
1121 call neko_error('No device backend configured')
1122#endif
1123
1124 end subroutine opr_device_set_convect_rst
1125
1126end module opr_device
Return the device pointer for an associated Fortran array.
Definition device.F90:113
Coefficients.
Definition coef.f90:34
subroutine, public device_sub3(a_d, b_d, c_d, n, strm)
Vector subtraction .
real(kind=rp) function, public device_glsum(a_d, n, strm)
Sum a vector of length n.
subroutine, public device_rzero(a_d, n, strm)
Zero a real vector.
subroutine, public device_copy(a_d, b_d, n, strm)
Copy a vector .
subroutine, public device_col2(a_d, b_d, n, strm)
Vector multiplication .
subroutine, public device_opcolv(a1_d, a2_d, a3_d, c_d, gdim, n)
Device abstraction, common interface for various accelerators.
Definition device.F90:34
subroutine, public device_event_sync(event)
Synchronize an event.
Definition device.F90:1667
Defines a field.
Definition field.f90:34
Gather-scatter.
Routines to interpolate between different spaces.
integer, parameter, public i8
Definition num_types.f90:7
integer, parameter, public c_rp
Definition num_types.f90:13
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Operators accelerator backends.
subroutine, public opr_device_convect_scalar(du, u_d, cr_d, cs_d, ct_d, xh_gll, xh_gl, coef_gll, coef_gl, gll_to_gl)
subroutine, public opr_device_cdtp(dtx_d, x_d, dr_d, ds_d, dt_d, coef)
subroutine, public opr_device_dudxyz(du_d, u_d, dr_d, ds_d, dt_d, coef)
real(kind=rp) function, public opr_device_cfl(dt, u_d, v_d, w_d, xh, coef, nelv, gdim)
subroutine, public opr_device_conv1(du_d, u_d, vx_d, vy_d, vz_d, xh, coef, nelv, gdim)
subroutine, public device_ortho(x_d, glb_n_points, n)
Othogonalize with regard to vector (1,1,1,1,1,1...,1)^T.
subroutine, public opr_device_curl(w1, w2, w3, u1, u2, u3, work1, work2, c_xh, event)
subroutine, public opr_device_set_convect_rst(cr_d, cs_d, ct_d, cx_d, cy_d, cz_d, xh, coef)
subroutine, public opr_device_lambda2(lambda2_d, u_d, v_d, w_d, coef)
subroutine, public opr_device_rotate_cyc(vx_d, vy_d, vz_d, idir, coef)
subroutine, public opr_device_opgrad(ux_d, uy_d, uz_d, u_d, coef)
Defines a registry for storing and requesting temporary objects This can be used when you have a func...
type(scratch_registry_t), target, public neko_scratch_registry
Global scratch registry.
Defines a function space.
Definition space.f90:34
Utilities.
Definition utils.f90:35
Defines a vector.
Definition vector.f90:34
void opencl_cdtp(void *dtx, void *x, void *dr, void *ds, void *dt, void *dxt, void *dyt, void *dzt, void *w3, int *nel, int *lx)
Definition opr_cdtp.c:57
void cuda_cdtp(void *dtx, void *x, void *dr, void *ds, void *dt, void *dxt, void *dyt, void *dzt, void *w3, int *nel, int *lx)
Definition opr_cdtp.cu:57
real opencl_cfl(real *dt, void *u, void *v, void *w, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *dr_inv, void *ds_inv, void *dt_inv, void *jacinv, int *nel, int *lx)
Definition opr_cfl.c:54
real cuda_cfl(real *dt, void *u, void *v, void *w, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *dr_inv, void *ds_inv, void *dt_inv, void *jacinv, int *nel, int *lx)
Definition opr_cfl.cu:76
void opencl_conv1(void *du, void *u, void *vx, void *vy, void *vz, void *dx, void *dy, void *dz, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *jacinv, int *nel, int *gdim, int *lx)
Definition opr_conv1.c:57
void cuda_conv1(void *du, void *u, void *vx, void *vy, void *vz, void *dx, void *dy, void *dz, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *jacinv, int *nel, int *gdim, int *lx)
Definition opr_conv1.cu:60
void opencl_convect_scalar(void *du, void *u, void *cr, void *cs, void *ct, void *dx, void *dy, void *dz, int *nel, int *lx)
void cuda_convect_scalar(void *du, void *u, void *cr, void *cs, void *ct, void *dx, void *dy, void *dz, int *nel, int *lx)
void opencl_dudxyz(void *du, void *u, void *dr, void *ds, void *dt, void *dx, void *dy, void *dz, void *jacinv, int *nel, int *lx)
Definition opr_dudxyz.c:57
void cuda_dudxyz(void *du, void *u, void *dr, void *ds, void *dt, void *dx, void *dy, void *dz, void *jacinv, int *nel, int *lx)
Definition opr_dudxyz.cu:57
void opencl_lambda2(void *lambda2, void *u, void *v, void *w, void *dx, void *dy, void *dz, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *jacinv, int *nel, int *lx)
Definition opr_lambda2.c:53
void cuda_lambda2(void *lambda2, void *u, void *v, void *w, void *dx, void *dy, void *dz, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *jacinv, int *nel, int *lx)
void opencl_opgrad(void *ux, void *uy, void *uz, void *u, void *dx, void *dy, void *dz, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *w3, int *nel, int *lx)
Definition opr_opgrad.c:57
void cuda_opgrad(void *ux, void *uy, void *uz, void *u, void *dx, void *dy, void *dz, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *w3, int *nel, int *lx)
Definition opr_opgrad.cu:59
void opencl_rotate_cyc(void *vx, void *vy, void *vz, void *x, void *y, void *z, void *cyc_msk, void *R11, void *R12, int *ncyc, int *idir)
void cuda_rotate_cyc(void *vx, void *vy, void *vz, void *x, void *y, void *z, void *cyc_msk, void *R11, void *R12, int *ncyc, int *idir)
void opencl_set_convect_rst(void *cr, void *cs, void *ct, void *cx, void *cy, void *cz, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *w3, int *nel, int *lx)
void cuda_set_convect_rst(void *cr, void *cs, void *ct, void *cx, void *cy, void *cz, void *drdx, void *dsdx, void *dtdx, void *drdy, void *dsdy, void *dtdy, void *drdz, void *dsdz, void *dtdz, void *w3, int *nel, int *lx)
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:63
Interpolation between two space::space_t.
The function space for the SEM solution fields.
Definition space.f90:64