From 6f6c7beaefe8e2f9976d2ac0d0d4d02b03255717 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 9 Dec 2019 17:36:52 +0100
Subject: [PATCH] Philippe 09/12/2019: OpenACC: replace declare directives by
 data zones The only remaining declare are in the modd_* declarations

---
 src/LIB/SURCOUCHE/src/mode_mnh_world.f90 |   4 +-
 src/MNH/advec_4th_order_aux.f90          |   5 +-
 src/MNH/advec_weno_k_2_aux.f90           |  46 +--
 src/MNH/advec_weno_k_3_aux.f90           |  54 ++--
 src/MNH/advection_metsv.f90              |  55 +---
 src/MNH/advection_uvw.f90                |  31 +-
 src/MNH/advection_uvw_cen.f90            |  27 +-
 src/MNH/advecuvw_rk.f90                  |  12 +-
 src/MNH/condensation.f90                 |  35 ++-
 src/MNH/contrav.f90                      |   3 +-
 src/MNH/emoist.f90                       |   6 +-
 src/MNH/etheta.f90                       |   6 +-
 src/MNH/get_halo.f90                     |   2 -
 src/MNH/gravity.f90                      |   5 +-
 src/MNH/gravity_impl.f90                 |   6 +-
 src/MNH/ice4_compute_pdf.f90             |  43 ++-
 src/MNH/ice4_fast_rg.f90                 |  57 ++--
 src/MNH/ice4_fast_rh.f90                 |  72 +++--
 src/MNH/ice4_fast_ri.f90                 |  24 +-
 src/MNH/ice4_fast_rs.f90                 |  39 +--
 src/MNH/ice4_nucleation.f90              |  43 +--
 src/MNH/ice4_nucleation_wrapper.f90      |  61 ++--
 src/MNH/ice4_rainfr_vert.f90             |   5 +-
 src/MNH/ice4_rimltc.f90                  |  17 +-
 src/MNH/ice4_rrhong.f90                  |  16 +-
 src/MNH/ice4_rsrimcg_old.f90             |  28 +-
 src/MNH/ice4_sedimentation_split.f90     | 139 +++++----
 src/MNH/ice4_slow.f90                    |  29 +-
 src/MNH/ice4_tendencies.f90              |  80 +++--
 src/MNH/ice4_warm.f90                    |  39 ++-
 src/MNH/ice_adjust.f90                   |  57 ++--
 src/MNH/mode_mnh_zwork.f90               |   4 -
 src/MNH/mode_prandtl.f90                 | 356 +++++++++++++++++++----
 src/MNH/modeln.f90                       |   7 +-
 src/MNH/ppm_met.f90                      |  10 -
 src/MNH/rain_ice.f90                     |  93 ++----
 src/MNH/rain_ice_fast_rg.f90             |  19 +-
 src/MNH/rain_ice_fast_rh.f90             |  22 +-
 src/MNH/rain_ice_fast_ri.f90             |   7 +-
 src/MNH/rain_ice_fast_rs.f90             |  17 +-
 src/MNH/rain_ice_nucleation.f90          |  49 ++--
 src/MNH/rain_ice_red.f90                 | 309 +++++++++++++++-----
 src/MNH/rain_ice_sedimentation_split.f90 |  25 +-
 src/MNH/rain_ice_slow.f90                |   5 +-
 src/MNH/rain_ice_warm.f90                |   6 +-
 src/MNH/resolved_cloud.f90               |  35 +--
 src/MNH/rotate_wind.f90                  |   7 +-
 src/MNH/slow_terms.f90                   |  14 +-
 src/MNH/tm06_h.f90                       |   5 +-
 src/MNH/tridiag_thermo.f90               |   6 +-
 src/MNH/turb.f90                         |  57 ++--
 src/MNH/turb_hor_splt.f90                |  13 +-
 src/MNH/turb_hor_tke.f90                 |   2 -
 src/MNH/turb_ver_thermo_corr.f90         |   9 +-
 54 files changed, 1275 insertions(+), 848 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90
index 56f1f3fdc..30124a276 100644
--- a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90
+++ b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90
@@ -59,10 +59,9 @@ CONTAINS
 #if 0
     !Try to initialise device memory by creating a big array
     REAL,dimension(:,:,:),allocatable :: big
-    !$acc declare create(big)
-
 
     allocate(big(1024,1024,128))
+    !$acc data create(big)
 
     !$acc kernels pcopyout(big)
     big(:,:,:)=1e123
@@ -70,6 +69,7 @@ CONTAINS
     !$acc end kernels
     print *,'big=',big(1,1,1),big(1000,1024,128)
 
+    !$acc end data
     deallocate(big)
 #endif
     !
diff --git a/src/MNH/advec_4th_order_aux.f90 b/src/MNH/advec_4th_order_aux.f90
index 0ff939cf7..97ea2d967 100644
--- a/src/MNH/advec_4th_order_aux.f90
+++ b/src/MNH/advec_4th_order_aux.f90
@@ -142,7 +142,6 @@ LOGICAL                                               :: GWEST , GEAST
 LOGICAL                                               :: GSOUTH , GNORTH
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZHALO2_WEST,  ZHALO2_EAST
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZHALO2_SOUTH, ZHALO2_NORTH
-!$acc declare create (ZHALO2_WEST,ZHALO2_EAST,ZHALO2_SOUTH,ZHALO2_NORTH)
 !
 
 !$acc data present( PMEANX, PMEANY, PFIELDT )
@@ -157,6 +156,8 @@ allocate( zhalo2_east ( size( pfieldt, 2 ), size( pfieldt, 3 ) ) )
 allocate( zhalo2_south( size( pfieldt, 2 ), size( pfieldt, 3 ) ) )
 allocate( zhalo2_north( size( pfieldt, 2 ), size( pfieldt, 3 ) ) )
 
+!$acc data create ( zhalo2_west, zhalo2_east, zhalo2_south, zhalo2_north )
+
 !-------------------------------------------------------------------------------
 !
 !*       0.3.     COMPUTES THE DOMAIN DIMENSIONS
@@ -456,6 +457,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE ADVEC_4TH_ORDER_ALGO
diff --git a/src/MNH/advec_weno_k_2_aux.f90 b/src/MNH/advec_weno_k_2_aux.f90
index f850bdaf1..e5e1ad84a 100644
--- a/src/MNH/advec_weno_k_2_aux.f90
+++ b/src/MNH/advec_weno_k_2_aux.f90
@@ -302,25 +302,21 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2
-!$acc declare present(ZFPOS1,ZFPOS2)
 !
 ! intermediate reconstruction fluxes for negative wind case
 ! we need only one since ZFNEG2 = ZFPOS2
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2
-!$acc declare present(ZFNEG1,ZFNEG2)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2
-!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2
-!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2)
 !
 ! standard weights
 !
@@ -330,7 +326,9 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3.
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-----------------------------------------------------------------------------
-!$acc data present( PSRC, PRUCT, PR ) copyin( TWEST, TEAST )
+!$acc data present( psrc, pruct, pr,                                                                             &
+!$acc &             zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) &
+!$acc &     copyin( twest, teast )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -686,25 +684,21 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2
-!$acc declare present(ZFPOS1,ZFPOS2)
 !
 ! intermediate reconstruction fluxes for negative wind case
 ! we need only one since ZFNEG2 = ZFPOS2
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2
-!$acc declare present(ZFNEG1,ZFNEG2)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2
-!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2
-!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2)
 !
 ! standard weights
 !
@@ -714,7 +708,9 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3.
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-------------------------------------------------------------------------------
-!$acc data present( PSRC, PRUCT, PR ) copyin( TWEST, TEAST )
+!$acc data present( psrc, pruct, pr,                                                                             &
+!$acc &             zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) &
+!$acc &     copyin( twest, teast )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -1073,25 +1069,21 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2
-!$acc declare present(ZFPOS1,ZFPOS2)
 !
 ! intermediate reconstruction fluxes for negative wind case
 ! we need only one since ZFNEG2 = ZFPOS2
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2
-!$acc declare present(ZFNEG1,ZFNEG2)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2
-!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2
-!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2)
 !
 ! standard weights
 !
@@ -1101,7 +1093,9 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3.
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-----------------------------------------------------------------------------
-!$acc data present( PSRC, PRVCT, PR ) copyin( TNORTH, TSOUTH )
+!$acc data present( psrc, prvct, pr,                                                                             &
+!$acc &             zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) &
+!$acc &     copyin( tnorth, tsouth )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -1454,25 +1448,21 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2
-!$acc declare present(ZFPOS1,ZFPOS2)
 !
 ! intermediate reconstruction fluxes for negative wind case
 ! we need only one since ZFNEG2 = ZFPOS2
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2
-!$acc declare present(ZFNEG1,ZFNEG2)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2
-!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2
-!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2)
 !
 ! standard weights
 !
@@ -1482,7 +1472,9 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3.
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !----------------------------------------------------------------------------
-!$acc data present( PSRC, PRVCT, PR ) copyin( TNORTH, TSOUTH )
+!$acc data present( psrc, prvct, pr,                                                                             &
+!$acc &             zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) &
+!$acc &     copyin( tnorth, tsouth )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -1823,25 +1815,21 @@ INTEGER :: IT    ! End useful area in x,y,z directions
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2
-!$acc declare present(ZFPOS1,ZFPOS2)
 !
 ! intermediate reconstruction fluxes for negative wind case
 ! we need only one since ZFNEG2 = ZFPOS2
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2
-!$acc declare present(ZFNEG1,ZFNEG2)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2
-!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2
-!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2)
 !
 ! standard weights
 !
@@ -1851,7 +1839,8 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3.
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-------------------------------------------------------------------------------
-!$acc data present( PSRC, PRWCT, PR )
+!$acc data present( psrc, prwct, pr,                                                                           &
+!$acc &             zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -2034,25 +2023,21 @@ INTEGER :: IT    ! End useful area in x,y,z directions
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2
-!$acc declare present(ZFPOS1,ZFPOS2)
 !
 ! intermediate reconstruction fluxes for negative wind case
 ! we need only one since ZFNEG2 = ZFPOS2
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2
-!$acc declare present(ZFNEG1,ZFNEG2)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2
-!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2
-!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2)
 !
 ! standard weights
 !
@@ -2062,7 +2047,8 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3.
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-------------------------------------------------------------------------------
-!$acc data present( PSRC, PRWCT, PR )
+!$acc data present( psrc, prwct, pr,                                                                           &
+!$acc &             zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
diff --git a/src/MNH/advec_weno_k_3_aux.f90 b/src/MNH/advec_weno_k_3_aux.f90
index 647bf8653..d6f20a659 100644
--- a/src/MNH/advec_weno_k_3_aux.f90
+++ b/src/MNH/advec_weno_k_3_aux.f90
@@ -283,31 +283,30 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3
-!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3)
 !
 ! intermediate reconstruction fluxes for negative wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3
-!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3
-!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3)
 !
 ! WENO non-normalized weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2, ZOMP3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2, ZOMN3
-!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3)
 !
 ! EPSILON for weno weights calculation
 ! 
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-----------------------------------------------------------------------------
-!$acc data present( PSRC, PRUCT, PR )
+!$acc data present( psrc, pruct, pr,                                &
+!$acc &             zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, &
+!$acc &             zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, &
+!$acc &             zomp1, zomp2, zomp3, zomn1, zomn2, zomn3        )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -964,30 +963,29 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 !
 ! intermediate reconstruction fluxes for positive wind case
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3
-!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3)
 !
 ! intermediate reconstruction fluxes for negative wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3
-!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3)
 !
 ! smoothness indicators for positive wind case
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3
-!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2, ZOMP3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2, ZOMN3
-!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3)
 !
 ! EPSILON for weno weights calculation
 ! 
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-------------------------------------------------------------------------------
-!$acc data present( PSRC, PRUCT, PR )
+!$acc data present( psrc, pruct, pr,                                &
+!$acc &             zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, &
+!$acc &             zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, &
+!$acc &             zomp1, zomp2, zomp3, zomn1, zomn2, zomn3        )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -1647,31 +1645,30 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3
-!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3)
 !
 ! intermediate reconstruction fluxes for negative wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3
-!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3
-!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3)
 !
 ! WENO weights 
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMP1, ZOMP2, ZOMP3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMN1, ZOMN2, ZOMN3
-!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3)
 !
 ! EPSILON for weno weights calculation
 ! 
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-----------------------------------------------------------------------------
-!$acc data present( PSRC, PRVCT, PR )
+!$acc data present( psrc, prvct, pr,                                &
+!$acc &             zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, &
+!$acc &             zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, &
+!$acc &             zomp1, zomp2, zomp3, zomn1, zomn2, zomn3        )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -2328,32 +2325,31 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3
-!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3)
 !
 ! intermediate reconstruction fluxes for negative wind case
 !
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3
-!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3
-!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2, ZOMP3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2, ZOMN3
-!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3)
 !
 ! EPSILON for weno weights calculation
 ! 
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !----------------------------------------------------------------------------
-!$acc data present( PSRC, PRVCT, PR )
+!$acc data present( psrc, prvct, pr,                                &
+!$acc &             zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, &
+!$acc &             zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, &
+!$acc &             zomp1, zomp2, zomp3, zomn1, zomn2, zomn3        )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -3011,31 +3007,30 @@ INTEGER :: IT    ! End useful area in x,y,z directions
 !
 ! intermediate reconstruction fluxes for positive wind case
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3
-!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3)
 !
 ! intermediate reconstruction fluxes for negative wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3
-!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3
-!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMP1, ZOMP2, ZOMP3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMN1, ZOMN2, ZOMN3
-!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3)
 !
 ! EPSILON for weno weights calculation
 ! 
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-------------------------------------------------------------------------------
-!$acc data present( PSRC, PRWCT, PR )
+!$acc data present( psrc, prwct, pr,                                &
+!$acc &             zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, &
+!$acc &             zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, &
+!$acc &             zomp1, zomp2, zomp3, zomn1, zomn2, zomn3        )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -3283,31 +3278,30 @@ INTEGER :: IT    ! End useful area in x,y,z directions
 ! intermediate reconstruction fluxes for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3
-!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3)
 !
 ! intermediate reconstruction fluxes for negative wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3
-!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3)
 !
 ! smoothness indicators for positive wind case
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3
-!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3)
 !
 ! WENO weights
 !
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMP1, ZOMP2, ZOMP3
 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMN1, ZOMN2, ZOMN3
-!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3)
 !
 ! EPSILON for weno weights calculation
 ! 
 REAL, PARAMETER :: ZEPS = 1.0E-15
 !
 !-------------------------------------------------------------------------------
-!$acc data present( PSRC, PRWCT, PR )
+!$acc data present( psrc, prwct, pr,                                &
+!$acc &             zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, &
+!$acc &             zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, &
+!$acc &             zomp1, zomp2, zomp3, zomn1, zomn2, zomn3        )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index 1f1fd7500..abcc83011 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -235,55 +235,42 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRTKES_ADV  ! Advection TKE source te
 REAL, DIMENSION(:,:,:),allocatable :: ZRUCPPM
 REAL, DIMENSION(:,:,:),allocatable :: ZRVCPPM
 REAL, DIMENSION(:,:,:),allocatable :: ZRWCPPM
-!$acc declare create(ZRUCPPM,ZRVCPPM,ZRWCPPM)
                                                   ! contravariant
                                                   ! components
                                                   ! of momentum
 REAL, DIMENSION(:,:,:),allocatable :: ZCFLU
 REAL, DIMENSION(:,:,:),allocatable :: ZCFLV
 REAL, DIMENSION(:,:,:),allocatable :: ZCFLW
-!$acc declare create(ZCFLU,ZCFLV,ZCFLW)
 !                                                 ! CFL numbers on each direction
 REAL, DIMENSION(:,:,:),allocatable :: ZCFL
-!$acc declare create(ZCFL)
 !                                                 ! CFL number
 !
 REAL :: ZCFLU_MAX, ZCFLV_MAX, ZCFLW_MAX, ZCFL_MAX ! maximum CFL numbers
 !
 REAL, DIMENSION(:,:,:),allocatable :: ZTH
 REAL, DIMENSION(:,:,:),allocatable :: ZTKE
-!$acc declare create(ZTH,ZTKE)
 REAL, DIMENSION(:,:,:),allocatable :: ZRTHS_OTHER
 REAL, DIMENSION(:,:,:),allocatable :: ZRTKES_OTHER
-!$acc declare create(ZRTHS_OTHER,ZRTKES_OTHER)
 REAL, DIMENSION(:,:,:),allocatable :: ZRTHS_PPM
-!$acc declare create(ZRTHS_PPM)
 REAL, DIMENSION(:,:,:),allocatable :: ZRTKES_PPM
-!$acc declare create(ZRTKES_PPM)
 REAL, DIMENSION(:,:,:,:),allocatable :: ZR
 REAL, DIMENSION(:,:,:,:),allocatable :: ZSV
-!$acc declare create(ZR,ZSV)
 REAL, DIMENSION(:,:,:,:),allocatable :: ZSNWC
 REAL, DIMENSION(:,:,:,:),allocatable :: ZSNWC_INIT
 REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS
-!$acc declare create(ZSNWC,ZSNWC_INIT,ZRSNWCS)
 ! Guess at the sub time step
 REAL, DIMENSION(:,:,:,:),allocatable :: ZRRS_OTHER
 REAL, DIMENSION(:,:,:,:),allocatable :: ZRSVS_OTHER
 REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS_OTHER
-!$acc declare create(ZRRS_OTHER,ZRSVS_OTHER,ZRSNWCS_OTHER)
 ! Tendencies since the beginning of the time step
 REAL, DIMENSION(:,:,:,:),allocatable :: ZRRS_PPM
 REAL, DIMENSION(:,:,:,:),allocatable :: ZRSVS_PPM
 REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS_PPM
-!$acc declare create(ZRRS_PPM,ZRSVS_PPM,ZRSNWCS_PPM)
 ! Guess at the end of the sub time step
 REAL, DIMENSION(:,:,:),allocatable :: ZRHOX1,ZRHOX2
 REAL, DIMENSION(:,:,:),allocatable :: ZRHOY1,ZRHOY2
 REAL, DIMENSION(:,:,:),allocatable :: ZRHOZ1,ZRHOZ2
 REAL, DIMENSION(:,:,:),allocatable :: ZT,ZEXN,ZLV,ZLS,ZCPH
-!$acc declare create(ZRHOX1,ZRHOX2,ZRHOY1,ZRHOY2,ZRHOZ1,ZRHOZ2)
-!$acc declare create(ZT,ZEXN,ZLV,ZLS,ZCPH)
 
 ! Temporary advected rhodj for PPM routines
 !
@@ -370,6 +357,13 @@ allocate( ZEXN         ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )
 allocate( ZLV          ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
 allocate( ZLS          ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
 allocate( ZCPH         ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
+
+!$acc data create( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH,                        &
+!$acc &            ZTKE, ZRTHS_OTHER, ZRTKES_OTHER, ZRTHS_PPM, ZRTKES_PPM,                           &
+!$acc &            ZR, ZSV, ZSNWC, ZSNWC_INIT, ZRSNWCS, ZRRS_OTHER, ZRSVS_OTHER, ZRSNWCS_OTHER,      &
+!$acc &            ZRRS_PPM, ZRSVS_PPM, ZRSNWCS_PPM, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, &
+!$acc &            ZT, ZEXN, ZLV, ZLS, ZCPH                                                          )
+
 !
 !*       0.     INITIALIZATION                        
 !	        --------------
@@ -960,39 +954,6 @@ END IF
 CALL MNH_REL_ZT3D(IZ1, IZ2)
 #endif
 !-------------------------------------------------------------------------------
-!
-deallocate( ZRUCPPM )
-deallocate( ZRVCPPM )
-deallocate( ZRWCPPM )
-deallocate( ZCFLU )
-deallocate( ZCFLV )
-deallocate( ZCFLW )
-deallocate( ZCFL )
-deallocate( ZTH )
-deallocate( ZTKE )
-deallocate( ZRTHS_OTHER )
-deallocate( ZRTKES_OTHER )
-deallocate( ZRTHS_PPM )
-deallocate( ZRTKES_PPM )
-deallocate( ZR )
-deallocate( ZSV )
-deallocate( ZSNWC)
-deallocate( ZSNWC_INIT )
-deallocate( ZRSNWCS )
-deallocate( ZRRS_OTHER )
-deallocate( ZRSVS_OTHER )
-deallocate( ZRSNWCS_OTHER )
-deallocate( ZRRS_PPM )
-deallocate( ZRSVS_PPM )
-deallocate( ZRSNWCS_PPM )
-deallocate( ZRHOX1, ZRHOX2 )
-deallocate( ZRHOY1, ZRHOY2 )
-deallocate( ZRHOZ1, ZRHOZ2 )
-deallocate( ZT )
-deallocate( ZEXN )
-deallocate( ZLV )
-deallocate( ZLS )
-deallocate( ZCPH )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
@@ -1006,4 +967,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ADVECTION_METSV
diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90
index 03e2c6fa4..c1f96a8ef 100644
--- a/src/MNH/advection_uvw.f90
+++ b/src/MNH/advection_uvw.f90
@@ -156,7 +156,6 @@ INTEGER             :: IKE       ! indice K End       in z direction
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUT
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVT
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWT
-!$acc declare create(ZRUT,ZRVT,ZRWT)
                                                   ! cartesian
                                                   ! components of
                                                   ! momentum
@@ -164,27 +163,22 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWT
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUCT
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVCT
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWCT
-!$acc declare create(ZRUCT,ZRVCT,ZRWCT)
                                                   ! contravariant
                                                   ! components
                                                   ! of momentum
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU, ZV, ZW
-!$acc declare create(ZU,ZV,ZW)
 ! Guesses at the end of the sub time step
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS_OTHER
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVS_OTHER
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWS_OTHER
-!$acc declare create(ZRUS_OTHER,ZRVS_OTHER,ZRWS_OTHER)
 ! Contribution of the RK time step
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS_ADV
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVS_ADV
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWS_ADV
-!$acc declare create(ZRUS_ADV,ZRVS_ADV,ZRWS_ADV)
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMXM_RHODJ
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMYM_RHODJ
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMZM_RHODJ
-!$acc declare create(ZMXM_RHODJ,ZMYM_RHODJ,ZMZM_RHODJ)
 !
 ! Momentum tendencies due to advection
 INTEGER :: ISPLIT              ! Number of splitting loops
@@ -248,6 +242,10 @@ ALLOCATE( ZMXM_RHODJ( SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3) ) )
 ALLOCATE( ZMYM_RHODJ( SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3) ) )
 ALLOCATE( ZMZM_RHODJ( SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3) ) )
 
+!$acc data create( zrut, zrvt, zrwt, zruct, zrvct, zrwct, zu, zv, zw,                &
+!$acc &            zrus_other, zrvs_other, zrws_other, zrus_adv, zrvs_adv, zrws_adv, &
+!$acc &            zrus_adv, zrvs_adv, zrws_adv, zmxm_rhodj, zmym_rhodj, zmzm_rhodj  )
+
 #ifdef MNH_OPENACC
 #if 0
 CALL INIT_ON_HOST_AND_DEVICE(ZRUT,-1e99,'ADVECTION_UVW::ZRUT')
@@ -505,25 +503,6 @@ CALL MNH_REL_ZT4D(ISPL, IZRUSB)
 CALL MNH_REL_ZT3D(IZUT, IZVT, IZWT, IZ1, IZ2)
 #endif
 
-DEALLOCATE( ZRUT )
-DEALLOCATE( ZRVT )
-DEALLOCATE( ZRWT )
-DEALLOCATE( ZRUCT )
-DEALLOCATE( ZRVCT )
-DEALLOCATE( ZRWCT )
-DEALLOCATE( ZU )
-DEALLOCATE( ZV )
-DEALLOCATE( ZW )
-DEALLOCATE( ZRUS_OTHER )
-DEALLOCATE( ZRVS_OTHER )
-DEALLOCATE( ZRWS_OTHER )
-DEALLOCATE( ZRUS_ADV )
-DEALLOCATE( ZRVS_ADV )
-DEALLOCATE( ZRWS_ADV )
-DEALLOCATE( ZMXM_RHODJ )
-DEALLOCATE( ZMYM_RHODJ )
-DEALLOCATE( ZMZM_RHODJ )
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRUS,"ADVECTION_UVW end:PRUS")
@@ -533,4 +512,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ADVECTION_UVW
diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90
index dcd9de9c8..fdc6cd0e2 100644
--- a/src/MNH/advection_uvw_cen.f90
+++ b/src/MNH/advection_uvw_cen.f90
@@ -151,13 +151,11 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2MLIST ! momentum variables
 REAL, DIMENSION(:,:,:), allocatable :: ZUS
 REAL, DIMENSION(:,:,:), allocatable :: ZVS
 REAL, DIMENSION(:,:,:), allocatable :: ZWS
-!$acc declare create(ZUS,ZVS,ZWS)
                                                   ! guess of cartesian components of
                                                   ! momentum at future (+PTSTEP) timestep
 REAL, DIMENSION(:,:,:), allocatable :: ZRUS
 REAL, DIMENSION(:,:,:), allocatable :: ZRVS
 REAL, DIMENSION(:,:,:), allocatable :: ZRWS
-!$acc declare create(ZRUS,ZRVS,ZRWS)
                                                   ! cartesian components of
                                                   ! rhodJ times the tendency of
                                                   ! momentum from previous (-PTSTEP)
@@ -166,7 +164,6 @@ REAL, DIMENSION(:,:,:), allocatable :: ZRWS
 REAL, DIMENSION(:,:,:), allocatable :: ZRUT
 REAL, DIMENSION(:,:,:), allocatable :: ZRVT
 REAL, DIMENSION(:,:,:), allocatable :: ZRWT
-!$acc declare create(ZRUT,ZRVT,ZRWT)
                                                   ! cartesian
                                                   ! components of
                                                   ! momentum
