From 03bc243bf31c5ef22abf73f4d0ba9239213faa83 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 21 Nov 2019 13:30:16 +0100
Subject: [PATCH] Philippe 21/11/2019: OpenACC: misc modifications

---
 src/MNH/advecuvw_4th.f90   |  4 ++--
 src/MNH/ppm.f90            | 44 ++++++++++++++++++++++++--------------
 src/MNH/prandtl.f90        |  4 ----
 src/MNH/resolved_cloud.f90 | 24 ++++++++++++++++++---
 src/MNH/turb.f90           | 24 +++++++++++++--------
 src/MNH/ver_interp_lin.f90 | 15 ++++++-------
 6 files changed, 72 insertions(+), 43 deletions(-)

diff --git a/src/MNH/advecuvw_4th.f90 b/src/MNH/advecuvw_4th.f90
index 6f4b11db6..c7dc02979 100644
--- a/src/MNH/advecuvw_4th.f90
+++ b/src/MNH/advecuvw_4th.f90
@@ -220,9 +220,9 @@ INTEGER :: IGRID ! localisation on the model grid
 #ifndef MNH_OPENACC
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMEANX, ZMEANY ! fluxes
 #else
-REAL, DIMENSION(IIU,IJU,IKU) :: ZMEANX, ZMEANY ! fluxes
+REAL, DIMENSION(:,:,:) :: ZMEANX, ZMEANY ! fluxes
 !
-REAL, DIMENSION(IIU,IJU,IKU) :: ZTEMP1,ZTEMP2,ZTEMP3,ZTEMP4
+REAL, DIMENSION(:,:,:) :: ZTEMP1,ZTEMP2,ZTEMP3,ZTEMP4
 
 INTEGER                                              :: II
 #endif
diff --git a/src/MNH/ppm.f90 b/src/MNH/ppm.f90
index b9428787f..c122536c1 100644
--- a/src/MNH/ppm.f90
+++ b/src/MNH/ppm.f90
@@ -2536,25 +2536,29 @@ INTEGER:: IIE,IJE    ! End useful area in x,y,z directions
 INTEGER                          :: IJS,IJN
 !
 LOGICAL :: GWEST, GEAST
-#endif
+
 ! advection fluxes
 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
 !
-!BEG JUAN PPM_LL
-TYPE(HALO2LIST_ll), POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
-!END JUAN PPM_LL
+REAL, DIMENSION(SIZE(PCR,2),SIZE(PCR,3))             :: ZPSRC_HALO2_WEST
+#else
+! advection fluxes
+REAL, DIMENSION(:,:,:) :: ZFPOS, ZFNEG
 !
-#ifdef _OPENACC
-!JUAN ACC
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZRHO_MXM, ZCR_MXM  , ZCR_DXF
-INTEGER                          :: I,J,K 
+! variable at cell edges
+REAL, DIMENSION(:,:,:) :: ZPHAT
 !
-!JUAN ACC
+REAL, DIMENSION(:,:,:) :: ZRHO_MXM, ZCR_MXM  , ZCR_DXF
+INTEGER                          :: I,J,K
+!
+REAL, DIMENSION(:,:)             :: ZPSRC_HALO2_WEST
 #endif
-REAL, DIMENSION(SIZE(PCR,2),SIZE(PCR,3))             :: ZPSRC_HALO2_WEST
+
+TYPE(HALO2LIST_ll), POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
+
 !-------------------------------------------------------------------------------
 
 !$acc data present( PSRC, PCR, PRHO, PR , &
@@ -2968,7 +2972,6 @@ INTEGER                          :: IJS,IJN
 INTEGER                          :: IIW,IIA
 !
 LOGICAL :: GNORTH, GSOUTH
-#endif
 !
 ! advection fluxes
 REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG
@@ -2976,18 +2979,27 @@ 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
 !
-!BEG JUAN PPM_LL
 TYPE(HALO2LIST_ll), POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
 TYPE(HALO2LIST_ll), POINTER      :: TZ_PHAT_HALO2_ll         ! halo2 for ZPHAT
-!END JUAN PPM_LL
-#ifdef _OPENACC
 !
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZRHO_MYM , ZCR_MYM , ZCR_DYF
+REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,3))             :: ZPSRC_HALO2_SOUTH
+#else
+!
+! advection fluxes
+REAL, DIMENSION(:,:,:) :: ZFPOS, ZFNEG
+!
+! variable at cell edges
+REAL, DIMENSION(:,:,:) :: ZPHAT
+!
+TYPE(HALO2LIST_ll), POINTER      :: TZ_PSRC_HALO2_ll         ! halo2 for PSRC
+TYPE(HALO2LIST_ll), POINTER      :: TZ_PHAT_HALO2_ll         ! halo2 for ZPHAT
+!
+REAL, DIMENSION(:,:,:) :: ZRHO_MYM , ZCR_MYM , ZCR_DYF
 !
 INTEGER                          :: I,J,K
 !
+REAL, DIMENSION(:,:)             :: ZPSRC_HALO2_SOUTH
 #endif
-REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,3))             :: ZPSRC_HALO2_SOUTH
 !
 !-------------------------------------------------------------------------------
 
diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90
index 2c6f15209..b5d267575 100644
--- a/src/MNH/prandtl.f90
+++ b/src/MNH/prandtl.f90
@@ -471,10 +471,6 @@ END DO
 !
 IF(HTURBDIM=='1DIM') THEN        ! 1D case
 !
-#ifdef MNH_OPENACC
-call Print_msg( NVERB_WARNING, 'GEN', 'PRANDTL', 'OpenACC: 1DIM not yet tested' )
-#endif
-!
 !$acc kernels async
 #ifndef MNH_BITREP
   PRED2TH3(:,:,:)  = PREDTH1(:,:,:)**2
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 55d8b32ba..5a9111c4f 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -441,7 +441,7 @@ REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA  ! Land Sea mask
 REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction
 !
 ! Variables from modules
-!$acc declare copyin(CSEDIM)
+! !$acc declare copyin(CSEDIM)
 !
 !*       0.2   Declarations of local variables :
 !
@@ -762,14 +762,32 @@ END IF
 SELECT CASE ( HCLOUD )
   CASE('KESS')
 #ifdef MNH_OPENACC
-CALL PRINT_MSG(NVERB_FATAL,'GEN','RESOLVED_CLOUD','KESS not yet implemented')
+CALL PRINT_MSG(NVERB_WARNING,'GEN','RESOLVED_CLOUD','KESS being implemented')
 #endif
+#ifndef MNH_OPENACC
     WHERE (PRS(:,:,:,2) < 0.)
       PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
       PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
            ZCPH(:,:,:) / PEXNREF(:,:,:)
       PRS(:,:,:,2) = 0.0
     END WHERE
+#else
+!$acc kernels
+!$acc loop independent collapse(3)
+    DO JK=1,SIZE(PRS,3)
+      DO JJ=1,SIZE(PRS,2)
+        DO JI=1,SIZE(PRS,1)
+          IF (PRS(JI,JJ,JK,2) < 0.) THEN
+            PRS(JI, JJ, JK , 1) = PRS(JI, JJ, JK , 1) + PRS(JI, JJ, JK , 2)
+            PTHS(JI, JJ, JK ) = PTHS(JI, JJ, JK ) - PRS(JI, JJ, JK , 2) * ZLV(JI, JJ, JK ) &
+                                / ZCPH(JI, JJ, JK ) / PEXNREF(JI, JJ, JK )
+            PRS(JI, JJ, JK , 2) = 0.0
+          END IF
+        END DO
+      END DO
+    END DO
+!$acc end kernels
+#endif
 !
 !
 ! CASE('C2R2','KHKO')                                 
@@ -1089,7 +1107,7 @@ CALL PRINT_MSG(NVERB_FATAL,'GEN','RESOLVED_CLOUD','REVE not yet implemented')
 !
   CASE ('KESS')
 #ifdef MNH_OPENACC
-CALL PRINT_MSG(NVERB_FATAL,'GEN','RESOLVED_CLOUD','KESS not yet implemented')
+CALL PRINT_MSG(NVERB_WARNING,'GEN','RESOLVED_CLOUD','KESS being implemented')
 #endif
 !
 !*       5.     KESSLER MICROPHYSICAL SCHEME
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index 921cdd662..3a39fea0a 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -762,10 +762,9 @@ SELECT CASE (HTURBLEN)
 !           ------------------
 
   CASE ('BL89')
-#ifdef MNH_OPENACC
-    call Print_msg( NVERB_FATAL, 'GEN', 'TURB', 'OpenACC: HTURBLEN=BL89 not yet implemented' )
-#endif
+!$acc kernels
     ZSHEAR(:, :, : ) = 0.
+!$acc end kernels
     CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM)
 !
 !*      3.2 RM17 mixing length
@@ -1248,7 +1247,6 @@ IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN
  ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
  ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:)
  ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT)
- ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT)
  ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
 ! CALL GET_HALO(PRRS(:,:,:,2))
 ! CALL GET_HALO(PRSVS(:,:,:,2))
@@ -1461,6 +1459,7 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PUSLOPE,PVSLOPE
 INTEGER             :: IIB,IIE,IJB,IJE ! index values for the physical subdomain
 TYPE(LIST_ll), POINTER :: TZFIELDS_ll  ! list of fields to exchange
 INTEGER                :: IINFO_ll     ! return code of parallel routine
+logical                :: gwest, geast, gnorth, gsouth
 !
 !*        1  PROLOGUE
 !
@@ -1489,20 +1488,25 @@ CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 !
 !        3 Boundary conditions for non cyclic case
 !
+gwest  = HLBCX(1) /= "CYCL" .AND. LWEST_ll()
+geast  = HLBCX(2) /= "CYCL" .AND. LEAST_ll()
+gsouth = HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()
+gnorth = HLBCY(2) /= "CYCL" .AND. LNORTH_ll()
+
 !$acc kernels
