154       ext_bdf, gs_Xh, c_Xh, rho, mu, bd, dt, &
 
  155       bclst_dp, bclst_du, bclst_dv, bclst_dw, bclst_vel_res, &
 
  156       Ax_vel, Ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, vel_max_iter)
 
  158    type(
field_t), 
intent(inout) :: u_res, v_res, w_res, p_res
 
  159    type(
coef_t), 
intent(inout) :: c_Xh
 
  160    type(
gs_t), 
intent(inout) :: gs_Xh
 
  162    type(
bc_list_t), 
intent(inout) :: bclst_dp, bclst_du, bclst_dv, bclst_dw
 
  163    type(
bc_list_t), 
intent(inout) :: bclst_vel_res
 
  164    class(
ax_t), 
intent(in) :: Ax_vel
 
  165    class(
ax_t), 
intent(in) :: Ax_prs
 
  166    class(
ksp_t), 
intent(inout) :: ksp_prs, ksp_vel
 
  167    class(
pc_t), 
intent(inout) :: pc_prs, pc_vel
 
  168    real(kind=
rp), 
intent(in) :: bd
 
  169    real(kind=
rp), 
intent(in) :: rho, dt
 
  171    integer, 
intent(in) :: vel_max_iter, prs_max_iter
 
  173    real(kind=
rp) :: xlmin, xlmax
 
  174    real(kind=
rp) :: ylmin, ylmax
 
  175    real(kind=
rp) :: zlmin, zlmax
 
  177    type(
field_t), 
pointer :: ta1, ta2, ta3
 
  178    integer :: temp_indices(3)
 
  180    call this%scratch%request_field(ta1, temp_indices(1))
 
  181    call this%scratch%request_field(ta2, temp_indices(2))
 
  182    call this%scratch%request_field(ta3, temp_indices(3))
 
  185    associate(msh => c_xh%msh, p_vol => this%p_vol, &
 
  186         u_vol => this%u_vol, v_vol => this%v_vol, w_vol => this%w_vol)
 
  189      xlmin = 
glmin(c_xh%dof%x, n)
 
  190      xlmax = 
glmax(c_xh%dof%x, n)
 
  191      ylmin = 
glmin(c_xh%dof%y, n) 
 
  192      ylmax = 
glmax(c_xh%dof%y, n)
 
  193      zlmin = 
glmin(c_xh%dof%z, n) 
 
  194      zlmax = 
glmax(c_xh%dof%z, n)
 
  195      if (this%flow_dir .eq. 1) 
then 
  196         this%domain_length = xlmax - xlmin
 
  198      if (this%flow_dir .eq. 2) 
then 
  199         this%domain_length = ylmax - ylmin
 
  201      if (this%flow_dir .eq. 3) 
then 
  202         this%domain_length = zlmax - zlmin
 
  210            c_xh%h1(i,1,1,1) = 1.0_rp / rho
 
  211            c_xh%h2(i,1,1,1) = 0.0_rp
 
  218      if (this%flow_dir .eq. 1) 
then 
  219         call cdtp(p_res%x, c_xh%h1, c_xh%drdx, c_xh%dsdx, c_xh%dtdx, c_xh)
 
  222      if (this%flow_dir .eq. 2) 
then 
  223         call cdtp(p_res%x, c_xh%h1, c_xh%drdy, c_xh%dsdy, c_xh%dtdy, c_xh)
 
  226      if (this%flow_dir .eq. 3) 
then 
  227         call cdtp(p_res%x, c_xh%h1, c_xh%drdz, c_xh%dsdz, c_xh%dtdz, c_xh)
 
  230      call gs_xh%op(p_res, gs_op_add)
 
  231      call bclst_dp%apply_scalar(p_res%x, n)
 
  233      ksp_results(1) = ksp_prs%solve(ax_prs, p_vol, p_res%x, n, &
 
  234           c_xh, bclst_dp, gs_xh, prs_max_iter)
 
  238      call opgrad(u_res%x, v_res%x, w_res%x, p_vol%x, c_xh)
 
  246         call opchsign(u_res%x, v_res%x, w_res%x, msh%gdim, n)
 
  247         call copy(ta1%x, c_xh%B, n)
 
  248         call copy(ta2%x, c_xh%B, n)
 
  249         call copy(ta3%x, c_xh%B, n)
 
  251      call bclst_vel_res%apply_vector(ta1%x, ta2%x, ta3%x, n)
 
  256         if (this%flow_dir .eq. 1) 
then 
  258         else if (this%flow_dir .eq. 2) 
then 
  260         else if (this%flow_dir .eq. 3) 
