From 0f417f68322703b6c146f08e724dbd3d63dd27bc Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 5 Sep 2023 14:47:03 +0200
Subject: [PATCH] Philippe 05/09/2023: OpenACC: add directives for RAD_BOUND

---
 src/MNH/cphase_profile.f90 | 112 +++++++++++++++++++++++-------------
 src/MNH/modeln.f90         |  16 +++---
 src/MNH/rad_bound.f90      | 115 +++++++++++++++++++++++++++++++------
 3 files changed, 178 insertions(+), 65 deletions(-)

diff --git a/src/MNH/cphase_profile.f90 b/src/MNH/cphase_profile.f90
index d743241db..a46010d73 100644
--- a/src/MNH/cphase_profile.f90
+++ b/src/MNH/cphase_profile.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2010-2023 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !#########################
 MODULE MODI_CPHASE_PROFILE
@@ -56,6 +56,10 @@ END MODULE MODI_CPHASE_PROFILE
 !
 USE MODD_CTURB
 USE MODD_PARAMETERS
+
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
+#endif
 !
 IMPLICIT NONE
 !
@@ -75,8 +79,13 @@ REAL, DIMENSION(:,:),OPTIONAL   ,  INTENT(IN)  :: PTKEM ! TKE at t-dt
 INTEGER             :: IKB       ! indice K Beginning in z direction 
 INTEGER             :: IKE       ! indice K End       in z direction 
 ! 
+#ifndef MNH_OPENACC
 REAL, DIMENSION(SIZE(PCPHASE_PROFILE,1)) :: ZTKE, ZTKEMIN           
+#else
+REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZTKE, ZTKEMIN
+#endif
 INTEGER                                  :: JL,JK,JKTKE
+INTEGER                                  :: JLMAX ! Intermediate variable to work around problem with CCE 15.0.1
 !
 !-------------------------------------------------------------------------------
 !
@@ -87,53 +96,78 @@ INTEGER                                  :: JL,JK,JKTKE
 ! 
 IKB = 1 + JPVEXT
 IKE = SIZE(PCPHASE_PROFILE,2) - JPVEXT
+JLMAX = SIZE(PCPHASE_PROFILE,1)
 !
+#ifdef MNH_OPENACC
+CALL MNH_MEM_POSITION_PIN( 'CPHASE_PROFILE' )
+
+CALL MNH_MEM_GET( ZTKE,    SIZE( PCPHASE_PROFILE, 1 ) )
+CALL MNH_MEM_GET( ZTKEMIN, SIZE( PCPHASE_PROFILE, 1 ) )
+
+!$acc data present( PZHAT, PCPHASE_PROFILE,ZTKE, ZTKEMIN )
+#endif
 !
 !*       1.2  Initializations
 !
 !
-PCPHASE_PROFILE   = 0.0
-ZTKEMIN           = PZHAT(IKE)
-ZTKE              = PZHAT(IKE-1)
+!$acc kernels
+PCPHASE_PROFILE(:,:) = 0.0
+ZTKEMIN(:)           = PZHAT(IKE)
+ZTKE(:)              = PZHAT(IKE-1)
+!$acc end kernels
 !-------------------------------------------------------------------------------
 !-------------------------------------------------------------------------------
 !
