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, gs_op_add)
327 call gs_xh%op(ta2, gs_op_add)
328 call gs_xh%op(ta3, gs_op_add)
329 call rotate_cyc(ta1%x_d, ta2%x_d, ta3%x_d, 0, c_xh)
331 call device_opcolv(ta1%x_d, ta2%x_d, ta3%x_d, c_xh%Binv_d, gdim, n)
334 call cdtp(wa1%x, ta1%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
335 call cdtp(wa2%x, ta2%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
336 call cdtp(wa3%x, ta3%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
339 call ax%compute(p_res%x, p%x, c_xh, p%msh, p%Xh)
348 call pnpn_prs_res_part2_metal(p_res%x_d, wa1%x_d, wa2%x_d, wa3%x_d, n)
358 call bc_sym_surface%apply_surfvec_dev(wa1%x_d, wa2%x_d, wa3%x_d, &
359 ta1%x_d , ta2%x_d, ta3%x_d)
366 call bc_prs_surface%apply_surfvec_dev(ta1%x_d, ta2%x_d, ta3%x_d, &
371 wa1%x_d, wa2%x_d, wa3%x_d, dtbd, n)
374 wa1%x_d, wa2%x_d, wa3%x_d, dtbd, n)
377 wa1%x_d, wa2%x_d, wa3%x_d, dtbd, n)
379 call neko_error(
'Stress formulation prs ress is not implemented for Metal')
387 w_res, p, f_x, f_y, f_z, c_Xh, msh, Xh, mu, rho, bd, dt, n)
388 class(
ax_t),
intent(in) :: Ax
389 type(
mesh_t),
intent(inout) :: msh
390 type(
space_t),
intent(inout) :: Xh
391 type(
field_t),
intent(inout) :: p, u, v, w
392 type(
field_t),
intent(inout) :: u_res, v_res, w_res
393 type(
field_t),
intent(in) :: f_x, f_y, f_z
394 type(
coef_t),
intent(inout) :: c_Xh
395 type(
field_t),
intent(in) :: mu
396 type(
field_t),
intent(in) :: rho
397 real(kind=
rp),
intent(in) :: bd
398 real(kind=
rp),
intent(in) :: dt
399 real(kind=
rp) :: bddt
400 integer :: temp_indices(3)
401 type(
field_t),
pointer :: ta1, ta2, ta3
402 integer,
intent(in) :: n
414 call ax%compute_vector(u_res%x, v_res%x, w_res%x, u%x, v%x, w%x, c_xh,&
422 call opgrad(ta1%x, ta2%x, ta3%x, p%x, c_xh)
427 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
430 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
433 ta1%x_d, ta2%x_d, ta3%x_d, f_x%x_d, f_y%x_d, f_z%x_d, n)
435 call pnpn_vel_res_update_metal(u_res%x_d, v_res%x_d, w_res%x_d, &
436 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.