@@ -174,14 +171,12 @@ REAL, DIMENSION(:,:,:), allocatable :: ZRWT
 REAL, DIMENSION(:,:,:), allocatable :: ZRUCT
 REAL, DIMENSION(:,:,:), allocatable :: ZRVCT
 REAL, DIMENSION(:,:,:), allocatable :: ZRWCT
-!$acc declare create(ZRUCT,ZRVCT,ZRWCT)
                                                   ! contravariant
                                                   ! components
                                                   ! of momentum
 REAL, DIMENSION(:,:,:), allocatable :: ZMXM_RHODJ
 REAL, DIMENSION(:,:,:), allocatable :: ZMYM_RHODJ
 REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ
-!$acc declare create(ZMXM_RHODJ,ZMYM_RHODJ,ZMZM_RHODJ)
 !
 INTEGER                     :: IINFO_ll    ! return code of parallel routine
 TYPE(LIST_ll), POINTER      :: TZFIELDS_ll ! list of fields to exchange
@@ -233,6 +228,9 @@ allocate( zmxm_rhodj ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
 allocate( zmym_rhodj ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
 allocate( zmzm_rhodj ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
 
+!$acc data create( zus, zvs, zws, zrus, zrvs, zrws, zrut, zrvt, zrwt, &
+!$acc &            zruct, zrvct, zrwct, zmxm_rhodj, zmym_rhodj, zmzm_rhodj )
+
 #ifdef MNH_OPENACC
 CALL INIT_ON_HOST_AND_DEVICE(ZUS,-1e99,'ADVECTION_UVW_CEN::ZUS')
 CALL INIT_ON_HOST_AND_DEVICE(ZVS,-2e99,'ADVECTION_UVW_CEN::ZVS')
@@ -361,22 +359,6 @@ IF (LBUDGET_W)  CALL BUDGET (PRWS,3,'ADV_BU_RW')
 CALL MNH_REL_ZT3D(IZ1, IZ2)
 #endif
 
-deallocate( zus        )
-deallocate( zvs        )
-deallocate( zws        )
-deallocate( zrus       )
-deallocate( zrvs       )
-deallocate( zrws       )
-deallocate( zrut       )
-deallocate( zrvt       )
-deallocate( zrwt       )
-deallocate( zruct      )
-deallocate( zrvct      )
-deallocate( zrwct      )
-deallocate( zmxm_rhodj )
-deallocate( zmym_rhodj )
-deallocate( zmzm_rhodj )
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRUS,"ADVECTION_UVW_CEN end:PRUS")
@@ -385,6 +367,9 @@ IF (MPPDB_INITIALIZED) THEN
 END IF
 
 !$acc end data
+
+!$acc end data
+
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE ADVECTION_UVW_CEN
diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90
index 7a0dc37df..34153fbe7 100644
--- a/src/MNH/advecuvw_rk.f90
+++ b/src/MNH/advecuvw_rk.f90
@@ -202,8 +202,6 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZBUT ! Butcher array coefficients
                                           ! at the RK sub time step
 REAL, DIMENSION(:),   ALLOCATABLE :: ZBUTS! Butcher array coefficients
                                           ! at the end of the RK loop
-!$acc declare create(ZBUT,ZBUTS)
-
 !JUAN
 TYPE(LIST_ll), POINTER      :: TZFIELDMT_ll ! list of fields to exchange
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll ! momentum variables
@@ -301,7 +299,9 @@ END SELECT
 !
 ALLOCATE(ZBUT(ISPL-1,ISPL-1))
 ALLOCATE(ZBUTS(ISPL))
-!
+
+!$acc data create(ZBUT,ZBUTS)
+
 SELECT CASE (HTEMP_SCHEME)
   CASE('RK11')
     ZBUTS = (/ 1. /)
@@ -522,12 +522,8 @@ ZRWS = 0.
 !
 #ifdef MNH_OPENACC
 CALL MNH_REL_ZT3D(IZMEAN,IZWORK)
-#else
-DEALLOCATE(ZRUS, ZRVS, ZRWS)
-deallocate(ZUT,ZVT,ZWT)
 #endif
 !
-DEALLOCATE(ZBUT, ZBUTS)
 CALL CLEANLIST_ll(TZFIELDMT_ll)
 CALL  DEL_HALO2_ll(TZHALO2MT_ll)
 !$acc update self(PRUS_ADV,PRVS_ADV,PRWS_ADV)
@@ -543,4 +539,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ADVECUVW_RK
diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90
index 57b950656..96edd4530 100644
--- a/src/MNH/condensation.f90
+++ b/src/MNH/condensation.f90
@@ -178,20 +178,20 @@ REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PCPH
 !*       0.2   Declarations of local variables :
 !
 INTEGER  :: JI, JJ, JK, JKP, JKM, IKTB, IKTE    ! loop index
-REAL, DIMENSION(KIU,KJU,KKU) :: ZTLK, ZRT       ! work arrays for T_l and total water mixing ratio
-REAL, DIMENSION(KIU,KJU,KKU) :: ZL              ! length scale
-REAL, DIMENSION(KIU,KJU,KKU) :: ZFRAC           ! Ice fraction
-INTEGER, DIMENSION(KIU,KJU)  :: ITPL            ! top levels of troposphere
-REAL,    DIMENSION(KIU,KJU)  :: ZTMIN           ! minimum Temp. related to ITPL
+REAL,    DIMENSION(:,:,:), allocatable :: ZTLK, ZRT       ! work arrays for T_l and total water mixing ratio
+REAL,    DIMENSION(:,:,:), allocatable :: ZL              ! length scale
+REAL,    DIMENSION(:,:,:), allocatable :: ZFRAC           ! Ice fraction
+INTEGER, DIMENSION(:,:),   allocatable :: ITPL            ! top levels of troposphere
+REAL,    DIMENSION(:,:),   allocatable :: ZTMIN           ! minimum Temp. related to ITPL
 !
-REAL, DIMENSION(KIU,KJU,KKU) :: ZLV, ZLS, ZCPD
+REAL,    DIMENSION(:,:,:), allocatable :: ZLV, ZLS, ZCPD
 REAL :: ZTEMP, ZPV, ZQSL, ZPIV, ZQSI, ZCOND, ZLVS ! thermodynamics
 REAL :: ZLL, DZZ, ZZZ                           ! used for length scales
 REAL :: ZAH, ZA, ZB, ZSBAR, ZQ1, ZSIGMA, ZDRW, ZDTL, ZSIG_CONV ! related to computation of Sig_s
 INTEGER  :: INQ1
 REAL :: ZINC
 LOGICAL :: GPRESENT_PLV, GPRESENT_PLS, GPRESENT_PCPH
-LOGICAL, DIMENSION(KIU,KJU,KKU) :: GWORK
+LOGICAL, DIMENSION(:,:,:), allocatable :: GWORK
 !
 !*       0.3  Definition of constants :
 !
@@ -213,8 +213,6 @@ REAL, DIMENSION(-22:11),PARAMETER :: ZSRC_1D =(/                         &
        0.9986521    ,  0.999768E+00 ,  0.9999684    ,   0.999997E+00,    &
        1.0000000    ,  1.000000     /)
 !
-!$acc declare create(ZFRAC) device_resident(ZTLK,ZRT,ZL,ITPL,ZTMIN,ZLV,ZLS,ZCPD,GWORK)
-!
 !-------------------------------------------------------------------------------
 !
 !$acc data present(PPABS, PZZ, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, PLV, PLS, PCPH)
@@ -236,7 +234,22 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK3D(PRC,"CONDENSATION beg:PRC",PRECISION)
   CALL MPPDB_CHECK3D(PRI,"CONDENSATION beg:PRI",PRECISION)
 END IF
-!
+
+allocate( ztlk (kiu, kju, kku ) )
+allocate( zrt  (kiu, kju, kku ) )
+allocate( zl   (kiu, kju, kku ) )
+allocate( zfrac(kiu, kju, kku ) )
+
+allocate( itpl (kiu, kju ) )
+allocate( ztmin(kiu, kju ) )
+
+allocate( zlv  (kiu, kju, kku ) )
+allocate( zls  (kiu, kju, kku ) )
+allocate( zcpd (kiu, kju, kku ) )
+allocate( gwork(kiu, kju, kku ) )
+
+!$acc data create( ztlk, zrt, zl, zfrac, itpl, ztmin, zlv, zls,zcpd, gwork )
+
 IKTB=1+JPVEXT
 IKTE=KKU-JPVEXT
 !
@@ -503,4 +516,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE CONDENSATION
diff --git a/src/MNH/contrav.f90 b/src/MNH/contrav.f90
index e4dd9c400..5c3162db8 100644
--- a/src/MNH/contrav.f90
+++ b/src/MNH/contrav.f90
@@ -570,7 +570,6 @@ INTEGER                             :: IINFO_ll
 LOGICAL                             :: GDATA_ON_DEVICE
 real                                :: ZTMP1, ZTMP2 ! Intermediate work variables
 REAL,   DIMENSION(:,:), ALLOCATABLE :: ZU_EAST, ZV_NORTH, ZDZX_EAST, ZDZY_NORTH
-!$acc declare create(ZU_EAST, ZV_NORTH, ZDZX_EAST, ZDZY_NORTH)
 TYPE(LIST_ll),          POINTER     :: TZFIELD_U, TZFIELD_V, TZFIELD_DZX, TZFIELD_DZY
 TYPE(HALO2LIST_ll),     POINTER     :: TZHALO2_U, TZHALO2_V, TZHALO2_DZX, TZHALO2_DZY
 
@@ -649,6 +648,7 @@ IF (KADV_ORDER == 4 ) THEN
 !
   !PW: necessary because pointers does not work with OpenACC (PGI 16.1)
   ALLOCATE(ZU_EAST(IJU,IKU),ZV_NORTH(IIU,IKU),ZDZX_EAST(IJU,IKU),ZDZY_NORTH(IIU,IKU))
+!$acc enter data create( zu_east, zv_north, zdzx_east, zdzy_north )
   ZU_EAST(:,:)    = TZHALO2_U%HALO2%EAST
   ZDZX_EAST(:,:)  = TZHALO2_DZX%HALO2%EAST
   ZV_NORTH(:,:)   = TZHALO2_V%HALO2%NORTH
@@ -869,6 +869,7 @@ PRWCT(:,:,1) = - PRWCT(:,:,3)     ! Mirror hypothesis
 !$acc update self(PRWCT)
 !
 IF (KADV_ORDER == 4 ) THEN
+!$acc exit data delete( zu_east, zv_north, zdzx_east, zdzy_north )
   DEALLOCATE(ZU_EAST,ZV_NORTH,ZDZX_EAST,ZDZY_NORTH)
   CALL CLEANLIST_ll(TZFIELD_U)
   CALL CLEANLIST_ll(TZFIELD_V)
diff --git a/src/MNH/emoist.f90 b/src/MNH/emoist.f90
index 1f68cffa3..891977a24 100644
--- a/src/MNH/emoist.f90
+++ b/src/MNH/emoist.f90
@@ -127,7 +127,6 @@ REAL,DIMENSION(:,:,:),  INTENT(OUT):: PEMOIST ! result
 !
 REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW
 !                ZA = coeft A, ZRW = total mixing ratio rw 
-!$acc declare create(ZA,ZRW)
 REAL                                  :: ZDELTA  ! = Rv/Rd - 1
 INTEGER                               :: JRR     ! moist loop counter
 !
@@ -146,6 +145,9 @@ end if
 
 allocate( za  ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
 allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+
+!$acc data create( za, zrw )
+
 !
 !*       1. COMPUTE EMOIST
 !           --------------
@@ -217,6 +219,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !---------------------------------------------------------------------------
 !
 #ifndef MNH_OPENACC
diff --git a/src/MNH/etheta.f90 b/src/MNH/etheta.f90
index 1039cb55b..53c6580c5 100644
--- a/src/MNH/etheta.f90
+++ b/src/MNH/etheta.f90
@@ -132,7 +132,6 @@ REAL, DIMENSION(:,:,:),  INTENT(OUT):: PETHETA ! result
 !
 REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW
 !                ZA = coeft A, ZRW = total mixing ratio rw
-!$acc declare create(ZA,ZRW)
 REAL                                  :: ZDELTA  ! = Rv/Rd - 1
 INTEGER                               :: JRR     ! moist loop counter
 !
@@ -151,6 +150,9 @@ end if
 
 allocate( za  ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
 allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+
+!$acc data create( za, zrw )
+
 !
 !*       1. COMPUTE ETHETA
 !           --------------
@@ -217,6 +219,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !---------------------------------------------------------------------------
 !
 #ifndef MNH_OPENACC
diff --git a/src/MNH/get_halo.f90 b/src/MNH/get_halo.f90
index d77fef3f8..34daa24a1 100644
--- a/src/MNH/get_halo.f90
+++ b/src/MNH/get_halo.f90
@@ -135,8 +135,6 @@ MODULE MODD_HALO_D
 IMPLICIT NONE 
 REAL, SAVE , ALLOCATABLE, DIMENSION(:,:,:)  :: ZNORTH_IN, ZSOUTH_IN, ZWEST_IN, ZEAST_IN
 REAL, SAVE , ALLOCATABLE, DIMENSION(:,:,:)  :: ZNORTH_OUT, ZSOUTH_OUT, ZWEST_OUT, ZEAST_OUT
-!!$acc declare create (ZNORTH_IN, ZSOUTH_IN, ZWEST_IN, ZEAST_IN)
-!!$acc declare create (ZNORTH_OUT, ZSOUTH_OUT, ZWEST_OUT, ZEAST_OUT)
 
 LOGICAL, SAVE                               :: GFIRST_GET_HALO_D = .TRUE.
 
diff --git a/src/MNH/gravity.f90 b/src/MNH/gravity.f90
index 97a5624a3..2d43fa8a4 100644
--- a/src/MNH/gravity.f90
+++ b/src/MNH/gravity.f90
@@ -142,7 +142,6 @@ INTEGER    ::  JWATER       ! loop index on the different types of water
 REAL, DIMENSION(:,:,:), allocatable :: ZWORK1, ZWORK2
 INTEGER :: IKU
 !
-!$acc declare device_resident(ZWORK1, ZWORK2)
 !
 !-------------------------------------------------------------------------------
 
@@ -159,6 +158,8 @@ END IF
 
 allocate( zwork1(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
 allocate( zwork2(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+
+!$acc data create( zwork1, zwork2 )
 !
 !*       1.     COMPUTES THE GRAVITY TERM
 !	        -------------------------
@@ -240,6 +241,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE GRAVITY 
diff --git a/src/MNH/gravity_impl.f90 b/src/MNH/gravity_impl.f90
index 8f97f2ff9..2667b4733 100644
--- a/src/MNH/gravity_impl.f90
+++ b/src/MNH/gravity_impl.f90
@@ -126,7 +126,6 @@ REAL, DIMENSION(:,:,:,:), allocatable :: ZR
 !
 INTEGER :: JR
 !
-!$acc declare device_resident(ZRWS_GRAV, ZTH, ZR)
 !-------------------------------------------------------------------------------
 
 !$acc data present( PTHT, PRHODJ, PRT, PTHVREF, PRWS, PRTHS, PRRS, PRTHS_CLD, PRRS_CLD )
@@ -148,6 +147,9 @@ END IF
 allocate( zrws_grav( size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
 allocate( zth      ( size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
 allocate( zr       ( size( prt,  1 ), size( prt,  2 ), size( prt,  3 ), size( prt, 4 ) ) )
+
+!$acc data create( zrws_grav, zth, zr )
+
 !
 ! guess of Theta at future time-step
 !$acc kernels
@@ -191,6 +193,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE GRAVITY_IMPL
diff --git a/src/MNH/ice4_compute_pdf.f90 b/src/MNH/ice4_compute_pdf.f90
index 2d56d0908..f0e67e524 100644
--- a/src/MNH/ice4_compute_pdf.f90
+++ b/src/MNH/ice4_compute_pdf.f90
@@ -77,26 +77,24 @@ REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC   ! HLCLOUDS : LWC that is Low
                                                   !    note that PRC = PHLC_HRC + PHLC_LRC
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRF        ! Rain fraction
 !
-!$acc declare present(KSIZE,HSUBG_AUCV,HSUBG_PR_PDF,PRHODREF,PRCT,PCF,PSIGMA_RC, &
-!$acc&                PHLC_HCF,PHLC_LCF,PHLC_HRC,PHLC_LRC,PRF)
-!
 !*       0.2  declaration of local variables
 !
-INTEGER                         :: JI
-LOGICAL, DIMENSION(KSIZE)       :: GWORK, GWORK2, GWORK3
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZRCRAUTC,      & !RC value to begin rain formation =XCRIAUTC/RHODREF
-                                   ZHLC_RCMAX,    & !HLCLOUDS : maximum value for RC in distribution
-                                   ZHLC_LRCLOCAL, & !HLCLOUDS : LWC that is Low  LWC local in LCF
-                                   ZHLC_HRCLOCAL    !HLCLOUDS : LWC that is High LWC local in HCF
-                                                    !    note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL
-                                                    !                     = PHLC_HRC/HCF+ PHLC_LRC/LCF
-REAL :: ZCOEFFRCM
-!
-!$acc declare create(GWORK,GWORK2,GWORK3,ZRCRAUTC,ZHLC_RCMAX,ZHLC_LRCLOCAL,ZHLC_HRCLOCAL,ZCOEFFRCM)
+INTEGER                            :: JI
+LOGICAL, DIMENSION(:), allocatable :: GWORK, GWORK2, GWORK3
+REAL                               :: ZCOEFFRCM
+REAL,    DIMENSION(:), allocatable :: ZRCRAUTC,      & !RC value to begin rain formation =XCRIAUTC/RHODREF
+                                      ZHLC_RCMAX,    & !HLCLOUDS : maximum value for RC in distribution
+                                      ZHLC_LRCLOCAL, & !HLCLOUDS : LWC that is Low  LWC local in LCF
+                                      ZHLC_HRCLOCAL    !HLCLOUDS : LWC that is High LWC local in HCF
+                                                       !    note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL
+                                                       !                     = PHLC_HRC/HCF+ PHLC_LRC/LCF
 !
 !-------------------------------------------------------------------------------
 
-!$acc data copyin( XCRIAUTC, XRTMIN )
+! !$acc data copyin( XCRIAUTC, XRTMIN )
+
+!$acc data present(PRHODREF,PRCT,PCF,PSIGMA_RC, &
+!$acc&                PHLC_HCF,PHLC_LCF,PHLC_HRC,PHLC_LRC,PRF)
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -105,7 +103,18 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK1D(PCF,"ICE4_COMPUTE_PDF beg:PCF",PRECISION)
   CALL MPPDB_CHECK1D(PSIGMA_RC,"ICE4_COMPUTE_PDF beg:PSIGMA_RC",PRECISION)
 END IF
-!
+
+allocate( gwork (ksize ) )
+allocate( gwork2(ksize ) )
+allocate( gwork3(ksize ) )
+
+allocate( zrcrautc     (size( prhodref) ) )
+allocate( zhlc_rcmax   (size( prhodref) ) )
+allocate( zhlc_lrclocal(size( prhodref) ) )
+allocate( zhlc_hrclocal(size( prhodref) ) )
+
+!$acc data create(GWORK,GWORK2,GWORK3,ZRCRAUTC,ZHLC_RCMAX,ZHLC_LRCLOCAL,ZHLC_HRCLOCAL)
+
 !Cloud water split between high and low content part is done according to autoconversion option
 !$acc kernels
 ZRCRAUTC(:)=XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold
@@ -363,4 +372,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_COMPUTE_PDF
diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90
index fbd1f5140..c319ceb3e 100644
--- a/src/MNH/ice4_fast_rg.f90
+++ b/src/MNH/ice4_fast_rg.f90
@@ -167,11 +167,6 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RG
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RH
 !
-!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,KRR,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ,PCIT,PLBDAR,PLBDAS,PLBDAG,  &
-!$acc&                PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRGSI,PRGSI_MR,LDWETG,PRICFRRG,PRRCFRIG,PRICFRR,PRCWETG,PRIWETG, &
-!$acc&                PRRWETG,PRSWETG,PRCDRYG,PRIDRYG,PRRDRYG,PRSDRYG,PRWETGH,PRWETGH_MR,PRGMLTR,PRG_TEND,              &
-!$acc&                PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_RG,PB_RH)
-!
 !*       0.2  declaration of local variables
 !
 INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRRDRYG=6
@@ -179,27 +174,22 @@ INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRR
 INTEGER                            :: IGDRY
 INTEGER                            :: IDX, JJ
 INTEGER                            :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2
+INTEGER, DIMENSION(:), allocatable :: I1
+INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2
 LOGICAL                            :: GCRFLIMIT,GDSOFT,GEVLIMIT,GNULLWETG,GWETGPOST !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GDRY, GLDRYG, GMASK
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZVEC1, ZVEC2, ZVEC3
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZZW,         &
+LOGICAL, DIMENSION(:), allocatable :: GDRY, GLDRYG, GMASK
+REAL,    DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3
+REAL,    DIMENSION(:), allocatable :: ZZW,         &
                                       ZRDRYG_INIT, & !Initial dry growth rate of the graupeln
                                       ZRWETG_INIT    !Initial wet growth rate of the graupeln
 !
-!$acc declare create(IGDRY,I1,IVEC1,IVEC2,GDRY,GLDRYG,GMASK,ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYG_INIT,ZRWETG_INIT)
-!
-!$acc data copyin( XALPI, XALPW, XBETAI, XBETAW, XGAMW, XCI, XCL, XCPV, XESTT, XGAMI, XLMTT, XLVTT, XMD, XMV, XRV, XTT, &
-!$acc&             LCRFLIMIT, LEVLIMIT, LNULLWETG, LWETGPOST,                                                           &
-!$acc&             XBS, XCEXVT, XCXG, XCXS, XDG, XRTMIN,                                                                &
-!$acc&             NDRYLBDAG, NDRYLBDAR, NDRYLBDAS, X0DEPG, X1DEPG, XCOLEXIG, XCOLEXSG, XCOLIG, XCOLSG, XDRYINTP1G,     &
-!$acc&             XDRYINTP1R, XDRYINTP1S, XDRYINTP2G, XDRYINTP2R, XDRYINTP2S, XEX0DEPG, XEX1DEPG, XEXICFRR,            &
-!$acc&             XEXRCFRI, XFCDRYG, XFIDRYG, XFRDRYG, XFSDRYG, XICFRR, XKER_RDRYG, XKER_SDRYG, XLBRDRYG1,             &
-!$acc&             XLBRDRYG2, XLBRDRYG3, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XRCFRI )
-!
 !-------------------------------------------------------------------------------
 !
+!$acc data present(LDCOMPUTE,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ,PCIT,PLBDAR,PLBDAS,PLBDAG,  &
+!$acc&                PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRGSI,PRGSI_MR,LDWETG,PRICFRRG,PRRCFRIG,PRICFRR,PRCWETG,PRIWETG, &
+!$acc&                PRRWETG,PRSWETG,PRCDRYG,PRIDRYG,PRRDRYG,PRSDRYG,PRWETGH,PRWETGH_MR,PRGMLTR,PRG_TEND,              &
+!$acc&                PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_RG,PB_RH)
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK1D_LOG(LDCOMPUTE,"ICE4_FAST_RG beg:LDCOMPUTE")
@@ -239,7 +229,22 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK1D(PB_RG,"ICE4_FAST_RG beg:PB_RG",PRECISION)
   CALL MPPDB_CHECK1D(PB_RH,"ICE4_FAST_RG beg:PB_RH",PRECISION)
 END IF
-!
+
+allocate( i1         ( size( prhodref ) ) )
+allocate( ivec1      ( size( prhodref ) ) )
+allocate( ivec2      ( size( prhodref ) ) )
+allocate( gdry       ( size( prhodref ) ) )
+allocate( gldryg     ( size( prhodref ) ) )
+allocate( gmask      ( size( prhodref ) ) )
+allocate( zvec1      ( size( prhodref ) ) )
+allocate( zvec2      ( size( prhodref ) ) )
+allocate( zvec3      ( size( prhodref ) ) )
+allocate( zzw        ( size( prhodref ) ) )
+allocate( zrdryg_init( size( prhodref ) ) )
+allocate( zrwetg_init( size( prhodref ) ) )
+
+!$acc data create(I1,IVEC1,IVEC2,GDRY,GLDRYG,GMASK,ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYG_INIT,ZRWETG_INIT)
+
 !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 GCRFLIMIT = LCRFLIMIT
 GEVLIMIT  = LEVLIMIT
@@ -364,8 +369,8 @@ END DO
 !$acc end kernels
 !PW: BUG: this is necessary to get correct results (PGI 18.10)
 ! !$acc update self(GDRY,IGDRY)
-!$acc update self(IGDRY)
-IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY)
+! !$acc update self(IGDRY)
+! IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY)
 ! !$acc kernels
 IF(GDSOFT) THEN
 !$acc kernels
@@ -472,8 +477,8 @@ END DO
 !$acc end kernels
 !PW: BUG: this is necessary to get correct results (PGI 18.10)
 ! !$acc update self(GDRY,IGDRY)
-!$acc update self(IGDRY)
-IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY)
+! !$acc update self(IGDRY)
+! IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY)
 ! !$acc kernels
 IF(GDSOFT) THEN
 !$acc kernels
@@ -739,4 +744,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_FAST_RG
diff --git a/src/MNH/ice4_fast_rh.f90 b/src/MNH/ice4_fast_rh.f90
index 4d27b08cb..033f84ada 100644
--- a/src/MNH/ice4_fast_rh.f90
+++ b/src/MNH/ice4_fast_rh.f90
@@ -151,42 +151,31 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RS
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RG
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RH
 !
-!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,LDWETG,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ, &
-!$acc&                PLBDAS,PLBDAG,PLBDAR,PLBDAH,PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRHT,        &
-!$acc&                PRCWETH,PRIWETH,PRSWETH,PRGWETH,PRRWETH,                                  &
-!$acc&                PRCDRYH,PRIDRYH,PRSDRYH,PRRDRYH,PRGDRYH,PRDRYHG,PRHMLTR,                  &
-!$acc&                PRH_TEND,PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH)
-!
 !*       0.2  declaration of local variables
 !
 INTEGER, PARAMETER :: IRCWETH=1, IRRWETH=2, IRIDRYH=3, IRIWETH=4, IRSDRYH=5, IRSWETH=6, IRGDRYH=7, IRGWETH=8
 !
-INTEGER                            :: IHAIL, IGWET
+INTEGER                            :: IGWET
 INTEGER                            :: IDX, JJ
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2
+INTEGER, DIMENSION(:), allocatable :: I1
+INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2
 LOGICAL                            :: GCONVHG,GDSOFT,GEVLIMIT,GNULLWETH,GWETHPOST !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GHAIL, GWET, GMASK, LLWETH, LLDRYH
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZVEC1, ZVEC2, ZVEC3
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZZW, &
+LOGICAL, DIMENSION(:), allocatable :: GHAIL, GWET, GMASK, LLWETH, LLDRYH
+REAL,    DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3
+REAL,    DIMENSION(:), allocatable :: ZZW, &
                                       ZRDRYH_INIT, ZRWETH_INIT, &
                                       ZRDRYHG
 !
-!$acc declare create(IHAIL,IGWET,I1,IVEC1,IVEC2,GHAIL,GWET,GMASK,LLWETH,LLDRYH, &
-!$acc&               ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYH_INIT,ZRWETH_INIT,ZRDRYHG)
-!
-!$acc data copyin( XALPI, XALPW, XBETAI, XBETAW, XGAMW, XCI, XCL, XCPV, XESTT, XGAMI, XLMTT, XLVTT, XMD, XMV, XRV, XTT,      &
-!$acc&             LCONVHG, LEVLIMIT, LNULLWETH, LWETHPOST,                                                                  &
-!$acc&             XBG, XBS, XCEXVT, XCXG, XCXH, XCXS, XDH, XRTMIN,                                                          &
-!$acc&             NWETLBDAG, NWETLBDAH, NWETLBDAR, NWETLBDAS, X0DEPH, X1DEPH, XCOLEXGH, XCOLEXIH, XCOLGH, XCOLIH, XCOLEXSH, &
-!$acc&             XCOLSH, XEX0DEPH, XEX1DEPH, XFGWETH, XFRWETH, XFSWETH, XFWETH, XKER_GWETH, XKER_RWETH, XKER_SWETH,        &
-!$acc&             XLBGWETH1, XLBGWETH2, XLBGWETH3, XLBRWETH1, XLBRWETH2, XLBRWETH3, XLBSWETH1, XLBSWETH2, XLBSWETH3,        &
-!$acc&             XWETINTP1G, XWETINTP1H, XWETINTP1R, XWETINTP1S, XWETINTP2G, XWETINTP2H, XWETINTP2R, XWETINTP2S )
-!
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_ERROR,'GEN','ICE4_FAST_RH','OPENACC: implemented but never tested')
-!
+
+!$acc data present(LDCOMPUTE,LDWETG,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ, &
+!$acc&                PLBDAS,PLBDAG,PLBDAR,PLBDAH,PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRHT,        &
+!$acc&                PRCWETH,PRIWETH,PRSWETH,PRGWETH,PRRWETH,                                  &
+!$acc&                PRCDRYH,PRIDRYH,PRSDRYH,PRRDRYH,PRGDRYH,PRDRYHG,PRHMLTR,                  &
+!$acc&                PRH_TEND,PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH)
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK1D_LOG(LDCOMPUTE,"ICE4_FAST_RH beg:LDCOMPUTE")
@@ -221,7 +210,26 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK1D(PA_RG,"ICE4_FAST_RH beg:PA_RG",PRECISION)
   CALL MPPDB_CHECK1D(PA_RH,"ICE4_FAST_RH beg:PA_RH",PRECISION)
 END IF
-!
+
+allocate( i1         ( size( prhodref ) ) )
+allocate( ivec1      ( size( prhodref ) ) )
+allocate( ivec2      ( size( prhodref ) ) )
+allocate( ghail      ( size( prhodref ) ) )
+allocate( gwet       ( size( prhodref ) ) )
+allocate( gmask      ( size( prhodref ) ) )
+allocate( llweth     ( size( prhodref ) ) )
+allocate( lldryh     ( size( prhodref ) ) )
+allocate( zvec1      ( size( prhodref ) ) )
+allocate( zvec2      ( size( prhodref ) ) )
+allocate( zvec3      ( size( prhodref ) ) )
+allocate( zzw        ( size( prhodref ) ) )
+allocate( zrdryh_init( size( prhodref ) ) )
+allocate( zrweth_init( size( prhodref ) ) )
+allocate( zrdryhg    ( size( prhodref ) ) )
+
+!$acc data create(I1,IVEC1,IVEC2,GHAIL,GWET,GMASK,LLWETH,LLDRYH, &
+!$acc&               ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYH_INIT,ZRWETH_INIT,ZRDRYHG)
+
 !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 GCONVHG   = LCONVHG
 GEVLIMIT  = LEVLIMIT
@@ -292,8 +300,8 @@ END DO
 !$acc end kernels
 !PW: BUG: this is necessary to get correct results (PGI 18.10)
 ! !$acc update self(GWET,IGWET)
-!$acc update self(IGWET)
-IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET)
+! !$acc update self(IGWET)
+! IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET)
 ! !$acc kernels
 IF(GDSOFT) THEN
 !$acc kernels
@@ -398,8 +406,8 @@ END DO
 !$acc end kernels
 !PW: BUG: this is necessary to get correct results (PGI 18.10)
 ! !$acc update self(GWET,IGWET)
-!$acc update self(IGWET)
-IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET)
+! !$acc update self(IGWET)
+! IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET)
 ! !$acc kernels
 IF(GDSOFT) THEN
 !$acc kernels
@@ -511,8 +519,8 @@ END DO
 !$acc end kernels
 !PW: BUG: this is necessary to get correct results (PGI 18.10)
 ! !$acc update self(GWET,IGWET)
-!$acc update self(IGWET)
-IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET)
+! !$acc update self(IGWET)
+! IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET)
 ! !$acc kernels
 IF(GDSOFT) THEN
 !$acc kernels