-    IF (PRESENT(PTKEM)) THEN
-!
-     DO JL = 1,SIZE(PCPHASE_PROFILE,1)
-      JKTKE=IKE-1
-      DO JK = IKB, IKE-1 
-       IF (PTKEM(JL,JK) < 5.*XTKEMIN ) THEN
-           ZTKE (JL) = PZHAT (JK)
-           JKTKE = JK
-           EXIT
-        END IF
-      END DO
-      DO JK = JKTKE+1,IKE
-       IF (PTKEM(JL,JK) == XTKEMIN ) THEN
-           ZTKEMIN (JL) = PZHAT (JK)
-           EXIT
-        END IF
-      END DO
-     END DO
-!
-    ELSE 
-      ZTKE (:) = 1000.
-      ZTKEMIN (:) = 2000.
-    END IF
-!
-    DO JL = 1,SIZE(PCPHASE_PROFILE,1)
-     DO JK = IKB, IKE
-      IF (PZHAT(JK) > ZTKEMIN (JL) ) THEN
-        PCPHASE_PROFILE(JL,JK) = PCPHASE
-      ELSE IF  (PZHAT(JK) < ZTKE (JL) ) THEN
-        PCPHASE_PROFILE(JL,JK) = PCPHASE_PBL
-      ELSE 
-        PCPHASE_PROFILE(JL,JK) = 1./(ZTKEMIN (JL) - ZTKE (JL)) * &
-         ((PZHAT(JK) - ZTKE(JL)) * PCPHASE + (ZTKEMIN (JL) - PZHAT(JK)) * PCPHASE_PBL )
+IF (PRESENT(PTKEM)) THEN
+!acc data present( PTKEM )
+!$acc kernels
+!$acc loop private( JKTKE )  independent
+  DO JL = 1, JLMAX
+    JKTKE=IKE-1
+    DO JK = IKB, IKE-1
+      IF (PTKEM(JL,JK) < 5.*XTKEMIN ) THEN
+        ZTKE (JL) = PZHAT (JK)
+        JKTKE = JK
+        EXIT
       END IF
-     END DO
     END DO
+    DO JK = JKTKE+1,IKE
+      IF (PTKEM(JL,JK) == XTKEMIN ) THEN
+        ZTKEMIN (JL) = PZHAT (JK)
+        EXIT
+      END IF
+    END DO
+  END DO
+!$acc end kernels
+!acc end data
+ELSE
+!$acc kernels
+  ZTKE (:) = 1000.
+  ZTKEMIN (:) = 2000.
+!$acc end kernels
+END IF
+!
+!$acc kernels
+DO JL = 1, JLMAX
+  DO JK = IKB, IKE
+    IF (PZHAT(JK) > ZTKEMIN (JL) ) THEN
+      PCPHASE_PROFILE(JL,JK) = PCPHASE
+    ELSE IF  (PZHAT(JK) < ZTKE (JL) ) THEN
+      PCPHASE_PROFILE(JL,JK) = PCPHASE_PBL
+    ELSE
+      PCPHASE_PROFILE(JL,JK) = 1./(ZTKEMIN (JL) - ZTKE (JL)) * &
+                              ((PZHAT(JK) - ZTKE(JL)) * PCPHASE + (ZTKEMIN (JL) - PZHAT(JK)) * PCPHASE_PBL )
+    END IF
+  END DO
+END DO
+!$acc end kernels
+
+#ifdef MNH_OPENACC
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE( 'CPHASE_PROFILE' )
+#endif
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 9dcd0490b..9c8499e3c 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -1640,16 +1640,15 @@ XTIME_LES_BU_PROCESS = 0.
 !$acc data create ( XUT, XVT, XWT )                                             &
 !$acc &    present( XTHT, XRT, XPABST, XTHVREF, XRHODJ )                        &
 !$acc &    present( XDXX, XDYY, XDZZ, XDZX, XDZY, XRUS, XRVS, XRWS, XRWS_PRES ) &
-!$acc &    present ( XRRS, XRSVS, XRTHS_CLD, XRRS_CLD, XRSVS_CLD )              &
-!$acc &    copyin ( XSVT )
+!$acc &    present( XRRS, XRSVS, XRTHS_CLD, XRRS_CLD, XRSVS_CLD )               &
+!$acc &    copyin ( XTKET, XSVT )
 !
 !$acc update device( XRUS, XRVS, XRWS, XRRS, XRSVS )
 !$acc update device( XRUS_PRES, XRVS_PRES, XRWS_PRES )
 !$acc update device( XUT, XVT, XWT, XTHT, XRT, XRHODJ, XRTHS )
 !$acc update device( XRTHS_CLD, XRRS_CLD, XRSVS_CLD )
 !
-!$acc data copyin (XTKET)   &
-!$acc &    copy   (XRTKES)  &
+!$acc data copy   (XRTKES)  &
 !$acc &    copyout(XRTKEMS)
 #ifdef MNH_BITREP_OMP
 CALL SBR_FZ(XRRS_CLD)
