From a96384abb4c73c5cf4192af04d6d77e67b09393f Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 2 Jul 2019 10:49:35 +0200
Subject: [PATCH] Philippe 02/07/2019: add shape of arrays in computation terms
 (necessary to get good performance with PGI and OpenACC)

---
 src/MNH/advection_metsv.f90   | 10 +++++-----
 src/MNH/advection_uvw.f90     | 18 +++++++++---------
 src/MNH/advection_uvw_cen.f90 | 34 +++++++++++++++++-----------------
 3 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index 08087ac31..d5b59fc56 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -466,7 +466,7 @@ END IF
 !PW: not necessary: data already on device due to contrav_device !$acc update device(ZRUCPPM,ZRVCPPM,ZRWCPPM)
 !$acc kernels
 IF (.NOT. L1D) THEN
-  ZCFLU = 0.0 ; ZCFLV = 0.0 ;  ZCFLW = 0.0
+  ZCFLU(:,:,:) = 0.0 ; ZCFLV(:,:,:) = 0.0 ;  ZCFLW(:,:,:) = 0.0
   ZCFLU(IIB:IIE,IJB:IJE,:) = ABS(ZRUCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
   ZCFLV(IIB:IIE,IJB:IJE,:) = ABS(ZRVCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
   ZCFLW(IIB:IIE,IJB:IJE,:) = ABS(ZRWCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
@@ -648,8 +648,8 @@ ZRWCPPM = ZRWCPPM*ZTSTEP_PPM
 !  Clouds    related processes from previous time-step are     taken into account in PRTHS_CLD
 !  Advection related processes from previous time-step will be taken into account in ZRTHS_PPM
 !
-ZRTHS_OTHER = PRTHS - PTHT * PRHODJ / PTSTEP
-IF (GTKE) ZRTKES_OTHER = PRTKES - PTKET * PRHODJ / PTSTEP
+ZRTHS_OTHER(:,:,:) = PRTHS(:,:,:) - PTHT(:,:,:) * PRHODJ(:,:,:) / PTSTEP
+IF (GTKE) ZRTKES_OTHER(:,:,:) = PRTKES(:,:,:) - PTKET(:,:,:) * PRHODJ(:,:,:) / PTSTEP
 DO JR = 1, KRR
  ZRRS_OTHER(:,:,:,JR) = PRRS(:,:,:,JR) - PRT(:,:,:,JR) * PRHODJ(:,:,:) / PTSTEP
 END DO
@@ -776,9 +776,9 @@ DO JSPL=1,KSPLIT
 !
 !  Guesses of the field inside the time splitting loop
 !
-   ZTH = ZTH + ( ZRTHS_PPM(:,:,:) + ZRTHS_OTHER(:,:,:) + PRTHS_CLD(:,:,:)) * &
+   ZTH(:,:,:) = ZTH(:,:,:) + ( ZRTHS_PPM(:,:,:) + ZRTHS_OTHER(:,:,:) + PRTHS_CLD(:,:,:)) * &
            ZTSTEP_PPM / PRHODJ(:,:,:)
-   IF (GTKE) ZTKE = ZTKE + ( ZRTKES_PPM(:,:,:) + ZRTKES_OTHER(:,:,:) ) * ZTSTEP_PPM / PRHODJ(:,:,:)
+   IF (GTKE) ZTKE(:,:,:) = ZTKE(:,:,:) + ( ZRTKES_PPM(:,:,:) + ZRTKES_OTHER(:,:,:) ) * ZTSTEP_PPM / PRHODJ(:,:,:)
    DO JR = 1, KRR
     ZR(:,:,:,JR) = ZR(:,:,:,JR) + ( ZRRS_PPM(:,:,:,JR) + ZRRS_OTHER(:,:,:,JR) + PRRS_CLD(:,:,:,JR) ) &
                     * ZTSTEP_PPM / PRHODJ(:,:,:)
diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90
index 8a6746c02..690aa3203 100644
--- a/src/MNH/advection_uvw.f90
+++ b/src/MNH/advection_uvw.f90
@@ -332,9 +332,9 @@ CALL MZM_DEVICE(PRHODJ,ZMZM_RHODJ)
 !	        -------------------------------------
 !
 !$acc kernels
-ZRUT = PUT(:,:,:) * ZMXM_RHODJ
-ZRVT = PVT(:,:,:) * ZMYM_RHODJ
-ZRWT = PWT(:,:,:) * ZMZM_RHODJ
+ZRUT(:,:,:) = PUT(:,:,:) * ZMXM_RHODJ(:,:,:)
+ZRVT(:,:,:) = PVT(:,:,:) * ZMYM_RHODJ(:,:,:)
+ZRWT(:,:,:) = PWT(:,:,:) * ZMZM_RHODJ(:,:,:)
 !$acc end kernels
 !$acc update self(ZRUT,ZRVT)
 !
@@ -373,9 +373,9 @@ NULLIFY(TZFIELDS_ll)
 !
 !$acc update device(PRUS,PRVS,PRWS)
 !$acc kernels
-ZRUS_OTHER = PRUS - ZRUT / PTSTEP + PRUS_PRES
-ZRVS_OTHER = PRVS - ZRVT / PTSTEP + PRVS_PRES
-ZRWS_OTHER = PRWS - ZRWT / PTSTEP + PRWS_PRES
+ZRUS_OTHER(:,:,:) = PRUS(:,:,:) - ZRUT(:,:,:) / PTSTEP + PRUS_PRES(:,:,:)
+ZRVS_OTHER(:,:,:) = PRVS(:,:,:) - ZRVT(:,:,:) / PTSTEP + PRVS_PRES(:,:,:)
+ZRWS_OTHER(:,:,:) = PRWS(:,:,:) - ZRWT(:,:,:) / PTSTEP + PRWS_PRES(:,:,:)
 !$acc end kernels
 !
 ! Top and bottom Boundaries 
@@ -420,9 +420,9 @@ ZTSTEP = PTSTEP / REAL(ISPLIT)
 !-------------------------------------------------------------------------------
 !
 !$acc kernels
-ZU    = PUT
-ZV    = PVT
-ZW    = PWT
+ZU(:,:,:) = PUT(:,:,:)
+ZV(:,:,:) = PVT(:,:,:)
+ZW(:,:,:) = PWT(:,:,:)
 !$acc end kernels
 !$acc update self(ZU,ZV,ZW)
 !
diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90
index 8004ee8a6..2c99a0b94 100644
--- a/src/MNH/advection_uvw_cen.f90
+++ b/src/MNH/advection_uvw_cen.f90
@@ -239,19 +239,19 @@ CALL MZM_DEVICE(PRHODJ,ZMZM_RHODJ)
 !	        -------------------------------------
 !
 !$acc kernels present(ZRUT,ZRVT,ZRWT,PUT,PVT,PWT,ZMXM_RHODJ,ZMYM_RHODJ,ZMZM_RHODJ)
-ZRUT = PUT(:,:,:) * ZMXM_RHODJ
-ZRVT = PVT(:,:,:) * ZMYM_RHODJ
-ZRWT = PWT(:,:,:) * ZMZM_RHODJ
+ZRUT(:,:,:) = PUT(:,:,:) * ZMXM_RHODJ(:,:,:)
+ZRVT(:,:,:) = PVT(:,:,:) * ZMYM_RHODJ(:,:,:)
+ZRWT(:,:,:) = PWT(:,:,:) * ZMZM_RHODJ(:,:,:)
 !$acc end kernels
 !
 #ifndef _OPENACC
-IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN                                      
+IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN
   CALL CONTRAV (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,2)
 ELSEIF (HUVW_ADV_SCHEME=='CEN4TH') THEN
   CALL CONTRAV (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,4)
 END IF
 #else
-IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN                                      
+IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN
   CALL CONTRAV_DEVICE (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,2, &
                  ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
 ELSEIF (HUVW_ADV_SCHEME=='CEN4TH') THEN
@@ -277,9 +277,9 @@ NULLIFY(TZFIELDS_ll)
 !	        ----------------------------
 !
 !$acc kernels present(ZRUS,ZRVS,ZRWS,PUM,PVM,PWM,ZMXM_RHODJ,ZMYM_RHODJ,ZMZM_RHODJ)
-ZRUS(:,:,:)   = PUM(:,:,:)  * ZMXM_RHODJ/(2.*PTSTEP)
-ZRVS(:,:,:)   = PVM(:,:,:)  * ZMYM_RHODJ/(2.*PTSTEP)
-ZRWS(:,:,:)   = PWM(:,:,:)  * ZMZM_RHODJ/(2.*PTSTEP)
+ZRUS(:,:,:)   = PUM(:,:,:)  * ZMXM_RHODJ(:,:,:)/(2.*PTSTEP)
+ZRVS(:,:,:)   = PVM(:,:,:)  * ZMYM_RHODJ(:,:,:)/(2.*PTSTEP)
+ZRWS(:,:,:)   = PWM(:,:,:)  * ZMZM_RHODJ(:,:,:)/(2.*PTSTEP)
 !$acc end kernels
 !
 !-------------------------------------------------------------------------------
@@ -306,21 +306,21 @@ END IF
 !$acc kernels present(ZRUS,ZRVS,ZRWS) present(ZUS,ZVS,ZWS) present(PUM,PVM,PWM) &
 !$acc & present(ZMXM_RHODJ,ZMYM_RHODJ,ZMZM_RHODJ) pcopy(PDUM,PDVM,PDWM,PRUS,PRVS,PRWS)
 !default added in OpenACC 2.5 !!$acc & default(none)
-ZUS = ZRUS(:,:,:)/ZMXM_RHODJ*2.*PTSTEP
-ZVS = ZRVS(:,:,:)/ZMYM_RHODJ*2.*PTSTEP
-ZWS = ZRWS(:,:,:)/ZMZM_RHODJ*2.*PTSTEP
+ZUS(:,:,:) = ZRUS(:,:,:)/ZMXM_RHODJ(:,:,:)*2.*PTSTEP
+ZVS(:,:,:) = ZRVS(:,:,:)/ZMYM_RHODJ(:,:,:)*2.*PTSTEP
+ZWS(:,:,:) = ZRWS(:,:,:)/ZMZM_RHODJ(:,:,:)*2.*PTSTEP
 !-------------------------------------------------------------------------------
 !
 !*       5.     Extracts the variation between current and future time step
 !	        -----------------------------------------------------------
 !
-PRUS(:,:,:) = PRUS(:,:,:) + ( ZUS(:,:,:) - PUM(:,:,:) - 0.5* PDUM) * ZMXM_RHODJ/(PTSTEP)
-PRVS(:,:,:) = PRVS(:,:,:) + ( ZVS(:,:,:) - PVM(:,:,:) - 0.5* PDVM) * ZMYM_RHODJ/(PTSTEP)
-PRWS(:,:,:) = PRWS(:,:,:) + ( ZWS(:,:,:) - PWM(:,:,:) - 0.5* PDWM) * ZMZM_RHODJ/(PTSTEP)
+PRUS(:,:,:) = PRUS(:,:,:) + ( ZUS(:,:,:) - PUM(:,:,:) - 0.5* PDUM(:,:,:)) * ZMXM_RHODJ(:,:,:)/(PTSTEP)
+PRVS(:,:,:) = PRVS(:,:,:) + ( ZVS(:,:,:) - PVM(:,:,:) - 0.5* PDVM(:,:,:)) * ZMYM_RHODJ(:,:,:)/(PTSTEP)
+PRWS(:,:,:) = PRWS(:,:,:) + ( ZWS(:,:,:) - PWM(:,:,:) - 0.5* PDWM(:,:,:)) * ZMZM_RHODJ(:,:,:)/(PTSTEP)
 !
-PDUM = ZUS(:,:,:) - PUM(:,:,:)
-PDVM = ZVS(:,:,:) - PVM(:,:,:)
-PDWM = ZWS(:,:,:) - PWM(:,:,:)
+PDUM(:,:,:) = ZUS(:,:,:) - PUM(:,:,:)
+PDVM(:,:,:) = ZVS(:,:,:) - PVM(:,:,:)
+PDWM(:,:,:) = ZWS(:,:,:) - PWM(:,:,:)
 !$acc end kernels
 !
 IF (LBUDGET_U)  CALL BUDGET (PRUS,1,'ADV_BU_RU')
-- 
GitLab