From 1605f53c726da153bcfb0f1a6182f091dd32c78b Mon Sep 17 00:00:00 2001
From: ESCOBAR Juan <escj@nuwa.aerologie.net>
Date: Sat, 23 Mar 2013 23:15:31 +0100
Subject: [PATCH] Juan 23/03/2012: add management of mirror array on ppm_sO_x &
 ppm_s0_y

---
 MNH/ppm.f90 | 176 +++++++++++++++++++++-------------------------------
 1 file changed, 71 insertions(+), 105 deletions(-)

diff --git a/MNH/ppm.f90 b/MNH/ppm.f90
index 60b687959..6a722c428 100644
--- a/MNH/ppm.f90
+++ b/MNH/ppm.f90
@@ -178,33 +178,6 @@ END MODULE MODI_PPM
 !
 !
 !-------------------------------------------------------------------------------
-MODULE MODD_PPM_01
-INTEGER, SAVE :: IIB,IJB    ! Begining useful area in x,y,z directions
-INTEGER, SAVE :: IIE,IJE    ! End useful area in x,y,z directions
-!
-! terms used in parabolic interpolation, dmq, qL, qR, dq, q6
-REAL, SAVE, ALLOCATABLE , DIMENSION(:,:,:) :: &
-  ZQL,ZQR, ZDQ,ZQ6, ZDMQ &
-!
-! extra variables for the initial guess of parabolae parameters
-  , ZQL0,ZQR0,ZQ60 &
-!
-! advection fluxes
-  , ZFPOS, ZFNEG
-#define ACC_MIRROR
-#ifdef ACC_MIRROR
-!$acc declare mirror (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG)  
-#endif
-!
-!BEG JUAN PPM_LL
-INTEGER,SAVE                    :: IJS,IJN
-!END JUAN PPM_LL
-!JUAN ACC
-INTEGER, SAVE                   :: IIU,IJU,IKU
-LOGICAL, SAVE                   :: GWEST , GEAST
-LOGICAL, SAVE                   :: GFIRST_CALL_PPM_01_X = .TRUE.
-END MODULE MODD_PPM_01
-!-------------------------------------------------------------------------------
 !     ########################################################################
 !!$      FUNCTION PPM_01_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) &
 !!$               RESULT(PR)
@@ -233,7 +206,14 @@ USE MODD_LUNIT
 !END JUAN PPM_LL
 USE MODE_MPPDB
 USE MODD_PARAMETERS, ONLY : JPHEXT
-USE MODD_PPM_01
+!
+USE MODE_MNH_ZWORK, ONLY : &
+& IIB,IIE, IIU,IJU,IKU , IJS,IJN, &
+& GWEST,GEAST, &
+& ZQL=>ZW3D1,ZQR=>ZW3D2,ZDQ=>ZW3D3,ZQ6=>ZW3D4,ZDMQ=>ZW3D5 , &
+& ZQL0=>ZW3D6,ZQR0=>ZW3D7,ZQ60=>ZW3D8 , &
+& ZFPOS=>ZW3D9,ZFNEG=>ZW3D10
+ 
 !
 IMPLICIT NONE
 !
@@ -257,6 +237,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR
 INTEGER                          :: ILUOUT,IRESP             ! for prints
 INTEGER                          :: I,J,K 
 !
+!
 !!$INTEGER, SAVE :: IIB,IJB    ! Begining useful area in x,y,z directions
 !!$INTEGER, SAVE :: IIE,IJE    ! End useful area in x,y,z directions
 !!$!
@@ -291,33 +272,6 @@ DQ(IIE+1,:,:)=0.5*(PQ(IIB+1,:,:)-PQ(IIE,:,:)) ! DIF2X(DQ,PQ)
 !*       0.3.     COMPUTES THE DOMAIN DIMENSIONS
 !                 ------------------------------
 !
