From 384081e1f586ef62a803c3daf1f6623c144b8c45 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 16 Apr 2018 15:54:04 +0200
Subject: [PATCH] Philippe 16/04/2018: IO: bug corrections for
 IO_READ_FIELD_BYFIELD_X3 (split files) * REQ_TAB and T_TX2DP too small if
 less processes than split files * missing broadcast if split files (deadlock
 if IRESP/=0)

---
 src/LIB/SURCOUCHE/src/fmread_ll.f90 | 35 +++++++++++++++++------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/fmread_ll.f90 b/src/LIB/SURCOUCHE/src/fmread_ll.f90
index e34349b57..f00bbb7bc 100644
--- a/src/LIB/SURCOUCHE/src/fmread_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmread_ll.f90
@@ -519,7 +519,7 @@ TYPE TX_2DP
    REAL,DIMENSION(:,:), POINTER :: X
 END TYPE TX_2DP
 !
-INTEGER                               :: IERR,IRESP
+INTEGER                               :: IERR,IRESP,IRESP_TMP
 INTEGER                               :: IHEXTOT
 INTEGER                               :: IK_FILE,IK_RANK,INB_PROC_REAL,JK_MAX
 INTEGER                               :: JI,IXO,IXE,IYO,IYE
@@ -657,11 +657,11 @@ IF (IRESP==0) THEN
         WRITE(YK,'(I4.4)')  JKK
         YRECZSLICE = TRIM(TPFIELD%CMNHNAME)//YK
         IF (TPFILE%CFORMAT=='NETCDF4') THEN
-          CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
+          CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
         ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-          CALL IO_READ_FIELD_LFI(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
+          CALL IO_READ_FIELD_LFI(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
         ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-          CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
+          CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
         END IF
         CALL SECOND_MNH2(T1)
         TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0
@@ -676,6 +676,9 @@ IF (IRESP==0) THEN
     END DO
     CALL GA_SYNC
     !
+    CALL MPI_BCAST(IRESP_TMP,1,MPI_INTEGER,IK_RANK-1,TZFILE%NMPICOMM,IERR)
+    IF (IRESP_TMP/=0) IRESP = IRESP_TMP !Keep last "error"
+    !
     ! get the columun data in this proc
     !
     ! temp buf to avoid problem with none stride PFIELDS buffer  with HALO
@@ -687,6 +690,8 @@ IF (IRESP==0) THEN
     ALLOCATE(ZSLICE_ll(0,0))
     GALLOC_ll = .TRUE.
     INB_PROC_REAL = MIN(TPFILE%NSUBFILES_IOZ,ISNPROC)
+    ALLOCATE(REQ_TAB((ISNPROC-1)*INB_PROC_REAL))
+    ALLOCATE(T_TX2DP((ISNPROC-1)*INB_PROC_REAL))
     Z_SLICE: DO JK=1,SIZE(PFIELD,3),INB_PROC_REAL
       !
       ! read the data
@@ -694,8 +699,6 @@ IF (IRESP==0) THEN
       JK_MAX=MIN(SIZE(PFIELD,3),JK+INB_PROC_REAL-1)
       !
       NB_REQ=0
-      ALLOCATE(REQ_TAB(ISNPROC-1))
-      ALLOCATE(T_TX2DP(ISNPROC-1))
       DO JKK=JK,JK_MAX
         IF (TPFILE%NSUBFILES_IOZ .GT. 1 ) THEN
           IK_FILE = IO_FILE(JKK,TPFILE%NSUBFILES_IOZ)
@@ -719,12 +722,12 @@ IF (IRESP==0) THEN
           CALL SECOND_MNH2(T0)
           WRITE(YK,'(I4.4)')  JKK
           YRECZSLICE = TRIM(TPFIELD%CMNHNAME)//YK
-          IF (TPFILE%CFORMAT=='NETCDF4') THEN
-            CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
-          ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-            CALL IO_READ_FIELD_LFI(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
-          ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-            CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
+          IF (TZFILE%CFORMAT=='NETCDF4') THEN
+            CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
+          ELSE IF (TZFILE%CFORMAT=='LFI') THEN
+            CALL IO_READ_FIELD_LFI(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
+          ELSE IF (TZFILE%CFORMAT=='LFICDF4') THEN
+            CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
           END IF
           CALL SECOND_MNH2(T1)
           TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0
@@ -745,6 +748,9 @@ IF (IRESP==0) THEN
           CALL SECOND_MNH2(T2)
           TIMEZ%T_READ3D_SEND=TIMEZ%T_READ3D_SEND + T2 - T1
         END IF
+        !
+        CALL MPI_BCAST(IRESP_TMP,1,MPI_INTEGER,IK_RANK-1,TZFILE%NMPICOMM,IERR)
+        IF (IRESP_TMP/=0) IRESP = IRESP_TMP !Keep last "error"
         TZFILE => NULL()
       END DO
       !
@@ -799,12 +805,13 @@ IF (IRESP==0) THEN
         CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR)
         DO JI=1,NB_REQ ;  DEALLOCATE(T_TX2DP(JI)%X) ; ENDDO
       END IF
-      DEALLOCATE(T_TX2DP)
-      DEALLOCATE(REQ_TAB)
       CALL SECOND_MNH2(T1)
       TIMEZ%T_READ3D_WAIT=TIMEZ%T_READ3D_WAIT + T1 - T0
     END DO Z_SLICE
     !
+    DEALLOCATE(T_TX2DP)
+    DEALLOCATE(REQ_TAB)
+    !
     !Broadcast header only if IRESP==-111
     !because metadata of field has been modified in IO_READ_FIELD_xxx
     IF (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
-- 
GitLab