restrict_set_buffer Subroutine

private subroutine restrict_set_buffer(mg, id, iv)

Arguments

Type IntentOptional Attributes Name
type(mg_t), intent(inout) :: mg
integer, intent(in) :: id
integer, intent(in) :: iv

Calls

proc~~restrict_set_buffer~2~~CallsGraph proc~restrict_set_buffer~2 restrict_set_buffer proc~mg_ix_to_ichild~2 mg_ix_to_ichild proc~restrict_set_buffer~2->proc~mg_ix_to_ichild~2

Called by

proc~~restrict_set_buffer~2~~CalledByGraph proc~restrict_set_buffer~2 restrict_set_buffer proc~mg_restrict_lvl~2 mg_restrict_lvl proc~mg_restrict_lvl~2->proc~restrict_set_buffer~2 proc~mg_restrict~2 mg_restrict proc~mg_restrict~2->proc~mg_restrict_lvl~2 proc~update_coarse~2 update_coarse proc~update_coarse~2->proc~mg_restrict_lvl~2 proc~mg_fas_fmg~2 mg_fas_fmg proc~mg_fas_fmg~2->proc~update_coarse~2 proc~mg_fas_vcycle~2 mg_fas_vcycle proc~mg_fas_fmg~2->proc~mg_fas_vcycle~2 proc~mg_fas_vcycle~2->proc~update_coarse~2 proc~diffusion_solve_acoeff~2 diffusion_solve_acoeff proc~diffusion_solve_acoeff~2->proc~mg_fas_fmg~2 proc~diffusion_solve_acoeff~2->proc~mg_fas_vcycle~2 proc~diffusion_solve_vcoeff~2 diffusion_solve_vcoeff proc~diffusion_solve_vcoeff~2->proc~mg_fas_fmg~2 proc~diffusion_solve_vcoeff~2->proc~mg_fas_vcycle~2 proc~diffusion_solve~2 diffusion_solve proc~diffusion_solve~2->proc~mg_fas_fmg~2 proc~diffusion_solve~2->proc~mg_fas_vcycle~2

Source Code

  subroutine restrict_set_buffer(mg, id, iv)
    type(mg_t), intent(inout) :: mg
    integer, intent(in)          :: id
    integer, intent(in)          :: iv
    integer                      :: i, n, hnc, p_id, p_rank
    real(dp) :: tmp(mg%box_size/2)

    hnc    = mg%box_size/2
    p_id   = mg%boxes(id)%parent
    p_rank = mg%boxes(p_id)%rank

    if (p_rank /= mg%my_rank) then
       do i = 1, hnc
          tmp(i) = 0.5_dp * sum(mg%boxes(id)%cc(2*i-1:2*i, iv))
       end do

       ! Buffer
       n = size(tmp)
       i = mg%buf(p_rank)%i_send
       mg%buf(p_rank)%send(i+1:i+n) = pack(tmp, .true.)
       mg%buf(p_rank)%i_send = mg%buf(p_rank)%i_send + n

       ! To later sort the send buffer according to parent order
       i = mg%buf(p_rank)%i_ix
       n = mg_ix_to_ichild(mg%boxes(id)%ix)
       mg%buf(p_rank)%ix(i+1) = mg_num_children * p_id + n
       mg%buf(p_rank)%i_ix = mg%buf(p_rank)%i_ix + 1
    end if
  end subroutine restrict_set_buffer