From 4561087445afa1b5346c989f80ebce3b5cf4583e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 18 Jul 2019 16:28:01 +0200
Subject: [PATCH] Philippe 18/07/2019: OpenACC: various developments

---
 src/MNH/advec_4th_order_aux.f90 |  17 ++--
 src/MNH/advec_weno_k_2_aux.f90  |   5 +-
 src/MNH/advection_uvw_cen.f90   |   3 -
 src/MNH/advecuvw_4th.f90        | 144 +++++++++++++-------------------
 src/MNH/prandtl.f90             |   3 -
 src/MNH/turb_hor_dyn_corr.f90   |   5 --
 src/MNH/turb_hor_vw.f90         |   4 +-
 7 files changed, 73 insertions(+), 108 deletions(-)

diff --git a/src/MNH/advec_4th_order_aux.f90 b/src/MNH/advec_4th_order_aux.f90
index 6352bb536..4313d08eb 100644
--- a/src/MNH/advec_4th_order_aux.f90
+++ b/src/MNH/advec_4th_order_aux.f90
@@ -159,7 +159,6 @@ END IF
 !                 ------------------------------
 !
 #ifdef _OPENACC
-call Print_msg( NVERB_WARNING, 'GEN', 'ADVEC_4TH_ORDER_ALGO', 'OpenACC: not yet tested' )
 CALL INIT_ON_HOST_AND_DEVICE(ZHALO2_WEST,-1e99,'ADVEC_4TH_ORDER_ALGO::ZHALO2_WEST')
 CALL INIT_ON_HOST_AND_DEVICE(ZHALO2_EAST,-1e99,'ADVEC_4TH_ORDER_ALGO::ZHALO2_EAST')
 CALL INIT_ON_HOST_AND_DEVICE(ZHALO2_SOUTH,-1e99,'ADVEC_4TH_ORDER_ALGO::ZHALO2_SOUTH')
@@ -243,9 +242,6 @@ ZHALO2_EAST(:,:) = TPHALO2%EAST(:,:)
 !
 CASE ('OPEN','WALL','NEST')
 !
-#ifdef _OPENACC
-call Print_msg( NVERB_WARNING, 'GEN', 'ADVEC_4TH_ORDER_ALGO', 'OpenACC: HLBCX(1) AND OPEN/WALL/NEST not yet tested' )
-#endif
 ZHALO2_WEST(:,:) = TPHALO2%WEST(:,:)
 ZHALO2_EAST(:,:) = TPHALO2%EAST(:,:)
 !$acc update device (ZHALO2_WEST,ZHALO2_EAST)
@@ -374,9 +370,6 @@ ZHALO2_NORTH(:,:) = TPHALO2%NORTH(:,:)
 !
   CASE ('OPEN','WALL','NEST')
 !
-#ifdef _OPENACC
-call Print_msg( NVERB_WARNING, 'GEN', 'ADVEC_4TH_ORDER_ALGO', 'OpenACC: HLBCX(2) AND OPEN/WALL/NEST not yet tested' )
-#endif
 ZHALO2_SOUTH(:,:) = TPHALO2%SOUTH(:,:)
 ZHALO2_NORTH(:,:) = TPHALO2%NORTH(:,:)
 !$acc update device (ZHALO2_SOUTH,ZHALO2_NORTH)
@@ -518,7 +511,8 @@ IMPLICIT NONE
 REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
                                                             !         side
 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF4  ! result at mass
-                                                            ! localization 
+                                                            ! localization
+!$acc declare present(PA, PMZF4)
 !
 !*       0.2   Declarations of local variables
 !
@@ -546,6 +540,7 @@ IIJU = IIU*IJU
 JIJKOR1  = 1 + IIJU
 JIJKEND1 = 2*IIJU
 !
+!$acc kernels
 !CDIR NODEP
 !OCL NOVREC
 DO JIJK=JIJKOR1 , JIJKEND1
