sort_and_transfer_buffers Subroutine

public subroutine sort_and_transfer_buffers(mg, dsize)

Uses

  • proc~~sort_and_transfer_buffers~3~~UsesGraph proc~sort_and_transfer_buffers~3 sort_and_transfer_buffers mpi mpi proc~sort_and_transfer_buffers~3->mpi

Arguments

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

Calls

proc~~sort_and_transfer_buffers~3~~CallsGraph proc~sort_and_transfer_buffers~3 sort_and_transfer_buffers mpi_waitall mpi_waitall proc~sort_and_transfer_buffers~3->mpi_waitall proc~mpi_irecv_wrapper mpi_irecv_wrapper proc~sort_and_transfer_buffers~3->proc~mpi_irecv_wrapper proc~mpi_isend_wrapper mpi_isend_wrapper proc~sort_and_transfer_buffers~3->proc~mpi_isend_wrapper proc~sort_sendbuf~3 sort_sendbuf proc~sort_and_transfer_buffers~3->proc~sort_sendbuf~3 mpi_irecv mpi_irecv proc~mpi_irecv_wrapper->mpi_irecv mpi_isend mpi_isend proc~mpi_isend_wrapper->mpi_isend interface~mrgrnk~3 mrgrnk proc~sort_sendbuf~3->interface~mrgrnk~3 proc~i_mrgrnk~3 I_mrgrnk interface~mrgrnk~3->proc~i_mrgrnk~3

Called by

proc~~sort_and_transfer_buffers~3~~CalledByGraph proc~sort_and_transfer_buffers~3 sort_and_transfer_buffers proc~mg_fill_ghost_cells_lvl~3 mg_fill_ghost_cells_lvl proc~mg_fill_ghost_cells_lvl~3->proc~sort_and_transfer_buffers~3 proc~mg_prolong~3 mg_prolong proc~mg_prolong~3->proc~sort_and_transfer_buffers~3 proc~mg_restrict_lvl~3 mg_restrict_lvl proc~mg_restrict_lvl~3->proc~sort_and_transfer_buffers~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~mg_fill_ghost_cells_lvl~3 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~update_coarse~3 update_coarse proc~mg_fas_fmg~3->proc~update_coarse~3 proc~mg_fas_vcycle~3->proc~mg_fill_ghost_cells_lvl~3 proc~mg_fas_vcycle~3->proc~correct_children~3 proc~smooth_boxes~3 smooth_boxes proc~mg_fas_vcycle~3->proc~smooth_boxes~3 proc~mg_fas_vcycle~3->proc~update_coarse~3 proc~mg_fill_ghost_cells~3 mg_fill_ghost_cells proc~mg_fill_ghost_cells~3->proc~mg_fill_ghost_cells_lvl~3 proc~mg_restrict~3 mg_restrict proc~mg_restrict~3->proc~mg_restrict_lvl~3 proc~smooth_boxes~3->proc~mg_fill_ghost_cells_lvl~3 proc~update_coarse~3->proc~mg_fill_ghost_cells_lvl~3 proc~update_coarse~3->proc~mg_restrict_lvl~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 proc~mg_copy_to_tree mg_copy_to_tree proc~mg_copy_to_tree->proc~mg_fill_ghost_cells~3 proc~mg_copy_to_tree->proc~mg_restrict~3

Source Code

  subroutine sort_and_transfer_buffers(mg, dsize)
    use mpi
    type(mg_t), intent(inout)    :: mg
    integer, intent(in)          :: dsize
    integer                      :: i, n_send, n_recv
    integer                      :: send_req(mg%n_cpu)
    integer                      :: recv_req(mg%n_cpu)
    integer                      :: ierr

    n_send = 0
    n_recv = 0

    do i = 0, mg%n_cpu - 1
       if (mg%buf(i)%i_send > 0) then
          n_send = n_send + 1
          call sort_sendbuf(mg%buf(i), dsize)
          call mpi_isend_wrapper(mg%buf(i)%send, mg%buf(i)%i_send, MPI_DOUBLE, i, 0,&
              mg%comm, send_req(n_send), ierr)
       end if
       if (mg%buf(i)%i_recv > 0) then
          n_recv = n_recv + 1
          call mpi_irecv_wrapper(mg%buf(i)%recv, mg%buf(i)%i_recv, MPI_DOUBLE, i, 0,&
              mg%comm, recv_req(n_recv), ierr)
       end if
    end do

    call mpi_waitall(n_recv, recv_req(1:n_recv), MPI_STATUSES_IGNORE, ierr)
    call mpi_waitall(n_send, send_req(1:n_send), MPI_STATUSES_IGNORE, ierr)

  end subroutine sort_and_transfer_buffers