Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
pnpn_res_cpu.f90
Go to the documentation of this file.
1
3 use gather_scatter, only : gs_t, gs_op_add
4 use operators, only : opgrad, curl, cdtp, rotate_cyc
5 use field, only : field_t
6 use ax_product, only : ax_t
7 use coefs, only : coef_t
11 use mesh, only : mesh_t
12 use num_types, only : rp
13 use space, only : space_t
14 use math, only : copy, cmult2, invers2, rzero
15 use, intrinsic :: iso_c_binding, only : c_ptr
16 implicit none
17 private
18
19 type, public, extends(pnpn_prs_res_t) :: pnpn_prs_res_cpu_t
20 contains
21 procedure, nopass :: compute => pnpn_prs_res_cpu_compute
22 end type pnpn_prs_res_cpu_t
23
24 type, public, extends(pnpn_vel_res_t) :: pnpn_vel_res_cpu_t
25 contains
26 procedure, nopass :: compute => pnpn_vel_res_cpu_compute
27 end type pnpn_vel_res_cpu_t
28
29contains
30
31 subroutine pnpn_prs_res_cpu_compute(p, p_res, u, v, w, u_e, v_e, w_e, f_x, &
32 f_y, f_z, c_Xh, gs_Xh, bc_prs_surface, bc_sym_surface, Ax, bd, dt, mu, &
33 rho, event)
34 type(field_t), intent(inout) :: p, u, v, w
35 type(field_t), intent(in) :: u_e, v_e, w_e
36 type(field_t), intent(inout) :: p_res
37 type(field_t), intent(in) :: f_x, f_y, f_z
38 type(coef_t), intent(inout) :: c_Xh
39 type(gs_t), intent(inout) :: gs_Xh
40 type(facet_normal_t), intent(in) :: bc_prs_surface
41 type(facet_normal_t), intent(in) :: bc_sym_surface
42 class(ax_t), intent(inout) :: Ax
43 real(kind=rp), intent(in) :: bd
44 real(kind=rp), intent(in) :: dt
45 type(field_t), intent(in) :: mu
46 type(field_t), intent(in) :: rho
47 type(c_ptr), intent(inout) :: event
48 real(kind=rp) :: dtbd, rho_inv, mu_rho
49 integer :: n
50 integer :: i
51 type(field_t), pointer :: ta1, ta2, ta3, wa1, wa2, wa3, work1, work2
52 integer :: temp_indices(8)
53
54 call neko_scratch_registry%request_field(ta1, temp_indices(1), .false.)
55 call neko_scratch_registry%request_field(ta2, temp_indices(2), .false.)
56 call neko_scratch_registry%request_field(ta3, temp_indices(3), .false.)
57 call neko_scratch_registry%request_field(wa1, temp_indices(4), .false.)
58 call neko_scratch_registry%request_field(wa2, temp_indices(5), .false.)
59 call neko_scratch_registry%request_field(wa3, temp_indices(6), .false.)
60 call neko_scratch_registry%request_field(work1, temp_indices(7), .false.)
61 call neko_scratch_registry%request_field(work2, temp_indices(8), .false.)
62
63 n = c_xh%dof%size()
64
65 ! We assume the material properties are constant, and only their
66 ! reciprocals are needed here.
67 rho_inv = 1.0_rp / rho%x(1,1,1,1)
68 mu_rho = mu%x(1,1,1,1) / rho%x(1,1,1,1)
69 !OCL NORECURRENCE, NOVREC, NOALIAS
70 !DIR$ CONCURRENT
71 !DIR$ IVDEP
72 !GCC$ ivdep
73 !$omp parallel do
74 do i = 1, n
75 c_xh%h1(i,1,1,1) = rho_inv
76 c_xh%h2(i,1,1,1) = 0.0_rp
77 end do
78 !$omp end parallel do
79 c_xh%ifh2 = .false.
80
81 call curl(ta1, ta2, ta3, u_e, v_e, w_e, work1, work2, c_xh)
82 call curl(wa1, wa2, wa3, ta1, ta2, ta3, work1, work2, c_xh)
83
84 ! ta = f / rho - wa * mu / rho * B
85 !OCL NORECURRENCE, NOVREC, NOALIAS
86 !DIR$ CONCURRENT
87 !DIR$ IVDEP
88 !GCC$ ivdep
89 !$omp parallel do
90 do i = 1,n
91 ta1%x(i,1,1,1) = f_x%x(i,1,1,1) * rho_inv &
92 - ((wa1%x(i,1,1,1) * mu_rho) * c_xh%B(i,1,1,1))
93 ta2%x(i,1,1,1) = f_y%x(i,1,1,1) * rho_inv &
94 - ((wa2%x(i,1,1,1) * mu_rho) * c_xh%B(i,1,1,1))
95 ta3%x(i,1,1,1) = f_z%x(i,1,1,1) * rho_inv &
96 - ((wa3%x(i,1,1,1) * mu_rho) * c_xh%B(i,1,1,1))
97 end do
98 !$omp end parallel do
99
100 call rotate_cyc(ta1%x, ta2%x, ta3%x, 1, c_xh)
101 call gs_xh%op(ta1%x, ta2%x, ta3%x, n, gs_op_add)
102 call rotate_cyc(ta1%x, ta2%x, ta3%x, 0, c_xh)
103
104 !OCL NORECURRENCE, NOVREC, NOALIAS
105 !DIR$ CONCURRENT
106 !DIR$ IVDEP
107 !GCC$ ivdep
108 !$omp parallel do
109 do i = 1,n
110 ta1%x(i,1,1,1) = ta1%x(i,1,1,1) * c_xh%Binv(i,1,1,1)
111 ta2%x(i,1,1,1) = ta2%x(i,1,1,1) * c_xh%Binv(i,1,1,1)
112 ta3%x(i,1,1,1) = ta3%x(i,1,1,1) * c_xh%Binv(i,1,1,1)
113 end do
114 !$omp end parallel do
115
116 call cdtp(wa1%x, ta1%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
117 call cdtp(wa2%x, ta2%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
118 call cdtp(wa3%x, ta3%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
119
120 call ax%compute(p_res%x, p%x, c_xh, p%msh, p%Xh)
121
122 dtbd = bd / dt
123
124 !$omp parallel private(i)
125 !OCL NORECURRENCE, NOVREC, NOALIAS
126 !DIR$ CONCURRENT
127 !DIR$ IVDEP
128 !GCC$ ivdep
129 !$omp do
130 do i = 1,n
131 p_res%x(i,1,1,1) = (-p_res%x(i,1,1,1)) &
132 + wa1%x(i,1,1,1) + wa2%x(i,1,1,1) + wa3%x(i,1,1,1)
133 end do
134 !$omp end do
135
136 !
137 ! Surface velocity terms
138 !
139 call bc_prs_surface%apply_surfvec_sub(p_res%x, u%x, v%x, w%x, dtbd, n)
140 call bc_sym_surface%apply_surfvec_sub(p_res%x, ta1%x, ta2%x, ta3%x, &
141 1.0_rp, n)
142 !$omp end parallel
143
144 call neko_scratch_registry%relinquish_field(temp_indices)
145
146 end subroutine pnpn_prs_res_cpu_compute
147
148 subroutine pnpn_vel_res_cpu_compute(Ax, u, v, w, u_res, v_res, w_res, &
149 p, f_x, f_y, f_z, c_Xh, msh, Xh, mu, rho, bd, dt, n)
150 class(ax_t), intent(in) :: Ax
151 type(mesh_t), intent(inout) :: msh
152 type(space_t), intent(inout) :: Xh
153 type(field_t), intent(inout) :: p, u, v, w
154 type(field_t), intent(inout) :: u_res, v_res, w_res
155 type(field_t), intent(in) :: f_x, f_y, f_z
156 type(coef_t), intent(inout) :: c_Xh
157 type(field_t), intent(in) :: mu
158 type(field_t), intent(in) :: rho
159 real(kind=rp), intent(in) :: bd
160 real(kind=rp), intent(in) :: dt
161 real(kind=rp) :: rho_val, mu_val
162 integer :: temp_indices(3)
163 type(field_t), pointer :: ta1, ta2, ta3
164 integer, intent(in) :: n
165 integer :: i
166
167 ! We assume the material properties are constant
168 rho_val = rho%x(1,1,1,1)
169 mu_val = mu%x(1,1,1,1)
170
171 !OCL NORECURRENCE, NOVREC, NOALIAS
172 !DIR$ CONCURRENT
173 !DIR$ IVDEP
174 !GCC$ ivdep
175 !$omp parallel do
176 do i = 1, n
177 c_xh%h1(i,1,1,1) = mu_val
178 c_xh%h2(i,1,1,1) = rho_val * bd / dt
179 end do
180 !$omp end parallel do
181 c_xh%ifh2 = .true.
182
183 ! One fused pass: streams the geometric factors and h1/h2 once instead
184 ! of three times, and opens one parallel region instead of three.
185 call ax%compute_vector(u_res%x, v_res%x, w_res%x, u%x, v%x, w%x, &
186 c_xh, msh, xh)
187 call neko_scratch_registry%request_field(ta1, temp_indices(1), .false.)
188 call neko_scratch_registry%request_field(ta2, temp_indices(2), .false.)
189 call neko_scratch_registry%request_field(ta3, temp_indices(3), .false.)
190
191 call opgrad(ta1%x, ta2%x, ta3%x, p%x, c_xh)
192
193 !OCL NORECURRENCE, NOVREC, NOALIAS
194 !DIR$ CONCURRENT
195 !DIR$ IVDEP
196 !GCC$ ivdep
197 !$omp parallel do
198 do i = 1, n
199 u_res%x(i,1,1,1) = (-u_res%x(i,1,1,1)) - ta1%x(i,1,1,1) + f_x%x(i,1,1,1)
200 v_res%x(i,1,1,1) = (-v_res%x(i,1,1,1)) - ta2%x(i,1,1,1) + f_y%x(i,1,1,1)
201 w_res%x(i,1,1,1) = (-w_res%x(i,1,1,1)) - ta3%x(i,1,1,1) + f_z%x(i,1,1,1)
202 end do
203 !$omp end parallel do
204
205 call neko_scratch_registry%relinquish_field(temp_indices)
206
207 end subroutine pnpn_vel_res_cpu_compute
208
209end module pnpn_res_cpu
Apply cyclic boundary condition to a vector field.
Defines a Matrix-vector product.
Definition ax.f90:34
Coefficients.
Definition coef.f90:34
Dirichlet condition applied in the facet normal direction.
Defines a field.
Definition field.f90:34
Gather-scatter.
Definition math.f90:60
subroutine, public cmult2(a, b, c, n)
Multiplication by constant c .
Definition math.f90:523
subroutine, public invers2(a, b, n)
Compute inverted vector .
Definition math.f90:839
subroutine, public copy(a, b, n)
Copy a vector .
Definition math.f90:295
subroutine, public rzero(a, n)
Zero a real vector.
Definition math.f90:239
Defines a mesh.
Definition mesh.f90:34
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Operators.
Definition operators.f90:34
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 (CPU version)
subroutine pnpn_vel_res_cpu_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_cpu_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.
Definition pnpn_res.f90:34
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.
Definition space.f90:34
Base type for a matrix-vector product providing .
Definition ax.f90:43
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:135
Dirichlet condition in facet normal direction.
Gather-scatter kernel.
Abstract type to compute pressure residual.
Definition pnpn_res.f90:48
Abstract type to compute velocity residual.
Definition pnpn_res.f90:54
The function space for the SEM solution fields.
Definition space.f90:64