then 
  264         if (this%flow_dir .eq. 1) 
then 
  265            call add2(u_res%x, ta1%x, n)
 
  266         else if (this%flow_dir .eq. 2) 
then 
  267            call add2(v_res%x, ta2%x, n)
 
  268         else if (this%flow_dir .eq. 3) 
then 
  269            call add2(w_res%x, ta3%x, n)
 
  277         call copy(c_xh%h1, mu%x, n)
 
  278         c_xh%h2 = 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, dt
 
  351    type(bc_list_t), 
intent(inout) :: bclst_dp, bclst_du, bclst_dv, bclst_dw
 
  352    type(bc_list_t), 
intent(inout) :: bclst_vel_res
 
  353    class(ax_t), 
intent(in) :: Ax_vel
 
  354    class(ax_t), 
intent(in) :: Ax_prs
 
  355    class(ksp_t), 
intent(inout) :: ksp_prs, ksp_vel
 
  356    class(pc_t), 
intent(inout) :: pc_prs, pc_vel
 
  357    integer, 
intent(in) :: prs_max_iter, vel_max_iter
 
  358    real(kind=rp) :: ifcomp, flow_rate, xsec
 
  359    real(kind=rp) :: current_flow, delta_flow, scale
 
  360    integer :: n, ierr, i
 
  362    associate(u_vol => this%u_vol, v_vol => this%v_vol, &
 
  363         w_vol => this%w_vol, p_vol => this%p_vol)
 
  372      if ((.not. abscmp(dt, this%dtlag)) .or. &
 
  373          (.not. abscmp(ext_bdf%diffusion_coeffs(1), this%bdlag))) 
then 
  378      this%bdlag = ext_bdf%diffusion_coeffs(1)
 
  380      call mpi_allreduce(mpi_in_place, ifcomp, 1, &
 
  381           mpi_real_precision, mpi_sum, neko_comm, ierr)
 
  383      if (ifcomp .gt. 0d0) 
then 
  384         call this%compute(u_res, v_res, w_res, p_res, &
 
  385              ext_bdf, gs_xh, c_xh, rho, mu, ext_bdf%diffusion_coeffs(1), dt, &
 
  386              bclst_dp, bclst_du, bclst_dv, bclst_dw, bclst_vel_res, &
 
  387              ax_vel, ax_prs, ksp_prs, ksp_vel, pc_prs, pc_vel, prs_max_iter, &
 
  391      if (neko_bcknd_device .eq. 1) 
then 
  392         if (this%flow_dir .eq. 1) 
then 
  394                 device_glsc2(u%x_d, c_xh%B_d, n) / this%domain_length 
 
  395         else if (this%flow_dir .eq. 2) 
then 
  397                 device_glsc2(v%x_d, c_xh%B_d, n) / this%domain_length 
 
  398         else if (this%flow_dir .eq. 3) 
then 
  400                 device_glsc2(w%x_d, c_xh%B_d, n) / this%domain_length 
 
  403         if (this%flow_dir .eq. 1) 
then 
  404            current_flow = glsc2(u%x, c_xh%B, n) / this%domain_length 
 
  405         else if (this%flow_dir .eq. 2) 
then 
  406            current_flow = glsc2(v%x, c_xh%B, n) / this%domain_length 
 
  407         else if (this%flow_dir .eq. 3) 
then 
  408            current_flow = glsc2(w%x, c_xh%B, n) / this%domain_length 
 
  412      if (this%avflow) 
then 
  413         xsec = c_xh%volume / this%domain_length
 
  414         flow_rate = this%flow_rate*xsec
 
  416         flow_rate = this%flow_rate
 
  419      delta_flow = flow_rate - current_flow
 
  420      scale = delta_flow / this%base_flow
 
  422      if (neko_bcknd_device .eq. 1) 
then 
  423         call device_add2s2(u%x_d, u_vol%x_d, scale, n)
 
  424         call device_add2s2(v%x_d, v_vol%x_d, scale, n)
 
  425         call device_add2s2(w%x_d, w_vol%x_d, scale, n)
 
  426         call device_add2s2(p%x_d, p_vol%x_d, scale, n)
 
  428         do concurrent(i = 1: n)
 
  429            u%x(i,1,1,1) = u%x(i,1,1,1) + scale * u_vol%x(i,1,1,1)
 
  430            v%x(i,1,1,1) = v%x(i,1,1,1) + scale * v_vol%x(i,1,1,1)
 
  431            w%x(i,1,1,1) = w%x(i,1,1,1) + scale * w_vol%x(i,1,1,1)
 
  432            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.