@@ -771,4 +779,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_FAST_RH
diff --git a/src/MNH/ice4_fast_ri.f90 b/src/MNH/ice4_fast_ri.f90
index 3d5d78d92..46b860570 100644
--- a/src/MNH/ice4_fast_ri.f90
+++ b/src/MNH/ice4_fast_ri.f90
@@ -96,18 +96,17 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RI
 !
-!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,PRHODREF,PLVFACT,PLSFACT,PAI,PCJ,PCIT, &
-!$acc&                PSSI,PRCT,PRIT,PRCBERI,PA_TH,PA_RC,PA_RI)
-!
 !*       0.2  declaration of local variables
 !
 LOGICAL                            :: GDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK
-REAL,    DIMENSION(SIZE(PRHODREF)) :: ZZW
-!$acc declare create(GMASK,ZZW)
+LOGICAL, DIMENSION(:), allocatable :: GMASK
+REAL,    DIMENSION(:), allocatable :: ZZW
 !
 !-------------------------------------------------------------------------------
 !
+!$acc data present(LDCOMPUTE,PRHODREF,PLVFACT,PLSFACT,PAI,PCJ,PCIT, &
+!$acc&                PSSI,PRCT,PRIT,PRCBERI,PA_TH,PA_RC,PA_RI)
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK1D_LOG(LDCOMPUTE,"ICE4_FAST_RI beg:LDCOMPUTE")
@@ -126,7 +125,12 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK1D(PA_RC,"ICE4_FAST_RI beg:PA_RC",PRECISION)
   CALL MPPDB_CHECK1D(PA_RI,"ICE4_FAST_RI beg:PA_RI",PRECISION)
 END IF
-!
+
+allocate( gmask( size( prhodref ) ) )
+allocate( zzw  ( size( prhodref ) ) )
+
+!$acc data create(GMASK,ZZW)
+
 ! !$acc kernels
 !PW: bug?: for the moment I take the value from the CPU as OK. GPU value seems to be lost when this subroutine is called
 GDSOFT = LDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
@@ -167,5 +171,9 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK1D(PA_RC,"ICE4_FAST_RI end:PA_RC",PRECISION)
   CALL MPPDB_CHECK1D(PA_RI,"ICE4_FAST_RI end:PA_RI",PRECISION)
 END IF
-!
+
+!$acc end data
+
+!$acc end data
+
 END SUBROUTINE ICE4_FAST_RI
diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90
index f8600375d..4e213f09d 100644
--- a/src/MNH/ice4_fast_rs.f90
+++ b/src/MNH/ice4_fast_rs.f90
@@ -149,21 +149,10 @@ REAL,    DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3
 REAL,    DIMENSION(:), allocatable :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE
 ! real,    DIMENSION(:), allocatable :: xprov
 
-!$acc data present( KSIZE, LDSOFT, LDCOMPUTE, PRHODREF, PLVFACT, PLSFACT, PPRES, PDV, PKA, PCJ,                           &
+!$acc data present( LDCOMPUTE, PRHODREF, PLVFACT, PLSFACT, PPRES, PDV, PKA, PCJ,                           &
 !$acc&              PLBDAR, PLBDAS, PT, PRVT, PRCT, PRRT, PRST, PRIAGGS, PRCRIMSS, PRCRIMSG, PRSRIMCG,                    &
 !$acc&              PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, PRCMLTSR, PRS_TEND, PA_TH,                                     &
-!$acc&              PA_RC, PA_RR, PA_RS, PA_RG )                                                                          &
-!
-!$acc&     create( IGRIM, IGACC, I1, IVEC1, IVEC2, GRIM, GACC, GMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZZW2, ZZW6, ZFREEZ_RATE ) &
-!
-!$acc&     copyin( XALPI, XALPW, XBETAI, XBETAW, XCI, XCL, XCPV, XESTT, XGAMI, XGAMW, XLMTT, XLVTT, XMD, XMV, XRV, XTT,   &
-!$acc&             LEVLIMIT,  CSNOWRIMING,                                                                                &
-!$acc&             XBS, XCEXVT, XCXS, XRTMIN,                                                                             &
-!$acc&             NACCLBDAR, NACCLBDAS, NGAMINC, X0DEPS, X1DEPS, XACCINTP1R, XACCINTP1S, XACCINTP2R, XACCINTP2S,         &
-!$acc&             XCRIMSG, XCRIMSS, XEX0DEPS, XEX1DEPS, XEXCRIMSG, XEXCRIMSS, XEXSRIMCG, XEXSRIMCG2, XFRACCSS,           &
-!$acc&             XFSACCRG, XFSCVMG, XGAMINC_RIM1, XGAMINC_RIM2, XGAMINC_RIM4, XKER_RACCS,                               &
-!$acc&             XKER_RACCSS, XKER_SACCRG, XLBRACCS1, XLBRACCS2, XLBRACCS3, XLBSACCR1, XLBSACCR2, XLBSACCR3,            &
-!$acc&             XRIMINTP1, XRIMINTP2, XSRIMCG, XSRIMCG2, XSRIMCG3 )
+!$acc&              PA_RC, PA_RR, PA_RS, PA_RG )
 !
 !-------------------------------------------------------------------------------
 !
@@ -211,13 +200,15 @@ allocate( zzw6        ( size( prhodref ) ) )
 allocate( zfreez_rate ( size( prhodref ) ) )
 
 !
+!$acc data create( I1, IVEC1, IVEC2, GRIM, GACC, GMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZZW2, ZZW6, ZFREEZ_RATE )
+
 ! !$acc kernels
 !PW: bug?: for the moment I take the value from the CPU as OK. GPU value seems to be lost when this subroutine is called
 GDSOFT = LDSOFT;GEVLIMIT = LEVLIMIT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 ! !$acc end kernels
-!$acc kernels
+! !$acc kernels
 ISIZE = KSIZE
-!$acc end kernels
+! !$acc end kernels
 !
 !*       5.0    maximum freezing rate
 !
@@ -275,7 +266,6 @@ END DO
 !$acc end kernels
 !PW: BUG: this is necessary to get correct results (PGI 18.10)
 ! !$acc update self(GRIM,IGRIM)
-!$acc update self(IGRIM)
 IF(JJ==-999) print *,'PW: IGRIM=',IGRIM,COUNT(GRIM)
 ! !$acc kernels
 !
@@ -442,7 +432,6 @@ END DO
 !$acc end kernels
 !PW: BUG: this is necessary to get correct results (PGI 18.10)
 ! !$acc update self(GACC,IGACC)
-!$acc update self(IGACC)
 IF(JJ==-999) print *,'PW: IGACC=',IGACC,COUNT(GACC)
 ! !$acc kernels
 IF(GDSOFT) THEN
@@ -668,20 +657,6 @@ PA_RG(:) = PA_RG(:) + PRSMLTG(:)
 PA_RC(:) = PA_RC(:) - PRCMLTSR(:)
 PA_RR(:) = PA_RR(:) + PRCMLTSR(:)
 !$acc end kernels
-!
-deallocate( i1          )
-deallocate( ivec1       )
-deallocate( ivec2       )
-deallocate( grim        )
-deallocate( gacc        )
-deallocate( gmask       )
-deallocate( zvec1       )
-deallocate( zvec2       )
-deallocate( zvec3       )
-deallocate( zzw         )
-deallocate( zzw2        )
-deallocate( zzw6        )
-deallocate( zfreez_rate )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
@@ -704,4 +679,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_FAST_RS
diff --git a/src/MNH/ice4_nucleation.f90 b/src/MNH/ice4_nucleation.f90
index 340f25344..0669066ff 100644
--- a/src/MNH/ice4_nucleation.f90
+++ b/src/MNH/ice4_nucleation.f90
@@ -80,26 +80,19 @@ REAL, DIMENSION(KSIZE),   INTENT(INOUT) :: PB_TH
 REAL, DIMENSION(KSIZE),   INTENT(INOUT) :: PB_RV
 REAL, DIMENSION(KSIZE),   INTENT(INOUT) :: PB_RI
 !
-!$acc declare present(KSIZE,ODSOFT,ODCOMPUTE,PTHT,PPABST,PRHODREF,PEXN,PLSFACT,PT,PRVT,PCIT,PRVHENI_MR,PB_TH,PB_RV,PB_RI)
-!
 !*       0.2  declaration of local variables
 !
-INTEGER                   :: JI
-LOGICAL                   :: GDSOFT, GFEEDBACKT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(KSIZE) :: GNEGT  ! Test where to compute the HEN process
-LOGICAL, DIMENSION(KSIZE) :: GWORK, GWORK2
-REAL, DIMENSION(KSIZE)    :: ZW ! work array
-REAL, DIMENSION(KSIZE)    :: ZZW,      & ! Work array
-                             ZUSW,     & ! Undersaturation over water
-                             ZSSI        ! Supersaturation over ice
-!
-!$acc declare create(JI,GNEGT,GWORK,GWORK2,ZW,ZZW,ZUSW,ZSSI)
-!
-!$acc data copyin( XALPI, XALPW, XBETAI, XBETAW, XGAMI, XGAMW, XMD, XMV, XTT, &
-!$acc&             LFEEDBACKT,                                                &
-!$acc&             XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20,     &
-!$acc&             XRTMIN )
-!
+INTEGER                            :: JI
+LOGICAL                            :: GDSOFT, GFEEDBACKT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
+LOGICAL, DIMENSION(:), allocatable :: GNEGT  ! Test where to compute the HEN process
+LOGICAL, DIMENSION(:), allocatable :: GWORK, GWORK2
+REAL, DIMENSION(:), allocatable    :: ZW ! work array
+REAL, DIMENSION(:), allocatable    :: ZZW,      & ! Work array
+                                      ZUSW,     & ! Undersaturation over water
+                                      ZSSI        ! Supersaturation over ice
+
+!$acc data present(ODCOMPUTE,PTHT,PPABST,PRHODREF,PEXN,PLSFACT,PT,PRVT,PCIT,PRVHENI_MR,PB_TH,PB_RV,PB_RI)
+
 !-------------------------------------------------------------------------------
 !
 IF (MPPDB_INITIALIZED) THEN
@@ -117,7 +110,17 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PB_RV,"ICE4_NUCLEATION beg:PB_RV")
   CALL MPPDB_CHECK(PB_RI,"ICE4_NUCLEATION beg:PB_RI")
 END IF
-!
+
+allocate( gnegt (ksize ) )
+allocate( gwork (ksize ) )
+allocate( gwork2(ksize ) )
+allocate( zw    (ksize ) )
+allocate( zzw   (ksize ) )
+allocate( zusw  (ksize ) )
+allocate( zssi  (ksize ) )
+
+!$acc data create(GNEGT,GWORK,GWORK2,ZW,ZZW,ZUSW,ZSSI)
+
 !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 GFEEDBACKT = LFEEDBACKT
 ! !$acc kernels
@@ -243,4 +246,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_NUCLEATION
diff --git a/src/MNH/ice4_nucleation_wrapper.f90 b/src/MNH/ice4_nucleation_wrapper.f90
index 73cbd1d93..96869e7bd 100644
--- a/src/MNH/ice4_nucleation_wrapper.f90
+++ b/src/MNH/ice4_nucleation_wrapper.f90
@@ -71,32 +71,29 @@ REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
 REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
 REAL, DIMENSION(KIT,KJT,KKT),   INTENT(OUT)   :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation
 !
-!$acc declare present(KIT,KJT,KKT,LDMASK,PTHT,PPABST,PRHODREF,PEXN,PLSFACT,PT,PRVT,PCIT,PRVHENI_MR)
 !
 !*       0.2  declaration of local variables
 !
-INTEGER                            :: IDX, JI, JJ, JK
-INTEGER                            :: JL
-INTEGER                            :: INEGT, INEGT_TMP
-INTEGER, DIMENSION(:), ALLOCATABLE :: I1,I2,I3
-LOGICAL                            :: GDSOFT
-LOGICAL, DIMENSION(:), ALLOCATABLE :: GLDCOMPUTE
-LOGICAL, DIMENSION(KIT,KJT,KKT)    :: GNEGT  ! Test where to compute the HEN process
-REAL, DIMENSION(:), ALLOCATABLE    :: ZZT,       & ! Temperature
-                                      ZPRES,      & ! Pressure
-                                      ZRVT,       & ! Water vapor m.r. at t
-                                      ZCIT,       & ! Pristine ice conc. at t
-                                      ZTHT,       & ! Theta at t
-                                      ZRHODREF,   &
-                                      ZEXN,       &
-                                      ZLSFACT,    &
-                                      ZRVHENI_MR, &
-                                      ZB_TH, ZB_RV, ZB_RI
-!
-!$acc declare create(IDX,JI,JJ,JK,JL,GDSOFT,GLDCOMPUTE,GNEGT,INEGT,INEGT_TMP,I1,I2,I3,ZZT,ZPRES,ZRVT,ZCIT,ZTHT, &
-!$acc&               ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR,ZB_TH,ZB_RV,ZB_RI)
-!
-!$acc data copyin( XTT )
+INTEGER                                :: IDX, JI, JJ, JK
+INTEGER                                :: JL
+INTEGER                                :: INEGT, INEGT_TMP
+INTEGER, DIMENSION(:),     ALLOCATABLE :: I1,I2,I3
+LOGICAL                                :: GDSOFT
+LOGICAL, DIMENSION(:),     ALLOCATABLE :: GLDCOMPUTE
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: GNEGT  ! Test where to compute the HEN process
+REAL, DIMENSION(:),        ALLOCATABLE    :: ZZT,       & ! Temperature
+                                             ZPRES,      & ! Pressure
+                                             ZRVT,       & ! Water vapor m.r. at t
+                                             ZCIT,       & ! Pristine ice conc. at t
+                                             ZTHT,       & ! Theta at t
+                                             ZRHODREF,   &
+                                             ZEXN,       &
+                                             ZLSFACT,    &
+                                             ZRVHENI_MR, &
+                                             ZB_TH, ZB_RV, ZB_RI
+!
+!$acc data present(LDMASK,PTHT,PPABST,PRHODREF,PEXN,PLSFACT,PT,PRVT,PCIT,PRVHENI_MR)
+
 !-------------------------------------------------------------------------------
 !
 IF (MPPDB_INITIALIZED) THEN
@@ -112,6 +109,10 @@ IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PCIT,"ICE4_NUCLEATION_WRAPPER beg:PCIT")
 END IF
+
+allocate( gnegt(kit, kjt, kkt ) )
+
+!$acc data create( gnegt )
 !
 !  optimization by looking for locations where
 !  the temperature is negative only !!!
@@ -120,7 +121,6 @@ END IF
 GNEGT(:,:,:)=PT(:,:,:)<XTT .AND. LDMASK
 INEGT = COUNT(GNEGT(:,:,:))
 !$acc end kernels
-!$acc update self(INEGT)
 !
 ALLOCATE(GLDCOMPUTE(INEGT))
 ALLOCATE(I1(INEGT),I2(INEGT),I3(INEGT))
@@ -136,7 +136,10 @@ ALLOCATE(ZRVHENI_MR(INEGT))
 ALLOCATE(ZB_TH(INEGT))
 ALLOCATE(ZB_RV(INEGT))
 ALLOCATE(ZB_RI(INEGT))
-!
+
+!$acc data create(GLDCOMPUTE,I1,I2,I3,ZZT,ZPRES,ZRVT,ZCIT,ZTHT, &
+!$acc&               ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR,ZB_TH,ZB_RV,ZB_RI)
+
 !$acc kernels
 ZB_TH(:) = 0.
 ZB_RV(:) = 0.
@@ -182,10 +185,6 @@ IF(INEGT>0) THEN
 !$acc end kernels
 END IF
 !
-DEALLOCATE(GLDCOMPUTE)
-DEALLOCATE(I1,I2,I3)
-DEALLOCATE(ZZT,ZPRES,ZRVT,ZCIT,ZTHT,ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR,ZB_TH,ZB_RV,ZB_RI)
-!
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PCIT,"ICE4_NUCLEATION_WRAPPER end:PCIT")
@@ -195,4 +194,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
+!$acc end data
+
 END SUBROUTINE ICE4_NUCLEATION_WRAPPER
diff --git a/src/MNH/ice4_rainfr_vert.f90 b/src/MNH/ice4_rainfr_vert.f90
index d0787c12f..37b1a209f 100644
--- a/src/MNH/ice4_rainfr_vert.f90
+++ b/src/MNH/ice4_rainfr_vert.f90
@@ -44,16 +44,17 @@ INTEGER,                      INTENT(IN)    :: KIB, KIE, KIT, KJB, KJE, KJT, KKB
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PPRFR !Precipitation fraction
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRR   !Rain field
 !
-!$acc declare present(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR)
 !
 !*       0.2  declaration of local variables
 !
 INTEGER :: JI, JJ, JK
 !
-!$acc data copyin( XRTMIN )
+! !$acc data copyin( XRTMIN )
 !
 !-------------------------------------------------------------------------------
 !
+!$acc data present(PPRFR, PRR)
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK3D(PRR,"ICE4_RAINFR_VERT beg:PRR",PRECISION)
diff --git a/src/MNH/ice4_rimltc.f90 b/src/MNH/ice4_rimltc.f90
index 026fc4afc..ae52dc2e1 100644
--- a/src/MNH/ice4_rimltc.f90
+++ b/src/MNH/ice4_rimltc.f90
@@ -72,16 +72,13 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RI
 !
-!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,PEXN,PLVFACT,PLSFACT,PT, &
-!$acc&                PTHT,PRIT,PRIMLTC_MR,PB_TH,PB_RC,PB_RI)
-!
 !*       0.2  declaration of local variables
 !
 LOGICAL :: GDSOFT, GFEEDBACKT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(KSIZE) :: GMASK
-!$acc declare create(GMASK)
-!
-!$acc data copyin( XTT, LFEEDBACKT )
+LOGICAL, DIMENSION(:), allocatable :: GMASK
+
+!$acc data present(LDCOMPUTE,PEXN,PLVFACT,PLSFACT,PT, &
+!$acc&                PTHT,PRIT,PRIMLTC_MR,PB_TH,PB_RC,PB_RI)
 !-------------------------------------------------------------------------------
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -96,6 +93,10 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PB_RC,"ICE4_RIMLTC beg:PB_RC")
   CALL MPPDB_CHECK(PB_RI,"ICE4_RIMLTC beg:PB_RI")
 END IF
+
+allocate( gmask(ksize ) )
+
+!$acc data create(GMASK)
 !
 !*       7.1    cloud ice melting
 !
@@ -135,4 +136,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_RIMLTC
diff --git a/src/MNH/ice4_rrhong.f90 b/src/MNH/ice4_rrhong.f90
index be99b28cc..067995467 100644
--- a/src/MNH/ice4_rrhong.f90
+++ b/src/MNH/ice4_rrhong.f90
@@ -73,17 +73,13 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RR
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RG
 !
-!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,PEXN,PLVFACT,PLSFACT,PT,PRRT,PTHT, &
-!$acc&                PRRHONG_MR,PB_TH,PB_RR,PB_RG)
-!
 !*       0.2  declaration of local variables
 !
 LOGICAL :: GDSOFT, GFEEDBACKT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(SIZE(PRRT)) :: GMASK
-!$acc declare create(GMASK)
-!
-!$acc data copyin( XTT, XRTMIN, LFEEDBACKT )
+LOGICAL, DIMENSION(:), allocatable :: GMASK
 !
+!$acc data present(LDCOMPUTE,PEXN,PLVFACT,PLSFACT,PT,PRRT,PTHT, &
+!$acc&                PRRHONG_MR,PB_TH,PB_RR,PB_RG)
 !-------------------------------------------------------------------------------
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -98,6 +94,10 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PB_RR,"ICE4_RRHONG beg:PB_RR")
   CALL MPPDB_CHECK(PB_RG,"ICE4_RRHONG beg:PB_RG")
 END IF
+
+allocate( gmask(size( prrt ) ) )
+
+!$acc data create(GMASK)
 !
 !*       3.3     compute the spontaneous freezing source: RRHONG
 !
