From e0f36900b47a9f44e5da08c4d5fac95c547bba85 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 12 Apr 2024 11:21:52 +0200
Subject: [PATCH] Philippe 12/04/2024: GATHERXX_N1: add support for boxes

---
 src/LIB/SURCOUCHE/src/mode_gather.f90 | 135 +++++++++++++++++++-------
 1 file changed, 98 insertions(+), 37 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_gather.f90 b/src/LIB/SURCOUCHE/src/mode_gather.f90
index 38064088a..2bc4896ff 100644
--- a/src/LIB/SURCOUCHE/src/mode_gather.f90
+++ b/src/LIB/SURCOUCHE/src/mode_gather.f90
@@ -624,63 +624,124 @@ END IF
 
 END SUBROUTINE GATHERXX_X6
 
-SUBROUTINE GATHERXX_N1(HDIR,KSEND,KRECV,KROOT,KCOMM)
-USE MODD_IO, ONLY: ISP, ISNPROC
 
-CHARACTER(LEN=*),           INTENT(IN) :: HDIR
-INTEGER,DIMENSION(:),TARGET,INTENT(IN) :: KSEND
-INTEGER,DIMENSION(:),TARGET,INTENT(INOUT):: KRECV
-INTEGER,                    INTENT(IN) :: KROOT
-INTEGER,                    INTENT(IN) :: KCOMM
+SUBROUTINE GATHERXX_N1( HDIR, KSEND, KRECV, KROOT, KCOMM, KOBOX, KEBOX )
+USE MODD_DIM_n,      ONLY: NIMAX_ll, NJMAX_ll
+USE MODD_IO,         ONLY: ISP, ISNPROC
+USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT
+USE MODD_VAR_ll,     ONLY: MNH_STATUSES_IGNORE
 
-INTEGER                         :: JI
-INTEGER                         :: IXO,IXE,IYO,IYE
-INTEGER                         :: IGXO,IGXE,IGYO,IGYE
-INTEGER, DIMENSION(:), POINTER  :: ITP
-INTEGER                         :: IERR
-INTEGER                         :: IXM, IYM
-!INTEGER, DIMENSION(MPI_STATUS_SIZE):: STATUS
+CHARACTER(LEN=*),                       INTENT(IN)    :: HDIR
+INTEGER,          DIMENSION(:), TARGET, INTENT(IN)    :: KSEND
+INTEGER,          DIMENSION(:), TARGET, INTENT(INOUT) :: KRECV
+INTEGER,                                INTENT(IN)    :: KROOT
+INTEGER,                                INTENT(IN)    :: KCOMM
+INTEGER, OPTIONAL,                      INTENT(IN)    :: KOBOX
+INTEGER, OPTIONAL,                      INTENT(IN)    :: KEBOX
 
-CALL GET_DOMWRITE_ll(KROOT,'global',IGXO,IGXE,IGYO,IGYE)
+INTEGER                        :: JI
+INTEGER                        :: IXO,IXE,IYO,IYE
+INTEGER                        :: IGXO,IGXE,IGYO,IGYE
+INTEGER                        :: IXORBOX, IXENDBOX, IYORBOX, IYENDBOX
+INTEGER, DIMENSION(:), POINTER :: IP
+INTEGER                        :: IERR
+INTEGER                        :: IXM, IYM
+!INTEGER, DIMENSION(MPI_STATUS_SIZE)   :: STATUS
+INTEGER                        :: REQ(1)
+INTEGER                        :: NB_REQ
+LOGICAL                        :: GBOX
+
+GBOX = .FALSE.
+
+IF ( PRESENT(KOBOX) .AND. PRESENT(KEBOX) ) THEN
+  GBOX = .TRUE.
+  IF ( HDIR == 'XX' ) THEN
+    IXORBOX  = KOBOX
+    IXENDBOX = KEBOX
+    IYORBOX  = 1
+    IYENDBOX = NJMAX_ll + 2 * JPHEXT
+  ELSE IF ( HDIR == 'YY' ) THEN
+    IXORBOX  = 1
+    IXENDBOX = NIMAX_ll + 2 * JPHEXT
+    IYORBOX  = KOBOX
+    IYENDBOX = KEBOX
+  ELSE
+    !Nothing to do
+  END IF
+END IF
 
+IF ( GBOX ) THEN
+  CALL GET_DOMWRITE_ll( KROOT, 'global', IGXO, IGXE, IGYO, IGYE,                               &
+                        KXORBOX=IXORBOX, KXENDBOX=IXENDBOX, KYORBOX=IYORBOX, KYENDBOX=IYENDBOX )
+ELSE
+  CALL GET_DOMWRITE_ll( KROOT, 'global', IGXO, IGXE, IGYO, IGYE )
+END IF
 IXM = (IGXE+IGXO)/2
 IYM = (IGYE+IGYO)/2
 
 IF (ISP == KROOT)  THEN
   ! I/O proc case
   DO JI=1,ISNPROC