-
-IF (GFIRST_CALL_PPM_01_X) THEN
-GFIRST_CALL_PPM_01_X = .FALSE.
-
-CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
-IJS=IJB
-IJN=IJE
-
-IIU=size(psrc,1)
-IJU=size(psrc,2)
-IKU=size(psrc,3)
-
-GWEST = LWEST_ll()
-GEAST = LEAST_ll()
-
-ALLOCATE (ZQL(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZQR(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZDQ(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZQ6(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZDMQ(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZQL0(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZQR0(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZQ60(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZFPOS(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-ALLOCATE (ZFNEG(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)))
-
-END IF
 !
 !BEG JUAN PPM_LL
 !
@@ -337,9 +291,6 @@ CALL GET_HALO_D(PSRC,HDIR="01_X")
 !
 #define JUAN_ACC_01_X
 #ifdef JUAN_ACC_01_X
-#ifndef ACC_MIRROR
-!$acc data region local (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG)  
-#endif
 !$acc region 
 #endif
 DO K=1,IKU ; DO J = 1,IJU ; DO I=1,IIU
@@ -662,9 +613,6 @@ CALL GET_HALO_D(ZFNEG,HDIR="01_X")
 
 #ifdef JUAN_ACC_01_X
 !$acc end region 
-#ifndef ACC_MIRROR
-!$acc end data region 
-#endif
 #endif
 
    CALL GET_HALO_D(PR,HDIR="01_X")   
@@ -1556,6 +1504,13 @@ USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll
 USE MODD_PARAMETERS, ONLY : JPHEXT
 USE MODE_MPPDB
 !
+USE MODE_MNH_ZWORK, ONLY : &
+& IIB,IIE, IJB,IJE, IIU,IJU,IKU , IJS,IJN, &
+& GWEST,GEAST, &
+& ZPHAT=>ZW3D1,ZPHAT=>ZW3D2,ZFPOS=>ZW3D3,ZFNEG=>ZW3D4, &
+& ZRHO_MXM=>ZW3D5,ZCR_MXM=>ZW3D6,ZCR_DXF=>ZW3D7, &
+& ZPSRC_HALO2_WEST
+!
 IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
@@ -1575,26 +1530,26 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR
 !
 !*       0.2   Declarations of local variables :
 !
-INTEGER:: IIB,IJB    ! Begining useful area in x,y,z directions
-INTEGER:: IIE,IJE    ! End useful area in x,y,z directions
+!!$INTEGER:: IIB,IJB    ! Begining useful area in x,y,z directions
+!!$INTEGER:: IIE,IJE    ! End useful area in x,y,z directions
 !
 ! advection fluxes
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG
+!!$REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG
 !
 ! variable at cell edges
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZPHAT
+!!$REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZPHAT
 !
 !BEG JUAN PPM_LL
 TYPE(HALO2LIST_ll), POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
 INTEGER                          :: ILUOUT,IRESP             ! for prints
-INTEGER                          :: IJS,IJN
+!!$INTEGER                          :: IJS,IJN
 !END JUAN PPM_LL
 !JUAN ACC
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZRHO_MXM , ZCR_MXM , ZCR_DXF
-INTEGER                          :: I,J,K ,IIU,IJU,IKU
-LOGICAL                          :: GWEST , GEAST
+!!$REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZRHO_MXM , ZCR_MXM , ZCR_DXF
+INTEGER                          :: I,J,K 
+!!$LOGICAL                          :: GWEST , GEAST
 !
-REAL, DIMENSION(SIZE(PCR,2),SIZE(PCR,3))             :: ZPSRC_HALO2_WEST
+!!$REAL, DIMENSION(SIZE(PCR,2),SIZE(PCR,3))             :: ZPSRC_HALO2_WEST
 !
 ! inline shuman with macro 
 #define dxf(PDXF,PA) PDXF(1:IIU-1,:,:) = PA(2:IIU,:,:) - PA(1:IIU-1,:,:) ; PDXF(IIU,:,:)    = PDXF(2*JPHEXT,:,:) ! DXF(PDXF,PA)
@@ -1605,16 +1560,16 @@ REAL, DIMENSION(SIZE(PCR,2),SIZE(PCR,3))             :: ZPSRC_HALO2_WEST
 !*       0.3.     COMPUTES THE DOMAIN DIMENSIONS
 !                 ------------------------------
 !
-CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
-IJS=IJB
-IJN=IJE
-
-IIU=size(psrc,1)
-IJU=size(psrc,2)
-IKU=size(psrc,3)
-
-GWEST = LWEST_ll()
-GEAST = LEAST_ll()
+!!$CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
+!!$IJS=IJB
+!!$IJN=IJE
+!!$
+!!$IIU=size(psrc,1)
+!!$IJU=size(psrc,2)
+!!$IKU=size(psrc,3)
+!!$
+!!$GWEST = LWEST_ll()
+!!$GEAST = LEAST_ll()
 
 !
 !BEG JUAN PPM_LL
@@ -1633,10 +1588,12 @@ ENDIF
 !
 CALL GET_HALO2(PSRC,TZ_PSRC_HALO2_ll)
 ZPSRC_HALO2_WEST(:,:) = TZ_PSRC_HALO2_ll%HALO2%WEST(:,:)
+!$acc update device (ZPSRC_HALO2_WEST)
 !
+
 #define JUAN_ACC_S0_X
 #ifdef JUAN_ACC_S0_X
-!$acc data pcreate (ZPHAT,ZFPOS,ZFNEG,ZRHO_MXM,ZCR_MXM,ZCR_DXF) pcopyin (psrc,pcr,prho,ZPSRC_HALO2_WEST)  pcopyout(pr) 
+!$acc data copyin (psrc,pcr,prho) copyout(pr) 
 !$acc kernels
 #endif
 !
@@ -1858,6 +1815,14 @@ USE MODD_CONF
 USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll
 USE MODD_PARAMETERS, ONLY : JPHEXT
 USE MODE_MPPDB
+!
+USE MODE_MNH_ZWORK, ONLY : &
+& IIB,IIE, IJB,IJE, IIU,IJU,IKU ,  IIW,IIA, &
+& GSOUTH , GNORTH, &
+& ZPHAT=>ZW3D1,ZFPOS=>ZW3D2,ZFNEG=>ZW3D3,ZRHO_MYM=>ZW3D4, &
+& ZCR_MYM=>ZW3D5,ZCR_DYF=>ZW3D6, &
+& ZPSRC_HALO2_SOUTH
+
 !
 IMPLICIT NONE
 !
@@ -1874,31 +1839,31 @@ REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHO  ! density
 REAL,                   INTENT(IN)  :: PTSTEP  ! Time step 
 !
 ! output source term
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR &
+REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR 
 !
 !*       0.2   Declarations of local variables :
 !
 ! advection fluxes
-                                                     , ZFPOS, ZFNEG &
+!!$                                                     , ZFPOS, ZFNEG &
 !
 ! variable at cell edges
-                                                     , ZPHAT &
+!!$                                                     , ZPHAT &
 !
-                                                     , ZRHO_MYM , ZCR_MYM , ZCR_DYF
+!!$                                                     , ZRHO_MYM , ZCR_MYM , ZCR_DYF
 !
-INTEGER:: IIB,IJB    ! Begining useful area in x,y,z directions
-INTEGER:: IIE,IJE    ! End useful area in x,y,z directions
+!!$INTEGER:: IIB,IJB    ! Begining useful area in x,y,z directions
+!!$INTEGER:: IIE,IJE    ! End useful area in x,y,z directions
 !
 !BEG JUAN PPM_LL
 TYPE(HALO2LIST_ll), POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
 INTEGER                          :: ILUOUT,IRESP             ! for prints
-INTEGER                          :: IIW,IIA
+!!$INTEGER                          :: IIW,IIA
 !END JUAN PPM_LL
 !JUAN ACC
-INTEGER                          :: I,J,K ,IIU,IJU,IKU
-LOGICAL                          :: GSOUTH , GNORTH
+INTEGER                          :: I,J,K
+!!$LOGICAL                          :: GSOUTH , GNORTH
 !
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,3))             :: ZPSRC_HALO2_SOUTH
+!!$REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,3))             :: ZPSRC_HALO2_SOUTH
 !
 ! inline shuman with macro 
 #define  dyf(PDYF,PA) PDYF(:,1:IJU-1,:) = PA(:,2:IJU,:) - PA(:,1:IJU-1,:); PDYF(:,IJU,:) = PDYF(:,2*JPHEXT,:) !   DYF(PDYF,PA)
@@ -1910,16 +1875,16 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,3))             :: ZPSRC_HALO2_SOUTH
 !*       0.3.     COMPUTES THE DOMAIN DIMENSIONS
 !                 ------------------------------
 !
-CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
-IIW=IIB
-IIA=IIE
-
-IIU=size(psrc,1)
-IJU=size(psrc,2)
-IKU=size(psrc,3)
-
-GSOUTH=LSOUTH_ll()
-GNORTH=LNORTH_ll()
+!!$CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
+!!$IIW=IIB
+!!$IIA=IIE
+!!$
+!!$IIU=size(psrc,1)
+!!$IJU=size(psrc,2)
+!!$IKU=size(psrc,3)
+!!$
+!!$GSOUTH=LSOUTH_ll()
+!!$GNORTH=LNORTH_ll()
 
 !
 !-------------------------------------------------------------------------------
@@ -1931,13 +1896,14 @@ END IF
 !
 CALL GET_HALO2(PSRC,TZ_PSRC_HALO2_ll)
 ZPSRC_HALO2_SOUTH(:,:) = TZ_PSRC_HALO2_ll%HALO2%SOUTH(:,:)
+!$acc update device (ZPSRC_HALO2_SOUTH)
 !
 ! Initialize with relalistic value all work array 
 !
 #define JUAN_ACC_S0_Y
 #ifdef JUAN_ACC_S0_Y
-!$acc data region local(ZPHAT,ZFPOS,ZFNEG,ZRHO_MYM,ZCR_MYM,ZCR_DYF) copyin (psrc,pcr,prho,zpsrc_halo2_south)  copyout(pr) 
-!$acc region
+!$acc data copyin (psrc,pcr,prho) copyout(pr) 
+!$acc kernels
 #endif
 !
 ZPHAT=PSRC
@@ -2104,8 +2070,8 @@ ENDIF
   ENDIF
 !
 #ifdef JUAN_ACC_S0_Y
-!$acc end region 
-!$acc end data region 
+!$acc end kernels 
+!$acc end data  
 #endif
 !
    CALL GET_HALO(PR,HDIR="S0_Y") 
-- 
GitLab