@@ -136,4 +136,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_RRHONG
diff --git a/src/MNH/ice4_rsrimcg_old.f90 b/src/MNH/ice4_rsrimcg_old.f90
index ea1c477b9..cc9c628cd 100644
--- a/src/MNH/ice4_rsrimcg_old.f90
+++ b/src/MNH/ice4_rsrimcg_old.f90
@@ -76,23 +76,18 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRSRIMCG_MR ! Mr change due to cl
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RS
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RG
 !
-!$acc declare present(KSIZE,ODSOFT,ODCOMPUTE,PRHODREF,PLBDAS, &
-!$acc&                PT,PRCT,PRST,PRSRIMCG_MR,PB_RS,PB_RG)
-!
 !*       0.2  declaration of local variables
 !
 INTEGER                            :: IDX, JL
 INTEGER                            :: IGRIM
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2
+INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2
 LOGICAL                            :: GDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GRIM
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZVEC1, ZVEC2
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZZW
-!
-!$acc declare create(IGRIM, IVEC1, IVEC2, GRIM, ZVEC1, ZVEC2, ZZW)
-!
-!$acc data copyin( XTT, CSNOWRIMING, XRTMIN, NGAMINC, XEXSRIMCG, XGAMINC_RIM2, XRIMINTP1, XRIMINTP2, XSRIMCG )
+LOGICAL, DIMENSION(:), allocatable :: GRIM
+REAL, DIMENSION(:), allocatable    :: ZVEC1, ZVEC2
+REAL, DIMENSION(:), allocatable    :: ZZW
 !
+!$acc data present(ODCOMPUTE,PRHODREF,PLBDAS, &
+!$acc&                PT,PRCT,PRST,PRSRIMCG_MR,PB_RS,PB_RG)
 !-------------------------------------------------------------------------------
 !
 IF (MPPDB_INITIALIZED) THEN
@@ -107,6 +102,15 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PB_RS,"ICE4_RSRIMCG_OLD beg:PB_RS")
   CALL MPPDB_CHECK(PB_RG,"ICE4_RSRIMCG_OLD beg:PB_RG")
 END IF
+
+allocate( ivec1(size( prhodref ) ) )
+allocate( ivec2(size( prhodref ) ) )
+allocate( grim (size( prhodref ) ) )
+allocate( zvec1(size( prhodref ) ) )
+allocate( zvec2(size( prhodref ) ) )
+allocate( zzw  (size( prhodref ) ) )
+
+!$acc data create( IVEC1, IVEC2, GRIM, ZVEC1, ZVEC2, ZZW)
 !
 !-------------------------------------------------------------------------------
 !
@@ -194,4 +198,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_RSRIMCG_OLD
diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90
index be8781cd4..89b442ffc 100644
--- a/src/MNH/ice4_sedimentation_split.f90
+++ b/src/MNH/ice4_sedimentation_split.f90
@@ -130,38 +130,28 @@ REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT)   :: PFPR    ! upper-air
 !*       0.2  declaration of local variables
 !
 !
-INTEGER                                                             :: JI,JJ,JK
-INTEGER                                                             :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL                                                             :: GDEPOSC, GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL                                                             :: GPRESENT_PFPR, GPRESENT_PSEA
-REAL                                                                :: ZINVTSTEP
-REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2))                  :: ZCONC_TMP    ! Weighted concentration
-REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),KKTB:KKTE)        :: ZW ! work array
-REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D, & !  droplet condensation
-                                                                     & ZRAY,   & ! Cloud Mean radius
-                                                                     & ZLBC,   & ! XLBC weighted by sea fraction
-                                                                     & ZFSEDC, &
-                                                                     & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, &   ! Mixing ratios created during the time step
-                                                                     & ZRCT, &
-                                                                     & ZRRT, &
-                                                                     & ZRIT, &
-                                                                     & ZRST, &
-                                                                     & ZRGT, &
-                                                                     & ZRHT
+INTEGER                             :: JI,JJ,JK
+INTEGER                             :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
+LOGICAL                             :: GDEPOSC, GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
+LOGICAL                             :: GPRESENT_PFPR, GPRESENT_PSEA
+REAL                                :: ZINVTSTEP
+REAL, DIMENSION(:,:),   allocatable :: ZCONC_TMP    ! Weighted concentration
+REAL, DIMENSION(:,:,:), allocatable :: ZW ! work array
+REAL, DIMENSION(:,:,:), allocatable :: ZCONC3D, & !  droplet condensation
+                                     & ZRAY,   & ! Cloud Mean radius
+                                     & ZLBC,   & ! XLBC weighted by sea fraction
+                                     & ZFSEDC, &
+                                     & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, &   ! Mixing ratios created during the time step
+                                     & ZRCT, &
+                                     & ZRRT, &
+                                     & ZRIT, &
+                                     & ZRST, &
+                                     & ZRGT, &
+                                     & ZRHT
 !-------------------------------------------------------------------------------
 
-!$acc data present( KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, &
-!$acc&              PRHODREF, PPABST, PTHT, PRHODJ, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,                 &
-!$acc&              PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR )                     &
-!
-!$acc&      create( JI, JJ, JK, ZINVTSTEP, ZCONC_TMP, ZW,                                  &
-!$acc&              ZCONC3D, ZRAY, ZLBC, ZFSEDC, ZPRCS, ZPRRS, ZPRIS, ZPRSS, ZPRGS, ZPRHS, &
-!$acc&              ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT )                                   &
-!
-!$acc&      copyin( XRHOLW,                                                                    &
-!$acc               XSPLIT_MAXCFL,                                                             &
-!$acc               XALPHAC, XALPHAC2, XCONC_LAND, XCONC_SEA, XCONC_URBAN, XLBC, XNUC, XNUC2,  &
-!$acc               XFSEDC )
+!$acc data present( PDZZ, PRHODREF, PPABST, PTHT, PRHODJ, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,                 &
+!$acc&              PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -186,7 +176,32 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRGS,"ICE4_SEDIMENTATION_SPLIT beg:PRGS")
   IF (PRESENT(PRHS)) CALL MPPDB_CHECK(PRHS,"ICE4_SEDIMENTATION_SPLIT beg:PRHS")
 END IF
-!
+
+allocate( zconc_tmp(size( prhodref, 1 ), size( prhodref, 2 ) ) )
+
+allocate( zw(size( prhodref, 1 ), size( prhodref, 2 ), KKTB : KKTE ) )
+
+allocate( zconc3d(size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zray   (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zlbc   (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zfsedc (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zprcs  (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zprrs  (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zpris  (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zprss  (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zprgs  (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zprhs  (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zrct   (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zrrt   (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zrit   (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zrst   (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zrgt   (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+allocate( zrht   (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) )
+
+!$acc data create( zconc_tmp, zw,                                                         &
+!$acc&             zconc3d, zray, zlbc, zfsedc, zprcs, zprrs, zpris, zprss, zprgs, zprhs, &
+!$acc&             zrct, zrrt, zrit, zrst, zrgt, zrht )
+
 !$acc kernels
 !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 GDEPOSC = ODEPOSC
@@ -375,6 +390,7 @@ END IF
 
 !$acc end data
 
+!$acc end data
 !
 CONTAINS
 !
@@ -418,34 +434,25 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)              :: PPRXS ! external tenden
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN), OPTIONAL    :: PRAY, PLBC, PFSEDC, PCONC3D
 REAL, DIMENSION(KIT,KJT,KKT,KRR), INTENT(INOUT), OPTIONAL :: PFPR    ! upper-air precipitation fluxes
 !
-!$acc declare present(KIB,KIE,KIT,KJB,KJE,KJT,KKB,KKTB,KKTE,KKT,KKL,KRR,PMAXCFL,          &
-!$acc&                PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PTSTEP,  PRXT,PRXS,PINPRX,PPRXS, &
-!$acc&                PRAY,PLBC,PFSEDC,PCONC3D,PFPR)                                      &
-!$acc&         copyin(KSPE)
-!
 !*       0.2  declaration of local variables
 !
-character(len=10) :: yspe ! String for error message
-INTEGER                         :: IDX, ISEDIM
-INTEGER                         :: JI, JJ, JK, JL
-INTEGER, DIMENSION(KIT*KJT*KKT) :: I1,I2,I3 ! Used to replace the COUNT
-LOGICAL                         :: GPRESENT_PFPR
-REAL                            :: ZINVTSTEP
-REAL                            :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC
-REAL                            :: ZFSED, ZEXSED
-REAL, DIMENSION(KIT, KJT)       :: ZMRCHANGE
-REAL, DIMENSION(KIT, KJT)       :: ZMAX_TSTEP ! Maximum CFL in column
-REAL, DIMENSION(SIZE(XRTMIN))   :: ZRSMIN
-REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZREMAINT                   ! Remaining time until the timestep end
-REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) :: ZWSED ! Sedimentation fluxes
-!
-!$acc declare create(I1,I2,I3,ZINVTSTEP,   &
-!$acc               ZFSED,ZEXSED,ZMAX_TSTEP,ZRSMIN,ZREMAINT,ZWSED)
-!
-!$acc data copyin( XCPD, XP00, XRD,                                                                     &
-!$acc&             XCC, XCEXVT, XDC, XLBEXC, XRTMIN,                                                    &
-!$acc&             XEXCSEDI, XEXSEDG, XEXSEDH, XEXSEDR, XEXSEDS, XFSEDG, XFSEDH, XFSEDI, XFSEDR, XFSEDS )
-!
+character(len=10)                      :: yspe ! String for error message
+INTEGER                                :: IDX, ISEDIM
+INTEGER                                :: JI, JJ, JK, JL
+INTEGER, DIMENSION(:),     allocatable :: I1,I2,I3 ! Used to replace the COUNT
+LOGICAL                                :: GPRESENT_PFPR
+REAL                                   :: ZINVTSTEP
+REAL                                   :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC
+REAL                                   :: ZFSED, ZEXSED
+REAL,    DIMENSION(:,:),   allocatable :: ZMRCHANGE
+REAL,    DIMENSION(:,:),   allocatable :: ZMAX_TSTEP ! Maximum CFL in column
+REAL,    DIMENSION(:),     allocatable :: ZRSMIN
+REAL,    DIMENSION(:,:),   allocatable :: ZREMAINT                   ! Remaining time until the timestep end
+REAL,    DIMENSION(:,:,:), allocatable :: ZWSED ! Sedimentation fluxes
+
+!$acc data present(PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PRXT,PRXS,PINPRX,PPRXS, &
+!$acc&             PRAY,PLBC,PFSEDC,PCONC3D,PFPR)
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK(PRHODREF,"INTERNAL_SEDIM_SPLI beg:PRHODREF")
@@ -463,6 +470,22 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRXS,"INTERNAL_SEDIM_SPLI beg:PRXS")
   IF (PRESENT(PFPR))    CALL MPPDB_CHECK(PFPR,"INTERNAL_SEDIM_SPLI beg:PFPR")
 END IF
+
+allocate( i1(kit * kjt * kkt ) )
+allocate( i2(kit * kjt * kkt ) )
+allocate( i3(kit * kjt * kkt ) )
+
+allocate( zmrchange (kit, kjt ) )
+allocate( zmax_tstep(kit, kjt ) )
+
+allocate( zrsmin(size( xrtmin ) ) )
+
+allocate( zremaint(size( prhodref, 1 ), size( prhodref, 2 ) ) )
+
+allocate( zwsed(size( prhodref, 1 ), size( prhodref, 2 ), 0 : size( prhodref, 3 ) + 1 ) )
+
+!$acc data create( i1, i2, i3, zmrchange, zmax_tstep, zrsmin, zremaint, zwsed )
+
 !
 !-------------------------------------------------------------------------------
 IF (KSPE<2 .OR. KSPE>7) CALL PRINT_MSG(NVERB_FATAL,'GEN','INTERNAL_SEDIM_SPLIT','invalid species (KSPE variable)')
@@ -664,6 +687,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE INTERNAL_SEDIM_SPLI
 !
 END SUBROUTINE ICE4_SEDIMENTATION_SPLIT
diff --git a/src/MNH/ice4_slow.f90 b/src/MNH/ice4_slow.f90
index 38416765e..160cdf061 100644
--- a/src/MNH/ice4_slow.f90
+++ b/src/MNH/ice4_slow.f90
@@ -112,25 +112,17 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RI
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RS
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RG
 !
-!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,PRHODREF,PT,PSSI,PLVFACT,PLSFACT, &
-!$acc&                PRVT,PRCT,PRIT,PRST,PRGT,PLBDAS,PLBDAG,PAI,PCJ,          &
-!$acc&                PRCHONI,PRVDEPS,PRIAGGS,PRIAUTS,PRVDEPG,                 &
-!$acc&                PA_TH,PA_RV,PA_RC,PA_RI,PA_RS,PA_RG                      )
-!
 !*       0.2  declaration of local variables
 !
 LOGICAL                            :: GDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZCRIAUTI
+LOGICAL, DIMENSION(:), allocatable :: GMASK
+REAL,    DIMENSION(:), allocatable :: ZCRIAUTI
 REAL                               :: ZTIMAUTIC
 !
-!$acc declare create(ZCRIAUTI,ZTIMAUTIC,GMASK)
-!
-!$acc data copyin( XTT,                                                                                       &
-!$acc&             XCEXVT, XRTMIN,                                                                            &
-!$acc&             X0DEPG, X0DEPS, X1DEPG, X1DEPS, XACRIAUTI, XALPHA3, XBCRIAUTI, XBETA3, XCOLEXIS, XCRIAUTI, &
-!$acc&             XEX0DEPG, XEX0DEPS, XEX1DEPG, XEX1DEPS, XEXIAGGS, XFIAGGS, XHON, XTEXAUTI, XTIMAUTI        )
-!
+!$acc data present(LDCOMPUTE,PRHODREF,PT,PSSI,PLVFACT,PLSFACT, &
+!$acc&                PRVT,PRCT,PRIT,PRST,PRGT,PLBDAS,PLBDAG,PAI,PCJ,          &
+!$acc&                PRCHONI,PRVDEPS,PRIAGGS,PRIAUTS,PRVDEPG,                 &
+!$acc&                PA_TH,PA_RV,PA_RC,PA_RI,PA_RS,PA_RG                      )
 !-------------------------------------------------------------------------------
 !
 IF (MPPDB_INITIALIZED) THEN
@@ -163,7 +155,12 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PA_RS,"ICE4_SLOW beg:PA_RS")
   CALL MPPDB_CHECK(PA_RG,"ICE4_SLOW beg:PA_RG")
 END IF
-!
+
+allocate( gmask   (size( prhodref ) ) )
+allocate( zcriauti(size( prhodref ) ) )
+
+!$acc data create(ZCRIAUTI,GMASK)
+
 ! !$acc kernels
 !PW: bug?: for the moment I take the value from the CPU as OK. GPU value seems to be lost when this subroutine is called
 GDSOFT = LDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
@@ -323,4 +320,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_SLOW
diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90
index 2bb519cbb..cff3f3e85 100644
--- a/src/MNH/ice4_tendencies.f90
+++ b/src/MNH/ice4_tendencies.f90
@@ -299,9 +299,22 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_HRC
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_LRC
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT)   :: PRAINFR   ! Rain fraction
 !
-!$acc declare present(KSIZE,KIB,KIE,KIT,KJB,KJE,KJT,KKB,KKE,KKT,KKL,KRR,ODSOFT,                                        &
-!$acc&                OWARM,HSUBG_RC_RR_ACCR,HSUBG_RR_EVAP,HSUBG_AUCV_RC,HSUBG_PR_PDF)
-!$acc declare present(ODCOMPUTE,PEXN,PRHODREF,PLVFACT,PLSFACT,K1,K2,K3,PPRES,PCF,PCIT,PT,PTHT,                         &
+!*       0.2  declaration of local variables
+!
+INTEGER                            :: IDX,JI,JJ,JK,JL
+INTEGER                            :: IRR, ISIZE
+LOGICAL                            :: GDSOFT, GWARM !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
+LOGICAL, DIMENSION(:), allocatable :: LLWETG
+REAL,    DIMENSION(:), allocatable :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, &
+                                    & ZT, ZTHT, &
+                                    & ZZW, &
+                                    & ZSSI, ZKA, ZDV, ZAI, ZCJ, &
+                                    & ZRF, &
+                                    & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, &
+                                    & ZRGSI, ZRGSI_MR
+REAL, DIMENSION(:,:,:), allocatable :: ZRRT3D
+!
+!$acc data present(ODCOMPUTE,PEXN,PRHODREF,PLVFACT,PLSFACT,K1,K2,K3,PPRES,PCF,PCIT,PT,PTHT,                         &
 !$acc&                PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRHT,PRRT3D,PSIGMA_RC,PRVHENI_MR,PRRHONG_MR,PRIMLTC_MR,            &
 !$acc&                PRSRIMCG_MR,PRCHONI,PRVDEPS,PRIAGGS,PRIAUTS,PRVDEPG,PRCAUTR,PRCACCR,PRREVAV,                     &
 !$acc&                PRCRIMSS,PRCRIMSG,PRSRIMCG,PRRACCSS,PRRACCSG,PRSACCRG,PRSMLTG,PRCMLTSR,PRICFRRG,PRRCFRIG,        &
@@ -310,29 +323,7 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT)   :: PRAINFR   ! Rain fraction
 !$acc&                PRCDRYH,PRIDRYH,PRSDRYH,PRRDRYH,PRGDRYH,PRDRYHG,PRHMLTR,PRCBERI,PRS_TEND,PRG_TEND,PRH_TEND,      &
 !$acc&                PA_TH,PA_RV,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_TH,PB_RV,PB_RC,PB_RR,PB_RI,PB_RS,PB_RG,PB_RH, &
 !$acc&                PHLC_HCF,PHLC_LCF,PHLC_HRC,PHLC_LRC,PRAINFR)
-!
-!*       0.2  declaration of local variables
-!
-INTEGER                      :: IDX,JI,JJ,JK,JL
-INTEGER                      :: IRR, ISIZE
-LOGICAL                      :: GDSOFT, GWARM !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(KSIZE)    :: LLWETG
-REAL,    DIMENSION(KSIZE)    :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, &
-                              & ZT, ZTHT, &
-                              & ZZW, &
-                              & ZSSI, ZKA, ZDV, ZAI, ZCJ, &
-                              & ZRF, &
-                              & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, &
-                              & ZRGSI, ZRGSI_MR
-REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT3D
-!
-!$acc declare create(ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZZW,ZSSI,ZKA,ZDV,ZAI,ZCJ,ZRF,               &
-!$acc&               ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,ZLBDAR_RF,ZRGSI,ZRGSI_MR,ZRRT3D,IDX,JI,JJ,JK,JL,LLWETG)
-!
-!$acc data copyin( XALPI, XBETAI, XCI, XCPV, XGAMI, XLSTT, XMD, XMV, XP00, XRV, XTT,          &
-!$acc&             XSCFAC,                                                                    &
-!$acc&             XLBDAS_MAX, XLBEXG, XLBEXH, XLBEXR, XLBEXS, XLBG, XLBH, XLBR, XLBS, XRTMIN )
-!
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK(PEXN,"ICE4_TENDENCIES beg:PEXN")
@@ -377,14 +368,40 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRG_TEND,"ICE4_TENDENCIES beg:PRG_TEND")
   CALL MPPDB_CHECK(PRH_TEND,"ICE4_TENDENCIES beg:PRH_TEND")
 END IF
-!
+
+allocate( llwetg   (ksize ) )
+allocate( zrvt     (ksize ) )
+allocate( zrct     (ksize ) )
+allocate( zrrt     (ksize ) )
+allocate( zrit     (ksize ) )
+allocate( zrst     (ksize ) )
+allocate( zrgt     (ksize ) )
+allocate( zt       (ksize ) )
+allocate( ztht     (ksize ) )
+allocate( zzw      (ksize ) )
+allocate( zssi     (ksize ) )
+allocate( zka      (ksize ) )
+allocate( zdv      (ksize ) )
+allocate( zai      (ksize ) )
+allocate( zcj      (ksize ) )
+allocate( zrf      (ksize ) )
+allocate( zlbdar   (ksize ) )
+allocate( zlbdas   (ksize ) )
+allocate( zlbdag   (ksize ) )
+allocate( zlbdah   (ksize ) )
+allocate( zlbdar_rf(ksize ) )
+allocate( zrgsi    (ksize ) )
+allocate( zrgsi_mr (ksize ) )
+
+allocate( zrrt3d(kit, kjt, kkt ) )
+
+!$acc data create(LLWETG,ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZZW,ZSSI,ZKA,ZDV,ZAI,ZCJ,ZRF,               &
+!$acc&               ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,ZLBDAR_RF,ZRGSI,ZRGSI_MR,ZRRT3D)
 !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-!$acc kernels
 GDSOFT = ODSOFT
 GWARM  = OWARM
-!$acc end kernels
 !
-!$acc data copyin(GDSOFT)
+! !$acc data copyin(GDSOFT)
 !
 !$acc kernels
 IRR = KRR
@@ -709,7 +726,6 @@ CALL ICE4_FAST_RI(KSIZE, GDSOFT, ODCOMPUTE, &
                  &ZRCT, ZRIT, &
                  &PRCBERI, PA_TH, PA_RC, PA_RI)
 !
-!$acc end data
 !
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
@@ -790,4 +806,6 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE ICE4_TENDENCIES
diff --git a/src/MNH/ice4_warm.f90 b/src/MNH/ice4_warm.f90
index a7a20b82a..385b45007 100644
--- a/src/MNH/ice4_warm.f90
+++ b/src/MNH/ice4_warm.f90
@@ -121,21 +121,17 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RV
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
 !
-!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,HSUBG_RC_RR_ACCR,HSUBG_RR_EVAP,PRHODREF,PLVFACT,PT,PPRES,PTHT, &
-!$acc&                PLBDAR,PLBDAR_RF,PKA,PDV,PCJ,PHLC_LCF,PHLC_HCF,PHLC_LRC,PHLC_HRC,PCF,PRF,             &
-!$acc&                PRVT,PRCT,PRRT,PRCAUTR,PRCACCR,PRREVAV,PA_TH,PA_RV,PA_RC,PA_RR                        )
-!
 !*       0.2  declaration of local variables
 !
 LOGICAL                            :: GDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK, GMASK1, GMASK2
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZZW2, ZZW3, ZZW4
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZUSW ! Undersaturation over water
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZTHLT    ! Liquid potential temperature
-!
-!
-!$acc declare create(ZZW2,ZZW3,ZZW4,ZUSW,ZTHLT,GMASK,GMASK1,GMASK2)
-!
+LOGICAL, DIMENSION(:), allocatable :: GMASK, GMASK1, GMASK2
+REAL,    DIMENSION(:), allocatable :: ZZW2, ZZW3, ZZW4
+REAL,    DIMENSION(:), allocatable :: ZUSW ! Undersaturation over water
+REAL,    DIMENSION(:), allocatable :: ZTHLT    ! Liquid potential temperature
+
+!$acc data present(LDCOMPUTE,PRHODREF,PLVFACT,PT,PPRES,PTHT, &
+!$acc&                PLBDAR,PLBDAR_RF,PKA,PDV,PCJ,PHLC_LCF,PHLC_HCF,PHLC_LRC,PHLC_HRC,PCF,PRF,             &
+!$acc&                PRVT,PRCT,PRRT,PRCAUTR,PRCACCR,PRREVAV,PA_TH,PA_RV,PA_RC,PA_RR                        )
 !-------------------------------------------------------------------------------
 !
 IF (MPPDB_INITIALIZED) THEN
@@ -169,7 +165,18 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK1D(PA_RC,"ICE4_WARM beg:PA_RC",PRECISION)
   CALL MPPDB_CHECK1D(PA_RR,"ICE4_WARM beg:PA_RR",PRECISION)
 END IF
-!
+
+allocate( gmask (size( prhodref ) ) )
+allocate( gmask1(size( prhodref ) ) )
+allocate( gmask2(size( prhodref ) ) )
+allocate( zzw2  (size( prhodref ) ) )
+allocate( zzw3  (size( prhodref ) ) )
+allocate( zzw4  (size( prhodref ) ) )
+allocate( zusw  (size( prhodref ) ) )
+allocate( zthlt (size( prhodref ) ) )
+
+!$acc data create(GMASK,GMASK1,GMASK2,ZZW2,ZZW3,ZZW4,ZUSW,ZTHLT)
+
 ! !$acc kernels
 !PW: bug?: for the moment I take the value from the CPU as OK. GPU value seems to be lost when this subroutine is called
 GDSOFT = LDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
@@ -383,5 +390,9 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK1D(PA_RC,"ICE4_WARM end:PA_RC",PRECISION)
   CALL MPPDB_CHECK1D(PA_RR,"ICE4_WARM end:PA_RR",PRECISION)
 END IF
-!
+
+!$acc end data
+
+!$acc end data
+
 END SUBROUTINE ICE4_WARM
diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90
index b2cf71482..627390ce6 100644
--- a/src/MNH/ice_adjust.f90
+++ b/src/MNH/ice_adjust.f90
@@ -18,13 +18,13 @@ INTERFACE
                              PRR, PRI, PRIS, PRS, PRG,                         &
                              PRH, POUT_RV, POUT_RC, POUT_RI, POUT_TH           )
 !
-INTEGER,                  INTENT(IN)    :: KKA   !near ground array index  
+INTEGER,                  INTENT(IN)    :: KKA   !near ground array index
 INTEGER,                  INTENT(IN)    :: KKU   !uppest atmosphere array index
 INTEGER,                  INTENT(IN)    :: KKL   !vert. levels type 1=MNH -1=ARO
 INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
 CHARACTER(len=1),         INTENT(IN)    :: HFRAC_ICE
 CHARACTER(len=4),         INTENT(IN)    :: HBUNAME  ! Name of the budget
-LOGICAL,                  INTENT(IN)    :: OSUBG_COND ! Switch for Subgrid 
+LOGICAL,                  INTENT(IN)    :: OSUBG_COND ! Switch for Subgrid
                                                     ! Condensation
 LOGICAL                                 :: OSIGMAS  ! Switch for Sigma_s: 
                                                     ! use values computed in CONDENSATION
@@ -38,11 +38,11 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PEXNREF ! Reference Exner function
 !
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PSIGS   ! Sigma_s at time t
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PMFCONV ! convective mass flux
-REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PPABST  ! Absolute Pressure at t        
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PPABST  ! Absolute Pressure at t
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PZZ     ! height of model layer
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PEXN    ! Exner function
 !
-REAL, DIMENSION(:,:,:),     INTENT(IN)    :: PCF_MF! Convective Mass Flux Cloud fraction 
+REAL, DIMENSION(:,:,:),     INTENT(IN)    :: PCF_MF! Convective Mass Flux Cloud fraction
 REAL, DIMENSION(:,:,:),     INTENT(IN)    :: PRI_MF! Convective Mass Flux ice mixing ratio
 REAL, DIMENSION(:,:,:),     INTENT(IN)    :: PRC_MF! Convective Mass Flux liquid mixing ratio
 !
@@ -55,7 +55,7 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS    ! Theta source
 REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSRCS   ! Second-order flux
                                                    ! s'rc'/2Sigma_s2 at time t+1
                                                    ! multiplied by Lambda_3
-REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PCLDFR  ! Cloud fraction          
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PCLDFR  ! Cloud fraction
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PRIS   ! Cloud ice  m.r. at t+1
 REAL, DIMENSION(:,:,:),   INTENT(IN)    ::  PRR    ! Rain water m.r. to adjust
 REAL, DIMENSION(:,:,:),   INTENT(IN)    ::  PRI    ! Cloud ice  m.r. to adjust
@@ -194,13 +194,13 @@ IMPLICIT NONE
 !*       0.1   Declarations of dummy arguments :
 !
 !
-INTEGER,                  INTENT(IN)    :: KKA  !near ground array index  
+INTEGER,                  INTENT(IN)    :: KKA  !near ground array index
 INTEGER,                  INTENT(IN)    :: KKU  !uppest atmosphere array index
 INTEGER,                  INTENT(IN)    :: KKL  !vert. levels type 1=MNH -1=ARO
 INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
 CHARACTER(len=1),         INTENT(IN)    :: HFRAC_ICE
 CHARACTER(len=4),         INTENT(IN)    :: HBUNAME  ! Name of the budget
-LOGICAL,                  INTENT(IN)    :: OSUBG_COND ! Switch for Subgrid 
+LOGICAL,                  INTENT(IN)    :: OSUBG_COND ! Switch for Subgrid
                                                     ! Condensation
 LOGICAL                                 :: OSIGMAS  ! Switch for Sigma_s: 
                                                     ! use values computed in CONDENSATION
@@ -214,11 +214,11 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PEXNREF ! Reference Exner function
 !
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PSIGS   ! Sigma_s at time t
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PMFCONV ! convective mass flux
-REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PPABST  ! Absolute Pressure at t        
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PPABST  ! Absolute Pressure at t
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PZZ     ! height of model layer
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PEXN    ! Exner function
 !
-REAL, DIMENSION(:,:,:),     INTENT(IN)    :: PCF_MF! Convective Mass Flux Cloud fraction 
+REAL, DIMENSION(:,:,:),     INTENT(IN)    :: PCF_MF! Convective Mass Flux Cloud fraction
 REAL, DIMENSION(:,:,:),     INTENT(IN)    :: PRC_MF! Convective Mass Flux liquid mixing ratio
 REAL, DIMENSION(:,:,:),     INTENT(IN)    :: PRI_MF! Convective Mass Flux ice mixing ratio
 !
@@ -231,7 +231,7 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS    ! Theta source
 REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSRCS   ! Second-order flux
                                                    ! s'rc'/2Sigma_s2 at time t+1
                                                    ! multiplied by Lambda_3
-REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PCLDFR  ! Cloud fraction          
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PCLDFR  ! Cloud fraction
 !
 REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PRIS ! Cloud ice  m.r. at t+1
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PRR  ! Rain water m.r. to adjust
@@ -255,10 +255,10 @@ INTEGER             :: IKE        ! K index value of the last inner mass point
 INTEGER             :: JITER,ITERMAX ! iterative loop for first order adjustment
 INTEGER             :: JI,JJ,JK
 !
-LOGICAL,DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: GTEMP
+LOGICAL,DIMENSION(:,:,:), allocatable :: GTEMP
 !
-REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZSIGS,ZSRCS
-REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
+REAL, DIMENSION(:,:,:), allocatable :: ZSIGS,ZSRCS
+REAL, DIMENSION(:,:,:), allocatable &
                          :: ZT,   &  ! adjusted temperature
                    ZRV, ZRC, ZRI, &  ! adjusted state
                             ZCPH, &  ! guess of the CPh for the mixing
@@ -266,12 +266,6 @@ REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
                             ZLS,  &  ! guess of the Ls at t+1
                           ZW1,ZW2    ! Work arrays for intermediate fields
 !
-!acc declare device_resident(ZT,ZCPH,ZLV,ZLS,ZW1,ZW2,GTEMP,ZSIGS)
-!TODO PW: a repasser en resident quand condensation sera sur GPU
-!$acc declare create(ZT,ZCPH,ZLV,ZLS,ZW1,ZW2,GTEMP,ZSIGS,ZSRCS)
-
-!$acc declare create(ZRV,ZRC,ZRI)
-!
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -315,7 +309,22 @@ CALL MPPDB_CHECK3D(PRVS,"ICE_ADJUST beg:PRVS",PRECISION)
 CALL MPPDB_CHECK3D(PRCS,"ICE_ADJUST beg:PRCS",PRECISION)
 CALL MPPDB_CHECK3D(PTHS,"ICE_ADJUST beg:PTHS",PRECISION)
 CALL MPPDB_CHECK3D(PRIS,"ICE_ADJUST beg:PRIS",PRECISION)
-!
+
+allocate( gtemp(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zsigs(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zsrcs(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zt   (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zrv  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zrc  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zri  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zcph (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zlv  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zls  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zw1  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zw2  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+
+!$acc data create( gtemp, zsigs, zsrcs, zt, zrv, zrc, zri, zcph, zlv, zls, zw1, zw2 )
+
 IIU = SIZE(PEXNREF,1)
 IJU = SIZE(PEXNREF,2)
 IKU = SIZE(PEXNREF,3)
@@ -453,10 +462,10 @@ IF ( .NOT. OSUBG_COND ) THEN
   WHERE ( GTEMP(:,:,:) )
     PCLDFR(:,:,:)  = 1.
   ELSEWHERE
-    PCLDFR(:,:,:)  = 0. 
+    PCLDFR(:,:,:)  = 0.
   ENDWHERE 
   IF ( SIZE(PSRCS,3) /= 0 ) THEN
-    PSRCS(:,:,:) = PCLDFR(:,:,:) 
+    PSRCS(:,:,:) = PCLDFR(:,:,:)
   END IF
 ELSE
 #ifdef MNH_OPENACC
@@ -534,4 +543,6 @@ CALL MPPDB_CHECK3D(PCLDFR,"ICE_ADJUST end:PCLDFR",PRECISION)
 
 !$acc end data
 
-END SUBROUTINE ICE_ADJUST 
+!$acc end data
+
+END SUBROUTINE ICE_ADJUST
diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90
index 4cfaed867..e94ced87e 100644
--- a/src/MNH/mode_mnh_zwork.f90
+++ b/src/MNH/mode_mnh_zwork.f90
@@ -27,10 +27,8 @@ MODULE MODE_MNH_ZWORK
   !
   REAL, SAVE, ALLOCATABLE , DIMENSION(:,:)   :: ZPSRC_HALO2_WEST
   REAL, SAVE, ALLOCATABLE , DIMENSION(:,:)   :: ZPSRC_HALO2_SOUTH
-!acc declare create(ZPSRC_HALO2_WEST,ZPSRC_HALO2_SOUTH)
 
   REAL, SAVE, ALLOCATABLE , DIMENSION(:,:,:) :: ZUNIT3D
-!acc declare device_resident(ZUNIT3D)
 
   INTEGER, parameter                        :: JPMAX_T3D = 40
   INTEGER , ALLOCATABLE, DIMENSION (:)      :: NT3D_POOL
@@ -38,8 +36,6 @@ MODULE MODE_MNH_ZWORK
   !REAL    , ALLOCATABLE, DIMENSION(:,:,:,:) , TARGET :: ZT3D_A1,ZT3D_A2,ZT3D_A3,ZT3D_A4
   !REAL    , POINTER    , DIMENSION(:,:,:,:)          :: ZT3D
   REAL,SAVE    , ALLOCATABLE, DIMENSION(:,:,:,:)          :: ZT3D
-  ! acc declare create(ZT3D_A1,ZT3D_A2,ZT3D_A3,ZT3D_A4)
-!acc declare device_resident(ZT3D)
   TYPE TMODEL
       REAL    , POINTER, DIMENSION(:,:,:,:) :: X
   END TYPE TMODEL
diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90
index e8219824e..8c2d2609e 100644
--- a/src/MNH/mode_prandtl.f90
+++ b/src/MNH/mode_prandtl.f90
@@ -73,19 +73,24 @@ SUBROUTINE PHI3(PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PPHI3)
 #ifndef MNH_OPENACC
   REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: PPHI3
 #else
-  REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)), INTENT(OUT) :: PPHI3
+  REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHI3
 #endif
 !
-  REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: ZW1, ZW2
-  LOGICAL,DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: PHI3LOGIC
-!$acc declare create( ZW1, ZW2, PHI3LOGIC )
-  INTEGER :: IKB, IKE
+  INTEGER                               :: IKB, IKE
+  LOGICAL,DIMENSION(:,:,:), allocatable :: PHI3LOGIC
+  REAL,   DIMENSION(:,:,:), allocatable :: ZW1, ZW2
 
 !$acc data present( PREDTH1, PREDR1, PRED2TH3, PRED2R3, PRED2THR3, PPHI3 )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PREDTH1,3)-JPVEXT_TURB
-!
+
+allocate( zw1      ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
+allocate( zw2      ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
+allocate( phi3logic( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
+
+!$acc data create( zw1, zw2, phi3logic )
+
 !$acc kernels
 IF (HTURBDIM=='3DIM') THEN
         !* 3DIM case
@@ -139,6 +144,8 @@ PPHI3(:,:,IKE+1)=PPHI3(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION PHI3
 #else
@@ -160,16 +167,19 @@ SUBROUTINE PSI_SV(PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3,PPSI_SV)
 #ifndef MNH_OPENACC
   REAL, DIMENSION(SIZE(PRED2THS,1),SIZE(PRED2THS,2),SIZE(PRED2THS,3),SIZE(PRED2THS,4)) :: PPSI_SV
 #else
-  REAL, DIMENSION(SIZE(PRED2THS,1),SIZE(PRED2THS,2),SIZE(PRED2THS,3),SIZE(PRED2THS,4)), INTENT(OUT) :: PPSI_SV
+  REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PPSI_SV
 #endif
 !
-  LOGICAL, DIMENSION(SIZE(PRED2THS,1),SIZE(PRED2THS,2),SIZE(PRED2THS,3)) :: PSILOGIC
-!$acc declare create( PSILOGIC )
   INTEGER :: IKB, IKE
   INTEGER :: JSV
+  LOGICAL, DIMENSION(:,:,:), allocatable :: PSILOGIC
 
 !$acc data present( PREDTH1, PREDR1, PREDS1, PRED2THS, PRED2RS, PPHI3, PPSI3, PPSI_SV )
 
+allocate( psilogic( size( pred2ths, 1 ), size( pred2ths, 2 ), size( pred2ths, 3 ) ) )
+
+!$acc data create( psilogic )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PREDTH1,3)-JPVEXT_TURB
 !
@@ -199,6 +209,8 @@ END DO
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION PSI_SV
 #else
@@ -388,7 +400,6 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
   REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
-!$acc declare create( ZTMP1_DEVICE )
 #endif
 
 !$acc data present( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, PDTDZ, PD_PHI3DTDZ2_O_DDTDZ )
@@ -397,6 +408,8 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU
 allocate( ztmp1_device(size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
 #endif
 
+!$acc data create( ztmp1_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PREDTH1,3)-JPVEXT_TURB
 !
@@ -456,6 +469,8 @@ PD_PHI3DTDZ2_O_DDTDZ(:,:,IKE+1)=PD_PHI3DTDZ2_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_PHI3DTDZ2_O_DDTDZ
 #else
@@ -565,8 +580,7 @@ SUBROUTINE M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH)
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE
-!$acc declare create( ZTMP1_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PM3_WTH_W2TH )
@@ -574,6 +588,13 @@ SUBROUTINE M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH)
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_W2TH', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#endif
+
+!$acc data create( ztmp1_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -593,6 +614,8 @@ PM3_WTH_W2TH(:,:,IKE+1)=PM3_WTH_W2TH(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_WTH_W2TH
 #else
@@ -621,8 +644,7 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE
-!$acc declare create( ZTMP1_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PBLL_O_E, PETHETA, PKEFF, PTKE, PD_M3_WTH_W2TH_O_DDTDZ )
@@ -630,6 +652,13 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_W2TH_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#endif
+
+!$acc data create( ztmp1_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -659,6 +688,8 @@ PD_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_W2TH_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_WTH_W2TH_O_DDTDZ
 #else
@@ -688,8 +719,7 @@ SUBROUTINE M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE
-!$acc declare create( ZTMP1_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
 #endif
 
 !$acc data present( PD, PKEFF, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_WTH_W2R )
@@ -697,6 +727,13 @@ SUBROUTINE M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_W2R', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#endif
+
+!$acc data create( ztmp1_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -714,6 +751,8 @@ PM3_WTH_W2R(:,:,IKE+1)=PM3_WTH_W2R(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_WTH_W2R
 #else
@@ -742,8 +781,7 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE
-!$acc declare create( ZTMP1_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PBLL_O_E, PEMOIST, PD_M3_WTH_W2R_O_DDTDZ )
@@ -751,6 +789,13 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_W2R_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) )
+#endif
+
+!$acc data create( ztmp1_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -770,6 +815,8 @@ PD_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_W2R_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_WTH_W2R_O_DDTDZ
 #else
@@ -802,8 +849,7 @@ SUBROUTINE M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PSQRT_TKE, PBLL_O_E, PBETA, PLEPS, PEMOIST, PDTDZ, PM3_WTH_WR2 )
@@ -811,6 +857,14 @@ SUBROUTINE M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_WR2', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -841,6 +895,8 @@ PM3_WTH_WR2(:,:,IKE+1)=PM3_WTH_WR2(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_WTH_WR2
 #else
@@ -874,8 +930,7 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_T
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: 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 )
@@ -883,6 +938,14 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_T
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_WR2_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -915,6 +978,8 @@ PD_M3_WTH_WR2_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_WR2_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_WTH_WR2_O_DDTDZ
 #else
@@ -944,8 +1009,7 @@ SUBROUTINE M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PE
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDR1, PD, PKEFF, PTKE, PSQRT_TKE, PBETA, PLEPS, PEMOIST, PM3_WTH_WTHR )
@@ -953,6 +1017,14 @@ SUBROUTINE M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PE
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_WTHR', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -974,6 +1046,8 @@ PM3_WTH_WTHR(:,:,IKE+1)=PM3_WTH_WTHR(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_WTH_WTHR
 #else
@@ -1043,8 +1117,7 @@ SUBROUTINE M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PDTDZ, PLM, PLEPS, PTKE, PM3_TH2_W2TH )
@@ -1052,6 +1125,14 @@ SUBROUTINE M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_W2TH', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1074,6 +1155,8 @@ PM3_TH2_W2TH(:,:,IKE+1)=PM3_TH2_W2TH(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_W2TH
 #else
@@ -1102,8 +1185,7 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OU
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PD_M3_TH2_W2TH_O_DDTDZ )
@@ -1111,6 +1193,14 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OU
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_W2TH_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1168,6 +1258,8 @@ PD_M3_TH2_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_W2TH_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_W2TH_O_DDTDZ
 #else
@@ -1194,8 +1286,7 @@ SUBROUTINE M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PM3_TH2_WTH2 )
@@ -1203,6 +1294,14 @@ SUBROUTINE M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WTH2', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1232,6 +1331,8 @@ PM3_TH2_WTH2(:,:,IKE+1)=PM3_TH2_WTH2(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_WTH2
 #else
@@ -1260,8 +1361,7 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_TH2_WTH2_O_DDTDZ )
@@ -1269,6 +1369,14 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WTH2_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1302,6 +1410,8 @@ PD_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WTH2_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_WTH2_O_DDTDZ
 #else
@@ -1330,8 +1440,7 @@ SUBROUTINE M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_T
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PD, PLM, PLEPS, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_W2R )
@@ -1339,6 +1448,14 @@ SUBROUTINE M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_T
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_W2R', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1371,6 +1488,8 @@ PM3_TH2_W2R(:,:,IKE+1)=PM3_TH2_W2R(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_W2R
 #else
@@ -1401,8 +1520,7 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBL
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: 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 )
@@ -1410,6 +1528,14 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBL
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_W2R_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1440,6 +1566,8 @@ PD_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_W2R_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_W2R_O_DDTDZ
 #else
@@ -1467,8 +1595,7 @@ SUBROUTINE M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_WR2 )
@@ -1476,6 +1603,14 @@ SUBROUTINE M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WR2', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1508,6 +1643,8 @@ PM3_TH2_WR2(:,:,IKE+1)=PM3_TH2_WR2(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_WR2
 #else
@@ -1537,14 +1674,21 @@ SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PB
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: 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 )
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WR2_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1580,6 +1724,8 @@ PD_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WR2_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_WR2_O_DDTDZ
 #else
@@ -1608,8 +1754,7 @@ SUBROUTINE M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_WTHR )
@@ -1617,6 +1762,14 @@ SUBROUTINE M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WTHR', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1638,6 +1791,8 @@ PM3_TH2_WTHR(:,:,IKE+1)=PM3_TH2_WTHR(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_TH2_WTHR
 #else
@@ -1667,8 +1822,7 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: 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 )
@@ -1676,6 +1830,14 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WTHR_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1698,6 +1860,8 @@ PD_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WTHR_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_TH2_WTHR_O_DDTDZ
 #else
@@ -1724,8 +1888,7 @@ SUBROUTINE M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTH
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PM3_THR_WTHR )
@@ -1733,6 +1896,14 @@ SUBROUTINE M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTH
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_WTHR', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1754,6 +1925,8 @@ PM3_THR_WTHR(:,:,IKE+1)=PM3_THR_WTHR(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_THR_WTHR
 #else
@@ -1782,8 +1955,7 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_THR_WTHR_O_DDTDZ )
@@ -1791,6 +1963,14 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTHR_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1812,6 +1992,8 @@ PD_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_WTHR_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_WTHR_O_DDTDZ
 #else
@@ -1840,8 +2022,7 @@ SUBROUTINE M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PDRDZ, PM3_THR_WTH2 )
@@ -1849,6 +2030,14 @@ SUBROUTINE M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_WTH2', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1870,6 +2059,8 @@ PM3_THR_WTH2(:,:,IKE+1)=PM3_THR_WTH2(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_THR_WTH2
 #else
@@ -1899,8 +2090,7 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: 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 )
@@ -1908,6 +2098,14 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTH2_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -1942,6 +2140,8 @@ PD_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_WTH2_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_WTH2_O_DDTDZ
 #else
@@ -1970,8 +2170,7 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_THR_WTH2_O_DDRDZ )
@@ -1979,6 +2178,14 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTH2_O_DDRDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -2003,6 +2210,8 @@ PD_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=PD_M3_THR_WTH2_O_DDRDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_WTH2_O_DDRDZ
 #else
