diff --git a/src/MNH/get_halo.f90 b/src/MNH/get_halo.f90 index d76d70497baa04b424d8e0eaa2327935a9bf81bf..6c72fecedf7b7ce01038259defbd8bfa9c88085d 100644 --- a/src/MNH/get_halo.f90 +++ b/src/MNH/get_halo.f90 @@ -38,6 +38,20 @@ INTERFACE END INTERFACE ! #ifdef MNH_OPENACC +INTERFACE + SUBROUTINE GET_HALO2_DF(PSRC, TP_PSRC_HALO2_ll, HNAME) + ! + USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll + ! + IMPLICIT NONE + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t + TYPE(HALO2LIST_ll), POINTER :: TP_PSRC_HALO2_ll ! halo2 for SRC + character(len=*), optional, intent(in) :: HNAME ! Name of the field to be added + ! + END SUBROUTINE GET_HALO2_DF +END INTERFACE + INTERFACE SUBROUTINE GET_HALO_D(PSRC, HDIR, HNAME) IMPLICIT NONE @@ -196,11 +210,15 @@ MODULE MODD_HALO_D REAL, SAVE , ALLOCATABLE, DIMENSION(:,:) :: ZNORTHC_2D_IN, ZSOUTHC_2D_IN, ZWESTC_2D_IN, ZEASTC_2D_IN REAL, SAVE , ALLOCATABLE, DIMENSION(:,:) :: ZNORTHC_2D_OUT, ZSOUTHC_2D_OUT, ZWESTC_2D_OUT, ZEASTC_2D_OUT + REAL, SAVE , ALLOCATABLE, DIMENSION(:,:,:) :: ZNORTH2F_IN, ZSOUTH2F_IN, ZWEST2F_IN, ZEAST2F_IN + REAL, SAVE , ALLOCATABLE, DIMENSION(:,:,:) :: ZNORTH2F_OUT, ZSOUTH2F_OUT, ZWEST2F_OUT, ZEAST2F_OUT + LOGICAL, SAVE :: GFIRST_GET_HALO_D = .TRUE. LOGICAL, SAVE :: GFIRST_INIT_HALO_D = .TRUE. INTEGER, SAVE :: IHALO_1 INTEGER, SAVE :: NP_NORTH,NP_SOUTH,NP_WEST,NP_EAST + INTEGER, SAVE :: IHALO2,IHALO2_1 CONTAINS @@ -218,8 +236,12 @@ CONTAINS IF (GFIRST_INIT_HALO_D) THEN ! - IHALO_1 = NHALO-1 - ! + IHALO_1 = NHALO-1 + IHALO2 = MAX(2,NHALO) + IHALO2_1 = IHALO2-1 + ! + ! Init HALO + ! ALLOCATE ( ZSOUTH_IN ( IIB:IIE , IJB:IJB+IHALO_1 , IKU ) ) ALLOCATE ( ZNORTH_IN ( IIB:IIE , IJE-IHALO_1:IJE , IKU ) ) ALLOCATE ( ZWEST_IN ( IIB:IIB+IHALO_1 , IJB:IJE , IKU ) ) @@ -259,7 +281,21 @@ CONTAINS ALLOCATE ( ZWESTC_2D_OUT ( 1:IIB-1 , IJB:IJE ) ) ALLOCATE ( ZEASTC_2D_OUT ( IIE+1:IIU , IJB:IJE ) ) !$acc enter data create (ZNORTHC_2D_OUT, ZSOUTHC_2D_OUT, ZWESTC_2D_OUT, ZEASTC_2D_OUT) - + ! + ! Init HALO2 for Full update in 1 time <-> GET_HALO + GET_HALO2 + ! + ALLOCATE ( ZSOUTH2F_IN ( IIB:IIE , IJB:IJB+IHALO2_1 , IKU ) ) + ALLOCATE ( ZNORTH2F_IN ( IIB:IIE , IJE-IHALO2_1:IJE , IKU ) ) + ALLOCATE ( ZWEST2F_IN ( IIB:IIB+IHALO2_1 , IJB:IJE , IKU ) ) + ALLOCATE ( ZEAST2F_IN ( IIE-IHALO2_1:IIE , IJB:IJE , IKU ) ) + !$acc enter data create (ZNORTH2F_IN, ZSOUTH2F_IN, ZWEST2F_IN, ZEAST2F_IN) + ! + ALLOCATE ( ZSOUTH2F_OUT ( IIB:IIE , IJB-IHALO2:IJB-1 , IKU ) ) + ALLOCATE ( ZNORTH2F_OUT ( IIB:IIE , IJE+1:IJE+IHALO2 , IKU ) ) + ALLOCATE ( ZWEST2F_OUT ( IIB-IHALO2:IIB-1 , IJB:IJE , IKU ) ) + ALLOCATE ( ZEAST2F_OUT ( IIE+1:IIE+IHALO2 , IJB:IJE , IKU ) ) + !$acc enter data create (ZNORTH2F_OUT, ZSOUTH2F_OUT, ZWEST2F_OUT, ZEAST2F_OUT) + IF (.NOT. GWEST ) THEN NP_WEST = ( IP-1 -1 ) + 1 ELSE @@ -314,9 +350,13 @@ character(len=*), optional, intent(in) :: HNAME ! Name of the field to be added ! INTEGER :: INB_REQ , IREQ(8) ! +CALL MPPDB_CHECK(PSRC,"GET_HALO_D big:PSRC") +! CALL GET_HALO_START_D(PSRC,INB_REQ,IREQ,HDIR) CALL GET_HALO_STOP_D(PSRC,INB_REQ,IREQ,HDIR) ! +CALL MPPDB_CHECK(PSRC,"GET_HALO_D end:PSRC") +! END SUBROUTINE GET_HALO_D ! ######################### SUBROUTINE GET_HALO_START_D(PSRC,KNB_REQ,KREQ,HDIR) @@ -349,6 +389,11 @@ INTEGER,PARAMETER :: IS_WEST=1 , IS_EAST=2, IS_SOUTH=3, IS_NORTH=4 LOGICAL :: LX , LY INTEGER :: NB_REQ, IERR ! +INTEGER :: JI,JJ,JK, JIU,JJU,JKU + +JIU = SIZE(PSRC,1) +JJU = SIZE(PSRC,2) +JKU = SIZE(PSRC,3) CALL INIT_HALO_D() @@ -438,12 +483,16 @@ END IF IF (LX) THEN IF (.NOT. GWEST) THEN !$acc kernels async(IS_WEST) - ZWEST_IN ( IIB:IIB+IHALO_1 , IJB:IJE , : ) = PSRC( IIB:IIB+IHALO_1 , IJB:IJE , : ) + !$mnh_expand_array(JI=IIB:IIB+IHALO_1 , JJ=IJB:IJE , JK=1:JKU ) + ZWEST_IN ( IIB:IIB+IHALO_1 , IJB:IJE , : ) = PSRC( IIB:IIB+IHALO_1 , IJB:IJE , : ) + !$mnh_end_expand_array() !$acc end kernels END IF IF (.NOT.GEAST) THEN !$acc kernels async(IS_EAST) - ZEAST_IN ( IIE-IHALO_1:IIE , IJB:IJE , : ) = PSRC( IIE-IHALO_1:IIE , IJB:IJE , : ) + !$mnh_expand_array(JI=IIE-IHALO_1:IIE , JJ=IJB:IJE , JK=1:JKU) + ZEAST_IN ( IIE-IHALO_1:IIE , IJB:IJE , : ) = PSRC( IIE-IHALO_1:IIE , IJB:IJE , : ) + !$mnh_end_expand_array() !$acc end kernels ENDIF END IF @@ -451,12 +500,16 @@ END IF IF (LY) THEN IF (.NOT.GSOUTH) THEN !$acc kernels async(IS_SOUTH) - ZSOUTH_IN ( IIB:IIE , IJB:IJB+IHALO_1 , : ) = PSRC( IIB:IIE , IJB:IJB+IHALO_1 , : ) + !$mnh_expand_array(JI=IIB:IIE , JJ=IJB:IJB+IHALO_1 , JK=1:JKU ) + ZSOUTH_IN ( IIB:IIE , IJB:IJB+IHALO_1 , : ) = PSRC( IIB:IIE , IJB:IJB+IHALO_1 , : ) + !$mnh_end_expand_array() !$acc end kernels ENDIF IF (.NOT.GNORTH) THEN !$acc kernels async(IS_NORTH) - ZNORTH_IN ( IIB:IIE , IJE-IHALO_1:IJE , : ) = PSRC( IIB:IIE , IJE-IHALO_1:IJE , : ) + !$mnh_expand_array(JI=IIB:IIE , JJ=IJE-IHALO_1:IJE , JK=1:JKU ) + ZNORTH_IN ( IIB:IIE , IJE-IHALO_1:IJE , : ) = PSRC( IIB:IIE , IJE-IHALO_1:IJE , : ) + !$mnh_end_expand_array() !$acc end kernels ENDIF ENDIF @@ -561,6 +614,11 @@ INTEGER,PARAMETER :: IS_WEST=1 , IS_EAST=2, IS_SOUTH=3, IS_NORTH=4 LOGICAL :: LX , LY INTEGER :: NB_REQ, IERR ! +INTEGER :: JI,JJ,JK, JIU,JJU,JKU + +JIU = SIZE(PSRC,1) +JJU = SIZE(PSRC,2) +JKU = SIZE(PSRC,3) CALL INIT_HALO_D() @@ -600,7 +658,9 @@ IF (LX) THEN !$acc update device(ZWEST_OUT) async(IS_WEST) #endif !$acc kernels async(IS_WEST) - PSRC( 1:IIB-1 , IJB:IJE , : ) = ZWEST_OUT( 1:IIB-1 , IJB:IJE , : ) + !$mnh_expand_array(JI=1:IIB-1 , JJ=IJB:IJE , JK=1:JKU ) + PSRC( 1:IIB-1 , IJB:IJE , : ) = ZWEST_OUT( 1:IIB-1 , IJB:IJE , : ) + !$mnh_end_expand_array() !$acc end kernels ENDIF IF (.NOT.GEAST) THEN @@ -608,7 +668,9 @@ IF (LX) THEN !$acc update device(ZEAST_OUT) async(IS_EAST) #endif !$acc kernels async(IS_EAST) - PSRC( IIE+1:IIU , IJB:IJE , : ) = ZEAST_OUT( IIE+1:IIU , IJB:IJE , : ) + !$mnh_expand_array(JI=IIE+1:IIU , JJ=IJB:IJE , JK=1:JKU ) + PSRC( IIE+1:IIU , IJB:IJE , : ) = ZEAST_OUT( IIE+1:IIU , IJB:IJE , : ) + !$mnh_end_expand_array() !$acc end kernels ENDIF END IF @@ -618,7 +680,9 @@ IF (LY) THEN !$acc update device(ZSOUTH_OUT) async(IS_SOUTH) #endif !$acc kernels async(IS_SOUTH) - PSRC( IIB:IIE , 1:IJB-1 , : ) = ZSOUTH_OUT( IIB:IIE , 1:IJB-1 , : ) + !$mnh_expand_array(JI=IIB:IIE , JJ=1:IJB-1 , JK=1:JKU ) + PSRC( IIB:IIE , 1:IJB-1 , : ) = ZSOUTH_OUT( IIB:IIE , 1:IJB-1 , : ) + !$mnh_end_expand_array() !$acc end kernels ENDIF IF (.NOT.GNORTH) THEN @@ -626,7 +690,9 @@ IF (LY) THEN !$acc update device(ZNORTH_OUT) async(IS_NORTH) #endif !$acc kernels async(IS_NORTH) - PSRC( IIB:IIE , IJE+1:IJU , : ) = ZNORTH_OUT ( IIB:IIE , IJE+1:IJU , : ) + !$mnh_expand_array(JI=IIB:IIE , JJ=IJE+1:IJU , JK=1:JKU ) + PSRC( IIB:IIE , IJE+1:IJU , : ) = ZNORTH_OUT ( IIB:IIE , IJE+1:IJU , : ) + !$mnh_end_expand_array() !$acc end kernels ENDIF END IF @@ -658,6 +724,9 @@ USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD USE MODD_MPIF, ONLY : MPI_STATUSES_IGNORE USE MODD_PRECISION, ONLY : MNHREAL_MPI ! +USE MODE_MNH_ZWORK, ONLY : IIU,IJU,IKU +USE MODE_MNH_ZWORK, ONLY : IIB,IJB ,IIE,IJE +! IMPLICIT NONE ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t @@ -667,78 +736,27 @@ character(len=*), optional, intent(in) :: HNAME ! Name of the field to be added character(len=:), allocatable :: yname TYPE(LIST_ll) , POINTER :: TZ_PSRC_ll ! halo INTEGER :: IERROR ! error return code -INTEGER, SAVE :: IIB,IJB ! Begining useful area in x,y,z directions -INTEGER, SAVE :: IIE,IJE ! End useful area in x,y,z directions - -INTEGER,SAVE :: IIU,IJU,IKU INTEGER,PARAMETER :: IS_WEST=1 , IS_EAST=2, IS_SOUTH=3, IS_NORTH=4 -INTEGER, SAVE :: IIBX,IJBX ! Extended Begining useful area in x,y,z directions -INTEGER, SAVE :: IIEX,IJEX ! Extended End useful area in x,y,z directions - LOGICAL :: LX , LY INTEGER :: INB_REQ , IREQ(8) INTEGER :: IERR -if ( NPROC == 1 ) RETURN +CALL MPPDB_CHECK(PSRC,"GET_HALO_DD big:PSRC") + +if ( NPROC == 1 ) THEN + CALL MPPDB_CHECK(PSRC,"GET_HALO_DD end:PSRC") + RETURN +end if + +CALL INIT_HALO_D() !$acc data present ( PSRC ) NULLIFY( TZ_PSRC_ll) ! -IF (GFIRST_GET_HALO_D ) THEN - CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) - ! - ! - IIU=size(psrc,1) - IJU=size(psrc,2) - IKU=size(psrc,3) - ! - IHALO_1 = NHALO-1 - ! -!!$ IIBX= 1 ; IIEX= IIU ; IJBX= 1 ; IJEX= IJU - IIBX= IIB ; IIEX= IIE ; IJBX= IJB ; IJEX= IJE - - ALLOCATE ( ZSOUTH_IN ( IIBX:IIEX , IJB:IJB+IHALO_1 , IKU ) ) - ALLOCATE ( ZNORTH_IN ( IIBX:IIEX , IJE-IHALO_1:IJE , IKU ) ) - ALLOCATE ( ZWEST_IN ( IIB:IIB+IHALO_1 , IJBX:IJEX , IKU ) ) - ALLOCATE ( ZEAST_IN ( IIE-IHALO_1:IIE , IJBX:IJEX , IKU ) ) - !$acc enter data create (ZNORTH_IN, ZSOUTH_IN, ZWEST_IN, ZEAST_IN) - ! - ALLOCATE ( ZSOUTH_OUT ( IIBX:IIEX , 1:IJB-1 , IKU ) ) - ALLOCATE ( ZNORTH_OUT ( IIBX:IIEX , IJE+1:IJU , IKU ) ) - ALLOCATE ( ZWEST_OUT ( 1:IIB-1 , IJBX:IJEX , IKU ) ) - ALLOCATE ( ZEAST_OUT ( IIE+1:IIU , IJBX:IJEX , IKU ) ) - !$acc enter data create (ZNORTH_OUT, ZSOUTH_OUT, ZWEST_OUT, ZEAST_OUT) - - IF (.NOT. GWEST ) THEN - NP_WEST = ( IP-1 -1 ) + 1 - ELSE - NP_WEST = 0 - ENDIF - IF (.NOT. GEAST ) THEN - NP_EAST = ( IP-1 +1 ) + 1 - ELSE - NP_EAST = 0 - ENDIF - IF (.NOT. GSOUTH ) THEN - NP_SOUTH = ( IP-1 -NP1 ) + 1 - ELSE - NP_SOUTH = 0 - ENDIF - IF (.NOT. GNORTH ) THEN - NP_NORTH = ( IP-1 +NP1 ) + 1 - ELSE - NP_NORTH = 0 - ENDIF - - !print*,"PROC=",IP, GWEST,NP_WEST, GEAST,NP_EAST, GSOUTH,NP_SOUTH , GNORTH,NP_NORTH - - GFIRST_GET_HALO_D = .FALSE. - -END IF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -827,24 +845,24 @@ END IF IF (LX) THEN IF (.NOT. GWEST) THEN !$acc kernels async(IS_WEST) - ZWEST_IN ( IIB:IIB+IHALO_1 , IJBX:IJEX , : ) = PSRC( IIB:IIB+IHALO_1 , IJBX:IJEX , : ) + ZWEST_IN ( IIB:IIB+IHALO_1 , IJB:IJE , : ) = PSRC( IIB:IIB+IHALO_1 , IJB:IJE , : ) !$acc end kernels END IF IF (.NOT.GEAST) THEN !$acc kernels async(IS_EAST) - ZEAST_IN ( IIE-IHALO_1:IIE , IJBX:IJEX , : ) = PSRC( IIE-IHALO_1:IIE , IJBX:IJEX , : ) + ZEAST_IN ( IIE-IHALO_1:IIE , IJB:IJE , : ) = PSRC( IIE-IHALO_1:IIE , IJB:IJE , : ) !$acc end kernels ENDIF END IF IF (LY) THEN IF (.NOT.GSOUTH) THEN !$acc kernels async(IS_SOUTH) - ZSOUTH_IN ( IIBX:IIEX , IJB:IJB+IHALO_1 , : ) = PSRC( IIBX:IIEX , IJB:IJB+IHALO_1 , : ) + ZSOUTH_IN ( IIB:IIE , IJB:IJB+IHALO_1 , : ) = PSRC( IIB:IIE , IJB:IJB+IHALO_1 , : ) !$acc end kernels ENDIF IF (.NOT.GNORTH) THEN !$acc kernels async(IS_NORTH) - ZNORTH_IN ( IIBX:IIEX , IJE-IHALO_1:IJE , : ) = PSRC( IIBX:IIEX , IJE-IHALO_1:IJE , : ) + ZNORTH_IN ( IIB:IIE , IJE-IHALO_1:IJE , : ) = PSRC( IIB:IIE , IJE-IHALO_1:IJE , : ) !$acc end kernels ENDIF ENDIF @@ -931,7 +949,7 @@ IF (LX) THEN !$acc update device(ZWEST_OUT) async(IS_WEST) #endif !$acc kernels async(IS_WEST) - PSRC( 1:IIB-1 , IJBX:IJEX , : ) = ZWEST_OUT( 1:IIB-1 , IJBX:IJEX , : ) + PSRC( 1:IIB-1 , IJB:IJE , : ) = ZWEST_OUT( 1:IIB-1 , IJB:IJE , : ) !$acc end kernels ENDIF IF (.NOT.GEAST) THEN @@ -939,7 +957,7 @@ IF (LX) THEN !$acc update device(ZEAST_OUT) async(IS_EAST) #endif !$acc kernels async(IS_EAST) - PSRC( IIE+1:IIU , IJBX:IJEX , : ) = ZEAST_OUT( IIE+1:IIU , IJBX:IJEX , : ) + PSRC( IIE+1:IIU , IJB:IJE , : ) = ZEAST_OUT( IIE+1:IIU , IJB:IJE , : ) !$acc end kernels ENDIF END IF @@ -949,7 +967,7 @@ IF (LY) THEN !$acc update device(ZSOUTH_OUT) async(IS_SOUTH) #endif !$acc kernels async(IS_SOUTH) - PSRC( IIBX:IIEX , 1:IJB-1 , : ) = ZSOUTH_OUT( IIBX:IIEX , 1:IJB-1 , : ) + PSRC( IIB:IIE , 1:IJB-1 , : ) = ZSOUTH_OUT( IIB:IIE , 1:IJB-1 , : ) !$acc end kernels ENDIF IF (.NOT.GNORTH) THEN @@ -957,7 +975,7 @@ IF (LY) THEN !$acc update device(ZNORTH_OUT) async(IS_NORTH) #endif !$acc kernels async(IS_NORTH) - PSRC( IIBX:IIEX , IJE+1:IJU , : ) = ZNORTH_OUT ( IIBX:IIEX , IJE+1:IJU , : ) + PSRC( IIB:IIE , IJE+1:IJU , : ) = ZNORTH_OUT ( IIB:IIE , IJE+1:IJU , : ) !$acc end kernels ENDIF END IF @@ -965,6 +983,8 @@ END IF !$acc end data +CALL MPPDB_CHECK(PSRC,"GET_HALO_DD end:PSRC") + END SUBROUTINE GET_HALO_DD !------------------------------------------------------------------------------- ! ######################################## @@ -1600,6 +1620,291 @@ CALL MPPDB_CHECK(PSRC,"GET_2D_HALO_DDC end:PSRC") !CALL MPPDB_CHECK(PSRC,'UPDATE_HALO_ll::'//TRIM(HNAME)) END SUBROUTINE GET_2D_HALO_DDC +!------------------------------------------------------------------------------- +! ######################################## + SUBROUTINE GET_HALO2_DF(PSRC, TP_PSRC_HALO2F_ll, HNAME) +! ######################################## +#define MNH_GPUDIRECT +! +USE MODD_HALO_D +USE MODE_ll +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +USE MODD_PARAMETERS, ONLY : JPHEXT +! +USE MODD_IO, ONLY : GSMONOPROC +USE MODE_MNH_ZWORK, ONLY : GWEST , GEAST, GSOUTH , GNORTH +USE MODE_MNH_ZWORK, ONLY : IIU,IJU,IKU +USE MODE_MNH_ZWORK, ONLY : IIB,IJB ,IIE,IJE +! +USE MODD_CONF, ONLY : NHALO +USE MODE_DEVICE +USE MODE_MPPDB +! +USE MODD_VAR_ll, ONLY : IP,NPROC,NP1,NP2 +USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD +USE MODD_MPIF, ONLY : MPI_STATUSES_IGNORE +USE MODD_PRECISION, ONLY : MNHREAL_MPI +! +IMPLICIT NONE +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t +TYPE(HALO2LIST_ll), POINTER :: TP_PSRC_HALO2F_ll ! halo2 for SRC +character(len=*), optional, intent(in) :: HNAME ! Name of the field to be added +! +character(len=:), allocatable :: yname +INTEGER :: IERROR ! error return code + +INTEGER,PARAMETER :: IS_WEST=1 , IS_EAST=2, IS_SOUTH=3, IS_NORTH=4 + +LOGICAL :: LX , LY + +INTEGER :: INB_REQ , IREQ(8) +INTEGER :: IERR + +REAL , DIMENSION(:,:) , POINTER , CONTIGUOUS :: ZH2F_EAST,ZH2F_WEST,ZH2F_NORTH,ZH2F_SOUTH + +CALL MPPDB_CHECK(PSRC,"GET_HALO2_DF beg:PSRC") + +if ( NPROC == 1 ) then + CALL MPPDB_CHECK(PSRC,"GET_HALO2_DF end:PSRC") + !CALL MPPDB_CHECK(PSRC,'UPDATE_HALO_ll::'//TRIM(HNAME)) + !CALL MPPDB_CHECK(PSRC,'UPDATE_HALO2_ll::'//TRIM(HNAME)) + RETURN +end if + +CALL INIT_HALO_D() + +!$acc data present ( PSRC ) & +!$acc present (ZNORTH2F_IN, ZSOUTH2F_IN, ZWEST2F_IN, ZEAST2F_IN) & +!$acc present (ZNORTH2F_OUT, ZSOUTH2F_OUT, ZWEST2F_OUT, ZEAST2F_OUT) +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +LX = .TRUE. +LY = .TRUE. + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +INB_REQ = 0 + +! +! Post the recieve of Zxxxx_IN buffer first via MPI(Gpu_direct) +! + +IF (LX) THEN + IF (.NOT. GWEST) THEN +#ifdef MNH_GPUDIRECT + !$acc host_data use_device(ZWEST2F_OUT) +#endif + INB_REQ = INB_REQ + 1 + CALL MPI_IRECV(ZWEST2F_OUT,SIZE(ZWEST2F_OUT),MNHREAL_MPI,NP_WEST-1,1000+IS_EAST,& + NMNH_COMM_WORLD,IREQ(INB_REQ),IERR) +#ifdef MNH_GPUDIRECT + !$acc end host_data +#endif + END IF + IF (.NOT.GEAST) THEN +#ifdef MNH_GPUDIRECT + !$acc host_data use_device(ZEAST2F_OUT) +#endif + INB_REQ = INB_REQ + 1 + CALL MPI_IRECV(ZEAST2F_OUT,SIZE(ZEAST2F_OUT),MNHREAL_MPI,NP_EAST-1,1000+IS_WEST,& + NMNH_COMM_WORLD,IREQ(INB_REQ),IERR) +#ifdef MNH_GPUDIRECT + !$acc end host_data +#endif + ENDIF +END IF + +IF (LY) THEN + IF (.NOT.GSOUTH) THEN +#ifdef MNH_GPUDIRECT + !$acc host_data use_device(ZSOUTH2F_OUT) +#endif + INB_REQ = INB_REQ + 1 + CALL MPI_IRECV(ZSOUTH2F_OUT,SIZE(ZSOUTH2F_OUT),MNHREAL_MPI,NP_SOUTH-1,1000+IS_NORTH,& + NMNH_COMM_WORLD,IREQ(INB_REQ),IERR) +#ifdef MNH_GPUDIRECT + !$acc end host_data +#endif + ENDIF + IF (.NOT.GNORTH) THEN +#ifdef MNH_GPUDIRECT + !$acc host_data use_device(ZNORTH2F_OUT) +#endif + INB_REQ = INB_REQ + 1 + CALL MPI_IRECV(ZNORTH2F_OUT,SIZE(ZNORTH2F_OUT),MNHREAL_MPI,NP_NORTH-1,1000+IS_SOUTH,& + NMNH_COMM_WORLD,IREQ(INB_REQ),IERR) +#ifdef MNH_GPUDIRECT + !$acc end host_data +#endif + ENDIF +END IF + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +!Copy the halo on the device PSRC to Zxxxx_IN + +IF (LX) THEN + IF (.NOT. GWEST) THEN + !$acc kernels async(IS_WEST) + ZWEST2F_IN ( IIB:IIB+IHALO2_1 , IJB:IJE , : ) = PSRC( IIB:IIB+IHALO2_1 , IJB:IJE , : ) +!!$ ZWEST2F_IN ( : , : ) = PSRC( IIB+1 , : , : ) + !$acc end kernels + END IF + IF (.NOT.GEAST) THEN + !$acc kernels async(IS_EAST) + ZEAST2F_IN ( IIE-IHALO2_1:IIE , IJB:IJE , : ) = PSRC( IIE-IHALO2_1:IIE , IJB:IJE , : ) +!!$ ZEAST2F_IN ( : , : ) = PSRC( IIE-1 , : , : ) + !$acc end kernels + ENDIF +END IF +IF (LY) THEN + IF (.NOT.GSOUTH) THEN + !$acc kernels async(IS_SOUTH) + ZSOUTH2F_IN ( IIB:IIE , IJB:IJB+IHALO2_1 , : ) = PSRC( IIB:IIE , IJB:IJB+IHALO2_1 , : ) +!!$ ZSOUTH2F_IN ( : , : ) = PSRC( : , IJB+1 , : ) + !$acc end kernels + ENDIF + IF (.NOT.GNORTH) THEN + !$acc kernels async(IS_NORTH) + ZNORTH2F_IN ( IIB:IIE , IJE-IHALO2_1:IJE , : ) = PSRC( IIB:IIE , IJE-IHALO2_1:IJE , : ) +!!$ ZNORTH2F_IN ( : , : ) = PSRC( : , IJE-1 , : ) + !$acc end kernels + ENDIF +ENDIF +!$acc wait + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Send Zxxxx2F_IN buffer via MPI(Gpu_direct) or copy to host +! +IF (LX) THEN + IF (.NOT. GWEST) THEN +#ifdef MNH_GPUDIRECT + !$acc host_data use_device(ZWEST2F_IN) +#else + !$acc update host(ZWEST2F_IN) +#endif + INB_REQ = INB_REQ + 1 + CALL MPI_ISEND(ZWEST2F_IN,SIZE(ZWEST2F_IN) ,MNHREAL_MPI,NP_WEST-1,1000+IS_WEST,& + NMNH_COMM_WORLD,IREQ(INB_REQ),IERR) +#ifdef MNH_GPUDIRECT + !$acc end host_data +#endif + END IF + IF (.NOT.GEAST) THEN +#ifdef MNH_GPUDIRECT + !$acc host_data use_device(ZEAST2F_IN) +#else + !$acc update host(ZEAST2F_IN) +#endif + INB_REQ = INB_REQ + 1 + CALL MPI_ISEND(ZEAST2F_IN,SIZE(ZEAST2F_IN) ,MNHREAL_MPI,NP_EAST-1,1000+IS_EAST,& + NMNH_COMM_WORLD,IREQ(INB_REQ),IERR) +#ifdef MNH_GPUDIRECT + !$acc end host_data +#endif + ENDIF +END IF + +IF (LY) THEN + IF (.NOT.GSOUTH) THEN +#ifdef MNH_GPUDIRECT + !$acc host_data use_device(ZSOUTH2F_IN) +#else + !$acc update host(ZSOUTH2F_IN) +#endif + INB_REQ = INB_REQ + 1 + CALL MPI_ISEND(ZSOUTH2F_IN,SIZE(ZSOUTH2F_IN) ,MNHREAL_MPI,NP_SOUTH-1,1000+IS_SOUTH,& + NMNH_COMM_WORLD,IREQ(INB_REQ),IERR) +#ifdef MNH_GPUDIRECT + !$acc end host_data +#endif + ENDIF + IF (.NOT.GNORTH) THEN +#ifdef MNH_GPUDIRECT + !$acc host_data use_device(ZNORTH2F_IN) +#else + !$acc update host(ZNORTH2F_IN) +#endif + INB_REQ = INB_REQ + 1 + CALL MPI_ISEND(ZNORTH2F_IN,SIZE(ZNORTH2F_IN) ,MNHREAL_MPI,NP_NORTH-1,1000+IS_NORTH,& + NMNH_COMM_WORLD,IREQ(INB_REQ),IERR) +#ifdef MNH_GPUDIRECT + !$acc end host_data +#endif + ENDIF +ENDIF + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +IF ( INB_REQ > 0 ) THEN + CALL MPI_WAITALL(INB_REQ,IREQ,MPI_STATUSES_IGNORE,IERR) +END IF + +!PW:disabled car KO si on compare avec 1 run 1 prc +! CALL MPPDB_CHECK(PSRC,'UPDATE_HALO_ll::'//TRIM(HNAME)) + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! Update halo in PSRC + %HALO2 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +IF (LX) THEN + IF (.NOT.GWEST) THEN +#ifndef MNH_GPUDIRECT + !$acc update device(ZWEST2F_OUT) async(IS_WEST) +#endif + ZH2F_WEST => TP_PSRC_HALO2F_ll%HALO2%WEST + !$acc kernels async(IS_WEST) + PSRC( 1:IIB-1 , IJB:IJE , : ) = ZWEST2F_OUT( 1:IIB-1 , IJB:IJE , : ) + ZH2F_WEST( IJB:IJE , : ) = ZWEST2F_OUT( IIB-2, IJB:IJE , : ) + !$acc end kernels + ENDIF + IF (.NOT.GEAST) THEN +#ifndef MNH_GPUDIRECT + !$acc update device(ZEAST2F_OUT) async(IS_EAST) +#endif + ZH2F_EAST => TP_PSRC_HALO2F_ll%HALO2%EAST + !$acc kernels async(IS_EAST) + PSRC( IIE+1:IIU , IJB:IJE , : ) = ZEAST2F_OUT( IIE+1:IIU , IJB:IJE , : ) + ZH2F_EAST( IJB:IJE , : ) = ZEAST2F_OUT( IIE+2 , IJB:IJE , : ) + !$acc end kernels + ENDIF +END IF +IF (LY) THEN + IF (.NOT.GSOUTH) THEN +#ifndef MNH_GPUDIRECT + !$acc update device(ZSOUTH2F_OUT) async(IS_SOUTH) +#endif + ZH2F_SOUTH => TP_PSRC_HALO2F_ll%HALO2%SOUTH + !$acc kernels async(IS_SOUTH) + PSRC( IIB:IIE , 1:IJB-1 , : ) = ZSOUTH2F_OUT( IIB:IIE , 1:IJB-1 , : ) + ZH2F_SOUTH( IIB:IIE , : ) = ZSOUTH2F_OUT( IIB:IIE , IJB-2 , : ) + !$acc end kernels + ENDIF + IF (.NOT.GNORTH) THEN +#ifndef MNH_GPUDIRECT + !$acc update device(ZNORTH2F_OUT) async(IS_NORTH) +#endif + ZH2F_NORTH => TP_PSRC_HALO2F_ll%HALO2%NORTH + !$acc kernels async(IS_NORTH) + PSRC( IIB:IIE , IJE+1:IJU , : ) = ZNORTH2F_OUT ( IIB:IIE , IJE+1:IJU , : ) + ZH2F_NORTH( IIB:IIE , : ) = ZNORTH2F_OUT ( IIB:IIE , IJE+2 , : ) + !$acc end kernels + ENDIF +END IF +!$acc wait + +!$acc end data + +CALL MPPDB_CHECK(PSRC,"GET_HALO2_DF end:PSRC") +!CALL MPPDB_CHECK(PSRC,'UPDATE_HALO2_ll::'//TRIM(HNAME)) + +END SUBROUTINE GET_HALO2_DF #endif !----------------------------------------------------------------------- !