@@ -576,6 +571,7 @@ END DO
 DO JIJ=1,IIJU
    PMZF4(JIJ,1,IKU)    = -999.
 END DO
+!$acc end kernels
 !
 !-------------------------------------------------------------------------------
 !
@@ -638,7 +634,8 @@ IMPLICIT NONE
 REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass 
                                                             ! localization
 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM4  ! result at flux 
-                                                            ! localization 
+                                                            ! localization
+!$acc declare present(PA, PMZM4)
 !
 !*       0.2   Declarations of local variables
 !
@@ -665,6 +662,7 @@ IIJU = IIU*IJU
 JIJKOR1  = 1 + IIJU
 JIJKEND1 = JIJKOR1 + IIJU
 !
+!$acc kernels
 !CDIR NODEP
 !OCL NOVREC
 DO JIJK=JIJKOR1 , JIJKEND1
@@ -692,6 +690,7 @@ END DO
 DO JIJ=1,IIJU
    PMZM4(JIJ,1,1)    = -999.
 END DO
+!$acc end kernels
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/advec_weno_k_2_aux.f90 b/src/MNH/advec_weno_k_2_aux.f90
index c09e52857..d6dfbe12a 100644
--- a/src/MNH/advec_weno_k_2_aux.f90
+++ b/src/MNH/advec_weno_k_2_aux.f90
@@ -753,8 +753,9 @@ REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-------------------------------------------------------------------------------
 IF (MPPDB_INITIALIZED) THEN
-  !Check all OUT arrays
-  CALL MPPDB_CHECK(PR,"ADVEC_WENO_K_2_MX end:PR")
+  !Check all IN arrays
+  CALL MPPDB_CHECK(PSRC, "ADVEC_WENO_K_2_MX beg:PSRC")
+  CALL MPPDB_CHECK(PRUCT,"ADVEC_WENO_K_2_MX beg:PRUCT")
 END IF
 !
 !*       0.3.     COMPUTES THE DOMAIN DIMENSIONS
diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90
index 9cc640dfb..4f14058c6 100644
--- a/src/MNH/advection_uvw_cen.f90
+++ b/src/MNH/advection_uvw_cen.f90
@@ -196,9 +196,6 @@ INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE ! index values for the physical subdomain
 INTEGER :: IZ1, IZ2
 #endif
 !
-#ifdef _OPENACC
-call Print_msg( NVERB_WARNING, 'GEN', 'ADVECTION_UVW_CEN', 'OpenACC: not yet tested' )
-#endif
 !-------------------------------------------------------------------------------
 !
 IF (MPPDB_INITIALIZED) THEN
diff --git a/src/MNH/advecuvw_4th.f90 b/src/MNH/advecuvw_4th.f90
index a08f06bd1..5e14c7844 100644
--- a/src/MNH/advecuvw_4th.f90
+++ b/src/MNH/advecuvw_4th.f90
@@ -180,13 +180,12 @@ USE MODD_PARAMETERS
 
 USE MODE_ll
 use mode_mppdb
-#ifdef _OPENACC
-use mode_msg
-#endif
 
 USE MODI_ADVEC_4TH_ORDER_AUX
 #ifndef _OPENACC
 USE MODI_SHUMAN
+#else
+USE MODI_SHUMAN_DEVICE
 #endif
 !
 IMPLICIT NONE
@@ -237,7 +236,7 @@ REAL, DIMENSION(IIU,IJU,IKU) :: ZTEMP1,ZTEMP2,ZTEMP3,ZTEMP4
 INTEGER                                              :: II
 #endif
 !
-#ifdef _OPENACC
+#if 0
 #define dxm(PDXM,PA) PDXM(2:IIU,:,:)   = PA(2:IIU,:,:) - PA(1:IIU-1,:,:)       ; PDXM(1,:,:) = PDXM(IIU-2*JPHEXT+1,:,:) ! DXM(PDXM,PA)
 #define mxf(PMXF,PA) PMXF(1:IIU-1,:,:) = 0.5*( PA(2:IIU,:,:)+PA(1:IIU-1,:,:) ) ; PMXF(IIU,:,:) = PMXF(2*JPHEXT,:,:) ! MXF(PMXF,PA)
 #define mxm(PMXM,PA) PMXM(2:IIU,:,:) = 0.5*( PA(2:IIU,:,:)+PA(1:IIU-1,:,:) ) ; PMXM(1,:,:) = PMXM(IIU-2*JPHEXT+1,:,:) ! MXM(PMXM,PA)