-IF ( HLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN
+IF ( gwest ) THEN
   PUSLOPE(IIB-1,:)=PUSLOPE(IIB,:)
   PVSLOPE(IIB-1,:)=PVSLOPE(IIB,:)
 END IF
-IF ( HLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN
+IF ( geast ) THEN
   PUSLOPE(IIE+1,:)=PUSLOPE(IIE,:)
   PVSLOPE(IIE+1,:)=PVSLOPE(IIE,:)
 END IF
-IF ( HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN
+IF ( gsouth ) THEN
   PUSLOPE(:,IJB-1)=PUSLOPE(:,IJB)
   PVSLOPE(:,IJB-1)=PVSLOPE(:,IJB)
 END IF
-IF(  HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN
+IF ( gnorth ) THEN
   PUSLOPE(:,IJE+1)=PUSLOPE(:,IJE)
   PVSLOPE(:,IJE+1)=PVSLOPE(:,IJE)
 END IF
@@ -1742,7 +1746,9 @@ ELSE
 !*         3.1 BL89 mixing length
 !           ------------------
   CASE ('BL89','RM17')
+!$acc kernels
     ZSHEAR(:, :, : ) = 0.
+!$acc end kernels
     CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD)
 !
 !*         3.2 Delta mixing length
@@ -2073,7 +2079,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE
 #endif
 !----------------------------------------------------------------------------
 
-!$acc data present( PDXX, PDYY, PDZZ, PZZ, PDIRCOSZW, PTHLT, PTHVREF, PTKET, PSRCT, PRT, PLOCPEXNM, PLM )
+!$acc data present( PDXX, PDYY, PDZZ, PZZ, PDIRCOSZW, PTHLT, PTHVREF, PTKET, PSRCT, PRT, PLOCPEXNM, PATHETA, PAMOIST, PLM )
 
 if ( mppdb_initialized ) then
   !Check all in arrays
diff --git a/src/MNH/ver_interp_lin.f90 b/src/MNH/ver_interp_lin.f90
index 50fad7ee5..d426392a7 100644
--- a/src/MNH/ver_interp_lin.f90
+++ b/src/MNH/ver_interp_lin.f90
@@ -259,15 +259,12 @@ IMPLICIT NONE
 !
 !*       0.1   Declaration of arguments
 !              ------------------------
-REAL,   DIMENSION(:,:,:), INTENT(IN) :: PVAR1    ! variable values on the initial
-!                                                ! grid
+REAL,   DIMENSION(:,:,:), INTENT(IN) :: PVAR1    ! variable values on the initial grid
 INTEGER,DIMENSION(:,:,:), INTENT(IN) :: KKLIN    ! lower interpolating level of
-!                                                ! grid 1 for each level of grid 2 
+!                                                ! grid 1 for each level of grid 2
 REAL,   DIMENSION(:,:,:), INTENT(IN) :: PCOEFLIN ! coefficient for level KKLIN
 !
-REAL,   DIMENSION(SIZE(KKLIN,1),SIZE(KKLIN,2),SIZE(KKLIN,3)), INTENT(OUT)   &
-                                     :: PVAR2 ! variable values on target
-!                                             ! grid 
+REAL,   DIMENSION(:,:,:), INTENT(OUT) :: PVAR2 ! variable values on target grid
 !
 !*       0.2   Declaration of local variables
 !              ------------------------------
@@ -276,6 +273,7 @@ INTEGER                                               :: JI,JJ,JK2
 !-------------------------------------------------------------------------------
 !
 call Print_msg( NVERB_WARNING, 'GEN', 'VER_INTERP_LIN3D_DEVICE', 'OpenACC: not yet tested' )
+
 !$acc data present(PVAR1,KKLIN,PCOEFLIN,PVAR2)
 !$acc kernels
 DO JK2=1,SIZE(KKLIN,3)
@@ -434,8 +432,7 @@ INTEGER,DIMENSION(:,:), INTENT(IN) :: KKLIN    ! lower interpolating level of
 !                                              ! grid 1 for each level of grid 2 
 REAL,   DIMENSION(:,:), INTENT(IN) :: PCOEFLIN ! coefficient for level KKLIN
 !
-REAL,   DIMENSION(SIZE(KKLIN,1),SIZE(KKLIN,2)), INTENT(OUT) :: PVAR2 ! variable values on
-!                                                                    ! target grid 
+REAL,   DIMENSION(:,:), INTENT(OUT) :: PVAR2 ! variable values on target grid
 !
 !*       0.2   Declaration of local variables
 !              ------------------------------
@@ -616,7 +613,7 @@ INTEGER,DIMENSION(:), INTENT(IN) :: KKLIN    ! lower interpolating level of
 !                                            ! grid 1 for each level of grid 2 
 REAL,   DIMENSION(:), INTENT(IN) :: PCOEFLIN ! coefficient for level KKLIN
 
-REAL,   DIMENSION(SIZE(KKLIN)), INTENT(OUT) :: PVAR2 ! variable values on target
+REAL,   DIMENSION(:), INTENT(OUT) :: PVAR2 ! variable values on target
 !                                                    ! grid 
 !
 !*       0.2   Declaration of local variables
-- 
GitLab