@@ -1773,7 +1772,6 @@ ELSE
                  XRUS_PRES, XRVS_PRES, XRWS_PRES                     )
 END IF
 !
-!$acc end data
 !
 CALL SECOND_MNH2(ZTIME2)
 !
@@ -1813,7 +1811,8 @@ CALL MPPDB_CHECKLB(XLBYVM,"modeln XLBYVM",PRECISION,'LBYV',NRIMY)
 CALL MPPDB_CHECKLB(XLBXUS,"modeln XLBXUS",PRECISION,'LBXU',NRIMX)
 CALL MPPDB_CHECKLB(XLBYVS,"modeln XLBYVS",PRECISION,'LBYV',NRIMY)
 !
-!$acc update self( XRUS, XRVS, XRWS )
+!$acc data copyin( XDXHAT, XDYHAT, XZHAT, XLBXUM, XLBYVM, XLBXUS, XLBYVS, &
+!$acc &            XFLUCTUNW, XFLUCTVNN, XFLUCTUNE, XFLUCTVNS )
 CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX,             &
                 XTSTEP,                                  &
                 XDXHAT, XDYHAT, XZHAT,                   &
@@ -1821,8 +1820,8 @@ CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX,             &
                 XLBXUM, XLBYVM, XLBXUS, XLBYVS,          &
                 XFLUCTUNW,XFLUCTVNN,XFLUCTUNE,XFLUCTVNS, &
                 XCPHASE, XCPHASE_PBL, XRHODJ,            &
-                XTKET,XRUS, XRVS, XRWS                   )
-!$acc update device( XRUS, XRVS, XRWS )
+                XTKET, XRUS, XRVS, XRWS                  )
+!$acc end data
 !$acc kernels present(ZRUS,ZRVS,ZRWS)
 ZRUS(:,:,:)=XRUS(:,:,:)-ZRUS(:,:,:)
 ZRVS(:,:,:)=XRVS(:,:,:)-ZRVS(:,:,:)
@@ -1833,6 +1832,7 @@ CALL SECOND_MNH2(ZTIME2)
 !
 XT_RAD_BOUND = XT_RAD_BOUND + ZTIME2 - ZTIME1
 !
+!$acc end data
 !-------------------------------------------------------------------------------
 !
 !*       19.    PRESSURE COMPUTATION
diff --git a/src/MNH/rad_bound.f90 b/src/MNH/rad_bound.f90
index 22c423583..6ebe2487b 100644
--- a/src/MNH/rad_bound.f90
+++ b/src/MNH/rad_bound.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -166,6 +166,9 @@ USE MODD_PRECISION,   ONLY: MNHREAL32
 USE MODD_RECYCL_PARAM_n, ONLY: LRECYCL, XRCOEFF
 !
 USE MODE_ll
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
+#endif
 !
 USE MODI_CPHASE_PROFILE
 !
@@ -213,10 +216,14 @@ INTEGER             :: IJE       ! indice J End       in y direction
 INTEGER             :: IKB       ! indice K Beginning in z direction 
 INTEGER             :: IKE       ! indice K End       in z direction 
 INTEGER             :: ILBX,ILBY ! number of points of the RIM arrays
+#ifdef MNH_OPENACC
+INTEGER             :: IIU, IJU, IKU
+#endif
 ! 
 REAL                :: ZINVTSTEP ! Inverse of the applicable timestep
 REAL                :: ZKTSTEP   !  Rayleigh damping by the timestep
 !
+#ifndef MNH_OPENACC
 REAL, DIMENSION(SIZE(PUT,2),SIZE(PUT,3)) :: ZLBGU  ! LB x-gradient 
 REAL, DIMENSION(SIZE(PUT,2),SIZE(PUT,3)) :: ZLBEU  ! LB temporal Evolution
 REAL, DIMENSION(SIZE(PUT,2),SIZE(PUT,3)) :: ZLBXU  ! LB field at t or t+1        
