From 332cb7029ce866eee6f449093192c907eb315a5d Mon Sep 17 00:00:00 2001
From: Juan Escobar <escj@aero.obs-mip.fr>
Date: Fri, 22 Mar 2013 15:02:57 +0100
Subject: [PATCH] Juan 22/03/2013: add MODD_PPM_01 to save
 allocation/deallocation in use acc MIRROR

---
 MNH/ppm.f90 | 99 ++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 76 insertions(+), 23 deletions(-)

diff --git a/MNH/ppm.f90 b/MNH/ppm.f90
index b60c58072..60b687959 100644
--- a/MNH/ppm.f90
+++ b/MNH/ppm.f90
@@ -178,6 +178,32 @@ 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) &
@@ -207,6 +233,7 @@ USE MODD_LUNIT
 !END JUAN PPM_LL
 USE MODE_MPPDB
 USE MODD_PARAMETERS, ONLY : JPHEXT
+USE MODD_PPM_01
 !
 IMPLICIT NONE
 !
@@ -227,26 +254,31 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: 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
-!
-! terms used in parabolic interpolation, dmq, qL, qR, dq, q6
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: &
-  ZQL,ZQR, ZDQ,ZQ6, ZDMQ &
-!
-! extra variables for the initial guess of parabolae parameters
-  , ZQL0,ZQR0,ZQ60 &
+INTEGER                          :: ILUOUT,IRESP             ! for prints
+INTEGER                          :: I,J,K 
 !
-! advection fluxes
-  , ZFPOS, ZFNEG
+!!$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
+!!$!$acc declare mirror (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG)  
+!!$!
+!!$!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.
 !
-!BEG JUAN PPM_LL
-INTEGER                          :: ILUOUT,IRESP             ! for prints
-INTEGER                          :: IJS,IJN
-!END JUAN PPM_LL
-!JUAN ACC
-INTEGER                          :: I,J,K ,IIU,IJU,IKU
-LOGICAL                          :: GWEST , GEAST
 ! inline shuman with macro 
 #define dif2x(DQ,PQ) DQ(IIB:IIE,:,:)=0.5*(PQ(IIB+1:IIE+1,:,:)-PQ(IIB-1:IIE-1,:,:));\
 DQ(IIB-1,:,:)=0.5*(PQ(IIB,:,:)-PQ(IIE-1,:,:));\
@@ -259,6 +291,10 @@ 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
@@ -270,6 +306,18 @@ 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
 !
@@ -289,10 +337,12 @@ 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
+DO K=1,IKU ; DO J = 1,IJU ; DO I=1,IIU
 PR(I,J,K)=PSRC(I,J,K)
 ZQL(I,J,K)=PSRC(I,J,K)
 ZQR(I,J,K)=PSRC(I,J,K)
@@ -612,7 +662,9 @@ 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")   
@@ -677,6 +729,7 @@ CALL GET_HALO_D(ZFNEG,HDIR="01_X")
 !!$END FUNCTION DIF2X
 !
 !!$END FUNCTION PPM_01_X
+
  END SUBROUTINE PPM_01_X
 !
 !
@@ -1583,8 +1636,8 @@ ZPSRC_HALO2_WEST(:,:) = TZ_PSRC_HALO2_ll%HALO2%WEST(:,:)
 !
 #define JUAN_ACC_S0_X
 #ifdef JUAN_ACC_S0_X
-!$acc data region local (ZPHAT,ZFPOS,ZFNEG,ZRHO_MXM,ZCR_MXM,ZCR_DXF) copyin (psrc,pcr,prho,ZPSRC_HALO2_WEST)  copyout(pr) 
-!$acc region
+!$acc data pcreate (ZPHAT,ZFPOS,ZFNEG,ZRHO_MXM,ZCR_MXM,ZCR_DXF) pcopyin (psrc,pcr,prho,ZPSRC_HALO2_WEST)  pcopyout(pr) 
+!$acc kernels
 #endif
 !
 ZPHAT=PSRC
@@ -1763,8 +1816,8 @@ ENDIF
   ENDIF
 !
 #ifdef JUAN_ACC_S0_X
-!$acc end region 
-!$acc end data region 
+!$acc end kernels 
+!$acc end data 
 #endif
 !
 CALL GET_HALO(PR,HDIR="S0_X") 
-- 
GitLab