diff --git a/src/LIB/SURCOUCHE/src/mode_sum_ll.f90 b/src/LIB/SURCOUCHE/src/mode_sum_ll.f90
index 6063f3346f078a27fb90449a4c68bbd1d691d1a2..f01b7876cebfe513c2bafea2eae97565a6ce4279 100644
--- a/src/LIB/SURCOUCHE/src/mode_sum_ll.f90
+++ b/src/LIB/SURCOUCHE/src/mode_sum_ll.f90
@@ -1025,7 +1025,7 @@ CONTAINS
   logical :: gondevice
 #endif
 !
-REAL, DIMENSION(SIZE(PFIELD,1),SIZE(PFIELD,2)) :: ZSUM
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZSUM
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZSUM_ll
 !-------------------------------------------------------------------------------
 !
@@ -1126,6 +1126,8 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZSUM_ll
 !
 !*        3.2   The intersection is not empty
 !
+    allocate( ZSUM( SIZE( PFIELD, 1 ), SIZE( PFIELD, 2 ) ) )
+
     ZSUM(:,:) = 0.
     IF((IIB <= IIE) .AND. (IJB <= IJE) ) THEN
 !
@@ -1182,6 +1184,7 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZSUM_ll
 !JUAN
     SUM3D_ll= SUM_DD_R2_ll(ZSUM(:,:))
 !JUAN
+    deallocate( ZSUM )
   ENDIF
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/advec_4th_order_aux.f90 b/src/MNH/advec_4th_order_aux.f90
index cb89af1c1ab80a6e448c07743d6affb2190d68cb..adb01b8911d4da48fa3af8d694cac695d02cad58 100644
--- a/src/MNH/advec_4th_order_aux.f90
+++ b/src/MNH/advec_4th_order_aux.f90
@@ -140,8 +140,8 @@ INTEGER:: ILUOUT,IRESP   ! for prints
 ! JUAN ACC
 LOGICAL                                               :: GWEST , GEAST
 LOGICAL                                               :: GSOUTH , GNORTH
-REAL, DIMENSION(SIZE(PFIELDT,2),SIZE(PFIELDT,3))      :: ZHALO2_WEST,ZHALO2_EAST
-REAL, DIMENSION(SIZE(PFIELDT,1),SIZE(PFIELDT,3))      :: ZHALO2_SOUTH,ZHALO2_NORTH
+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)
 !
 
@@ -152,6 +152,11 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PFIELDT,"ADVEC_4TH_ORDER_ALGO beg:PFIELDT")
 END IF
 
+allocate( zhalo2_west ( size( pfieldt, 2 ), size( pfieldt, 3 ) ) )
+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 ) ) )
+
 !-------------------------------------------------------------------------------
 !
 !*       0.3.     COMPUTES THE DOMAIN DIMENSIONS
diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90
index af6a40ae70807d96f20afac7f1d2e1290bb9a857..dcd9de9c8521453b7fac64178902e6416f2fc464 100644
--- a/src/MNH/advection_uvw_cen.f90
+++ b/src/MNH/advection_uvw_cen.f90
@@ -148,39 +148,39 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2MLIST ! momentum variables
 !*       0.2   declarations of local variables
 !
 !
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZUS
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZVS 
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZWS
+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(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRUS
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRVS 
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRWS
+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)
                                                   ! to future (+PTSTEP) timestep
-!  
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRUT 
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRVT 
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRWT
+!
+REAL, DIMENSION(:,:,:), allocatable :: ZRUT
+REAL, DIMENSION(:,:,:), allocatable :: ZRVT
+REAL, DIMENSION(:,:,:), allocatable :: ZRWT
 !$acc declare create(ZRUT,ZRVT,ZRWT)
-                                                  ! cartesian 
+                                                  ! cartesian
                                                   ! components of
                                                   ! momentum
 !
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRUCT 
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRVCT
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRWCT
+REAL, DIMENSION(:,:,:), allocatable :: ZRUCT
+REAL, DIMENSION(:,:,:), allocatable :: ZRVCT
+REAL, DIMENSION(:,:,:), allocatable :: ZRWCT
 !$acc declare create(ZRUCT,ZRVCT,ZRWCT)
                                                   ! contravariant
                                                   ! components
                                                   ! of momentum
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMXM_RHODJ
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMYM_RHODJ
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMZM_RHODJ
+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
@@ -217,6 +217,22 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWS,"ADVECTION_UVW_CEN beg:PRWS")
 END IF
 
+allocate( zus        ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zvs        ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zws        ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zrus       ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zrvs       ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zrws       ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zrut       ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zrvt       ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zrwt       ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zruct      ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zrvct      ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+allocate( zrwct      ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+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 ) ) )
+
 #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')
@@ -315,7 +331,7 @@ IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN
 ELSEIF (HUVW_ADV_SCHEME=='CEN4TH') THEN
 ! 
    CALL ADVECUVW_4TH ( HLBCX, HLBCY, ZRUCT, ZRVCT, ZRWCT,            &
-                       PUT, PVT, PWT, ZRUS, ZRVS, ZRWS, TPHALO2MLIST )  
+                       PUT, PVT, PWT, ZRUS, ZRVS, ZRWS, TPHALO2MLIST )
 !
 END IF
 !
@@ -345,6 +361,22 @@ 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")
diff --git a/src/MNH/bl89.f90 b/src/MNH/bl89.f90
index 35f99be024cf73f5215bf50851e92209463b9257..30c84726982c4d07dec7781e30bc2c99a09eb165 100644
--- a/src/MNH/bl89.f90
+++ b/src/MNH/bl89.f90
@@ -1,12 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1997-2019 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/bl89.f90,v $ $Revision: 1.1.8.1.2.2.16.1.2.1 $ $Date: 2014/01/09 13:25:02 $
-!-----------------------------------------------------------------
 !     ################
       MODULE MODI_BL89
 !     ################
@@ -114,24 +110,24 @@ INTEGER :: IKB,IKE
 INTEGER :: IKT          ! array size in k direction
 INTEGER :: IKTB,IKTE    ! start, end of k loops in physical domain 
 
-REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZVPT  ! Virtual Potential Temp at half levels
-REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZDELTVPT
+real, dimension(:,:), allocatable :: ZVPT  ! Virtual Potential Temp at half levels
+real, dimension(:,:), allocatable :: ZDELTVPT
             ! Increment of Virtual Potential Temp between two following levels
-REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZHLVPT
+real, dimension(:,:), allocatable :: ZHLVPT
             ! Virtual Potential Temp at half levels
-REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) ::  ZLWORK,ZINTE
+real, dimension(:), allocatable ::  ZLWORK,ZINTE
 !           ! downwards then upwards vertical displacement,
 !           ! residual internal energy,
 !           ! residual potential energy
-REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZZZ,ZDZZ,       &
-                                                              ZG_O_THVREF,    &
-                                                              ZTHM,ZTKEM,ZLM, &
-                                                              ZLMDN,ZSHEAR,   &
-                                                              ZSQRT_TKE
+real, dimension(:,:), allocatable :: ZZZ,ZDZZ,       &
+                                     ZG_O_THVREF,    &
+                                     ZTHM,ZTKEM,ZLM, &
+                                     ZLMDN,ZSHEAR,   &
+                                     ZSQRT_TKE
 !           ! input and output arrays packed according one horizontal coord.
-REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3),SIZE(PRM,4)) :: ZRM
+real, dimension(:,:,:), allocatable :: ZRM
 !           ! input array packed according one horizontal coord.
-REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3)) :: ZSUM ! to replace SUM function
+real, dimension(:,:), allocatable :: ZSUM ! to replace SUM function
 !
 INTEGER :: IIU,IJU
 INTEGER :: J1D        ! horizontal loop counter
@@ -143,6 +139,25 @@ REAL    :: ZTEST,ZTEST0,ZTESTM ! test for vectorization
 REAL    :: Z2SQRT2
 !-------------------------------------------------------------------------------
 !