@@ -231,7 +238,27 @@ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,3)) :: ZCPHASY! Normalized Phase velocity
 !                                                  ! for V field at Y-boundaries
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,3)) :: ZPHASY ! Phase velocity
 !                                                  ! for V field at Y-boundaries
+#else
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBGU  ! LB x-gradient
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBEU  ! LB temporal Evolution
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBXU  ! LB field at t or t+1
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZCPHASX! Normalized Phase velocity
+!                                                 ! for U field at X-boundaries
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZPHASX!  Phase velocity
+!                                                 ! for U field at X-boundaries
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBGV  ! LB y-gradient
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBEV  ! LB temporal Evolution
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBYV  ! LB field at t or t+1
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZCPHASY! Normalized Phase velocity
+!                                                  ! for V field at Y-boundaries
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZPHASY ! Phase velocity
+!                                                  ! for V field at Y-boundaries
+#endif
 REAL                                     :: ZALPHA2! implicitness of the damping
+
+LOGICAL :: GRECYCL
+REAL    :: ZRCOEFF
+
 !
 !-------------------------------------------------------------------------------
 !
@@ -244,6 +271,35 @@ CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IKB = 1 + JPVEXT
 IKE = SIZE(PUT,3) - JPVEXT
 !
+! Copy LRECYCL and XRCOEFF to local variables to work around problem with NVHP 23.7
+GRECYCL = LRECYCL
+ZRCOEFF = XRCOEFF
+!
+#ifdef MNH_OPENACC
+IIU = SIZE( PUT, 1 )
+IJU = SIZE( PUT, 2 )
+IKU = SIZE( PUT, 3 )
+
+CALL MNH_MEM_POSITION_PIN( 'RAD_BOUND' )
+
+CALL MNH_MEM_GET( ZLBGU,   IJU, IKU )
+CALL MNH_MEM_GET( ZLBEU,   IJU, IKU )
+CALL MNH_MEM_GET( ZLBXU,   IJU, IKU )
+CALL MNH_MEM_GET( ZCPHASX, IJU, IKU )
+CALL MNH_MEM_GET( ZPHASX,  IJU, IKU )
+
+CALL MNH_MEM_GET( ZLBGV,   IIU, IKU )
+CALL MNH_MEM_GET( ZLBEV,   IIU, IKU )
+CALL MNH_MEM_GET( ZLBYV,   IIU, IKU )
+CALL MNH_MEM_GET( ZCPHASY, IIU, IKU )
+CALL MNH_MEM_GET( ZPHASY,  IIU, IKU )
+
+!$acc data present( PDXHAT, PDYHAT, PZHAT, PUT, PVT, PLBXUM, PLBYVM, PLBXUS, PLBYVS, &
+!$acc &             PFLUCTUNW, PFLUCTVNN, PFLUCTUNE, PFLUCTVNS,                      &
+!$acc &             PRHODJ, PTKET, PRUS, PRVS, PRWS,                                 &
+!$acc &             ZLBGU, ZLBEU, ZLBXU, ZCPHASX, ZPHASX,                            &
+!$acc &             ZLBGV, ZLBEV, ZLBYV, ZCPHASY, ZPHASY                             )
+#endif
 !
 !*       1.2  Compute the inverse of the applicable timestep
 !
@@ -271,7 +327,9 @@ SELECT CASE ( HLBCX(1) )
 !
   CASE ('WALL')
 !
+!$acc kernels
        PRUS (IIB,:,:) = 0.
+!$acc end kernels
 !
 !*       2.2  OPEN CASE:
 !             ========= 
@@ -284,6 +342,7 @@ SELECT CASE ( HLBCX(1) )
        CALL CPHASE_PROFILE(PZHAT,PCPHASE,PCPHASE_PBL,ZPHASX)
     END IF
 
+!$acc kernels
     ZCPHASX(:,:) = MAX ( 0., MIN ( 1.,                                      & 
                       (-PUT(IIB,:,:) + ZPHASX(:,:) ) * PTSTEP / PDXHAT(IIB)  )    )
                       ! notice that ZCPHASX=0. when ZPHASX  < PUT(IIB,:,:)  