-    CALL GET_DOMWRITE_ll(JI,'global',IGXO,IGXE,IGYO,IGYE)
-    CALL GET_DOMWRITE_ll(JI,'local',IXO,IXE,IYO,IYE)
-    
+    IF ( GBOX ) THEN
+      CALL GET_DOMWRITE_ll( JI, 'global',IGXO, IGXE, IGYO, IGYE,                                   &
+                            KXORBOX=IXORBOX, KXENDBOX=IXENDBOX, KYORBOX=IYORBOX, KYENDBOX=IYENDBOX )
+      CALL GET_DOMWRITE_ll( JI, 'local', IXO,  IXE,  IYO,  IYE,                                    &
+                            KXORBOX=IXORBOX, KXENDBOX=IXENDBOX, KYORBOX=IYORBOX, KYENDBOX=IYENDBOX )
+    ELSE
+      CALL GET_DOMWRITE_ll( JI, 'global',IGXO, IGXE, IGYO, IGYE )
+      CALL GET_DOMWRITE_ll( JI, 'local', IXO,  IXE,  IYO,  IYE  )
+    END IF
+
     IF (HDIR == 'XX' .AND. IYM <= IGYE .AND. IYM >= IGYO) THEN
-      ITP=>KRECV(IGXO:IGXE)
-      IF (JI == KROOT) THEN 
-        ITP = KSEND(IXO:IXE)
-      ELSE 
-        CALL MPI_RECV(ITP,SIZE(ITP),MNHINT_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      IF ( IXO /= 0 ) THEN ! intersection is not empty
+        IP=>KRECV(IGXO:IGXE)
+        IF (JI == KROOT) THEN
+          IP = KSEND(IXO:IXE)
+        ELSE
+          CALL MPI_RECV(IP,SIZE(IP),MNHINT_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+        END IF
       END IF
 
-    ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN 
-      ITP=>KRECV(IGYO:IGYE)
-      IF (JI==KROOT) THEN 
-        ITP = KSEND(IYO:IYE)
-      ELSE 
-        CALL MPI_RECV(ITP,SIZE(ITP),MNHINT_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+    ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN
+      IF ( IYO /= 0 ) THEN ! intersection is not empty
+        IP=>KRECV(IGYO:IGYE)
+        IF (JI==KROOT) THEN
+          IP = KSEND(IYO:IYE)
+        ELSE
+          CALL MPI_RECV(IP,SIZE(IP),MNHINT_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+        END IF
       END IF
     END IF
   END DO
 
-ELSE 
+ELSE
   ! Other processes
-  CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
-  CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
-  
+  IF ( GBOX ) THEN
+    CALL GET_DOMWRITE_ll( ISP, 'global',IGXO, IGXE, IGYO, IGYE,                                  &
+                          KXORBOX=IXORBOX, KXENDBOX=IXENDBOX, KYORBOX=IYORBOX, KYENDBOX=IYENDBOX )
+    CALL GET_DOMWRITE_ll( ISP, 'local', IXO,  IXE,  IYO,  IYE,                                   &
+                          KXORBOX=IXORBOX, KXENDBOX=IXENDBOX, KYORBOX=IYORBOX, KYENDBOX=IYENDBOX )
+  ELSE
+    CALL GET_DOMWRITE_ll( ISP, 'global',IGXO, IGXE, IGYO, IGYE )
+    CALL GET_DOMWRITE_ll( ISP, 'local', IXO,  IXE,  IYO,  IYE  )
+  END IF
+
   IF (HDIR == 'XX' .AND. IYM <= IGYE .AND. IYM >= IGYO) THEN
-    ITP=>KSEND(IXO:IXE)
-    CALL MPI_BSEND(ITP,SIZE(ITP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+    IF ( IXO /= 0 ) THEN ! intersection is not empty
+      IP=>KSEND(IXO:IXE)
+      NB_REQ = 1
+      CALL MPI_ISEND(IP,SIZE(IP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,REQ(NB_REQ),IERR)
+      CALL MPI_WAITALL(NB_REQ,REQ,MNH_STATUSES_IGNORE,IERR)
+      !CALL MPI_BSEND(XP,SIZE(XP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+    END IF
   ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN
-    ITP=>KSEND(IYO:IYE)
-    CALL MPI_BSEND(ITP,SIZE(ITP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+    IF ( IYO /= 0 ) THEN ! intersection is not empty
+      IP=>KSEND(IYO:IYE)
+      NB_REQ = 1
+      CALL MPI_ISEND(IP,SIZE(IP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,REQ(NB_REQ),IERR)
+      CALL MPI_WAITALL(NB_REQ,REQ,MNH_STATUSES_IGNORE,IERR)
+      !CALL MPI_BSEND(XP,SIZE(XP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+    END IF
   END IF
 END IF
 
-- 
GitLab