prolong_set_buffer Subroutine

private subroutine prolong_set_buffer(mg, id, nc, iv, method)

In case the fine grid is on a different CPU, perform the prolongation and store the fine-grid values in the send buffer.

Todo

Check whether it's faster to send coarse data and prolong afterwards

Arguments

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

Calls

proc~~prolong_set_buffer~2~~CallsGraph proc~prolong_set_buffer~2 prolong_set_buffer proc~mg_get_child_offset~2 mg_get_child_offset proc~prolong_set_buffer~2->proc~mg_get_child_offset~2

Called by

proc~~prolong_set_buffer~2~~CalledByGraph proc~prolong_set_buffer~2 prolong_set_buffer proc~mg_prolong~2 mg_prolong proc~mg_prolong~2->proc~prolong_set_buffer~2 proc~correct_children~2 correct_children proc~correct_children~2->proc~mg_prolong~2 proc~mg_fas_fmg~2 mg_fas_fmg proc~mg_fas_fmg~2->proc~correct_children~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~correct_children~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 prolong_set_buffer(mg, id, nc, iv, method)
    type(mg_t), intent(inout) :: mg
    integer, intent(in)       :: id
    integer, intent(in)       :: nc
    integer, intent(in)       :: iv
    procedure(mg_box_prolong) :: method
    integer                   :: i, dix(1)
    integer                   :: i_c, c_id, c_rank, dsize
    real(dp)                  :: tmp(nc)

    dsize = nc**1

    do i_c = 1, mg_num_children
       c_id = mg%boxes(id)%children(i_c)
       if (c_id > mg_no_box) then
          c_rank = mg%boxes(c_id)%rank
          if (c_rank /= mg%my_rank) then
             dix = mg_get_child_offset(mg, c_id)
             call method(mg, id, dix, nc, iv, tmp)

             i   = mg%buf(c_rank)%i_send
             mg%buf(c_rank)%send(i+1:i+dsize) = pack(tmp, .true.)
             mg%buf(c_rank)%i_send  = mg%buf(c_rank)%i_send + dsize

             i                      = mg%buf(c_rank)%i_ix
             mg%buf(c_rank)%ix(i+1) = c_id
             mg%buf(c_rank)%i_ix    = mg%buf(c_rank)%i_ix + 1
          end if
       end if
    end do
  end subroutine prolong_set_buffer