152 ext_bdf, gs_Xh, c_Xh, rho, mu, bd, dt, &
153 bclst_dp, bclst_du, bclst_dv, bclst_dw, bclst_vel_res, &
154 Ax_vel, Ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, vel_max_iter)
156 type(
field_t),
intent(inout) :: u_res, v_res, w_res, p_res
157 type(
coef_t),
intent(inout) :: c_Xh
158 type(
gs_t),
intent(inout) :: gs_Xh
160 type(
bc_list_t),
intent(inout) :: bclst_dp, bclst_du, bclst_dv, bclst_dw
161 type(
bc_list_t),
intent(inout) :: bclst_vel_res
162 class(
ax_t),
intent(in) :: Ax_vel
163 class(
ax_t),
intent(in) :: Ax_prs
164 class(
ksp_t),
intent(inout) :: ksp_prs, ksp_vel
165 class(
pc_t),
intent(inout) :: pc_prs, pc_vel
166 real(kind=
rp),
intent(in) :: bd
167 real(kind=
rp),
intent(in) :: rho, mu, dt
168 integer,
intent(in) :: vel_max_iter, prs_max_iter
170 real(kind=
rp) :: xlmin, xlmax
171 real(kind=
rp) :: ylmin, ylmax
172 real(kind=
rp) :: zlmin, zlmax
174 type(
field_t),
pointer :: ta1, ta2, ta3
175 integer :: temp_indices(3)
177 call this%scratch%request_field(ta1, temp_indices(1))
178 call this%scratch%request_field(ta2, temp_indices(2))
179 call this%scratch%request_field(ta3, temp_indices(3))
182 associate(msh => c_xh%msh, p_vol => this%p_vol, &
183 u_vol => this%u_vol, v_vol => this%v_vol, w_vol => this%w_vol)
186 xlmin =
glmin(c_xh%dof%x, n)
187 xlmax =
glmax(c_xh%dof%x, n)
188 ylmin =
glmin(c_xh%dof%y, n)
189 ylmax =
glmax(c_xh%dof%y, n)
190 zlmin =
glmin(c_xh%dof%z, n)
191 zlmax =
glmax(c_xh%dof%z, n)
192 if (this%flow_dir .eq. 1)
then
193 this%domain_length = xlmax - xlmin
195 if (this%flow_dir .eq. 2)
then
196 this%domain_length = ylmax - ylmin
198 if (this%flow_dir .eq. 3)
then
199 this%domain_length = zlmax - zlmin
207 c_xh%h1(i,1,1,1) = 1.0_rp / rho
208 c_xh%h2(i,1,1,1) = 0.0_rp
215 if (this%flow_dir .eq. 1)
then
216 call cdtp(p_res%x, c_xh%h1, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
219 if (this%flow_dir .eq. 2)
then
220 call cdtp(p_res%x, c_xh%h1, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
223 if (this%flow_dir .eq. 3)
then
224 call cdtp(p_res%x, c_xh%h1, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
227 call gs_xh%op(p_res, gs_op_add)
228 call bclst_dp%apply_scalar(p_res%x, n)
230 ksp_results(1) = ksp_prs%solve(ax_prs, p_vol, p_res%x, n, &
231 c_xh, bclst_dp, gs_xh, prs_max_iter)
235 call opgrad(u_res%x, v_res%x, w_res%x, p_vol%x, c_xh)
244 call opchsign(u_res%x, v_res%x, w_res%x, msh%gdim, n)
245 call copy(ta1%x, c_xh%B, n)
246 call copy(ta2%x, c_xh%B, n)
247 call copy(ta3%x, c_xh%B, n)
249 call bclst_vel_res%apply_vector(ta1%x, ta2%x, ta3%x, n)
254 if (this%flow_dir .eq. 1)
then
256 else if (this%flow_dir .eq. 2)
then
258 else if (this%flow_dir .eq. 3)
then
262 if (this%flow_dir .eq. 1)
then
263 call add2(u_res%x, ta1%x, n)
264 else if (this%flow_dir .eq. 2)
then
265 call add2(v_res%x, ta2%x, n)
266 else if (this%flow_dir .eq. 3)
then
267 call add2(w_res%x, ta3%x, n)
276 c_xh%h1(i,1,1,1) = mu
277 c_xh%h2(i,1,1,1) = rho * (bd / dt)
282 call gs_xh%op(u_res, gs_op_add)
283 call gs_xh%op(v_res, gs_op_add)
284 call gs_xh%op(w_res, gs_op_add)
286 call bclst_vel_res%apply_vector(u_res%x, v_res%x, w_res%x, n)
289 ksp_results(2:4) = ksp_vel%solve_coupled(ax_vel, &
290 u_vol, v_vol, w_vol, &
291 u_res%x, v_res%x, w_res%x, &
293 bclst_du, bclst_dv, bclst_dw, &
297 if (this%flow_dir .eq. 1)
then
299 device_glsc2(u_vol%x_d, c_xh%B_d, n) / this%domain_length
302 if (this%flow_dir .eq. 2)
then
304 device_glsc2(v_vol%x_d, c_xh%B_d, n) / this%domain_length
307 if (this%flow_dir .eq. 3)
then
309 device_glsc2(w_vol%x_d, c_xh%B_d, n) / this%domain_length
312 if (this%flow_dir .eq. 1)
then
313 this%base_flow =
glsc2(u_vol%x, c_xh%B, n) / this%domain_length
316 if (this%flow_dir .eq. 2)
then
317 this%base_flow =
glsc2(v_vol%x, c_xh%B, n) / this%domain_length
320 if (this%flow_dir .eq. 3)
then
321 this%base_flow =
glsc2(w_vol%x, c_xh%B, n) / this%domain_length
326 call this%scratch%relinquish_field(temp_indices)
339 c_Xh, gs_Xh, ext_bdf, rho, mu, dt, &
340 bclst_dp, bclst_du, bclst_dv, bclst_dw, bclst_vel_res, &
341 Ax_vel, Ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, vel_max_iter)
344 type(field_t),
intent(inout) :: u, v, w, p
345 type(field_t),
intent(inout) :: u_res, v_res, w_res, p_res
346 type(coef_t),
intent(inout) :: c_Xh
347 type(gs_t),
intent(inout) :: gs_Xh
348 type(time_scheme_controller_t),
intent(in) :: ext_bdf
349 real(kind=rp),
intent(in) :: rho, mu, dt
350 type(bc_list_t),
intent(inout) :: bclst_dp, bclst_du, bclst_dv, bclst_dw
351 type(bc_list_t),
intent(inout) :: bclst_vel_res
352 class(ax_t),
intent(in) :: Ax_vel
353 class(ax_t),
intent(in) :: Ax_prs
354 class(ksp_t),
intent(inout) :: ksp_prs, ksp_vel
355 class(pc_t),
intent(inout) :: pc_prs, pc_vel
356 integer,
intent(in) :: prs_max_iter, vel_max_iter
357 real(kind=rp) :: ifcomp, flow_rate, xsec
358 real(kind=rp) :: current_flow, delta_flow, scale
359 integer :: n, ierr, i
361 associate(u_vol => this%u_vol, v_vol => this%v_vol, &
362 w_vol => this%w_vol, p_vol => this%p_vol)
371 if (dt .ne. this%dtlag .or. &
372 ext_bdf%diffusion_coeffs(1) .ne. this%bdlag)
then
377 this%bdlag = ext_bdf%diffusion_coeffs(1)
379 call mpi_allreduce(mpi_in_place, ifcomp, 1, &
380 mpi_real_precision, mpi_sum, neko_comm, ierr)
382 if (ifcomp .gt. 0d0)
then
383 call this%compute(u_res, v_res, w_res, p_res, &
384 ext_bdf, gs_xh, c_xh, rho, mu, ext_bdf%diffusion_coeffs(1), dt, &
385 bclst_dp, bclst_du, bclst_dv, bclst_dw, bclst_vel_res, &
386 ax_vel, ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, &
390 if (neko_bcknd_device .eq. 1)
then
391 if (this%flow_dir .eq. 1)
then
393 device_glsc2(u%x_d, c_xh%B_d, n) / this%domain_length
394 else if (this%flow_dir .eq. 2)
then
396 device_glsc2(v%x_d, c_xh%B_d, n) / this%domain_length
397 else if (this%flow_dir .eq. 3)
then
399 device_glsc2(w%x_d, c_xh%B_d, n) / this%domain_length
402 if (this%flow_dir .eq. 1)
then
403 current_flow = glsc2(u%x, c_xh%B, n) / this%domain_length
404 else if (this%flow_dir .eq. 2)
then
405 current_flow = glsc2(v%x, c_xh%B, n) / this%domain_length
406 else if (this%flow_dir .eq. 3)
then
407 current_flow = glsc2(w%x, c_xh%B, n) / this%domain_length
411 if (this%avflow)
then
412 xsec = c_xh%volume / this%domain_length
413 flow_rate = this%flow_rate*xsec
415 flow_rate = this%flow_rate
418 delta_flow = flow_rate - current_flow
419 scale = delta_flow / this%base_flow
421 if (neko_bcknd_device .eq. 1)
then
422 call device_add2s2(u%x_d, u_vol%x_d, scale, n)
423 call device_add2s2(v%x_d, v_vol%x_d, scale, n)
424 call device_add2s2(w%x_d, w_vol%x_d, scale, n)
425 call device_add2s2(p%x_d, p_vol%x_d, scale, n)
427 do concurrent(i = 1: n)
428 u%x(i,1,1,1) = u%x(i,1,1,1) + scale * u_vol%x(i,1,1,1)
429 v%x(i,1,1,1) = v%x(i,1,1,1) + scale * v_vol%x(i,1,1,1)
430 w%x(i,1,1,1) = w%x(i,1,1,1) + scale * w_vol%x(i,1,1,1)
431 p%x(i,1,1,1) = p%x(i,1,1,1) + scale * p_vol%x(i,1,1,1)
subroutine fluid_vol_flow(this, u, v, w, p, u_res, v_res, w_res, p_res, c_xh, gs_xh, ext_bdf, rho, mu, dt, bclst_dp, bclst_du, bclst_dv, bclst_dw, bclst_vel_res, ax_vel, ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, vel_max_iter)
Adjust flow volume.
subroutine fluid_vol_flow_compute(this, u_res, v_res, w_res, p_res, ext_bdf, gs_xh, c_xh, rho, mu, bd, dt, bclst_dp, bclst_du, bclst_dv, bclst_dw, bclst_vel_res, ax_vel, ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, vel_max_iter)
Compute flow adjustment.