@@ -256,9 +255,6 @@ INTEGER                                              :: II
   PMZF4(:,:,1) = 0.5*( PA(:,:,2)+PA(:,:,1) ) ; PMZF4(:,:,IKU-1) = 0.5*( PA(:,:,IKU)+PA(:,:,IKU-1) ) ; PMZF4(:,:,IKU) = -999.
 #endif
 !
-#ifdef _OPENACC
-call Print_msg( NVERB_WARNING, 'GEN', 'ADVECUVW_4TH', 'OpenACC: not yet tested' )
-#endif
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -307,41 +303,33 @@ PRUS(:,:,:) = PRUS(:,:,:)                          &
 PRUS(:,:,:) = PRUS(:,:,:)                             &
              -DZF(1,IKU,1, MXM(PRWCT(:,:,:))*MZM4(PUT(:,:,:)) )
 #else
-! pcopy(prus) pcopyin(pruct,ZMEANX) create(ZTEMP1,ZTEMP2,ZTEMP3)
-!!$PRUS(:,:,:) = PRUS(:,:,:)                          &
-!!$             -DXM( MXF(PRUCT(:,:,:))*ZMEANX(:,:,:) ) 
-
-!$acc kernels   present(ZMEANX) present(PRUS)
-mxf(ZTEMP1,PRUCT)         
+call mxf_device(PRUCT,ZTEMP1)
+!$acc kernels
 ZTEMP2 = ZTEMP1 * ZMEANX
-dxm(ZTEMP3,ZTEMP2)
+!$acc end kernels
+call dxm_device(ZTEMP2,ZTEMP3)
+!$acc kernels
 PRUS(:,:,:) = PRUS(:,:,:) -  ZTEMP3
-!$acc end kernels   
-         
+!$acc end kernels
 !
-
-!!$PRUS(:,:,:) = PRUS(:,:,:)                          &
-!!$             -DYF( MXM(PRVCT(:,:,:))*ZMEANY(:,:,:) )
-
-!$acc kernels   present(ZMEANY) present(PRUS)
-mxm(ZTEMP1,PRVCT)
+call mxm_device(PRVCT,ZTEMP1)
+!$acc kernels
 ZTEMP2 = ZTEMP1 * ZMEANY
-dyf(ZTEMP3,ZTEMP2)
+!$acc end kernels
+call dyf_device(ZTEMP2,ZTEMP3)
+!$acc kernels
 PRUS(:,:,:) = PRUS(:,:,:) - ZTEMP3
-!$acc end kernels            
-
+!$acc end kernels
 !
-
-!!$PRUS(:,:,:) = PRUS(:,:,:)                             &
-!!$             -DZF( MXM(PRWCT(:,:,:))*MZM4(PUT(:,:,:)) )
-
-!$acc kernels present(PUT,PRUS)
-mzm4(ZTEMP1,PUT)
-mxm(ZTEMP2,PRWCT)            
+ZTEMP1 = MZM4( PUT )
+call mxm_device(PRWCT,ZTEMP2)
+!$acc kernels
 ZTEMP3 = ZTEMP1 * ZTEMP2
-dzf(ZTEMP4,ZTEMP3)
+!$acc end kernels
+call dzf_device(1,IKU,1,ZTEMP3,ZTEMP4)
+!$acc kernels
 PRUS(:,:,:) = PRUS(:,:,:) - ZTEMP4
-!$acc end kernels            
+!$acc end kernels
 #endif
 !
 !
