15 use,
intrinsic :: iso_c_binding, only : c_ptr, c_int
39 wa1_d, wa2_d, wa3_d, s11_d, s22_d, s33_d, &
40 s12_d, s13_d, s23_d, f_u_d, f_v_d, f_w_d, &
41 B_d, h1_d, rho_d, n) &
42 bind(c, name =
'pnpn_prs_stress_res_part1_hip')
43 use,
intrinsic :: iso_c_binding
46 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
47 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
48 type(c_ptr),
value :: s11_d, s22_d, s33_d, s12_d, s13_d, s23_d
49 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
50 type(c_ptr),
value :: B_d, h1_d, rho_d
57 bind(c, name =
'pnpn_prs_res_part2_hip')
58 use,
intrinsic :: iso_c_binding
60 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
67 wa1_d, wa2_d, wa3_d, dtbd, n) &
68 bind(c, name =
'pnpn_prs_stress_res_part3_hip')
69 use,
intrinsic :: iso_c_binding
72 type(c_ptr),
value :: p_res_d, ta1_d, ta2_d, ta3_d
73 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
81 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
82 bind(c, name =
'pnpn_vel_res_update_hip')
83 use,
intrinsic :: iso_c_binding
85 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
86 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
87 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
94 wa1_d, wa2_d, wa3_d, s11_d, s22_d, s33_d, &
95 s12_d, s13_d, s23_d, f_u_d, f_v_d, f_w_d, &
96 B_d, h1_d, rho_d, n) &
97 bind(c, name =
'pnpn_prs_stress_res_part1_cuda')
98 use,
intrinsic :: iso_c_binding
101 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
102 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
103 type(c_ptr),
value :: s11_d, s22_d, s33_d, s12_d, s13_d, s23_d
104 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
105 type(c_ptr),
value :: B_d, h1_d, rho_d
112 bind(c, name =
'pnpn_prs_res_part2_cuda')
113 use,
intrinsic :: iso_c_binding
115 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
122 wa1_d, wa2_d, wa3_d, dtbd, n) &
123 bind(c, name =
'pnpn_prs_stress_res_part3_cuda')
124 use,
intrinsic :: iso_c_binding
127 type(c_ptr),
value :: p_res_d, ta1_d, ta2_d, ta3_d
128 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
136 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
137 bind(c, name =
'pnpn_vel_res_update_cuda')
138 use,
intrinsic :: iso_c_binding
140 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
141 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
142 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
149 wa1_d, wa2_d, wa3_d, s11_d, s22_d, s33_d, &
150 s12_d, s13_d, s23_d, f_u_d, f_v_d, f_w_d, &
151 B_d, h1_d, rho_d, n) &
152 bind(c, name =
'pnpn_prs_stress_res_part1_opencl')
153 use,
intrinsic :: iso_c_binding
156 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
157 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
158 type(c_ptr),
value :: s11_d, s22_d, s33_d, s12_d, s13_d, s23_d
159 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
160 type(c_ptr),
value :: B_d, h1_d, rho_d
167 bind(c, name =
'pnpn_prs_res_part2_opencl')
168 use,
intrinsic :: iso_c_binding
170 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
177 wa1_d, wa2_d, wa3_d, dtbd, n) &
178 bind(c, name =
'pnpn_prs_stress_res_part3_opencl')
179 use,
intrinsic :: iso_c_binding
182 type(c_ptr),
value :: p_res_d, ta1_d, ta2_d, ta3_d
183 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
192 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
193 bind(c, name =
'pnpn_vel_res_update_opencl')
194 use,
intrinsic :: iso_c_binding
196 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
197 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
198 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
204 subroutine pnpn_prs_res_part2_metal(p_res_d, wa1_d, wa2_d, wa3_d, n) &
205 bind(c, name =
'pnpn_prs_res_part2_metal')
206 use,
intrinsic :: iso_c_binding
208 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
210 end subroutine pnpn_prs_res_part2_metal
215 subroutine pnpn_vel_res_update_metal(u_res_d, v_res_d, w_res_d, &
216 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
217 bind(c, name =
'pnpn_vel_res_update_metal')
218 use,
intrinsic :: iso_c_binding
220 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
221 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
222 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
224 end subroutine pnpn_vel_res_update_metal
231 w_e, f_x, f_y, f_z, c_Xh, gs_Xh, bc_prs_surface, bc_sym_surface, Ax, bd,&
233 type(
field_t),
intent(inout) :: p, u, v, w
234 type(
field_t),
intent(in) :: u_e, v_e, w_e
235 type(
field_t),
intent(inout) :: p_res
236 type(
field_t),
intent(in) :: f_x, f_y, f_z
237 type(
coef_t),
intent(inout) :: c_Xh
238 type(
gs_t),
intent(inout) :: gs_Xh
241 class(
ax_t),
intent(inout) :: Ax
242 real(kind=
rp),
intent(in) :: bd
243 real(kind=
rp),
intent(in) :: dt
244 type(
field_t),
intent(in) :: mu
245 type(
field_t),
intent(in) :: rho
246 type(c_ptr),
intent(inout) :: event
247 real(kind=
rp) :: dtbd
248 integer :: n, nelv, lxyz, gdim
251 type(
field_t),
pointer :: ta1, ta2, ta3, wa1, wa2, wa3, work1, work2
252 type(
field_t),
pointer :: s11, s22, s33, s12, s13, s23
253 integer :: temp_indices(14)
284 call curl(ta1, ta2, ta3, u_e, v_e, w_e, work1, work2, c_xh, event)
285 call curl(wa1, wa2, wa3, ta1, ta2, ta3, work1, work2, c_xh, event)
293 call strain_rate(s11%x_d, s22%x_d, s33%x_d, s12%x_d, s13%x_d, s23%x_d, &
294 u_e%x_d, v_e%x_d, w_e%x_d, c_xh)
299 call dudxyz(ta1%x_d, mu%x_d, c_xh%drdx_d, c_xh%dsdx_d, c_xh%dtdx_d, c_xh)
300 call dudxyz(ta2%x_d, mu%x_d, c_xh%drdy_d, c_xh%dsdy_d, c_xh%dtdy_d, c_xh)
301 call dudxyz(ta3%x_d, mu%x_d, c_xh%drdz_d, c_xh%dsdz_d, c_xh%dtdz_d, c_xh)
305 wa1%x_d, wa2%x_d, wa3%x_d, &
306 s11%x_d, s22%x_d, s33%x_d, s12%x_d, s13%x_d, s23%x_d, &
307 f_x%x_d, f_y%x_d, f_z%x_d, &
308 c_xh%B_d, c_xh%h1_d, rho%x_d, n)
311 wa1%x_d, wa2%x_d, wa3%x_d, &
312 s11%x_d, s22%x_d, s33%x_d, s12%x_d, s13%x_d, s23%x_d, &
313 f_x%x_d, f_y%x_d, f_z%x_d, &
314 c_xh%B_d, c_xh%h1_d, rho%x_d, n)
317 wa1%x_d, wa2%x_d, wa3%x_d, &
318 s11%x_d, s22%x_d, s33%x_d, s12%x_d, s13%x_d, s23%x_d, &
319 f_x%x_d, f_y%x_d, f_z%x_d, &
320 c_xh%B_d, c_xh%h1_d, rho%x_d, n)
322 call neko_error(
'Stress formulation prs res is not implemented for Metal')
325 call rotate_cyc(ta1%x_d, ta2%x_d, ta3%x_d, 1, c_xh)
326 call gs_xh%op(ta1%x, ta2%x, ta3%x, n, gs_op_add)
327 call rotate_cyc(ta1%x_d, ta2%x_d, ta3%x_d, 0, c_xh)
329 call device_opcolv(ta1%x_d, ta2%x_d, ta3%x_d, c_xh%Binv_d, gdim, n)
332 call cdtp(wa1%x, ta1%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
333 call cdtp(wa2%x, ta2%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
334 call cdtp(wa3%x, ta3%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
337 call ax%compute(p_res%x, p%x, c_xh, p%msh, p%Xh)
346 call pnpn_prs_res_part2_metal(p_res%x_d, wa1%x_d, wa2%x_d, wa3%x_d, n)
356 call bc_sym_surface%apply_surfvec_dev(wa1%x_d, wa2%x_d, wa3%x_d, &
357 ta1%x_d , ta2%x_d, ta3%x_d)
364 call bc_prs_surface%apply_surfvec_dev(ta1%x_d, ta2%x_d, ta3%x_d, &
369 wa1%x_d, wa2%x_d, wa3%x_d, dtbd, n)
372 wa1%x_d, wa2%x_d, wa3%x_d, dtbd, n)
375 wa1%x_d, wa2%x_d, wa3%x_d, dtbd, n)
377 call neko_error(
'Stress formulation prs ress is not implemented for Metal')
385 w_res, p, f_x, f_y, f_z, c_Xh, msh, Xh, mu, rho, bd, dt, n)
386 class(
ax_t),
intent(in) :: Ax
387 type(
mesh_t),
intent(inout) :: msh
388 type(
space_t),
intent(inout) :: Xh
389 type(
field_t),
intent(inout) :: p, u, v, w
390 type(
field_t),
intent(inout) :: u_res, v_res, w_res
391 type(
field_t),
intent(in) :: f_x, f_y, f_z
392 type(
coef_t),
intent(inout) :: c_Xh
393 type(
field_t),
intent(in) :: mu
394 type(
field_t),
intent(in) :: rho
395 real(kind=
rp),
intent(in) :: bd
396 real(kind=
rp),
intent(in) :: dt
397 real(kind=
rp) :: bddt
398 integer :: temp_indices(3)
399 type(
field_t),
pointer :: ta1, ta2, ta3
400 integer,
intent(in) :: n
412 call ax%compute_vector(u_res%x, v_res%x, w_res%x, u%x, v%x, w%x, c_xh,&
420 call opgrad(ta1%x, ta2%x, ta3%x, p%x, c_xh)
425 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
428 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
431 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
433 call pnpn_vel_res_update_metal(u_res%x_d, v_res%x_d, w_res%x_d, &
434 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
Compute derivative of a scalar field along a single direction.
Apply cyclic boundary condition to a vector field.
Compute the strain rate tensor of a vector field.
Defines a Matrix-vector product.
subroutine, public device_invcol1(a_d, n, strm)
Invert a vector .
subroutine, public device_rzero(a_d, n, strm)
Zero a real vector.
subroutine, public device_cmult(a_d, c, n, strm)
Multiplication by constant c .
subroutine, public device_copy(a_d, b_d, n, strm)
Copy a vector .
subroutine, public device_col2(a_d, b_d, n, strm)
Vector multiplication .
subroutine, public device_opcolv(a1_d, a2_d, a3_d, c_d, gdim, n)
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.
Residuals in the Pn-Pn formulation (device version)
subroutine pnpn_vel_res_stress_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)
subroutine pnpn_prs_res_stress_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)
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_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_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_stress_res_part1_opencl(void *ta1, void *ta2, void *ta3, void *wa1, void *wa2, void *wa3, void *s11, void *s22, void *s33, void *s12, void *s13, void *s23, void *f_u, void *f_v, void *f_w, void *B, void *h1, void *rho, int *n)
void pnpn_prs_stress_res_part3_opencl(void *p_res, void *ta1, void *ta2, void *ta3, void *wa1, void *wa2, void *wa3, real *dtbd, int *n)
void pnpn_prs_stress_res_part1_cuda(void *ta1, void *ta2, void *ta3, void *wa1, void *wa2, void *wa3, void *s11, void *s22, void *s33, void *s12, void *s13, void *s23, void *f_u, void *f_v, void *f_w, void *B, void *h1, void *rho, int *n)
void pnpn_prs_stress_res_part3_cuda(void *p_res, void *ta1, void *ta2, void *ta3, void *wa1, void *wa2, void *wa3, real *dtbd, 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.
Device implementation of the pressure residual for the PnPn fluid with full viscous stress formulatio...
Device implementation of the velocity residual for the PnPn fluid with full viscous stress formulatio...
Abstract type to compute pressure residual.
Abstract type to compute velocity residual.
The function space for the SEM solution fields.