Non-blocking receive of matrix data
Note
see mp_isendrecv_lv
Note
see mp_irecv_lv
Note
arrays can be pointers or assumed shape, but they must be contiguous!
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer(kind=int_8), | DIMENSION(:, :), CONTIGUOUS | :: | msgout | |||
integer, | intent(in) | :: | source | |||
type(mp_comm_type), | intent(in) | :: | comm | |||
type(mp_request_type), | intent(out) | :: | request | |||
integer, | intent(in), | optional | :: | tag |
SUBROUTINE mp_irecv_lm2(msgout, source, comm, request, tag) !! Non-blocking receive of matrix data !! @note see mp_isendrecv_lv !! @endnote !! @note see mp_irecv_lv !! @endnote !! @note !! arrays can be pointers or assumed shape, but they must be contiguous! INTEGER(KIND=int_8), DIMENSION(:, :), CONTIGUOUS :: msgout INTEGER, INTENT(IN) :: source TYPE(mp_comm_type), INTENT(IN) :: comm TYPE(mp_request_type), INTENT(out) :: request INTEGER, INTENT(in), OPTIONAL :: tag CHARACTER(LEN=*), PARAMETER :: routineN = 'mp_irecv_lm2' INTEGER :: handle, ierr #if defined(__parallel) INTEGER :: msglen, my_tag INTEGER(KIND=int_8) :: foo(1) #endif ierr = 0 CALL timeset(routineN, handle) #if defined(__parallel) my_tag = 0 IF (PRESENT(tag)) my_tag = tag msglen = SIZE(msgout, 1)*SIZE(msgout, 2) IF (msglen > 0) THEN CALL mpi_irecv(msgout, msglen, MPI_INTEGER8, source, my_tag, & comm%handle, request%handle, ierr) ELSE CALL mpi_irecv(foo, msglen, MPI_INTEGER8, source, my_tag, & comm%handle, request%handle, ierr) END IF IF (ierr /= 0) CALL mp_stop(ierr, "mpi_irecv @ "//routineN) CALL add_perf(perf_id=12, msg_size=msglen*int_8_size) #else MARK_USED(msgout) MARK_USED(source) MARK_USED(comm) MARK_USED(request) MARK_USED(tag) request = mp_request_null DBCSR_ABORT("mp_irecv called in non parallel case") #endif CALL timestop(handle) END SUBROUTINE mp_irecv_lm2