@@ -2030,8 +2239,7 @@ SUBROUTINE M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH)
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDR1, PD, PLM, PLEPS, PTKE, PDRDZ, PM3_THR_W2TH )
@@ -2039,6 +2247,14 @@ SUBROUTINE M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH)
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_W2TH', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -2060,6 +2276,8 @@ PM3_THR_W2TH(:,:,IKE+1)=PM3_THR_W2TH(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION M3_THR_W2TH
 #else
@@ -2090,8 +2308,7 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PB
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: 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 )
@@ -2099,6 +2316,14 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PB
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_W2TH_O_DDTDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -2133,6 +2358,8 @@ PD_M3_THR_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_W2TH_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_W2TH_O_DDTDZ
 #else
@@ -2160,8 +2387,7 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE )
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 #endif
 
 !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PD_M3_THR_W2TH_O_DDRDZ )
@@ -2169,6 +2395,14 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_W2TH_O_DDRDZ', 'OpenACC: not yet tested' )
 #endif
+
+#ifdef 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 ) ) )
+#endif
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PD,3)-JPVEXT_TURB
 
@@ -2201,6 +2435,8 @@ PD_M3_THR_W2TH_O_DDRDZ(:,:,IKE+1)=PD_M3_THR_W2TH_O_DDRDZ(:,:,IKE)
 
 !$acc end data
 