@@ -364,42 +352,35 @@ PRVS(:,:,:) = PRVS(:,:,:)                          &
 PRVS(:,:,:) = PRVS(:,:,:)                             &
              -DZF(1,IKU,1, MYM(PRWCT(:,:,:))*MZM4(PVT(:,:,:)) )
 #else
-!!$PRVS(:,:,:) = PRVS(:,:,:)                          &
-!!$             -DXF( MYM(PRUCT(:,:,:))*ZMEANX(:,:,:) ) 
-
-!$acc kernels  present(ZMEANX) present(PRVS)
-mym(ZTEMP1,PRUCT)
+call mym_device(PRUCT,ZTEMP1)
+!$acc kernels
 ZTEMP2 = ZTEMP1 * ZMEANX
-dxf(ZTEMP3,ZTEMP2) 
-PRVS(:,:,:) = PRVS(:,:,:) -  ZTEMP3   
-!$acc end kernels   
-                     
-
+!$acc end kernels
+call dxf_device(ZTEMP2,ZTEMP3)
+!$acc kernels
+PRVS(:,:,:) = PRVS(:,:,:) -  ZTEMP3
+!$acc end kernels
 !
-
-!!$PRVS(:,:,:) = PRVS(:,:,:)                          &
-!!$             -DYM( MYF(PRVCT(:,:,:))*ZMEANY(:,:,:) )
-
-!$acc kernels   present(ZMEANY) present(PRVS)
-myf(ZTEMP1,PRVCT)
+call myf_device(PRVCT,ZTEMP1)
+!$acc kernels
 ZTEMP2 = ZTEMP1 * ZMEANY
-dym(ZTEMP3,ZTEMP2)
+!$acc end kernels
+call dym_device(ZTEMP2,ZTEMP3)
+!$acc kernels
 PRVS(:,:,:) = PRVS(:,:,:) - ZTEMP3
-!$acc end kernels   
-
+!$acc end kernels
 !
-
-!!$PRVS(:,:,:) = PRVS(:,:,:)                             &
-!!$             -DZF( MYM(PRWCT(:,:,:))*MZM4(PVT(:,:,:)) )
-
-!$acc kernels present(PVT,PRVS)
-mym(ZTEMP1,PRWCT)
-mzm4(ZTEMP2,PVT)
+call mym_device(PRWCT,ZTEMP1)
+ZTEMP2 = MZM4( PVT )
+!$acc kernels
 ZTEMP3 = ZTEMP1 * ZTEMP2
-dzf(ZTEMP4,ZTEMP3)
+!$acc end kernels
+call dzf_device(1,IKU,1,ZTEMP3,ZTEMP4)
+!$acc kernels
 PRVS(:,:,:) = PRVS(:,:,:) - ZTEMP4
 !$acc end kernels
 #endif
+CALL MPPDB_CHECK(PRUCT,"ADVECUVW_4TH 02: PRUCT")
 !
 !
 IGRID = 4
@@ -422,38 +403,31 @@ PRWS(:,:,:) = PRWS(:,:,:)                          &
 PRWS(:,:,:) = PRWS(:,:,:)                             &
              -DZM(1,IKU,1, MZF(1,IKU,1,PRWCT(:,:,:))*MZF4(PWT(:,:,:)) )
 #else
-!!$PRWS(:,:,:) = PRWS(:,:,:)                          &
-!!$             -DXF( MZM(PRUCT(:,:,:))*ZMEANX(:,:,:) ) 
-
-!$acc kernels    present(ZMEANX) present(PRWS)
-mzm(ZTEMP1,PRUCT)
+call mzm_device(PRUCT,ZTEMP1)
+!$acc kernels
 ZTEMP2 = ZTEMP1 * ZMEANX
-dxf(ZTEMP3,ZTEMP2)
+!$acc end kernels
+call dxf_device(ZTEMP2,ZTEMP3)
+!$acc kernels
 PRWS(:,:,:) = PRWS(:,:,:)  - ZTEMP3
 !$acc end kernels
-
 !
