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
224 f_x, f_y, f_z, c_Xh, gs_Xh, bc_prs_surface, bc_sym_surface, Ax, bd, dt,&
226 type(
field_t),
intent(inout) :: p, u, v, w
227 type(
field_t),
intent(in) :: u_e, v_e, w_e
228 type(
field_t),
intent(inout) :: p_res
229 type(
field_t),
intent(in) :: f_x, f_y, f_z
230 type(
coef_t),
intent(inout) :: c_Xh
231 type(
gs_t),
intent(inout) :: gs_Xh
234 class(
ax_t),
intent(inout) :: Ax
235 real(kind=
rp),
intent(in) :: bd
236 real(kind=
rp),
intent(in) :: dt
237 type(
field_t),
intent(in) :: mu
238 type(
field_t),
intent(in) :: rho
239 type(c_ptr),
intent(inout) :: event
240 real(kind=
rp) :: dtbd
241 real(kind=
rp) :: mu_val, rho_val
243 type(
field_t),
pointer :: ta1, ta2, ta3, wa1, wa2, wa3, work1, work2
244 integer :: temp_indices(8)
248 mu_val = mu%x(1,1,1,1)
249 rho_val = rho%x(1,1,1,1)
263 call curl(ta1, ta2, ta3, u_e, v_e, w_e, work1, work2, c_xh, event)
264 call curl(wa1, wa2, wa3, ta1, ta2, ta3, work1, work2, c_xh, event)
269 wa1%x_d, wa2%x_d, wa3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, &
270 c_xh%B_d, c_xh%h1_d, mu_val, rho_val, n)
274 wa1%x_d, wa2%x_d, wa3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, &
275 c_xh%B_d, c_xh%h1_d, mu_val, rho_val, n)
278 wa1%x_d, wa2%x_d, wa3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, &
279 c_xh%B_d, c_xh%h1_d, mu_val, rho_val, n)
284 call gs_xh%op(ta1, gs_op_add, event)
286 call gs_xh%op(ta2, gs_op_add, event)
288 call gs_xh%op(ta3, gs_op_add, event)
291 call device_opcolv(ta1%x_d, ta2%x_d, ta3%x_d, c_xh%Binv_d, gdim, n)
293 call cdtp(wa1%x, ta1%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
294 call cdtp(wa2%x, ta2%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
295 call cdtp(wa3%x, ta3%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
297 call ax%compute(p_res%x, p%x, c_xh, p%msh, p%Xh)
314 call bc_sym_surface%apply_surfvec_dev(wa1%x_d, wa2%x_d, wa3%x_d, ta1%x_d, &
332 call bc_prs_surface%apply_surfvec_dev(ta1%x_d, ta2%x_d, ta3%x_d, &
349 p, f_x, f_y, f_z, c_Xh, msh, Xh, mu, rho, bd, dt, n)
350 class(
ax_t),
intent(in) :: Ax
351 type(
mesh_t),
intent(inout) :: msh
352 type(
space_t),
intent(inout) :: Xh
353 type(
field_t),
intent(inout) :: p, u, v, w
354 type(
field_t),
intent(inout) :: u_res, v_res, w_res
355 type(
field_t),
intent(in) :: f_x, f_y, f_z
356 type(
coef_t),
intent(inout) :: c_Xh
357 type(
field_t),
intent(in) :: mu
358 type(
field_t),
intent(in) :: rho
359 real(kind=
rp),
intent(in) :: bd
360 real(kind=
rp),
intent(in) :: dt
361 integer,
intent(in) :: n
362 integer :: temp_indices(3)
363 type(
field_t),
pointer :: ta1, ta2, ta3
364 real(kind=
rp) :: mu_val, rho_val
367 mu_val = mu%x(1,1,1,1)
368 rho_val = rho%x(1,1,1,1)
374 call ax%compute_vector(u_res%x, v_res%x, w_res%x, &
375 u%x, v%x, w%x, c_xh, msh, xh)
381 call opgrad(ta1%x, ta2%x, ta3%x, p%x, c_xh)
385 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
388 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
391 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
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 fields This can be used when you have a funct...
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.