+!$acc end data
+
 #ifndef MNH_OPENACC
 END FUNCTION D_M3_THR_W2TH_O_DDRDZ
 #else
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 5f4426526..931e6f5fa 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -515,7 +515,6 @@ LOGICAL :: KSEDI
 LOGICAL :: KHHONI
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS,ZRVS,ZRWS
-!$acc declare create(ZRWS)
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPABST !To give pressure at t
                                                      ! (and not t+1) to resolved_cloud
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ
@@ -543,6 +542,8 @@ allocate( ZPABST(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
 allocate( ZJ    (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
 allocate( ZWETDEPAER(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER) )
 
+!$acc data create( zrws )
+
 !
 !*       0.    MICROPHYSICAL SCHEME
 !              ------------------- 
@@ -2237,5 +2238,7 @@ IF (OEXIT) THEN
   CALL IO_File_close(TLUOUT)
   IF (IMI==NMODEL) CALL IO_File_close(TLUOUT0)
 END IF
-!
+
+!$acc end data
+
 END SUBROUTINE MODEL_n
diff --git a/src/MNH/ppm_met.f90 b/src/MNH/ppm_met.f90
index 277ffc39f..f9f2d3e6c 100644
--- a/src/MNH/ppm_met.f90
+++ b/src/MNH/ppm_met.f90
@@ -133,18 +133,8 @@ REAL,                     INTENT(IN)    :: PTSTEP_PPM ! Time Step PPM
 !
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT, PTKET ! Vars at t
 REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT 
-! !PW: bug workaround with PGI (tested up to 16.10)
-! !PTKET is present but if zero-size => not detected as present
-! !!$acc declare present(PTHT,PTKET,PRT)
-! !$acc declare present(PTHT,PRT)
-! !$acc declare pcopyin(PTKET)
 !
 REAL, DIMENSION(:,:,:),   INTENT(OUT) :: PRTHS, PRTKES! Source terms
-! !PW: bug workaround with PGI (tested up to 16.10)
-! !PRTKES is present but if zero-size => not detected as present
-! !!$acc declare present(PRTHS,PRTKES)
-! !$acc declare present(PRTHS)
-! !$acc declare pcopyout(PRTKES)
 REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRRS 
 !
 !*       0.2   Declarations of local variables :
diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90
index 8f18f2415..9444b4556 100644
--- a/src/MNH/rain_ice.f90
+++ b/src/MNH/rain_ice.f90
@@ -426,68 +426,6 @@ REAL, DIMENSION(:), ALLOCATABLE   :: ZRHODREF, &      ! RHO Dry REFerence
 REAL, DIMENSION(:,:),   ALLOCATABLE :: ZZW1 ! Work arrays
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW ! work array
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZT ! Temperature
-LOGICAL :: GPRESENT_PFPR,GPRESENT_PSEA
-!
-#if 0
-!acc declare create(GMICRO,GWET,GHAIL,GDEP,                                      &
-!acc &              IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,ZW,                            &
-!acc &              ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS,ZRAINFR,                       &
-!acc &              ZWSED,ZWSEDW1,ZWSEDW2,ZCONC_TMP,ZT,ZRAY,ZLBC,ZFSEDC,         &
-!acc &              ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZRHT,ZCIT,                     &
-!acc &              ZRVS,ZRCS,ZRRS,ZRIS,ZRSS,ZRGS,ZRHS,ZTHS,                     &
-!acc &              ZRHODREF,                                                    &
-!acc &              ZRHODJ,ZZT,ZPRES,ZZW,ZZW2,ZZW3,ZZW4,ZLSFACT,ZLVFACT,         &
-!acc &              ZUSW,ZSSI,ZLBDAS,ZLBDAG,ZLBDAH,                              &
-!acc &              ZAI,ZCJ,ZKA,ZDV,ZZW1,ZRTMIN)                                 &
-!acc & device_resident(GSEDIMR,GSEDIMC,GSEDIMI,GSEDIMS,GSEDIMG,GSEDIMH,          &
-!acc &                 GNEGT,GRIM,GACC,GDRY,GWORK,                               &
-!acc &                 ZEXNREF,ZLBDAR,ZRDRYG,ZRWETG,ZSIGMA_RC,ZCF,               &
-!acc &                 I1,I2,I3                                                  )
-
-! !$acc declare copyin(XALPHA1,XCEXVT,XEXCSEDI,XEX0DEPG,XEX1DEPG,XEX0DEPS,XEX1DEPS,       &
-! !$acc &              XEX0EVAR,XEX1EVAR,                                                 &
-! !$acc &              XEXCACCR,XEXIAGGS,XEXSEDG,XEXSEDH,XEXSEDR,XEXSEDS,                 &
-! !$acc &              XFSEDC,XFSEDG,XLBC,XLBEXC,XLBEXG,XLBEXI,XLBEXR,XLBEXS,XRTMIN,      &
-! !$acc &              XKER_RACCS,XKER_RACCSS,XKER_SACCRG,XCXS,                           &
-! !$acc &              XRIMINTP1,XEXCRIMSS,XGAMINC_RIM1,XGAMINC_RIM2,XEXCRIMSG,XEXSRIMCG, &
-! !$acc &              XEXICFRR,XEXRCFRI,XKER_SDRYG,XCOLEXSG,XCXG,XKER_RDRYG,             &
-! !$acc &              XALPHAC,XALPHAC2,XNUC,XNUC2                                        )
-
-! !$acc declare create(ZHLC_HCF3D,ZHLC_LCF3D,ZHLC_HRC3D,ZHLC_LRC3D,                            &
-!$acc declare create(  ZRHODREF,                                                             &
-!$acc &              ZRVT,ZRCS,ZRCT,ZRGS,ZRGT,ZRHS,ZRHT,ZRRS,ZRRT,ZRSS,ZRST,ZRVS,            &
-!$acc &              ZCIT,ZRIS,ZRIT,ZTHS,ZTHT,ZTHLT,                                         &
-!$acc &              ZRHODJ,ZZT,ZPRES,ZZW,ZLSFACT,ZLVFACT,ZUSW,ZSSI,ZLBDAR_RF,ZLBDAG,ZLBDAH, &
-!$acc &              ZAI,ZCJ,ZKA,ZDV,ZCF,ZRF,ZHLC_HCF,ZHLC_HRC,ZHLC_LCF,ZHLC_LRC,ZZW1,       &
-!$acc &              GPRESENT_PFPR,GPRESENT_PSEA                                             )
-
-!$acc data create(GMICRO,  &
-!$acc &           ZW,      &
-!$acc &           ZT,      &
-!$acc &           I1,I2,I3 )
-#else
-#if 0
-!Disabled if PGI 19.5 to 19.10 bug (crash of the compiler)
-!$acc declare copyin(XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, &
-!$acc &                          XALPI, XBETAI, XGAMI, XMD, XMV, XTT,&
-! !$acc &                        LLES_CALL,&
-!$acc &                        JPVEXT,&
-! !$acc &                        CSUBG_PR_PDF, LDEPOSC,&
-!$acc &                        XLBEXR, XLBR, XRTMIN,&
-!$acc &                        XCRIAUTC)
-#endif
-
-!$acc declare create( I1, I2, I3, GMICRO,                                                       &
-!$acc &               ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT,                                 &
-!$acc &               ZCIT, ZRVS,  ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, ZTHT, ZTHLT,       &
-!$acc &               ZRHODREF, ZRHODJ, ZZT, ZPRES, ZEXNREF, ZZW, ZLSFACT, ZLVFACT, ZUSW, ZSSI, &
-!$acc &               ZLBDAR, ZLBDAR_RF, ZLBDAS, ZLBDAG, ZLBDAH, ZRDRYG, ZRWETG,                &
-!$acc &               ZAI, ZCJ, ZKA, ZDV, ZSIGMA_RC, ZCF, ZRF,                                  &
-!$acc &               ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, ZHLC_RCMAX, ZRCRAUTC,             &
-!$acc &               ZHLC_HRCLOCAL, ZHLC_LRCLOCAL, ZZW1, ZW, ZT,                               &
-!$acc &               GPRESENT_PFPR,GPRESENT_PSEA                                               )
-#endif
-
 !
 ! IN variables
 !
@@ -554,6 +492,8 @@ ALLOCATE( GMICRO(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
 ALLOCATE( ZW    (SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
 ALLOCATE( ZT    (SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
 
+!$acc data create( I1, I2, I3, GMICRO, ZW, ZT )
+
 !-------------------------------------------------------------------------------
 !
 !*       1.     COMPUTE THE LOOP BOUNDS
@@ -571,18 +511,6 @@ IKTE=IKT-JPVEXT
 !
 ZINVTSTEP=1./PTSTEP
 !
-IF (PRESENT(PFPR)) THEN
-  GPRESENT_PFPR = .TRUE.
-ELSE
-  GPRESENT_PFPR = .FALSE.
-END IF
-!
-IF (PRESENT(PSEA)) THEN
-  GPRESENT_PSEA = .TRUE.
-ELSE
-  GPRESENT_PSEA = .FALSE.
-END IF
-!$acc update device(GPRESENT_PFPR,GPRESENT_PSEA)
 !
 !
 !*       2.     COMPUTES THE SLOW COLD PROCESS SOURCES
@@ -697,6 +625,15 @@ IF( IMICRO >= 0 ) THEN
   ELSE
     ALLOCATE(ZRHODJ(0))
   END IF
+
+!$acc data create(    ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT,                                 &
+!$acc &               ZCIT, ZRVS,  ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, ZTHT, ZTHLT,       &
+!$acc &               ZRHODREF, ZZT, ZPRES, ZEXNREF, ZSIGMA_RC, ZCF, ZRF,                                  &
+!$acc &               ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, ZHLC_RCMAX, ZRCRAUTC,             &
+!$acc &               ZHLC_HRCLOCAL, ZHLC_LRCLOCAL, ZZW, ZLSFACT, ZLVFACT, ZUSW, ZSSI, &
+!$acc &               ZLBDAR, ZLBDAR_RF, ZLBDAS, ZLBDAG, ZLBDAH, ZRDRYG, ZRWETG,                &
+!$acc &               ZAI, ZCJ, ZKA, ZDV, ZZW1, ZRHODJ                                        )
+
 !
 !$acc kernels
 !$acc loop independent
@@ -972,9 +909,7 @@ IF( IMICRO >= 0 ) THEN
     PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL)
   END DO
 !$acc end kernels
-!$acc data copyin(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL)
   CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRT(:,:,:))
-!$acc end data
 !$acc kernels
 !$acc loop independent
   DO JL=1,IMICRO
@@ -1105,6 +1040,10 @@ IF( IMICRO >= 0 ) THEN
     END DO
   END IF
 !$acc end kernels
+
+!$acc end data
+
+
 !
 !
 !
@@ -1310,6 +1249,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE RAIN_ICE
diff --git a/src/MNH/rain_ice_fast_rg.f90 b/src/MNH/rain_ice_fast_rg.f90
index 5a11cc242..e99e3adc5 100644
--- a/src/MNH/rain_ice_fast_rg.f90
+++ b/src/MNH/rain_ice_fast_rg.f90
@@ -98,9 +98,6 @@ REAL,    DIMENSION(:),   ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for int
 REAL,    DIMENSION(:),   ALLOCATABLE :: ZVECLBDAG, ZVECLBDAR, ZVECLBDAS
 REAL,    DIMENSION(:,:), ALLOCATABLE :: ZZW1              ! Work arrays
 !
-!$acc declare device_resident(I1, IVEC1, IVEC2, GWORK, ZZW, ZVEC1, ZVEC2, ZVEC3, &
-!$acc &                       ZVECLBDAG, ZVECLBDAR, ZVECLBDAS, ZZW1)
-!
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -115,9 +112,7 @@ REAL,    DIMENSION(:,:), ALLOCATABLE :: ZZW1              ! Work arrays
 !
 ! OUT variables
 !
-!$acc &             PRDRYG, PRWETG ) &
-
-!$acc &     copyin( XKER_RDRYG, XKER_SDRYG )
+!$acc &             PRDRYG, PRWETG )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -158,6 +153,9 @@ ALLOCATE( I1   (size(PRHODREF)) )
 ALLOCATE( GWORK(size(PRHODREF)) )
 ALLOCATE( ZZW  (size(PRHODREF)) )
 ALLOCATE( ZZW1 (size(PRHODREF),7) )
+
+!$acc data create( I1, GWORK, ZZW, ZZW1 )
+
 !
 !*       6.1    rain contact freezing
 !
@@ -251,6 +249,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) )
     ALLOCATE(ZVEC3(IGDRY))
     ALLOCATE(IVEC1(IGDRY))
     ALLOCATE(IVEC2(IGDRY))
+
+!$acc data create( ZVECLBDAG, ZVECLBDAS, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2 )
 !
 !*       6.2.3  select the (PLBDAG,PLBDAS) couplet
 !
@@ -315,6 +315,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) )
 #endif
     END DO
 !$acc end kernels
+
+!$acc end data
     DEALLOCATE(ZVECLBDAS)
     DEALLOCATE(ZVECLBDAG)
     DEALLOCATE(IVEC2)
@@ -346,6 +348,7 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) )
     ALLOCATE(ZVEC3(IGDRY))
     ALLOCATE(IVEC1(IGDRY))
     ALLOCATE(IVEC2(IGDRY))
+!$acc data create( ZVECLBDAG, ZVECLBDAR, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2 )
 !
 !*       6.2.8  select the (PLBDAG,PLBDAR) couplet
 !
@@ -408,6 +411,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) )
 #endif
     END DO
 !$acc end kernels
+
+!$acc end data
     DEALLOCATE(ZVECLBDAR)
     DEALLOCATE(ZVECLBDAG)
     DEALLOCATE(IVEC2)
@@ -633,6 +638,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE RAIN_ICE_FAST_RG
 
 END MODULE MODE_RAIN_ICE_FAST_RG
diff --git a/src/MNH/rain_ice_fast_rh.f90 b/src/MNH/rain_ice_fast_rh.f90
index 4181b18f1..b8abc187d 100644
--- a/src/MNH/rain_ice_fast_rh.f90
+++ b/src/MNH/rain_ice_fast_rh.f90
@@ -93,9 +93,6 @@ REAL,    DIMENSION(:),   ALLOCATABLE :: ZVECLBDAG, ZVECLBDAH, ZVECLBDAS
 REAL,    DIMENSION(:),   ALLOCATABLE :: ZZW               ! Work array
 REAL,    DIMENSION(:,:), ALLOCATABLE :: ZZW1              ! Work arrays
 !
-!$acc declare device_resident(I1H, I1W, IVEC1, IVEC2, GWORK, ZVEC1, ZVEC2, ZVEC3, &
-!$acc &                       ZVECLBDAG, ZVECLBDAH, ZVECLBDAS, ZZW, ZZW1)
-!
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -106,14 +103,12 @@ REAL,    DIMENSION(:,:), ALLOCATABLE :: ZZW1              ! Work arrays
 !
 ! INOUT variables
 !
-!$acc &             PLBDAH, PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, PTHS, PUSW ) &
+!$acc &             PLBDAH, PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, PTHS, PUSW )
 !
 ! OUT variables
 !
 !NONE
 
-!$acc &     copyin( XKER_GWETH, XKER_SWETH )
-
 #ifdef MNH_OPENACC
 CALL PRINT_MSG(NVERB_WARNING,'GEN','RAIN_ICE_FAST_RH','OPENACC: not yet tested')
 #endif
@@ -157,7 +152,9 @@ ALLOCATE( I1W  (size(PRHODREF)) )
 ALLOCATE( GWORK(size(PRHODREF)) )
 ALLOCATE( ZZW  (size(PRHODREF)) )
 ALLOCATE( ZZW1 (size(PRHODREF),7) )
-!
+
+!$acc data create( I1H, I1W, GWORK, ZZW, ZZW1 )
+
 !$acc kernels
   GWORK(:) = PRHT(:)>XRTMIN(7)
 !$acc end kernels
@@ -213,6 +210,9 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) )
       ALLOCATE(ZVEC3(IGWET))
       ALLOCATE(IVEC1(IGWET))
       ALLOCATE(IVEC2(IGWET))
+
+!$acc data create( ZVECLBDAH, ZVECLBDAS, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2 )
+
 !
 !*       7.2.3  select the (PLBDAH,PLBDAS) couplet
 !
@@ -258,6 +258,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) )
                             XLBSWETH3/(               ZVECLBDAS(JJ)**2) ) )
       END DO
 !$acc end kernels
+
+!$acc end data
       DEALLOCATE(ZVECLBDAS)
       DEALLOCATE(ZVECLBDAH)
       DEALLOCATE(IVEC2)
@@ -289,6 +291,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) )
       ALLOCATE(ZVEC3(IGWET))
       ALLOCATE(IVEC1(IGWET))
       ALLOCATE(IVEC2(IGWET))
+
+!$acc data create( ZVECLBDAG, ZVECLBDAH, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2 )
 !
 !*       7.2.8  select the (PLBDAH,PLBDAG) couplet
 !
@@ -334,6 +338,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) )
                             XLBGWETH3/(               ZVECLBDAG(JJ)**2) ) ),0. )
       END DO
 !$acc end kernels
+
+!$acc end data
       DEALLOCATE(ZVECLBDAH)
       DEALLOCATE(ZVECLBDAG)
       DEALLOCATE(IVEC2)
@@ -503,6 +509,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE RAIN_ICE_FAST_RH
 
 END MODULE MODE_RAIN_ICE_FAST_RH
diff --git a/src/MNH/rain_ice_fast_ri.f90 b/src/MNH/rain_ice_fast_ri.f90
index 3c853be77..5ebaf71d1 100644
--- a/src/MNH/rain_ice_fast_ri.f90
+++ b/src/MNH/rain_ice_fast_ri.f90
@@ -61,8 +61,6 @@ REAL,     DIMENSION(:),     INTENT(INOUT) :: PTHS     ! Theta source
 LOGICAL, DIMENSION(:), ALLOCATABLE :: GWORK
 REAL,    DIMENSION(:), ALLOCATABLE :: ZZW  ! Work array
 !
-!$acc declare device_resident( GWORK, ZZW )
-!
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -102,6 +100,9 @@ END IF
 !
 ALLOCATE( GWORK(size(PRHODREF)) )
 ALLOCATE( ZZW  (size(PRHODREF)) )
+
+!$acc data create( GWORK, ZZW )
+
 !
 !*       7.1    cloud ice melting
 !
@@ -169,6 +170,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE RAIN_ICE_FAST_RI
 
 END MODULE MODE_RAIN_ICE_FAST_RI
diff --git a/src/MNH/rain_ice_fast_rs.f90 b/src/MNH/rain_ice_fast_rs.f90
index 1aeb5c892..1def10276 100644
--- a/src/MNH/rain_ice_fast_rs.f90
+++ b/src/MNH/rain_ice_fast_rs.f90
@@ -89,9 +89,6 @@ REAL,    DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for inter
 REAL,    DIMENSION(:), ALLOCATABLE :: ZVECLBDAR, ZVECLBDAS
 REAL,    DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays
 !
-!$acc declare device_resident(I1, IVEC1, IVEC2, GWORK, ZZW, ZVEC1, ZVEC2, ZVEC3, &
-!$acc &                       ZVECLBDAR, ZVECLBDAS, ZZW1, ZZW2, ZZW3, ZZW4)
-!
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -102,14 +99,12 @@ REAL,    DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays
 !
 ! INOUT variables
 !
-!$acc &             PRCS, PRRS, PRSS, PRGS, PTHS )                    &
+!$acc &             PRCS, PRRS, PRSS, PRGS, PTHS )
 !
 ! OUT variables
 !
 !NONE
 
-!$acc &     copyin( XKER_RACCS, XKER_RACCSS, XKER_SACCRG )
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK(OMICRO,"RAIN_ICE_FAST_RS beg:OMICRO")
@@ -141,6 +136,8 @@ END IF
 ALLOCATE( I1   (size(PRHODREF)) )
 ALLOCATE( GWORK(size(PRHODREF)) )
 ALLOCATE( ZZW  (size(PRHODREF)) )
+
+!$acc data create( I1, GWORK, ZZW )
 !
 !*       5.1    cloud droplet riming of the aggregates
 !
@@ -164,6 +161,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM )
     ALLOCATE(ZZW1(IGRIM))
     ALLOCATE(ZZW2(IGRIM))
     ALLOCATE(ZZW3(IGRIM))
+!$acc data create( ZVECLBDAS, ZVEC1, ZVEC2, IVEC2, ZZW1, ZZW2, ZZW3 )
 !
 !        5.1.1  select the PLBDAS
 !
@@ -249,6 +247,8 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM )
       END IF
     END DO
 !$acc end kernels
+
+!$acc end data
     DEALLOCATE(ZZW3)
     DEALLOCATE(ZZW2)
     DEALLOCATE(ZZW1)
@@ -299,6 +299,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM )
     ALLOCATE(ZZW2(IGACC))
     ALLOCATE(ZZW3(IGACC))
     ALLOCATE(ZZW4(IGACC))
+!$acc data create( ZVECLBDAR, ZVECLBDAS, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2, ZZW2, ZZW3, ZZW4 )
 !
 !        5.2.1  select the (PLBDAS,PLBDAR) couplet
 !
@@ -426,6 +427,8 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM )
       END IF
     END DO
 !$acc end kernels
+
+!$acc end data
     DEALLOCATE(ZZW4)
     DEALLOCATE(ZZW3)
     DEALLOCATE(ZZW2)
@@ -505,6 +508,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE RAIN_ICE_FAST_RS
 
 END MODULE MODE_RAIN_ICE_FAST_RS
diff --git a/src/MNH/rain_ice_nucleation.f90 b/src/MNH/rain_ice_nucleation.f90
index 07beccbeb..c5b38273f 100644
--- a/src/MNH/rain_ice_nucleation.f90
+++ b/src/MNH/rain_ice_nucleation.f90
@@ -70,25 +70,20 @@ REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN)    :: PRHT    ! Hail m.r. at t
 !
 !*       0.2  declaration of local variables
 !
-INTEGER                            :: INEGT
-INTEGER                            :: JL       ! and PACK intrinsics
-INTEGER, DIMENSION(SIZE(PEXNREF))  :: I1,I2,I3 ! Used to replace the COUNT
-LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
-                                   :: GNEGT    ! Test where to compute the HEN process
-REAL                               :: ZZWMAX
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRVT     ! Water vapor m.r. at t
-REAL,    DIMENSION(:), ALLOCATABLE :: ZCIT     ! Pristine ice conc. at t
-REAL,    DIMENSION(:), ALLOCATABLE :: ZZT,   & ! Temperature
-                                      ZPRES, & ! Pressure
-                                      ZZW,   & ! Work array
-                                      ZUSW,  & ! Undersaturation over water
-                                      ZSSI     ! Supersaturation over ice
-REAL,    DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3))   &
-                                    :: ZW      ! work array
+INTEGER                                :: INEGT
+INTEGER                                :: JL       ! and PACK intrinsics
+INTEGER, DIMENSION(:),     allocatable :: I1,I2,I3 ! Used to replace the COUNT
+LOGICAL, DIMENSION(:,:,:), allocatable :: GNEGT    ! Test where to compute the HEN process
+REAL                                   :: ZZWMAX
+REAL,    DIMENSION(:), ALLOCATABLE     :: ZRVT     ! Water vapor m.r. at t
+REAL,    DIMENSION(:), ALLOCATABLE     :: ZCIT     ! Pristine ice conc. at t
+REAL,    DIMENSION(:), ALLOCATABLE     :: ZZT,   & ! Temperature
+                                          ZPRES, & ! Pressure
+                                          ZZW,   & ! Work array
+                                          ZUSW,  & ! Undersaturation over water
+                                          ZSSI     ! Supersaturation over ice
+REAL,    DIMENSION(:,:,:), allocatable :: ZW      ! work array
 !
-!$acc declare device_resident(ZRVT, ZCIT, ZZT, ZPRES, ZZW, ZUSW, ZSSI, ZW)
-!$acc declare device_resident(I1, I2, I3, GNEGT)
-
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -102,9 +97,7 @@ REAL,    DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3))   &
 !
 ! OUT variables
 !
-!$acc &             PT )                                        &
-
-!$acc &     copyin( XALPHA1 )
+!$acc &             PT )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -126,6 +119,14 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRVS,"RAIN_ICE_NUCLEATION beg:PRVS")
   CALL MPPDB_CHECK(PRIS,"RAIN_ICE_NUCLEATION beg:PRIS")
 END IF