-
-!!$PRWS(:,:,:) = PRWS(:,:,:)                          &
-!!$             -DYF( MZM(PRVCT(:,:,:))*ZMEANY(:,:,:) )
-
-!$acc kernels   present(ZMEANY) present(PRWS)
-mzm(ZTEMP1,PRVCT)
+call mzm_device(PRVCT,ZTEMP1)
+!$acc kernels
 ZTEMP2 = ZTEMP1 * ZMEANY
-dyf(ZTEMP3,ZTEMP2)
+!$acc end kernels
+call dyf_device(ZTEMP2,ZTEMP3)
+!$acc kernels
 PRWS(:,:,:) = PRWS(:,:,:) - ZTEMP3
 !$acc end kernels
-
 !
-
-!!$PRWS(:,:,:) = PRWS(:,:,:)                             &
-!!$             -DZM( MZF(PRWCT(:,:,:))*MZF4(PWT(:,:,:)) )
-
-!$acc kernels present(PWT,PRWS)
-mzf(ZTEMP1,PRWCT)
-mzf4(ZTEMP2,PWT)
-ZTEMP1 = ZTEMP1 * ZTEMP2 
-dzm(ZTEMP4,ZTEMP1)
+call mzf_device(1,IKU,1,PRWCT,ZTEMP1)
+ZTEMP2 = MZF4( PWT )
+!$acc kernels
+ZTEMP1 = ZTEMP1 * ZTEMP2
+!$acc end kernels
+call dzm_device(1,IKU,1,ZTEMP1,ZTEMP4)
+!$acc kernels
 PRWS(:,:,:) = PRWS(:,:,:) - ZTEMP4
 !$acc end kernels
 #endif
diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90
index b1cedba18..c1565caac 100644
--- a/src/MNH/prandtl.f90
+++ b/src/MNH/prandtl.f90
@@ -472,9 +472,6 @@ call Print_msg( NVERB_WARNING, 'GEN', 'PRANDTL', 'OpenACC: 1DIM not yet tested'
 ELSE IF (L2D) THEN                      ! 3D case in a 2D model
 !
   IF (KRR /= 0) THEN                 ! moist 3D case
-#ifdef _OPENACC
-call Print_msg( NVERB_WARNING, 'GEN', 'PRANDTL', 'OpenACC: L2D=.T. and KRR/=0 not yet tested' )
-#endif
 #ifndef _OPENACC
 #ifndef MNH_BITREP
     PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * &
diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90
index 8f4de6488..1ab89d3f3 100644
--- a/src/MNH/turb_hor_dyn_corr.f90
+++ b/src/MNH/turb_hor_dyn_corr.f90
@@ -573,14 +573,9 @@ END IF
 ! Complete the U tendency
 #ifndef _OPENACC
 IF (.NOT. LFLAT) THEN
-CALL MPPDB_CHECK3DM("before turb_corr:PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ",PRECISION,&
-                   & PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ )
-
   PRUS(:,:,:)=PRUS                                            &
               -DXM(PRHODJ * ZFLX / MXF(PDXX) )                &
               +DZF(1,IKU,1, PDZX / MZM(1,IKU,1,PDXX) * MXM( MZM(1,IKU,1,PRHODJ*ZFLX) * PINV_PDZZ ) )
-CALL MPPDB_CHECK3DM("after  turb_corr:PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ",PRECISION,&
-                   & PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ )
 ELSE
   PRUS(:,:,:)=PRUS -DXM(PRHODJ * ZFLX / MXF(PDXX) )
 END IF
diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90
index 641f760b4..8e8bb8953 100644
--- a/src/MNH/turb_hor_vw.f90
+++ b/src/MNH/turb_hor_vw.f90
@@ -194,7 +194,9 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP          ! TKE production terms
 REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))       &
                                      :: ZFLX,ZWORK
     ! work arrays
-!   
+!$acc declare create(ZFLX)
+!$acc declare device_resident(ZWORK)
+!
 !! REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: ZVPTV
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
-- 
GitLab