+
+allocate( zvpt       (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( zdeltvpt   (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( zhlvpt     (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( zlwork     (size( ptkem, 1 ) * size( ptkem, 2 ) ) )
+allocate( zinte      (size( ptkem, 1 ) * size( ptkem, 2 ) ) )
+allocate( zzz        (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , &
+          zdzz       (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , &
+          zg_o_thvref(size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , &
+          zthm       (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , &
+          ztkem      (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , &
+          zlm        (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , &
+          zlmdn      (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , &
+          zshear     (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , &
+          zsqrt_tke  (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) )   )
+allocate( zrm        (size( prm, 1 )   * size( prm, 2 ),   size( prm, 3 ),  size( prm, 4 ) ) )
+if ( krr > 0 ) &
+  allocate( zsum     (size( prm, 1 )   * size( prm, 2 ),   size( prm, 3 ) ) )
+
 Z2SQRT2=2.*SQRT(2.)
 IIU=SIZE(PTKEM,1)
 IJU=SIZE(PTKEM,2)
diff --git a/src/MNH/emoist.f90 b/src/MNH/emoist.f90
index 5bf959300d897c7d2955a4cbc476a43e23ef399b..1f68cffa3751fe8d9cbe9b8329c3d314403287b2 100644
--- a/src/MNH/emoist.f90
+++ b/src/MNH/emoist.f90
@@ -29,7 +29,7 @@ REAL, DIMENSION(:,:,:),  INTENT(IN)  ::   PSRCM     ! Normalized 2dn_order
 #ifndef MNH_OPENACC
 REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result
 #else
-REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),  INTENT(OUT):: PEMOIST ! result
+REAL,DIMENSION(:,:,:),  INTENT(OUT):: PEMOIST ! result
 #endif
 !
 #ifndef MNH_OPENACC
@@ -120,13 +120,12 @@ REAL, DIMENSION(:,:,:),  INTENT(IN)  ::   PSRCM     ! Normalized 2dn_order
 #ifndef MNH_OPENACC
 REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result
 #else
-REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),  INTENT(OUT):: PEMOIST ! result
+REAL,DIMENSION(:,:,:),  INTENT(OUT):: PEMOIST ! result
 #endif
 !
 !*       0.2 declarations of local variables
 !
-REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ::       &
-                                        ZA, ZRW
+REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW
 !                ZA = coeft A, ZRW = total mixing ratio rw 
 !$acc declare create(ZA,ZRW)
 REAL                                  :: ZDELTA  ! = Rv/Rd - 1
@@ -144,6 +143,9 @@ if ( mppdb_initialized ) then
   call Mppdb_check( pamoist,   "Emoist beg:pamoist"   )
   call Mppdb_check( psrcm,     "Emoist beg:psrcm"     )
 end if
+
+allocate( za  ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
 !
 !*       1. COMPUTE EMOIST
 !           --------------
@@ -206,6 +208,8 @@ ELSE                                                ! liquid water & ice present
 END IF
 !$acc end kernels
 
+deallocate( za, zrw )
+
 if ( mppdb_initialized ) then
   !Check all out arrays
   call Mppdb_check( pemoist, "Emoist end:pemoist" )
diff --git a/src/MNH/etheta.f90 b/src/MNH/etheta.f90
index 73943764e11b4e86a8a4b9f8bce06325cbef8044..1039cb55bd83d887328ad75c7888a9095273c0d0 100644
--- a/src/MNH/etheta.f90
+++ b/src/MNH/etheta.f90
@@ -30,7 +30,7 @@ REAL, DIMENSION(:,:,:),  INTENT(IN)  ::   PSRCM     ! Normalized 2dn_order
 #ifndef MNH_OPENACC
 REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PETHETA ! result
 #else
-REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),  INTENT(OUT):: PETHETA ! result
+REAL, DIMENSION(:,:,:),  INTENT(OUT):: PETHETA ! result
 #endif
 !
 !
@@ -123,15 +123,14 @@ REAL, DIMENSION(:,:,:),  INTENT(IN)  ::   PSRCM     ! Normalized 2dn_order
 #ifndef MNH_OPENACC
 REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PETHETA ! result
 #else
-REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),  INTENT(OUT):: PETHETA ! result
+REAL, DIMENSION(:,:,:),  INTENT(OUT):: PETHETA ! result
 #endif
 !
 !
 !
 !*       0.2 declarations of local variables
 !
-REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ::       &
-                                        ZA, ZRW
+REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW
 !                ZA = coeft A, ZRW = total mixing ratio rw
 !$acc declare create(ZA,ZRW)
 REAL                                  :: ZDELTA  ! = Rv/Rd - 1
@@ -149,6 +148,9 @@ if ( mppdb_initialized ) then
   call Mppdb_check( patheta,   "Etheta beg:patheta"   )
   call Mppdb_check( psrcm,     "Etheta beg:psrcm"     )
 end if
+
+allocate( za  ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
 !
 !*       1. COMPUTE ETHETA
 !           --------------
@@ -206,6 +208,8 @@ ELSE                                                ! liquid water & ice present
 END IF
 !$acc end kernels
 
+deallocate( za, zrw )
+
 if ( mppdb_initialized ) then
   !Check all out arrays
   call Mppdb_check( petheta, "Etheta end:petheta" )
diff --git a/src/MNH/gradient_u.f90 b/src/MNH/gradient_u.f90
index 0d15b0554cf8c771bd807984526c4a13650e5607..8f1992b2cd25c2ce22fba2ec189bcd3022250292 100644
--- a/src/MNH/gradient_u.f90
+++ b/src/MNH/gradient_u.f90
@@ -222,8 +222,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX     ! metric coefficient dzx
 !
 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGX_U_M_DEVICE ! result mass point
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
 !
 !
 !*       0.2   declaration of local variables
@@ -233,6 +232,13 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDXX, PDZZ, PDZX, PGX_U_M_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device )
+
 !
 !*       1.    DEFINITION of GX_U_M_DEVICE
 !              --------------------
@@ -261,6 +267,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GX_U_M_DEVICE
@@ -390,8 +398,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY     ! metric coefficient dzy
 !
 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGY_U_UV_DEVICE ! result UV point
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
 !
 !
 !*       0.2   declaration of local variables
@@ -401,6 +408,13 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDYY, PDZZ, PDZY, PGY_U_UV_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device )
+
 !
 !*       1.    DEFINITION of GY_U_UV_DEVICE
 !              ---------------------
@@ -432,6 +446,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GY_U_UV_DEVICE
@@ -543,8 +559,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 !
 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGZ_U_UW_DEVICE ! result UW point
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
 !
 !
 !*       0.2   declaration of local variables
@@ -554,6 +569,12 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDZZ, PGZ_U_UW_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 !
 !*       1.    DEFINITION of GZ_U_UW_DEVICE
 !              ---------------------
@@ -566,6 +587,8 @@ PGZ_U_UW_DEVICE(:,:,:)= ZTMP1_DEVICE / ZTMP2_DEVICE
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GZ_U_UW_DEVICE
diff --git a/src/MNH/gradient_v.f90 b/src/MNH/gradient_v.f90
index e652fcbd2bcac30c74522f5185ea6cb5e8237e2f..95c3c0f07e294dffdb9ae6cdd733c6e57b47b200 100644
--- a/src/MNH/gradient_v.f90
+++ b/src/MNH/gradient_v.f90
@@ -224,8 +224,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY     ! metric coefficient dzy
 !
 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGY_V_M_DEVICE ! result mass point
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
 !
 !*       0.2   declaration of local variables
 !
@@ -234,6 +233,13 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDYY, PDZZ, PDZY, PGY_V_M_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device )
+
 !
 !*       1.    DEFINITION of GY_V_M_DEVICE
 !              --------------------
@@ -263,6 +269,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GY_V_M_DEVICE
@@ -391,8 +399,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX     ! metric coefficient dzx
 !
 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGX_V_UV_DEVICE ! result UV point
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
 !
 !
 !*       0.2   declaration of local variables
@@ -402,6 +409,14 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDXX, PDZZ, PDZX, PGX_V_UV_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp4_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device )
+
 !
 !*       1.    DEFINITION of GX_V_UV_DEVICE
 !              ---------------------
@@ -434,6 +449,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GX_V_UV_DEVICE
@@ -546,8 +563,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 !
 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGZ_V_VW_DEVICE ! result VW point
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE
 !
 !*       0.2   declaration of local variables
 !
@@ -556,6 +572,12 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3))  ::  ZTMP1_DEVICE,ZTMP2_DEVICE
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDZZ, PGZ_V_VW_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 !
 !*       1.    DEFINITION of GZ_V_VW_DEVICE
 !              ---------------------
@@ -568,6 +590,8 @@ PGZ_V_VW_DEVICE(:,:,:)= ZTMP1_DEVICE / ZTMP2_DEVICE
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GZ_V_VW_DEVICE
diff --git a/src/MNH/gradient_w.f90 b/src/MNH/gradient_w.f90
index 14b324f856fb087ad7f9aaae1f2ab8205a7d3c2a..70fda231043e16fb2b0c561c604c56dbd87d77e2 100644
--- a/src/MNH/gradient_w.f90
+++ b/src/MNH/gradient_w.f90
@@ -204,12 +204,17 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGZ_W_M_DEVIC
 !
 !*       0.2   declaration of local variables
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE
 !
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDZZ, PGZ_W_M_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device )
+
 !
 !*       1.    DEFINITION of GZ_W_M_DEVICE
 !              --------------------
@@ -222,6 +227,8 @@ PGZ_W_M_DEVICE(:,:,:)= ZTMP1_DEVICE/ZTMP2_DEVICE
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GZ_W_M_DEVICE
@@ -343,12 +350,20 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGX_W_UW_DEVI
 !
 !*       0.2   declaration of local variables
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE
 !
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDXX, PDZZ, PDZX, PGX_W_UW_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp4_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp5_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
+
 !
 !*       1.    DEFINITION of GX_W_UW_DEVICE
 !              ---------------------
@@ -378,6 +393,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GX_W_UW_DEVICE
@@ -499,12 +516,20 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGY_W_VW_DEVI
 !
 !*       0.2   declaration of local variables
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE
 !
 !----------------------------------------------------------------------------
 
 !$acc data present( PA, PDYY, PDZZ, PDZY, PGY_W_VW_DEVICE )
+
+allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp4_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+allocate( ztmp5_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
+
+!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
+
 !
 !*       1.    DEFINITION of GY_W_VW_DEVICE
 !              ---------------------
@@ -534,6 +559,8 @@ END IF
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GY_W_VW_DEVICE
diff --git a/src/MNH/gravity.f90 b/src/MNH/gravity.f90
index d5781ca4c485545036cbad2ff809d1f53bda0751..97a5624a321f8ef3ff6c2249e2b7ce1e141c21b0 100644
--- a/src/MNH/gravity.f90
+++ b/src/MNH/gravity.f90
@@ -139,8 +139,7 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRWS      ! Sources of Momentum
 !
 REAL       ::  ZRV_OV_RD    ! = RV / RD
 INTEGER    ::  JWATER       ! loop index on the different types of water
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) ::           &
-                              ZWORK1, ZWORK2
+REAL, DIMENSION(:,:,:), allocatable :: ZWORK1, ZWORK2
 INTEGER :: IKU
 !
 !$acc declare device_resident(ZWORK1, ZWORK2)
@@ -157,6 +156,9 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PTHT,     "GRAVITY beg:PTHT")
   CALL MPPDB_CHECK(PRT,      "GRAVITY beg:PRT")
 END IF
+
+allocate( zwork1(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zwork2(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
 !
 !*       1.     COMPUTES THE GRAVITY TERM
 !	        -------------------------
diff --git a/src/MNH/gravity_impl.f90 b/src/MNH/gravity_impl.f90
index 633ce90315f7d5770ef00eb5910996fdddaf894f..8f97f2ff99997ba21f3644cb25cb25d37b111d11 100644
--- a/src/MNH/gravity_impl.f90
+++ b/src/MNH/gravity_impl.f90
@@ -118,11 +118,11 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRRS_CLD
 !
 !  
 ! Tendencies of W due to gravity
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZRWS_GRAV
+REAL, DIMENSION(:,:,:),   allocatable :: ZRWS_GRAV
 ! Guess of future theta
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTH
+REAL, DIMENSION(:,:,:),   allocatable :: ZTH
 ! Guess of future mixing ratios
-REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) :: ZR
+REAL, DIMENSION(:,:,:,:), allocatable :: ZR
 !
 INTEGER :: JR
 !
@@ -144,6 +144,10 @@ IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRWS,     "GRAVITY_IMPL beg:PRWS")
 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 ) ) )
 !
 ! guess of Theta at future time-step
 !$acc kernels
diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90
index 837b581c98d1087dd6922e26bbf74ea620eea5f0..fd52d08bfd9b9fb7e54fbd714d6b23a84149df61 100644
--- a/src/MNH/ice4_fast_rs.f90
+++ b/src/MNH/ice4_fast_rs.f90
@@ -141,12 +141,13 @@ INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5,
 INTEGER                            :: IGRIM, IGACC
 INTEGER                            :: IDX, JJ
 INTEGER                            :: ISIZE
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2
 LOGICAL                            :: GDSOFT,GEVLIMIT !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GRIM, GACC, GMASK
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZVEC1, ZVEC2, ZVEC3
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE
+INTEGER, DIMENSION(:), allocatable :: I1
+INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2
+LOGICAL, DIMENSION(:), allocatable :: GRIM, GACC, GMASK
+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&              PLBDAR, PLBDAS, PT, PRVT, PRCT, PRRT, PRST, PRIAGGS, PRCRIMSS, PRCRIMSG, PRSRIMCG,                    &
@@ -194,6 +195,21 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK1D(PA_RS,"ICE4_FAST_RS beg:PA_RS",PRECISION)
   CALL MPPDB_CHECK1D(PA_RG,"ICE4_FAST_RS beg:PA_RG",PRECISION)
 END IF
+
+allocate( i1          ( size( prhodref ) ) )
+allocate( ivec1       ( size( prhodref ) ) )
+allocate( ivec2       ( size( prhodref ) ) )
+allocate( grim        ( size( prhodref ) ) )
+allocate( gacc        ( size( prhodref ) ) )
+allocate( gmask       ( size( prhodref ) ) )
+allocate( zvec1       ( size( prhodref ) ) )
+allocate( zvec2       ( size( prhodref ) ) )
+allocate( zvec3       ( size( prhodref ) ) )
+allocate( zzw         ( size( prhodref ) ) )
+allocate( zzw2        ( size( prhodref ) ) )
+allocate( zzw6        ( size( prhodref ) ) )
+allocate( zfreez_rate ( size( prhodref ) ) )
+
 !
 ! !$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
@@ -653,6 +669,20 @@ 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
   CALL MPPDB_CHECK1D(PRSMLTG,"ICE4_FAST_RS end:PRSMLTG",PRECISION)
diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90
index c31f08bf018d6481cdd8efce92139e7accb92285..e8219824ed427f7d325c78aa0a06feb1e09812a0 100644
--- a/src/MNH/mode_prandtl.f90
+++ b/src/MNH/mode_prandtl.f90
@@ -387,12 +387,16 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: ZTMP1_DEVICE
+  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
 !$acc declare create( ZTMP1_DEVICE )
 #endif
 
 !$acc data present( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, PDTDZ, PD_PHI3DTDZ2_O_DDTDZ )
 
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
+#endif
+
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PREDTH1,3)-JPVEXT_TURB
 !
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index b4b37943f00df398246553713cdaef47df454b95..54636764ba583fd27a551b26f06caed5a35390a7 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -510,18 +510,18 @@ LOGICAL :: KACTIT
 LOGICAL :: KSEDI
 LOGICAL :: KHHONI
 !
-REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZRUS,ZRVS,ZRWS
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS,ZRVS,ZRWS
 !$acc declare create(ZRWS)
-REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPABST !To give pressure at t 
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPABST !To give pressure at t
                                                      ! (and not t+1) to resolved_cloud
-REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZJ
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ
 !
 TYPE(LIST_ll), POINTER :: TZFIELDC_ll   ! list of fields to exchange
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2C_ll   ! list of fields to exchange
 LOGICAL :: GCLD                     ! conditionnal call for dust wet deposition
 LOGICAL :: GCLOUD_ONLY              ! conditionnal radiation computations for
                                 !      the only cloudy columns
-REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER)  :: ZWETDEPAER
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZWETDEPAER
 
 
 !
@@ -531,6 +531,14 @@ TYPE(TFILEDATA),POINTER :: TZBAKFILE, TZOUTFILE
 !
 TZBAKFILE=> NULL()
 TZOUTFILE=> NULL()
+
+allocate( ZRUS  (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
+allocate( ZRVS  (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
+allocate( ZRWS  (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
+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) )
+
 !
 !*       0.    MICROPHYSICAL SCHEME
 !              ------------------- 
diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90
index f0c6b1a6f9b0d541a7caea7e1bad8b03e74013c6..2c6f15209a9b808a427a52a6cbebba0433ec6744 100644
--- a/src/MNH/prandtl.f90
+++ b/src/MNH/prandtl.f90
@@ -274,10 +274,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)  ::  PEMOIST ! coefficient E_moist
 !
 !       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ::  &
-                  ZW1, ZW2
-!                                                 working variables
-!$acc declare create(ZW1,ZW2)
+REAL, DIMENSION(:,:,:), allocatable :: ZW1, ZW2 ! work arrays
 !                                                     
 INTEGER :: IKB      ! vertical index value for the first inner mass point
 INTEGER :: IKE      ! vertical index value for the last inner mass point
@@ -288,12 +285,11 @@ INTEGER :: JLOOP
 REAL    :: ZMINVAL
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP2_DEVICE
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP3_DEVICE
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP4_DEVICE
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP5_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE
 #endif
 TYPE(TFIELDDATA)  :: TZFIELD
 ! ---------------------------------------------------------------------------
@@ -323,6 +319,20 @@ if ( mppdb_initialized ) then
   call Mppdb_check( psvm,      "Prandtl beg:psvm"      )
   call Mppdb_check( psrcm,     "Prandtl beg:psrcm"     )
 end if
+
+allocate( zw1(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zw2(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp5_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+#endif
+
+!$acc data create( zw1, zw2, ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
+
 !
 !*      1.  DEFAULT VALUES,  1D REDELSPERGER NUMBERS 
 !           ----------------------------------------
@@ -1052,6 +1062,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !---------------------------------------------------------------------------
 !
 END SUBROUTINE PRANDTL
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 2a6533e1606008758180bcb4fb7f612d03ac2cb0..55d8b32baad8c3e9a0e6ad45ffd7fc2e66f60903 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -477,7 +477,7 @@ INTEGER                               :: ISVEND ! last  scalar index for microph
 REAL, DIMENSION(:),       ALLOCATABLE :: ZRSMIN ! Minimum value for tendencies
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT   ! scalar variable for microphysics only
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVS   ! scalar tendency for microphysics only
-LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: LLMICRO ! mask to limit computation
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLMICRO ! mask to limit computation
 ! REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR
 !
 INTEGER                               :: JMOD, JMOD_IFN
@@ -559,6 +559,7 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PSSPRO,"RESOLVED_CLOUD beg:PSSPRO")
 END IF
 !
+allocate ( LLMICRO  ( SIZE(PZZ,1),  SIZE(PZZ,2),  SIZE(PZZ,3)  ) )
 allocate ( ZDZZ     ( SIZE(PZZ,1),  SIZE(PZZ,2),  SIZE(PZZ,3)  ) )
 allocate ( ZT       ( SIZE(PZZ,1),  SIZE(PZZ,2),  SIZE(PZZ,3)  ) )
 allocate ( ZEXN     ( SIZE(PZZ,1),  SIZE(PZZ,2),  SIZE(PZZ,3)  ) )
diff --git a/src/MNH/rmc01.f90 b/src/MNH/rmc01.f90
index 57f50ba7cbfaafd6767e3d5960356aee38676435..0a9ed042e428c92fd797356edb9b41dc4630808a 100644
--- a/src/MNH/rmc01.f90
+++ b/src/MNH/rmc01.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 turb 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !     ################
       MODULE MODI_RMC01
 !     ################
@@ -113,23 +108,24 @@ INTEGER :: IIU        ! horizontal x boundary
 INTEGER :: IJU        ! horizontal y boundary
 INTEGER :: JK         ! loop counter
 !
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZZ  ! height of mass
-                                                             ! points above ground
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZ_O_LMO ! height / LMO
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZGAM ! factor controling
-                                                             ! transition betw.
-                                                             ! SBL and free BL
-
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZPHIM! MO function
-                                                             ! for stress
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZPHIE! MO function
-                                                             ! for TKE
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZDH  ! hor. grid mesh
-                                                             ! size
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZL   ! SBL length
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZC  ! alt. where
-                                                             ! turb. is isotr.
+REAL, DIMENSION(:,:,:), allocatable :: ZZZ      ! height of mass points above ground
+REAL, DIMENSION(:,:,:), allocatable :: ZZ_O_LMO ! height / LMO
+REAL, DIMENSION(:,:,:), allocatable :: ZGAM     ! factor controling transition between SBL and free BL
+REAL, DIMENSION(:,:,:), allocatable :: ZPHIM    ! MO function for stress
+REAL, DIMENSION(:,:,:), allocatable :: ZPHIE    ! MO function for TKE
+REAL, DIMENSION(:,:,:), allocatable :: ZDH      ! hor. grid mesh size
+REAL, DIMENSION(:,:,:), allocatable :: ZL       ! SBL length
+REAL, DIMENSION(:,:,:), allocatable :: ZZC      ! alt. where turb. is isotr.
 !-------------------------------------------------------------------------------
+
+allocate( zzz     (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+allocate( zz_o_lmo(size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+allocate( zgam    (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+allocate( zphim   (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+allocate( zphie   (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+allocate( zdh     (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+allocate( zl      (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+allocate( zzc     (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
 !
 !*     1. Initializations
 !         ---------------
diff --git a/src/MNH/rotate_wind.f90 b/src/MNH/rotate_wind.f90
index 8e991553575f154ff3bc204c64d5b1be00d4992d..779d310f0be79cd7881673fb706fe1a64a6b3c85 100644
--- a/src/MNH/rotate_wind.f90
+++ b/src/MNH/rotate_wind.f90
@@ -135,29 +135,33 @@ REAL, DIMENSION(:,:),   INTENT(OUT)  ::  PVSLOPE         ! wind component along
 !
 !       0.2  declaration of local variables
 !
-INTEGER, DIMENSION(SIZE(PDIRCOSXW,1),SIZE(PDIRCOSXW,2)) :: ILOC,JLOC
-              ! shift index to find the 4 nearest points in x and y directions
-REAL,    DIMENSION(SIZE(PDIRCOSXW,1),SIZE(PDIRCOSXW,2)) :: ZCOEFF,ZCOEFM,     &
-              ! interpolation weigths for flux and mass locations
-                                                           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, DIMENSION(:,:), allocatable :: ILOC,JLOC             ! shift index to find the 4 nearest points in x and y directions
+REAL,    DIMENSION(:,:), allocatable :: ZCOEFF,ZCOEFM,     &  ! interpolation weigths for flux and mass locations
+                                        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
-!      
+!
 !----------------------------------------------------------------------------
 
 !$acc data present( PU, PV, PW, PDIRCOSXW, PDIRCOSYW, PDIRCOSZW,  &
 !$acc &             PCOSSLOPE, PSINSLOPE, PDXX, PDYY, PDZZ, PUSLOPE, PVSLOPE )
 
+
+allocate( iloc    (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
+allocate( jloc    (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
+allocate( zcoeff  (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
+allocate( zcoefm  (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
+allocate( zuint   (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
+allocate( zvint   (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
+allocate( zwint   (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) )
+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 ) ) )
 !
 !*      1.    PRELIMINARIES
 !             -------------
diff --git a/src/MNH/sbl_depth.f90 b/src/MNH/sbl_depth.f90
index b03a5c7082a0d8ff1bc11f7c2f9fb87671f011a8..30916e244e59d25ba14ab9167cc0e9f0c731a9a1 100644
--- a/src/MNH/sbl_depth.f90
+++ b/src/MNH/sbl_depth.f90
@@ -95,16 +95,15 @@ REAL, DIMENSION(:,:),   INTENT(INOUT) :: PSBL_DEPTH! boundary layer height
 !       0.2  declaration of local variables
 !
 !
-INTEGER                                  :: JLOOP    ! loop counter
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZQ0      ! surface buoyancy flux
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZWU      ! surface friction u'w'
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZWV      ! surface friction v'w'
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZUSTAR2  ! surface friction
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSBL_DYN ! SBL wih dynamical criteria
-REAL, DIMENSION(SIZE(PFLXU,1),SIZE(PFLXU,2),SIZE(PFLXU,3)) :: ZWIND
-                                         ! intermediate wind for SBL calculation
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSBL_THER! SBL wih thermal   criteria
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZA       ! ponderation coefficient
+INTEGER                             :: JLOOP    ! loop counter
+REAL, DIMENSION(:,:),   allocatable :: ZQ0      ! surface buoyancy flux
+REAL, DIMENSION(:,:),   allocatable :: ZWU      ! surface friction u'w'
+REAL, DIMENSION(:,:),   allocatable :: ZWV      ! surface friction v'w'
+REAL, DIMENSION(:,:),   allocatable :: ZUSTAR2  ! surface friction
+REAL, DIMENSION(:,:),   allocatable :: ZSBL_DYN ! SBL wih dynamical criteria
+REAL, DIMENSION(:,:),   allocatable :: ZSBL_THER! SBL wih thermal   criteria
+REAL, DIMENSION(:,:),   allocatable :: ZA       ! ponderation coefficient
+REAL, DIMENSION(:,:,:), allocatable :: ZWIND    ! intermediate wind for SBL calculation
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_FATAL, 'GEN', 'SBL_DEPTH', 'not yet implemented' )
 #endif
@@ -120,6 +119,16 @@ if ( mppdb_initialized ) then
   !Check all inout arrays
   call Mppdb_check( psbl_depth, "Sbl_depth beg:psbl_depth" )
 end if
+
+allocate( zq0      (size( pzz, 1 ), size( pzz, 2 ) ) )
+allocate( zwu      (size( pzz, 1 ), size( pzz, 2 ) ) )
+allocate( zwv      (size( pzz, 1 ), size( pzz, 2 ) ) )
+allocate( zustar2  (size( pzz, 1 ), size( pzz, 2 ) ) )
+allocate( zsbl_dyn (size( pzz, 1 ), size( pzz, 2 ) ) )
+allocate( zsbl_ther(size( pzz, 1 ), size( pzz, 2 ) ) )
+allocate( za       (size( pzz, 1 ), size( pzz, 2 ) ) )
+
+allocate( zwind    (size( pflxu, 1 ), size( pflxu, 2 ), size( pflxu, 3 ) ) )
 !
 !* initialisations
 !
diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90
index 1e032fb389d26fa7aa5a390b46f160b604c5e8a1..ea3497e30c3ee7b1d65ac7f8692e155a5db5933a 100644
--- a/src/MNH/tke_eps_sources.f90
+++ b/src/MNH/tke_eps_sources.f90
@@ -248,7 +248,7 @@ REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PDISS        ! Dissipati prod. of TKE
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3))::         &
+REAL, DIMENSION(:,:,:), allocatable ::         &
        ZA,       & ! under diagonal elements of the tri-diagonal matrix involved
                    ! in the temporal implicit scheme
        ZRES,     & ! treated variable at t+ deltat when the turbu-
@@ -258,8 +258,6 @@ REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3))::         &
        ZFLX,     & ! horizontal or vertical flux of the treated variable
        ZSOURCE,  & ! source of evolution for the treated variable
        ZKEFF       ! effectif diffusion coeff = LT * SQRT( TKE )
-!LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG
-!                   ! 3D mask .T. if TKE < XTKEMIN
 INTEGER             :: IIB,IIE,IJB,IJE,IKB,IKE
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain 
@@ -270,9 +268,7 @@ INTEGER                :: IINFO_ll       ! return code of parallel routine
 TYPE(TFIELDDATA) :: TZFIELD
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-!$acc declare create(ZA,ZRES,ZFLX,ZSOURCE,ZKEFF)
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
 #endif
 !----------------------------------------------------------------------------
 
@@ -303,6 +299,21 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prthls, "Tke_eps_sources beg:prthls" )
 end if
 
+allocate( za     (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( zres   (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( zflx   (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( zsource(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( zkeff  (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( ztmp2_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( ztmp3_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( ztmp4_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+#endif
+
+!$acc data create( ZA, ZRES, ZFLX, ZSOURCE, ZKEFF, ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
+
 NULLIFY(TZFIELDDISS_ll)
 !
 !*       1.   PRELIMINARY COMPUTATIONS
@@ -608,4 +619,6 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE TKE_EPS_SOURCES
diff --git a/src/MNH/tm06_h.f90 b/src/MNH/tm06_h.f90
index 8df331aa0eca0a0c8116ec721ac670afb8f75fdf..561088d8dbd6a281fdd053bb945fe316f9d4e1e0 100644
--- a/src/MNH/tm06_h.f90
+++ b/src/MNH/tm06_h.f90
@@ -94,11 +94,11 @@ REAL, DIMENSION(:,:),   INTENT(INOUT) :: PBL_DEPTH ! boundary layer height
 !       0.2  declaration of local variables
 !
 !
-INTEGER                                  :: JK     ! loop counter
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZFLXZMIN ! minimum of temperature flux
-REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZBL_DEPTH! BL depth at previous time-step
-REAL                                     :: ZGROWTH  ! maximum BL growth rate
-LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: GWORK
+INTEGER                              :: JK        ! loop counter
+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)
 !----------------------------------------------------------------------------
 
@@ -116,6 +116,10 @@ if ( mppdb_initialized ) then
   call Mppdb_check( pbl_depth, "Tm06_h beg:pbl_depth" )
 end if
 
+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 ) ) )
+
 !* mixed boundary layer cannot grow more rapidly than 1800m/h
 !$acc kernels
 ZGROWTH = 2.0 ! (m/s)
diff --git a/src/MNH/tridiag.f90 b/src/MNH/tridiag.f90
index 26a22b411bfd62aa13ab3bab73f80bf5d40668fb..e07a43ddc777b07b67c222986c167cdbe8e782bb 100644
--- a/src/MNH/tridiag.f90
+++ b/src/MNH/tridiag.f90
@@ -147,6 +147,9 @@ END MODULE MODI_TRIDIAG
 USE MODD_PARAMETERS
 
 use mode_mppdb
+#ifdef MNH_OPENACC
+use mode_msg
+#endif
 
 IMPLICIT NONE
 !
@@ -167,18 +170,19 @@ REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PVARP       ! variable at t+1
 !
 !*       0.2 declarations of local variables
 !
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZY ,ZGAM 
-                                         ! RHS of the equation, 3D work array
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))                :: ZBET
-                                         ! 2D work array
-INTEGER                              :: JK            ! loop counter
-INTEGER                              :: IKB,IKE       ! inner vertical limits
-INTEGER                              :: IKT           ! array size in k direction
-INTEGER                              :: IKTB,IKTE     ! start, end of k loops in physical domain 
-
+INTEGER                             :: JK            ! loop counter
+INTEGER                             :: IKB,IKE       ! inner vertical limits
+INTEGER                             :: IKT           ! array size in k direction
+INTEGER                             :: IKTB,IKTE     ! start, end of k loops in physical domain
+REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM      ! RHS of the equation, 3D work array
+REAL, DIMENSION(:,:),   allocatable :: ZBET          ! 2D work array
 !
 ! ---------------------------------------------------------------------------
 
+#ifdef MNH_OPENACC
+call Print_msg( NVERB_FATAL, 'GEN', 'Tridiag', 'OpenACC: not yet implemented' )
+#endif
+
 if ( mppdb_initialized ) then
   !Check all in arrays
   call Mppdb_check( pvarm,   "Tridiag beg:pvarm"   )
@@ -186,6 +190,10 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prhodj,  "Tridiag beg:prhodj"  )
   call Mppdb_check( psource, "Tridiag beg:psource" )
 end if
+
+allocate( zy  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zgam(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zbet(size( pvarm, 1 ), size( pvarm, 2 ) ) )
 !
 !*      1.  COMPUTE THE RIGHT HAND SIDE
 !           ---------------------------
diff --git a/src/MNH/tridiag_thermo.f90 b/src/MNH/tridiag_thermo.f90
index c4c61cbf8940565dce7ebd67ee0c1f6b61924466..3af0031fe669af6dd19cd8f454a90f4bf052acae 100644
--- a/src/MNH/tridiag_thermo.f90
+++ b/src/MNH/tridiag_thermo.f90
@@ -179,12 +179,12 @@ REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP   ! variable at t+1      at mass poi
 !
 !*       0.2 declarations of local variables
 !
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZRHODJ_DFDDTDZ_O_DZ2
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZMZM_RHODJ
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZA, ZB, ZC
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZY ,ZGAM 
+REAL, DIMENSION(:,:,:), allocatable :: ZRHODJ_DFDDTDZ_O_DZ2
+REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ
+REAL, DIMENSION(:,:,:), allocatable :: ZA, ZB, ZC
+REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM
                                          ! RHS of the equation, 3D work array
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))                :: ZBET
+REAL, DIMENSION(:,:), allocatable   :: ZBET
                                          ! 2D work array
 INTEGER             :: JI,JJ,JK      ! loop counter
 INTEGER             :: IKB,IKE       ! inner vertical limits
@@ -194,7 +194,7 @@ 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(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
 !$acc declare create(ZTMP1_DEVICE)
 #endif
 ! ---------------------------------------------------------------------------
@@ -209,6 +209,19 @@ if ( mppdb_initialized ) then
   call Mppdb_check( pdzz,     "Tridiag_thermo beg:pdzz"     )
   call Mppdb_check( prhodj,   "Tridiag_thermo beg:prhodj"   )
 end if
+
+allocate( zrhodj_dfddtdz_o_dz2(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zmzm_rhodj          (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( za                  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zb                  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zc                  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zy                  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zgam                (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zbet                (size( pvarm, 1 ), size( pvarm, 2 ) ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+#endif
 !
 !*      1.  Preliminaries
 !           -------------
diff --git a/src/MNH/tridiag_tke.f90 b/src/MNH/tridiag_tke.f90
index 3060d23cacab7bd27c03c0c0a46371ad99f5b07a..9c9fb543957c150bcd05263d679b19adc4c318fa 100644
--- a/src/MNH/tridiag_tke.f90
+++ b/src/MNH/tridiag_tke.f90
@@ -163,15 +163,12 @@ REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PVARP       ! variable at t+1
 !
 !*       0.2 declarations of local variables
 !
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZY ,ZGAM 
-                                         ! RHS of the equation, 3D work array
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))                :: ZBET
-                                         ! 2D work array
-!$acc declare create(ZY,ZGAM,ZBET)
 INTEGER             :: JI,JJ,JK      ! loop counters
 INTEGER             :: IKB,IKE       ! inner vertical limits
 INTEGER             :: IKT          ! array size in k direction
 INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain
+REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM ! RHS of the equation, 3D work array
+REAL, DIMENSION(:,:),   allocatable :: ZBET     ! 2D work array
 !
 ! ---------------------------------------------------------------------------
 
@@ -186,6 +183,12 @@ if ( mppdb_initialized ) then
   call Mppdb_check( pdiag,   "Tridiag_tke beg:pdiag"   )
 end if
 
+allocate( zy  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zgam(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zbet(size( pvarm, 1 ), size( pvarm, 2 ) ) )
+
+!$acc data create( ZY, ZGAM, ZBET )
+
 !
 !*      1.  COMPUTE THE RIGHT HAND SIDE
 !           ---------------------------
@@ -284,6 +287,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE TRIDIAG_TKE
diff --git a/src/MNH/tridiag_w.f90 b/src/MNH/tridiag_w.f90
index 6699d45b9383ec8187bb9f09b11732451ab372a2..87da6eff113a0671986d89e68a02782adba4f152 100644
--- a/src/MNH/tridiag_w.f90
+++ b/src/MNH/tridiag_w.f90
@@ -177,15 +177,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP   ! variable at t+1      at flux poi
 !
 !*       0.2 declarations of local variables
 !
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZRHODJ_DFDDWDZ_O_DZ2
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZMZM_RHODJ
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZA, ZB, ZC
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZY ,ZGAM 
-                                         ! RHS of the equation, 3D work array
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))                :: ZBET
-                                         ! 2D work array
-!
-!$acc declare create(ZRHODJ_DFDDWDZ_O_DZ2,ZMZM_RHODJ,ZA,ZB,ZC,ZY,ZGAM,ZBET)
+REAL, DIMENSION(:,:,:), allocatable :: ZRHODJ_DFDDWDZ_O_DZ2
+REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ
+REAL, DIMENSION(:,:,:), allocatable :: ZA, ZB, ZC
+REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM ! RHS of the equation, 3D work array
+REAL, DIMENSION(:,:),   allocatable :: ZBET     ! 2D work array
 !
 INTEGER                              :: JK            ! loop counter
 INTEGER                              :: IKB,IKE,IKU   ! inner vertical limits
@@ -202,6 +198,18 @@ if ( mppdb_initialized ) then
   call Mppdb_check( pmzf_dzz, "Tridiag_w beg:pmzf_dzz" )
   call Mppdb_check( prhodj,   "Tridiag_w beg:prhodj"   )
 end if
+
+allocate( zrhodj_dfddwdz_o_dz2(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zmzm_rhodj          (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( za                  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zb                  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zc                  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zy                  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zgam                (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zbet                (size( pvarm, 1 ), size( pvarm, 2 ) ) )
+
+!$acc data create( ZRHODJ_DFDDWDZ_O_DZ2, ZMZM_RHODJ, ZA, ZB, ZC, ZY, ZGAM, ZBET )
+
 !
 !*      1.  Preliminaries
 !           -------------
@@ -365,6 +373,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE TRIDIAG_W
diff --git a/src/MNH/tridiag_wind.f90 b/src/MNH/tridiag_wind.f90
index 6aa59aa0a8bf1d9effc07eafa6c6ee6c440e97a1..b7819835b38b0caf679e27ab10b1e7f32bba5c09 100644
--- a/src/MNH/tridiag_wind.f90
+++ b/src/MNH/tridiag_wind.f90
@@ -170,22 +170,13 @@ REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PVARP       ! variable at t+1
 !
 !*       0.2 declarations of local variables
 !
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3))  :: ZY ,ZGAM 
-                                         ! RHS of the equation, 3D work array
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))                :: ZBET
-                                         ! 2D work array
 INTEGER             :: JI,JJ,JK      ! loop counters
 INTEGER             :: IKB,IKE       ! inner vertical limits
 INTEGER             :: IKT          ! array size in k direction
-INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain 
+INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain
+REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM ! RHS of the equation, 3D work array
+REAL, DIMENSION(:,:),   allocatable :: ZBET     ! 2D work array
 !
-!$acc declare create(ZY,ZGAM,ZBET)
-!
-#ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
-#endif
-
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PVARM, PA, PCOEFS, PRHODJA, PSOURCE, PVARP )
@@ -198,6 +189,13 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prhodja, "Tridiag_wind beg:prhodja" )
   call Mppdb_check( psource, "Tridiag_wind beg:psource" )
 end if
+
+allocate( zy  (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zgam(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+allocate( zbet(size( pvarm, 1 ), size( pvarm, 2 ) ) )
+
+!$acc data create( ZY, ZGAM, ZBET )
+
 !
 !*      1.  COMPUTE THE RIGHT HAND SIDE
 !           ---------------------------
@@ -304,6 +302,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !-------------------------------------------------------------------------------
 ! 
 END SUBROUTINE TRIDIAG_WIND
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index cf0d7a8b23540d494a82eff85bce28a0ea436ab8..8e7b61a10c55185dc3350f0974e3ea857f9bb3f0 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -401,7 +401,7 @@ REAL, ALLOCATABLE, DIMENSION(:,:,:) ::&
           ZFRAC_ICE,                  &  ! ri fraction of rc+ri
           ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,&  ! 3rd order moments
           ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,&  ! opposite of verticale derivate of 3rd order moments
-          ZTHLM, ZTR, ZDISS              ! initial potential temp.
+          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,           &
@@ -425,7 +425,7 @@ 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,ZLMO)
+!$acc declare create(ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M,ZUSLOPE,ZVSLOPE,ZCDUEFF,ZUSTAR,ZLMO,ZRVM,ZSFRV)
 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)
@@ -445,12 +445,13 @@ REAL                :: ZALPHA       ! proportionnality constant between Dz/2 and
 !                                   ! BL89 mixing length near the surface
 !
 REAL :: ZTIME1, ZTIME2
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3))::  ZSHEAR, ZDUDZ, ZDVDZ
+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(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE
 !$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE)
 #endif
 !
@@ -471,6 +472,10 @@ REAL, DIMENSION(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) :: ZTMP1_DEVICE,ZTMP2
 ! OUT variables
 !
 !$acc &    create ( PSIGS, PWTH, PWRC, PWSV, PDYP, PTHP, PTR, PDISS, PLEM )
+!
+! Local variables
+!
+! !$acc &    create ( ZSHEAR )
 
 if ( mppdb_initialized ) then
   !Check all in arrays
@@ -516,45 +521,68 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prsvs,      "Turb beg:prsvs"      )
 end if
 
-ALLOCATE (                                                        &
-          ZCP(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),         &
-          ZEXN(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),        &
-          ZT(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),          &
-          ZLOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),   &
-          ZLEPS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),       &
-          ZTRH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),        &
-          ZATHETA(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),     &
-          ZAMOIST(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),     &
-          ZCOEF_DISS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),  &
-          ZFRAC_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),   &
-          ZMWTH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),       &
-          ZMWR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),        &
-          ZMTH2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),       &
-          ZMR2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),        &
-          ZMTHR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),       &
-          ZFWTH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),       &
-          ZFWR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),        &
-          ZFTH2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),       &
-          ZFR2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),        &
-          ZFTHR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),       &
-          ZTHLM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),       &
-          ZTR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)),         &
-          ZDISS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))        )
-
-ALLOCATE ( ZRM(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4))   )
-
-ALLOCATE ( &
-           ZTAU11M(SIZE(PTHLT,1),SIZE(PTHLT,2)),  &
-           ZTAU12M(SIZE(PTHLT,1),SIZE(PTHLT,2)),  &
-           ZTAU22M(SIZE(PTHLT,1),SIZE(PTHLT,2)),  &
-           ZTAU33M(SIZE(PTHLT,1),SIZE(PTHLT,2)),  &
-           ZUSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)),  &
-           ZVSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)),  &
-           ZCDUEFF(SIZE(PTHLT,1),SIZE(PTHLT,2)),  &
-           ZUSTAR(SIZE(PTHLT,1),SIZE(PTHLT,2)),   &
-           ZLMO(SIZE(PTHLT,1),SIZE(PTHLT,2)),     &
-           ZRVM(SIZE(PTHLT,1),SIZE(PTHLT,2)),     &
-           ZSFRV(SIZE(PTHLT,1),SIZE(PTHLT,2))     )
+ALLOCATE (ZCP       (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZEXN      (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZT        (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZLOCPEXNM (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZLEPS     (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZTRH      (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZATHETA   (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZAMOIST   (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZCOEF_DISS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZFRAC_ICE (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+
+ALLOCATE (ZMWTH     (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZMWR      (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZMTH2     (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZMR2      (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZMTHR     (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+
+ALLOCATE (ZFWTH     (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZFWR      (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZFTH2     (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZFR2      (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZFTHR     (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+ALLOCATE (ZTHLM     (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+
+IF ( HTURBLEN == 'BL89' .OR. HTURBLEN == 'RM17' .OR. ORMC01 ) &
+  ALLOCATE ( ZRM(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) )
+
+ALLOCATE ( ZTAU11M(SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+ALLOCATE ( ZTAU12M(SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+ALLOCATE ( ZTAU22M(SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+ALLOCATE ( ZTAU33M(SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+ALLOCATE ( ZUSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+ALLOCATE ( ZVSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+ALLOCATE ( ZCDUEFF(SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+ALLOCATE ( ZLMO   (SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+IF (ORMC01) then
+  ALLOCATE ( ZUSTAR (SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+  ALLOCATE ( ZRVM   (SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+  ALLOCATE ( ZSFRV  (SIZE(PTHLT,1),SIZE(PTHLT,2)) )
+end if
+
+IF ( HCLOUD == 'KHKO' .OR. HCLOUD == 'C2R2' ) then
+  allocate( ztt   (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+  allocate( zexne (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+  allocate( zlv   (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+  allocate( zcph  (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+end if
+IF ( HTURBLEN == 'BL89' .OR. HTURBLEN == 'RM17' ) then
+  allocate( zshear(size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+end if
+IF ( HTURBLEN == 'RM17' ) then
+  allocate( zdudz (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+  allocate( zdvdz (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) )
+end if
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pthlt, 1 ), size( pthlt, 2 ), size( pthlt, 3 ) ) )
+IF (HTURBDIM=="1DIM") then
+  allocate( ztmp2_device(size( pthlt, 1 ), size( pthlt, 2 ), size( pthlt, 3 ) ) )
+  allocate( ztmp3_device(size( pthlt, 1 ), size( pthlt, 2 ), size( pthlt, 3 ) ) )
+end if
+#endif
 
 !------------------------------------------------------------------------------------------
 !
@@ -1525,8 +1553,8 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)   :: PAMOIST,PATHETA
 !*       0.2   Declarations of local variables
 !
 REAL                :: ZEPS         ! XMV / XMD
-REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZRVSAT
-REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT
+real, dimension(:,:,:), allocatable :: zrvsat
+real, dimension(:,:,:), allocatable :: zdrvsatdt
 !$acc declare create(ZRVSAT,ZDRVSATDT)
 !
 !-------------------------------------------------------------------------------
@@ -1540,6 +1568,10 @@ REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT
     call Mppdb_check( pcp,  "Compute_function_thermo beg:pcp"  )
   end if
 
+  allocate( zrvsat   ( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) )
+  allocate( zdrvsatdt( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) )
+
+
   ZEPS = XMV / XMD
 !
 !*       1.1 Lv/Cph at  t
@@ -1594,6 +1626,8 @@ REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT
   PLOCPEXN(:,:,:) = PLOCPEXN(:,:,:) / PEXN(:,:,:)
 !$acc end kernels
 
+  deallocate( zrvsat, zdrvsatdt )
+
   if ( mppdb_initialized ) then
     !Check all out arrays
     call Mppdb_check( plocpexn, "Compute_function_thermo end:plocpexn" )
@@ -1660,16 +1694,19 @@ IMPLICIT NONE
 REAL :: ZPENTE            ! Slope of the amplification straight line
 REAL :: ZCOEF_AMPL_CEI_NUL! Ordonnate at the origin of the
                           ! amplification straight line
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCOEF_AMPL
+real, dimension(:,:,:), allocatable :: zcoef_ampl
                           ! Amplification coefficient of the mixing length
                           ! when the instability criterium is verified 
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZLM_CLOUD
+real, dimension(:,:,:), allocatable :: zlm_cloud
                           ! Turbulent mixing length in the clouds
 !
 !-------------------------------------------------------------------------------
 #ifdef MNH_OPENACC
 call Print_msg( NVERB_FATAL, 'GEN', 'TURB', 'OpenACC: CLOUD_MODIF_LM not yet implemented' )
 #endif
+
+allocate( zcoef_ampl(size( put, 1 ), size( put, 2 ), size( put, 3) ) )
+allocate( zlm_cloud (size( put, 1 ), size( put, 2 ), size( put, 3) ) )
 !
 !*       1.    INITIALISATION
 !              --------------
@@ -1778,7 +1815,9 @@ IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN
   CALL IO_Field_write(TPFILE,TZFIELD,ZLM_CLOUD)
   !
 ENDIF
-!
+
+deallocate( zcoef_ampl, zlm_cloud )
+
 END SUBROUTINE CLOUD_MODIF_LM
 !
 END SUBROUTINE TURB
diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90
index 1dad0cb17813e32d584aba20a8db4ce6f1c234c0..69c208e48d2120622017b3af0af8b465b3f3bf62 100644
--- a/src/MNH/turb_hor_dyn_corr.f90
+++ b/src/MNH/turb_hor_dyn_corr.f90
@@ -229,11 +229,9 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP,PTP      ! TKE production terms
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3))       &
-                                     :: ZFLX,ZWORK
-    ! work arrays, PK is the turb. mixing coef.
-!   
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) ::ZDIRSINZW 
+REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays, PK is the turb. mixing coef.
+!
+REAL, DIMENSION(:,:),   allocatable ::ZDIRSINZW
       ! sinus of the angle between the vertical and the normal to the orography
 INTEGER             :: IKB,IKE
                                     ! Index values for the Beginning and End
@@ -241,20 +239,20 @@ INTEGER             :: IKB,IKE
 INTEGER             :: IKU                                   
 INTEGER             :: JSV          ! scalar loop counter
 !
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3))  :: GX_U_M_PUM
-REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3))  :: GY_V_M_PVM
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: GZ_W_M_PWM
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: GZ_W_M_ZWP
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: ZMZF_DZZ   ! MZF(PDZZ)
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: ZDFDDWDZ   ! formal derivative of the 
-!                                                                   ! flux (variable: dW/dz)
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: ZWP        ! W at future   time-step
-!
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDU_DZ_DZS_DX ! du/dz*dzs/dx surf
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDV_DZ_DZS_DY ! dv/dz*dzs/dy surf
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDU_DX        ! du/dx        surf
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDV_DY        ! dv/dy        surf
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDW_DZ        ! dw/dz        surf
+REAL, DIMENSION(:,:,:), allocatable :: GX_U_M_PUM
+REAL, DIMENSION(:,:,:), allocatable :: GY_V_M_PVM
+REAL, DIMENSION(:,:,:), allocatable :: GZ_W_M_PWM
+REAL, DIMENSION(:,:,:), allocatable :: GZ_W_M_ZWP
+REAL, DIMENSION(:,:,:), allocatable :: ZMZF_DZZ   ! MZF(PDZZ)
+REAL, DIMENSION(:,:,:), allocatable :: ZDFDDWDZ   ! formal derivative of the
+!                                                 ! flux (variable: dW/dz)
+REAL, DIMENSION(:,:,:), allocatable :: ZWP        ! W at future   time-step
+!
+REAL, DIMENSION(:,:,:), allocatable :: ZDU_DZ_DZS_DX ! du/dz*dzs/dx surf
+REAL, DIMENSION(:,:,:), allocatable :: ZDV_DZ_DZS_DY ! dv/dz*dzs/dy surf
+REAL, DIMENSION(:,:,:), allocatable :: ZDU_DX        ! du/dx        surf
+REAL, DIMENSION(:,:,:), allocatable :: ZDV_DY        ! dv/dy        surf
+REAL, DIMENSION(:,:,:), allocatable :: ZDW_DZ        ! dw/dz        surf
 !
 INTEGER                :: IINFO_ll      ! return code of parallel routine
 TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
@@ -262,23 +260,17 @@ TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
 REAL :: ZTIME1, ZTIME2
 
 
-REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF , ZDZZ
+REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF , ZDZZ
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
 !
-!$acc declare create(ZFLX,ZWORK,ZDIRSINZW,ZCOEFF,ZDZZ,              &
-!$acc &              GX_U_M_PUM,GY_V_M_PVM,GZ_W_M_PWM,GZ_W_M_ZWP,   &
-!$acc &              ZMZF_DZZ,ZDFDDWDZ,ZWP,                         &
-!$acc &              ZDU_DZ_DZS_DX,ZDV_DZ_DZS_DY,ZDU_DX,ZDV_DY,ZDW_DZ)
-!
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 ! --------------------------------------------------------------------------
 
-!$acc data present( PINV_PDZZ, PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ, PDIRCOSZW,         &
+!$acc data present( PK, PINV_PDZZ, PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ, PDIRCOSZW,     &
 !$acc &             PCOSSLOPE, PSINSLOPE, PRHODJ, PCDUEFF,                           &
 !$acc &             PTAU11M, PTAU12M, PTAU22M, PTAU33M,                              &
 !$acc &             PUM, PVM, PWM, PTHLM, PRM, PSVM, PUSLOPEM, PVSLOPEM, PTKEM, PLM, &
@@ -320,6 +312,42 @@ if ( mppdb_initialized ) then
   call Mppdb_check( pdp,    "Turb_hor_dyn_corr beg:pdp"    )
   call Mppdb_check( ptp,    "Turb_hor_dyn_corr beg:ptp"    )
 end if
+
+allocate( zflx (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( zwork(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+
+allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) )
+
+allocate( gx_u_m_pum(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( gy_v_m_pvm(size( pvm, 1 ), size( pvm, 2 ), size( pvm, 3 ) ) )
+allocate( gz_w_m_pwm(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( gz_w_m_zwp(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( zmzf_dzz  (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( zdfddwdz  (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( zwp       (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+
+allocate( zdu_dz_dzs_dx(size( pwm, 1 ), size( pwm, 2 ), 1 ) )
+allocate( zdv_dz_dzs_dy(size( pwm, 1 ), size( pwm, 2 ), 1 ) )
+allocate( zdu_dx       (size( pwm, 1 ), size( pwm, 2 ), 1 ) )
+allocate( zdv_dy       (size( pwm, 1 ), size( pwm, 2 ), 1 ) )
+allocate( zdw_dz       (size( pwm, 1 ), size( pwm, 2 ), 1 ) )
+
+allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+allocate( zdzz  (size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+#endif
+
+!$acc data create( ZFLX, ZWORK, ZDIRSINZW, ZCOEFF, ZDZZ,                  &
+!$acc &            GX_U_M_PUM, GY_V_M_PVM, GZ_W_M_PWM, GZ_W_M_ZWP,        &
+!$acc &            ZMZF_DZZ, ZDFDDWDZ, ZWP,                               &
+!$acc &            ZDU_DZ_DZS_DX, ZDV_DZ_DZS_DY, ZDU_DX, ZDV_DY, ZDW_DZ,  &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
+
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
@@ -1145,4 +1173,6 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE TURB_HOR_DYN_CORR
diff --git a/src/MNH/turb_hor_splt.f90 b/src/MNH/turb_hor_splt.f90
index bcbc06df3e1ba5b3031128358d386eff81199d34..6249d927c358a2e5d2093e12e3f14368872ac627 100644
--- a/src/MNH/turb_hor_splt.f90
+++ b/src/MNH/turb_hor_splt.f90
@@ -373,7 +373,7 @@ REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRRS, ZRSVS
 TYPE(LIST_ll), POINTER, SAVE :: TZFIELDS_ll
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE
 !$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE)
 #endif
 ! ---------------------------------------------------------------------------
@@ -455,6 +455,10 @@ ALLOCATE(ZINV_PDXX(SIZE(PDXX,1),SIZE(PDXX,2),SIZE(PDXX,3)))
 ALLOCATE(ZINV_PDYY(SIZE(PDYY,1),SIZE(PDYY,2),SIZE(PDYY,3)))
 ALLOCATE(ZINV_PDZZ(SIZE(PDZZ,1),SIZE(PDZZ,2),SIZE(PDZZ,3)))
 ALLOCATE(ZMZM_PRHODJ(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)))
+#ifdef MNH_OPENACC
+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 kernels
 ZINV_PDXX = 1./PDXX
@@ -754,6 +758,10 @@ DEALLOCATE(ZINV_PDXX)
 DEALLOCATE(ZINV_PDYY)
 DEALLOCATE(ZINV_PDZZ)
 DEALLOCATE(ZMZM_PRHODJ)
+#ifdef MNH_OPENACC
+deallocate( ZTMP1_DEVICE )
+deallocate( ZTMP2_DEVICE )
+#endif
 
 if ( mppdb_initialized ) then
   !Check all inout arrays
diff --git a/src/MNH/turb_hor_sv_corr.f90 b/src/MNH/turb_hor_sv_corr.f90
index 9d1980b17b0888eb5bcf556032000e8818eb929d..0523d00b0e35e6a0f4c0d86d377771cf961097c6 100644
--- a/src/MNH/turb_hor_sv_corr.f90
+++ b/src/MNH/turb_hor_sv_corr.f90
@@ -141,8 +141,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN)    ::  PSVM         ! scalar var. at t-1
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3))       &
-                                     :: ZFLX, ZA
+REAL, DIMENSION(:,:,:), allocatable :: ZFLX, ZA
 !
 INTEGER             :: JSV          ! loop counter
 INTEGER             :: IKU
@@ -181,6 +180,9 @@ if ( mppdb_initialized ) then
   call Mppdb_check( PSVM,      "Turb_hor_sv_corr beg:PSVM"      )
 end if
 
+allocate( zflx(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( za  (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+
 IKU=SIZE(PTKEM,3)
 CALL SECOND_MNH(ZTIME1)
 !
diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90
index 7130599a0a11e4ea9f64db469e3b42aead86a845..c4a20c624cedb64f76fb8f0a01764ee6750bdd4c 100644
--- a/src/MNH/turb_hor_sv_flux.f90
+++ b/src/MNH/turb_hor_sv_flux.f90
@@ -175,10 +175,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRSVS        ! var. at t+1 -split-
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3))       &
-                                     :: ZFLXX,ZFLXY
-    ! work arrays
-REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),1) :: ZWORK2D
+REAL, DIMENSION(:,:,:), allocatable :: ZFLXX, ZFLXY ! work arrays
+REAL, DIMENSION(:,:,:), allocatable :: ZWORK2D
 !
 REAL :: ZCSV          !constant for the scalar flux
 
@@ -187,7 +185,7 @@ INTEGER             :: IKB,IKE
                                     ! mass points of the domain  
 INTEGER             :: JSV          ! loop counter
 INTEGER             :: ISV          ! number of scalar var.
-REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF 
+REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
 !
@@ -196,9 +194,8 @@ TYPE(TFIELDDATA) :: TZFIELD
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,&
-                                                           ZTMP4_DEVICE,ZTMP5_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, &
+                                       ZTMP4_DEVICE, ZTMP5_DEVICE
 #endif
 ! ---------------------------------------------------------------------------
 
@@ -231,6 +228,25 @@ if ( mppdb_initialized ) then
   !Check all inout arrays
   call Mppdb_check( prsvs, "Turb_hor_sv_flux beg:prsvs" )
 end if
+
+allocate( zflxx(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( zflxy(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+
+allocate( zwork2d(size( psvm, 1 ), size( psvm, 2 ), 1 ) )
+
+allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( ztmp2_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( ztmp3_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( ztmp4_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( ztmp5_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+#endif
+
+!$acc data create( ZFLXX, ZFLXY, ZWORK2D, ZCOEFF, &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE )
+
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
@@ -603,4 +619,6 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE TURB_HOR_SV_FLUX
diff --git a/src/MNH/turb_hor_thermo_corr.f90 b/src/MNH/turb_hor_thermo_corr.f90
index a498056b10a95d5421c3c6206e5a7f1f5ca92347..4b26c5d5ad80b47e1114d825f145b095d9167554 100644
--- a/src/MNH/turb_hor_thermo_corr.f90
+++ b/src/MNH/turb_hor_thermo_corr.f90
@@ -197,25 +197,20 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PSIGS
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))       &
-                                     :: ZFLX,ZWORK,ZA
-    ! work arrays
-!$acc declare create(ZFLX,ZWORK,ZA)
+REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK,ZA ! work arrays
 !   
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
-REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF 
+REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
 REAL :: ZTIME1, ZTIME2
 TYPE(TFIELDDATA) :: TZFIELD
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: 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)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE
 #endif
 !
 ! ---------------------------------------------------------------------------
@@ -251,6 +246,28 @@ if ( mppdb_initialized ) then
   !Check all inout arrays
   call Mppdb_check( psigs, "Turb_hor_thermo_corr beg:psigs" )
 end if
+
+allocate( zflx (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zwork(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( za   (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+
+allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp5_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp6_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+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( ZFLX, ZWORK, ZA, ZCOEFF,                                    &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, &
+!$acc &            ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE  )
+
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
@@ -842,4 +859,6 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE TURB_HOR_THERMO_CORR
diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90
index 4d047394a6377774d65f8518455e98c254790f8d..bdc9809ebdfe7c067bf301708d0eff81d295c254 100644
--- a/src/MNH/turb_hor_thermo_flux.f90
+++ b/src/MNH/turb_hor_thermo_flux.f90
@@ -207,26 +207,20 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRRS         ! var. at t+1 -split-
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))       &
-                                     :: ZFLX,ZFLXC
-    ! work arrays
-!   
-!! REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))  :: ZVPTV
+REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZFLXC ! work arrays
+!! REAL, DIMENSION(:,:,:), allocatable :: ZVPTV
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
-REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF 
+REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
-!$acc declare create(ZFLX,ZFLXC,ZCOEFF)
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: 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)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE
 #endif
 !
 TYPE(TFIELDDATA) :: TZFIELD
@@ -268,6 +262,28 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prthls, "Turb_hor_thermo_flux beg:prthls" )
   call Mppdb_check( prrs,   "Turb_hor_thermo_flux beg:prrs"   )
 end if
+
+allocate( zflx (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zflxc(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+! allocate( zvptv(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+
+allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp5_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp6_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+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( ZFLX, ZFLXC, ZCOEFF,                                    &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, &
+!$acc &            ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE  )
+
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
@@ -1675,4 +1691,6 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE TURB_HOR_THERMO_FLUX
diff --git a/src/MNH/turb_hor_tke.f90 b/src/MNH/turb_hor_tke.f90
index 59d40b8929090cd1085592aa477b2dc9f5bb6c56..b857a251f3ee3f221d3f0077ba21c2772b2bf82f 100644
--- a/src/MNH/turb_hor_tke.f90
+++ b/src/MNH/turb_hor_tke.f90
@@ -125,19 +125,18 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   ::  PTRH     ! horizontal transport of T
 !
 INTEGER :: IKB, IKU
 !
-REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF 
+REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
 !
-REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: ZFLX
+REAL, DIMENSION(:,:,:), allocatable :: ZFLX
 !
 !$acc declare create(ZCOEFF,ZFLX)
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
 #endif
 ! ---------------------------------------------------------------------------
 
@@ -163,6 +162,21 @@ if ( mppdb_initialized ) then
   !Check all inout arrays
   call Mppdb_check( ptrh, "Turb_hor_tke beg:ptrh" )
 end if
+
+allocate( zflx (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+
+allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( ztmp2_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( ztmp3_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+allocate( ztmp4_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+#endif
+
+!$acc data create( ZCOEFF, ZFLX, &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
+
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
@@ -422,6 +436,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE TURB_HOR_TKE
diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90
index 12f8d45f1406417043cbb0af4789d8865cd78807..e11c9959921b3f8161ec1914031e82ed399e201a 100644
--- a/src/MNH/turb_hor_uv.f90
+++ b/src/MNH/turb_hor_uv.f90
@@ -204,32 +204,27 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP          ! TKE production terms
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3))       &
-                                     :: ZFLX,ZWORK
-    ! work arrays
-!   
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) ::ZDIRSINZW 
+REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays
+!
+REAL, DIMENSION(:,:),   allocatable :: ZDIRSINZW
       ! sinus of the angle between the vertical and the normal to the orography
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
 !
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3))  :: GY_U_UV_PUM
-REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3))  :: GX_V_UV_PVM
-!$acc declare create(ZFLX,ZWORK,ZDIRSINZW,GY_U_UV_PUM,GX_V_UV_PVM)
+REAL, DIMENSION(:,:,:), allocatable :: GY_U_UV_PUM
+REAL, DIMENSION(:,:,:), allocatable :: GX_V_UV_PVM
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP1_DEVICE
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP2_DEVICE
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP3_DEVICE
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP4_DEVICE
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP5_DEVICE
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP6_DEVICE
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP7_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE, &
-!$acc &              ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP6_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP7_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 ! ---------------------------------------------------------------------------
@@ -269,6 +264,29 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prvs,   "Turb_hor_uv beg:prvs"   )
   call Mppdb_check( pdp,    "Turb_hor_uv beg:pdp"    )
 end if
+
+allocate( zflx (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( zwork(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+
+allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) )
+
+allocate( gy_u_uv_pum(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( gx_v_uv_pvm(size( pvm, 1 ), size( pvm, 2 ), size( pvm, 3 ) ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( ztmp2_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( ztmp3_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( ztmp4_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( ztmp5_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( ztmp6_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( ztmp7_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+#endif
+
+!$acc data create( ZFLX, ZWORK, ZDIRSINZW, GY_U_UV_PUM, GX_V_UV_PVM,       &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, &
+!$acc &            ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE                )
+
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
@@ -694,4 +712,6 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE TURB_HOR_UV
diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90
index d57b580fb819dc2b0ec6907a79df99a5ffd1e573..102bc4322650b448d75762786a537d27ac91d775 100644
--- a/src/MNH/turb_hor_uw.f90
+++ b/src/MNH/turb_hor_uw.f90
@@ -179,26 +179,22 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP          ! TKE production terms
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))       &
-                                     :: ZFLX,ZWORK
-    ! work arrays
-!   
+REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays
+!
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
 INTEGER             :: JSV          ! scalar loop counter
 !
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: GX_W_UW_PWM
-!$acc declare create(ZFLX,ZWORK,GX_W_UW_PWM)
+REAL, DIMENSION(:,:,:), allocatable :: GX_W_UW_PWM
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP1_DEVICE
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP2_DEVICE
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP3_DEVICE
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP4_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 ! ---------------------------------------------------------------------------
@@ -231,6 +227,22 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prws, "Turb_hor_uw beg:prws" )
   call Mppdb_check( pdp,  "Turb_hor_uw beg:pdp"  )
 end if
+
+allocate( zflx (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( zwork(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+
+allocate( gx_w_uw_pwm(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( ztmp2_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( ztmp3_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( ztmp4_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+#endif
+
+!$acc data create( ZFLX, ZWORK, GX_W_UW_PWM, &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
+
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
@@ -506,4 +518,6 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE TURB_HOR_UW
diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90
index 21a5965d633854df9deb7b6559e495aec37b2a3e..8f92eb5987a5621a03597db7db609b0d1540d6dd 100644
--- a/src/MNH/turb_hor_vw.f90
+++ b/src/MNH/turb_hor_vw.f90
@@ -177,29 +177,22 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP          ! TKE production terms
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))       &
-                                     :: ZFLX,ZWORK
-    ! work arrays
-!$acc declare create(ZFLX)
-!$acc declare device_resident(ZWORK)
-!
-!! REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: ZVPTV
+REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays
+!! REAL, DIMENSION(:,:,:), allocatable :: ZVPTV
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
 INTEGER             :: JSV          ! scalar loop counter
 !
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))  :: GY_W_VW_PWM
-!$acc declare create(GY_W_VW_PWM)
+REAL, DIMENSION(:,:,:), allocatable :: GY_W_VW_PWM
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP1_DEVICE
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP2_DEVICE
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP3_DEVICE
-REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP4_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 ! ---------------------------------------------------------------------------
@@ -231,6 +224,22 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prws, "Turb_hor_vw beg:prws" )
   call Mppdb_check( pdp,  "Turb_hor_vw beg:pdp"  )
 end if
+
+allocate( zflx (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( zwork(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+
+allocate( gy_w_vw_pwm(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( ztmp2_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( ztmp3_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+allocate( ztmp4_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+#endif
+
+!$acc data create( ZFLX, ZWORK, GY_W_VW_PWM, &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
+
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
@@ -544,4 +553,6 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 END SUBROUTINE TURB_HOR_VW
diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90
index a6ac40f97a817a518a698ad5e245f8056d853ad0..72f71a8327d220b68018461b7c4034f30de70ea2 100644
--- a/src/MNH/turb_ver.f90
+++ b/src/MNH/turb_ver.f90
@@ -219,7 +219,7 @@ END MODULE MODI_TURB_VER
 !!    --------
 !!      GX_U_M, GY_V_M, GZ_W_M :  cartesian gradient operators 
 !!      GX_U_UW,GY_V_VW	         (X,Y,Z) represent the direction of the gradient
-!!                               _(M,U,...)_ represent the localization of the 
+!!                               _(M,U,...)_ represent the localization of the
 !!                               field to be derivated
 !!                               _(M,UW,...) represent the localization of the 
 !!                               field	derivated
@@ -440,7 +440,7 @@ REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV       ! scalar flux
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))  ::  &
+REAL, DIMENSION(:,:,:), allocatable ::  &
        ZBETA,    & ! buoyancy coefficient
        ZSQRT_TKE,& ! sqrt(e)
        ZDTH_DZ,  & ! d(th)/dz
@@ -462,7 +462,7 @@ REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))  ::  &
        ZTHLP,    & ! guess of potential temperature due to vert. turbulent flux
        ZRP         ! guess of total water due to vert. turbulent flux
 
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV)  ::  &
+REAL, DIMENSION(:,:,:,:), allocatable ::  &
        ZPSI_SV,  & ! Prandtl number for scalars
        ZREDS1,   & ! 1D Redeslperger number R_sv
        ZRED2THS, & ! 3D Redeslperger number R*2_thsv
@@ -490,12 +490,7 @@ TYPE(TFIELDDATA) :: TZFIELD
 !$acc &             PFWTH, PFWR, PFTH2, PFR2, PFTHR, PBL_DEPTH,                     &
 !$acc &             PSBL_DEPTH, PLMO,                                               &
 !$acc &             PRUS, PRVS, PRWS, PRTHLS, PRRS, PRSVS,                          &
-!$acc &             PDP, PTP, PSIGS, PWTH, PWRC, PWSV )                             &
-
-!$acc &    create(  ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, ZRED2R3, ZRED2THR3,&
-!$acc &             ZBLL_O_E, ZETHETA, ZEMOIST, ZREDTH1, ZREDR1,                    &
-!$acc &             ZPHI3, ZPSI3, ZD, ZWTHV, ZWU, ZWV, ZTHLP, ZRP,                  &
-!$acc &             ZPSI_SV, ZREDS1, ZRED2THS, ZRED2RS )
+!$acc &             PDP, PTP, PSIGS, PWTH, PWRC, PWSV )
 
 if ( mppdb_initialized ) then
   !Check all in arrays
@@ -545,7 +540,6 @@ if ( mppdb_initialized ) then
   !Check all inout arrays
   call Mppdb_check( pbl_depth,  "Turb_ver beg:pbl_depth"  )
   call Mppdb_check( psbl_depth, "Turb_ver beg:psbl_depth" )
-  call Mppdb_check( plmo,       "Turb_ver beg:plmo"       )
   call Mppdb_check( prus,       "Turb_ver beg:prus"       )
   call Mppdb_check( prvs,       "Turb_ver beg:prvs"       )
   call Mppdb_check( prws,       "Turb_ver beg:prws"       )
@@ -553,6 +547,38 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prsvs,      "Turb_ver beg:prsvs"      )
   call Mppdb_check( prrs,       "Turb_ver beg:prrs"       )
 end if
+
+allocate( zbeta    (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zsqrt_tke(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zdth_dz  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zdr_dz   (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zred2th3 (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zred2r3  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zred2thr3(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zbll_o_e (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zetheta  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zemoist  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zredth1  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zredr1   (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zphi3    (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zpsi3    (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zd       (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zwthv    (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zwu      (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zwv      (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zthlp    (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zrp      (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+
+allocate( zpsi_sv (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ), nsv ) )
+allocate( zreds1  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ), nsv ) )
+allocate( zred2ths(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ), nsv ) )
+allocate( zred2rs (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ), nsv ) )
+
+!$acc data create(  ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, ZRED2R3, ZRED2THR3,&
+!$acc &             ZBLL_O_E, ZETHETA, ZEMOIST, ZREDTH1, ZREDR1,                    &
+!$acc &             ZPHI3, ZPSI3, ZD, ZWTHV, ZWU, ZWV, ZTHLP, ZRP,                  &
+!$acc &             ZPSI_SV, ZREDS1, ZRED2THS, ZRED2RS )
+
 !
 !*       1.   PRELIMINARIES
 !             -------------
@@ -822,7 +848,6 @@ if ( mppdb_initialized ) then
   !Check all inout arrays
   call Mppdb_check( pbl_depth,  "Turb_ver end:pbl_depth"  )
   call Mppdb_check( psbl_depth, "Turb_ver end:psbl_depth" )
-  call Mppdb_check( plmo,       "Turb_ver end:plmo"       )
   call Mppdb_check( prus,       "Turb_ver end:prus"       )
   call Mppdb_check( prvs,       "Turb_ver end:prvs"       )
   call Mppdb_check( prws,       "Turb_ver end:prws"       )
@@ -840,5 +865,7 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 END SUBROUTINE TURB_VER
diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90
index 0649f04cf68103bc860631b2245d93fda9768cba..c8aab0d8027d6a6a775c014b4d533baf95991140 100644
--- a/src/MNH/turb_ver_dyn_flux.f90
+++ b/src/MNH/turb_ver_dyn_flux.f90
@@ -376,11 +376,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)  ::  PDP          ! Dynamic TKE production t
 !*       0.2  declaration of local variables
 !
 !
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2))  :: ZDIRSINZW ! sinus of the angle
+REAL, DIMENSION(:,:), allocatable  :: ZDIRSINZW ! sinus of the angle
                    ! between the normal and the vertical at the surface
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),1):: ZCOEFS    ! coeff. for the 
+REAL, DIMENSION(:,:,:), allocatable :: ZCOEFS    ! coeff. for the
                    ! implicit scheme for the wind at the surface
-REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3))  ::  &
+REAL, DIMENSION(:,:,:), allocatable ::  &
        ZA, &       ! under diagonal elements of the tri-diagonal matrix involved
                    ! in the temporal implicit scheme (also used to store coefficient
                    ! J in Section 5)
@@ -396,7 +396,7 @@ INTEGER             :: IIB,IIE, &   ! I index values for the Beginning and End
 INTEGER             :: IKT          ! array size in k direction
 INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain
 INTEGER             :: JSV          ! scalar loop counter
-REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1) :: ZCOEFFLXU, &
+REAL, DIMENSION(:,:,:), allocatable :: ZCOEFFLXU, &
                                     ZCOEFFLXV, ZUSLOPEM, ZVSLOPEM
                                     ! coefficients for the surface flux
                                     ! evaluation and copy of PUSLOPEM and
@@ -405,11 +405,8 @@ INTEGER             :: IIU,IJU      ! size of array in x,y,z directions
 !
 REAL :: ZTIME1, ZTIME2
 !
-!$acc declare create(ZDIRSINZW,ZCOEFS,ZA,ZRES,ZFLXZ,ZSOURCE,ZKEFF,ZCOEFFLXU,ZCOEFFLXV,ZUSLOPEM,ZVSLOPEM)
-!
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 !----------------------------------------------------------------------------
@@ -433,7 +430,33 @@ if ( mppdb_initialized ) then
   call Mppdb_check( pwv, "Turb_ver_dyn_flux end:pwv" )
   call Mppdb_check( pdp, "Turb_ver_dyn_flux end:pdp" )
 end if
-!
+
+allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) )
+
+allocate( zcoefs   (size( pum, 1 ), size( pum, 2 ), 1 ) )
+
+allocate( za       (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( zres     (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( zflxz    (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( zsource  (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+allocate( zkeff    (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) )
+
+allocate( zcoefflxu(size( pdzz, 1 ), size( pdzz, 2 ), 1 ) )
+allocate( zcoefflxv(size( pdzz, 1 ), size( pdzz, 2 ), 1 ) )
+allocate( zuslopem (size( pdzz, 1 ), size( pdzz, 2 ), 1 ) )
+allocate( zvslopem (size( pdzz, 1 ), size( pdzz, 2 ), 1 ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+#endif
+
+!$acc data create( zdirsinzw, zcoefs, za, zres, zflxz, zsource, zkeff, zcoefflxu, zcoefflxv, zuslopem, zvslopem, &
+!$acc &            ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device )
+
+                                    !
 !*       1.   PRELIMINARIES
 !             -------------
 ZA=XUNDEF
@@ -1337,6 +1360,8 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE TURB_VER_DYN_FLUX
diff --git a/src/MNH/turb_ver_sv_corr.f90 b/src/MNH/turb_ver_sv_corr.f90
index 1f73e0c12079375af14c1300faff2fa3f14a0a26..cdac705065b008b6669450c203d04420c9e671e3 100644
--- a/src/MNH/turb_ver_sv_corr.f90
+++ b/src/MNH/turb_ver_sv_corr.f90
@@ -161,8 +161,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PPSI_SV      ! Inv.Turb.Sch.for scalars
 !*       0.2  declaration of local variables
 !
 !
-REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3))  ::  &
-       ZA, ZFLXZ
+REAL, DIMENSION(:,:,:), allocatable :: ZA, ZFLXZ
 !
 REAL :: ZCSV          !constant for the scalar flux
 !
@@ -199,6 +198,9 @@ if ( mppdb_initialized ) then
   call Mppdb_check( ppsi_sv,   "Turb_ver_sv_corr beg:ppsi_sv"   )
 end if
 
+allocate( za   (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( zflxz(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+
 CALL SECOND_MNH(ZTIME1)
 !
 IF(LBLOWSNOW) THEN
diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90
index fab9ce46ef8304945c9fe223f1d75ced66905d40..6a2f8fcba1a92ee14544c1bc0ef0b49f053c1331 100644
--- a/src/MNH/turb_ver_sv_flux.f90
+++ b/src/MNH/turb_ver_sv_flux.f90
@@ -341,7 +341,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(OUT)  :: PWSV        ! scalar flux
 !*       0.2  declaration of local variables
 !
 !
-REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3))  ::  &
+REAL, DIMENSION(:,:,:), allocatable  ::  &
        ZA, &       ! under diagonal elements of the tri-diagonal matrix involved
                    ! in the temporal implicit scheme (also used to store coefficient
                    ! J in Section 5)
@@ -390,6 +390,12 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prsvs, "Turb_ver_sv_flux beg:prsvs" )
 end if
 
+allocate( za     (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( zres   (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( zflxz  (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( zsource(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+allocate( zkeff  (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) )
+
 IKB=KKA+JPVEXT_TURB*KKL
 IKE=KKU-JPVEXT_TURB*KKL
 IKT=SIZE(PSVM,3)
diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90
index 567c092ac9417445bbc136c99c38d1e0c4ffb0be..4a34347bc1887115706e0b7c625202b9872ee9d3 100644
--- a/src/MNH/turb_ver_thermo_corr.f90
+++ b/src/MNH/turb_ver_thermo_corr.f90
@@ -422,15 +422,12 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)  ::  PSIGS     ! Vert. part of Sigma_s at
 !*       0.2  declaration of local variables
 !
 !
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))  ::  &
-       ZA,       & ! work variable for wrc
+REAL, DIMENSION(:,:,:), allocatable ::  &
        ZFLXZ,    & ! vertical flux of the treated variable
-       ZSOURCE,  & ! source of evolution for the treated variable
        ZKEFF,    & ! effectif diffusion coeff = LT * SQRT( TKE )
        ZF,       & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th)
        ZDFDDTDZ, & ! dF/d(dTh/dz)
-       ZDFDDRDZ, & ! dF/d(dr/dz)
-       Z3RDMOMENT  ! 3 order term in flux or variance equation
+       ZDFDDRDZ    ! dF/d(dr/dz)
 INTEGER             :: IKB,IKE      ! I index values for the Beginning and End
                                     ! mass points of the domain in the 3 direct.
 INTEGER             :: I1,I2        ! For ZCOEFF allocation
@@ -447,11 +444,9 @@ LOGICAL :: GFR2     ! flag to use w'r'2
 LOGICAL :: GFWR     ! flag to use w'2r'
 LOGICAL :: GFTHR    ! flag to use w'th'r'
 !
-!$acc declare create(ZA,ZFLXZ,ZSOURCE,ZKEFF,ZF,ZDFDDTDZ,ZDFDDRDZ,Z3RDMOMENT,ZCOEFF)
-!
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE,ZTMP8_DEVICE
+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
@@ -527,7 +522,29 @@ IKE=KKU-JPVEXT_TURB*KKL
 I1=MIN(KKA+JPVEXT_TURB*KKL,KKA+JPVEXT_TURB*KKL+2*KKL)
 I2=MAX(KKA+JPVEXT_TURB*KKL,KKA+JPVEXT_TURB*KKL+2*KKL)
 
-ALLOCATE(ZCOEFF(SIZE(PDZZ,1),SIZE(PDZZ,2),I1:I2))
+allocate( zflxz     (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zkeff     (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zf        (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zdfddtdz  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zdfddrdz  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+
+allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), i1 : i2 ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp5_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp6_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+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 )
+
 !
 GUSERV = (KRR/=0)
 !
@@ -1440,11 +1457,6 @@ END IF
 !$acc end kernels
   END IF
 
-!
-!        4.6  Deallocate
-!
-  DEALLOCATE(ZCOEFF)
-
 if ( mppdb_initialized ) then
   !Check all out arrays
   call Mppdb_check( psigs, "Turb_ver_thermo_corr beg:psigs" )
@@ -1452,5 +1464,7 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 END SUBROUTINE TURB_VER_THERMO_CORR
diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90
index e650cb5695251e1073fb774e5f0d36f1e1984752..06dc998bdb9880e50070decbe042ef967e800ea7 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.f90
@@ -451,20 +451,10 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PWRC       ! cloud water flux
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))  ::  &
-       ZA,       & ! work variable for wrc or LES computation
-       ZFLXZ,    & ! vertical flux of the treated variable
-       ZSOURCE,  & ! source of evolution for the treated variable
-       ZKEFF,    & ! effectif diffusion coeff = LT * SQRT( TKE )
-       ZF,       & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th)
-       ZDFDDTDZ, & ! dF/d(dTh/dz)
-       ZDFDDRDZ, & ! dF/d(dr/dz)
-       Z3RDMOMENT  ! 3 order term in flux or variance equation
-!$acc declare create(ZA,ZFLXZ,ZSOURCE,ZKEFF,ZF,ZDFDDTDZ,ZDFDDRDZ,Z3RDMOMENT)
 INTEGER             :: IKB,IKE      ! I index values for the Beginning and End
                                     ! mass points of the domain in the 3 direct.
 INTEGER             :: IKT          ! array size in k direction
-INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain 
+INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain
 !
 REAL :: ZTIME1, ZTIME2
 !
@@ -476,9 +466,17 @@ LOGICAL :: GFR2     ! flag to use w'r'2
 LOGICAL :: GFWR     ! flag to use w'2r'
 LOGICAL :: GFTHR    ! flag to use w'th'r'
 !
+REAL, DIMENSION(:,:,:), allocatable ::  &
+       ZA,       & ! work variable for wrc or LES computation
+       ZFLXZ,    & ! vertical flux of the treated variable
+       ZSOURCE,  & ! source of evolution for the treated variable
+       ZKEFF,    & ! effectif diffusion coeff = LT * SQRT( TKE )
+       ZF,       & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th)
+       ZDFDDTDZ, & ! dF/d(dTh/dz)
+       ZDFDDRDZ, & ! dF/d(dr/dz)
+       Z3RDMOMENT  ! 3 order term in flux or variance equation
 #ifdef MNH_OPENACC
-REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE)
+REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 !----------------------------------------------------------------------------
@@ -547,6 +545,26 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prthls,    "Turb_ver_thermo_flux beg:prthls"    )
   call Mppdb_check( prrs,      "Turb_ver_thermo_flux beg:prrs"      )
 end if
+
+allocate( za        (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zflxz     (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zsource   (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zkeff     (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zf        (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zdfddtdz  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( zdfddrdz  (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( z3rdmoment(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+
+#ifdef MNH_OPENACC
+allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+#endif
+
+!$acc data create( ZA, ZFLXZ, ZSOURCE, ZKEFF, ZF, ZDFDDTDZ, ZDFDDRDZ, Z3RDMOMENT,  &
+!$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
+
 !
 !*       1.   PRELIMINARIES
 !             -------------
@@ -1449,5 +1467,7 @@ end if
 
 !$acc end data
 
+!$acc end data
+
 !----------------------------------------------------------------------------
 END SUBROUTINE TURB_VER_THERMO_FLUX