Neko 1.99.6
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
compressible_ops_device.F90
Go to the documentation of this file.
1! Copyright (c) 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, intrinsic :: iso_c_binding, only : c_ptr, c_int
36 use num_types, only : rp, c_rp
37 use field, only : field_t
38 use utils, only : neko_error
39 implicit none
40 private
41
42#ifdef HAVE_HIP
43 interface
44 subroutine hip_compute_max_wave_speed(max_wave_speed_d, u_d, v_d, w_d, &
45 gamma, p_d, rho_d, n) &
46 bind(c, name = 'hip_compute_max_wave_speed')
47 use, intrinsic :: iso_c_binding
48 import c_rp
49 type(c_ptr), value :: max_wave_speed_d, u_d, v_d, w_d, p_d, rho_d
50 real(c_rp) :: gamma
51 integer(c_int) :: n
52 end subroutine hip_compute_max_wave_speed
53 end interface
54
55 interface
56 subroutine hip_compute_entropy(S_d, p_d, rho_d, gamma, n) &
57 bind(c, name = 'hip_compute_entropy')
58 use, intrinsic :: iso_c_binding
59 import c_rp
60 type(c_ptr), value :: S_d, p_d, rho_d
61 real(c_rp) :: gamma
62 integer(c_int) :: n
63 end subroutine hip_compute_entropy
64 end interface
65
66 interface
67 subroutine hip_update_uvw(u_d, v_d, w_d, m_x_d, &
68 m_y_d, m_z_d, rho_d, n) &
69 bind(c, name = 'hip_update_uvw')
70 use, intrinsic :: iso_c_binding
71 import c_rp
72 type(c_ptr), value :: u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d
73 integer(c_int) :: n
74 end subroutine hip_update_uvw
75 end interface
76
77 interface
78 subroutine hip_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
79 p_d, ruvw_d, u_d, v_d, w_d, E_d, rho_d, gamma, n) &
80 bind(c, name = 'hip_update_mxyz_p_ruvw')
81 use, intrinsic :: iso_c_binding
82 import c_rp
83 type(c_ptr), value :: u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d
84 type(c_ptr), value :: p_d, ruvw_d, E_d
85 real(c_rp) :: gamma
86 integer(c_int) :: n
87 end subroutine hip_update_mxyz_p_ruvw
88 end interface
89
90 interface
91 subroutine hip_update_e(E_d, p_d, ruvw_d, gamma, n) &
92 bind(c, name = 'hip_update_e')
93 use, intrinsic :: iso_c_binding
94 import c_rp
95 type(c_ptr), value :: p_d, E_d, ruvw_d
96 real(c_rp) :: gamma
97 integer(c_int) :: n
98 end subroutine hip_update_e
99 end interface
100
101 interface
102 subroutine hip_update_temperature(T_d, p_d, rho_d, gamma, n) &
103 bind(c, name = 'hip_update_temperature')
104 use, intrinsic :: iso_c_binding
105 import c_rp
106 type(c_ptr), value :: T_d, p_d, rho_d
107 real(c_rp) :: gamma
108 integer(c_int) :: n
109 end subroutine hip_update_temperature
110 end interface
111
112 interface
113 subroutine hip_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, &
114 dudx_d, dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, &
115 dwdx_d, dwdy_d, dwdz_d, mu_d, n) &
116 bind(c, name = 'hip_ns_flux_prepare')
117 use, intrinsic :: iso_c_binding
118 type(c_ptr), value :: div_flux_d, dissipation_d, h1_d
119 type(c_ptr), value :: dudx_d, dudy_d, dudz_d
120 type(c_ptr), value :: dvdx_d, dvdy_d, dvdz_d
121 type(c_ptr), value :: dwdx_d, dwdy_d, dwdz_d, mu_d
122 integer(c_int) :: n
123 end subroutine hip_ns_flux_prepare
124 end interface
125
126 interface
127 subroutine hip_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, &
128 visc_E_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
129 opgrad_z_d, u_d, v_d, w_d, B_d, dissipation_d, n) &
130 bind(c, name = 'hip_ns_flux_finalize')
131 use, intrinsic :: iso_c_binding
132 type(c_ptr), value :: visc_m_x_d, visc_m_y_d, visc_m_z_d, visc_E_d
133 type(c_ptr), value :: f_x_d, f_y_d, f_z_d
134 type(c_ptr), value :: opgrad_x_d, opgrad_y_d, opgrad_z_d
135 type(c_ptr), value :: u_d, v_d, w_d, B_d, dissipation_d
136 integer(c_int) :: n
137 end subroutine hip_ns_flux_finalize
138 end interface
139
140 interface
141 subroutine hip_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, &
142 kappa_d, gamma, n) bind(c, name = 'hip_ns_flux_temperature')
143 use, intrinsic :: iso_c_binding
144 import c_rp
145 type(c_ptr), value :: div_flux_d, h1_d, p_d, rho_d, kappa_d
146 real(c_rp) :: gamma
147 integer(c_int) :: n
148 end subroutine hip_ns_flux_temperature
149 end interface
150
151#elif HAVE_CUDA
152 interface
153 subroutine cuda_compute_max_wave_speed(max_wave_speed_d, u_d, v_d, w_d, &
154 gamma, p_d, rho_d, n) &
155 bind(c, name = 'cuda_compute_max_wave_speed')
156 use, intrinsic :: iso_c_binding
157 import c_rp
158 type(c_ptr), value :: max_wave_speed_d, u_d, v_d, w_d, p_d, rho_d
159 real(c_rp) :: gamma
160 integer(c_int) :: n
161 end subroutine cuda_compute_max_wave_speed
162 end interface
163
164 interface
165 subroutine cuda_compute_entropy(S_d, p_d, rho_d, gamma, n) &
166 bind(c, name = 'cuda_compute_entropy')
167 use, intrinsic :: iso_c_binding
168 import c_rp
169 type(c_ptr), value :: S_d, p_d, rho_d
170 real(c_rp) :: gamma
171 integer(c_int) :: n
172 end subroutine cuda_compute_entropy
173 end interface
174
175 interface
176 subroutine cuda_update_uvw(u_d, v_d, w_d, m_x_d, &
177 m_y_d, m_z_d, rho_d, n) &
178 bind(c, name = 'cuda_update_uvw')
179 use, intrinsic :: iso_c_binding
180 import c_rp
181 type(c_ptr), value :: u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d
182 integer(c_int) :: n
183 end subroutine cuda_update_uvw
184 end interface
185
186 interface
187 subroutine cuda_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
188 p_d, ruvw_d, u_d, v_d, w_d, E_d, rho_d, gamma, n) &
189 bind(c, name = 'cuda_update_mxyz_p_ruvw')
190 use, intrinsic :: iso_c_binding
191 import c_rp
192 type(c_ptr), value :: u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d
193 type(c_ptr), value :: p_d, ruvw_d, E_d
194 real(c_rp) :: gamma
195 integer(c_int) :: n
196 end subroutine cuda_update_mxyz_p_ruvw
197 end interface
198
199 interface
200 subroutine cuda_update_e(E_d, p_d, ruvw_d, gamma, n) &
201 bind(c, name = 'cuda_update_e')
202 use, intrinsic :: iso_c_binding
203 import c_rp
204 type(c_ptr), value :: p_d, E_d, ruvw_d
205 real(c_rp) :: gamma
206 integer(c_int) :: n
207 end subroutine cuda_update_e
208 end interface
209
210 interface
211 subroutine cuda_update_temperature(T_d, p_d, rho_d, gamma, n) &
212 bind(c, name = 'cuda_update_temperature')
213 use, intrinsic :: iso_c_binding
214 import c_rp
215 type(c_ptr), value :: T_d, p_d, rho_d
216 real(c_rp) :: gamma
217 integer(c_int) :: n
218 end subroutine cuda_update_temperature
219 end interface
220
221 interface
222 subroutine cuda_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, &
223 dudx_d, dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, &
224 dwdx_d, dwdy_d, dwdz_d, mu_d, n) &
225 bind(c, name = 'cuda_ns_flux_prepare')
226 use, intrinsic :: iso_c_binding
227 type(c_ptr), value :: div_flux_d, dissipation_d, h1_d
228 type(c_ptr), value :: dudx_d, dudy_d, dudz_d
229 type(c_ptr), value :: dvdx_d, dvdy_d, dvdz_d
230 type(c_ptr), value :: dwdx_d, dwdy_d, dwdz_d, mu_d
231 integer(c_int) :: n
232 end subroutine cuda_ns_flux_prepare
233 end interface
234
235 interface
236 subroutine cuda_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, &
237 visc_E_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
238 opgrad_z_d, u_d, v_d, w_d, B_d, dissipation_d, n) &
239 bind(c, name = 'cuda_ns_flux_finalize')
240 use, intrinsic :: iso_c_binding
241 type(c_ptr), value :: visc_m_x_d, visc_m_y_d, visc_m_z_d, visc_E_d
242 type(c_ptr), value :: f_x_d, f_y_d, f_z_d
243 type(c_ptr), value :: opgrad_x_d, opgrad_y_d, opgrad_z_d
244 type(c_ptr), value :: u_d, v_d, w_d, B_d, dissipation_d
245 integer(c_int) :: n
246 end subroutine cuda_ns_flux_finalize
247 end interface
248
249 interface
250 subroutine cuda_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, &
251 kappa_d, gamma, n) bind(c, name = 'cuda_ns_flux_temperature')
252 use, intrinsic :: iso_c_binding
253 import c_rp
254 type(c_ptr), value :: div_flux_d, h1_d, p_d, rho_d, kappa_d
255 real(c_rp) :: gamma
256 integer(c_int) :: n
257 end subroutine cuda_ns_flux_temperature
258 end interface
259
260#elif HAVE_OPENCL
261 interface
262 subroutine opencl_compute_max_wave_speed(max_wave_speed_d, u_d, v_d, w_d, &
263 gamma, p_d, rho_d, n) &
264 bind(c, name = 'opencl_compute_max_wave_speed')
265 use, intrinsic :: iso_c_binding
266 import c_rp
267 type(c_ptr), value :: max_wave_speed_d, u_d, v_d, w_d, p_d, rho_d
268 real(c_rp), value :: gamma
269 integer(c_int), value :: n
270 end subroutine opencl_compute_max_wave_speed
271 end interface
272
273 interface
274 subroutine opencl_compute_entropy(S_d, p_d, rho_d, gamma, n) &
275 bind(c, name = 'opencl_compute_entropy')
276 use, intrinsic :: iso_c_binding
277 import c_rp
278 type(c_ptr), value :: S_d, p_d, rho_d
279 real(c_rp), value :: gamma
280 integer(c_int), value :: n
281 end subroutine opencl_compute_entropy
282 end interface
283
284 interface
285 subroutine opencl_update_uvw(u_d, v_d, w_d, m_x_d, &
286 m_y_d, m_z_d, rho_d, n) &
287 bind(c, name = 'opencl_update_uvw')
288 use, intrinsic :: iso_c_binding
289 import c_rp
290 type(c_ptr), value :: u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d
291 integer(c_int), value :: n
292 end subroutine opencl_update_uvw
293 end interface
294
295 interface
296 subroutine opencl_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
297 p_d, ruvw_d, u_d, v_d, w_d, E_d, rho_d, gamma, n) &
298 bind(c, name = 'opencl_update_mxyz_p_ruvw')
299 use, intrinsic :: iso_c_binding
300 import c_rp
301 type(c_ptr), value :: u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d
302 type(c_ptr), value :: p_d, ruvw_d, E_d
303 real(c_rp), value :: gamma
304 integer(c_int), value :: n
305 end subroutine opencl_update_mxyz_p_ruvw
306 end interface
307
308 interface
309 subroutine opencl_update_e(E_d, p_d, ruvw_d, gamma, n) &
310 bind(c, name = 'opencl_update_e')
311 use, intrinsic :: iso_c_binding
312 import c_rp
313 type(c_ptr), value :: p_d, E_d, ruvw_d
314 real(c_rp), value :: gamma
315 integer(c_int), value :: n
316 end subroutine opencl_update_e
317 end interface
318 interface
319 subroutine opencl_update_temperature(T_d, p_d, rho_d, gamma, n) &
320 bind(c, name = 'opencl_update_temperature')
321 use, intrinsic :: iso_c_binding
322 import c_rp
323 type(c_ptr), value :: T_d, p_d, rho_d
324 real(c_rp), value :: gamma
325 integer(c_int), value :: n
326 end subroutine opencl_update_temperature
327 end interface
328
329 interface
330 subroutine opencl_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, &
331 dudx_d, dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, &
332 dwdx_d, dwdy_d, dwdz_d, mu_d, n) &
333 bind(c, name = 'opencl_ns_flux_prepare')
334 use, intrinsic :: iso_c_binding
335 type(c_ptr), value :: div_flux_d, dissipation_d, h1_d
336 type(c_ptr), value :: dudx_d, dudy_d, dudz_d
337 type(c_ptr), value :: dvdx_d, dvdy_d, dvdz_d
338 type(c_ptr), value :: dwdx_d, dwdy_d, dwdz_d, mu_d
339 integer(c_int), value :: n
340 end subroutine opencl_ns_flux_prepare
341 end interface
342
343 interface
344 subroutine opencl_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, &
345 visc_E_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
346 opgrad_z_d, u_d, v_d, w_d, B_d, dissipation_d, n) &
347 bind(c, name = 'opencl_ns_flux_finalize')
348 use, intrinsic :: iso_c_binding
349 type(c_ptr), value :: visc_m_x_d, visc_m_y_d, visc_m_z_d, visc_E_d
350 type(c_ptr), value :: f_x_d, f_y_d, f_z_d
351 type(c_ptr), value :: opgrad_x_d, opgrad_y_d, opgrad_z_d
352 type(c_ptr), value :: u_d, v_d, w_d, B_d, dissipation_d
353 integer(c_int), value :: n
354 end subroutine opencl_ns_flux_finalize
355 end interface
356
357 interface
358 subroutine opencl_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, &
359 kappa_d, gamma, n) bind(c, name = 'opencl_ns_flux_temperature')
360 use, intrinsic :: iso_c_binding
361 import c_rp
362 type(c_ptr), value :: div_flux_d, h1_d, p_d, rho_d, kappa_d
363 real(c_rp), value :: gamma
364 integer(c_int), value :: n
365 end subroutine opencl_ns_flux_temperature
366 end interface
367#elif HAVE_METAL
368 interface
369 subroutine metal_compute_max_wave_speed(max_wave_speed_d, u_d, v_d, w_d, &
370 gamma, p_d, rho_d, n) &
371 bind(c, name = 'metal_compute_max_wave_speed')
372 use, intrinsic :: iso_c_binding
373 import c_rp
374 type(c_ptr), value :: max_wave_speed_d, u_d, v_d, w_d, p_d, rho_d
375 real(c_rp), value :: gamma
376 integer(c_int), value :: n
377 end subroutine metal_compute_max_wave_speed
378 end interface
379
380 interface
381 subroutine metal_compute_entropy(S_d, p_d, rho_d, gamma, n) &
382 bind(c, name = 'metal_compute_entropy')
383 use, intrinsic :: iso_c_binding
384 import c_rp
385 type(c_ptr), value :: S_d, p_d, rho_d
386 real(c_rp), value :: gamma
387 integer(c_int), value :: n
388 end subroutine metal_compute_entropy
389 end interface
390
391 interface
392 subroutine metal_update_uvw(u_d, v_d, w_d, m_x_d, &
393 m_y_d, m_z_d, rho_d, n) &
394 bind(c, name = 'metal_update_uvw')
395 use, intrinsic :: iso_c_binding
396 import c_rp
397 type(c_ptr), value :: u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d
398 integer(c_int), value :: n
399 end subroutine metal_update_uvw
400 end interface
401
402 interface
403 subroutine metal_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
404 p_d, ruvw_d, u_d, v_d, w_d, E_d, rho_d, gamma, n) &
405 bind(c, name = 'metal_update_mxyz_p_ruvw')
406 use, intrinsic :: iso_c_binding
407 import c_rp
408 type(c_ptr), value :: u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d
409 type(c_ptr), value :: p_d, ruvw_d, E_d
410 real(c_rp), value :: gamma
411 integer(c_int), value :: n
412 end subroutine metal_update_mxyz_p_ruvw
413 end interface
414
415 interface
416 subroutine metal_update_e(E_d, p_d, ruvw_d, gamma, n) &
417 bind(c, name = 'metal_update_e')
418 use, intrinsic :: iso_c_binding
419 import c_rp
420 type(c_ptr), value :: p_d, E_d, ruvw_d
421 real(c_rp), value :: gamma
422 integer(c_int), value :: n
423 end subroutine metal_update_e
424 end interface
425
426 interface
427 subroutine metal_update_temperature(T_d, p_d, rho_d, gamma, n) &
428 bind(c, name = 'metal_update_temperature')
429 use, intrinsic :: iso_c_binding
430 import c_rp
431 type(c_ptr), value :: T_d, p_d, rho_d
432 real(c_rp), value :: gamma
433 integer(c_int), value :: n
434 end subroutine metal_update_temperature
435 end interface
436
437 interface
438 subroutine metal_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, &
439 dudx_d, dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, &
440 dwdx_d, dwdy_d, dwdz_d, mu_d, n) &
441 bind(c, name = 'metal_ns_flux_prepare')
442 use, intrinsic :: iso_c_binding
443 type(c_ptr), value :: div_flux_d, dissipation_d, h1_d
444 type(c_ptr), value :: dudx_d, dudy_d, dudz_d
445 type(c_ptr), value :: dvdx_d, dvdy_d, dvdz_d
446 type(c_ptr), value :: dwdx_d, dwdy_d, dwdz_d, mu_d
447 integer(c_int), value :: n
448 end subroutine metal_ns_flux_prepare
449 end interface
450
451 interface
452 subroutine metal_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, &
453 visc_E_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
454 opgrad_z_d, u_d, v_d, w_d, B_d, dissipation_d, n) &
455 bind(c, name = 'metal_ns_flux_finalize')
456 use, intrinsic :: iso_c_binding
457 type(c_ptr), value :: visc_m_x_d, visc_m_y_d, visc_m_z_d, visc_E_d
458 type(c_ptr), value :: f_x_d, f_y_d, f_z_d
459 type(c_ptr), value :: opgrad_x_d, opgrad_y_d, opgrad_z_d
460 type(c_ptr), value :: u_d, v_d, w_d, B_d, dissipation_d
461 integer(c_int), value :: n
462 end subroutine metal_ns_flux_finalize
463 end interface
464
465 interface
466 subroutine metal_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, &
467 kappa_d, gamma, n) bind(c, name = 'metal_ns_flux_temperature')
468 use, intrinsic :: iso_c_binding
469 import c_rp
470 type(c_ptr), value :: div_flux_d, h1_d, p_d, rho_d, kappa_d
471 real(c_rp), value :: gamma
472 integer(c_int), value :: n
473 end subroutine metal_ns_flux_temperature
474 end interface
475#endif
476
486
487contains
488
491 u, v, w, gamma, p, rho, n)
492 integer, intent(in) :: n
493 real(kind=rp), intent(in) :: gamma
494 type(field_t), intent(inout) :: max_wave_speed
495 type(field_t), intent(in) :: u, v, w, p, rho
496
497#ifdef HAVE_HIP
498 call hip_compute_max_wave_speed(max_wave_speed%x_d, u%x_d, v%x_d, &
499 w%x_d, gamma, p%x_d, rho%x_d, n)
500#elif HAVE_CUDA
501 call cuda_compute_max_wave_speed(max_wave_speed%x_d, u%x_d, v%x_d, &
502 w%x_d, gamma, p%x_d, rho%x_d, n)
503#elif HAVE_OPENCL
504 call opencl_compute_max_wave_speed(max_wave_speed%x_d, u%x_d, v%x_d, &
505 w%x_d, gamma, p%x_d, rho%x_d, n)
506#elif HAVE_METAL
507 call metal_compute_max_wave_speed(max_wave_speed%x_d, u%x_d, v%x_d, &
508 w%x_d, gamma, p%x_d, rho%x_d, n)
509#else
510 call neko_error('No device backend configured')
511#endif
513
515 subroutine compressible_ops_device_compute_entropy(S, p, rho, gamma, n)
516 integer, intent(in) :: n
517 real(kind=rp), intent(in) :: gamma
518 type(field_t), intent(inout) :: s
519 type(field_t), intent(in) :: p, rho
520
521#ifdef HAVE_HIP
522 call hip_compute_entropy(s%x_d, p%x_d, rho%x_d, gamma, n)
523#elif HAVE_CUDA
524 call cuda_compute_entropy(s%x_d, p%x_d, rho%x_d, gamma, n)
525#elif HAVE_OPENCL
526 call opencl_compute_entropy(s%x_d, p%x_d, rho%x_d, gamma, n)
527#elif HAVE_METAL
528 call metal_compute_entropy(s%x_d, p%x_d, rho%x_d, gamma, n)
529#else
530 call neko_error('No device backend configured')
531#endif
533
535 subroutine compressible_ops_device_update_uvw(u_d, v_d, w_d, &
536 m_x_d, m_y_d, m_z_d, rho_d, n)
537 type(c_ptr), intent(inout) :: u_d, v_d, w_d
538 type(c_ptr), intent(in) :: m_x_d, m_y_d, m_z_d, rho_d
539 integer, intent(in) :: n
540 integer :: i
541
542#ifdef HAVE_HIP
543 call hip_update_uvw(u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d, n)
544#elif HAVE_CUDA
545 call cuda_update_uvw(u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d, n)
546#elif HAVE_OPENCL
547 call opencl_update_uvw(u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d, n)
548#elif HAVE_METAL
549 call metal_update_uvw(u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d, n)
550#else
551 call neko_error('No device backend configured')
552#endif
553
555
557 subroutine compressible_ops_device_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
558 p_d, ruvw_d, u_d, v_d, w_d, E_d, rho_d, gamma, n)
559 integer, intent(in) :: n
560 type(c_ptr), intent(inout) :: m_x_d, m_y_d, m_z_d, p_d, ruvw_d
561 type(c_ptr), intent(in) :: u_d, v_d, w_d, e_d, rho_d
562 real(kind=rp), intent(in) :: gamma
563
564
565#ifdef HAVE_HIP
566 call hip_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
567 p_d, ruvw_d, u_d, v_d, w_d, e_d, rho_d, gamma, n)
568#elif HAVE_CUDA
569 call cuda_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
570 p_d, ruvw_d, u_d, v_d, w_d, e_d, rho_d, gamma, n)
571#elif HAVE_OPENCL
572 call opencl_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
573 p_d, ruvw_d, u_d, v_d, w_d, e_d, rho_d, gamma, n)
574#elif HAVE_METAL
575 call metal_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, &
576 p_d, ruvw_d, u_d, v_d, w_d, e_d, rho_d, gamma, n)
577#else
578 call neko_error('No device backend configured')
579#endif
580
582
584 subroutine compressible_ops_device_update_e(E_d, p_d, ruvw_d, gamma, n)
585 integer, intent(in) :: n
586 type(c_ptr), intent(inout) :: e_d, p_d
587 ! ruvw = 0.5 * rho * (u^2 + v^2 + w^2)
588 type(c_ptr), intent(in) :: ruvw_d
589 real(kind=rp), intent(in) :: gamma
590
591#ifdef HAVE_HIP
592 call hip_update_e(e_d, p_d, ruvw_d, gamma, n)
593#elif HAVE_CUDA
594 call cuda_update_e(e_d, p_d, ruvw_d, gamma, n)
595#elif HAVE_OPENCL
596 call opencl_update_e(e_d, p_d, ruvw_d, gamma, n)
597#elif HAVE_METAL
598 call metal_update_e(e_d, p_d, ruvw_d, gamma, n)
599#else
600 call neko_error('No device backend configured')
601#endif
602
604
606 subroutine compressible_ops_device_update_temperature(T_d, p_d, rho_d, &
607 gamma, n)
608 integer, intent(in) :: n
609 type(c_ptr), intent(inout) :: t_d
610 type(c_ptr), intent(in) :: p_d, rho_d
611 real(kind=rp), intent(in) :: gamma
612
613#ifdef HAVE_HIP
614 call hip_update_temperature(t_d, p_d, rho_d, gamma, n)
615#elif HAVE_CUDA
616 call cuda_update_temperature(t_d, p_d, rho_d, gamma, n)
617#elif HAVE_OPENCL
618 call opencl_update_temperature(t_d, p_d, rho_d, gamma, n)
619#elif HAVE_METAL
620 call metal_update_temperature(t_d, p_d, rho_d, gamma, n)
621#else
622 call neko_error('No device backend configured')
623#endif
624
626
629 dissipation_d, h1_d, dudx_d, dudy_d, dudz_d, dvdx_d, dvdy_d, &
630 dvdz_d, dwdx_d, dwdy_d, dwdz_d, mu_d, n)
631 integer, intent(in) :: n
632 type(c_ptr), intent(inout) :: div_flux_d, dissipation_d, h1_d
633 type(c_ptr), intent(in) :: dudx_d, dudy_d, dudz_d
634 type(c_ptr), intent(in) :: dvdx_d, dvdy_d, dvdz_d
635 type(c_ptr), intent(in) :: dwdx_d, dwdy_d, dwdz_d, mu_d
636
637#ifdef HAVE_HIP
638 call hip_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, dudx_d, &
639 dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, dwdx_d, dwdy_d, dwdz_d, &
640 mu_d, n)
641#elif HAVE_CUDA
642 call cuda_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, dudx_d, &
643 dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, dwdx_d, dwdy_d, dwdz_d, &
644 mu_d, n)
645#elif HAVE_OPENCL
646 call opencl_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, dudx_d, &
647 dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, dwdx_d, dwdy_d, dwdz_d, &
648 mu_d, n)
649#elif HAVE_METAL
650 call metal_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, dudx_d, &
651 dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, dwdx_d, dwdy_d, dwdz_d, &
652 mu_d, n)
653#else
654 call neko_error('No device backend configured')
655#endif
656
658
660 subroutine compressible_ops_device_ns_flux_finalize(visc_m_x_d, visc_m_y_d, &
661 visc_m_z_d, visc_E_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
662 opgrad_z_d, u_d, v_d, w_d, B_d, dissipation_d, n)
663 integer, intent(in) :: n
664 type(c_ptr), intent(inout) :: visc_m_x_d, visc_m_y_d, visc_m_z_d
665 type(c_ptr), intent(inout) :: visc_e_d, f_x_d, f_y_d, f_z_d
666 type(c_ptr), intent(in) :: opgrad_x_d, opgrad_y_d, opgrad_z_d
667 type(c_ptr), intent(in) :: u_d, v_d, w_d, b_d, dissipation_d
668
669#ifdef HAVE_HIP
670 call hip_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, &
671 visc_e_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
672 opgrad_z_d, u_d, v_d, w_d, b_d, dissipation_d, n)
673#elif HAVE_CUDA
674 call cuda_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, &
675 visc_e_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
676 opgrad_z_d, u_d, v_d, w_d, b_d, dissipation_d, n)
677#elif HAVE_OPENCL
678 call opencl_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, &
679 visc_e_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
680 opgrad_z_d, u_d, v_d, w_d, b_d, dissipation_d, n)
681#elif HAVE_METAL
682 call metal_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, &
683 visc_e_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, &
684 opgrad_z_d, u_d, v_d, w_d, b_d, dissipation_d, n)
685#else
686 call neko_error('No device backend configured')
687#endif
688
690
692 subroutine compressible_ops_device_ns_flux_temperature(div_flux_d, h1_d, &
693 p_d, rho_d, kappa_d, gamma, n)
694 integer, intent(in) :: n
695 type(c_ptr), intent(inout) :: div_flux_d, h1_d
696 type(c_ptr), intent(in) :: p_d, rho_d, kappa_d
697 real(kind=rp), intent(in) :: gamma
698
699#ifdef HAVE_HIP
700 call hip_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, kappa_d, &
701 gamma, n)
702#elif HAVE_CUDA
703 call cuda_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, kappa_d, &
704 gamma, n)
705#elif HAVE_OPENCL
706 call opencl_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, kappa_d, &
707 gamma, n)
708#elif HAVE_METAL
709 call metal_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, kappa_d, &
710 gamma, n)
711#else
712 call neko_error('No device backend configured')
713#endif
714
716
void opencl_compute_entropy(void *S_d, void *p_d, void *rho_d, real gamma, int n)
void cuda_compute_entropy(void *S_d, void *p_d, void *rho_d, real *gamma, int *n)
void opencl_compute_max_wave_speed(void *max_wave_speed, void *u, void *v, void *w, real gamma, void *p, void *rho, int n)
void cuda_compute_max_wave_speed(void *max_wave_speed_d, void *u_d, void *v_d, void *w_d, real *gamma, void *p_d, void *rho_d, int *n)
void opencl_update_uvw(void *u, void *v, void *w, void *m_x, void *m_y, void *m_z, void *rho, int n)
void opencl_ns_flux_prepare(void *div_flux, void *dissipation, void *h1, void *dudx, void *dudy, void *dudz, void *dvdx, void *dvdy, void *dvdz, void *dwdx, void *dwdy, void *dwdz, void *mu, int n)
void opencl_update_temperature(void *T, void *p, void *rho, real gamma, int n)
void opencl_update_e(void *E, void *p, void *ruvw, real gamma, int n)
void opencl_ns_flux_temperature(void *div_flux, void *h1, void *p, void *rho, void *kappa, real gamma, int n)
void opencl_ns_flux_finalize(void *visc_m_x, void *visc_m_y, void *visc_m_z, void *visc_E, void *f_x, void *f_y, void *f_z, void *opgrad_x, void *opgrad_y, void *opgrad_z, void *u, void *v, void *w, void *B, void *dissipation, int n)
void opencl_update_mxyz_p_ruvw(void *m_x, void *m_y, void *m_z, void *p, void *ruvw, void *u, void *v, void *w, void *E, void *rho, real gamma, int n)
void cuda_ns_flux_prepare(void *div_flux, void *dissipation, void *h1, void *dudx, void *dudy, void *dudz, void *dvdx, void *dvdy, void *dvdz, void *dwdx, void *dwdy, void *dwdz, void *mu, int *n)
void cuda_ns_flux_finalize(void *visc_m_x, void *visc_m_y, void *visc_m_z, void *visc_E, void *f_x, void *f_y, void *f_z, void *opgrad_x, void *opgrad_y, void *opgrad_z, void *u, void *v, void *w, void *B, void *dissipation, int *n)
void cuda_update_uvw(void *u, void *v, void *w, void *m_x, void *m_y, void *m_z, void *rho, int *n)
void cuda_update_temperature(void *T, void *p, void *rho, real *gamma, int *n)
void cuda_ns_flux_temperature(void *div_flux, void *h1, void *p, void *rho, void *kappa, real *gamma, int *n)
void cuda_update_mxyz_p_ruvw(void *m_x, void *m_y, void *m_z, void *p, void *ruvw, void *u, void *v, void *w, void *E, void *rho, real *gamma, int *n)
void cuda_update_e(void *E, void *p, void *ruvw, real *gamma, int *n)
Device implementation of compressible flow operations.
subroutine, public compressible_ops_device_compute_entropy(s, p, rho, gamma, n)
Compute entropy field S = 1/(gamma-1) * rho * (log(p) - gamma * log(rho)) on device.
subroutine, public compressible_ops_device_update_uvw(u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d, n)
Update u,v,w fields.
subroutine, public compressible_ops_device_ns_flux_prepare(div_flux_d, dissipation_d, h1_d, dudx_d, dudy_d, dudz_d, dvdx_d, dvdy_d, dvdz_d, dwdx_d, dwdy_d, dwdz_d, mu_d, n)
Prepare physical Navier-Stokes flux work arrays.
subroutine, public compressible_ops_device_ns_flux_finalize(visc_m_x_d, visc_m_y_d, visc_m_z_d, visc_e_d, f_x_d, f_y_d, f_z_d, opgrad_x_d, opgrad_y_d, opgrad_z_d, u_d, v_d, w_d, b_d, dissipation_d, n)
Finish physical Navier-Stokes flux assembly.
subroutine, public compressible_ops_device_update_temperature(t_d, p_d, rho_d, gamma, n)
Update temperature field.
subroutine, public compressible_ops_device_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, p_d, ruvw_d, u_d, v_d, w_d, e_d, rho_d, gamma, n)
Update m_x, m_y, m_z, p, ruvw, fields.
subroutine, public compressible_ops_device_compute_max_wave_speed(max_wave_speed, u, v, w, gamma, p, rho, n)
Compute maximum wave speed for compressible flows on device.
subroutine, public compressible_ops_device_update_e(e_d, p_d, ruvw_d, gamma, n)
Update E field.
subroutine, public compressible_ops_device_ns_flux_temperature(div_flux_d, h1_d, p_d, rho_d, kappa_d, gamma, n)
Prepare temperature and conductivity coefficient for energy flux.
Defines a field.
Definition field.f90:34
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