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, f_u_d, f_v_d, f_w_d, &
150 B_d, h1_d, mu, rho, n) &
151 bind(c, name =
'pnpn_prs_res_part1_opencl')
152 use,
intrinsic :: iso_c_binding
155 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
156 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
157 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
158 type(c_ptr),
value :: B_d, h1_d
159 real(c_rp) :: mu, rho
166 bind(c, name =
'pnpn_prs_res_part2_opencl')
167 use,
intrinsic :: iso_c_binding
169 type(c_ptr),
value :: p_res_d, wa1_d, wa2_d, wa3_d
176 wa1_d, wa2_d, wa3_d, dtbd, n) &
177 bind(c, name =
'pnpn_prs_res_part3_opencl')
178 use,
intrinsic :: iso_c_binding
181 type(c_ptr),
value :: p_res_d, ta1_d, ta2_d, ta3_d
182 type(c_ptr),
value :: wa1_d, wa2_d, wa3_d
190 ta1_d, ta2_d, ta3_d, f_u_d, f_v_d, f_w_d, n) &
191 bind(c, name =
'pnpn_vel_res_update_opencl')
192 use,
intrinsic :: iso_c_binding
194 type(c_ptr),
value :: u_res_d, v_res_d, w_res_d
195 type(c_ptr),
value :: ta1_d, ta2_d, ta3_d
196 type(c_ptr),
value :: f_u_d, f_v_d, f_w_d
205 w_e, f_x, f_y, f_z, c_Xh, gs_Xh, bc_prs_surface, bc_sym_surface, Ax, bd,&
207 type(
field_t),
intent(inout) :: p, u, v, w
208 type(
field_t),
intent(inout) :: u_e, v_e, w_e
209 type(
field_t),
intent(inout) :: p_res
210 type(
field_t),
intent(inout) :: f_x, f_y, f_z
211 type(
coef_t),
intent(inout) :: c_Xh
212 type(
gs_t),
intent(inout) :: gs_Xh
215 class(
ax_t),
intent(inout) :: Ax
216 real(kind=
rp),
intent(inout) :: bd
217 real(kind=
rp),
intent(in) :: dt
218 type(
field_t),
intent(in) :: mu
219 type(
field_t),
intent(in) :: rho
220 real(kind=
rp) :: dtbd
221 integer :: n, nelv, lxyz, gdim
224 type(
field_t),
pointer :: ta1, ta2, ta3, wa1, wa2, wa3, work1, work2, work3
225 type(
field_t),
pointer :: s11, s22, s33, s12, s13, s23
226 integer :: temp_indices(15)
258 call curl(ta1, ta2, ta3, u_e, v_e, w_e, work1, work2, c_xh)
259 call curl(wa1, wa2, wa3, ta1, ta2, ta3, work1, work2, c_xh)
267 call strain_rate(s11%x, s22%x, s33%x, s12%x, s13%x, s23%x, &
273 call dudxyz(ta1%x, mu%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
274 call dudxyz(ta2%x, mu%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
275 call dudxyz(ta3%x, mu%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
279 wa1%x_d, wa2%x_d, wa3%x_d, &
280 s11%x_d, s22%x_d, s33%x_d, s12%x_d, s13%x_d, s23%x_d, &
281 f_x%x_d, f_y%x_d, f_z%x_d, &
282 c_xh%B_d, c_xh%h1_d, rho%x_d, n)
285 wa1%x_d, wa2%x_d, wa3%x_d, &
286 s11%x_d, s22%x_d, s33%x_d, s12%x_d, s13%x_d, s23%x_d, &
287 f_x%x_d, f_y%x_d, f_z%x_d, &
288 c_xh%B_d, c_xh%h1_d, rho%x_d, n)
290 call neko_error(
'No device backend configured')
293 call gs_xh%op(ta1, gs_op_add)
294 call gs_xh%op(ta2, gs_op_add)
295 call gs_xh%op(ta3, gs_op_add)
297 call device_opcolv(ta1%x_d, ta2%x_d, ta3%x_d, c_xh%Binv_d, gdim, n)
300 call cdtp(wa1%x, ta1%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
301 call cdtp(wa2%x, ta2%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
302 call cdtp(wa3%x, ta3%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
305 call ax%compute(p_res%x, p%x, c_xh, p%msh, p%Xh)
322 call bc_sym_surface%apply_surfvec_dev(wa1%x_d, wa2%x_d, wa3%x_d, &
323 ta1%x_d , ta2%x_d, ta3%x_d)
330 call bc_prs_surface%apply_surfvec_dev(ta1%x_d, ta2%x_d, ta3%x_d, &
335 wa1%x_d, wa2%x_d, wa3%x_d, dtbd, n)
338 wa1%x_d, wa2%x_d, wa3%x_d, dtbd, n)
340 call neko_error(
'No device backend configured')
348 w_res, p, f_x, f_y, f_z, c_Xh, msh, Xh, mu, rho, bd, dt, n)
349 class(
ax_t),
intent(in) :: Ax
350 type(
mesh_t),
intent(inout) :: msh
351 type(
space_t),
intent(inout) :: Xh
352 type(
field_t),
intent(inout) :: p, u, v, w
353 type(
field_t),
intent(inout) :: u_res, v_res, w_res
354 type(
field_t),
intent(inout) :: f_x, f_y, f_z
355 type(
coef_t),
intent(inout) :: c_Xh
356 type(
field_t),
intent(in) :: mu
357 type(
field_t),
intent(in) :: rho
358 real(kind=
rp),
intent(in) :: bd
359 real(kind=
rp),
intent(in) :: dt
360 real(kind=
rp) :: bddt
361 integer :: temp_indices(3)
362 type(
field_t),
pointer :: ta1, ta2, ta3
363 integer,
intent(in) :: n
375 call ax%compute_vector(u_res%x, v_res%x, w_res%x, u%x, v%x, w%x, c_xh,&
383 call opgrad(ta1%x, ta2%x, ta3%x, p%x, c_xh)
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)
394 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_col2(a_d, b_d, n)
Vector multiplication .
subroutine, public device_rzero(a_d, n)
Zero a real vector.
subroutine, public device_invcol1(a_d, n)
Invert a vector .
subroutine, public device_vdot3(dot_d, u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, n)
Compute a dot product (3-d version) assuming vector components etc.
subroutine, public device_cmult(a_d, c, n)
Multiplication by constant c .
subroutine, public device_copy(a_d, b_d, n)
Copy a vector .
subroutine, public device_sub2(a_d, b_d, n)
Vector substraction .
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)
subroutine, public strain_rate(s11, s22, s33, s12, s13, s23, u, v, w, coef)
Compute the strain rate tensor, i.e 0.5 * du_i/dx_j + du_j/dx_i.
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, public dudxyz(du, u, dr, ds, dt, coef)
Compute derivative of a scalar field along a single direction.
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)
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_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_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.