@@ -292,8 +351,8 @@ SELECT CASE ( HLBCX(1) )
     IF ( SIZE(PLBXUS,1) == 0 ) THEN
       ZLBEU (:,:) = 0.
       ZLBGU (:,:) = PLBXUM(JPHEXT+1,:,:) - PLBXUM(JPHEXT,:,:)  ! 2 - 1
-      IF ( LRECYCL ) THEN
-        ZLBXU(:,:)  = PLBXUM(JPHEXT,:,:) + PFLUCTUNW * XRCOEFF
+      IF ( GRECYCL ) THEN
+        ZLBXU(:,:)  = PLBXUM(JPHEXT,:,:) + PFLUCTUNW * ZRCOEFF
       ELSE
         ZLBXU(:,:)  = PLBXUM(JPHEXT,:,:)
       END IF
@@ -301,8 +360,8 @@ SELECT CASE ( HLBCX(1) )
       ZLBEU (:,:) = PLBXUS(JPHEXT,:,:) ! 1
       ZLBGU (:,:) = PLBXUM(JPHEXT+1,:,:) - PLBXUM(JPHEXT,:,:) +  & ! 2 -  1
                       PTSTEP * (PLBXUS(JPHEXT+1,:,:) - PLBXUS(JPHEXT,:,:)) ! 2 - 1
-      IF ( LRECYCL ) THEN
-        ZLBXU(:,:)  = PLBXUM(JPHEXT,:,:)+ PTSTEP *PLBXUS(JPHEXT,:,:) + PFLUCTUNW * XRCOEFF ! 1  + 1
+      IF ( GRECYCL ) THEN
+        ZLBXU(:,:)  = PLBXUM(JPHEXT,:,:)+ PTSTEP *PLBXUS(JPHEXT,:,:) + PFLUCTUNW * ZRCOEFF ! 1  + 1
       ELSE
         ZLBXU(:,:)  = PLBXUM(JPHEXT,:,:)+ PTSTEP *PLBXUS(JPHEXT,:,:) ! 1  + 1
       END IF
@@ -333,7 +392,7 @@ SELECT CASE ( HLBCX(1) )
               + (   ZLBEU (:,:) * PTSTEP                                     &
                     -  ZLBGU (:,:) * ZCPHASX(:,:)                            &
                     +  ZKTSTEP*ZLBXU(:,:)   )  )  
-
+!$acc end kernels
 !
 !
 END SELECT
@@ -356,7 +415,9 @@ SELECT CASE ( HLBCX(2) )
 !
   CASE ('WALL')
 !
+!$acc kernels
        PRUS (IIE+1,:,:) = 0.
+!$acc end kernels
 !
 !*       3.2  OPEN CASE:
 !             =========
@@ -369,6 +430,7 @@ SELECT CASE ( HLBCX(2) )
        CALL CPHASE_PROFILE(PZHAT,PCPHASE,PCPHASE_PBL,ZPHASX)
     END IF
 !
+!$acc kernels
     ZCPHASX(:,:) = MAX ( 0., MIN ( 1.,                                  &
                     ( PUT(IIE+1,:,:) + ZPHASX(:,:) ) * PTSTEP/PDXHAT(IIE)  )      )
 !
