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