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~3~~CallsGraph proc~prolong_set_buffer~3 prolong_set_buffer proc~mg_get_child_offset~3 mg_get_child_offset proc~prolong_set_buffer~3->proc~mg_get_child_offset~3

Called by

proc~~prolong_set_buffer~3~~CalledByGraph proc~prolong_set_buffer~3 prolong_set_buffer proc~mg_prolong~3 mg_prolong proc~mg_prolong~3->proc~prolong_set_buffer~3 proc~correct_children~3 correct_children proc~correct_children~3->proc~mg_prolong~3 proc~mg_fas_fmg~3 mg_fas_fmg proc~mg_fas_fmg~3->proc~correct_children~3 proc~mg_fas_vcycle~3 mg_fas_vcycle proc~mg_fas_fmg~3->proc~mg_fas_vcycle~3 proc~mg_fas_vcycle~3->proc~correct_children~3 proc~diffusion_solve_acoeff~3 diffusion_solve_acoeff proc~diffusion_solve_acoeff~3->proc~mg_fas_fmg~3 proc~diffusion_solve_acoeff~3->proc~mg_fas_vcycle~3 proc~diffusion_solve_vcoeff~3 diffusion_solve_vcoeff proc~diffusion_solve_vcoeff~3->proc~mg_fas_fmg~3 proc~diffusion_solve_vcoeff~3->proc~mg_fas_vcycle~3 proc~diffusion_solve~3 diffusion_solve proc~diffusion_solve~3->proc~mg_fas_fmg~3 proc~diffusion_solve~3->proc~mg_fas_vcycle~3

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(3)
    integer                   :: i_c, c_id, c_rank, dsize
    real(dp)                  :: tmp(nc, nc, nc)

    dsize = nc**3

    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