47 use,
intrinsic :: iso_c_binding, only : c_ptr, c_int
65 wa1_d, wa2_d, wa3_d, f_u_d, f_v_d, f_w_d, &
66 B_d, h1_d, mu, rho, n) &
67 bind(c, name =
'pnpn_prs_res_part1_hip')
68 use,
intrinsic :: iso_c_binding
71 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
72 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
73 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
74 type(c_ptr),
value :: B_d, h1_d
82 bind(c, name =
'pnpn_prs_res_part2_hip')
83 use,
intrinsic :: iso_c_binding
85 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
92 bind(c, name =
'pnpn_prs_res_part3_hip')
93 use,
intrinsic :: iso_c_binding
96 type(c_ptr),
value :: p_res_d, ta1_d, ta2_d, ta3_d
104 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
105 bind(c, name =
'pnpn_vel_res_update_hip')
106 use,
intrinsic :: iso_c_binding
108 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
109 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
110 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
117 wa1_d, wa2_d, wa3_d, f_u_d, f_v_d, f_w_d, &
118 B_d, h1_d, mu, rho, n) &
119 bind(c, name =
'pnpn_prs_res_part1_cuda')
120 use,
intrinsic :: iso_c_binding
123 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
124 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
125 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
126 type(c_ptr),
value :: B_d, h1_d
127 real(c_rp) :: mu, rho
134 bind(c, name =
'pnpn_prs_res_part2_cuda')
135 use,
intrinsic :: iso_c_binding
137 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
144 bind(c, name =
'pnpn_prs_res_part3_cuda')
145 use,
intrinsic :: iso_c_binding
148 type(c_ptr),
value :: p_res_d, ta1_d, ta2_d, ta3_d
156 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
157 bind(c, name =
'pnpn_vel_res_update_cuda')
158 use,
intrinsic :: iso_c_binding
160 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
161 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
162 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
169 wa1_d, wa2_d, wa3_d, f_u_d, f_v_d, f_w_d, &
170 B_d, h1_d, mu, rho, n) &
171 bind(c, name =
'pnpn_prs_res_part1_opencl')
172 use,
intrinsic :: iso_c_binding
175 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
176 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
177 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
178 type(c_ptr),
value :: B_d, h1_d
179 real(c_rp) :: mu, rho
186 bind(c, name =
'pnpn_prs_res_part2_opencl')
187 use,
intrinsic :: iso_c_binding
189 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
196 n) bind(c, name = 'pnpn_prs_res_part3_opencl')
197 use,
intrinsic :: iso_c_binding
200 type(c_ptr),
value :: p_res_d, ta1_d, ta2_d, ta3_d
208 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
209 bind(c, name =
'pnpn_vel_res_update_opencl')
210 use,
intrinsic :: iso_c_binding
212 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
213 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
214 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
220 subroutine pnpn_prs_res_part1_metal(ta1_d, ta2_d, ta3_d, &
221 wa1_d, wa2_d, wa3_d, f_u_d, f_v_d, f_w_d, &
222 B_d, h1_d, mu, rho, n) &
223 bind(c, name =
'pnpn_prs_res_part1_metal')
224 use,
intrinsic :: iso_c_binding
227 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
228 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
229 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
230 type(c_ptr),
value :: B_d, h1_d
231 real(c_rp) :: mu, rho
233 end subroutine pnpn_prs_res_part1_metal
237 subroutine pnpn_prs_res_part2_metal(p_res_d, wa1_d, wa2_d, wa3_d, n) &
238 bind(c, name =
'pnpn_prs_res_part2_metal')
239 use,
intrinsic :: iso_c_binding
241 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
243 end subroutine pnpn_prs_res_part2_metal
247 subroutine pnpn_prs_res_part3_metal(p_res_d, ta1_d, ta2_d, ta3_d, dtbd, &
248 n) bind(c, name = 'pnpn_prs_res_part3_metal')
249 use,
intrinsic :: iso_c_binding
252 type(c_ptr),
value :: p_res_d, ta1_d, ta2_d, ta3_d
255 end subroutine pnpn_prs_res_part3_metal
259 subroutine pnpn_vel_res_update_metal(u_res_d, v_res_d, w_res_d, &
260 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
261 bind(c, name =
'pnpn_vel_res_update_metal')
262 use,
intrinsic :: iso_c_binding
264 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
265 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
266 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
268 end subroutine pnpn_vel_res_update_metal
276 f_x, f_y, f_z, c_Xh, gs_Xh, bc_prs_surface, bc_sym_surface, Ax, bd, dt,&
278 type(
field_t),
intent(inout) :: p, u, v, w
279 type(
field_t),
intent(in) :: u_e, v_e, w_e
280 type(
field_t),
intent(inout) :: p_res
281 type(
field_t),
intent(in) :: f_x, f_y, f_z
282 type(
coef_t),
intent(inout) :: c_Xh
283 type(
gs_t),
intent(inout) :: gs_Xh
286 class(
ax_t),
intent(inout) :: Ax
287 real(kind=
rp),
intent(in) :: bd
288 real(kind=
rp),
intent(in) :: dt
289 type(
field_t),
intent(in) :: mu
290 type(
field_t),
intent(in) :: rho
291 type(c_ptr),
intent(inout) :: event
292 real(kind=
rp) :: dtbd
293 real(kind=
rp) :: mu_val, rho_val
295 type(
field_t),
pointer :: ta1, ta2, ta3, wa1, wa2, wa3, work1, work2
296 integer :: temp_indices(8)
300 mu_val = mu%x(1,1,1,1)
301 rho_val = rho%x(1,1,1,1)
315 call curl(ta1, ta2, ta3, u_e, v_e, w_e, work1, work2, c_xh, event)
316 call curl(wa1, wa2, wa3, ta1, ta2, ta3, work1, work2, c_xh, event)
321 wa1%x_d, wa2%x_d, wa3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, &
322 c_xh%B_d, c_xh%h1_d, mu_val, rho_val, n)
326 wa1%x_d, wa2%x_d, wa3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, &
327 c_xh%B_d, c_xh%h1_d, mu_val, rho_val, n)
330 wa1%x_d, wa2%x_d, wa3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, &
331 c_xh%B_d, c_xh%h1_d, mu_val, rho_val, n)
333 call pnpn_prs_res_part1_metal(ta1%x_d, ta2%x_d, ta3%x_d, &
334 wa1%x_d, wa2%x_d, wa3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, &
335 c_xh%B_d, c_xh%h1_d, mu_val, rho_val, n)
340 call rotate_cyc(ta1%x_d, ta2%x_d, ta3%x_d, 1, c_xh)
341 call gs_xh%op(ta1, gs_op_add, event)
343 call gs_xh%op(ta2, gs_op_add, event)
345 call gs_xh%op(ta3, gs_op_add, event)
347 call rotate_cyc(ta1%x_d, ta2%x_d, ta3%x_d, 0, c_xh)
349 call device_opcolv(ta1%x_d, ta2%x_d, ta3%x_d, c_xh%Binv_d, gdim, n)
351 call cdtp(wa1%x, ta1%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
352 call cdtp(wa2%x, ta2%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
353 call cdtp(wa3%x, ta3%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
355 call ax%compute(p_res%x, p%x, c_xh, p%msh, p%Xh)
364 call pnpn_prs_res_part2_metal(p_res%x_d, wa1%x_d, wa2%x_d, wa3%x_d, n)
374 call bc_sym_surface%apply_surfvec_dev(wa1%x_d, wa2%x_d, wa3%x_d, ta1%x_d, &
385 call pnpn_prs_res_part3_metal(p_res%x_d, wa1%x_d, wa2%x_d, wa3%x_d, dtbd, &
395 call bc_prs_surface%apply_surfvec_dev(ta1%x_d, ta2%x_d, ta3%x_d, &
406 call pnpn_prs_res_part3_metal(p_res%x_d, ta1%x_d, ta2%x_d, ta3%x_d, dtbd,&
415 p, f_x, f_y, f_z, c_Xh, msh, Xh, mu, rho, bd, dt, n)
416 class(
ax_t),
intent(in) :: Ax
417 type(
mesh_t),
intent(inout) :: msh
418 type(
space_t),
intent(inout) :: Xh
419 type(
field_t),
intent(inout) :: p, u, v, w
420 type(
field_t),
intent(inout) :: u_res, v_res, w_res
421 type(
field_t),
intent(in) :: f_x, f_y, f_z
422 type(
coef_t),
intent(inout) :: c_Xh
423 type(
field_t),
intent(in) :: mu
424 type(
field_t),
intent(in) :: rho
425 real(kind=
rp),
intent(in) :: bd
426 real(kind=
rp),
intent(in) :: dt
427 integer,
intent(in) :: n
428 integer :: temp_indices(3)
429 type(
field_t),
pointer :: ta1, ta2, ta3
430 real(kind=
rp) :: mu_val, rho_val
433 mu_val = mu%x(1,1,1,1)
434 rho_val = rho%x(1,1,1,1)
440 call ax%compute_vector(u_res%x, v_res%x, w_res%x, &
441 u%x, v%x, w%x, c_xh, msh, xh)
447 call opgrad(ta1%x, ta2%x, ta3%x, p%x, c_xh)
451 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
454 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
457 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
459 call pnpn_vel_res_update_metal(u_res%x_d, v_res%x_d, w_res%x_d, &
460 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
Apply cyclic boundary condition to a vector field.
Defines a Matrix-vector product.
subroutine, public device_rzero(a_d, n, strm)
Zero a real vector.
subroutine, public device_cfill(a_d, c, n, strm)
Set all elements to a constant c .
subroutine, public device_opcolv(a1_d, a2_d, a3_d, c_d, gdim, n)
Device abstraction, common interface for various accelerators.
subroutine, public device_event_sync(event)
Synchronize an event.
Dirichlet condition applied in the facet normal direction.
integer, parameter, public c_rp
integer, parameter, public rp
Global precision used in computations.
subroutine, public opgrad(ux, uy, uz, u, coef, es, ee)
Compute the weak gradient of a scalar field, i.e. the gradient multiplied by the mass matrix.
subroutine, public curl(w1, w2, w3, u1, u2, u3, work1, work2, coef, event)
subroutine, public cdtp(dtx, x, dr, ds, dt, coef, es, ee)
Apply D^T to a scalar field, where D is the derivative matrix.
subroutine pnpn_prs_res_device_compute(p, p_res, u, v, w, u_e, v_e, w_e, f_x, f_y, f_z, c_xh, gs_xh, bc_prs_surface, bc_sym_surface, ax, bd, dt, mu, rho, event)
subroutine pnpn_vel_res_device_compute(ax, u, v, w, u_res, v_res, w_res, p, f_x, f_y, f_z, c_xh, msh, xh, mu, rho, bd, dt, n)
Defines Pressure and velocity residuals in the Pn-Pn formulation.
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.
void pnpn_prs_res_part3_opencl(void *p_res, void *ta1, void *ta2, void *ta3, real *dtbd, int *n)
void pnpn_prs_res_part1_opencl(void *ta1, void *ta2, void *ta3, void *wa1, void *wa2, void *wa3, void *f_u, void *f_v, void *f_w, void *B, void *h1, real *mu, real *rho, int *n)
void pnpn_prs_res_part2_opencl(void *p_res, void *wa1, void *wa2, void *wa3, int *n)
void pnpn_vel_res_update_opencl(void *u_res, void *v_res, void *w_res, void *ta1, void *ta2, void *ta3, void *f_u, void *f_v, void *f_w, int *n)
void pnpn_prs_res_part2_cuda(void *p_res, void *wa1, void *wa2, void *wa3, int *n)
void pnpn_prs_res_part3_cuda(void *p_res, void *ta1, void *ta2, void *ta3, real *dtbd, int *n)
void pnpn_vel_res_update_cuda(void *u_res, void *v_res, void *w_res, void *ta1, void *ta2, void *ta3, void *f_u, void *f_v, void *f_w, int *n)
void pnpn_prs_res_part1_cuda(void *ta1, void *ta2, void *ta3, void *wa1, void *wa2, void *wa3, void *f_u, void *f_v, void *f_w, void *B, void *h1, real *mu, real *rho, int *n)
Base type for a matrix-vector product providing .
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Dirichlet condition in facet normal direction.
Abstract type to compute pressure residual.
Abstract type to compute velocity residual.
The function space for the SEM solution fields.