From de4a20a1477b20707f6c9938163d66cc328ee2e0 Mon Sep 17 00:00:00 2001 From: ESCOBAR Juan <escj@nuwa.aerologie.net> Date: Wed, 30 Oct 2013 11:07:10 +0100 Subject: [PATCH] Juan 301/10/2013: add LX/LY to get_halo_d & async stream update --- MNH/get_halo.f90 | 156 +++++++++++++++++++++++++++++++---------------- 1 file changed, 103 insertions(+), 53 deletions(-) diff --git a/MNH/get_halo.f90 b/MNH/get_halo.f90 index 55b64ed7b..810c4cddd 100644 --- a/MNH/get_halo.f90 +++ b/MNH/get_halo.f90 @@ -130,6 +130,7 @@ 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 ! ! IMPLICIT NONE @@ -144,6 +145,10 @@ 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 + +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. ! @@ -172,66 +177,111 @@ IF (GFIRST_GET_HALO_D ) THEN 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 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +!!$#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. +LY = .FALSE. + +IF (.NOT. PRESENT(HDIR) ) THEN +LX = .TRUE. +LY = .TRUE. +ELSE +LX = ( HDIR == "01_X" ) +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 + !$acc kernels updateout(ZWEST_IN) async(IS_WEST) + ZWEST_IN ( IIBB:IIB , IJB:IJE , : ) = PSRC( IIBB:IIB , IJB:IJE , : ) + !$acc end kernels + !$acc kernels updateout(ZEAST_IN) async(IS_EAST) + ZEAST_IN ( IIE:IIEE , IJB:IJE , : ) = PSRC( IIE:IIEE , IJB:IJE , : ) + !$acc end kernels +END IF +IF (LY) THEN + !$acc kernels updateout (ZSOUTH_IN) async(IS_SOUTH) + ZSOUTH_IN ( IIB:IIE , IJBB:IJB , : ) = PSRC( IIB:IIE , IJBB:IJB , : ) + !$acc end kernels + !$acc kernels updateout (ZNORTH_IN) async(IS_NORTH) + ZNORTH_IN ( IIB:IIE , IJE:IJEE , : ) = PSRC( IIB:IIE , IJE:IJEE , : ) + !$acc end kernels +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 , : ) +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 , : ) +ENDIF +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CALL ADD3DFIELD_ll(TZ_PSRC_ll,PSRC) CALL UPDATE_HALO_ll(TZ_PSRC_ll,IERROR, HDIR=HDIR ) CALL CLEANLIST_ll(TZ_PSRC_ll) -ZSOUTH_OUT = PSRC( IIB:IIE , IJB-1:IJB-1 , : ) -ZNORTH_OUT = PSRC( IIB:IIE , IJE+1:IJE+1 , : ) -ZWEST_OUT = PSRC( IIB-1:IIB-1 , IJB:IJE , : ) -ZEAST_OUT = PSRC( IIE+1:IIE+1 , IJB:IJE , : ) +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 , : ) +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 , : ) +END IF +IF (LX) THEN + !$acc kernels updatein (ZWEST_OUT) async(IS_WEST) + PSRC( IIB-1:IIB-1 , IJB:IJE , : ) = ZWEST_OUT( IIB-1:IIB-1 , IJB:IJE , : ) + !$acc end kernels + !$acc kernels updatein (ZEAST_OUT) async(IS_EAST) + PSRC( IIE+1:IIE+1 , IJB:IJE , : ) = ZEAST_OUT( IIE+1:IIE+1 , IJB:IJE , : ) + !$acc end kernels +END IF +IF (LY) THEN + !$acc kernels updatein (ZSOUTH_OUT) async(IS_SOUTH) + PSRC( IIB:IIE , IJB-1:IJB-1 , : ) = ZSOUTH_OUT( IIB:IIE , IJB-1:IJB-1 , : ) + !$acc end kernels + !$acc kernels updatein (ZNORTH_OUT) async(IS_NORTH) + PSRC( IIB:IIE , IJE+1:IJE+1 , : ) = ZNORTH_OUT ( IIB:IIE , IJE+1:IJE+1 , : ) + !$acc end kernels +END IF -#ifdef ACC_MIRROR -!$acc update device (ZNORTH_OUT,ZSOUTH_OUT,ZWEST_OUT,ZEAST_OUT) -!$acc kernels -#else -!$acc kernels copyin (ZNORTH_OUT,ZSOUTH_OUT,ZWEST_OUT,ZEAST_OUT) -#endif -PSRC( IIB:IIE , IJB-1:IJB-1 , : ) = ZSOUTH_OUT -PSRC( IIB:IIE , IJE+1:IJE+1 , : ) = ZNORTH_OUT -PSRC( IIB-1:IIB-1 , IJB:IJE , : ) = ZWEST_OUT -PSRC( IIE+1:IIE+1 , IJB:IJE , : ) = ZEAST_OUT -!$acc end kernels -!!$!$acc update device (ZSOUTH_OUT) async(1) -!!$!$acc kernels async(1) -!!$PSRC( IIB:IIE , IJB-1:IJB-1 , : ) = ZSOUTH_OUT -!!$!$acc end kernels -!!$ -!!$!$acc update device (ZNORTH_OUT) async(2) -!!$!$acc kernels async(2) -!!$PSRC( IIB:IIE , IJE+1:IJE+1 , : ) = ZNORTH_OUT -!!$!$acc end kernels -!!$ -!!$!$acc update device (ZWEST_OUT) async(3) -!!$!$acc kernels async(3) -!!$PSRC( IIB-1:IIB-1 , IJB:IJE , : ) = ZWEST_OUT -!!$!$acc end kernels -!!$ -!!$!$acc update device (ZEAST_OUT) async(4) -!!$!$acc kernels async(4) -!!$PSRC( IIE+1:IIE+1 , IJB:IJE , : ) = ZEAST_OUT -!!$!$acc end kernels -!!$ -!!$!$acc wait +!$acc wait ! END SUBROUTINE GET_HALO_D !----------------------------------------------------------------------- -- GitLab