diff --git a/src/LIB/SURCOUCHE/src/mode_scatter.f90 b/src/LIB/SURCOUCHE/src/mode_scatter.f90 index cc933744a2052426508949c9405c1be67f898089..dc97e3b51598a8164bc4b2e48e8c85ea3da1b602 100644 --- a/src/LIB/SURCOUCHE/src/mode_scatter.f90 +++ b/src/LIB/SURCOUCHE/src/mode_scatter.f90 @@ -23,7 +23,8 @@ MODULE MODE_SCATTER_ll ! ! J.Escobar 10/02/2012 : Bug , in MPI_RECV replace MPI_STATUSES_IGNORE ! with MPI_STATUS_IGNORE -! +! J.Escobar 21/07/2020 : For reduction of MPI_BUFFER_SIZE , in SCATTERXY_X3 replace MPI_BSEND -> MPI_ISEND +! USE MODD_MPIF @@ -469,6 +470,7 @@ END SUBROUTINE SCATTERXY_X2 SUBROUTINE SCATTERXY_X3(PSEND,PRECV,KROOT,KCOMM) USE MODD_IO_ll, ONLY : ISP, ISNPROC +USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) :: PSEND REAL,DIMENSION(:,:,:), INTENT(INOUT):: PRECV @@ -478,26 +480,46 @@ INTEGER, INTENT(IN) :: KCOMM !INCLUDE 'mpif.h' INTEGER :: IERR -INTEGER :: JI +INTEGER :: JI,JKU INTEGER :: IXO,IXE,IYO,IYE REAL,DIMENSION(:,:,:), POINTER :: TX3DP !INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS + +INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB +INTEGER :: NB_REQ +TYPE TX_3DP + REAL,DIMENSION(:,:,:), POINTER :: X +END TYPE TX_3DP +TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP + +JKU = SIZE(PSEND,3) IF (ISP == KROOT) THEN - DO JI = 1,ISNPROC - CALL GET_DOMREAD_ll(JI,IXO,IXE,IYO,IYE) - TX3DP=>PSEND(IXO:IXE,IYO:IYE,:) - - IF (ISP /= JI) THEN - CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MPI_FLOAT,JI-1,199+KROOT,KCOMM& - & ,IERR) - ELSE - PRECV(:,:,:) = TX3DP(:,:,:) - END IF - END DO + NB_REQ=0 + ALLOCATE(REQ_TAB(ISNPROC-1)) + ALLOCATE(T_TX3DP(ISNPROC-1)) + DO JI = 1,ISNPROC + CALL GET_DOMREAD_ll(JI,IXO,IXE,IYO,IYE) + TX3DP=>PSEND(IXO:IXE,IYO:IYE,:) + IF (ISP /= JI) THEN + NB_REQ = NB_REQ + 1 + ALLOCATE(T_TX3DP(NB_REQ)%X(IXO:IXE,IYO:IYE,JKU)) + T_TX3DP(NB_REQ)%X=TX3DP + CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,199+KROOT,KCOMM& + & ,REQ_TAB(NB_REQ),IERR) + !CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MPI_FLOAT,JI-1,199+KROOT,KCOMM& + ! & ,IERR) + ELSE + PRECV(:,:,:) = TX3DP(:,:,:) + END IF + END DO + IF (NB_REQ .GT.0 ) THEN + CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) + DO JI=1,NB_REQ ; DEALLOCATE(T_TX3DP(JI)%X) ; ENDDO + END IF ELSE - CALL MPI_RECV(PRECV,SIZE(PRECV),MPI_FLOAT,KROOT-1,199+KROOT,KCOMM& - & ,MPI_STATUS_IGNORE,IERR) + CALL MPI_RECV(PRECV,SIZE(PRECV),MPI_FLOAT,KROOT-1,199+KROOT,KCOMM& + & ,MPI_STATUS_IGNORE,IERR) END IF END SUBROUTINE SCATTERXY_X3