Neko 1.99.5
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_val, mu_val
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
66 rho_val = rho%x(1,1,1,1)
67 mu_val = mu%x(1,1,1,1)
68 !OCL NORECURRENCE, NOVREC, NOALIAS
69 !DIR$ CONCURRENT
70 !GCC$ ivdep
71 !$omp parallel do
72 do i = 1, n
73 c_xh%h1(i,1,1,1) = 1.0_rp / rho_val
74 c_xh%h2(i,1,1,1) = 0.0_rp
75 end do
76 !$omp end parallel do
77 c_xh%ifh2 = .false.
78
79 call curl(ta1, ta2, ta3, u_e, v_e, w_e, work1, work2, c_xh)
80 call curl(wa1, wa2, wa3, ta1, ta2, ta3, work1, work2, c_xh)
81
82 ! ta = f / rho - wa * mu / rho * B
83 !OCL NORECURRENCE, NOVREC, NOALIAS
84 !DIR$ CONCURRENT
85 !GCC$ ivdep
86 !$omp parallel do
87 do i = 1,n
88 ta1%x(i,1,1,1) = f_x%x(i,1,1,1) / rho_val &
89 - ((wa1%x(i,1,1,1) * (mu_val / rho_val)) * c_xh%B(i,1,1,1))
90 ta2%x(i,1,1,1) = f_y%x(i,1,1,1) / rho_val &
91 - ((wa2%x(i,1,1,1) * (mu_val / rho_val)) * c_xh%B(i,1,1,1))
92 ta3%x(i,1,1,1) = f_z%x(i,1,1,1) / rho_val &
93 - ((wa3%x(i,1,1,1) * (mu_val / rho_val)) * c_xh%B(i,1,1,1))
94 end do
95 !$omp end parallel do
96
97 call rotate_cyc(ta1%x, ta2%x, ta3%x, 1, c_xh)
98 call gs_xh%op(ta1%x, ta2%x, ta3%x, n, gs_op_add)
99 call rotate_cyc(ta1%x, ta2%x, ta3%x, 0, c_xh)
100
101 !OCL NORECURRENCE, NOVREC, NOALIAS
102 !DIR$ CONCURRENT
103 !GCC$ ivdep
104 !$omp parallel do
105 do i = 1,n
106 ta1%x(i,1,1,1) = ta1%x(i,1,1,1) * c_xh%Binv(i,1,1,1)
107 ta2%x(i,1,1,1) = ta2%x(i,1,1,1) * c_xh%Binv(i,1,1,1)
108 ta3%x(i,1,1,1) = ta3%x(i,1,1,1) * c_xh%Binv(i,1,1,1)
109 end do
110 !$omp end parallel do
111
112 call cdtp(wa1%x, ta1%x, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
113 call cdtp(wa2%x, ta2%x, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
114 call cdtp(wa3%x, ta3%x, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
115
116 call ax%compute(p_res%x, p%x, c_xh, p%msh, p%Xh)
117
118 !$omp parallel private (i)
119 !OCL NORECURRENCE, NOVREC, NOALIAS
120 !DIR$ CONCURRENT
121 !GCC$ ivdep
122 !$omp do
123 do i = 1,n
124 p_res%x(i,1,1,1) = (-p_res%x(i,1,1,1)) &
125 + wa1%x(i,1,1,1) + wa2%x(i,1,1,1) + wa3%x(i,1,1,1)
126 end do
127 !$omp end do
128
129 !
130 ! Surface velocity terms
131 !
132 !OCL NORECURRENCE, NOVREC, NOALIAS
133 !DIR$ CONCURRENT
134 !GCC$ ivdep
135 !$omp do
136 do i = 1,n
137 wa1%x(i,1,1,1) = 0.0_rp
138 wa2%x(i,1,1,1) = 0.0_rp
139 wa3%x(i,1,1,1) = 0.0_rp
140 end do
141 !$omp end do
142 !$omp end parallel
143
144 call bc_sym_surface%apply_surfvec(wa1%x, wa2%x, wa3%x, ta1%x, ta2%x, ta3%x,&
145 n)
146
147 dtbd = bd / dt
148 !OCL NORECURRENCE, NOVREC, NOALIAS
149 !DIR$ CONCURRENT
150 !GCC$ ivdep
151 !$omp parallel do
152 do i = 1, n
153 ta1%x(i,1,1,1) = 0.0_rp
154 ta2%x(i,1,1,1) = 0.0_rp
155 ta3%x(i,1,1,1) = 0.0_rp
156 end do
157 !$omp end parallel do
158
159 call bc_prs_surface%apply_surfvec(ta1%x, ta2%x, ta3%x, u%x, v%x, w%x, n)
160
161 !OCL NORECURRENCE, NOVREC, NOALIAS
162 !DIR$ CONCURRENT
163 !GCC$ ivdep
164 !$omp parallel do
165 do i = 1,n
166 p_res%x(i,1,1,1) = p_res%x(i,1,1,1) &
167 - (dtbd * (ta1%x(i,1,1,1) + ta2%x(i,1,1,1) + ta3%x(i,1,1,1)))&
168 - (wa1%x(i,1,1,1) + wa2%x(i,1,1,1) + wa3%x(i,1,1,1))
169 end do
170 !$omp end parallel do
171
172 call neko_scratch_registry%relinquish_field(temp_indices)
173
174 end subroutine pnpn_prs_res_cpu_compute
175
176 subroutine pnpn_vel_res_cpu_compute(Ax, u, v, w, u_res, v_res, w_res, &
177 p, f_x, f_y, f_z, c_Xh, msh, Xh, mu, rho, bd, dt, n)
178 class(ax_t), intent(in) :: Ax
179 type(mesh_t), intent(inout) :: msh
180 type(space_t), intent(inout) :: Xh
181 type(field_t), intent(inout) :: p, u, v, w
182 type(field_t), intent(inout) :: u_res, v_res, w_res
183 type(field_t), intent(in) :: f_x, f_y, f_z
184 type(coef_t), intent(inout) :: c_Xh
185 type(field_t), intent(in) :: mu
186 type(field_t), intent(in) :: rho
187 real(kind=rp), intent(in) :: bd
188 real(kind=rp), intent(in) :: dt
189 real(kind=rp) :: rho_val, mu_val
190 integer :: temp_indices(3)
191 type(field_t), pointer :: ta1, ta2, ta3
192 integer, intent(in) :: n
193 integer :: i
194
195 ! We assume the material properties are constant
196 rho_val = rho%x(1,1,1,1)
197 mu_val = mu%x(1,1,1,1)
198
199 !OCL NORECURRENCE, NOVREC, NOALIAS
200 !DIR$ CONCURRENT
201 !GCC$ ivdep
202 !$omp parallel do
203 do i = 1, n
204 c_xh%h1(i,1,1,1) = mu_val
205 c_xh%h2(i,1,1,1) = rho_val * bd / dt
206 end do
207 !$omp end parallel do
208 c_xh%ifh2 = .true.
209
210 call ax%compute(u_res%x, u%x, c_xh, msh, xh)
211 call ax%compute(v_res%x, v%x, c_xh, msh, xh)
212 call ax%compute(w_res%x, w%x, c_xh, msh, xh)
213 call neko_scratch_registry%request_field(ta1, temp_indices(1), .false.)
214 call neko_scratch_registry%request_field(ta2, temp_indices(2), .false.)
215 call neko_scratch_registry%request_field(ta3, temp_indices(3), .false.)
216
217 call opgrad(ta1%x, ta2%x, ta3%x, p%x, c_xh)
218
219 !OCL NORECURRENCE, NOVREC, NOALIAS
220 !DIR$ CONCURRENT
221 !GCC$ ivdep
222 !$omp parallel do
223 do i = 1, n
224 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)
225 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)
226 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)
227 end do
228 !$omp end parallel do
229
230 call neko_scratch_registry%relinquish_field(temp_indices)
231
232 end subroutine pnpn_vel_res_cpu_compute
233
234end 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:519
subroutine, public invers2(a, b, n)
Compute inverted vector .
Definition math.f90:800
subroutine, public copy(a, b, n)
Copy a vector .
Definition math.f90:291
subroutine, public rzero(a, n)
Zero a real vector.
Definition math.f90:235
Defines a mesh.
Definition mesh.f90:34
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
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:62
Dirichlet condition in facet normal direction.
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:63