Find on MPI rank 'toRank' MAX/MIN/SUM of 1D array (assumed-shape) across all MPI ranks (nonblocking).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(inout) | :: | arr(:) | |||
| character(len=3), | intent(in) | :: | parOP | |||
| integer, | intent(in) | :: | toRank | |||
| integer, | intent(out) | :: | req_out |
SUBROUTINE par_IReduce_array1D(arr,parOP,toRank,req_out) ! MODULES USE MODgvec_Globals, ONLY : wp,myRank IMPLICIT NONE !-------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES REAL(wp), INTENT(INOUT) :: arr(:) CHARACTER(LEN=3), INTENT(IN) :: parOP INTEGER, INTENT(IN) :: toRank ! =0 by default MPI_request_TYPE, INTENT(OUT) :: req_out !-------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES # if MPI MPI_op_TYPE :: mpiOP INTEGER :: ierr INTEGER :: sz !================================================================================================================================ ! BODY sz=SIZE(arr) SELECT CASE(parOP) CASE('MAX') mpiOP=MPI_MAX CASE('MIN') mpiOP=MPI_MIN CASE('SUM') mpiOP=MPI_SUM END SELECT IF (myRank.EQ.toRank) THEN CALL MPI_IReduce(MPI_IN_PLACE, arr, sz, dType, mpiOP, toRank, worldComm, req_out, ierr) ELSE CALL MPI_IReduce(arr, arr, sz, dType, mpiOP, toRank, worldComm, req_out, ierr) END IF # else req_out = 0 # endif END SUBROUTINE par_IReduce_array1D