From 7bcbb68bc7d766eb2f280dee2593c48157e80d3c Mon Sep 17 00:00:00 2001
From: Juan ESCOBAR <juan.escobar@aero.obs-mip.fr>
Date: Wed, 26 Oct 2022 15:47:44 +0200
Subject: [PATCH] Juan 26/10/2022:MNH/*, Cray CCE/14.0.3++ Optimsation Problems
 , add present_cr & minor kernels restructuration

---
 src/MNH/advecuvw_2nd.f90         |   4 +
 src/MNH/advecuvw_rk.f90          |  45 +--
 src/MNH/ice_adjust.f90           |  16 +-
 src/MNH/mode_prandtl.f90         | 465 ++++++++++++++++++++++++++-----
 src/MNH/rain_ice.f90             |  16 +-
 src/MNH/rain_ice_nucleation.f90  |   4 +-
 src/MNH/turb.f90                 | 115 ++++----
 src/MNH/turb_hor_dyn_corr.f90    |  14 +-
 src/MNH/turb_hor_thermo_flux.f90 | 154 +++++-----
 src/MNH/turb_hor_uv.f90          |  16 +-
 src/MNH/turb_hor_uw.f90          |  10 +-
 src/MNH/turb_hor_vw.f90          |  18 +-
 src/MNH/turb_ver_dyn_flux.f90    |  76 ++---
 src/MNH/turb_ver_thermo_corr.f90 | 142 +++++-----
 14 files changed, 735 insertions(+), 360 deletions(-)

diff --git a/src/MNH/advecuvw_2nd.f90 b/src/MNH/advecuvw_2nd.f90
index a8313c2f5..5f79d3f6a 100644
--- a/src/MNH/advecuvw_2nd.f90
+++ b/src/MNH/advecuvw_2nd.f90
@@ -117,6 +117,10 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS, PRVS, PRWS ! Sources of Momentu
 !*       1.     COMPUTES THE ADVECTIVE TENDANCIES
 !	        ---------------------------------
 !
+!PASCAL
+print*," ATTENTION variable PRUS sur GPU "
+STOP
+
 PRUS(:,:,:) = PRUS(:,:,:)                              &
              -DXM( MXF(PRUCT(:,:,:))*MXF(PUT(:,:,:)) ) 
 !
diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90
index fc1572e0e..511919367 100644
--- a/src/MNH/advecuvw_rk.f90
+++ b/src/MNH/advecuvw_rk.f90
@@ -213,6 +213,7 @@ TYPE(LIST_ll), POINTER      :: TZFIELDS4_ll ! list of fields to exchange
 LOGICAL :: GIBM !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0)
 REAL    :: ZIBM_EPSI !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0)
 REAL          :: ZTIME1,ZTIME2
+INTEGER :: JJI,JJJ,JJK
 !-------------------------------------------------------------------------------
 
 IF (MPPDB_INITIALIZED) THEN
@@ -314,7 +315,7 @@ CALL INIT_ON_HOST_AND_DEVICE(ZWT,6e99,'ADVECUVW_RK::ZWT')
 !$acc data present( PU, PV, PW, PUT, PVT, PWT, PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ, &
 !$acc &             PRUCT, PRVCT, PRWCT, PRUS_ADV, PRVS_ADV, PRWS_ADV,             &
 !$acc &             PRUS_OTHER, PRVS_OTHER, PRWS_OTHER, ZUT, ZVT, ZWT,             &
-!$acc &             ZRUS, ZRVS, ZRWS, ZIBM, ZBUT, ZBUTS )
+!$acc &             ZRUS, ZRVS, ZRWS, ZBUT, ZBUTS )
 
 SELECT CASE (HTEMP_SCHEME)
   CASE('RK11')
@@ -402,20 +403,20 @@ END SELECT
 !$acc update device(ZBUTS,ZBUT)
 !
 IF ( GIBM ) THEN
-!$acc kernels
+!$acc kernels present(ZIBM)
   ZIBM(:,:,:,:) = 1.
 !$acc end kernels
 END IF
 !
 IF (GIBM .AND. CIBM_ADV=='FREEZE') THEN
-!$acc kernels
+!$acc kernels present(ZIBM)
   WHERE (XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI) ZIBM(:,:,:,1) = 0.
   WHERE (XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI) ZIBM(:,:,:,2) = 0.
   WHERE (XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI) ZIBM(:,:,:,3) = 0.
 !$acc end kernels
 ENDIF
 !
-!$acc kernels present(PRUS_ADV,PRVS_ADV,PRWS_ADV) present(ZUT,ZVT,ZWT) present(PU,PV,PW)
+!$acc kernels present_cr(PU,PV,PW,PRUS_ADV,PRVS_ADV,PRWS_ADV,ZUT,ZVT,ZWT)
 PRUS_ADV = 0.
 PRVS_ADV = 0.
 PRWS_ADV = 0.
@@ -447,7 +448,7 @@ CALL ADD3DFIELD_ll( TZFIELDMT_ll, ZWT, 'ADVECUVW_RK::ZWT' )
 INBVAR = 3
 CALL INIT_HALO2_ll(TZHALO2MT_ll,INBVAR,SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3))
 !
-!$acc kernels
+!$acc kernels present_cr(ZRUS,ZRVS,ZRWS)
 ZRUS(:, :, :, : ) = 0.
 ZRVS(:, :, :, : ) = 0.
 ZRWS(:, :, :, : ) = 0.
@@ -486,7 +487,7 @@ RKLOOP: DO JS = 1, ISPL
 !        --------------------------
 !
   IF (GIBM .AND. CIBM_ADV=='LOWORD') THEN
-!$acc kernels
+!$acc kernels present_cr(ZIBM,ZRUS,ZRVS,ZRWS)
     ZIBM(:,:,:,1)=ZRUS(:,:,:,JS)
     ZIBM(:,:,:,2)=ZRVS(:,:,:,JS)
     ZIBM(:,:,:,3)=ZRWS(:,:,:,JS)
@@ -513,13 +514,25 @@ RKLOOP: DO JS = 1, ISPL
                         TZHALO2MT_ll                                    )
     ENDIF
     IF (HUVW_ADV_SCHEME=='CEN4TH') THEN
+       !$acc update self(ZIBM)
        CALL ADVECUVW_2ND (ZUT, ZVT, ZWT, PRUCT, PRVCT, PRWCT,            &
                           ZIBM(:,:,:,1),  ZIBM(:,:,:,2),  ZIBM(:,:,:,3))
+       !$acc update device(ZIBM)
     ENDIF
-    WHERE(XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI) ZRUS(:,:,:,JS)=ZIBM(:,:,:,1)
-    WHERE(XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI) ZRVS(:,:,:,JS)=ZIBM(:,:,:,2)
-    WHERE(XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI) ZRWS(:,:,:,JS)=ZIBM(:,:,:,3)
+    !$acc kernels present_cr(ZIBM,ZRUS,ZRVS,ZRWS)
+    !$mnh_expand_where(JJI=1:IIU,JJJ=1:IJU,JJK=1:IKU)
+    WHERE(XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI)
+       ZRUS(:,:,:,JS)=ZIBM(:,:,:,1)
+    END WHERE
+    WHERE(XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI)
+       ZRVS(:,:,:,JS)=ZIBM(:,:,:,2)
+    END WHERE
+    WHERE(XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI)
+       ZRWS(:,:,:,JS)=ZIBM(:,:,:,3)
+    END WHERE
+    !$mnh_end_expand_where()
     ZIBM(:,:,:,:)=1.
+    !$acc end kernels
   ENDIF
 !
   write ( ynum, '( I3 )' ) js
@@ -552,15 +565,15 @@ RKLOOP: DO JS = 1, ISPL
 !
 ! Guesses at the end of the RK loop
 !
-!$acc kernels present(PRUS_ADV,PRVS_ADV,PRWS_ADV,ZBUTS) present(ZRUS,ZRVS,ZRWS,ZIBM)
+!$acc kernels present_cr(PRUS_ADV,PRVS_ADV,PRWS_ADV,ZBUTS) present_cr(ZRUS,ZRVS,ZRWS,ZIBM)
   IF ( .NOT. GIBM ) THEN
     PRUS_ADV(:,:,:) = PRUS_ADV(:,:,:) + ZBUTS(JS) * ZRUS(:,:,:,JS)
     PRVS_ADV(:,:,:) = PRVS_ADV(:,:,:) + ZBUTS(JS) * ZRVS(:,:,:,JS)
     PRWS_ADV(:,:,:) = PRWS_ADV(:,:,:) + ZBUTS(JS) * ZRWS(:,:,:,JS)
   ELSE
-    PRUS_ADV(:,:,:) = PRUS_ADV(:,:,:) + ZBUTS(JI) * ZRUS(:,:,:,JI) * ZIBM(:,:,:,1)
-    PRVS_ADV(:,:,:) = PRVS_ADV(:,:,:) + ZBUTS(JI) * ZRVS(:,:,:,JI) * ZIBM(:,:,:,2)
-    PRWS_ADV(:,:,:) = PRWS_ADV(:,:,:) + ZBUTS(JI) * ZRWS(:,:,:,JI) * ZIBM(:,:,:,3)
+    PRUS_ADV(:,:,:) = PRUS_ADV(:,:,:) + ZBUTS(JS) * ZRUS(:,:,:,JS) * ZIBM(:,:,:,1)
+    PRVS_ADV(:,:,:) = PRVS_ADV(:,:,:) + ZBUTS(JS) * ZRVS(:,:,:,JS) * ZIBM(:,:,:,2)
+    PRWS_ADV(:,:,:) = PRWS_ADV(:,:,:) + ZBUTS(JS) * ZRWS(:,:,:,JS) * ZIBM(:,:,:,3)
   END IF
 !$acc end kernels
 !
@@ -570,7 +583,7 @@ RKLOOP: DO JS = 1, ISPL
 ! !$acc & present(ZRUS,ZRVS,ZRWS,ZIBM) present(PRUS_OTHER,PRVS_OTHER,PRWS_OTHER) &
 ! !$acc & present(PMXM_RHODJ,PMYM_RHODJ,PMZM_RHODJ)
 !
-!$acc kernels present( ZUT, ZVT, ZWT )
+!$acc kernels present_cr( ZUT, ZVT, ZWT )
     ZUT(:,:,:) = PU(:,:,:)
     ZVT(:,:,:) = PV(:,:,:)
     ZWT(:,:,:) = PW(:,:,:)
@@ -581,7 +594,7 @@ RKLOOP: DO JS = 1, ISPL
 ! Intermediate guesses inside the RK loop
 !
       IF ( .NOT. GIBM ) THEN
-!$acc kernels present( ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS )
+!$acc kernels present_cr(ZUT,ZVT,ZWT,ZRUS,ZRVS,ZRWS )
         ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) *  PTSTEP *  &
           ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:)
         ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) *  PTSTEP *  &
@@ -590,7 +603,7 @@ RKLOOP: DO JS = 1, ISPL
           ( ZRWS(:,:,:,JI) + PRWS_OTHER(:,:,:) ) / PMZM_RHODJ(:,:,:)
 !$acc end kernels
       ELSE
-!$acc kernels present( ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS, ZIBM )
+!$acc kernels present_cr(ZUT,ZVT,ZWT,ZRUS,ZRVS,ZRWS,ZIBM )
         ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) *  PTSTEP *  &
           ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:) * ZIBM(:,:,:,1)
         ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) *  PTSTEP *  &
diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90
index dc70a8b50..ede57bc29 100644
--- a/src/MNH/ice_adjust.f90
+++ b/src/MNH/ice_adjust.f90
@@ -410,25 +410,25 @@ CALL MNH_MEM_GET( ZTEMP_BUD    , IIU, IJU, IKU )
 #endif
 
 if ( lbudget_th ) then
-   !$acc kernels
+   !$acc kernels present_cr(ZTEMP_BUD)
    ZTEMP_BUD(:,:,:) = pths(:, :, :) * prhodj(:, :, :)
    !$acc end kernels
    call Budget_store_init( tbudgets(NBUDGET_TH), trim( hbuname ), ZTEMP_BUD(:,:,:) )
 end if
 if ( lbudget_rv ) then
-   !$acc kernels
+   !$acc kernels present_cr(ZTEMP_BUD)
    ZTEMP_BUD(:,:,:) = prvs(:, :, :) * prhodj(:, :, :)
    !$acc end kernels
    call Budget_store_init( tbudgets(NBUDGET_RV), trim( hbuname ), ZTEMP_BUD(:,:,:) )
 end if
 if ( lbudget_rc ) then
-   !$acc kernels
+   !$acc kernels present_cr(ZTEMP_BUD)
    ZTEMP_BUD(:,:,:) = prcs(:, :, :) * prhodj(:, :, :)
    !$acc end kernels
    call Budget_store_init( tbudgets(NBUDGET_RC), trim( hbuname ), ZTEMP_BUD(:,:,:) )
 end if
 if ( lbudget_ri ) then
-   !$acc kernels
+   !$acc kernels present_cr(ZTEMP_BUD)
    ZTEMP_BUD(:,:,:) = pris(:, :, :) * prhodj(:, :, :)
    !$acc end kernels
    call Budget_store_init( tbudgets(NBUDGET_RI), trim( hbuname ), ZTEMP_BUD(:,:,:) )
@@ -684,25 +684,25 @@ IF(GPOUT_TH) POUT_TH=ZT / PEXN(:,:,:)
 !            ----------------------
 !
 if ( lbudget_th ) then
-   !$acc kernels
+   !$acc kernels present_cr(ZTEMP_BUD)
    ZTEMP_BUD(:,:,:) = pths(:, :, :) * prhodj(:, :, :)
    !$acc end kernels
    call Budget_store_end( tbudgets(NBUDGET_TH), trim( hbuname ), ZTEMP_BUD(:,:,:) )
 end if
 if ( lbudget_rv ) then
-   !$acc kernels
+   !$acc kernels present_cr(ZTEMP_BUD)
    ZTEMP_BUD(:,:,:) = prvs(:, :, :) * prhodj(:, :, :)
    !$acc end kernels
    call Budget_store_end( tbudgets(NBUDGET_RV), trim( hbuname ), ZTEMP_BUD(:,:,:) )
 end if
 if ( lbudget_rc ) then
-   !$acc kernels
+   !$acc kernels present_cr(ZTEMP_BUD)
    ZTEMP_BUD(:,:,:) = prcs(:, :, :) * prhodj(:, :, :)
    !$acc end kernels
    call Budget_store_end( tbudgets(NBUDGET_RC), trim( hbuname ), ZTEMP_BUD(:,:,:) )
 end if
 if ( lbudget_ri ) then
-   !$acc kernels
+   !$acc kernels present_cr(ZTEMP_BUD)
    ZTEMP_BUD(:,:,:) = pris(:, :, :) * prhodj(:, :, :)
    !$acc end kernels
    call Budget_store_end( tbudgets(NBUDGET_RI), trim( hbuname ), ZTEMP_BUD(:,:,:) )
diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90
index 50bf57bf1..e8e8bb1cb 100644
--- a/src/MNH/mode_prandtl.f90
+++ b/src/MNH/mode_prandtl.f90
@@ -500,7 +500,7 @@ IF (LTURBDIM_3DIM) THEN
            D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) )
 #else
   CALL D_PHI3DTDZ_O_DDTDZ( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, HTURBDIM, OUSERV, ZTMP1_DEVICE )
-!$acc kernels
+!$acc kernels present_cr(PD_PHI3DTDZ2_O_DDTDZ)
   PD_PHI3DTDZ2_O_DDTDZ(:,:,:) = PDTDZ(:,:,:) * (PPHI3(:,:,:) + ZTMP1_DEVICE(:,:,:) )
 !$acc end kernels
 #endif
@@ -673,8 +673,10 @@ SUBROUTINE M3_WTH_W2TH(PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH)
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_WTH_W2TH
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+#else
+ REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PM3_WTH_W2TH )
@@ -683,11 +685,15 @@ SUBROUTINE M3_WTH_W2TH(PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH)
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_W2TH', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+ CALL MNH_MEM_POSITION_PIN() 
+ CALL MNH_MEM_GET(ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) 
 #endif
 
-!$acc data create( ztmp1_device )
+!$acc data present( ztmp1_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -709,6 +715,11 @@ PM3_WTH_W2TH(:,:,IKE+1)=PM3_WTH_W2TH(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+ !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+ CALL MNH_MEM_RELEASE()
+#endif
+
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_WTH_W2TH
@@ -734,8 +745,10 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE,P
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_WTH_W2TH_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+#else 
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PBLL_O_E, PETHETA, PKEFF, PTKE, PD_M3_WTH_W2TH_O_DDTDZ )
@@ -744,11 +757,15 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE,P
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_W2TH_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET(ztmp1_device, size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
 #endif
 
-!$acc data create( ztmp1_device )
+!$acc data present( ztmp1_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -780,6 +797,11 @@ PD_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_W2TH_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_WTH_W2TH_O_DDTDZ
@@ -804,8 +826,10 @@ SUBROUTINE M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_WTH_W2R)
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_WTH_W2R
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+#else
+  REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE
 #endif
 
 !$acc data present( PD, PKEFF, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_WTH_W2R )
@@ -814,11 +838,15 @@ SUBROUTINE M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_WTH_W2R)
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_W2R', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET(ztmp1_device, size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
 #endif
 
-!$acc data create( ztmp1_device )
+!$acc data present( ztmp1_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -838,6 +866,12 @@ PM3_WTH_W2R(:,:,IKE+1)=PM3_WTH_W2R(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_WTH_W2R
@@ -863,8 +897,10 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PD
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_WTH_W2R_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+  #else
+  REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PBLL_O_E, PEMOIST, PD_M3_WTH_W2R_O_DDTDZ )
@@ -873,11 +909,16 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PD
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_W2R_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET(ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
 #endif
 
-!$acc data create( ztmp1_device )
+!$acc data present( ztmp1_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -899,6 +940,10 @@ PD_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_W2R_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_WTH_W2R_O_DDTDZ
@@ -926,8 +971,10 @@ SUBROUTINE M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_WTH_WR2
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+  #else
+  REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PD, PKEFF, PTKE, PSQRT_TKE, PBLL_O_E, PBETA, PLEPS, PEMOIST, PDTDZ, PM3_WTH_WR2 )
@@ -936,12 +983,18 @@ SUBROUTINE M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_WR2', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET(ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 )) 
+CALL MNH_MEM_GET(ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 )) 
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -974,6 +1027,10 @@ PM3_WTH_WR2(:,:,IKE+1)=PM3_WTH_WR2(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_WTH_WR2
@@ -1004,8 +1061,10 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_WTH_WR2_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+  #else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PTKE, PSQRT_TKE, PBETA, PLEPS, PREDTH1, PREDR1, PD, PKEFF, PBLL_O_E, PEMOIST, PD_M3_WTH_WR2_O_DDTDZ )
@@ -1014,12 +1073,18 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_WR2_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1054,6 +1119,10 @@ PD_M3_WTH_WR2_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_WR2_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_WTH_WR2_O_DDTDZ
@@ -1080,8 +1149,11 @@ SUBROUTINE M3_WTH_WTHR(PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST,PM3_WT
   REAL, DIMENSION(SIZE(PREDR1,1),SIZE(PREDR1,2),SIZE(PREDR1,3)),INTENT(OUT) :: PM3_WTH_WTHR
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
+
 #endif
 
 !$acc data present( PREDR1, PD, PKEFF, PTKE, PSQRT_TKE, PBETA, PLEPS, PEMOIST, PM3_WTH_WTHR )
@@ -1090,12 +1162,19 @@ SUBROUTINE M3_WTH_WTHR(PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST,PM3_WT
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_WTHR', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1119,6 +1198,10 @@ PM3_WTH_WTHR(:,:,IKE+1)=PM3_WTH_WTHR(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_WTH_WTHR
@@ -1185,8 +1268,11 @@ SUBROUTINE M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH2_W2TH)
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_W2TH
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+   #else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
+
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PDTDZ, PLM, PLEPS, PTKE, PM3_TH2_W2TH )
@@ -1195,12 +1281,18 @@ SUBROUTINE M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH2_W2TH)
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_W2TH', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1225,6 +1317,10 @@ PM3_TH2_W2TH(:,:,IKE+1)=PM3_TH2_W2TH(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_W2TH
@@ -1250,8 +1346,10 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_T
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_W2TH_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PD_M3_TH2_W2TH_O_DDTDZ )
@@ -1260,12 +1358,18 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_T
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_W2TH_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1325,6 +1429,10 @@ PD_M3_TH2_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_W2TH_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_W2TH_O_DDTDZ
@@ -1348,8 +1456,10 @@ SUBROUTINE M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH2)
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_WTH2
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+   #else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PM3_TH2_WTH2 )
@@ -1358,12 +1468,18 @@ SUBROUTINE M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH2)
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WTH2', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1395,6 +1511,10 @@ PM3_TH2_WTH2(:,:,IKE+1)=PM3_TH2_WTH2(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_WTH2
@@ -1420,8 +1540,11 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_WTH2_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+   #else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
+
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_TH2_WTH2_O_DDTDZ )
@@ -1430,12 +1553,19 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WTH2_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1471,6 +1601,10 @@ PD_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WTH2_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_WTH2_O_DDTDZ
@@ -1496,8 +1630,11 @@ SUBROUTINE M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_W2R)
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_W2R
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+   #else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
+
 #endif
 
 !$acc data present( PD, PLM, PLEPS, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_W2R )
@@ -1506,12 +1643,19 @@ SUBROUTINE M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_W2R)
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_W2R', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1546,6 +1690,10 @@ PM3_TH2_W2R(:,:,IKE+1)=PM3_TH2_W2R(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_W2R
@@ -1573,8 +1721,10 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIS
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_W2R_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PD_M3_TH2_W2R_O_DDTDZ )
@@ -1583,12 +1733,19 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIS
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_W2R_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1621,6 +1778,10 @@ PD_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_W2R_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_W2R_O_DDTDZ
@@ -1645,8 +1806,10 @@ SUBROUTINE M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_WR2)
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_WR2
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_WR2 )
@@ -1655,12 +1818,19 @@ SUBROUTINE M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_WR2)
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WR2', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1695,6 +1865,10 @@ PM3_TH2_WR2(:,:,IKE+1)=PM3_TH2_WR2(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_WR2
@@ -1721,8 +1895,10 @@ SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOI
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_WR2_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PD_M3_TH2_WR2_O_DDTDZ )
@@ -1730,12 +1906,19 @@ SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOI
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WR2_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1773,6 +1956,10 @@ PD_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WR2_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_WR2_O_DDTDZ
@@ -1798,8 +1985,10 @@ SUBROUTINE M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_WTHR
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_WTHR )
@@ -1808,12 +1997,19 @@ SUBROUTINE M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WTHR', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1837,6 +2033,10 @@ PM3_TH2_WTHR(:,:,IKE+1)=PM3_TH2_WTHR(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_WTHR
@@ -1863,8 +2063,10 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMO
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_WTHR_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PD_M3_TH2_WTHR_O_DDTDZ )
@@ -1873,12 +2075,19 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMO
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WTHR_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1903,6 +2112,10 @@ PD_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WTHR_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_WTHR_O_DDTDZ
@@ -1926,8 +2139,10 @@ SUBROUTINE M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTHR)
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_THR_WTHR
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PM3_THR_WTHR )
@@ -1936,12 +2151,19 @@ SUBROUTINE M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTHR)
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_WTHR', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -1965,6 +2187,10 @@ PM3_THR_WTHR(:,:,IKE+1)=PM3_THR_WTHR(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_THR_WTHR
@@ -1990,8 +2216,10 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_WTHR_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_THR_WTHR_O_DDTDZ )
@@ -2000,12 +2228,19 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTHR_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -2029,6 +2264,10 @@ PD_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_WTHR_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_WTHR_O_DDTDZ
@@ -2054,8 +2293,10 @@ SUBROUTINE M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_THR_
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_THR_WTH2
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PDRDZ, PM3_THR_WTH2 )
@@ -2064,12 +2305,19 @@ SUBROUTINE M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_THR_
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_WTH2', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -2093,6 +2341,10 @@ PM3_THR_WTH2(:,:,IKE+1)=PM3_THR_WTH2(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_THR_WTH2
@@ -2119,8 +2371,10 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_WTH2_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PDRDZ, PD_M3_THR_WTH2_O_DDTDZ )
@@ -2129,12 +2383,19 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTH2_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -2171,6 +2432,10 @@ PD_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_WTH2_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_WTH2_O_DDTDZ
@@ -2196,8 +2461,10 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_WTH2_O_DDRDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_THR_WTH2_O_DDRDZ )
@@ -2206,12 +2473,19 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTH2_O_DDRDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -2238,6 +2512,10 @@ PD_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=PD_M3_THR_WTH2_O_DDRDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_WTH2_O_DDRDZ
@@ -2262,8 +2540,10 @@ SUBROUTINE M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH)
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_THR_W2TH
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDR1, PD, PLM, PLEPS, PTKE, PDRDZ, PM3_THR_W2TH )
@@ -2272,12 +2552,19 @@ SUBROUTINE M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH)
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_W2TH', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -2301,6 +2588,10 @@ PM3_THR_W2TH(:,:,IKE+1)=PM3_THR_W2TH(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION M3_THR_W2TH
@@ -2328,8 +2619,10 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_W2TH_O_DDTDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PBLL_O_E, PDRDZ, PETHETA, PD_M3_THR_W2TH_O_DDTDZ )
@@ -2338,12 +2631,19 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_W2TH_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -2404,8 +2704,10 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2TH
   REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_W2TH_O_DDRDZ
 #endif
   INTEGER :: IKB, IKE
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PD_M3_THR_W2TH_O_DDRDZ )
@@ -2414,12 +2716,19 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2TH
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_W2TH_O_DDRDZ', 'OpenACC: not yet tested' )
 #endif
 
-#ifdef MNH_OPENACC
+#ifndef MNH_OPENACC
 allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
 allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) )
+
 #endif
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
@@ -2454,6 +2763,10 @@ PD_M3_THR_W2TH_O_DDRDZ(:,:,IKE+1)=PD_M3_THR_W2TH_O_DDRDZ(:,:,IKE)
 !$acc end data
 
 !$acc end data
+#ifdef MNH_OPENACC
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_W2TH_O_DDRDZ
diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90
index ab373a19e..2c9d9a834 100644
--- a/src/MNH/rain_ice.f90
+++ b/src/MNH/rain_ice.f90
@@ -534,10 +534,12 @@ CALL RAIN_ICE_NUCLEATION(IIB, IIE, IJB, IJE, IKTB, IKTE,KRR,PTSTEP,&
 !  optimization by looking for locations where
 !  the microphysical fields are larger than a minimal value only !!!
 !
-!$acc kernels
+!$acc kernels present_cr(GMICRO)
 GMICRO(:,:,:) = .FALSE.
+!$acc end kernels
 
  IF ( KRR == 7 ) THEN
+!$acc kernels present_cr(GMICRO)
   GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) =                          &
                 PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. &
                 PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. &
@@ -545,15 +547,17 @@ GMICRO(:,:,:) = .FALSE.
                 PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. &
                 PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) .OR. &
                 PRHT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(7)
+!$acc end kernels
  ELSE IF( KRR == 6 ) THEN
+!$acc kernels present_cr(GMICRO)
   GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) =                          &
                 PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. &
                 PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. &
                 PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. &
                 PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. &
                 PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6)
- END IF
 !$acc end kernels
+ END IF
 
 #ifndef MNH_OPENACC
 IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:))
@@ -996,7 +1000,7 @@ IF( IMICRO >= 0 ) THEN
   ENDIF
 
   !Diagnostic of precipitation fraction
-!$acc kernels
+!$acc kernels present_cr(PRAINFR,ZRS_ZERO,ZRG_ZERO)
   PRAINFR(:,:,:) = 0.
 #ifdef MNH_OPENACC
   ZRS_ZERO(:,:,:) = 0.
@@ -1082,7 +1086,7 @@ IF( IMICRO >= 0 ) THEN
 !
   IF( OWARM ) THEN    !  Check if the formation of the raindrops by the slow
                       !  warm processes is allowed
-!$acc kernels
+!$acc kernels present_cr(PEVAP3D)
     PEVAP3D(:,:,:)= 0.
 !$acc end kernels
     CALL RAIN_ICE_WARM(GMICRO, IMICRO, I1, I2, I3,                                                           &
@@ -1120,7 +1124,7 @@ IF( IMICRO >= 0 ) THEN
 !               ----------------------------------------------
 !
  IF ( KRR == 7 ) THEN
-!$acc kernels
+!$acc kernels present_cr(ZLBDAH)
   ZLBDAH(:) = 0.
 !$acc end kernels
   CALL RAIN_ICE_FAST_RH(GMICRO, ZRHODREF, ZRVT, ZRCT, ZRIT, ZRST, ZRGT, ZRHT, ZRHODJ, ZPRES, &
@@ -1249,7 +1253,7 @@ ELSE
 END IF
 
 !sedimentation of rain fraction
-!$acc kernels
+!$acc kernels present_cr(ZRR,ZRS,ZRG)
 ZRR(:,:,:) = PRRS(:,:,:) * PTSTEP
 ZRS(:,:,:) = PRSS(:,:,:) * PTSTEP
 ZRG(:,:,:) = PRGS(:,:,:) * PTSTEP
diff --git a/src/MNH/rain_ice_nucleation.f90 b/src/MNH/rain_ice_nucleation.f90
index c44d51d60..d563437d5 100644
--- a/src/MNH/rain_ice_nucleation.f90
+++ b/src/MNH/rain_ice_nucleation.f90
@@ -173,9 +173,11 @@ DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
 END DO
 #endif
 !
+!$acc end kernels
+
 !  optimization by looking for locations where
 !  the temperature is negative only !!!
-!
+!$acc kernels present_cr(GNEGT)
 GNEGT(:,:,:) = .FALSE.
 GNEGT(KIB:KIE,KJB:KJE,KKTB:KKTE) = PT(KIB:KIE,KJB:KJE,KKTB:KKTE)<XTT
 !$acc end kernels
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index 6c9b64d17..266e76bd7 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -712,15 +712,21 @@ GTURBLEN_BL89_TURBLEN_RM17_TURBLEN_ADAP_ORMC01 = &
      HTURBLEN=='BL89' .OR. HTURBLEN=='RM17' .OR. HTURBLEN == 'ADAP' .OR. ORMC01
 !
 !$acc update device(PTHLT,PRT)
-!$acc kernels present_cr(ZCOEF_DISS,ZTHLM,ZRM,zcp)
+!PASCAL
+!!$acc kernels present_cr(ZCOEF_DISS,ZTHLM,ZRM,zcp)
 !Copy data into ZTHLM and ZRM only if needed
 IF (HTURBLEN=='BL89' .OR. HTURBLEN=='RM17' .OR. HTURBLEN=='ADAP' .OR. ORMC01) THEN
-  DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
-    ZTHLM(JI,JJ,JK) = PTHLT(JI,JJ,JK)
-    ZRM(JI,JJ,JK,:) = PRT(JI,JJ,JK,:)
-  END DO
+  !$acc kernels   present_cr(ZTHLM,ZRM)
+  ZTHLM(:,:,:) = PTHLT(:,:,:)
+  ZRM(:,:,:,:) = PRT(:,:,:,:)
+  !DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+    !ZTHLM(JI,JJ,JK) = PTHLT(JI,JJ,JK)
+    !ZRM(JI,JJ,JK,:) = PRT(JI,JJ,JK,:)
+  !END DO
+  !$acc end kernels
 END IF
 !
+!$acc kernels present_cr(ZTRH,ZCOEF_DISS,ZTHLM,ZRM,zcp)
 ZTRH(:, :, : ) = XUNDEF
 !
 !----------------------------------------------------------------------------
@@ -805,7 +811,7 @@ IF (KRRL >=1) THEN
     CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, &
                                  ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE)
 !
-!$acc kernels present( zamoist, zatheta, zlocpexnm, zlvocpexnm, zlsocpexnm, zamoist_ice, zatheta_ice )    
+!$acc kernels present_cr( zamoist, zatheta, zlocpexnm, zlvocpexnm, zlsocpexnm, zamoist_ice, zatheta_ice )    
     DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        IF (PRT(JI,JJ,JK,2)+PRT(JI,JJ,JK,4)>0.0) THEN
           ZFRAC_ICE(JI,JJ,JK) = PRT(JI,JJ,JK,4) / ( PRT(JI,JJ,JK,2)+PRT(JI,JJ,JK,4) )
@@ -861,7 +867,7 @@ IF (KRRL >=1) THEN
   END IF
 !
 ELSE
-!$acc kernels present( zlocpexnm )
+!$acc kernels present_cr( zlocpexnm )
   ZLOCPEXNM=0.
 !$acc end kernels
 END IF              ! loop end on KRRL >= 1
@@ -870,7 +876,7 @@ END IF              ! loop end on KRRL >= 1
 !
 !$acc update device(PRRS,PRTHLS)
 IF ( KRRL >= 1 ) THEN
-!$acc kernels present( zlocpexnm )
+!$acc kernels present_cr( zlocpexnm )
   IF ( KRRI >= 1 ) THEN
     DO CONCURRENT (JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ! Rnp at t
@@ -907,7 +913,7 @@ SELECT CASE (HTURBLEN)
 !           ------------------
 
   CASE ('BL89')
-!$acc kernels
+!$acc kernels present_cr(ZSHEAR)
     ZSHEAR(:, :, : ) = 0.
 !$acc end kernels
     CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM)
@@ -998,7 +1004,7 @@ END IF
 !*      3.6 Dissipative length
 !           ------------------
 !
-!$acc kernels
+!$acc kernels present_cr(ZLEPS)
 ZLEPS(:,:,:)=PLEM(:,:,:)
 !
 !*      3.7 Correction in the Surface Boundary Layer (Redelsperger 2001)
@@ -1064,7 +1070,7 @@ ENDIF
 !
     CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE)
   ELSE
-!$acc kernels
+!$acc kernels present_cr(ZUSLOPE,ZVSLOPE)
     ZUSLOPE=PUT(:,:,KKA)
     ZVSLOPE=PVT(:,:,KKA)
 !$acc end kernels
@@ -1127,7 +1133,7 @@ IF (HTOM=='TM06') THEN
   CALL GZ_W_M_DEVICE(ZMTH2,PDZZ,ZFTH2)    ! -d(w'th'2 )/dz
   !CALL GZ_W_M_DEVICE(ZMR2, PDZZ,ZFR2)     ! -d(w'r'2  )/dz
   !CALL GZ_W_M_DEVICE(ZMTHR,PDZZ,ZFTHR)    ! -d(w'th'r')/dz
-!$acc kernels
+!$acc kernels present_cr(ZFWTH,ZFTH2,ZFWR,ZFR2,ZFTHR)
   ZFWTH = -ZFWTH
   !ZFWR  = -ZFWR
   ZFTH2 = -ZFTH2
@@ -1150,7 +1156,7 @@ IF (HTOM=='TM06') THEN
   ZFTHR = 0.
 !$acc end kernels
 ELSE
-!$acc kernels
+!$acc kernels present_cr(ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR)
   ZFWTH(:,:,:) = 0.
   ZFWR(:,:,:)  = 0.
   ZFTH2(:,:,:) = 0.
@@ -1170,13 +1176,13 @@ if ( lbudget_w )  call Budget_store_init( tbudgets(NBUDGET_W ), 'VTURB', prws  (
 
 if ( lbudget_th ) then
    if ( krri >= 1 .and. krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) &
                                           + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) 
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', ZTEMP_BUD(:,:,:) )
    else if ( krrl >= 1 ) then
-      !$acc kernels present( ZTEMP_BUD, zlocpexnm )
+      !$acc kernels present_cr( ZTEMP_BUD, zlocpexnm )
       ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', ZTEMP_BUD(:,:,:) )
@@ -1187,12 +1193,12 @@ end if
 
 if ( lbudget_rv ) then
    if ( krri >= 1 .and. krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', ZTEMP_BUD(:,:,:) )
    else if ( krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prrs(:, :, :, 1) - prrs(:, :, :, 2) 
       !$acc end kernels
     call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', ZTEMP_BUD(:,:,:) )
@@ -1236,13 +1242,13 @@ if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'VTURB', prws(:, :,
 
 if ( lbudget_th ) then
    if ( krri >= 1 .and. krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) &
                                           + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) 
       !$acc end kernels      
       call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', ZTEMP_BUD(:,:,:) )
    else if ( krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD, zlocpexnm )
+      !$acc kernels present_cr(ZTEMP_BUD, zlocpexnm )
       ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2)
       !$acc end kernels    
     call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', ZTEMP_BUD(:,:,:) )
@@ -1253,12 +1259,12 @@ end if
 
 if ( lbudget_rv ) then
    if ( krri >= 1 .and. krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4)
       !$acc end kernels      
       call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', ZTEMP_BUD(:,:,:) )
    else if ( krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prrs(:, :, :, 1) - prrs(:, :, :, 2) 
       !$acc end kernels      
       call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', ZTEMP_BUD(:,:,:) )
@@ -1283,13 +1289,13 @@ if ( hturbdim == '3DIM' ) then
 
   if (lbudget_th)  then
      if ( krri >= 1 .and. krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) &
                                           + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) 
       !$acc end kernels        
       call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', ZTEMP_BUD(:,:,:) )
    else if ( krrl >= 1 ) then
-     !$acc kernels present(ZTEMP_BUD, zlocpexnm )
+     !$acc kernels present_cr(ZTEMP_BUD, zlocpexnm )
       ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2)
       !$acc end kernels      
       call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', ZTEMP_BUD(:,:,:) )
@@ -1300,12 +1306,12 @@ if ( hturbdim == '3DIM' ) then
 
   if ( lbudget_rv ) then
      if ( krri >= 1 .and. krrl >= 1 ) then
-        !$acc kernels present(ZTEMP_BUD)
+        !$acc kernels present_cr(ZTEMP_BUD)
         ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4)
         !$acc end kernels       
         call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', ZTEMP_BUD(:,:,:) )
      else if ( krrl >= 1 ) then
-        !$acc kernels present(ZTEMP_BUD)
+        !$acc kernels present_cr(ZTEMP_BUD)
         ZTEMP_BUD(:,:,:) =  prrs(:, :, :, 1) - prrs(:, :, :, 2) 
         !$acc end kernels       
         call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', ZTEMP_BUD(:,:,:) )
@@ -1345,13 +1351,13 @@ if ( hturbdim == '3DIM' ) then
 
   if ( lbudget_th ) then
      if ( krri >= 1 .and. krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) &
                                           + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) 
       !$acc end kernels        
       call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', ZTEMP_BUD(:,:,:) )
    else if ( krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD, zlocpexnm )
+      !$acc kernels present_cr(ZTEMP_BUD, zlocpexnm )
       ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2)
       !$acc end kernels     
       call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', ZTEMP_BUD(:,:,:) )
@@ -1362,12 +1368,12 @@ if ( hturbdim == '3DIM' ) then
 
   if ( lbudget_rv ) then
      if ( krri >= 1 .and. krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4)
       !$acc end kernels        
       call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', ZTEMP_BUD(:,:,:) )
    else if ( krrl >= 1 ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prrs(:, :, :, 1) - prrs(:, :, :, 2) 
       !$acc end kernels     
       call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', ZTEMP_BUD(:,:,:) )
@@ -1399,7 +1405,7 @@ end if
        PTHP = PTHP + XG / PTHVREF * MZF( PFLXZTHVMF )
 #else
       CALL MZF_DEVICE( PFLXZTHVMF, ZTMP1_DEVICE )
-!$acc kernels
+!$acc kernels present_cr(PTHP)
       PTHP(:,:,:) = PTHP(:,:,:) + XG / PTHVREF(:,:,:) * ZTMP1_DEVICE(:,:,:)
 !$acc end kernels
 #endif
@@ -1481,7 +1487,7 @@ END IF
 !
 IF ( KRRL >= 1 ) THEN
   IF ( KRRI >= 1 ) THEN
-!$acc kernels
+!$acc kernels present_cr(PRT,PRRS,PTHLT,PRTHLS)
     PRT(:,:,:,1)  = PRT(:,:,:,1)  - PRT(:,:,:,2)  - PRT(:,:,:,4)
     PRRS(:,:,:,1) = PRRS(:,:,:,1) - PRRS(:,:,:,2) - PRRS(:,:,:,4)
     PTHLT(:,:,:)  = PTHLT(:,:,:)  + ZLVOCPEXNM(:,:,:) * PRT(:,:,:,2) &
@@ -1499,7 +1505,7 @@ IF ( KRRL >= 1 ) THEN
     CALL MNH_MEM_RELEASE()
 #endif
   ELSE
-!$acc kernels present( zlocpexnm )
+!$acc kernels present_cr(PRT,PRRS,PTHLT,PRTHLS, zlocpexnm )
     PRT(:,:,:,1)  = PRT(:,:,:,1)  - PRT(:,:,:,2) 
     PRRS(:,:,:,1) = PRRS(:,:,:,1) - PRRS(:,:,:,2)
     PTHLT(:,:,:)  = PTHLT(:,:,:)  + ZLOCPEXNM(:,:,:) * PRT(:,:,:,2)
@@ -1533,7 +1539,7 @@ IF (LLES_CALL) THEN
 #ifndef MNH_OPENACC
   CALL LES_MEAN_SUBGRID((PSFU*PSFU+PSFV*PSFV)**0.25,X_LES_USTAR)
 #else
-!$acc kernels
+!$acc kernels present_cr(ZTMP1_DEVICE)
   ZTMP1_DEVICE(:,:,1) = (PSFU*PSFU+PSFV*PSFV)**0.25
 !$acc end kernels
   CALL LES_MEAN_SUBGRID(ZTMP1_DEVICE(:,:,1),X_LES_USTAR)
@@ -1579,17 +1585,17 @@ IF (LLES_CALL) THEN
 #else
   IF (HTURBDIM=="1DIM") THEN
 !$acc data copy(X_LES_SUBGRID_U2,X_LES_SUBGRID_V2,X_LES_SUBGRID_W2,X_LES_RES_ddz_Thl_SBG_W2)
-!$acc kernels
+!$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE = 2./3.*PTKET
 !$acc end kernels
     CALL LES_MEAN_SUBGRID(ZTMP1_DEVICE,X_LES_SUBGRID_U2)
-!$acc kernels
+!$acc kernels present_cr(X_LES_SUBGRID_V2,X_LES_SUBGRID_W2)
     X_LES_SUBGRID_V2(:,:,:) = X_LES_SUBGRID_U2(:,:,:)
     X_LES_SUBGRID_W2(:,:,:) = X_LES_SUBGRID_U2(:,:,:)
 !$acc end kernels
     CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PTHLT,PDZZ,ZTMP2_DEVICE)
     CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
-!$acc kernels
+!$acc kernels present_cr(ZTMP2_DEVICE)
       ZTMP2_DEVICE = ZTMP1_DEVICE*ZTMP3_DEVICE
 !$acc end kernels
     CALL LES_MEAN_SUBGRID(ZTMP2_DEVICE,X_LES_RES_ddz_Thl_SBG_W2)
@@ -1598,7 +1604,7 @@ IF (LLES_CALL) THEN
 !$acc data copy(X_LES_RES_ddz_Rt_SBG_W2)
       CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PRT(:,:,:,1),PDZZ,ZTMP2_DEVICE)
       CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
-!$acc kernels
+!$acc kernels present_cr(ZTMP2_DEVICE)
       ZTMP2_DEVICE = ZTMP1_DEVICE*PTKET*ZTMP3_DEVICE
 !$acc end kernels
       CALL LES_MEAN_SUBGRID(ZTMP2_DEVICE,X_LES_RES_ddz_Rt_SBG_W2)
@@ -1608,7 +1614,7 @@ IF (LLES_CALL) THEN
     DO JSV=1,NSV
       CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PSVT(:,:,:,JSV),PDZZ,ZTMP2_DEVICE)
       CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
-!$acc kernels
+!$acc kernels present_cr(ZTMP2_DEVICE)
       ZTMP2_DEVICE = ZTMP1_DEVICE*PTKET*ZTMP3_DEVICE
 !$acc end kernels
       CALL LES_MEAN_SUBGRID(ZTMP2_DEVICE,X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV))
@@ -1627,7 +1633,7 @@ IF (LLES_CALL) THEN
 !
 !* presso-correlations for subgrid Tke are equal to zero.
 !
-!$acc kernels
+!$acc kernels present_cr(ZLEPS)
   ZLEPS = 0. !ZLEPS is used as a work array (not used anymore)
 !$acc end kernels
   CALL LES_MEAN_SUBGRID(ZLEPS,X_LES_SUBGRID_WP)
@@ -1757,7 +1763,7 @@ geast  = HLBCX(2) /= "CYCL" .AND. LEAST_ll()
 gsouth = HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()
 gnorth = HLBCY(2) /= "CYCL" .AND. LNORTH_ll()
 
-!$acc kernels
+!$acc kernels present_cr(PUSLOPE)
 IF ( gwest ) THEN
   PUSLOPE(IIB-1,:)=PUSLOPE(IIB,:)
   PVSLOPE(IIB-1,:)=PVSLOPE(IIB,:)
@@ -1853,7 +1859,7 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
 !
 !*       1.1 Lv/Cph at  t
 !
-!$acc kernels ! present(ZRVSAT,ZDRVSATDT) ! present(PLOCPEXN) ! present ZDRVSATDT)
+!$acc kernels present_cr(PLOCPEXN) ! present(ZRVSAT,ZDRVSATDT) ! present(PLOCPEXN) ! present ZDRVSATDT)
   PLOCPEXN(:,:,:) = ( PLTT + (XCPV-PC) *  (PT(:,:,:)-XTT) ) / PCP(:,:,:)
 !
 !*      1.2 Saturation vapor pressure at t
@@ -1885,9 +1891,9 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
   PAMOIST(:,:,:)=  0.5 / ( 1.0 + ZDRVSATDT(:,:,:) * PLOCPEXN(:,:,:) )
 !
 !$acc end kernels  
-!$acc kernels  
 !*      1.6 compute Atheta
 #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+!$acc kernels   present_cr(PATHETA)
   PATHETA(:,:,:)= PAMOIST(:,:,:) * PEXN(:,:,:) *                             &
         ( ( ZRVSAT(:,:,:) - PRT(:,:,:,1) ) * PLOCPEXN(:,:,:) /               &
           ( 1. + ZDRVSATDT(:,:,:) * PLOCPEXN(:,:,:) )        *               &
@@ -1899,7 +1905,9 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
           )                                                                  &
          - ZDRVSATDT(:,:,:)                                                  &
         )
+!$acc end kernels
 #else
+!$acc kernels
 !$acc_nv loop independent collapse(3)
 DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
  PATHETA(JI,JJ,JK)= PAMOIST(JI,JJ,JK) * PEXN(JI,JJ,JK) *                             &
@@ -1914,11 +1922,12 @@ DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
          - ZDRVSATDT(JI,JJ,JK)                                                       &
         )
 ENDDO
-#endif
 !$acc end kernels
+#endif
 !*      1.7 Lv/Cph/Exner at t-1
 !
-!$acc kernels present(PLOCPEXN)
+!!$acc kernels present(PLOCPEXN)
+!$acc kernels
 !$acc_nv loop independent collapse(3)
 DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
    PLOCPEXN(JI,JJ,JK) = PLOCPEXN(JI,JJ,JK) / PEXN(JI,JJ,JK)
@@ -2228,7 +2237,7 @@ GOCEAN = LOCEAN
 !$acc      present( ztmp1_device, ztmp2_device )
 
 IF (ODZ) THEN
-!$acc kernels
+!$acc kernels present_cr(PLM)
   ! Dz is take into account in the computation
   DO JK = KKTB,KKTE ! 1D turbulence scheme
     PLM(:,:,JK) = PZZ(:,:,JK+KKL) - PZZ(:,:,JK)
@@ -2242,7 +2251,7 @@ IF (ODZ) THEN
       PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) )
 #else
       CALL MXF_DEVICE( PDXX, ZTMP1_DEVICE )
-!$acc kernels
+!$acc kernels present_cr(PLM)
       PLM(:,:,:) = SQRT( PLM(:,:,:) * ZTMP1_DEVICE(:,:,:) )
 !$acc end kernels
 #endif
@@ -2256,21 +2265,23 @@ IF (ODZ) THEN
 #else
       CALL MXF_DEVICE( PDXX, ZTMP1_DEVICE )
       CALL MYF_DEVICE( PDYY, ZTMP2_DEVICE )
-!$acc kernels
 #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+!$acc kernels present_cr(PLM)
       PLM(:,:,:) = ( PLM(:,:,:) * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) ) ** (1./3.)
+!$acc end kernels
 #else
+!$acc kernels
 DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
       PLM(JI,JJ,JK) = BR_POW( PLM(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK), 1./3. )
 ENDDO
-#endif
 !$acc end kernels
+#endif
 #endif
     END IF
   END IF
 ELSE
   ! Dz not taken into account in computation to assure invariability with vertical grid mesh
-!$acc kernels
+!$acc kernels present_cr(PLM)
   PLM(:,:,:)=1.E10
 !$acc end kernels
   IF ( HTURBDIM /= '1DIM' ) THEN  ! 3D turbulence scheme
@@ -2511,7 +2522,7 @@ CALL MNH_MEM_GET( ZTMP2_DEVICE, JIU, JJU, JKU )
 
 !
 !   initialize the mixing length with the mesh grid
-!$acc kernels
+!$acc kernels present_cr(PLM)
 ! 1D turbulence scheme
 PLM(:,:,KKTB:KKTE) = PZZ(:,:,KKTB+KKL:KKTE+KKL) - PZZ(:,:,KKTB:KKTE)
 PLM(:,:,KKU) = PLM(:,:,KKE)
@@ -2523,7 +2534,7 @@ IF ( HTURBDIM /= '1DIM' ) THEN  ! 3D turbulence scheme
     PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) )
 #else
     CALL MXF_DEVICE(PDXX,ZTMP1_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(PLM)
     PLM(:,:,:) = SQRT( PLM(:,:,:)*ZTMP1_DEVICE )
 !$acc end kernels
     if ( mppdb_initialized ) then
@@ -2542,7 +2553,7 @@ IF ( HTURBDIM /= '1DIM' ) THEN  ! 3D turbulence scheme
 #else
     CALL MXF_DEVICE(PDXX,ZTMP1_DEVICE)
     CALL MYF_DEVICE(PDYY,ZTMP2_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(PLM)
     PLM(:,:,:) = (PLM(:,:,:)*ZTMP1_DEVICE*ZTMP2_DEVICE ) ** (1./3.)
 !$acc end kernels
     if ( mppdb_initialized ) then
diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90
index 3472c9da3..59b5e3631 100644
--- a/src/MNH/turb_hor_dyn_corr.f90
+++ b/src/MNH/turb_hor_dyn_corr.f90
@@ -395,7 +395,8 @@ IKU = SIZE(PUM,3)
 !
 !
 !$acc kernels async(1)
-#if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+!if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+#if !defined(MNH_BITREP)
 ZDIRSINZW(:,:) = SQRT( 1. - PDIRCOSZW(:,:)**2 )
 #else
 !$mnh_expand_array(JI=1:JIU,JJ=1:JJU )
@@ -619,7 +620,8 @@ CALL MYF_DEVICE(PDYY(:,:,IKB:IKB),ZTMP4_DEVICE(:,:,1:1))
 !$acc wait(1)
 !
 !$acc kernels async(4) present_cr(ZFLX,ZDIRSINZW)   
-#if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+!if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+#if !defined(MNH_BITREP)
 ZFLX(:,:,IKB-1) =                                                            &
         PTAU11M(:,:) * PCOSSLOPE(:,:)**2 * PDIRCOSZW(:,:)**2                 &
   -2. * PTAU12M(:,:) * PCOSSLOPE(:,:)* PSINSLOPE(:,:) * PDIRCOSZW(:,:)       &
@@ -779,7 +781,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   !!! wait for the computation of ZWORK and PDP
   !$acc wait(2)
   !
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP1_DEVICE)
   ZTMP1_DEVICE(:,:,:) = -ZWORK(:,:,:)
   !$acc end kernels
   CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_RES_ddxa_U_SBG_UaU , .TRUE.)
@@ -844,7 +846,8 @@ ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE)
 !
 ! extrapolates this flux under the ground with the surface flux
 !$acc kernels async(3) present_cr(ZFLX) 
-#if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+!if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+#if !defined(MNH_BITREP)
 ZFLX(:,:,IKB-1) =                                                            &
         PTAU11M(:,:) * PSINSLOPE(:,:)**2 * PDIRCOSZW(:,:)**2                 &         
   +2. * PTAU12M(:,:) * PCOSSLOPE(:,:)* PSINSLOPE(:,:) * PDIRCOSZW(:,:)       &
@@ -1068,7 +1071,8 @@ ZFLX(:,:,IKE+1)= ZFLX(:,:,IKE)
 !  (-2./3.) * PTP(:,:,IKB:IKB)
 ! extrapolates this flux under the ground with the surface flux
 !$acc kernels async(3) present_cr(ZFLX) 
-#if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+!if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
+#if !defined(MNH_BITREP)
 ZFLX(:,:,IKB-1) = &    
         PTAU11M(:,:) * ZDIRSINZW(:,:)**2                                &
   +     PTAU33M(:,:) * PDIRCOSZW(:,:)**2                                &
diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90
index 52cff5188..18f237e55 100644
--- a/src/MNH/turb_hor_thermo_flux.f90
+++ b/src/MNH/turb_hor_thermo_flux.f90
@@ -331,7 +331,7 @@ ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE)
 #else
 CALL MXM_DEVICE( PK, ZTMP1_DEVICE )
 CALL GX_M_U_DEVICE(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(ZFLX)
 !$acc_nv loop independent collapse(3)
 DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
    ZFLX(JI,JJ,JK)     = -XCSHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
@@ -359,7 +359,7 @@ ZTMP3_DEVICE(:,:,1) = ZCOEFF(:,:,IKB+2)*PTHLM(:,:,IKB+2)        &
          +ZCOEFF(:,:,IKB  )*PTHLM(:,:,IKB  )
 !$acc end kernels
 CALL MXM_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1)) 
-!$acc kernels present_cr(ZFLX,ZTMP1_DEVICE)
+!$acc kernels present_cr(ZFLX,ZTMP1_DEVICE,ZTMP2_DEVICE)
 ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) *          &
   ( ZTMP2_DEVICE(:,:,1) * PINV_PDXX(:,:,IKB) - ZTMP4_DEVICE(:,:,1)      &
         *0.5* ( PDZX(:,:,IKB+1)+PDZX(:,:,IKB))       &
@@ -373,7 +373,7 @@ ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) *          &
 ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM(  SPREAD( PSFTHM(:,:)* PDIRCOSXW(:,:), 3,1) )  &
                        - ZFLX(:,:,IKB:IKB)
 #else
-! acc kernels
+! acc kernels present(ZTMP1_DEVICE)
 DO CONCURRENT ( JI=1:JIU,JJ=1:JJU )
    ZTMP1_DEVICE(JI,JJ,1) = PSFTHM(JI,JJ)* PDIRCOSXW(JI,JJ)
 END DO
@@ -397,44 +397,44 @@ END IF
 #else
 IF (.NOT. LFLAT) THEN
   CALL MXM_DEVICE(PRHODJ, ZTMP1_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP2_DEVICE)
   !$acc_nv loop independent collapse(3)
   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
      ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
   END DO
   !$acc end kernels
   CALL DXF_DEVICE(ZTMP2_DEVICE, ZTMP3_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP2_DEVICE)
   !$acc_nv loop independent collapse(3)
   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
      ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
   END DO
   !$acc end kernels
   CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP2_DEVICE)
   !$acc_nv loop independent collapse(3)
   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)  
      ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK)
   END DO
 !$acc end kernels
   CALL MXF_DEVICE(ZTMP2_DEVICE, ZTMP4_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(ZTMP2_DEVICE)
 !$acc_nv loop independent collapse(3)  
 DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
    ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
 END DO
 !$acc end kernels
   CALL DZF_DEVICE( ZTMP2_DEVICE, ZTMP4_DEVICE )
-!$acc kernels
+!$acc kernels present_cr(PRTHLS)
   PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:)
 !$acc end kernels
 ELSE
   CALL MXM_DEVICE(PRHODJ, ZTMP1_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(ZTMP2_DEVICE)
   ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDXX(:,:,:)
 !$acc end kernels
   CALL DXF_DEVICE(ZTMP2_DEVICE, ZTMP3_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(PRTHLS)
   PRTHLS(:,:,:) =  PRTHLS(:,:,:) - ZTMP3_DEVICE(:,:,:)
 !$acc end kernels
 END IF
@@ -486,7 +486,7 @@ END IF
 #else
 IF ( KRRL >= 1 ) THEN
   IF (.NOT. LFLAT) THEN
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:)
     !$acc end kernels
     CALL MZM_DEVICE( ZTMP1_DEVICE, ZTMP4_DEVICE )
@@ -511,7 +511,7 @@ IF ( KRRL >= 1 ) THEN
     ZFLXC(:,:,:) = 2.*( ZTMP2_DEVICE(:,:,:) +ZTMP7_DEVICE(:,:,:) )
     !$acc end kernels
     IF ( KRRI >= 1 ) THEN
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:)
       !$acc end kernels
       CALL MXM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) 
@@ -528,15 +528,15 @@ IF ( KRRL >= 1 ) THEN
       PRRS(:,:,:,4) = PRRS(:,:,:,4) +  2. * (- ZTMP2_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) )*PFRAC_ICE(:,:,:)
 !$acc end kernels
     ELSE
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:)
       !$acc end kernels
       CALL MXM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:) *ZFLX(:,:,:)*PINV_PDXX(:,:,:)
       !$acc end kernels
       CALL DXF_DEVICE( ZTMP6_DEVICE, ZTMP2_DEVICE)
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:)*ZTMP5_DEVICE(:,:,:)*PINV_PDZZ(:,:,:)
       !$acc end kernels
       CALL DZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
@@ -545,11 +545,11 @@ IF ( KRRL >= 1 ) THEN
 !$acc end kernels
     END IF
   ELSE
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:)
     !$acc end kernels
     CALL MXM_DEVICE( ZTMP1_DEVICE,ZTMP2_DEVICE )
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)
     !$acc end kernels
     CALL MXF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
@@ -557,7 +557,7 @@ IF ( KRRL >= 1 ) THEN
     ZFLXC(:,:,:) = 2.*ZTMP4_DEVICE(:,:,:)
     !$acc end kernels
     IF ( KRRI >= 1 ) THEN
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) =  ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDXX(:,:,:)
       !$acc end kernels
       CALL DXF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
@@ -566,7 +566,7 @@ IF ( KRRL >= 1 ) THEN
       PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * ZTMP2_DEVICE(:,:,:)*PFRAC_ICE(:,:,:)
       !$acc end kernels
     ELSE
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) =  ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDXX(:,:,:)
       !$acc end kernels
       CALL DXF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
@@ -618,7 +618,7 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN
   !
   CALL GX_W_UW_DEVICE(PWM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
   CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP3_DEVICE)
   ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
   !$acc end kernels
   CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE)
@@ -627,14 +627,14 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN
   !
   CALL GX_M_M_DEVICE(PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
   CALL MXF_DEVICE(ZFLX,ZTMP2_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP3_DEVICE)
   ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
   !$acc end kernels
   CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE,X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. )
   !
   IF (KRR>=1) THEN
     CALL GX_M_M_DEVICE(PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE,X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. )
@@ -764,7 +764,7 @@ END IF
 #else
   CALL MXM_DEVICE( PK, ZTMP1_DEVICE )
   CALL GX_M_U_DEVICE(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(ZFLX)
 !$acc_nv loop independent collapse(3)
 DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
    ZFLX(JI,JJ,JK)     = -XCHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
@@ -782,7 +782,7 @@ END DO
                     +ZCOEFF(:,:,IKB  )*PRM(:,:,IKB  ,1)
 !$acc end kernels
   CALL MXM_DEVICE(ZTMP3_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1))
-!$acc kernels present_cr(ZFLX)
+!$acc kernels present_cr(ZFLX,ZTMP1_DEVICE)
   ZFLX(:,:,IKB) = -XCHF * ZTMP1_DEVICE(:,:,1) *              &
                   ( ZTMP2_DEVICE(:,:,1) * PINV_PDXX(:,:,IKB) &
                   -ZTMP4_DEVICE(:,:,1)                       &
@@ -803,28 +803,28 @@ END DO
   !
   IF (.NOT. LFLAT) THEN
     CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
     END DO
     !$acc end kernels
     CALL DXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
     END DO
     !$acc end kernels
     CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK)
     END DO
     !$acc end kernels
     CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
@@ -839,7 +839,7 @@ END DO
     !$acc end kernels
   ELSE
     CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDXX(:,:,:)
     !$acc end kernels
     CALL DXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
@@ -851,7 +851,7 @@ END DO
   ! Compute the equivalent tendancy for Rc and Ri
   !
   IF ( KRRL >= 1 ) THEN
-    !$acc kernels present_cr(ZTMP2_DEVICE)
+    !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP2_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*PSRCM(:,:,:)
     ZTMP2_DEVICE(:,:,:) = ZFLX(:,:,:)*PINV_PDXX(:,:,:)
     !$acc end kernels
@@ -893,24 +893,24 @@ END DO
         !$acc end kernels
       END IF
     ELSE
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP4_DEVICE)
       ZTMP4_DEVICE(:,:,:) = ZTMP8_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
       CALL DXF_DEVICE(ZTMP4_DEVICE, ZTMP5_DEVICE)
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP8_DEVICE(:,:,:)*ZFLX(:,:,:)
       !$acc end kernels
       CALL MXF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(ZFLXC)
       ZFLXC(:,:,:) = ZFLXC(:,:,:) + 2.*ZTMP4_DEVICE(:,:,:)
       !$acc end kernels
       IF ( KRRI >= 1 ) THEN
-        !$acc kernels
+        !$acc kernels present_cr(PRRS)
         PRRS(:,:,:,2) = PRRS(:,:,:,2) -  2. * ZTMP5_DEVICE(:,:,:)*(1.0-PFRAC_ICE(:,:,:))
         PRRS(:,:,:,4) = PRRS(:,:,:,4) -  2. * ZTMP5_DEVICE(:,:,:)*PFRAC_ICE(:,:,:)
         !$acc end kernels
       ELSE
-        !$acc kernels
+        !$acc kernels present_cr(PRRS)
         PRRS(:,:,:,2) = PRRS(:,:,:,2) -  2. * ZTMP5_DEVICE(:,:,:)
         !$acc end kernels
       END IF
@@ -944,7 +944,7 @@ END DO
     !
     CALL GX_W_UW_DEVICE(PWM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
     CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
@@ -953,14 +953,14 @@ END DO
     !
     CALL GX_M_M_DEVICE(PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
     CALL MXF_DEVICE(ZFLX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. )
     !
     CALL GX_M_M_DEVICE(PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
     CALL MXF_DEVICE(ZFLX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. )
@@ -1139,7 +1139,7 @@ END IF
 #else
   CALL MYM_DEVICE( PK, ZTMP1_DEVICE )
   CALL GY_M_V_DEVICE(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY,ZTMP2_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZFLX)
   !$acc_nv loop independent collapse(3)
   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
      ZFLX(JI,JJ,JK)     = -XCSHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
@@ -1147,7 +1147,7 @@ END IF
   ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
   !$acc end kernels
 ELSE
-  !$acc kernels
+  !$acc kernels present_cr(ZFLX)
   ZFLX(:,:,:)     = 0.
   !$acc end kernels
 END IF
@@ -1173,7 +1173,7 @@ ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) *             &
 ! extrapolates the flux under the ground so that the vertical average with 
 ! the IKB flux gives the ground value  ( warning the tangential surface
 ! flux has been set to 0 for the moment !!  to be improved )
-!$acc kernels
+!$acc kernels present_cr(ZTMP1_DEVICE)
 ZTMP1_DEVICE(:,:,1) = PSFTHM(:,:)* PDIRCOSYW(:,:)
 !$acc end kernels
 CALL MYM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) )
@@ -1186,28 +1186,28 @@ ZFLX(:,:,IKB-1) = 2. * ZTMP2_DEVICE(:,:,1) - ZFLX(:,:,IKB)
 IF (.NOT. L2D) THEN 
   IF (.NOT. LFLAT) THEN
     CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
     END DO
     !$acc end kernels
     CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
     END DO
     !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE, ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZTMP1_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
     END DO
     !$acc end kernels
     CALL MYF_DEVICE(ZTMP1_DEVICE, ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZTMP1_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
@@ -1222,7 +1222,7 @@ IF (.NOT. L2D) THEN
     !$acc end kernels
   ELSE
     CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDYY(:,:,:)
     !$acc end kernels
     CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
@@ -1237,7 +1237,7 @@ END IF
 !IF ( OSUBG_COND .AND. KRRL > 0 .AND. .NOT. L2D) THEN
 IF ( KRRL >= 1 .AND. .NOT. L2D) THEN
   IF (.NOT. LFLAT) THEN
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:)
     !$acc end kernels
     CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
@@ -1275,11 +1275,11 @@ IF ( KRRL >= 1 .AND. .NOT. L2D) THEN
       PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * (- ZTMP4_DEVICE(:,:,:) + ZTMP5_DEVICE(:,:,:) )*PFRAC_ICE(:,:,:)
       !$acc end kernels
     ELSE
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDYY(:,:,:)
       !$acc end kernels
       CALL DYF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP6_DEVICE(:,:,:)*PINV_PDZZ(:,:,:)
       !$acc end kernels
       CALL DZF_DEVICE( ZTMP3_DEVICE, ZTMP5_DEVICE )
@@ -1288,11 +1288,11 @@ IF ( KRRL >= 1 .AND. .NOT. L2D) THEN
       !$acc end kernels
     END IF
   ELSE
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:)
     !$acc end kernels
     CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)
     !$acc end kernels
     CALL MYF_DEVICE( ZTMP1_DEVICE, ZTMP3_DEVICE )
@@ -1300,17 +1300,17 @@ IF ( KRRL >= 1 .AND. .NOT. L2D) THEN
     ZFLXC(:,:,:) = 2.*ZTMP3_DEVICE(:,:,:)
     !$acc end kernels
     !
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDYY(:,:,:)
     !$acc end kernels
     CALL DYF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
     IF ( KRRI >= 1 ) THEN
-      !$acc kernels
+      !$acc kernels present_cr(PRRS)
       PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP2_DEVICE(:,:,:)*(1.0-PFRAC_ICE(:,:,:))
       PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * ZTMP2_DEVICE(:,:,:)*PFRAC_ICE(:,:,:)
       !$acc end kernels
     ELSE
-      !$acc kernels
+      !$acc kernels  present_cr(PRRS)
       PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
     END IF
@@ -1345,7 +1345,7 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN
   !
   CALL GY_W_VW_DEVICE(PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
   CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP3_DEVICE)
   ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
   !$acc end kernels
   CALL MYF_DEVICE(ZTMP3_DEVICE, ZTMP4_DEVICE)
@@ -1354,7 +1354,7 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN
   !
   CALL GY_M_M_DEVICE(PTHLM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
   CALL MYF_DEVICE(ZFLX,ZTMP2_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP3_DEVICE)
   ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
   !$acc end kernels
   CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. )
@@ -1365,7 +1365,7 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN
 !$acc data copy(X_LES_RES_ddxa_Rt_SBG_UaThl)
     CALL GY_M_M_DEVICE(PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
     CALL MYF_DEVICE(ZFLX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE,X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. )
@@ -1506,7 +1506,7 @@ IF (KRR/=0) THEN
   IF (.NOT. L2D) THEN
     CALL MYM_DEVICE( PK, ZTMP1_DEVICE )
     CALL GY_M_V_DEVICE(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY, ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZFLX)
     !$acc_nv loop independent collapse(3)
     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
        ZFLX(JI,JJ,JK)     = -XCHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
@@ -1514,7 +1514,7 @@ IF (KRR/=0) THEN
     ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
     !$acc end kernels
   ELSE
-    !$acc kernels
+    !$acc kernels present_cr(ZFLX)
     ZFLX(:,:,:)     = 0.
     !$acc end kernels
   END IF
@@ -1539,7 +1539,7 @@ IF (KRR/=0) THEN
 ! extrapolates the flux under the ground so that the vertical average with 
 ! the IKB flux gives the ground value  ( warning the tangential surface
 ! flux has been set to 0 for the moment !!  to be improved )
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP1_DEVICE)
   ZTMP1_DEVICE(:,:,1) = PSFRM(:,:)* PDIRCOSYW(:,:)
   !$acc end kernels
   CALL MYM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) )
@@ -1552,7 +1552,7 @@ IF (KRR/=0) THEN
   IF (.NOT. L2D) THEN 
     IF (.NOT. LFLAT) THEN
       CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP2_DEVICE)
       !$acc_nv loop independent collapse(3)
       DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
          ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
@@ -1560,21 +1560,21 @@ IF (KRR/=0) THEN
       !$acc end kernels
       CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
       !
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       !$acc_nv loop independent collapse(3)
       DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
          ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
       END DO
       !$acc end kernels
       CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       !$acc_nv loop independent collapse(3)
       DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
          ZTMP1_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
       END DO
       !$acc end kernels
       CALL MYF_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       !$acc_nv loop independent collapse(3)
       DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
          ZTMP1_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
@@ -1590,7 +1590,7 @@ IF (KRR/=0) THEN
       !$acc end kernels
     ELSE
       CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP2_DEVICE)
       ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDYY(:,:,:)
       !$acc end kernels
       CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
@@ -1604,7 +1604,7 @@ IF (KRR/=0) THEN
   !
   IF ( KRRL >= 1 .AND. .NOT. L2D) THEN   ! Sub-grid condensation
     IF (.NOT. LFLAT) THEN
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*PSRCM(:,:,:)
       !$acc end kernels
       CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
@@ -1637,39 +1637,39 @@ IF (KRR/=0) THEN
         ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)* PINV_PDZZ(:,:,:)
         !$acc end kernels
         CALL DZF_DEVICE( ZTMP2_DEVICE, ZTMP4_DEVICE )
-        !$acc kernels
+        !$acc kernels present_cr(PRRS)
         PRRS(:,:,:,2) = PRRS(:,:,:,2) +  2. * (- ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) )*(1.0-PFRAC_ICE(:,:,:))
         PRRS(:,:,:,4) = PRRS(:,:,:,4) +  2. * (- ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) )*PFRAC_ICE(:,:,:)
         !$acc end kernels
       ELSE
-        !$acc kernels
+        !$acc kernels present_cr(PRRS)
         PRRS(:,:,:,2) = PRRS(:,:,:,2) +  2. * (- ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) )
         !$acc end kernels
       END IF
     ELSE
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*PSRCM(:,:,:)
       !$acc end kernels
       CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)
       !$acc end kernels
       CALL MXF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(ZFLXC)
       ZFLXC(:,:,:) = ZFLXC(:,:,:) + 2.*ZTMP4_DEVICE(:,:,:)
       !$acc end kernels
       !
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = ZTMP3_DEVICE(:,:,:)* PINV_PDYY(:,:,:)
       !$acc end kernels
       CALL DYF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
       IF ( KRRI >= 1 ) THEN
-        !$acc kernels
+        !$acc kernels present_cr(PRRS)
         PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP2_DEVICE(:,:,:)*(1.0-PFRAC_ICE(:,:,:))
         PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * ZTMP2_DEVICE(:,:,:)*PFRAC_ICE(:,:,:)
         !$acc end kernels
       ELSE
-        !$acc kernels
+        !$acc kernels present_cr(PRRS)
         PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP2_DEVICE(:,:,:)
         !$acc end kernels
       END IF
@@ -1703,7 +1703,7 @@ IF (KRR/=0) THEN
     !
     CALL GY_W_VW_DEVICE(PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
     CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL MYF_DEVICE(ZTMP3_DEVICE, ZTMP4_DEVICE)
@@ -1712,14 +1712,14 @@ IF (KRR/=0) THEN
     !
     CALL GY_M_M_DEVICE(PTHLM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
     CALL MYF_DEVICE(ZFLX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. )
     !
     CALL GY_M_M_DEVICE(PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
     CALL MYF_DEVICE(ZFLX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. )
diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90
index 0a11a3829..fc1125675 100644
--- a/src/MNH/turb_hor_uv.f90
+++ b/src/MNH/turb_hor_uv.f90
@@ -364,13 +364,13 @@ IF (.NOT. L2D) THEN
   END DO !CONCURRENT   
   !$acc end kernels
 ELSE
-  !$acc kernels
+  !$acc kernels present_cr(ZFLX)
   ZFLX(:,:,:)= - XCMFS * ZTMP2_DEVICE * (GX_V_UV_PVM)
   !$acc end kernels
 END IF
 #endif
 !
-!$acc kernels
+!$acc kernels present_cr(ZFLX)
 ZFLX(:,:,IKE+1)= ZFLX(:,:,IKE)
 !$acc end kernels
 !
@@ -437,7 +437,7 @@ ZTMP6_DEVICE(:,:,1) = (PVM(:,:,IKB+1)-PVM(:,:,IKB))*(1./ZTMP3_DEVICE(:,:,1)+1./Z
 !$acc end kernels
 CALL MXM_DEVICE(ZTMP6_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1))
 !
-!$acc kernels
+!$acc kernels present_cr(ZTMP6_DEVICE)
 ZTMP6_DEVICE(:,:,1:1) = (PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB))
 !$acc end kernels
 CALL MYM_DEVICE(ZTMP6_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1))
@@ -612,7 +612,7 @@ IF (.NOT. LFLAT) THEN
   END DO !CONCURRENT   
   !$acc end kernels
 ELSE
-!$acc kernels
+!$acc kernels present_cr(PRUS)
   PRUS(:,:,:) = PRUS(:,:,:) - ZTMP1_DEVICE
 !$acc end kernels
 END IF
@@ -725,7 +725,7 @@ IF (KSPLT==1) THEN
      END DO !CONCURRENT   
 !$acc end kernels
   ELSE
-!$acc kernels
+!$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE = ZFLX * GX_V_UV_PVM
 !$acc end kernels
   ENDIF
@@ -830,7 +830,7 @@ IF (KSPLT==1) THEN
 #endif
   !
   ! dynamic production 
-  !$acc kernels
+  !$acc kernels present_cr(PDP)
   PDP(:,:,:) = PDP(:,:,:) + ZWORK(:,:,:)
   !$acc end kernels
   ! 
@@ -851,7 +851,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL LES_MEAN_SUBGRID(ZTMP2_DEVICE,X_LES_SUBGRID_UV)
   !
   CALL GY_U_UV_DEVICE(PUM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(ZTMP3_DEVICE)
   ZTMP3_DEVICE = ZTMP1_DEVICE*ZFLX
 !$acc end kernels
   CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE)
@@ -859,7 +859,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL LES_MEAN_SUBGRID(ZTMP1_DEVICE, X_LES_RES_ddxa_U_SBG_UaU , .TRUE.)
   !
   CALL GX_V_UV_DEVICE(PVM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(ZTMP3_DEVICE)
   ZTMP3_DEVICE = ZTMP1_DEVICE*ZFLX
 !$acc end kernels
   CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE)
diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90
index 6a840a431..186fb9de8 100644
--- a/src/MNH/turb_hor_uw.f90
+++ b/src/MNH/turb_hor_uw.f90
@@ -533,14 +533,14 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WU , .TRUE. ) 
   !
   CALL GZ_U_UW_DEVICE(PUM,PDZZ,ZTMP1_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP2_DEVICE)
   ZTMP2_DEVICE = ZTMP1_DEVICE*ZFLX
   !$acc end kernels
   CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
   CALL MZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE )
   CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_RES_ddxa_U_SBG_UaU , .TRUE.)
   !
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP1_DEVICE)
   ZTMP1_DEVICE = GX_W_UW_PWM*ZFLX
   !$acc end kernels
   CALL MXF_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
@@ -549,7 +549,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   !
   CALL MZF_DEVICE( ZFLX, ZTMP1_DEVICE )
   CALL GX_M_U_DEVICE(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP3_DEVICE)
   ZTMP3_DEVICE = ZTMP2_DEVICE*ZTMP1_DEVICE
   !$acc end kernels
   CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE)
@@ -561,7 +561,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
     !
     CALL MZF_DEVICE( ZFLX, ZTMP1_DEVICE )
     CALL GX_M_U_DEVICE(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE
     !$acc end kernels
     CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE)
@@ -574,7 +574,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL MZF_DEVICE( ZFLX, ZTMP1_DEVICE )
   DO JSV=1,NSV
     CALL GX_M_U_DEVICE(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE
     !$acc end kernels
     CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE)
diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90
index 3596ac8ce..023773412 100644
--- a/src/MNH/turb_hor_vw.f90
+++ b/src/MNH/turb_hor_vw.f90
@@ -428,15 +428,15 @@ IF (.NOT. L2D) THEN
     !$acc end kernels
   ELSE
     CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     ZTMP2_DEVICE = ZTMP1_DEVICE * PINV_PDYY
     !$acc end kernels
     CALL MZM_DEVICE(ZTMP2_DEVICE, ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     ZTMP2_DEVICE = ZTMP1_DEVICE * ZFLX
-    !$acc end kernels
+    !$acc end kernels 
     CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP1_DEVICE )
-    !$acc kernels
+    !$acc kernels present_cr(PRWS)
     PRWS(:,:,:) = PRWS(:,:,:) - ZTMP1_DEVICE
     !$acc end kernels
   END IF
@@ -555,7 +555,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WV , .TRUE. )
   !
   CALL GZ_V_VW_DEVICE(PVM,PDZZ,ZTMP1_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP2_DEVICE)
   ZTMP2_DEVICE = ZTMP1_DEVICE*ZFLX
   !$acc end kernels
   CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
@@ -563,7 +563,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_RES_ddxa_V_SBG_UaV , .TRUE.)
   !
   CALL GY_W_VW_DEVICE(PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP2_DEVICE)
   ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLX(:,:,:)
   !$acc end kernels
   CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
@@ -574,7 +574,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL MZF_DEVICE( ZFLX, ZTMP2_DEVICE )
 !PW: kernel removed to work around a PGI 19.10 bug
 !$acc update self(ZTMP1_DEVICE,ZTMP2_DEVICE)
-!   !$acc kernels
+!   !$acc kernels present_cr(ZTMP3_DEVICE)
   ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
 !   !$acc end kernels
 !$acc update device(ZTMP3_DEVICE)
@@ -589,7 +589,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
     CALL MZF_DEVICE( ZFLX, ZTMP2_DEVICE )
 !PW: kernel removed to work around a PGI 19.10 bug
 !$acc update self(ZTMP1_DEVICE,ZTMP2_DEVICE)
-!     !$acc kernels
+!     !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
 !     !$acc end kernels
 !$acc update device(ZTMP3_DEVICE)
@@ -603,7 +603,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN
   CALL MZF_DEVICE( ZFLX, ZTMP2_DEVICE )
   DO JSV=1,NSV
     CALL GY_M_V_DEVICE(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE
     !$acc end kernels
     CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE)
diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90
index a5ac03e88..f608c5be7 100644
--- a/src/MNH/turb_ver_dyn_flux.f90
+++ b/src/MNH/turb_ver_dyn_flux.f90
@@ -523,7 +523,7 @@ IKTE=IKT-JPVEXT_TURB
 
 GOCEAN = LOCEAN
 !
-!$acc kernels
+!$acc kernels  present_cr(ZA,PDP,ZSOURCE)
 ZA(:,:,:)  = XUNDEF
 PDP(:,:,:) = XUNDEF
 ZSOURCE(:,:,:) = 0.
@@ -536,18 +536,22 @@ DO CONCURRENT ( JI=1:JIU,JJ=1:JJU )
    ZDIRSINZW(JI,JJ) = SQRT(1.-BR_P2(PDIRCOSZW(JI,JJ)))
 END DO
 #endif
+!$acc end kernels
+
 !  compute the coefficients for the uncentred gradient computation near the 
 !  ground
 !
 #ifndef MNH_OPENACC
 ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) )
 #else
+!PASCAL
+!$acc kernels present_cr(ZTMP1_DEVICE)
 ZTMP1_DEVICE(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:))
 !$acc end kernels
 CALL MZM_DEVICE(ZTMP1_DEVICE,ZKEFF)
 #endif
 !
-!$acc kernels
+!$acc kernels present_cr(ZUSLOPEM,ZVSLOPEM)
 ZUSLOPEM(:,:,1)=PUSLOPEM(:,:)
 ZVSLOPEM(:,:,1)=PVSLOPEM(:,:)
 !$acc end kernels
@@ -687,7 +691,7 @@ ELSE             !ATMOS MODEL ONLY
 #endif
   ENDIF 
 !
-!$acc kernels
+!$acc kernels present_cr(ZSOURCE)
   ZSOURCE(:,:,IKTB+1:IKTE-1) = 0.
   ZSOURCE(:,:,IKE) = 0.
 !$acc end kernels
@@ -709,7 +713,7 @@ CALL TRIDIAG_WIND(KKA,KKU,KKL,PUM,ZA,ZCOEFS(:,:,1),PTSTEP,PEXPL,PIMPL,   &
 #ifndef MNH_OPENACC
 PRUS(:,:,:)=PRUS(:,:,:)+MXM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP
 #else
-!$acc kernels
+!$acc kernels present_cr(PRUS)
 PRUS(:,:,:)=PRUS(:,:,:)+ZTMP1_DEVICE(:,:,:)*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP
 !$acc end kernels
 #endif
@@ -785,7 +789,7 @@ END IF
 !
 ! first part of total momentum flux
 !
-!$acc kernels
+!$acc kernels present_cr(PWU)
 PWU(:,:,:) = ZFLXZ(:,:,:)
 !$acc end kernels
 !
@@ -804,7 +808,7 @@ END DO
 !$acc end kernels
 CALL MXF_DEVICE( ZTMP2_DEVICE,ZTMP3_DEVICE )
 CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
-!$acc kernels
+!$acc kernels present_cr(PDP)
 PDP(:,:,:) = - ZTMP4_DEVICE(:,:,:)
 !$acc end kernels
 #endif
@@ -822,7 +826,7 @@ ZTMP2_DEVICE(:,:,IKB:IKB) = ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PUM(:,:,IKB+KKL:IKB+KK
                          / ZTMP1_DEVICE(:,:,IKB+KKL:IKB+KKL)
 !$acc end kernels
 CALL MXF_DEVICE(ZTMP2_DEVICE(:,:,IKB:IKB), ZTMP3_DEVICE(:,:,IKB:IKB)) 
-!$acc kernels
+!$acc kernels present_cr(PDP)
 PDP(:,:,IKB:IKB) = - ZTMP3_DEVICE(:,:,IKB:IKB)
 !$acc end kernels
 #endif
@@ -852,14 +856,14 @@ IF (LLES_CALL) THEN
   CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WU ) 
   !
   CALL GZ_U_UW_DEVICE(PUM,PDZZ,ZTMP1_DEVICE)
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP2_DEVICE)
   ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:)
   !$acc end kernels
   CALL MXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
   CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
   CALL LES_MEAN_SUBGRID( ZTMP4_DEVICE, X_LES_RES_ddxa_U_SBG_UaU )
   !
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP1_DEVICE)
   ZTMP1_DEVICE(:,:,:) = XCMFS * ZKEFF(:,:,:)
   !$acc end kernels
   CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_SUBGRID_Km )
@@ -876,12 +880,15 @@ END IF
 IF(HTURBDIM=='3DIM') THEN
   ! Compute the source for the W wind component
                 ! used to compute the W source at the ground
-!$acc kernels
+!PASCAL
+!$acc kernels present_cr(ZFLXZ)
   ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation
+!$acc end kernels
  IF (GOCEAN) THEN
+!$acc kernels present_cr(ZFLXZ)
    ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation
- END IF
 !$acc end kernels
+ END IF
   !
 #ifndef MNH_OPENACC
   IF (.NOT. LFLAT) THEN
@@ -932,11 +939,11 @@ IF(HTURBDIM=='3DIM') THEN
     END DO
     !$acc end kernels
     CALL DZM_DEVICE( ZTMP3_DEVICE, ZTMP2_DEVICE )
-    !$acc kernels
+    !$acc kernels present_cr(PRWS)
     PRWS(:,:,:)= PRWS(:,:,:) - ZTMP1_DEVICE(:,:,:) + ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
   ELSE
-    !$acc kernels
+    !$acc kernels present_cr(PRWS)
     PRWS(:,:,:)= PRWS(:,:,:) -ZTMP1_DEVICE(:,:,:)
     !$acc end kernels
   END IF
@@ -1013,7 +1020,7 @@ IF (GOCEAN) THEN
                           )
 END IF
   !
-!$acc kernels
+!$acc kernels present_cr(PDP)
   PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:)
 !$acc end kernels
   !
@@ -1039,7 +1046,7 @@ END IF
 !$acc &         X_LES_RES_ddxa_Rt_SBG_UaW,X_LES_RES_ddxa_Sv_SBG_UaW)
     !
     CALL GX_W_UW_DEVICE( PWM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:)
     !$acc end kernels
     CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE)
@@ -1048,7 +1055,7 @@ END IF
     !
     CALL GX_M_U_DEVICE(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
     CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE )
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
@@ -1057,7 +1064,7 @@ END IF
     IF (KRR>=1) THEN
       CALL GX_U_M_DEVICE(PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
       CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
       CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
@@ -1067,7 +1074,7 @@ END IF
     DO JSV=1,NSV
       CALL GX_U_M_DEVICE(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
       CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
       CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
@@ -1206,11 +1213,11 @@ ELSE ! Atmos case
       * 0.5 * ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,IKB:IKB)) )
   ENDIF
   !No flux at the atmosphere top
-!$acc kernels
+!$acc kernels present_cr(ZSOURCE)
   ZSOURCE(:,:,IKE) = 0.
 !$acc end kernels
 ENDIF ! End of Ocean or Atmospher Cases
-!$acc kernels
+!$acc kernels present_cr(ZSOURCE)
 ZSOURCE(:,:,IKTB+1:IKTE-1) = 0.
 !$acc end kernels
 !
@@ -1229,7 +1236,7 @@ CALL TRIDIAG_WIND(KKA,KKU,KKL,PVM,ZA,ZCOEFS(:,:,1),PTSTEP,PEXPL,PIMPL,  &
 #ifndef MNH_OPENACC
 PRVS(:,:,:)=PRVS(:,:,:)+MYM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP
 #else
-!$acc kernels
+!$acc kernels present_cr(PRVS)
 PRVS(:,:,:)=PRVS(:,:,:)+ZTMP1_DEVICE*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP
 !$acc end kernels
 #endif
@@ -1302,7 +1309,7 @@ END IF
 !
 ! second part of total momentum flux
 !
-!$acc kernels
+!$acc kernels present_cr(PWV)
 PWV(:,:,:) = ZFLXZ(:,:,:)
 !$acc end kernels
 !
@@ -1355,7 +1362,7 @@ IF (GOCEAN) THEN
                           )
 END IF
 !
-!$acc kernels
+!$acc kernels present_cr(PDP)
 PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:)
 !$acc end kernels
 !
@@ -1375,7 +1382,7 @@ IF (LLES_CALL) THEN
   CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WV ) 
   !
   CALL GZ_V_VW_DEVICE(PVM,PDZZ,ZTMP1_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(ZTMP2_DEVICE)
   ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:)
 !$acc end kernels
   CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE)
@@ -1393,12 +1400,15 @@ END IF
 !
 IF(HTURBDIM=='3DIM') THEN
   ! Compute the source for the W wind component
-!$acc kernels
+  !PASCAL
+!$acc kernels present_cr(ZFLXZ)
   ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation 
+!$acc end kernels
   IF (GOCEAN) THEN
+!$acc kernels present_cr(ZFLXZ)
     ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation
-  END IF
 !$acc end kernels
+  END IF
   !
 #ifndef MNH_OPENACC
   IF (.NOT. L2D) THEN 
@@ -1452,11 +1462,11 @@ IF(HTURBDIM=='3DIM') THEN
       END DO
       !$acc end kernels
       CALL DZM_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(PRWS)
       PRWS(:,:,:)= PRWS(:,:,:) - ZTMP1_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:)
       !$acc end kernels
     ELSE
-      !$acc kernels
+      !$acc kernels present_cr(PRWS)
       PRWS(:,:,:)= PRWS(:,:,:) - ZTMP1_DEVICE(:,:,:)
       !$acc end kernels
     END IF
@@ -1532,7 +1542,7 @@ IF(HTURBDIM=='3DIM') THEN
                             )
     END IF
 !    
-!$acc kernels
+!$acc kernels present_cr(PDP)
     PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:)
 !$acc end kernels
   !
@@ -1555,7 +1565,7 @@ IF(HTURBDIM=='3DIM') THEN
 !$acc data copy(X_LES_RES_ddxa_W_SBG_UaW,X_LES_RES_ddxa_Thl_SBG_UaW,X_LES_RES_ddxa_Rt_SBG_UaW)
     !
     CALL GY_W_VW_DEVICE( PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:)
     !$acc end kernels
     CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE)
@@ -1564,7 +1574,7 @@ IF(HTURBDIM=='3DIM') THEN
     !
     CALL GY_M_V_DEVICE(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
     CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE )
-    !$acc kernels
+    !$acc kernels present_cr(ZTMP3_DEVICE)
     ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
     !$acc end kernels
     CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
@@ -1573,7 +1583,7 @@ IF(HTURBDIM=='3DIM') THEN
     IF (KRR>=1) THEN
       CALL GY_V_M_DEVICE(PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
       CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE )
-      !$acc kernels
+      !$acc kernels present_cr(ZTMP3_DEVICE)
       ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
       CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
@@ -1600,7 +1610,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened .AND. HTURBDIM == '1DIM') THEN
      -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(PWM,PDZZ)
 #else
   CALL GZ_W_M_DEVICE(PWM,PDZZ,ZTMP1_DEVICE)
-!$acc kernels
+!$acc kernels present_cr(ZFLXZ)
   ZFLXZ(:,:,:)= (2./3.) * PTKEM(:,:,:)                     &
      -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*ZTMP1_DEVICE(:,:,:)
 !$acc end kernels
diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90
index 993a048fc..c4a205956 100644
--- a/src/MNH/turb_ver_thermo_corr.f90
+++ b/src/MNH/turb_ver_thermo_corr.f90
@@ -511,7 +511,7 @@ GUSERV = (KRR/=0)
 !
 !  compute the coefficients for the uncentred gradient computation near the 
 !  ground
-!$acc kernels
+!$acc kernels present_cr(ZCOEFF,ZKEFF,ZTMP1_DEVICE)
 ZCOEFF(:,:,IKB+2*KKL)= - PDZZ(:,:,IKB+KKL) /      &
        ( (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) * PDZZ(:,:,IKB+2*KKL) )
 ZCOEFF(:,:,IKB+KKL)=   (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) /      &
@@ -561,7 +561,7 @@ END IF
 #endif
   ZDFDDTDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately
 #else
-  !$acc kernels
+  !$acc kernels present_cr(ZTMP1_DEVICE)
 #ifndef MNH_BITREP
   !dir$ concurrent
   ZTMP1_DEVICE(:,:,:) = PPHI3(:,:,:)*PDTH_DZ(:,:,:)**2
@@ -582,6 +582,8 @@ END IF
   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
      ZF      (JI,JJ,JK) = XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) 
   END DO
+  !$acc end kernels
+  !$acc kernels present_cr(ZDFDDTDZ)
   ZDFDDTDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately 
   !$acc end kernels
 #endif
@@ -599,12 +601,12 @@ END IF
 #else
   IF (GFTH2) THEN
     CALL M3_TH2_WTH2( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),ZTMP1_DEVICE(:,:,:))
-    !$acc kernels
+    !$acc kernels present_cr(ZF)
     ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:)
     !$acc end kernels
     CALL D_M3_TH2_WTH2_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),&
      & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),ZTMP2_DEVICE(:,:,:))
-    !$acc kernels
+    !$acc kernels present_cr(ZDFDDTDZ)
     ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFTH2(:,:,:)
     !$acc end kernels
   END IF
@@ -623,12 +625,12 @@ END IF
     CALL MZF_DEVICE( PFWTH(:,:,:), ZTMP1_DEVICE(:,:,:) )
     CALL M3_TH2_W2TH( PREDTH1(:,:,:), PREDR1(:,:,:), PD(:,:,:), PDTH_DZ(:,:,:), PLM(:,:,:), &
                       PLEPS(:,:,:), PTKEM(:,:,:), ZTMP2_DEVICE(:,:,:) )
-    !$acc kernels
+    !$acc kernels present_cr(ZF)
     ZF(:,:,:)       = ZF(:,:,:)       + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
     !$acc end kernels
     CALL D_M3_TH2_W2TH_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),&
      & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),GUSERV,ZTMP2_DEVICE(:,:,:))
-    !$acc kernels
+    !$acc kernels present_cr(ZDFDDTDZ)
     ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
     !$acc end kernels
   END IF
@@ -647,12 +649,12 @@ END IF
     IF (GFR2) THEN
       CALL M3_TH2_WR2( PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),&
        & PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:)
       !$acc end kernels
       CALL D_M3_TH2_WR2_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),&
        & PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP2_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDTDZ)
       ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFR2(:,:,:)
       !$acc end kernels
     END IF
@@ -673,10 +675,10 @@ END IF
        & PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP2_DEVICE(:,:,:))
       CALL D_M3_TH2_W2R_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),&
        & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP3_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
       !$acc end kernels
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDTDZ)
       ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP3_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
       !$acc end kernels
     END IF
@@ -694,12 +696,12 @@ END IF
     IF (GFTHR) THEN
       CALL M3_TH2_WTHR( PREDR1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),&
        & PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:)
       !$acc end kernels
       CALL D_M3_TH2_WTHR_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),&
        & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP2_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDTDZ)
       ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFTHR(:,:,:)
       !$acc end kernels
     END IF
@@ -715,7 +717,7 @@ END IF
   !             *DZM(PTHLP(:,:,:) - PTHLM(:,:,:)) / PDZZ(:,:,:)                                        ) &
         + PIMPL * ZDFDDTDZ(:,:,:) * MZF(DZM(PTHLP(:,:,:) - PTHLM(:,:,:)) / PDZZ(:,:,:) )
 #else
-  !$acc kernels present_cr(ztmp1_device)
+  !$acc kernels present_cr(ZTMP1_DEVICE)
   ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:)
   !$acc end kernels
   CALL DZM_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP2_DEVICE(:,:,:) )
@@ -729,7 +731,8 @@ END IF
   !$acc end kernels
   CALL MZF_DEVICE( ZTMP3_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) )
 #ifdef MNH_COMPILER_CCE
-  !$acc kernels present(ZFLXZ)
+  !PASVSCAL$acc kernels present(ZFLXZ)
+  !$acc kernels 
 #else
   !$acc kernels 
 #endif
@@ -740,10 +743,12 @@ END IF
      ZFLXZ(JI,JJ,JK)   = ZF(JI,JJ,JK)                                                              &
           + PIMPL * ZDFDDTDZ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK)
   END DO
+!$acc end kernels
 #endif
   !
   ! special case near the ground ( uncentred gradient )
 #ifndef MNH_BITREP
+  !$acc kernels  present_cr(ZFLXZ)
   ZFLXZ(:,:,IKB) = XCTV * PPHI3(:,:,IKB+KKL) * PLM(:,:,IKB)   &
      * PLEPS(:,:,IKB)                                         &
   *( PEXPL *                                                  &
@@ -755,7 +760,9 @@ END IF
       +ZCOEFF(:,:,IKB+KKL  )*PTHLP(:,:,IKB+KKL  )             &
       +ZCOEFF(:,:,IKB      )*PTHLP(:,:,IKB  )   )**2          &
    ) 
+  !$acc end kernels
 #else
+  !$acc kernels 
 #ifdef MNH_COMPILER_NVHPC
   !$acc loop independent collapse(2)
 #endif
@@ -772,12 +779,13 @@ END IF
       +ZCOEFF(JI,JJ,IKB      )*PTHLP(JI,JJ,IKB  )   )             &
       )
    END DO
+  !$acc end kernels
 #endif
-  !
+
+  !$acc kernels present_cr(ZFLXZ,PSIGS)
   ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) 
   !
   ZFLXZ(:,:,:) = MAX(0., ZFLXZ(:,:,:))
-  !
   IF (KRRL > 0)  THEN
 #ifndef MNH_BITREP
     PSIGS(:,:,:) = ZFLXZ(:,:,:) * PATHETA(:,:,:)**2 
@@ -820,22 +828,22 @@ END IF
     CALL LES_MEAN_SUBGRID( ZFLXZ(:,:,:), X_LES_SUBGRID_Thl2 )
     !
     CALL  MZF_DEVICE( PWM(:,:,:), ZTMP1_DEVICE(:,:,:) )
-    !$acc kernels present_cr(ztmp2_device)
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE(:,:,:), X_LES_RES_W_SBG_Thl2 )
     !
-    !$acc kernels present_cr(ztmp1_device)
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = -2.*XCTD*PSQRT_TKE(:,:,:)*ZFLXZ(:,:,:)/PLEPS(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_DISS_Thl2 )
     !
-    !$acc kernels present_cr(ztmp1_device)
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PETHETA(:,:,:)*ZFLXZ(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_ThlThv )
     !
-    !$acc kernels present_cr(ztmp1_device)
+    !$acc kernels present_cr(ZTMP1_DEVICE)
     ZTMP1_DEVICE(:,:,:) = -XA3*PBETA(:,:,:)*PETHETA(:,:,:)*ZFLXZ(:,:,:)
     !$acc end kernels
     CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_ThlPz, .TRUE. )
@@ -855,12 +863,12 @@ END IF
 #ifndef MNH_OPENACC
     ZF      (:,:,:) = XCTV*PLM(:,:,:)*PLEPS(:,:,:)*MZF(0.5*(PPHI3(:,:,:)+PPSI3(:,:,:))*PDTH_DZ(:,:,:)*PDR_DZ(:,:,:))
 #else
-!$acc kernels
+!$acc kernels present_cr(ZTMP1_DEVICE)
 !dir$ concurrent    
     ZTMP1_DEVICE(:,:,:) = 0.5*(PPHI3(:,:,:)+PPSI3(:,:,:))*PDTH_DZ(:,:,:)*PDR_DZ(:,:,:)
 !$acc end kernels
     CALL MZF_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP2_DEVICE(:,:,:) )
-!$acc kernels
+!$acc kernels 
 #ifdef MNH_COMPILER_NVHPC
 !$acc loop independent collapse(3)    
 #endif
@@ -869,7 +877,7 @@ END IF
     END DO
 !$acc end kernels    
 #endif
-!$acc kernels   
+!$acc kernels present_cr(ZDFDDTDZ,ZDFDDRDZ)  
     ZDFDDTDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately
     ZDFDDRDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately
 !$acc end kernels
@@ -890,17 +898,17 @@ END IF
     IF (GFTH2) THEN
       CALL M3_THR_WTH2( PREDR1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),&
        & PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_WTH2_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),&
        & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDTDZ)
       ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_WTH2_O_DDRDZ( PREDTH1(:,:,:),PREDR1(:,:,:),&
        & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDRDZ)
       ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:)
       !$acc end kernels
     END IF
@@ -921,17 +929,17 @@ END IF
       CALL M3_THR_W2TH( PREDR1(:,:,:),PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),&
        & PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
       CALL MZF_DEVICE( PFWTH(:,:,:), ZTMP2_DEVICE(:,:,:) )
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_W2TH_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),&
        & PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),PBLL_O_E(:,:,:),PDR_DZ(:,:,:),PETHETA(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDTDZ)
       ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_W2TH_O_DDRDZ( PREDTH1(:,:,:),PREDR1(:,:,:),&
        & PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDRDZ)
       ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
       !$acc end kernels
     END IF
@@ -951,17 +959,17 @@ END IF
     IF (GFR2) THEN
       CALL M3_THR_WR2( PREDTH1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),&
        & PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_WR2_O_DDTDZ( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),&
        & PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDTDZ)
       ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_WR2_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),&
        & PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDRDZ)
       ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:)
       !$acc end kernels
     END IF
@@ -982,17 +990,17 @@ END IF
       CALL MZF_DEVICE( PFWR(:,:,:), ZTMP1_DEVICE(:,:,:) )
       CALL M3_THR_W2R( PREDTH1(:,:,:),PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),&
       & PDTH_DZ(:,:,:),ZTMP2_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_W2R_O_DDTDZ( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),&
       & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),ZTMP2_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDTDZ)
       ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_W2R_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),&
       & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),PBLL_O_E(:,:,:),PDTH_DZ(:,:,:),PEMOIST(:,:,:),ZTMP2_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDRDZ)
       ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
       !$acc end kernels
     END IF
@@ -1012,17 +1020,17 @@ END IF
     IF (GFTHR) THEN
       CALL M3_THR_WTHR( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),PLEPS(:,:,:),&
       & PSQRT_TKE(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_WTHR_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),&
       & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDTDZ)
       ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:)
       !$acc end kernels
       CALL D_M3_THR_WTHR_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),&
       & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDRDZ)
       ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:)
       !$acc end kernels
     END IF
@@ -1045,13 +1053,13 @@ END IF
         + PIMPL * ZDFDDTDZ(:,:,:) * MZF(DZM(PTHLP(:,:,:) - PTHLM(:,:,:)) / PDZZ(:,:,:) )         &
         + PIMPL * ZDFDDRDZ(:,:,:) * MZF(DZM(PRP(:,:,:)   - PRM(:,:,:,1)) / PDZZ(:,:,:) )
 #else
-    !$acc kernels present_cr(ztmp1_device,ztmp2_device)
+    !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP2_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:)
     ZTMP2_DEVICE(:,:,:) = PRP(:,:,:)   - PRM(:,:,:,1)
     !$acc end kernels
     CALL DZM_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) )
     CALL DZM_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) )
-    !$acc kernels
+    !$acc kernels 
 #ifdef MNH_COMPILER_NVHPC
     !$acc loop independent collapse(3)
 #endif
@@ -1069,7 +1077,7 @@ END IF
                             HTURBDIM,GUSERV,ZTMP5_DEVICE(:,:,:)) ! d(phi3*drdz )/ddrdz term
     CALL D_PSI3DRDZ_O_DDRDZ(PPSI3(:,:,:),PREDR1(:,:,:),PREDTH1(:,:,:),PRED2R3(:,:,:),PRED2THR3(:,:,:), &
                             HTURBDIM,GUSERV,ZTMP6_DEVICE(:,:,:))  ! d(psi3*drdz )/ddrdz term
-    !$acc kernels present_cr(ztmp1_device,ztmp8_device)
+    !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP8_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:)
     ZTMP8_DEVICE(:,:,:) = PRP(:,:,:)   - PRM(:,:,:,1)
     !$acc end kernels
@@ -1088,7 +1096,7 @@ END IF
     END DO
     !$acc end kernels
     !!!
-    !$acc kernels present_cr(ztmp1_device,ztmp2_device)
+    !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP2_DEVICE)
     ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:)
     ZTMP2_DEVICE(:,:,:) = PRP(:,:,:)   - PRM(:,:,:,1)
     !$acc end kernels
@@ -1142,9 +1150,9 @@ END IF
         +ZCOEFF(JI,JJ,IKB      )*PRP(JI,JJ,IKB        ))            &
         )
     END DO
-    !    
+!$acc end kernels
+    !$acc kernels present_cr(ZFLXZ,PSIGS)    
     ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) 
-    !
       IF ( KRRL > 0 ) THEN
       PSIGS(:,:,:) = PSIGS(:,:,:) +     &
                      2. * PATHETA(:,:,:) * PAMOIST(:,:,:) * ZFLXZ(:,:,:)
@@ -1185,32 +1193,32 @@ END IF
       CALL LES_MEAN_SUBGRID( ZFLXZ(:,:,:), X_LES_SUBGRID_THlRt )
       !
       CALL MZF_DEVICE( PWM(:,:,:), ZTMP1_DEVICE(:,:,:) )
-      !$acc kernels present_cr(ztmp2_device)
+      !$acc kernels present_cr(ZTMP2_DEVICE)
       ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:)
       !$acc end kernels
       CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE(:,:,:), X_LES_RES_W_SBG_ThlRt )
       !
-      !$acc kernels present_cr(ztmp1_device)
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = -2.*XCTD*PSQRT_TKE(:,:,:)*ZFLXZ(:,:,:)/PLEPS(:,:,:)
       !$acc end kernels
       CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_DISS_ThlRt )
       !
-      !$acc kernels present_cr(ztmp1_device)
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = PETHETA(:,:,:)*ZFLXZ(:,:,:)
       !$acc end kernels
       CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_RtThv )
       !
-      !$acc kernels present_cr(ztmp1_device)
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = -XA3*PBETA(:,:,:)*PETHETA(:,:,:)*ZFLXZ(:,:,:)
       !$acc end kernels
       CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_RtPz, .TRUE. )
       !
-      !$acc kernels present_cr(ztmp1_device)
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = PEMOIST(:,:,:)*ZFLXZ(:,:,:)
       !$acc end kernels
       CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_ThlThv , .TRUE. )
       !
-      !$acc kernels present_cr(ztmp1_device)
+      !$acc kernels present_cr(ZTMP1_DEVICE)
       ZTMP1_DEVICE(:,:,:) = -XA3*PBETA(:,:,:)*PEMOIST(:,:,:)*ZFLXZ(:,:,:)
       !$acc end kernels
       CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_ThlPz, .TRUE. )
@@ -1233,7 +1241,7 @@ END IF
     ZF      (:,:,:) = XCTV*PLM(:,:,:)*PLEPS(:,:,:)*MZF(PPSI3(:,:,:)*BR_P2(PDR_DZ(:,:,:)))
 #endif
 #else
-    !$acc kernels
+    !$acc kernels !!present_cr(ZTMP1_DEVICE)
 #ifndef MNH_BITREP
     !dir$ concurrent
     ZTMP1_DEVICE(:,:,:) = PPSI3(:,:,:)*PDR_DZ(:,:,:)**2
@@ -1272,12 +1280,12 @@ END IF
     IF (GFR2) THEN
       CALL M3_R2_WR2( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),PLEPS(:,:,:),&
       & PSQRT_TKE(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:)
       !$acc end kernels
       CALL D_M3_R2_WR2_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),&
       & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),ZTMP1_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDRDZ)
       ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:)
       !$acc end kernels
     END IF
@@ -1296,12 +1304,12 @@ END IF
       CALL MZF_DEVICE( PFWR(:,:,:), ZTMP1_DEVICE(:,:,:) )
       CALL M3_R2_W2R( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),PDR_DZ(:,:,:),&
       & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),ZTMP2_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZF)
       ZF(:,:,:)       = ZF(:,:,:)       + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
       !$acc end kernels
       CALL D_M3_R2_W2R_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),&
       & PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),GUSERV,ZTMP3_DEVICE(:,:,:))
-      !$acc kernels
+      !$acc kernels present_cr(ZDFDDRDZ)
       ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP3_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
       !$acc end kernels
     END IF
@@ -1320,12 +1328,12 @@ END IF
       IF (GFTH2) THEN
         CALL M3_R2_WTH2( PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),&
         & PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
-        !$acc kernels
+        !$acc kernels present_cr(ZF)
         ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:)
         !$acc end kernels
         CALL D_M3_R2_WTH2_O_DDRDZ( PREDR1(:,:,:),&
         & PREDTH1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP2_DEVICE(:,:,:))
-        !$acc kernels
+        !$acc kernels present_cr(ZDFDDRDZ)
         ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFTH2(:,:,:)
         !$acc end kernels
       END IF
@@ -1345,12 +1353,12 @@ END IF
         CALL MZF_DEVICE( PFWTH(:,:,:), ZTMP1_DEVICE(:,:,:) )
         CALL M3_R2_W2TH( PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),&
         & PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP2_DEVICE(:,:,:))
-        !$acc kernels
+        !$acc kernels present_cr(ZF)
         ZF(:,:,:)       = ZF(:,:,:)       + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
         !$acc end kernels
         CALL D_M3_R2_W2TH_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),&
         & PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP3_DEVICE(:,:,:))
-        !$acc kernels
+        !$acc kernels present_cr(ZDFDDRDZ)
         ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP3_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:)
         !$acc end kernels
       END IF
@@ -1368,12 +1376,12 @@ END IF
       IF (GFTHR) THEN
         CALL M3_R2_WTHR( PREDTH1(:,:,:),PD(:,:,:),PLEPS(:,:,:),&
         & PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:))
-        !$acc kernels
+        !$acc kernels present_cr(ZF)
         ZF(:,:,:)       = ZF(:,:,:)       + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:)
         !$acc end kernels
         CALL D_M3_R2_WTHR_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),&
         & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP2_DEVICE(:,:,:))
-        !$acc kernels
+        !$acc kernels present_cr(ZDFDDRDZ)
         ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFTHR(:,:,:)
         !$acc end kernels
       END IF
@@ -1391,7 +1399,7 @@ END IF
 #else
     CALL D_PSI3DRDZ2_O_DDRDZ(PPSI3(:,:,:),PREDR1(:,:,:),PREDTH1(:,:,:),PRED2R3(:,:,:),PRED2THR3(:,:,:),PDR_DZ(:,:,:), &
                              HTURBDIM,GUSERV,ZTMP1_DEVICE(:,:,:))
-    !$acc kernels present_cr(ztmp2_device)
+    !$acc kernels present_cr(ZTMP2_DEVICE)
     ZTMP2_DEVICE(:,:,:) = PRP(:,:,:) - PRM(:,:,:,1)
     !$acc end kernels
     CALL DZM_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) )
@@ -1414,7 +1422,7 @@ END IF
     !$acc end kernels
     CALL MZF_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) )
 #ifdef MNH_COMPILER_CCE
-    !$acc kernels present(ZFLXZ)
+    !$acc kernels 
 #else
     !$acc kernels 
 #endif
@@ -1426,10 +1434,12 @@ END IF
             + PIMPL * XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) &
             + PIMPL * ZDFDDRDZ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK)
     END DO
+   !$acc end kernels
 #endif
     !
     ! special case near the ground ( uncentred gradient )
 #ifndef MNH_BITREP
+    !$acc kernels  present_cr(ZFLXZ)
     ZFLXZ(:,:,IKB) = XCHV * PPSI3(:,:,IKB+KKL) * PLM(:,:,IKB)   &
         * PLEPS(:,:,IKB)                                        &
     *( PEXPL *                                                  &
@@ -1441,7 +1451,9 @@ END IF
         +ZCOEFF(:,:,IKB+KKL  )*PRP(:,:,IKB+KKL  )               &
         +ZCOEFF(:,:,IKB      )*PRP(:,:,IKB      ))**2           &
      ) 
+   !$acc end kernels
 #else
+    !$acc kernels 
 #ifdef MNH_COMPILER_NVHPC
     !$acc loop independent collapse(2)
 #endif
@@ -1458,8 +1470,10 @@ END IF
         +ZCOEFF(JI,JJ,IKB      )*PRP(JI,JJ,IKB      ))              &
         )
     END DO
+   !$acc end kernels
 #endif
     !
+    !$acc kernels  present_cr(ZFLXZ)
     ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) 
     !
     IF ( KRRL > 0 ) THEN
@@ -1528,7 +1542,7 @@ END IF
 !
   IF ( KRRL > 0 ) THEN
     ! Extrapolate PSIGS at the ground and at the top
-!$acc kernels
+!$acc kernels present_cr(PSIGS)
     PSIGS(:,:,KKA) = PSIGS(:,:,IKB)
     PSIGS(:,:,KKU) = PSIGS(:,:,IKE)
     PSIGS(:,:,:) =  SQRT( MAX (PSIGS(:,:,:) , 1.E-12) )
-- 
GitLab