@@ -377,8 +439,8 @@ SELECT CASE ( HLBCX(2) )
     IF (SIZE(PLBXUS,1) == 0 ) THEN
       ZLBEU (:,:) = 0.
       ZLBGU (:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) - PLBXUM(ILBX-JPHEXT,:,:) ! ILBX / (ILBX-1
-      IF ( LRECYCL ) THEN
-        ZLBXU(:,:)  = PLBXUM(ILBX-JPHEXT+1,:,:) + PFLUCTUNE * XRCOEFF
+      IF ( GRECYCL ) THEN
+        ZLBXU(:,:)  = PLBXUM(ILBX-JPHEXT+1,:,:) + PFLUCTUNE * ZRCOEFF
       ELSE
         ZLBXU(:,:)  = PLBXUM(ILBX-JPHEXT+1,:,:)
       END IF
@@ -386,8 +448,8 @@ SELECT CASE ( HLBCX(2) )
       ZLBEU (:,:) = PLBXUS(ILBX-JPHEXT+1,:,:)                          
       ZLBGU (:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) - PLBXUM(ILBX-JPHEXT,:,:) +  &
                       PTSTEP * (PLBXUS(ILBX-JPHEXT+1,:,:) - PLBXUS(ILBX-JPHEXT,:,:))
-      IF ( LRECYCL ) THEN
-        ZLBXU(:,:)  = PLBXUM(ILBX-JPHEXT+1,:,:) + PTSTEP * PLBXUS(ILBX-JPHEXT+1,:,:) + PFLUCTUNE * XRCOEFF
+      IF ( GRECYCL ) THEN
+        ZLBXU(:,:)  = PLBXUM(ILBX-JPHEXT+1,:,:) + PTSTEP * PLBXUS(ILBX-JPHEXT+1,:,:) + PFLUCTUNE * ZRCOEFF
       ELSE
         ZLBXU(:,:)  = PLBXUM(ILBX-JPHEXT+1,:,:) + PTSTEP * PLBXUS(ILBX-JPHEXT+1,:,:)
       END IF
@@ -418,6 +480,7 @@ SELECT CASE ( HLBCX(2) )
               + (   ZLBEU (:,:) * PTSTEP                                        &
                     +  ZLBGU (:,:) * ZCPHASX(:,:)                               &
                     +  ZKTSTEP*ZLBXU(:,:)   )  )   
+!$acc end kernels
 !
 !
 !
@@ -442,7 +505,9 @@ SELECT CASE ( HLBCY(1) )
 !
   CASE ('WALL')
 !
+!$acc kernels
        PRVS (:,IJB,:) = 0.
+!$acc end kernels
 !
 !*       4.2  OPEN CASE:
 !             ========= 
@@ -455,14 +520,15 @@ SELECT CASE ( HLBCY(1) )
        CALL CPHASE_PROFILE(PZHAT,PCPHASE,PCPHASE_PBL,ZPHASY)
     END IF    
 !
+!$acc kernels
     ZCPHASY(:,:) = MAX ( 0., MIN ( 1.,                                      &
                     (-PVT(:,IJB,:) + ZPHASY(:,:) ) * PTSTEP/ PDYHAT(IJB)   )      )
 !
     IF ( SIZE(PLBYVS,1) == 0 ) THEN
       ZLBEV (:,:) = 0.
       ZLBGV (:,:) = PLBYVM(:,JPHEXT+1,:) - PLBYVM(:,JPHEXT,:) 
-      IF ( LRECYCL ) THEN
-        ZLBYV(:,:)  = PLBYVM(:,JPHEXT,:) + PFLUCTVNS * XRCOEFF
+      IF ( GRECYCL ) THEN
+        ZLBYV(:,:)  = PLBYVM(:,JPHEXT,:) + PFLUCTVNS * ZRCOEFF
       ELSE
         ZLBYV(:,:)  = PLBYVM(:,JPHEXT,:)
       END IF
@@ -470,8 +536,8 @@ SELECT CASE ( HLBCY(1) )
       ZLBEV (:,:) = PLBYVS(:,JPHEXT,:)
       ZLBGV (:,:) = PLBYVM(:,JPHEXT+1,:) - PLBYVM(:,JPHEXT,:) +  &
                       PTSTEP * (PLBYVS(:,JPHEXT+1,:) - PLBYVS(:,JPHEXT,:))
-      IF ( LRECYCL ) THEN
-        ZLBYV(:,:)  = PLBYVM(:,JPHEXT,:) + PTSTEP * PLBYVS(:,JPHEXT,:) + PFLUCTVNS * XRCOEFF
+      IF ( GRECYCL ) THEN
+        ZLBYV(:,:)  = PLBYVM(:,JPHEXT,:) + PTSTEP * PLBYVS(:,JPHEXT,:) + PFLUCTVNS * ZRCOEFF
       ELSE
         ZLBYV(:,:)  = PLBYVM(:,JPHEXT,:) + PTSTEP * PLBYVS(:,JPHEXT,:)
       END IF
