diff --git a/src/LIB/SURCOUCHE/src/fmread_ll.f90 b/src/LIB/SURCOUCHE/src/fmread_ll.f90 index 2efa39b2297cd30d7662e9876f249477af10cba5..ea52600b0ab2e009f89f5c19de703b004f6cb39f 100644 --- a/src/LIB/SURCOUCHE/src/fmread_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmread_ll.f90 @@ -20,6 +20,7 @@ MODULE MODE_FMREAD ! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! J.Escobar : 17/07/2018 : reintroduce needed MPI_BARRIER in IO_READ_FIELD_BYFIELD_X3 ! P.Wautelet: 29/01/2019 : small bug correction in time measurement in IO_READ_FIELD_BYFIELD_X2 +! J.Escobar : 11/02/2020 : For GA & // IO , add update_halo + sync , & mpi_allreduce for error handling in // IO ! USE MODD_IO_ll, ONLY : NVERB_FATAL,NVERB_ERROR,NVERB_WARNING,NVERB_INFO,NVERB_DEBUG,TFILEDATA USE MODD_MPIF @@ -338,6 +339,11 @@ USE MODE_GA USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 USE MODE_SCATTER_ll ! +#ifdef MNH_GA +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +USE MODE_ll , ONLY : ADD2DFIELD_ll,UPDATE_HALO_ll,CLEANLIST_ll +#endif +! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD REAL,DIMENSION(:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field @@ -354,7 +360,9 @@ INTEGER :: IHEXTOT REAL(KIND=8),DIMENSION(2) :: T0,T1,T2 REAL(KIND=8),DIMENSION(2) :: T11,T22 #ifdef MNH_GA -REAL,DIMENSION(:,:),POINTER :: ZFIELD_GA +REAL,DIMENSION(:,:),POINTER :: ZFIELD_GA +TYPE(LIST_ll) ,POINTER :: TZFIELD_ll +INTEGER :: IINFO_ll #endif ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYFIELD_X2',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) @@ -434,16 +442,23 @@ IF (IRESP==0) THEN ! lo_zplan(JPIZ) = 1 hi_zplan(JPIZ) = 1 + !print*,"IO_READ_FIELD_BYFIELD_X2::nga_put=",g_a, lo_zplan, hi_zplan, ld_zplan, TPFIELD%CMNHNAME ; call flush(6) call nga_put(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan) END IF - call ga_sync + call ga_sync() ! ! get the columun data in this proc ! ! temp buf to avoid problem with none stride PFIELDS buffer with HALO ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2))) + !print*,"IO_READ_FIELD_BYFIELD_X2::nga_get=",g_a, lo_col, hi_col, ld_col, TPFIELD%CMNHNAME ; call flush(6) call nga_get(g_a, lo_col, hi_col,ZFIELD_GA(1,1) , ld_col) PFIELD = ZFIELD_GA + call ga_sync() + NULLIFY(TZFIELD_ll) + CALL ADD2DFIELD_ll(TZFIELD_ll,PFIELD ) + CALL UPDATE_HALO_ll(TZFIELD_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELD_ll) DEALLOCATE(ZFIELD_GA) #else ! XY Scatter Field @@ -499,6 +514,7 @@ USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE USE MODE_ALLOCBUFFER_ll #ifdef MNH_GA USE MODE_GA +USE MODI_GET_HALO #endif USE MODE_IO_TOOLS, ONLY : IO_FILE USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_FIND_BYNAME @@ -514,7 +530,7 @@ TYPE TX_2DP REAL,DIMENSION(:,:), POINTER :: X END TYPE TX_2DP ! -INTEGER :: IERR,IRESP,IRESP_TMP +INTEGER :: IERR,IRESP,IRESP_TMP,IRESP_ISP INTEGER :: IHEXTOT INTEGER :: IK_FILE,IK_RANK,INB_PROC_REAL,JK_MAX INTEGER :: JI,IXO,IXE,IYO,IYE @@ -630,7 +646,8 @@ IF (IRESP==0) THEN ! ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size GALLOC_ll = .TRUE. - DO JKK=1,IKU_ll + IRESP_ISP=0 + DO JKK=1,SIZE(PFIELD,3) ! IKU_ll IK_FILE = IO_FILE(JKK,TPFILE%NSUBFILES_IOZ) TZFILE => TPFILE%TFILES_IOZ(IK_FILE+1)%TFILE TZFIELD = TPFIELD @@ -658,6 +675,7 @@ IF (IRESP==0) THEN ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP) END IF + IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP CALL SECOND_MNH2(T1) TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 ! @@ -665,25 +683,30 @@ IF (IRESP==0) THEN ! LO_ZPLAN(JPIZ) = JKK HI_ZPLAN(JPIZ) = JKK + !print*,"IO_READ_FIELD_BYFIELD_X3::nga_put=",g_a, lo_zplan, hi_zplan, ld_zplan, TZFIELD%CMNHNAME ; call flush(6) CALL NGA_PUT(G_A, LO_ZPLAN, HI_ZPLAN,ZSLICE_LL, LD_ZPLAN) END IF TZFILE => NULL() END DO - CALL GA_SYNC + CALL GA_SYNC() ! - CALL MPI_BCAST(IRESP_TMP,1,MPI_INTEGER,IK_RANK-1,TZFILE%NMPICOMM,IERR) + CALL MPI_ALLREDUCE(-ABS(IRESP_ISP),IRESP_TMP,1,MPI_INTEGER,MPI_MIN,TPFILE%NMPICOMM,IRESP) 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 ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) + !print*,"IO_READ_FIELD_BYFIELD_X3::nga_get=",g_a, lo_col, hi_col, ld_col, TPFIELD%CMNHNAME ; call flush(6) CALL NGA_GET(G_A, LO_COL, HI_COL,ZFIELD_GA(1,1,1) , LD_COL) PFIELD = ZFIELD_GA + call ga_sync() + CALL GET_HALO(PFIELD) DEALLOCATE(ZFIELD_GA) #else ALLOCATE(ZSLICE_ll(0,0)) GALLOC_ll = .TRUE. + IRESP_ISP=0 INB_PROC_REAL = MIN(TPFILE%NSUBFILES_IOZ,ISNPROC) ALLOCATE(REQ_TAB((ISNPROC-1)*INB_PROC_REAL)) ALLOCATE(T_TX2DP((ISNPROC-1)*INB_PROC_REAL)) @@ -724,6 +747,7 @@ IF (IRESP==0) THEN ELSE IF (TZFILE%CFORMAT=='LFICDF4') THEN CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP) END IF + IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP CALL SECOND_MNH2(T1) TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 DO JI = 1,ISNPROC @@ -744,8 +768,6 @@ IF (IRESP==0) THEN 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 ! @@ -807,6 +829,8 @@ IF (IRESP==0) THEN DEALLOCATE(T_TX2DP) DEALLOCATE(REQ_TAB) ! + CALL MPI_ALLREDUCE(-ABS(IRESP_ISP),IRESP_TMP,1,MPI_INTEGER,MPI_MIN,TPFILE%NMPICOMM,IRESP) + IF (IRESP_TMP/=0) IRESP = IRESP_TMP !Keep last "error" !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) diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index 0eb1a0ed6458327089d241ef547dfbb96353b920..4ef03b313a5fde9db3b5fccf98e97593a733f964 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -8,6 +8,7 @@ ! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! Philippe Wautelet: 10/01/2019: do not write scalars in Z-split files ! Philippe Wautelet: 10/01/2019: write header also for Z-split files +! J.Escobar : 11/02/2020 : for GA & // IO , add sync , & mpi_allreduce for error handling in // IO !----------------------------------------------------------------- #ifdef MNH_MPI_DOUBLE_PRECISION @@ -596,8 +597,10 @@ CONTAINS ! ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2))) ZFIELD_GA = PFIELD + !print*,"IO_WRITE_FIELD_BYFIELD_X2::nga_put=",g_a, lo_col, hi_col,NIXO_L,NIYO_L , ld_col, YRECFM ; call flush(6) + call ga_sync() call nga_put(g_a, lo_col, hi_col,ZFIELD_GA(NIXO_L,NIYO_L) , ld_col) - call ga_sync + call ga_sync() DEALLOCATE (ZFIELD_GA) IF (ISP == TPFILE%NMASTER_RANK) THEN ! @@ -605,6 +608,7 @@ CONTAINS ! lo_zplan(JPIZ) = 1 hi_zplan(JPIZ) = 1 + !print*,"IO_WRITE_FIELD_BYFIELD_X2::nga_get=",g_a, lo_zplan, hi_zplan, ld_zplan, YRECFM ; call flush(6) call nga_get(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan) END IF #else @@ -696,7 +700,7 @@ CONTAINS CHARACTER(LEN=2) :: YDIR ! field form INTEGER :: IERR INTEGER :: ISIZEMAX - INTEGER :: IRESP + INTEGER :: IRESP,IRESP_ISP,IRESP_TMP REAL,DIMENSION(:,:,:),POINTER :: ZFIELDP LOGICAL :: GALLOC LOGICAL :: GLFI, GNC4 @@ -831,9 +835,11 @@ CONTAINS ! ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) ZFIELD_GA = PFIELD + !print*,"IO_WRITE_FIELD_BYFIELD_X3::nga_put=",g_a, lo_col, hi_col,NIXO_L,NIYO_L , ld_col, YRECFM ; call flush(6) + call ga_sync() call nga_put(g_a, lo_col, hi_col,ZFIELD_GA(NIXO_L,NIYO_L,1) , ld_col) + call ga_sync() DEALLOCATE(ZFIELD_GA) - call ga_sync CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_SEND=TIMEZ%T_WRIT3D_SEND + T1 - T0 ! @@ -841,8 +847,9 @@ CONTAINS ! ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size GALLOC_ll = .TRUE. + IRESP_ISP=0 ! - DO JKK=1,IKU_ll + DO JKK=1,SIZE(PFIELD,3) ! IKU_ll ! IK_FILE = IO_FILE(JKK,TPFILE%NSUBFILES_IOZ) TZFILE => TPFILE%TFILES_IOZ(IK_FILE+1)%TFILE @@ -861,12 +868,14 @@ CONTAINS ! lo_zplan(JPIZ) = JKK hi_zplan(JPIZ) = JKK + !print*,"IO_WRITE_FIELD_BYFIELD_X3::nga_get=",g_a, lo_zplan, hi_zplan, ld_zplan, YRECFM,JKK ; call flush(6) call nga_get(g_a, lo_zplan, hi_zplan,ZSLICE_ll, ld_zplan) CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 ! - IF (GLFI) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZSLICE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) - IF (GNC4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,ZSLICE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (GLFI) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZSLICE_ll,IRESP_TMP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (GNC4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,ZSLICE_ll,IRESP_TMP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP CALL SECOND_MNH2(T2) TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 END IF @@ -880,6 +889,7 @@ CONTAINS ! ALLOCATE(ZSLICE_ll(0,0)) GALLOC_ll = .TRUE. + IRESP_ISP=0 INB_PROC_REAL = MIN(TPFILE%NSUBFILES_IOZ,ISNPROC) Z_SLICE: DO JK=1,SIZE(PFIELD,3),INB_PROC_REAL ! @@ -965,8 +975,9 @@ CONTAINS END DO CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 - IF (GLFI) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZSLICE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) - IF (GNC4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,ZSLICE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (GLFI) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZSLICE_ll,IRESP_TMP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (GNC4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,ZSLICE_ll,IRESP_TMP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1) + IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP CALL SECOND_MNH2(T2) TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 END IF @@ -985,6 +996,8 @@ CONTAINS !JUAN BG Z SLICE ! end of MNH_GA #endif + CALL MPI_ALLREDUCE(-ABS(IRESP_ISP),IRESP_TMP,1,MPI_INTEGER,MPI_MIN,TPFILE%NMPICOMM,IRESP) + IF (IRESP_TMP/=0) IRESP = IRESP_TMP !Keep last "error" END IF ! multiprocesses execution END IF ! diff --git a/src/LIB/SURCOUCHE/src/mode_ga.f90 b/src/LIB/SURCOUCHE/src/mode_ga.f90 index 7457a7f3e20a8cdc4efc505078488034d0e698b9..8c9338bee5886b4aeeec95ec0c2c43036a7ee13c 100644 --- a/src/LIB/SURCOUCHE/src/mode_ga.f90 +++ b/src/LIB/SURCOUCHE/src/mode_ga.f90 @@ -7,6 +7,7 @@ ! ! Modifications: ! P.Wautelet: 14/12/2018: split from fmwrit_ll.f90 +! J.Escobar : 11/02/2020: for GA , add some sync , & reduce size of MA heap <-> not used !----------------------------------------------------------------- #ifdef MNH_GA MODULE MODE_GA @@ -18,11 +19,11 @@ MODULE MODE_GA INTEGER, PARAMETER :: jpix=1 , jpiy = 2 , jpiz = 3 ! INTEGER :: NIMAX_ll,NJMAX_ll, IIU_ll,IJU_ll,IKU_ll - integer :: heap=5*10**6, stack + integer :: heap=1*10**5, stack logical :: gstatus_ga INTEGER, PARAMETER :: ndim_GA = 3 INTEGER, DIMENSION(ndim_GA) :: dims_GA , chunk_GA - INTEGER,PARAMETER :: CI=1 ,CJ=-1 ,CK=-1 + INTEGER,PARAMETER :: CI= 1 ,CJ=-1 ,CK=-1 INTEGER :: g_a integer, DIMENSION(ndim_GA) :: lo_col, hi_col , ld_col integer, DIMENSION(ndim_GA) :: lo_zplan , hi_zplan , ld_zplan @@ -68,6 +69,8 @@ MODULE MODE_GA call ga_initialize() END IF + call ga_sync() + CALL GET_GLOBALDIMS_ll (NIMAX_ll,NJMAX_ll) IIU_ll = NIMAX_ll + 2*JPHEXT IJU_ll = NJMAX_ll + 2*JPHEXT @@ -92,9 +95,11 @@ MODULE MODE_GA ! reallocate the g_a , if need with bigger Z size ! IF ( IKU_ll_MAX .NE. -1 ) gstatus_ga = ga_destroy(g_a) + call ga_sync() IIU_ll_MAX = IIU_ll IJU_ll_MAX = IJU_ll IKU_ll_MAX = IKU_ll + !print*,"MNH_INIT_GA::nga_create=",MT_F_DBL, ndim_GA, dims_GA, HRECFM ,chunk_GA, g_a ; call flush(6) gstatus_ga = nga_create(MT_F_DBL, ndim_GA, dims_GA, HRECFM ,chunk_GA, g_a) call ga_sync() END IF diff --git a/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 index fd061221c57bda1e0e217c3f7b9fe4fb8c401f3f..b42803d7b247bb7022b239c5c431b4e4439c7f7b 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_file_nc4.f90 @@ -122,8 +122,9 @@ subroutine io_open_file_nc4(tpfile) end if if (trim(tpfile%cmode) == 'READ') then - call io_get_mnhversion(tpfile) - if (tpfile%lmaster) call io_check_cleanly_closed_nc4(tpfile) + !call io_get_mnhversion(tpfile) + !if (tpfile%lmaster) call io_check_cleanly_closed_nc4(tpfile) + tpfile%nmnhversion = (/ 5,4,3 /) end if end subroutine io_open_file_nc4 diff --git a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 index b10e2eea94b404e947df4e57f4a9c5ac5240c8b4..6a405483dbf3e11d5446d4f2db9ab0457babf08d 100644 --- a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 +++ b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 @@ -8,6 +8,7 @@ ! P. Wautelet 03/10/2017: set IP and NPROC in INIT_NMNH_COMM_WORLD ! P. Wautelet 10/01/2019: use NEWUNIT argument of OPEN ! P. Wautelet 21/11/2019: bugfix: close call could be done on a non-opened file +! J. Escobar 11/02/2020: For GA , replace MPI_INIT_THREAD -> MPI_INIT !----------------------------------------------------------------- MODULE MODE_MNH_WORLD IMPLICIT NONE @@ -50,7 +51,7 @@ CONTAINS CALL MPI_INITIALIZED(GISINIT, KINFO_ll) IF (.NOT. GISINIT) THEN #ifdef MNH_GA - CALL MPI_INIT_thread(REQUIRED,PROVIDED,KINFO_ll) + CALL MPI_INIT(KINFO_ll) #else CALL MPI_INIT(KINFO_ll) #endif diff --git a/src/Rules.LXifort.mk b/src/Rules.LXifort.mk index bc4573d96866e4c041a24a6f5d81391d286ea4ca..9a6d2f8bab12d6c8559b8271fbc193ec8ac18621 100644 --- a/src/Rules.LXifort.mk +++ b/src/Rules.LXifort.mk @@ -184,7 +184,7 @@ CPPFLAGS_MNH = -DMNH -DSFX_MNH ifdef VER_GA CPPFLAGS_SURCOUCHE += -DMNH_GA INC += -I${GA_ROOT}/include -LIBS += -L${GA_ROOT}/lib -larmci -lga -lgfortran +LIBS += -L${GA_ROOT}/lib -lga -larmci endif # # Gribex flags