Neko 1.99.3
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
device_coef.F90
Go to the documentation of this file.
1! Copyright (c) 2022-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!
34 use num_types, only : rp, c_rp
35 use utils, only : neko_error
36 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
37 implicit none
38 private
39
44
45#ifdef HAVE_HIP
46 interface
47 subroutine hip_coef_generate_geo(G11, G12, G13, G22, G23, G33, &
48 drdx, drdy, drdz, dsdx, dsdy, dsdz, dtdx, dtdy, dtdz, &
49 jacinv, w3, nel, lx, gdim) &
50 bind(c, name='hip_coef_generate_geo')
51 use, intrinsic :: iso_c_binding
52 implicit none
53 type(c_ptr), value :: G11, G12, G13, G22, G23, G33
54 type(c_ptr), value :: drdx, drdy, drdz
55 type(c_ptr), value :: dsdx, dsdy, dsdz
56 type(c_ptr), value :: dtdx, dtdy, dtdz
57 type(c_ptr), value :: jacinv, w3
58 integer(c_int) :: nel, gdim, lx
59 end subroutine hip_coef_generate_geo
60 end interface
61
62 interface
63 subroutine hip_coef_generate_dxyzdrst(drdx, drdy, drdz, dsdx, dsdy, &
64 dsdz, dtdx, dtdy, dtdz, dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, &
65 dydt, dzdt, dx, dy, dz, x, y, z, jacinv, jac, lx, nel) &
66 bind(c, name='hip_coef_generate_dxyzdrst')
67 use, intrinsic :: iso_c_binding
68 implicit none
69 type(c_ptr), value :: drdx, drdy, drdz
70 type(c_ptr), value :: dsdx, dsdy, dsdz
71 type(c_ptr), value :: dtdx, dtdy, dtdz
72 type(c_ptr), value :: dxdr, dydr, dzdr
73 type(c_ptr), value :: dxds, dyds, dzds
74 type(c_ptr), value :: dxdt, dydt, dzdt
75 type(c_ptr), value :: dx, dy, dz, x, y, z
76 type(c_ptr), value :: jacinv, jac
77 integer(c_int) :: lx, nel
78 end subroutine hip_coef_generate_dxyzdrst
79 end interface
80
81 interface
82 subroutine hip_coef_generate_mass(B, Binv, jac, w3, lxyz, nel) &
83 bind(c, name='hip_coef_generate_mass')
84 use, intrinsic :: iso_c_binding
85 implicit none
86 type(c_ptr), value :: B, Binv, jac, w3
87 integer(c_int) :: lxyz, nel
88 end subroutine hip_coef_generate_mass
89 end interface
90
91 interface
92 subroutine hip_coef_generate_area_and_normal(area, nx, ny, nz, &
93 dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, dydt, dzdt, &
94 wx, wy, wz, lx, nel, eps) &
95 bind(c, name='hip_coef_generate_area_and_normal')
96 use, intrinsic :: iso_c_binding
97 import c_rp
98 implicit none
99 type(c_ptr), value :: area, nx, ny, nz
100 type(c_ptr), value :: dxdr, dydr, dzdr
101 type(c_ptr), value :: dxds, dyds, dzds
102 type(c_ptr), value :: dxdt, dydt, dzdt
103 type(c_ptr), value :: wx, wy, wz
104 integer(c_int) :: lx, nel
105 real(kind=c_rp), value :: eps
107 end interface
108
109#elif HAVE_CUDA
110 interface
111 subroutine cuda_coef_generate_geo(G11, G12, G13, G22, G23, G33, &
112 drdx, drdy, drdz, dsdx, dsdy, dsdz, dtdx, dtdy, dtdz, &
113 jacinv, w3, nel, lx, gdim) &
114 bind(c, name='cuda_coef_generate_geo')
115 use, intrinsic :: iso_c_binding
116 implicit none
117 type(c_ptr), value :: g11, g12, g13, g22, g23, g33
118 type(c_ptr), value :: drdx, drdy, drdz
119 type(c_ptr), value :: dsdx, dsdy, dsdz
120 type(c_ptr), value :: dtdx, dtdy, dtdz
121 type(c_ptr), value :: jacinv, w3
122 integer(c_int) :: nel, gdim, lx
123 end subroutine cuda_coef_generate_geo
124 end interface
125
126 interface
127 subroutine cuda_coef_generate_dxyzdrst(drdx, drdy, drdz, dsdx, dsdy, &
128 dsdz, dtdx, dtdy, dtdz, dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, &
129 dydt, dzdt, dx, dy, dz, x, y, z, jacinv, jac, lx, nel) &
130 bind(c, name='cuda_coef_generate_dxyzdrst')
131 use, intrinsic :: iso_c_binding
132 implicit none
133 type(c_ptr), value :: drdx, drdy, drdz
134 type(c_ptr), value :: dsdx, dsdy, dsdz
135 type(c_ptr), value :: dtdx, dtdy, dtdz
136 type(c_ptr), value :: dxdr, dydr, dzdr
137 type(c_ptr), value :: dxds, dyds, dzds
138 type(c_ptr), value :: dxdt, dydt, dzdt
139 type(c_ptr), value :: dx, dy, dz, x, y, z
140 type(c_ptr), value :: jacinv, jac
141 integer(c_int) :: lx, nel
142 end subroutine cuda_coef_generate_dxyzdrst
143 end interface
144
145 interface
146 subroutine cuda_coef_generate_mass(B, Binv, jac, w3, lxyz, nel) &
147 bind(c, name='cuda_coef_generate_mass')
148 use, intrinsic :: iso_c_binding
149 implicit none
150 type(c_ptr), value :: B, Binv, jac, w3
151 integer(c_int) :: lxyz, nel
152 end subroutine cuda_coef_generate_mass
153 end interface
154
155 interface
156 subroutine cuda_coef_generate_area_and_normal(area, nx, ny, nz, &
157 dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, dydt, dzdt, &
158 wx, wy, wz, lx, nel, eps) &
159 bind(c, name='cuda_coef_generate_area_and_normal')
160 use, intrinsic :: iso_c_binding
161 import c_rp
162 implicit none
163 type(c_ptr), value :: area, nx, ny, nz
164 type(c_ptr), value :: dxdr, dydr, dzdr
165 type(c_ptr), value :: dxds, dyds, dzds
166 type(c_ptr), value :: dxdt, dydt, dzdt
167 type(c_ptr), value :: wx, wy, wz
168 integer(c_int) :: lx, nel
169 real(kind=c_rp), value :: eps
171 end interface
172
173#elif HAVE_OPENCL
174 interface
175 subroutine opencl_coef_generate_geo(G11, G12, G13, G22, G23, G33, &
176 drdx, drdy, drdz, dsdx, dsdy, dsdz, dtdx, dtdy, dtdz, &
177 jacinv, w3, nel, lx, gdim) &
178 bind(c, name='opencl_coef_generate_geo')
179 use, intrinsic :: iso_c_binding
180 implicit none
181 type(c_ptr), value :: g11, g12, g13, g22, g23, g33
182 type(c_ptr), value :: drdx, drdy, drdz
183 type(c_ptr), value :: dsdx, dsdy, dsdz
184 type(c_ptr), value :: dtdx, dtdy, dtdz
185 type(c_ptr), value :: jacinv, w3
186 integer(c_int) :: nel, gdim, lx
187 end subroutine opencl_coef_generate_geo
188 end interface
189
190 interface
191 subroutine opencl_coef_generate_dxyzdrst(drdx, drdy, drdz, dsdx, dsdy, &
192 dsdz, dtdx, dtdy, dtdz, dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, &
193 dydt, dzdt, dx, dy, dz, x, y, z, jacinv, jac, lx, nel) &
194 bind(c, name='opencl_coef_generate_dxyzdrst')
195 use, intrinsic :: iso_c_binding
196 implicit none
197 type(c_ptr), value :: drdx, drdy, drdz
198 type(c_ptr), value :: dsdx, dsdy, dsdz
199 type(c_ptr), value :: dtdx, dtdy, dtdz
200 type(c_ptr), value :: dxdr, dydr, dzdr
201 type(c_ptr), value :: dxds, dyds, dzds
202 type(c_ptr), value :: dxdt, dydt, dzdt
203 type(c_ptr), value :: dx, dy, dz, x, y, z
204 type(c_ptr), value :: jacinv, jac
205 integer(c_int) :: lx, nel
206 end subroutine opencl_coef_generate_dxyzdrst
207 end interface
208
209 interface
210 subroutine opencl_coef_generate_mass(B, Binv, jac, w3, lxyz, nel) &
211 bind(c, name='opencl_coef_generate_mass')
212 use, intrinsic :: iso_c_binding
213 implicit none
214 type(c_ptr), value :: B, Binv, jac, w3
215 integer(c_int) :: lxyz, nel
216 end subroutine opencl_coef_generate_mass
217 end interface
218
219 interface
220 subroutine opencl_coef_generate_area_and_normal(area, nx, ny, nz, &
221 dxdr, dydr, dzdr, dxds, dyds, dzds, dxdt, dydt, dzdt, &
222 wx, wy, wz, lx, nel, eps) &
223 bind(c, name='opencl_coef_generate_area_and_normal')
224 use, intrinsic :: iso_c_binding
225 import c_rp
226 implicit none
227 type(c_ptr), value :: area, nx, ny, nz
228 type(c_ptr), value :: dxdr, dydr, dzdr
229 type(c_ptr), value :: dxds, dyds, dzds
230 type(c_ptr), value :: dxdt, dydt, dzdt
231 type(c_ptr), value :: wx, wy, wz
232 integer(c_int) :: lx, nel
233 real(kind=c_rp), value :: eps
235 end interface
236
237#endif
238
239contains
240
241 subroutine device_coef_generate_geo(G11_d, G12_d, G13_d, G22_d, &
242 G23_d, G33_d, drdx_d, drdy_d, drdz_d, dsdx_d, dsdy_d, &
243 dsdz_d, dtdx_d, dtdy_d, dtdz_d, jacinv_d, w3_d, nel, lx, gdim)
244 type(c_ptr) :: g11_d, g12_d, g13_d, g22_d, g23_d, g33_d
245 type(c_ptr) :: drdx_d, drdy_d, drdz_d
246 type(c_ptr) :: dsdx_d, dsdy_d, dsdz_d
247 type(c_ptr) :: dtdx_d, dtdy_d, dtdz_d
248 type(c_ptr) :: jacinv_d, w3_d
249 integer :: nel, gdim, lx
250
251#ifdef HAVE_HIP
252 call hip_coef_generate_geo(g11_d, g12_d, g13_d, g22_d, g23_d, &
253 g33_d, drdx_d, drdy_d, drdz_d, dsdx_d, dsdy_d, dsdz_d, &
254 dtdx_d, dtdy_d, dtdz_d, jacinv_d, w3_d, nel, lx, gdim)
255#elif HAVE_CUDA
256 call cuda_coef_generate_geo(g11_d, g12_d, g13_d, g22_d, g23_d, &
257 g33_d, drdx_d, drdy_d, drdz_d, dsdx_d, dsdy_d, dsdz_d, &
258 dtdx_d, dtdy_d, dtdz_d, jacinv_d, w3_d, nel, lx, gdim)
259#elif HAVE_OPENCL
260 call opencl_coef_generate_geo(g11_d, g12_d, g13_d, g22_d, g23_d, &
261 g33_d, drdx_d, drdy_d, drdz_d, dsdx_d, dsdy_d, dsdz_d, &
262 dtdx_d, dtdy_d, dtdz_d, jacinv_d, w3_d, nel, lx, gdim)
263#else
264 call neko_error('No device backend configured')
265#endif
266
267 end subroutine device_coef_generate_geo
268
269 subroutine device_coef_generate_dxydrst(drdx_d, drdy_d, drdz_d, dsdx_d, dsdy_d,&
270 dsdz_d, dtdx_d, dtdy_d, dtdz_d, dxdr_d, dydr_d, dzdr_d, dxds_d, &
271 dyds_d, dzds_d, dxdt_d, dydt_d, dzdt_d, dx_d, dy_d, dz_d, &
272 x_d, y_d, z_d, jacinv_d, jac_d, lx, nel)
273 type(c_ptr) :: drdx_d, drdy_d, drdz_d
274 type(c_ptr) :: dsdx_d, dsdy_d, dsdz_d
275 type(c_ptr) :: dtdx_d, dtdy_d, dtdz_d
276 type(c_ptr) :: dxdr_d, dydr_d, dzdr_d
277 type(c_ptr) :: dxds_d, dyds_d, dzds_d
278 type(c_ptr) :: dxdt_d, dydt_d, dzdt_d
279 type(c_ptr) :: dx_d, dy_d, dz_d, x_d, y_d, z_d
280 type(c_ptr) :: jacinv_d, jac_d
281 integer :: lx, nel
282
283#ifdef HAVE_HIP
284 call hip_coef_generate_dxyzdrst(drdx_d, drdy_d, drdz_d, dsdx_d, &
285 dsdy_d, dsdz_d, dtdx_d, dtdy_d, dtdz_d, dxdr_d, dydr_d, &
286 dzdr_d, dxds_d, dyds_d, dzds_d, dxdt_d, dydt_d, dzdt_d, &
287 dx_d, dy_d, dz_d, x_d, y_d, z_d, jacinv_d, jac_d, lx, nel)
288#elif HAVE_CUDA
289 call cuda_coef_generate_dxyzdrst(drdx_d, drdy_d, drdz_d, dsdx_d, &
290 dsdy_d, dsdz_d, dtdx_d, dtdy_d, dtdz_d, dxdr_d, dydr_d, &
291 dzdr_d, dxds_d, dyds_d, dzds_d, dxdt_d, dydt_d, dzdt_d, &
292 dx_d, dy_d, dz_d, x_d, y_d, z_d, jacinv_d, jac_d, lx, nel)
293#elif HAVE_OPENCL
294 call opencl_coef_generate_dxyzdrst(drdx_d, drdy_d, drdz_d, dsdx_d, &
295 dsdy_d, dsdz_d, dtdx_d, dtdy_d, dtdz_d, dxdr_d, dydr_d, &
296 dzdr_d, dxds_d, dyds_d, dzds_d, dxdt_d, dydt_d, dzdt_d, &
297 dx_d, dy_d, dz_d, x_d, y_d, z_d, jacinv_d, jac_d, lx, nel)
298#else
299 call neko_error('No device backend configured')
300#endif
301 end subroutine device_coef_generate_dxydrst
302
303 subroutine device_coef_generate_mass(B, Binv, jac, w3, lxyz, nel)
304 type(c_ptr) :: b, binv, jac, w3
305 integer :: lxyz, nel
306
307#ifdef HAVE_HIP
308 call hip_coef_generate_mass(b, binv, jac, w3, lxyz, nel)
309#elif HAVE_CUDA
310 call cuda_coef_generate_mass(b, binv, jac, w3, lxyz, nel)
311#elif HAVE_OPENCL
312 call opencl_coef_generate_mass(b, binv, jac, w3, lxyz, nel)
313#else
314 call neko_error('No device backend configured')
315#endif
316 end subroutine device_coef_generate_mass
317
318 subroutine device_coef_generate_area_and_normal(area_d, nx_d, ny_d, nz_d, &
319 dxdr_d, dydr_d, dzdr_d, &
320 dxds_d, dyds_d, dzds_d, &
321 dxdt_d, dydt_d, dzdt_d, &
322 wx_d, wy_d, wz_d, &
323 lx, nel, eps)
324 type(c_ptr) :: area_d, nx_d, ny_d, nz_d
325 type(c_ptr) :: dxdr_d, dydr_d, dzdr_d
326 type(c_ptr) :: dxds_d, dyds_d, dzds_d
327 type(c_ptr) :: dxdt_d, dydt_d, dzdt_d
328 type(c_ptr) :: wx_d, wy_d, wz_d
329 integer :: lx, nel
330 real(kind=c_rp), value :: eps
331
332#ifdef HAVE_HIP
333 call hip_coef_generate_area_and_normal(area_d, nx_d, ny_d, nz_d, &
334 dxdr_d, dydr_d, dzdr_d, &
335 dxds_d, dyds_d, dzds_d, &
336 dxdt_d, dydt_d, dzdt_d, &
337 wx_d, wy_d, wz_d, &
338 lx, nel, eps)
339#elif HAVE_CUDA
340 call cuda_coef_generate_area_and_normal(area_d, nx_d, ny_d, nz_d, &
341 dxdr_d, dydr_d, dzdr_d, &
342 dxds_d, dyds_d, dzds_d, &
343 dxdt_d, dydt_d, dzdt_d, &
344 wx_d, wy_d, wz_d, &
345 lx, nel, eps)
346#elif HAVE_OPENCL
347 call opencl_coef_generate_area_and_normal(area_d, nx_d, ny_d, nz_d, &
348 dxdr_d, dydr_d, dzdr_d, &
349 dxds_d, dyds_d, dzds_d, &
350 dxdt_d, dydt_d, dzdt_d, &
351 wx_d, wy_d, wz_d, &
352 lx, nel, eps)
353#else
354 call neko_error('No device backend configured')
355#endif
357
358end module device_coef
void opencl_coef_generate_mass(void *B, void *Binv, void *jac, void *w3, int *lxyz, int *nel)
Definition coef.c:231
void opencl_coef_generate_geo(void *G11, void *G12, void *G13, void *G22, void *G23, void *G33, void *drdx, void *drdy, void *drdz, void *dsdx, void *dsdy, void *dsdz, void *dtdx, void *dtdy, void *dtdz, void *jacinv, void *w3, int *nel, int *lx, int *gdim)
Definition coef.c:54
void opencl_coef_generate_dxyzdrst(void *drdx, void *drdy, void *drdz, void *dsdx, void *dsdy, void *dsdz, void *dtdx, void *dtdy, void *dtdz, void *dxdr, void *dydr, void *dzdr, void *dxds, void *dyds, void *dzds, void *dxdt, void *dydt, void *dzdt, void *dx, void *dy, void *dz, void *x, void *y, void *z, void *jacinv, void *jac, int *lx, int *nel)
Definition coef.c:126
void opencl_coef_generate_area_and_normal(void *area, void *nx, void *ny, void *nz, void *dxdr, void *dydr, void *dzdr, void *dxds, void *dyds, void *dzds, void *dxdt, void *dydt, void *dzdt, void *wx, void *wy, void *wz, int *lx, int *nel, real eps)
Definition coef.c:261
void cuda_coef_generate_area_and_normal(void *area, void *nx, void *ny, void *nz, void *dxdr, void *dydr, void *dzdr, void *dxds, void *dyds, void *dzds, void *dxdt, void *dydt, void *dzdt, void *wx, void *wy, void *wz, int *lx, int *nel, real eps)
Definition coef.cu:185
void cuda_coef_generate_mass(void *B, void *Binv, void *jac, void *w3, int *lxyz, int *nel)
Definition coef.cu:165
void cuda_coef_generate_dxyzdrst(void *drdx, void *drdy, void *drdz, void *dsdx, void *dsdy, void *dsdz, void *dtdx, void *dtdy, void *dtdz, void *dxdr, void *dydr, void *dzdr, void *dxds, void *dyds, void *dzds, void *dxdt, void *dydt, void *dzdt, void *dx, void *dy, void *dz, void *x, void *y, void *z, void *jacinv, void *jac, int *lx, int *nel)
Definition coef.cu:97
void cuda_coef_generate_geo(void *G11, void *G12, void *G13, void *G22, void *G23, void *G33, void *drdx, void *drdy, void *drdz, void *dsdx, void *dsdy, void *dsdz, void *dtdx, void *dtdy, void *dtdz, void *jacinv, void *w3, int *nel, int *lx, int *gdim)
Definition coef.cu:45
subroutine, public device_coef_generate_area_and_normal(area_d, nx_d, ny_d, nz_d, dxdr_d, dydr_d, dzdr_d, dxds_d, dyds_d, dzds_d, dxdt_d, dydt_d, dzdt_d, wx_d, wy_d, wz_d, lx, nel, eps)
subroutine, public device_coef_generate_dxydrst(drdx_d, drdy_d, drdz_d, dsdx_d, dsdy_d, dsdz_d, dtdx_d, dtdy_d, dtdz_d, dxdr_d, dydr_d, dzdr_d, dxds_d, dyds_d, dzds_d, dxdt_d, dydt_d, dzdt_d, dx_d, dy_d, dz_d, x_d, y_d, z_d, jacinv_d, jac_d, lx, nel)
subroutine, public device_coef_generate_mass(b, binv, jac, w3, lxyz, nel)
subroutine, public device_coef_generate_geo(g11_d, g12_d, g13_d, g22_d, g23_d, g33_d, drdx_d, drdy_d, drdz_d, dsdx_d, dsdy_d, dsdz_d, dtdx_d, dtdy_d, dtdz_d, jacinv_d, w3_d, nel, lx, gdim)
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