diff --git a/MNH/get_halo.f90 b/MNH/get_halo.f90 index 53ef6b4a3b8adefd2a0e2c5f65b50bf3d0942910..f8d117278df99e8378a7b0b2e36ea84fcedea82e 100644 --- a/MNH/get_halo.f90 +++ b/MNH/get_halo.f90 @@ -133,9 +133,10 @@ USE MODE_ll USE MODD_ARGSLIST_ll, ONLY : LIST_ll USE MODD_PARAMETERS, ONLY : JPHEXT ! -USE MODD_IO_ll, ONLY : GSMONOPROC -USE MODE_MNH_ZWORK, ONLY : GWEST , GEAST, GSOUTH , GNORTH +USE MODD_IO_ll, ONLY : GSMONOPROC +USE MODE_MNH_ZWORK, ONLY : GWEST , GEAST, GSOUTH , GNORTH ! +USE MODD_CONF, ONLY : NHALO ! IMPLICIT NONE ! @@ -148,11 +149,12 @@ 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,SAVE :: IIU,IJU,IKU +INTEGER,SAVE :: IHALO_1 +INTEGER,PARAMETER :: IS_WEST=1 , IS_EAST=2, IS_SOUTH=3, IS_NORTH=4 LOGICAL :: LX , LY -INTEGER :: IIBB,IIEE,IJBB,IJEE -INTEGER :: IS_WEST=1 , IS_EAST=2, IS_SOUTH=3, IS_NORTH=4 + ! !LOGICAL, SAVE :: GFIRST_GET_HALO_D = .TRUE. ! @@ -164,44 +166,27 @@ 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) ! - ALLOCATE ( ZSOUTH_IN ( 1:IIU , 1:IJB , IKU ) ) - ALLOCATE ( ZNORTH_IN ( 1:IIU , IJE:IJU , IKU ) ) - ALLOCATE ( ZWEST_IN ( 1:IIB , 1:IJU , IKU ) ) - ALLOCATE ( ZEAST_IN ( IIE:IIU , 1:IJU , IKU ) ) + IHALO_1 = NHALO-1 + ! + 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 ) ) + ALLOCATE ( ZEAST_IN ( IIE-IHALO_1:IIE , IJB:IJE , IKU ) ) ! - ALLOCATE ( ZSOUTH_OUT ( IIB:IIE , IJB-1:IJB-1 , IKU ) ) - ALLOCATE ( ZNORTH_OUT ( IIB:IIE , IJE+1:IJE+1 , IKU ) ) - ALLOCATE ( ZWEST_OUT ( IIB-1:IIB-1 , IJB:IJE , IKU ) ) - ALLOCATE ( ZEAST_OUT ( IIE+1:IIE+1 , IJB:IJE , IKU ) ) + ALLOCATE ( ZSOUTH_OUT ( IIB:IIE , 1:IJB-1 , IKU ) ) + ALLOCATE ( ZNORTH_OUT ( IIB:IIE , IJE+1:IJU , IKU ) ) + ALLOCATE ( ZWEST_OUT ( 1:IIB-1 , IJB:IJE , IKU ) ) + ALLOCATE ( ZEAST_OUT ( IIE+1:IIU , IJB:IJE , IKU ) ) GFIRST_GET_HALO_D = .FALSE. END IF -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -!!$#ifdef ACC_MIRROR -!!$!$acc kernels -!!$#else -!!$!$acc kernels copyout (ZNORTH_IN,ZSOUTH_IN,ZWEST_IN,ZEAST_IN) -!!$#endif -!!$ZSOUTH_IN = PSRC( 1:IIU , 1:IJB , : ) -!!$ZNORTH_IN = PSRC( 1:IIU , IJE:IJU , : ) -!!$ZWEST_IN = PSRC( 1:IIB , 1:IJU , : ) -!!$ZEAST_IN = PSRC( IIE:IIU , 1:IJU , : ) -!!$!$acc end kernels -!!$#ifdef ACC_MIRROR -!!$!$acc update host (ZNORTH_IN,ZSOUTH_IN,ZWEST_IN,ZEAST_IN) -!!$#endif -!!$PSRC( 1:IIU , 1:IJB , : ) = ZSOUTH_IN -!!$PSRC( 1:IIU , IJE:IJU , : ) = ZNORTH_IN -!!$PSRC( 1:IIB , 1:IJU , : ) = ZWEST_IN -!!$PSRC( IIE:IIU , 1:IJU , : ) = ZEAST_IN - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! LX = .FALSE. @@ -216,42 +201,46 @@ LY = ( HDIR == "01_Y" ) !!$print *,"IIB=",IIB," HDIR=",HDIR," LX=",LX," LY=",LY ; call flush(6) END IF -!!$LX = .TRUE. -!!$LY = .TRUE. - -IIBB=IIB ; IIEE = IIE -IJBB=IJB ; IJEE = IJE - - -IF ( GWEST ) IIBB = 1 -IF ( GEAST ) IIEE = IIU -IF ( GSOUTH ) IJBB = 1 -IF ( GNORTH ) IJEE = IJU - IF (LX) THEN + IF (.NOT. GWEST) THEN !$acc kernels updateout(ZWEST_IN) async(IS_WEST) - ZWEST_IN ( IIBB:IIB , IJB:IJE , : ) = PSRC( IIBB:IIB , IJB:IJE , : ) + 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 updateout(ZEAST_IN) async(IS_EAST) - ZEAST_IN ( IIE:IIEE , IJB:IJE , : ) = PSRC( IIE:IIEE , IJB:IJE , : ) + 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 updateout (ZSOUTH_IN) async(IS_SOUTH) - ZSOUTH_IN ( IIB:IIE , IJBB:IJB , : ) = PSRC( IIB:IIE , IJBB:IJB , : ) + 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 updateout (ZNORTH_IN) async(IS_NORTH) - ZNORTH_IN ( IIB:IIE , IJE:IJEE , : ) = PSRC( IIB:IIE , IJE:IJEE , : ) + ZNORTH_IN ( IIB:IIE , IJE-IHALO_1:IJE , : ) = PSRC( IIB:IIE , IJE-IHALO_1:IJE , : ) !$acc end kernels + ENDIF ENDIF !$acc wait IF (LX) THEN - PSRC( IIBB:IIB , IJB:IJE , : ) = ZWEST_IN ( IIBB:IIB , IJB:IJE , : ) - PSRC( IIE:IIEE , IJB:IJE , : ) = ZEAST_IN ( IIE:IIEE , IJB:IJE , : ) + IF (.NOT. GWEST) THEN + PSRC( IIB:IIB+IHALO_1 , IJB:IJE , : ) = ZWEST_IN ( IIB:IIB+IHALO_1 , IJB:IJE , : ) + ENDIF + IF (.NOT.GEAST) THEN + PSRC( IIE-IHALO_1:IIE , IJB:IJE , : ) = ZEAST_IN ( IIE-IHALO_1:IIE , IJB:IJE , : ) + ENDIF END IF IF (LY) THEN - PSRC( IIB:IIE , IJBB:IJB , : ) = ZSOUTH_IN ( IIB:IIE , IJBB:IJB , : ) - PSRC( IIB:IIE , IJE:IJEE , : ) = ZNORTH_IN ( IIB:IIE , IJE:IJEE , : ) + IF (.NOT.GSOUTH) THEN + PSRC( IIB:IIE , IJB:IJB+IHALO_1 , : ) = ZSOUTH_IN ( IIB:IIE , IJB:IJB+IHALO_1 , : ) + ENDIF + IF (.NOT.GNORTH) THEN + PSRC( IIB:IIE , IJE-IHALO_1:IJE , : ) = ZNORTH_IN ( IIB:IIE , IJE-IHALO_1:IJE , : ) + ENDIF ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -260,31 +249,45 @@ CALL UPDATE_HALO_ll(TZ_PSRC_ll,IERROR, HDIR=HDIR ) CALL CLEANLIST_ll(TZ_PSRC_ll) IF (LX) THEN - ZWEST_OUT( IIB-1:IIB-1 , IJB:IJE , : ) = PSRC( IIB-1:IIB-1 , IJB:IJE , : ) - ZEAST_OUT( IIE+1:IIE+1 , IJB:IJE , : ) = PSRC( IIE+1:IIE+1 , IJB:IJE , : ) + IF (.NOT.GWEST) THEN + ZWEST_OUT( 1:IIB-1 , IJB:IJE , : ) = PSRC( 1:IIB-1 , IJB:IJE , : ) + ENDIF + IF (.NOT.GEAST) THEN + ZEAST_OUT( IIE+1:IIU , IJB:IJE , : ) = PSRC( IIE+1:IIU , IJB:IJE , : ) + ENDIF END IF IF (LY) THEN - ZSOUTH_OUT ( IIB:IIE , IJB-1:IJB-1 , : ) = PSRC( IIB:IIE , IJB-1:IJB-1 , : ) - ZNORTH_OUT ( IIB:IIE , IJE+1:IJE+1 , : ) = PSRC( IIB:IIE , IJE+1:IJE+1 , : ) + IF (.NOT.GSOUTH) THEN + ZSOUTH_OUT ( IIB:IIE , 1:IJB-1 , : ) = PSRC( IIB:IIE , 1:IJB-1 , : ) + ENDIF + IF (.NOT.GNORTH) THEN + ZNORTH_OUT ( IIB:IIE , IJE+1:IJU , : ) = PSRC( IIB:IIE , IJE+1:IJU , : ) + ENDIF END IF IF (LX) THEN + IF (.NOT.GWEST) THEN !$acc kernels updatein (ZWEST_OUT) async(IS_WEST) - PSRC( IIB-1:IIB-1 , IJB:IJE , : ) = ZWEST_OUT( IIB-1:IIB-1 , IJB:IJE , : ) + PSRC( 1:IIB-1 , IJB:IJE , : ) = ZWEST_OUT( 1:IIB-1 , IJB:IJE , : ) !$acc end kernels + ENDIF + IF (.NOT.GEAST) THEN !$acc kernels updatein (ZEAST_OUT) async(IS_EAST) - PSRC( IIE+1:IIE+1 , IJB:IJE , : ) = ZEAST_OUT( IIE+1:IIE+1 , IJB:IJE , : ) + PSRC( IIE+1:IIU , IJB:IJE , : ) = ZEAST_OUT( IIE+1:IIU , IJB:IJE , : ) !$acc end kernels + ENDIF END IF IF (LY) THEN + IF (.NOT.GSOUTH) THEN !$acc kernels updatein (ZSOUTH_OUT) async(IS_SOUTH) - PSRC( IIB:IIE , IJB-1:IJB-1 , : ) = ZSOUTH_OUT( IIB:IIE , IJB-1:IJB-1 , : ) + PSRC( IIB:IIE , 1:IJB-1 , : ) = ZSOUTH_OUT( IIB:IIE , 1:IJB-1 , : ) !$acc end kernels + ENDIF + IF (.NOT.GNORTH) THEN !$acc kernels updatein (ZNORTH_OUT) async(IS_NORTH) - PSRC( IIB:IIE , IJE+1:IJE+1 , : ) = ZNORTH_OUT ( IIB:IIE , IJE+1:IJE+1 , : ) + PSRC( IIB:IIE , IJE+1:IJU , : ) = ZNORTH_OUT ( IIB:IIE , IJE+1:IJU , : ) !$acc end kernels + ENDIF END IF - - !$acc wait ! END SUBROUTINE GET_HALO_D