+
+allocate( i1( size( pexnref ) ) )
+allocate( i2( size( pexnref ) ) )
+allocate( i3( size( pexnref ) ) )
+allocate( gnegt( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zw   ( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+
+!$acc data create( i1, i2, i3, gnegt, zw )
 !
 !
 !  compute the temperature and the pressure
@@ -156,6 +157,8 @@ IF( INEGT >= 1 ) THEN
   ALLOCATE(ZZW(INEGT))
   ALLOCATE(ZUSW(INEGT))
   ALLOCATE(ZSSI(INEGT))
+!$acc data create( zrvt, zcit, zzt, zpres, zzw, zusw, zssi )
+
 !$acc kernels
   DO JL=1,INEGT
     ZRVT(JL)  = PRVT  (I1(JL),I2(JL),I3(JL))
@@ -237,6 +240,8 @@ IF( INEGT >= 1 ) THEN
     END DO
   END IF
 !$acc end kernels
+
+!$acc end data
   DEALLOCATE(ZSSI)
   DEALLOCATE(ZUSW)
   DEALLOCATE(ZZW)
@@ -264,6 +269,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE RAIN_ICE_NUCLEATION
 
 END MODULE MODE_RAIN_ICE_NUCLEATION
diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90
index 81e786272..ec42b1f1c 100644
--- a/src/MNH/rain_ice_red.f90
+++ b/src/MNH/rain_ice_red.f90
@@ -341,31 +341,24 @@ INTEGER :: IKE, IKTE     !
 !For packing
 INTEGER :: IDX, JI, JJ, JK
 INTEGER :: IMICRO ! Case r_x>0 locations
-INTEGER, DIMENSION(COUNT(ODMICRO)) :: I1,I2,I3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:), allocatable :: I1,I2,I3 ! Used to replace the COUNT
 INTEGER                             :: JL       ! and PACK intrinsics
 !
-!acc declare create(IIB,IIE,IIT,IJB,IJE,IJT,IKB,IKTB,IKT,IKE,IKTE,IMICRO,I1,I2,I3,JL)
-!$acc declare create(I1,I2,I3)
-!
-LOGICAL, DIMENSION(COUNT(ODMICRO)) :: GWORK
-!acc declare create(GWORK)
+LOGICAL, DIMENSION(:), allocatable :: GWORK
 !
 !Arrays for nucleation call outisde of ODMICRO points
-REAL,    DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZW ! work array
-REAL,    DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZT ! Temperature
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: &
+REAL,    DIMENSION(:,:,:), allocatable :: ZW ! work array
+REAL,    DIMENSION(:,:,:), allocatable :: ZT ! Temperature
+REAL, DIMENSION(:,:,:), allocatable :: &
                                   & ZZ_RVHENI_MR, & ! heterogeneous nucleation mixing ratio change
                                   & ZZ_RVHENI       ! heterogeneous nucleation
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZZ_LVFACT, ZZ_LSFACT, ZLSFACT3D
+REAL, DIMENSION(:,:,:), allocatable :: ZZ_LVFACT, ZZ_LSFACT, ZLSFACT3D
 !
 !Diagnostics
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant precip
-!
-!$acc declare create(ZW,ZT,ZZ_RVHENI_MR,ZZ_RVHENI,ZZ_LVFACT,ZZ_LSFACT,ZLSFACT3D, &
-!$acc &              ZINPRI)
+REAL, DIMENSION(:,:), allocatable :: ZINPRI ! Pristine ice instant precip
 !
 !Packed variables
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVT,     & ! Water vapor m.r. at t
+REAL, DIMENSION(:), allocatable :: ZRVT,     & ! Water vapor m.r. at t
                                  & ZRCT,     & ! Cloud water m.r. at t
                                  & ZRRT,     & ! Rain water m.r. at t
                                  & ZRIT,     & ! Pristine ice m.r. at t
@@ -389,11 +382,8 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVT,     & ! Water vapor m.r. at t
                                  & ZHLC_LRC    ! HLCLOUDS : LWC that is Low  LWC in grid
                                                !    note that ZRC = ZHLC_HRC + ZHLC_LRC
 !
-!$acc declare create(ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZRHT,ZCIT,ZTHT,ZRHODREF,ZZT,ZPRES,ZEXN, &
-!$acc&               ZLSFACT,ZLVFACT,ZSIGMA_RC,ZCF,ZHLC_HCF,ZHLC_LCF,ZHLC_HRC,ZHLC_LRC)
-!
 !Output packed tendencies (for budgets only)
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVHENI_MR, & ! heterogeneous nucleation mixing ratio change
+REAL, DIMENSION(:), allocatable :: ZRVHENI_MR, & ! heterogeneous nucleation mixing ratio change
                                  & ZRCHONI, & ! Homogeneous nucleation
                                  & ZRRHONG_MR, & ! Spontaneous freezing mixing ratio change
                                  & ZRVDEPS, & ! Deposition on r_s,
@@ -420,13 +410,8 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVHENI_MR, & ! heterogeneous nucleation mixi
                                  & ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, & ! Wet growth of hailstone
                                  & ZRDRYHG    ! Conversion of hailstone into graupel
 !
-!$acc declare create(ZRVHENI_MR,ZRCHONI,ZRRHONG_MR,ZRVDEPS,ZRIAGGS,ZRIAUTS,ZRVDEPG,ZRCAUTR,ZRCACCR,ZRREVAV,ZRIMLTC_MR,         &
-!$acc&               ZRCBERI,ZRHMLTR,ZRSMLTG,ZRCMLTSR,ZRRACCSS,ZRRACCSG,ZRSACCRG,ZRCRIMSS,ZRCRIMSG,ZRSRIMCG,ZRSRIMCG_MR,       &
-!$acc&               ZRICFRRG, ZRRCFRIG, ZRICFRR,ZRCWETG,ZRIWETG,ZRRWETG,ZRSWETG,ZRCDRYG,ZRIDRYG,ZRRDRYG,ZRSDRYG,ZRWETGH,      &
-!$acc&               ZRWETGH_MR,ZRGMLTR,ZRCWETH,ZRIWETH,ZRSWETH,ZRGWETH,ZRRWETH,ZRCDRYH,ZRIDRYH,ZRSDRYH,ZRRDRYH,ZRGDRYH,ZRDRYHG)
-!
 !Output packed total mixing ratio change (for budgets only)
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZTOT_RVHENI, & ! heterogeneous nucleation mixing ratio change
+REAL, DIMENSION(:), allocatable :: ZTOT_RVHENI, & ! heterogeneous nucleation mixing ratio change
                                  & ZTOT_RCHONI, & ! Homogeneous nucleation
                                  & ZTOT_RRHONG, & ! Spontaneous freezing mixing ratio change
                                  & ZTOT_RVDEPS, & ! Deposition on r_s,
@@ -452,15 +437,8 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: ZTOT_RVHENI, & ! heterogeneous nucleation mix
                                  & ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, & ! Wet growth of hailstone
                                  & ZTOT_RDRYHG    ! Conversion of hailstone into graupel
 !
-!$acc declare create(ZTOT_RVHENI,ZTOT_RCHONI,ZTOT_RRHONG,ZTOT_RVDEPS,ZTOT_RIAGGS,ZTOT_RIAUTS,ZTOT_RVDEPG,ZTOT_RCAUTR,    &
-!$acc&               ZTOT_RCACCR,ZTOT_RREVAV,ZTOT_RCRIMSS,ZTOT_RCRIMSG,ZTOT_RSRIMCG,ZTOT_RIMLTC,ZTOT_RCBERI,ZTOT_RHMLTR, &
-!$acc&               ZTOT_RSMLTG,ZTOT_RCMLTSR,ZTOT_RRACCSS, ZTOT_RRACCSG, ZTOT_RSACCRG,ZTOT_RICFRRG, ZTOT_RRCFRIG,       &
-!$acc&               ZTOT_RICFRR,ZTOT_RCWETG,ZTOT_RIWETG,ZTOT_RRWETG,ZTOT_RSWETG,ZTOT_RCDRYG,ZTOT_RIDRYG,ZTOT_RRDRYG,    &
-!$acc&               ZTOT_RSDRYG,ZTOT_RWETGH,ZTOT_RGMLTR,ZTOT_RCWETH,ZTOT_RIWETH,ZTOT_RSWETH,ZTOT_RGWETH,ZTOT_RRWETH,    &
-!$acc&               ZTOT_RCDRYH,ZTOT_RIDRYH,ZTOT_RSDRYH,ZTOT_RRDRYH,ZTOT_RGDRYH,ZTOT_RDRYHG)
-!
 !For time- or mixing-ratio- splitting
-REAL, DIMENSION(COUNT(ODMICRO)) :: Z0RVT,     &   ! Water vapor m.r. at the beginig of the current loop
+REAL, DIMENSION(:), allocatable :: Z0RVT,     &   ! Water vapor m.r. at the beginig of the current loop
                                  & Z0RCT,     &   ! Cloud water m.r. at the beginig of the current loop
                                  & Z0RRT,     &   ! Rain water m.r. at the beginig of the current loop
                                  & Z0RIT,     &   ! Pristine ice m.r. at the beginig of the current loop
@@ -470,12 +448,8 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: Z0RVT,     &   ! Water vapor m.r. at the begi
                                  & ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, &
                                  & ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH
 !
-!$acc declare create(Z0RVT,Z0RCT,Z0RRT,Z0RIT,Z0RST,Z0RGT,Z0RHT,       &
-!$acc&               ZA_TH,ZA_RV,ZA_RC,ZA_RR,ZA_RI,ZA_RS,ZA_RG,ZA_RH, &
-!$acc&               ZB_TH,ZB_RV,ZB_RC,ZB_RR,ZB_RI,ZB_RS,ZB_RG,ZB_RH  )
-!
 !To take into acount external tendencies inside the splitting
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZEXT_RV,   &   ! External tendencie for rv
+REAL, DIMENSION(:), allocatable :: ZEXT_RV,   &   ! External tendencie for rv
                                    ZEXT_RC,   &   ! External tendencie for rc
                                    ZEXT_RR,   &   ! External tendencie for rr
                                    ZEXT_RI,   &   ! External tendencie for ri
@@ -485,49 +459,33 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: ZEXT_RV,   &   ! External tendencie for rv
                                    ZEXT_TH        ! External tendencie for th
 LOGICAL :: GEXT_TEND
 !
-!acc declare create(GEXT_TEND)
-!$acc declare create(ZEXT_RV,ZEXT_RC,ZEXT_RR,ZEXT_RI,ZEXT_RS,ZEXT_RG,ZEXT_RH,ZEXT_TH)
-!
-INTEGER, DIMENSION(COUNT(ODMICRO)) :: IITER ! Number of iterations done (with real tendencies computation)
+INTEGER, DIMENSION(:), allocatable :: IITER ! Number of iterations done (with real tendencies computation)
 INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation)
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZTIME,    & ! Current integration time (starts with 0 and ends with PTSTEP)
+REAL, DIMENSION(:), allocatable :: ZTIME,    & ! Current integration time (starts with 0 and ends with PTSTEP)
                                  & ZMAXTIME, & ! Time on which we can apply the current tendencies
                                  & ZTIME_THRESHOLD, & ! Time to reach threshold
                                  & ZTIME_LASTCALL     ! Integration time when last tendecies call has been done
-LOGICAL, DIMENSION(COUNT(ODMICRO)) :: LLCOMPUTE ! Points where we must compute tendenceis
+LOGICAL, DIMENSION(:), allocatable :: LLCOMPUTE ! Points where we must compute tendenceis
 INTEGER :: IKA, IKU, IKL, IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 LOGICAL :: GFEEDBACKT, GBU_ENABLE, GBUDGET_RC, GBUDGET_RR, GBUDGET_RI, GBUDGET_RS, GBUDGET_RG, &
            GBUDGET_RH, GBUDGET_RV, GBUDGET_TH, GWARM !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 LOGICAL :: GSOFT ! Must we really compute tendencies or only adjust them to new T variables
-LOGICAL, DIMENSION(SIZE(ODMICRO,1),SIZE(ODMICRO,2),SIZE(ODMICRO,3)) :: GDNOTMICRO ! = .NOT.ODMICRO
+LOGICAL, DIMENSION(:,:,:), allocatable :: GDNOTMICRO ! = .NOT.ODMICRO
 REAL :: ZTSTEP ! length of sub-timestep in case of time splitting
 REAL :: ZINV_TSTEP ! Inverse ov PTSTEP
-REAL, DIMENSION(COUNT(ODMICRO), 6) :: ZRS_TEND
-REAL, DIMENSION(COUNT(ODMICRO), 6) :: ZRG_TEND
-REAL, DIMENSION(COUNT(ODMICRO), 8) :: ZRH_TEND
+REAL, DIMENSION(:,:), allocatable :: ZRS_TEND
+REAL, DIMENSION(:,:), allocatable :: ZRG_TEND
+REAL, DIMENSION(:,:), allocatable :: ZRH_TEND
 !
 !For total tendencies computation
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: &
+REAL, DIMENSION(:,:,:), allocatable :: &
         &ZW_RVS, ZW_RCS, ZW_RRS, ZW_RIS, ZW_RSS, ZW_RGS, ZW_RHS, ZW_THS
 !
-! !$acc declare create(GSOFT)
-!acc declare create(IITER,INB_ITER_MAX,ZTIME,ZMAXTIME,ZTIME_THRESHOLD,ZTIME_LASTCALL,LLCOMPUTE,GDNOTMICRO,ZTSTEP, &
-!$acc declare create(IITER,ZTIME,ZMAXTIME,ZTIME_THRESHOLD,ZTIME_LASTCALL,LLCOMPUTE,GDNOTMICRO,ZTSTEP, &
-!$acc &              ZINV_TSTEP,ZRS_TEND,ZRG_TEND,ZRH_TEND,ZW_RVS,ZW_RCS,ZW_RRS,ZW_RIS,ZW_RSS,ZW_RGS,ZW_RHS,ZW_THS)
-!
-!acc declare copyin(JPVEXT,XUNDEF) !These are parameters
 
-!$acc data present( OSEDIC, HSEDIM, HSUBG_AUCV_RC, OWARM, KKA, KKU, KKL, PTSTEP, KRR,                 &
-!$acc &             ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, PTHT, PRVT, &
+!$acc data present( ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, PTHT, PRVT, &
 !$acc &             PRCT, PRRT, PRIT, PRST, PRGT, PSIGS, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,    &
 !$acc &             PINPRC, PINDEP, PINPRR, PEVAP3D, PINPRS, PINPRG, PRAINFR,                         &
-!$acc &             PSEA, PTOWN, PRHT, PRHS, PINPRH, PFPR )                                           &
-
-!$acc &     copyin( XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT,                                                                   &
-!$acc &             XRTMIN,                                                                                                    &
-!$acc &             CSUBG_PR_PDF, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, LDEPOSC, LFEEDBACKT, LSEDIM_AFTER,                          &
-!$acc &             NMAXITER, XMRSTEP, XTSTEP_TS, XVDEPOSC,                                                                    &
-!$acc &             LBU_ENABLE, LBUDGET_RC, LBUDGET_RR, LBUDGET_RI, LBUDGET_RS, LBUDGET_RG, LBUDGET_RH, LBUDGET_RV, LBUDGET_TH )
+!$acc &             PSEA, PTOWN, PRHT, PRHS, PINPRH, PFPR )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -562,9 +520,224 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PINDEP,"RAIN_ICE_RED beg:PINDEP")
   IF (PRESENT(PRHS)) CALL MPPDB_CHECK(PRHS,"RAIN_ICE_RED beg:PRHS")
 END IF
-!
-!-------------------------------------------------------------------------------
-!
+
+!$acc kernels
+imicro = count(odmicro)
+!$acc end kernels
+
+allocate( i1(imicro ) )
+allocate( i2(imicro ) )
+allocate( i3(imicro ) )
+
+allocate( gwork(imicro ) )
+
+allocate( zw(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+allocate( zt(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
+
+allocate( zz_rvheni_mr(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zz_rvheni   (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zz_lvfact   (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zz_lsfact   (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zlsfact3d   (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+
+allocate( zinpri(size( ptht, 1 ), size( ptht, 2 ) ) )
+
+allocate( zrvt     (imicro ) )
+allocate( zrct     (imicro ) )
+allocate( zrrt     (imicro ) )
+allocate( zrit     (imicro ) )
+allocate( zrst     (imicro ) )
+allocate( zrgt     (imicro ) )
+allocate( zrht     (imicro ) )
+allocate( zcit     (imicro ) )
+allocate( ztht     (imicro ) )
+allocate( zrhodref (imicro ) )
+allocate( zzt      (imicro ) )
+allocate( zpres    (imicro ) )
+allocate( zexn     (imicro ) )
+allocate( zlsfact  (imicro ) )
+allocate( zlvfact  (imicro ) )
+allocate( zsigma_rc(imicro ) )
+allocate( zcf      (imicro ) )
+allocate( zhlc_hcf (imicro ) )
+allocate( zhlc_lcf (imicro ) )
+allocate( zhlc_hrc (imicro ) )
+allocate( zhlc_lrc (imicro ) )
+
+allocate( zrvheni_mr (imicro ) )
+allocate( zrchoni    (imicro ) )
+allocate( zrrhong_mr (imicro ) )
+allocate( zrvdeps    (imicro ) )
+allocate( zriaggs    (imicro ) )
+allocate( zriauts    (imicro ) )
+allocate( zrvdepg    (imicro ) )
+allocate( zrcautr    (imicro ) )
+allocate( zrcaccr    (imicro ) )
+allocate( zrrevav    (imicro ) )
+allocate( zrimltc_mr (imicro ) )
+allocate( zrcberi    (imicro ) )
+allocate( zrhmltr    (imicro ) )
+allocate( zrsmltg    (imicro ) )
+allocate( zrcmltsr   (imicro ) )
+allocate( zrraccss   (imicro ) )
+allocate( zrraccsg   (imicro ) )
+allocate( zrsaccrg   (imicro ) )
+allocate( zrcrimss   (imicro ) )
+allocate( zrcrimsg   (imicro ) )
+allocate( zrsrimcg   (imicro ) )
+allocate( zrsrimcg_mr(imicro ) )
+allocate( zricfrrg   (imicro ) )
+allocate( zrrcfrig   (imicro ) )
+allocate( zricfrr    (imicro ) )
+allocate( zrcwetg    (imicro ) )
+allocate( zriwetg    (imicro ) )
+allocate( zrrwetg    (imicro ) )
+allocate( zrswetg    (imicro ) )
+allocate( zrcdryg    (imicro ) )
+allocate( zridryg    (imicro ) )
+allocate( zrrdryg    (imicro ) )
+allocate( zrsdryg    (imicro ) )
+allocate( zrwetgh    (imicro ) )
+allocate( zrwetgh_mr (imicro ) )
+allocate( zrgmltr    (imicro ) )
+allocate( zrcweth    (imicro ) )
+allocate( zriweth    (imicro ) )
+allocate( zrsweth    (imicro ) )
+allocate( zrgweth    (imicro ) )
+allocate( zrrweth    (imicro ) )
+allocate( zrcdryh    (imicro ) )
+allocate( zridryh    (imicro ) )
+allocate( zrsdryh    (imicro ) )
+allocate( zrrdryh    (imicro ) )
+allocate( zrgdryh    (imicro ) )
+allocate( zrdryhg    (imicro ) )
+
+allocate( ztot_rvheni (imicro ) )
+allocate( ztot_rchoni (imicro ) )
+allocate( ztot_rrhong (imicro ) )
+allocate( ztot_rvdeps (imicro ) )
+allocate( ztot_riaggs (imicro ) )
+allocate( ztot_riauts (imicro ) )
+allocate( ztot_rvdepg (imicro ) )
+allocate( ztot_rcautr (imicro ) )
+allocate( ztot_rcaccr (imicro ) )
+allocate( ztot_rrevav (imicro ) )
+allocate( ztot_rcrimss(imicro ) )
+allocate( ztot_rcrimsg(imicro ) )
+allocate( ztot_rsrimcg(imicro ) )
+allocate( ztot_rimltc (imicro ) )
+allocate( ztot_rcberi (imicro ) )
+allocate( ztot_rhmltr (imicro ) )
+allocate( ztot_rsmltg (imicro ) )
+allocate( ztot_rcmltsr(imicro ) )
+allocate( ztot_rraccss(imicro ) )
+allocate( ztot_rraccsg(imicro ) )
+allocate( ztot_rsaccrg(imicro ) )
+allocate( ztot_ricfrrg(imicro ) )
+allocate( ztot_rrcfrig(imicro ) )
+allocate( ztot_ricfrr (imicro ) )
+allocate( ztot_rcwetg (imicro ) )
+allocate( ztot_riwetg (imicro ) )
+allocate( ztot_rrwetg (imicro ) )
+allocate( ztot_rswetg (imicro ) )
+allocate( ztot_rcdryg (imicro ) )
+allocate( ztot_ridryg (imicro ) )
+allocate( ztot_rrdryg (imicro ) )
+allocate( ztot_rsdryg (imicro ) )
+allocate( ztot_rwetgh (imicro ) )
+allocate( ztot_rgmltr (imicro ) )
+allocate( ztot_rcweth (imicro ) )
+allocate( ztot_riweth (imicro ) )
+allocate( ztot_rsweth (imicro ) )
+allocate( ztot_rgweth (imicro ) )
+allocate( ztot_rrweth (imicro ) )
+allocate( ztot_rcdryh (imicro ) )
+allocate( ztot_rdryhg (imicro ) )
+allocate( ztot_ridryh (imicro ) )
+allocate( ztot_rsdryh (imicro ) )
+allocate( ztot_rrdryh (imicro ) )
+allocate( ztot_rgdryh (imicro ) )
+
+allocate( z0rvt(imicro ) )
+allocate( z0rct(imicro ) )
+allocate( z0rrt(imicro ) )
+allocate( z0rit(imicro ) )
+allocate( z0rst(imicro ) )
+allocate( z0rgt(imicro ) )
+allocate( z0rht(imicro ) )
+allocate( za_th(imicro ) )
+allocate( za_rv(imicro ) )
+allocate( za_rc(imicro ) )
+allocate( za_rr(imicro ) )
+allocate( za_ri(imicro ) )
+allocate( za_rs(imicro ) )
+allocate( za_rg(imicro ) )
+allocate( za_rh(imicro ) )
+allocate( zb_th(imicro ) )
+allocate( zb_rv(imicro ) )
+allocate( zb_rc(imicro ) )
+allocate( zb_rr(imicro ) )
+allocate( zb_ri(imicro ) )
+allocate( zb_rs(imicro ) )
+allocate( zb_rg(imicro ) )
+allocate( zb_rh(imicro ) )
+
+allocate( zext_rv(imicro ) )
+allocate( zext_rc(imicro ) )
+allocate( zext_rr(imicro ) )
+allocate( zext_ri(imicro ) )
+allocate( zext_rs(imicro ) )
+allocate( zext_rg(imicro ) )
+allocate( zext_rh(imicro ) )
+allocate( zext_th(imicro ) )
+
+allocate( iiter(imicro ) )
+
+allocate( ztime(imicro ) )
+allocate( zmaxtime(imicro ) )
+allocate( ztime_threshold(imicro ) )
+allocate( ztime_lastcall(imicro ) )
+
+allocate( llcompute(imicro ) )
+
+allocate( gdnotmicro(size( odmicro, 1 ), size( odmicro, 2 ), size( odmicro, 3 ) ) )
+
+allocate( zrs_tend(imicro, 6 ) )
+allocate( zrg_tend(imicro, 6 ) )
+allocate( zrh_tend(imicro, 8 ) )
+
+allocate( zw_rvs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zw_rcs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zw_rrs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zw_ris(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zw_rss(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zw_rgs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zw_rhs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zw_ths(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+
+!$acc data create( I1, I2, I3,                                                                                                 &
+!$acc &            gwork, ZW, ZT, ZZ_RVHENI_MR, ZZ_RVHENI, ZZ_LVFACT, ZZ_LSFACT, ZLSFACT3D, ZINPRI,                            &
+!$acc &            ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, ZCIT, ZTHT, ZRHODREF, ZZT, ZPRES, ZEXN,                           &
+!$acc &            ZLSFACT, ZLVFACT, ZSIGMA_RC, ZCF, ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC,                                   &
+!$acc &            ZRVHENI_MR, ZRCHONI, ZRRHONG_MR, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, ZRCAUTR, ZRCACCR, ZRREVAV, ZRIMLTC_MR, &
+!$acc &            ZRCBERI, ZRHMLTR, ZRSMLTG, ZRCMLTSR, ZRRACCSS, ZRRACCSG, ZRSACCRG,                                          &
+!$acc &            ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRSRIMCG_MR,                                                                  &
+!$acc &            ZRICFRRG,  ZRRCFRIG,  ZRICFRR, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG,      &
+!$acc &            ZRWETGH, ZRWETGH_MR, ZRGMLTR, ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH,                                  &
+!$acc &            ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG,                                                       &
+!$acc &            ZTOT_RVHENI, ZTOT_RCHONI, ZTOT_RRHONG, ZTOT_RVDEPS, ZTOT_RIAGGS, ZTOT_RIAUTS, ZTOT_RVDEPG, ZTOT_RCAUTR,     &
+!$acc &            ZTOT_RCACCR, ZTOT_RREVAV, ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, ZTOT_RIMLTC, ZTOT_RCBERI, ZTOT_RHMLTR,  &
+!$acc &            ZTOT_RSMLTG, ZTOT_RCMLTSR, ZTOT_RRACCSS,  ZTOT_RRACCSG,  ZTOT_RSACCRG, ZTOT_RICFRRG,  ZTOT_RRCFRIG,         &
+!$acc &            ZTOT_RICFRR, ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG,     &
+!$acc &            ZTOT_RSDRYG, ZTOT_RWETGH, ZTOT_RGMLTR, ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH,     &
+!$acc &            ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, ZTOT_RDRYHG,                               &
+!$acc &            Z0RVT, Z0RCT, Z0RRT, Z0RIT, Z0RST, Z0RGT, Z0RHT,                                                            &
+!$acc &            ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH,                                                     &
+!$acc &            ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH,                                                     &
+!$acc &            ZEXT_RV, ZEXT_RC, ZEXT_RR, ZEXT_RI, ZEXT_RS, ZEXT_RG, ZEXT_RH, ZEXT_TH,                                     &
+!$acc &            IITER, ZTIME, ZMAXTIME, ZTIME_THRESHOLD, ZTIME_LASTCALL, LLCOMPUTE, GDNOTMICRO,                             &
+!$acc &            ZRS_TEND, ZRG_TEND, ZRH_TEND, ZW_RVS, ZW_RCS, ZW_RRS, ZW_RIS, ZW_RSS, ZW_RGS, ZW_RHS, ZW_THS                )
+
 !-------------------------------------------------------------------------------
 !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 GFEEDBACKT = LFEEDBACKT
@@ -2009,6 +2182,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 CONTAINS
   !
   SUBROUTINE CORRECT_NEGATIVITIES(KRR, PRV, PRC, PRR, &
diff --git a/src/MNH/rain_ice_sedimentation_split.f90 b/src/MNH/rain_ice_sedimentation_split.f90
index f9d4125cd..f926782c1 100644
--- a/src/MNH/rain_ice_sedimentation_split.f90
+++ b/src/MNH/rain_ice_sedimentation_split.f90
@@ -131,16 +131,6 @@ REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS   ! Mixi
 REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZW          ! Work array
 REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZWSED       ! sedimentation fluxes
 !
-!$acc declare device_resident(IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3, &
-!$acc &                       GDEP, GSEDIMR, GSEDIMC,  GSEDIMI,  GSEDIMS,  GSEDIMG,  GSEDIMH,                           &
-!PW:BUG: do not uncomment to get correct results  !$acc & ZTMP1, ZTMP2,                                             &
-!PW:BUG: do not uncomment to get correct results  !$acc & ZRHODREFLOC, ZRSLOC, ZRTLOC,                              &
-!PW:BUG: do not uncomment to get correct results  !$acc & ZCC, ZFSEDC1D, ZWLBDC, ZCONC, ZRAY1D, ZWLBDA, ZZT, ZPRES, &
-!$acc &                       ZRTMIN, ZCONC_TMP, ZCONC3D,                                                               &
-!$acc &                       ZOMPSEA, ZTMP1_2D, ZTMP2_2D, ZTMP3_2D, ZTMP4_2D,                                          &
-!$acc &                       ZRAY, ZLBC, ZFSEDC,                                                                       &
-!$acc &                       ZPRCS, ZPRRS, ZPRSS, ZPRGS, ZPRHS, ZW, ZWSED)
-!
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -154,9 +144,9 @@ REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZWSED       ! sedimentation fluxes
 !
 ! OUT variables
 !
-!$acc &             PINPRR, PINPRS, PINPRG, PINPRR3D, PINPRH, PFPR )                    &
+!$acc &             PINPRR, PINPRS, PINPRG, PINPRR3D, PINPRH, PFPR )
 
-!$acc &     copyin( XFSEDC, XLBC, XLBEXC, XRTMIN )
+! !$acc &     copyin( XFSEDC, XLBC, XLBEXC, XRTMIN )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -215,7 +205,14 @@ ALLOCATE( ZPRGS  (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
 ALLOCATE( ZPRHS  (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
 ALLOCATE( ZW     (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
 ALLOCATE( ZWSED  (SIZE(PRCS,1),SIZE(PRCS,2),0:SIZE(PRCS,3)+1) )
-!
+
+!$acc data create( IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3, &
+!$acc &            GDEP, GSEDIMR, GSEDIMC,  GSEDIMI,  GSEDIMS,  GSEDIMG,  GSEDIMH,                           &
+!$acc &            ZRTMIN, ZCONC_TMP,                                                                        &
+!$acc &            ZOMPSEA, ZTMP1_2D, ZTMP2_2D, ZTMP3_2D, ZTMP4_2D, ZCONC3D,                                 &
+!$acc &            ZRAY, ZLBC, ZFSEDC,                                                                       &
+!$acc &            ZPRCS, ZPRRS, ZPRSS, ZPRGS, ZPRHS, ZW, ZWSED                                              )
+
 IF ( PRESENT( PFPR ) ) THEN
   GPRESENT_PFPR = .TRUE.
 ELSE
@@ -689,6 +686,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT
 
 END MODULE MODE_RAIN_ICE_SEDIMENTATION_SPLIT
diff --git a/src/MNH/rain_ice_slow.f90 b/src/MNH/rain_ice_slow.f90
index c3869a900..7b325a112 100644
--- a/src/MNH/rain_ice_slow.f90
+++ b/src/MNH/rain_ice_slow.f90
@@ -80,8 +80,6 @@ LOGICAL, DIMENSION(:), ALLOCATABLE :: GWORK
 REAL,    DIMENSION(:), ALLOCATABLE :: ZCRIAUTI ! Snow-to-ice autoconversion thres.
 REAL,    DIMENSION(:), ALLOCATABLE :: ZZW      ! Work array
 !
-!$acc declare device_resident(GWORK, ZZW, ZCRIAUTI)
-!
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -128,6 +126,7 @@ END IF
 ALLOCATE( GWORK   (size(PRHODREF)) )
 ALLOCATE( ZZW     (size(PRHODREF)) )
 ALLOCATE( ZCRIAUTI(size(PRHODREF)) )
+!$acc data create( gwork, zzw, zcriauti )
 !
 !*       3.2     compute the homogeneous nucleation source: RCHONI
 !
@@ -391,6 +390,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE RAIN_ICE_SLOW
 
 END MODULE MODE_RAIN_ICE_SLOW
diff --git a/src/MNH/rain_ice_warm.f90 b/src/MNH/rain_ice_warm.f90
index e8e890b01..6c5a6ad90 100644
--- a/src/MNH/rain_ice_warm.f90
+++ b/src/MNH/rain_ice_warm.f90
@@ -90,8 +90,6 @@ REAL,    DIMENSION(:), ALLOCATABLE :: ZZW2 ! Work array
 REAL,    DIMENSION(:), ALLOCATABLE :: ZZW3 ! Work array
 REAL,    DIMENSION(:), ALLOCATABLE :: ZZW4 ! Work array
 !
-!$acc declare device_resident(GWORK, ZZW, ZZW2, ZZW3, ZZW4)
-!
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -151,6 +149,8 @@ ALLOCATE( ZZW  (size(PRHODREF)) )
 ALLOCATE( ZZW2 (size(PRHODREF)) )
 ALLOCATE( ZZW3 (size(PRHODREF)) )
 ALLOCATE( ZZW4 (size(PRHODREF)) )
+
+!$acc data create( gwork, zzw, zzw2, zzw3, zzw4 )
 !
 !*       4.2    compute the autoconversion of r_c for r_r production: RCAUTR
 !
@@ -389,6 +389,8 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PEVAP3D,"RAIN_ICE_WARM end:PEVAP3D")
 END IF
 
+!$acc end data
+
 !$acc end data
 
   END SUBROUTINE RAIN_ICE_WARM
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 5a9111c4f..61ff8a22c 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -440,9 +440,6 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRAINFR  ! Rain fraction
 REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA  ! Land Sea mask
 REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction
 !
-! Variables from modules
-! !$acc declare copyin(CSEDIM)
-!
 !*       0.2   Declarations of local variables :
 !
 INTEGER :: JRR,JSV       ! Loop index for the moist and scalar variables
@@ -457,9 +454,6 @@ INTEGER :: IKL
 INTEGER :: IINFO_ll      ! return code of parallel routine
 INTEGER :: JI,JJ,JK,JL
 !
-!$acc declare create(IKA,IKU,IKL)
-!
-!
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDZZ
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZT,ZEXN,ZLV,ZLS,ZCPH
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCOR
@@ -487,15 +481,11 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZINPRI
 REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHSSTEP
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRSSTEP
 !
-!$acc declare create(ZDZZ,ZEXN,ZLV,ZLS,ZCPH,ZZZ,ZSVT,ZSVS) create(ZT) create(ZCOR,ZRSMIN) &
-!$acc &       create(ZTHSSTEP,ZRSSTEP,LLMICRO)
-!
 !------------------------------------------------------------------------------
 !
 ! IN variables
 !
-!$acc data present( KRR, OSEDIC, HSUBG_AUCV, PTSTEP, OWARM,                           &
-!$acc &             PRHODJ, PZZ, PRHODREF, PEXNREF, PPABST, PTHT, PSIGS, PSIGQSAT,    &
+!$acc data present( PRHODJ, PZZ, PRHODREF, PEXNREF, PPABST, PTHT, PSIGS, PSIGQSAT,    &
 !$acc &             PMFCONV, PTHM, PPABSM, PRCM, PW_ACT, PDTHRAD,                     &
 !$acc &             PCF_MF, PRC_MF, PRI_MF,                                           &
 !$acc &             PSOLORG, PMI, PSEA, PTOWN,                                        &
@@ -508,9 +498,9 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRSSTEP
 !
 ! OUT variables
 !
-!$acc &            PSRCS, PRAINFR )                                                   &
+!$acc &            PSRCS, PRAINFR )
 
-!$acc &    copyin( XRTMIN )
+! !$acc &    copyin( XRTMIN )
 
 !*       1.     PRELIMINARY COMPUTATIONS
 !               ------------------------
@@ -572,19 +562,15 @@ allocate ( ZINPRI   ( SIZE(PZZ,1),  SIZE(PZZ,2) ) )
 allocate ( ZTHSSTEP ( SIZE(PTHS,1), SIZE(PTHS,2), SIZE(PTHS,3) ) )
 allocate ( ZRSSTEP  ( SIZE(PRS,1),  SIZE(PRS,2),  SIZE(PRS,3), SIZE(PRS,4) ) )
 
+!$acc data create(LLMICRO,ZDZZ,ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR,ZZZ,ZINPRI,ZTHSSTEP,ZRSSTEP)
+
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-!$acc kernels
 IKA=1
-!$acc end kernels
 IKB=1+JPVEXT
 IKE=SIZE(PZZ,3) - JPVEXT
 IKU=SIZE(PZZ,3)
-!$acc update device(IKU)
 !
-!$acc kernels
 IKL = 1
-!$acc end kernels
-!$acc update host(IKL)
 !
 GWEST  = LWEST_ll()
 GEAST  = LEAST_ll()
@@ -608,11 +594,13 @@ END IF
 IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN
   ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),ISVEND - ISVBEG + 1))
   ALLOCATE(ZSVS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),ISVEND - ISVBEG + 1))
+!$acc enter data create(ZSVT,ZSVS)
   ZSVT(:,:,:,:) = PSVT(:,:,:,ISVBEG:ISVEND)
   ZSVS(:,:,:,:) = PSVS(:,:,:,ISVBEG:ISVEND)
 END IF
 IF (HCLOUD(1:3)=='ICE' .AND. LRED) THEN
   ALLOCATE(ZRSMIN(SIZE(XRTMIN)))
+!$acc enter data create(ZRSMIN)
 !$acc kernels
   ZRSMIN(:) = XRTMIN(:) / PTSTEP
 !$acc end kernels
@@ -1219,7 +1207,7 @@ CALL PRINT_MSG(NVERB_FATAL,'GEN','RESOLVED_CLOUD','C2R2//KHKO not yet implemente
                       PRG=ZRSSTEP(:,:,:,6)                                  )
     ENDIF
     IF (LRED) THEN
-!$acc kernels present(LLMICRO,PRT,XRTMIN,ZRSMIN)
+!$acc kernels
       LLMICRO(:,:,:)=PRT(:,:,:,2)>XRTMIN(2) .OR. &
                    PRT(:,:,:,3)>XRTMIN(3) .OR. &
                    PRT(:,:,:,4)>XRTMIN(4) .OR. &
@@ -1500,8 +1488,7 @@ IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA')
   DO JSV = 1,SIZE(ZSVT,4)
     PSVT(:,:,:,JSV+ISVBEG-1) = ZSVT(:,:,:,JSV)
   ENDDO
-  DEALLOCATE(ZSVS)
-  DEALLOCATE(ZSVT)
+!$acc exit data delete(ZSVT,ZSVS)
 ENDIF
 !
 IF (MPPDB_INITIALIZED) THEN
@@ -1530,6 +1517,10 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRAINFR,"RESOLVED_CLOUD end:PRAINFR")
 END IF
 
+!$acc exit data delete(ZRSMIN)
+
+!$acc end data
+
 !$acc end data
 
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/rotate_wind.f90 b/src/MNH/rotate_wind.f90
index 261b761ce..6146dc637 100644
--- a/src/MNH/rotate_wind.f90
+++ b/src/MNH/rotate_wind.f90
@@ -143,7 +143,6 @@ REAL,    DIMENSION(:,:), allocatable :: ZCOEFF,ZCOEFM,     &  ! interpolation we
                                         ZUINT,ZVINT,ZWINT, &  ! intermediate values of the cartesian components after x interp.
                                         ZUFIN,ZVFIN,ZWFIN, &  ! final values of the cartesian components after the 2 interp.
                                         ZWGROUND              ! vertical velocity at the surface
-!$acc declare create( ILOC, JLOC, ZCOEFF, ZCOEFM, ZUINT, ZVINT, ZWINT, ZUFIN, ZVFIN, ZWFIN, ZWGROUND )
 INTEGER     :: IIB,IIE,IJB,IJE,IKB ! index values for the Beginning or the End of the physical domain in x,y and z directions
 INTEGER     :: IIU,IJU             ! arrays' sizes for i and j indices
 INTEGER     :: JI,JJ
@@ -179,6 +178,8 @@ allocate( zufin   (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
 allocate( zvfin   (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
 allocate( zwfin   (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
 allocate( zwground(size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
+
+!$acc data create( iloc, jloc, zcoeff, zcoefm, zuint, zvint, zwint, zufin, zvfin, zwfin, zwground )
 !
 !*      1.    PRELIMINARIES
 !             -------------
@@ -271,7 +272,9 @@ if ( mppdb_initialized ) then
 end if
 
 !$acc end data
-!
+
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE ROTATE_WIND
diff --git a/src/MNH/slow_terms.f90 b/src/MNH/slow_terms.f90
index 5f1ce23c2..4874d71b7 100644
--- a/src/MNH/slow_terms.f90
+++ b/src/MNH/slow_terms.f90
@@ -216,15 +216,13 @@ LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: G3D
 !
 INTEGER                              :: JI,JJ,IC,JL ! loop control for packed array
 
-!$acc declare create( ZT, ZW, ZW1, ZW2, ZW3, ZEXNT, ZDZZ, G3D )
-
 !-------------------------------------------------------------------------------
 
 !$acc data present( PZZ, PRHODJ, PRHODREF, PCLDFR, PTHT, PRVT, PRCT, PRRT,      &
-!$acc &             PPABST, PTHS, PRVS, PRCS, PRRS, PINPRR, PINPRR3D, PEVAP3D ) &
+!$acc &             PPABST, PTHS, PRVS, PRCS, PRRS, PINPRR, PINPRR3D, PEVAP3D )
 
-!$acc &     copyin( XC1RC, XC2RC, XC1RE, XC2RE, XCEXRA, XCEXRE, XCEXRS, XCEXVT, XCRA, XCRS, XDIVA, XTHCO, &
-!$acc &             XALPW, XBETAW, XGAMW, XCL, XCPD, XCPV, XLVTT, XMD, XMV, XP00, XRD, XRHOLW, XRV, XTT )
+! !$acc &     copyin( XC1RC, XC2RC, XC1RE, XC2RE, XCEXRA, XCEXRE, XCEXRS, XCEXVT, XCRA, XCRS, XDIVA, XTHCO, &
+! !$acc &             XALPW, XBETAW, XGAMW, XCL, XCPD, XCPV, XLVTT, XMD, XMV, XP00, XRD, XRHOLW, XRV, XTT )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -255,6 +253,8 @@ allocate( zw3  ( size(pzz,1), size(pzz,2), size(pzz,3) ) )
 allocate( zexnt( size(pzz,1), size(pzz,2), size(pzz,3) ) )
 allocate( zdzz ( size(pzz,1), size(pzz,2), size(pzz,3) ) )
 allocate( g3d   ( size(prhodj,1), size(prhodj,2), size(prhodj,3) ) )
+
+!$acc data create( zt, zw, zw1, zw2, zw3, zexnt, zdzz, g3d )
 !
 !*       1.     COMPUTE THE LOOP BOUNDS AND EXNER FUNCTION
 !   	        ------------------------------------------
@@ -576,4 +576,6 @@ END IF
 
 !$acc end data
 
-END SUBROUTINE SLOW_TERMS 
+!$acc end data
+
+END SUBROUTINE SLOW_TERMS
diff --git a/src/MNH/tm06_h.f90 b/src/MNH/tm06_h.f90
index 561088d8d..a0522e45a 100644
--- a/src/MNH/tm06_h.f90
+++ b/src/MNH/tm06_h.f90
@@ -99,7 +99,6 @@ LOGICAL, DIMENSION(:,:), allocatable :: GWORK
 REAL                                 :: ZGROWTH   ! maximum BL growth rate
 REAL,    DIMENSION(:,:), allocatable :: ZFLXZMIN  ! minimum of temperature flux
 REAL,    DIMENSION(:,:), allocatable :: ZBL_DEPTH ! BL depth at previous time-step
-!$acc declare create(ZFLXZMIN,ZBL_DEPTH,GWORK)
 !----------------------------------------------------------------------------
 
 !$acc data present( PZZ, PFLXZ, PBL_DEPTH )
@@ -120,6 +119,8 @@ allocate( ZFLXZMIN (size( pzz, 1 ), size( pzz, 2 ) ) )
 allocate( ZBL_DEPTH(size( pzz, 1 ), size( pzz, 2 ) ) )
 allocate( GWORK    (size( pzz, 1 ), size( pzz, 2 ) ) )
 
+!$acc data create( zflxzmin, zbl_depth, gwork )
+
 !* mixed boundary layer cannot grow more rapidly than 1800m/h
 !$acc kernels
 ZGROWTH = 2.0 ! (m/s)
@@ -155,5 +156,7 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 END SUBROUTINE TM06_H
diff --git a/src/MNH/tridiag_thermo.f90 b/src/MNH/tridiag_thermo.f90
index 3af0031fe..acc77444d 100644
--- a/src/MNH/tridiag_thermo.f90
+++ b/src/MNH/tridiag_thermo.f90
@@ -191,11 +191,9 @@ INTEGER             :: IKB,IKE       ! inner vertical limits
 INTEGER             :: IKT          ! array size in k direction
 INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain 
 !
-!$acc declare create(ZRHODJ_DFDDTDZ_O_DZ2,ZA,ZB,ZC,ZY,ZGAM,ZBET,ZMZM_RHODJ)
 !
 #ifdef MNH_OPENACC
 REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
-!$acc declare create(ZTMP1_DEVICE)
 #endif
 ! ---------------------------------------------------------------------------
 
@@ -222,6 +220,8 @@ allocate( zbet                (size( pvarm, 1 ), size( pvarm, 2 ) ) )
 #ifdef MNH_OPENACC
 allocate( ztmp1_device(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
 #endif
+
+!$acc data create( zrhodj_dfddtdz_o_dz2, zmzm_rhodj, za, zb, zc, zy, zgam, zbet, ztmp1_device )
 !
 !*      1.  Preliminaries
 !           -------------
@@ -385,6 +385,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE TRIDIAG_THERMO
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index 3a39fea0a..1e90ee673 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -402,22 +402,17 @@ REAL, ALLOCATABLE, DIMENSION(:,:,:) ::&
           ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,&  ! 3rd order moments
           ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,&  ! opposite of verticale derivate of 3rd order moments
           ZTHLM                          ! initial potential temp.
-!$acc declare create(ZCP,ZEXN,ZT,ZLOCPEXNM,ZLEPS,ZTRH,      &
-!$acc &              ZAMOIST,ZATHETA,ZCOEF_DISS,ZFRAC_ICE,  &
-!$acc &              ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,           &
-!$acc &              ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,ZTHLM  )
 !
 REAL, ALLOCATABLE, DIMENSION(:,:,:,:) ::     &
-          ZRM                            ! initial mixing ratio 
-!$acc declare create(ZRM)
+          ZRM                            ! initial mixing ratio
 REAL, ALLOCATABLE, DIMENSION(:,:) ::  ZTAU11M,ZTAU12M,  &
                                                  ZTAU22M,ZTAU33M,  &
             ! tangential surface fluxes in the axes following the orography
                                                  ZUSLOPE,ZVSLOPE,  &
-            ! wind components at the first mass level parallel 
-            ! to the orography 
+            ! wind components at the first mass level parallel
+            ! to the orography
                                                  ZCDUEFF,          &
-            ! - Cd*||u|| where ||u|| is the module of the wind tangential to 
+            ! - Cd*||u|| where ||u|| is the module of the wind tangential to
             ! orography (ZUSLOPE,ZVSLOPE) at the surface.
                                                  ZUSTAR, ZLMO,     &
                                                  ZRVM, ZSFRV
@@ -425,12 +420,10 @@ REAL, ALLOCATABLE, DIMENSION(:,:) ::  ZTAU11M,ZTAU12M,  &
 !
             ! Virtual Potential Temp. used
             ! in the Deardorff mixing length computation
-!$acc declare create(ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M,ZUSLOPE,ZVSLOPE,ZCDUEFF,ZUSTAR,ZLMO,ZRVM,ZSFRV)
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: &  
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: &
           ZLVOCPEXNM,ZLSOCPEXNM,      &  ! Lv/Cp/EXNREF and Ls/Cp/EXNREF at t-1
           ZATHETA_ICE,ZAMOIST_ICE        ! coefficients for s = f (Thetal,Rnp)
 !
-!$acc declare create(ZLVOCPEXNM,ZLSOCPEXNM,ZATHETA_ICE,ZAMOIST_ICE)
 REAL                :: ZEXPL        ! 1-PIMPL deg of expl.
 REAL                :: ZRVORD       ! RV/RD
 !
@@ -447,12 +440,10 @@ REAL                :: ZALPHA       ! proportionnality constant between Dz/2 and
 REAL :: ZTIME1, ZTIME2
 REAL, DIMENSION(:,:,:), allocatable :: ZTT,ZEXNE,ZLV,ZCPH
 REAL, DIMENSION(:,:,:), allocatable :: ZSHEAR, ZDUDZ, ZDVDZ
-!$acc declare create(ZTT,ZEXNE,ZLV,ZCPH,ZSHEAR, ZDUDZ, ZDVDZ)
 TYPE(TFIELDDATA) :: TZFIELD
 !
 #ifdef MNH_OPENACC
 REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE)
 #endif
 !
 !------------------------------------------------------------------------------------------
@@ -584,6 +575,17 @@ IF (HTURBDIM=="1DIM") then
 end if
 #endif
 
+!$acc data create( zcp, zexn, zt, zlocpexnm, zleps, ztrh,         &
+!$acc &            zatheta, zamoist, zcoef_diss, zfrac_ice,       &
+!$acc &            zmwth, zmwr, zmth2, zmr2, zmthr,               &
+!$acc &            zfwth, zfwr, zfth2, zfr2, zfthr, zthlm,        &
+!$acc &            zrm,                                           &
+!$acc &            ztau11m, ztau12m, ztau22m, ztau33m,            &
+!$acc &            zuslope, zvslope, zcdueff, zlmo,               &
+!$acc &            zustar, zrvm, zsfrv,                           &
+!$acc &            ztt, zexne, zlv, zcph, zshear,  zdudz,  zdvdz, &
+!$acc &            ztmp1_device, ztmp2_device, ztmp3_device       )
+
 !------------------------------------------------------------------------------------------
 !
 !*      1.PRELIMINARIES
@@ -666,7 +668,10 @@ IF (KRRL >=1) THEN
     ALLOCATE(ZLSOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)))
     ALLOCATE(ZAMOIST_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)))
     ALLOCATE(ZATHETA_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)))
-!
+
+!$acc enter data create( zlvocpexnm, zlsocpexnm )
+!$acc data create( zamoist_ice, zatheta_ice )
+
     CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, &
                                  ZLVOCPEXNM,ZAMOIST,ZATHETA)
     CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, &
@@ -684,6 +689,8 @@ IF (KRRL >=1) THEN
     ZATHETA(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZATHETA(:,:,:) &
                          +ZFRAC_ICE(:,:,:) *ZATHETA_ICE(:,:,:)
 !$acc end kernels
+
+!$acc end data
     DEALLOCATE(ZAMOIST_ICE)
     DEALLOCATE(ZATHETA_ICE)
   ELSE
@@ -1226,6 +1233,7 @@ IF ( KRRL >= 1 ) THEN
 !$acc end kernels
 !$acc update self(PRT(:,:,:,1))
 !
+!$acc exit data delete( zlvocpexnm, zlsocpexnm )
     DEALLOCATE(ZLVOCPEXNM)
     DEALLOCATE(ZLSOCPEXNM)
   ELSE
@@ -1418,6 +1426,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 CONTAINS
@@ -1559,7 +1569,6 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)   :: PAMOIST,PATHETA
 REAL                :: ZEPS         ! XMV / XMD
 real, dimension(:,:,:), allocatable :: zrvsat
 real, dimension(:,:,:), allocatable :: zdrvsatdt
-!$acc declare create(ZRVSAT,ZDRVSATDT)
 !
 !-------------------------------------------------------------------------------
 
@@ -1575,6 +1584,7 @@ real, dimension(:,:,:), allocatable :: zdrvsatdt
   allocate( zrvsat   ( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) )
   allocate( zdrvsatdt( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) )
 
+!$acc data create( zrvsat, zdrvsatdt )
 
   ZEPS = XMV / XMD
 !
@@ -1641,6 +1651,8 @@ real, dimension(:,:,:), allocatable :: zdrvsatdt
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE COMPUTE_FUNCTION_THERMO
 !
 !
@@ -1891,7 +1903,6 @@ REAL                :: ZALPHA       ! proportionnality constant between Dz/2 and
 REAL                :: ZD           ! distance to the surface
 #ifdef MNH_OPENACC
 real, dimension(:,:,:), allocatable :: ztmp1_device, ztmp2_device
-!$acc declare create(ztmp1_device, ztmp2_device)
 #endif
 !
 !-------------------------------------------------------------------------------
@@ -1911,6 +1922,8 @@ allocate( ztmp1_device( size( pdxx, 1 ), size( pdxx, 2 ), size( pdxx, 3 ) ) )
 allocate( ztmp2_device( size( pdxx, 1 ), size( pdxx, 2 ), size( pdxx, 3 ) ) )
 #endif
 
+!$acc data create( ztmp1_device, ztmp2_device )
+
 !$acc kernels
 DO JK = KKTB,KKTE ! 1D turbulence scheme
   PLM(:,:,JK) = PZZ(:,:,JK+KKL) - PZZ(:,:,JK)
@@ -1985,6 +1998,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE DELT
 
 
@@ -2071,11 +2086,9 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE ::     &
             ZDTHLDZ,ZDRTDZ,     &!dtheta_l/dz, drt_dz used for computing the stablity
 !                                ! criterion
             ZETHETA,ZEMOIST             !coef ETHETA and EMOIST
-!$acc declare create(ZWORK2D,ZDTHLDZ,ZDRTDZ,ZETHETA,ZEMOIST)
 !
 #ifdef MNH_OPENACC
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE)
 #endif
 !----------------------------------------------------------------------------
 
@@ -2108,6 +2121,10 @@ allocate( ZEMOIST(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
 allocate( ZTMP1_DEVICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
 allocate( ZTMP2_DEVICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
 #endif
+
+!$acc data create( zwork2d, zdthldz, zdrtdz, zetheta, zemoist, &
+!$acc &            ztmp1_device, ztmp2_device )
+
 !
 !   initialize the mixing length with the mesh grid
 !$acc kernels
@@ -2252,6 +2269,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE DEAR
 
 end module mode_turb
diff --git a/src/MNH/turb_hor_splt.f90 b/src/MNH/turb_hor_splt.f90
index 6249d927c..2b5d5d470 100644
--- a/src/MNH/turb_hor_splt.f90
+++ b/src/MNH/turb_hor_splt.f90
@@ -367,14 +367,10 @@ REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRM, ZSVM
 REAL,ALLOCATABLE,DIMENSION(:,:,:)   :: ZRUS, ZRVS, ZRWS, ZRTHLS
 REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRRS, ZRSVS
 !
-!$acc declare create(ZK,ZINV_PDXX,ZINV_PDYY,ZINV_PDZZ,ZMZM_PRHODJ,                    &
-!$acc &              ZUM,ZVM,ZWM,ZTHLM,ZTKEM,ZRM,ZSVM,ZRUS,ZRVS,ZRWS,ZRTHLS,ZRRS,ZRSVS)
-!
 TYPE(LIST_ll), POINTER, SAVE :: TZFIELDS_ll
 !
 #ifdef MNH_OPENACC
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE)
 #endif
 ! ---------------------------------------------------------------------------
 
@@ -459,7 +455,10 @@ ALLOCATE(ZMZM_PRHODJ(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)))
 allocate( ZTMP1_DEVICE( SIZE( PTHLM, 1 ), SIZE( PTHLM, 2 ), SIZE( PTHLM, 3 ) ) )
 allocate( ZTMP2_DEVICE( SIZE( PTHLM, 1 ), SIZE( PTHLM, 2 ), SIZE( PTHLM, 3 ) ) )
 #endif
-!
+
+!$acc data create( ZK, ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE )
+
 !$acc kernels
 ZINV_PDXX = 1./PDXX
 ZINV_PDYY = 1./PDYY
@@ -498,6 +497,7 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN
   ALLOCATE(ZRSVS(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3),SIZE(PRSVS,4)))
   ALLOCATE(ZRTHLS(SIZE(PRTHLS,1),SIZE(PRTHLS,2),SIZE(PRTHLS,3)))
   ALLOCATE(ZRRS(SIZE(PRRS,1),SIZE(PRRS,2),SIZE(PRRS,3),SIZE(PRRS,4)))
+!$acc data create( zum, zvm, zwm, zsvm, zthlm, ztkem, zrm, zrus, zrvs, zrws, zrsvs, zrthls, zrrs )
 !
 !
 !*       2.2  list for parallel exchanges
@@ -702,6 +702,7 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN
 !*       2.6  deallocations
 !             -------------
 !
+!$acc end data
   DEALLOCATE(ZUM)
   DEALLOCATE(ZVM)
   DEALLOCATE(ZWM)
@@ -753,6 +754,8 @@ ELSE
 END IF
 !--------------------------------------------------------------------
 !
+!$acc end data
+
 DEALLOCATE(ZK)
 DEALLOCATE(ZINV_PDXX)
 DEALLOCATE(ZINV_PDYY)
diff --git a/src/MNH/turb_hor_tke.f90 b/src/MNH/turb_hor_tke.f90
index b857a251f..f81424712 100644
--- a/src/MNH/turb_hor_tke.f90
+++ b/src/MNH/turb_hor_tke.f90
@@ -131,8 +131,6 @@ REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
 !
 REAL, DIMENSION(:,:,:), allocatable :: ZFLX
 !
-!$acc declare create(ZCOEFF,ZFLX)
-!
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90
index cf0d494c9..000e3cf61 100644
--- a/src/MNH/turb_ver_thermo_corr.f90
+++ b/src/MNH/turb_ver_thermo_corr.f90
@@ -409,8 +409,6 @@ LOGICAL :: GFTHR    ! flag to use w'th'r'
 #ifdef MNH_OPENACC
 REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
 REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE,ZTMP8_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE, &
-!$acc &              ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE,ZTMP8_DEVICE)
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 !----------------------------------------------------------------------------
@@ -487,11 +485,10 @@ allocate( ztmp7_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
 allocate( ztmp8_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
 #endif
 
-!$acc data create( ZFLXZ, ZKEFF, ZF, ZDFDDTDZ, ZDFDDRDZ, ZCOEFF, &
-!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE , &
-!$acc &            ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE )
+!$acc data create( zflxz, zkeff, zf, zdfddtdz, zdfddrdz, zcoeff,           &
+!$acc &            ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, &
+!$acc &            ztmp5_device, ztmp6_device, ztmp7_device, ztmp8_device  )
 
-!
 GUSERV = (KRR/=0)
 !
 !  compute the coefficients for the uncentred gradient computation near the 
-- 
GitLab