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