diff --git a/src/LIB/SURCOUCHE/src/mode_scatter.f90 b/src/LIB/SURCOUCHE/src/mode_scatter.f90 index 32eaa729052794702023468e113cecabaa913449..36be8575d69e6482b6ffb0d16719689eaff777af 100644 --- a/src/LIB/SURCOUCHE/src/mode_scatter.f90 +++ b/src/LIB/SURCOUCHE/src/mode_scatter.f90 @@ -468,6 +468,7 @@ END SUBROUTINE SCATTERXY_X2 SUBROUTINE SCATTERXY_X3(PSEND,PRECV,KROOT,KCOMM) USE MODD_IO, ONLY: ISP, ISNPROC +USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) :: PSEND REAL,DIMENSION(:,:,:), INTENT(INOUT):: PRECV @@ -475,22 +476,43 @@ INTEGER, INTENT(IN) :: KROOT INTEGER, INTENT(IN) :: KCOMM 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),MNHREAL_MPI,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),MNHREAL_MPI,JI-1,199+KROOT,KCOMM& + & ,REQ_TAB(NB_REQ),IERR) + !CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MNHREAL_MPI,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),MNHREAL_MPI,KROOT-1,199+KROOT,KCOMM& & ,MPI_STATUS_IGNORE,IERR)