Neko 1.99.5
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
ax_helm_full_device.F90
Go to the documentation of this file.
1! Copyright (c) 2024, 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
36 use coefs, only : coef_t
37 use space, only : space_t
38 use mesh, only : mesh_t
39 use device_math, only : device_addcol4
40 use device, only : device_get_ptr
41 use num_types, only : rp
42 use utils, only : neko_error
43 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
44 implicit none
45 private
46
47 type, public, extends(ax_helm_full_t) :: ax_helm_full_device_t
48 contains
49 procedure, pass(this) :: compute_vector => &
52
53#ifdef HAVE_HIP
54 interface
55 subroutine hip_ax_helm_stress_vector(au_d, av_d, aw_d, u_d, v_d, w_d, &
56 dx_d, dy_d, dz_d, dxt_d, dyt_d, dzt_d,&
57 h1_d, drdx_d, drdy_d, drdz_d, &
58 dsdx_d, dsdy_d, dsdz_d, &
59 dtdx_d, dtdy_d, dtdz_d, jacinv_d, weight3_d, nelv, lx) &
60 bind(c, name='hip_ax_helm_stress_vector')
61 use, intrinsic :: iso_c_binding
62 type(c_ptr), value :: au_d, av_d, aw_d
63 type(c_ptr), value :: u_d, v_d, w_d
64 type(c_ptr), value :: dx_d, dy_d, dz_d
65 type(c_ptr), value :: dxt_d, dyt_d, dzt_d
66 type(c_ptr), value :: h1_d
67 type(c_ptr), value :: drdx_d, drdy_d, drdz_d
68 type(c_ptr), value :: dsdx_d, dsdy_d, dsdz_d
69 type(c_ptr), value :: dtdx_d, dtdy_d, dtdz_d
70 type(c_ptr), value :: jacinv_d, weight3_d
71 integer(c_int) :: nelv, lx
72 end subroutine hip_ax_helm_stress_vector
73 end interface
74
75 interface
76 subroutine hip_ax_helm_stress_vector_part2(au_d, av_d, aw_d, u_d, &
77 v_d, w_d, h2_d, B_d, n) &
78 bind(c, name='hip_ax_helm_stress_vector_part2')
79 use, intrinsic :: iso_c_binding
80 type(c_ptr), value :: au_d, av_d, aw_d
81 type(c_ptr), value :: u_d, v_d, w_d
82 type(c_ptr), value :: h2_d, B_d
83 integer(c_int) :: n
85 end interface
86
87#elif HAVE_CUDA
88 interface
89 subroutine cuda_ax_helm_stress_vector(au_d, av_d, aw_d, u_d, v_d, w_d, &
90 dx_d, dy_d, dz_d, dxt_d, dyt_d, dzt_d,&
91 h1_d, drdx_d, drdy_d, drdz_d, &
92 dsdx_d, dsdy_d, dsdz_d, &
93 dtdx_d, dtdy_d, dtdz_d, jacinv_d, weight3_d, nelv, lx) &
94 bind(c, name='cuda_ax_helm_stress_vector')
95 use, intrinsic :: iso_c_binding
96 type(c_ptr), value :: au_d, av_d, aw_d
97 type(c_ptr), value :: u_d, v_d, w_d
98 type(c_ptr), value :: dx_d, dy_d, dz_d
99 type(c_ptr), value :: dxt_d, dyt_d, dzt_d
100 type(c_ptr), value :: h1_d
101 type(c_ptr), value :: drdx_d, drdy_d, drdz_d
102 type(c_ptr), value :: dsdx_d, dsdy_d, dsdz_d
103 type(c_ptr), value :: dtdx_d, dtdy_d, dtdz_d
104 type(c_ptr), value :: jacinv_d, weight3_d
105 integer(c_int) :: nelv, lx
106 end subroutine cuda_ax_helm_stress_vector
107 end interface
108
109 interface
110 subroutine cuda_ax_helm_stress_vector_part2(au_d, av_d, aw_d, &
111 u_d, v_d, w_d, h2_d, B_d, n) &
112 bind(c, name='cuda_ax_helm_stress_vector_part2')
113 use, intrinsic :: iso_c_binding
114 type(c_ptr), value :: au_d, av_d, aw_d
115 type(c_ptr), value :: u_d, v_d, w_d
116 type(c_ptr), value :: h2_d, B_d
117 integer(c_int) :: n
119 end interface
120
121#elif HAVE_OPENCL
122 interface
123 subroutine opencl_ax_helm_stress_vector(au_d, av_d, aw_d, u_d, v_d, w_d, &
124 dx_d, dy_d, dz_d, dxt_d, dyt_d, dzt_d,&
125 h1_d, drdx_d, drdy_d, drdz_d, &
126 dsdx_d, dsdy_d, dsdz_d, &
127 dtdx_d, dtdy_d, dtdz_d, jacinv_d, weight3_d, nelv, lx) &
128 bind(c, name='opencl_ax_helm_stress_vector')
129 use, intrinsic :: iso_c_binding
130 type(c_ptr), value :: au_d, av_d, aw_d
131 type(c_ptr), value :: u_d, v_d, w_d
132 type(c_ptr), value :: dx_d, dy_d, dz_d
133 type(c_ptr), value :: dxt_d, dyt_d, dzt_d
134 type(c_ptr), value :: h1_d
135 type(c_ptr), value :: drdx_d, drdy_d, drdz_d
136 type(c_ptr), value :: dsdx_d, dsdy_d, dsdz_d
137 type(c_ptr), value :: dtdx_d, dtdy_d, dtdz_d
138 type(c_ptr), value :: jacinv_d, weight3_d
139 integer(c_int) :: nelv, lx
140 end subroutine opencl_ax_helm_stress_vector
141 end interface
142
143 interface
144 subroutine opencl_ax_helm_stress_vector_part2(au_d, av_d, aw_d, &
145 u_d, v_d, w_d, h2_d, B_d, n) &
146 bind(c, name='opencl_ax_helm_stress_vector_part2')
147 use, intrinsic :: iso_c_binding
148 type(c_ptr), value :: au_d, av_d, aw_d
149 type(c_ptr), value :: u_d, v_d, w_d
150 type(c_ptr), value :: h2_d, B_d
151 integer(c_int) :: n
153 end interface
154#endif
155
156contains
157
158 subroutine ax_helm_full_device_compute_vector(this, au, av, aw, &
159 u, v, w, coef, msh, Xh)
160 class(ax_helm_full_device_t), intent(in) :: this
161 type(space_t), intent(in) :: Xh
162 type(mesh_t), intent(in) :: msh
163 type(coef_t), intent(in) :: coef
164 real(kind=rp), intent(inout) :: au(xh%lx, xh%ly, xh%lz, msh%nelv)
165 real(kind=rp), intent(inout) :: av(xh%lx, xh%ly, xh%lz, msh%nelv)
166 real(kind=rp), intent(inout) :: aw(xh%lx, xh%ly, xh%lz, msh%nelv)
167 real(kind=rp), intent(in) :: u(xh%lx, xh%ly, xh%lz, msh%nelv)
168 real(kind=rp), intent(in) :: v(xh%lx, xh%ly, xh%lz, msh%nelv)
169 real(kind=rp), intent(in) :: w(xh%lx, xh%ly, xh%lz, msh%nelv)
170 type(c_ptr) :: u_d, v_d, w_d
171 type(c_ptr) :: au_d, av_d, aw_d
172
173 u_d = device_get_ptr(u)
174 v_d = device_get_ptr(v)
175 w_d = device_get_ptr(w)
176
177 au_d = device_get_ptr(au)
178 av_d = device_get_ptr(av)
179 aw_d = device_get_ptr(aw)
180
181#ifdef HAVE_HIP
182 call hip_ax_helm_stress_vector(au_d, av_d, aw_d, u_d, v_d, w_d, &
183 xh%dx_d, xh%dy_d, xh%dz_d, xh%dxt_d, xh%dyt_d, xh%dzt_d, coef%h1_d, &
184 coef%drdx_d, coef%drdy_d, coef%drdz_d, &
185 coef%dsdx_d, coef%dsdy_d, coef%dsdz_d, &
186 coef%dtdx_d, coef%dtdy_d, coef%dtdz_d, &
187 coef%jacinv_d, xh%w3_d, msh%nelv, xh%lx)
188#elif HAVE_CUDA
189 call cuda_ax_helm_stress_vector(au_d, av_d, aw_d, u_d, v_d, w_d, &
190 xh%dx_d, xh%dy_d, xh%dz_d, xh%dxt_d, xh%dyt_d, xh%dzt_d, coef%h1_d, &
191 coef%drdx_d, coef%drdy_d, coef%drdz_d, &
192 coef%dsdx_d, coef%dsdy_d, coef%dsdz_d, &
193 coef%dtdx_d, coef%dtdy_d, coef%dtdz_d, &
194 coef%jacinv_d, xh%w3_d, msh%nelv, xh%lx)
195#elif HAVE_OPENCL
196 call opencl_ax_helm_stress_vector(au_d, av_d, aw_d, u_d, v_d, w_d, &
197 xh%dx_d, xh%dy_d, xh%dz_d, xh%dxt_d, xh%dyt_d, xh%dzt_d, coef%h1_d, &
198 coef%drdx_d, coef%drdy_d, coef%drdz_d, &
199 coef%dsdx_d, coef%dsdy_d, coef%dsdz_d, &
200 coef%dtdx_d, coef%dtdy_d, coef%dtdz_d, &
201 coef%jacinv_d, xh%w3_d, msh%nelv, xh%lx)
202#elif HAVE_METAL
203 call neko_error('Stress formulation Ax is not implemented for Metal')
204#endif
205
206 if (coef%ifh2) then
207#ifdef HAVE_HIP
208 call hip_ax_helm_stress_vector_part2(au_d, av_d, aw_d, u_d, v_d, w_d, &
209 coef%h2_d, coef%B_d, coef%dof%size())
210#elif HAVE_CUDA
211 call cuda_ax_helm_stress_vector_part2(au_d, av_d, aw_d, u_d, v_d, w_d, &
212 coef%h2_d, coef%B_d, coef%dof%size())
213#elif HAVE_OPENCL
214 call opencl_ax_helm_stress_vector_part2(au_d, av_d, aw_d, u_d, v_d, &
215 w_d, coef%h2_d, coef%B_d, coef%dof%size())
216#elif HAVE_METAL
217 call neko_error('Stress formulation Ax is not implemented for Metal')
218#endif
219 end if
220
222
223end module ax_helm_full_device
void opencl_ax_helm_stress_vector(void *au, void *av, void *aw, void *u, void *v, void *w, void *dx, void *dy, void *dz, void *dxt, void *dyt, void *dzt, void *h1, void *drdx, void *drdy, void *drdz, void *dsdx, void *dsdy, void *dsdz, void *dtdx, void *dtdy, void *dtdz, void *jacinv, void *w3, int *nelv, int *lx)
void opencl_ax_helm_stress_vector_part2(void *au, void *av, void *aw, void *u, void *v, void *w, void *h2, void *B, int *n)
void cuda_ax_helm_stress_vector(void *au, void *av, void *aw, void *u, void *v, void *w, void *dx, void *dy, void *dz, void *dxt, void *dyt, void *dzt, void *h1, void *drdx, void *drdy, void *drdz, void *dsdx, void *dsdy, void *dsdz, void *dtdx, void *dtdy, void *dtdz, void *jacinv, void *w3, int *nelv, int *lx)
void cuda_ax_helm_stress_vector_part2(void *au, void *av, void *aw, void *u, void *v, void *w, void *h2, void *B, int *n)
Return the device pointer for an associated Fortran array.
Definition device.F90:108
subroutine ax_helm_full_device_compute_vector(this, au, av, aw, u, v, w, coef, msh, xh)
Coefficients.
Definition coef.f90:34
subroutine, public device_addcol4(a_d, b_d, c_d, d_d, n, strm)
Returns .
Device abstraction, common interface for various accelerators.
Definition device.F90:34
Defines a mesh.
Definition mesh.f90:34
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Defines a function space.
Definition space.f90:34
Utilities.
Definition utils.f90:35
Matrix-vector product for a Helmholtz problem.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:62
The function space for the SEM solution fields.
Definition space.f90:63