@@ -502,6 +568,7 @@ SELECT CASE ( HLBCY(1) )
               + (   ZLBEV (:,:) * PTSTEP                                   &
                     -  ZLBGV (:,:) * ZCPHASY(:,:)                          &
                     +  ZKTSTEP*ZLBYV(:,:)   )  )   
+!$acc end kernels
 !
 !
 !
@@ -526,7 +593,9 @@ SELECT CASE ( HLBCY(2) )
 !
   CASE ('WALL')
 !
+!$acc kernels
        PRVS (:,IJE+1,:) = 0.
+!$acc end kernels
 !
 !*       5.2  OPEN CASE:
 !             ========= 
@@ -539,6 +608,7 @@ SELECT CASE ( HLBCY(2) )
        CALL CPHASE_PROFILE(PZHAT,PCPHASE,PCPHASE_PBL,ZPHASY)
     END IF    
 !
+!$acc kernels
     ZCPHASY(:,:) = MAX ( 0., MIN ( 1.,                                      &
                     ( PVT(:,IJE+1,:) + ZPHASY(:,:) ) * PTSTEP/PDYHAT(IJE)  )      )
 !
@@ -546,8 +616,8 @@ SELECT CASE ( HLBCY(2) )
     IF ( SIZE(PLBYVS,1) == 0 ) THEN
       ZLBEV (:,:) = 0.
       ZLBGV (:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) - PLBYVM(:,ILBY-JPHEXT,:) 
-      IF ( LRECYCL ) THEN
-        ZLBYV(:,:)  = PLBYVM(:,ILBY-JPHEXT+1,:) + PFLUCTVNN * XRCOEFF
+      IF ( GRECYCL ) THEN
+        ZLBYV(:,:)  = PLBYVM(:,ILBY-JPHEXT+1,:) + PFLUCTVNN * ZRCOEFF
       ELSE
         ZLBYV(:,:)  = PLBYVM(:,ILBY-JPHEXT+1,:)
       END IF
@@ -555,8 +625,8 @@ SELECT CASE ( HLBCY(2) )
       ZLBEV (:,:) = PLBYVS(:,ILBY-JPHEXT+1,:)
       ZLBGV (:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) - PLBYVM(:,ILBY-JPHEXT,:) +  &
                       PTSTEP * (PLBYVS(:,ILBY-JPHEXT+1,:) - PLBYVS(:,ILBY-JPHEXT,:))
-      IF ( LRECYCL ) THEN
-        ZLBYV(:,:)  = PLBYVM(:,ILBY-JPHEXT+1,:) + PTSTEP *PLBYVS(:,ILBY-JPHEXT+1,:) + PFLUCTVNN * XRCOEFF
+      IF ( GRECYCL ) THEN
+        ZLBYV(:,:)  = PLBYVM(:,ILBY-JPHEXT+1,:) + PTSTEP *PLBYVS(:,ILBY-JPHEXT+1,:) + PFLUCTVNN * ZRCOEFF
       ELSE
         ZLBYV(:,:)  = PLBYVM(:,ILBY-JPHEXT+1,:) + PTSTEP *PLBYVS(:,ILBY-JPHEXT+1,:)
       END IF
@@ -587,6 +657,7 @@ SELECT CASE ( HLBCY(2) )
               + (   ZLBEV (:,:) * PTSTEP                                      &
                     +  ZLBGV (:,:) * ZCPHASY(:,:)                             &
                     +  ZKTSTEP*ZLBYV(:,:)   )  )   
+!$acc end kernels
 ! 
 !
 END SELECT
@@ -597,8 +668,16 @@ END IF
 !*       6.    UPPER BOUNDARY (FLAT SURFACE): 
 !              ------------------------------
 !
+!$acc kernels
 PRWS (:,:,IKE+1) = 0.
+!$acc end kernels
 !
+#ifdef MNH_OPENACC
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE( 'RAD_BOUND' )
+#endif
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE RAD_BOUND
-- 
GitLab