From 62ce784b8534f0521785639fad46d241075a77d8 Mon Sep 17 00:00:00 2001
From: Juan Escobar <escj@aero.obs-mip.fr>
Date: Tue, 7 Jul 2020 11:41:16 +0200
Subject: [PATCH] Juan 07/07/2020 : PGI BUG partially present , for CTURB =
 "TKEL" replace allocatable -> pointer,contiguous ; allocate ->
 MNH_ALLOCATE_ZT*D ; Some ARRAY SYNTAXE , with implicit copy inrelevenant ->
 DO CONCURRENT

---
 src/MNH/advection_metsv.f90      | 272 +++++++++++++++-------
 src/MNH/emoist.f90               | 121 ++++++----
 src/MNH/etheta.f90               |  52 +++--
 src/MNH/gradient_u.f90           | 103 ++++++---
 src/MNH/gradient_v.f90           | 123 ++++++----
 src/MNH/gradient_w.f90           |  82 ++++---
 src/MNH/mode_mnh_zwork.f90       | 349 ++++++++++++++++++++++++++---
 src/MNH/mode_prandtl.f90         |  81 +++++--
 src/MNH/ppm_met.f90              |   2 +-
 src/MNH/prandtl.f90              | 373 ++++++++++++++++++++-----------
 src/MNH/tke_eps_sources.f90      |  66 ++++--
 src/MNH/tridiag_thermo.f90       | 238 ++++++++++++--------
 src/MNH/tridiag_tke.f90          | 117 ++++++----
 src/MNH/tridiag_w.f90            | 216 +++++++++++-------
 src/MNH/tridiag_wind.f90         | 125 +++++++----
 src/MNH/turb.f90                 | 293 +++++++++++++++++-------
 src/MNH/turb_hor_dyn_corr.f90    | 254 ++++++++++++++-------
 src/MNH/turb_hor_splt.f90        | 102 +++++++--
 src/MNH/turb_hor_sv_flux.f90     |  59 +++--
 src/MNH/turb_hor_thermo_corr.f90 |  69 ++++--
 src/MNH/turb_hor_thermo_flux.f90 | 166 ++++++++++----
 src/MNH/turb_hor_tke.f90         | 101 +++++++--
 src/MNH/turb_hor_uv.f90          | 203 +++++++++++------
 src/MNH/turb_hor_uw.f90          | 129 +++++++----
 src/MNH/turb_hor_vw.f90          | 111 ++++++---
 src/MNH/turb_ver.f90             | 100 ++++++---
 src/MNH/turb_ver_dyn_flux.f90    | 176 +++++++++++----
 src/MNH/turb_ver_thermo_corr.f90 | 150 +++++++++----
 src/MNH/turb_ver_thermo_flux.f90 | 119 +++++++---
 29 files changed, 3086 insertions(+), 1266 deletions(-)

diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index abcc83011..1cc768b4e 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -179,6 +179,9 @@ USE MODI_PPM_SCALAR
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
 USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D, &
+     MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D, &
+     MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D
 #endif
 #ifdef MNH_BITREP
 USE MODI_BITREP
@@ -232,45 +235,52 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRTKES_ADV  ! Advection TKE source te
 !*       0.2   declarations of local variables
 !
 !
-REAL, DIMENSION(:,:,:),allocatable :: ZRUCPPM
-REAL, DIMENSION(:,:,:),allocatable :: ZRVCPPM
-REAL, DIMENSION(:,:,:),allocatable :: ZRWCPPM
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRUCPPM
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRVCPPM
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRWCPPM
                                                   ! contravariant
                                                   ! components
                                                   ! of momentum
-REAL, DIMENSION(:,:,:),allocatable :: ZCFLU
-REAL, DIMENSION(:,:,:),allocatable :: ZCFLV
-REAL, DIMENSION(:,:,:),allocatable :: ZCFLW
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZCFLU
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZCFLV
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZCFLW
 !                                                 ! CFL numbers on each direction
-REAL, DIMENSION(:,:,:),allocatable :: ZCFL
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZCFL
 !                                                 ! CFL number
+INTEGER :: IZRUCPPM,IZRVCPPM,IZRWCPPM,IZCFLU,IZCFLV,IZCFLW,IZCFL
 !
 REAL :: ZCFLU_MAX, ZCFLV_MAX, ZCFLW_MAX, ZCFL_MAX ! maximum CFL numbers
 !
-REAL, DIMENSION(:,:,:),allocatable :: ZTH
-REAL, DIMENSION(:,:,:),allocatable :: ZTKE
-REAL, DIMENSION(:,:,:),allocatable :: ZRTHS_OTHER
-REAL, DIMENSION(:,:,:),allocatable :: ZRTKES_OTHER
-REAL, DIMENSION(:,:,:),allocatable :: ZRTHS_PPM
-REAL, DIMENSION(:,:,:),allocatable :: ZRTKES_PPM
-REAL, DIMENSION(:,:,:,:),allocatable :: ZR
-REAL, DIMENSION(:,:,:,:),allocatable :: ZSV
-REAL, DIMENSION(:,:,:,:),allocatable :: ZSNWC
-REAL, DIMENSION(:,:,:,:),allocatable :: ZSNWC_INIT
-REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZTH
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZTKE
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRTHS_OTHER
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRTKES_OTHER
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRTHS_PPM
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRTKES_PPM
+INTEGER :: IZTH,IZTKE,IZRTHS_OTHER,IZRTKES_OTHER,IZRTHS_PPM,IZRTKES_PPM
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZR
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZSV
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZSNWC
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZSNWC_INIT
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSNWCS
+INTEGER :: IZR,IZSV,IZSNWC,IZSNWC_INIT,IZRSNWCS
 ! Guess at the sub time step
-REAL, DIMENSION(:,:,:,:),allocatable :: ZRRS_OTHER
-REAL, DIMENSION(:,:,:,:),allocatable :: ZRSVS_OTHER
-REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS_OTHER
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRRS_OTHER
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSVS_OTHER
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSNWCS_OTHER
+INTEGER :: IZRRS_OTHER,IZRSVS_OTHER,IZRSNWCS_OTHER
 ! Tendencies since the beginning of the time step
-REAL, DIMENSION(:,:,:,:),allocatable :: ZRRS_PPM
-REAL, DIMENSION(:,:,:,:),allocatable :: ZRSVS_PPM
-REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS_PPM
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRRS_PPM
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSVS_PPM
+REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSNWCS_PPM
+INTEGER :: IZRRS_PPM,IZRSVS_PPM,IZRSNWCS_PPM   
 ! Guess at the end of the sub time step
-REAL, DIMENSION(:,:,:),allocatable :: ZRHOX1,ZRHOX2
-REAL, DIMENSION(:,:,:),allocatable :: ZRHOY1,ZRHOY2
-REAL, DIMENSION(:,:,:),allocatable :: ZRHOZ1,ZRHOZ2
-REAL, DIMENSION(:,:,:),allocatable :: ZT,ZEXN,ZLV,ZLS,ZCPH
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRHOX1,ZRHOX2
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRHOY1,ZRHOY2
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRHOZ1,ZRHOZ2
+REAL, DIMENSION(:,:,:),pointer , contiguous :: ZT,ZEXN,ZLV,ZLS,ZCPH
+INTEGER :: IZRHOX1,IZRHOX2,IZRHOY1,IZRHOY2,IZRHOZ1,IZRHOZ2 &
+          ,IZT,IZEXN,IZLV,IZLS,IZCPH 
 
 ! Temporary advected rhodj for PPM routines
 !
@@ -291,6 +301,9 @@ INTEGER             :: IIB, IIE, IJB, IJE,IKB,IKE
 INTEGER :: IZ1, IZ2
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JK
 !-------------------------------------------------------------------------------
 !$acc data present( PUT, PVT, PWT, PTHT, PTKET, PRHODJ, PPABST, PRT, PSVT, PTHVREF, &
 !$acc &             PDXX, PDYY, PDZZ, PDZX, PDZY, PRTHS, PRTKES, PRRS, PRSVS, PRTHS_CLD, PRRS_CLD, PRSVS_CLD, PRTKES_ADV )
@@ -322,43 +335,87 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRSVS,"ADVECTION_METSV beg:PRSVS")
 END IF
 
-allocate( ZRUCPPM      ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZRVCPPM      ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZRWCPPM      ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZCFLU        ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZCFLV        ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZCFLW        ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZCFL         ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZTH          ( SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3) )               )
-allocate( ZTKE         ( SIZE(PTKET,1), SIZE(PTKET,2), SIZE(PTKET,3) )               )
-allocate( ZRTHS_OTHER  ( SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3) )               )
-allocate( ZRTKES_OTHER ( SIZE(PTKET,1), SIZE(PTKET,2), SIZE(PTKET,3) )               )
-allocate( ZRTHS_PPM    ( SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3) )               )
-allocate( ZRTKES_PPM   ( SIZE(PTKET,1), SIZE(PTKET,2), SIZE(PTKET,3) )               )
-allocate( ZR           ( SIZE(PRT,  1), SIZE(PRT,  2), SIZE(PRT,  3), SIZE(PRT, 4) ) )
-allocate( ZSV          ( SIZE(PSVT, 1), SIZE(PSVT, 2), SIZE(PSVT, 3), SIZE(PSVT,4) ) )
-allocate( ZSNWC        ( SIZE(PSVT, 1), SIZE(PSVT, 2), SIZE(PSVT, 3), NBLOWSNOW_2D ) )
-allocate( ZSNWC_INIT   ( SIZE(PSVT, 1), SIZE(PSVT, 2), SIZE(PSVT, 3), NBLOWSNOW_2D ) )
-allocate( ZRSNWCS      ( SIZE(PSVT, 1), SIZE(PSVT, 2), SIZE(PSVT, 3), NBLOWSNOW_2D ) )
-allocate( ZRRS_OTHER   ( SIZE(PRT,  1), SIZE(PRT,  2), SIZE(PRT,  3), SIZE(PRT, 4) ) )
-allocate( ZRSVS_OTHER  ( SIZE(PSVT, 1), SIZE(PSVT, 2), SIZE(PSVT, 3), SIZE(PSVT,4) ) )
-allocate( ZRSNWCS_OTHER( SIZE(PSVT, 1), SIZE(PSVT, 2), SIZE(PSVT, 3), NBLOWSNOW_2D ) )
-allocate( ZRRS_PPM     ( SIZE(PRT,  1), SIZE(PRT,  2), SIZE(PRT,  3), SIZE(PRT, 4) ) )
-allocate( ZRSVS_PPM    ( SIZE(PSVT, 1), SIZE(PSVT, 2), SIZE(PSVT, 3), SIZE(PSVT,4) ) )
-allocate( ZRSNWCS_PPM  ( SIZE(PSVT, 1), SIZE(PSVT, 2), SIZE(PSVT, 3), NBLOWSNOW_2D ) )
-allocate( ZRHOX1       ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZRHOX2       ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZRHOY1       ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZRHOY2       ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZRHOZ1       ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZRHOZ2       ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZT           ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZEXN         ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZLV          ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZLS          ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
-allocate( ZCPH         ( SIZE(PUT,  1), SIZE(PUT,  2), SIZE(PUT,  3) )               )
+JIU =  size(PUT, 1 )
+JJU =  size(PUT, 2 )
+JKU =  size(PUT, 3 )
+
+
+#ifndef MNH_OPENACC
+allocate( ZRUCPPM      ( JIU,JJU,JKU )               )
+allocate( ZRVCPPM      ( JIU,JJU,JKU )               )
+allocate( ZRWCPPM      ( JIU,JJU,JKU )               )
+allocate( ZCFLU        ( JIU,JJU,JKU )               )
+allocate( ZCFLV        ( JIU,JJU,JKU )               )
+allocate( ZCFLW        ( JIU,JJU,JKU )               )
+allocate( ZCFL         ( JIU,JJU,JKU )               )
+allocate( ZTH          ( JIU,JJU,JKU )               )
+allocate( ZTKE         ( JIU,JJU,SIZE(PTKET,3)       )
+allocate( ZRTHS_OTHER  ( JIU,JJU,JKU )               )
+allocate( ZRTKES_OTHER ( JIU,JJU,SIZE(PTKET,3)       )
+allocate( ZRTHS_PPM    ( JIU,JJU,JKU )               )
+allocate( ZRTKES_PPM   ( JIU,JJU,SIZE(PTKET,3)       )
+allocate( ZR           ( JIU,JJU,JKU, SIZE(PRT, 4) ) )
+allocate( ZSV          ( JIU,JJU,JKU, SIZE(PSVT,4) ) )
+allocate( ZSNWC        ( JIU,JJU,JKU, NBLOWSNOW_2D ) )
+allocate( ZSNWC_INIT   ( JIU,JJU,JKU, NBLOWSNOW_2D ) )
+allocate( ZRSNWCS      ( JIU,JJU,JKU, NBLOWSNOW_2D ) )
+allocate( ZRRS_OTHER   ( JIU,JJU,JKU, SIZE(PRT, 4) ) )
+allocate( ZRSVS_OTHER  ( JIU,JJU,JKU, SIZE(PSVT,4) ) )
+allocate( ZRSNWCS_OTHER( JIU,JJU,JKU, NBLOWSNOW_2D ) )
+allocate( ZRRS_PPM     ( JIU,JJU,JKU, SIZE(PRT, 4) ) )
+allocate( ZRSVS_PPM    ( JIU,JJU,JKU, SIZE(PSVT,4) ) )
+allocate( ZRSNWCS_PPM  ( JIU,JJU,JKU, NBLOWSNOW_2D ) )
+allocate( ZRHOX1       ( JIU,JJU,JKU )               )
+allocate( ZRHOX2       ( JIU,JJU,JKU )               )
+allocate( ZRHOY1       ( JIU,JJU,JKU )               )
+allocate( ZRHOY2       ( JIU,JJU,JKU )               )
+allocate( ZRHOZ1       ( JIU,JJU,JKU )               )
+allocate( ZRHOZ2       ( JIU,JJU,JKU )               )
+allocate( ZT           ( JIU,JJU,JKU )               )
+allocate( ZEXN         ( JIU,JJU,JKU )               )
+allocate( ZLV          ( JIU,JJU,JKU )               )
+allocate( ZLS          ( JIU,JJU,JKU )               )
+allocate( ZCPH         ( JIU,JJU,JKU )               )
+#else
+CALL MNH_CHECK_IN_ZT3D("ADVECTION_METSV")
+IZRUCPPM       = MNH_ALLOCATE_ZT3D( ZRUCPPM      , JIU,JJU,JKU                )
+IZRVCPPM       = MNH_ALLOCATE_ZT3D( ZRVCPPM      , JIU,JJU,JKU                )
+IZRWCPPM       = MNH_ALLOCATE_ZT3D( ZRWCPPM      , JIU,JJU,JKU                )
+IZCFLU         = MNH_ALLOCATE_ZT3D( ZCFLU        , JIU,JJU,JKU                )
+IZCFLV         = MNH_ALLOCATE_ZT3D( ZCFLV        , JIU,JJU,JKU                )
+IZCFLW         = MNH_ALLOCATE_ZT3D( ZCFLW        , JIU,JJU,JKU                )
+IZCFL          = MNH_ALLOCATE_ZT3D( ZCFL         , JIU,JJU,JKU                )
+IZTH           = MNH_ALLOCATE_ZT3D( ZTH          , JIU,JJU,JKU                )
+IZTKE          = MNH_ALLOCATE_ZT3D( ZTKE         , JIU,JJU,SIZE(PTKET,3)      )
+IZRTHS_OTHER   = MNH_ALLOCATE_ZT3D( ZRTHS_OTHER  , JIU,JJU,JKU                )
+IZRTKES_OTHER  = MNH_ALLOCATE_ZT3D( ZRTKES_OTHER , JIU,JJU,SIZE(PTKET,3)      )
+IZRTHS_PPM     = MNH_ALLOCATE_ZT3D( ZRTHS_PPM    , JIU,JJU,JKU                )
+IZRTKES_PPM    = MNH_ALLOCATE_ZT3D( ZRTKES_PPM   , JIU,JJU,SIZE(PTKET,3)      )
+IZR            = MNH_ALLOCATE_ZT4D( ZR           , JIU,JJU,JKU, SIZE(PRT, 4)  )
+IZSV           = MNH_ALLOCATE_ZT4D( ZSV          , JIU,JJU,JKU, SIZE(PSVT,4)  )
+IZSNWC         = MNH_ALLOCATE_ZT4D( ZSNWC        , JIU,JJU,JKU, NBLOWSNOW_2D  )
+IZSNWC_INIT    = MNH_ALLOCATE_ZT4D( ZSNWC_INIT   , JIU,JJU,JKU, NBLOWSNOW_2D  )
+IZRSNWCS       = MNH_ALLOCATE_ZT4D( ZRSNWCS      , JIU,JJU,JKU, NBLOWSNOW_2D  )
+IZRRS_OTHER    = MNH_ALLOCATE_ZT4D( ZRRS_OTHER   , JIU,JJU,JKU, SIZE(PRT, 4)  )
+IZRSVS_OTHER   = MNH_ALLOCATE_ZT4D( ZRSVS_OTHER  , JIU,JJU,JKU, SIZE(PSVT,4)  )
+IZRSNWCS_OTHER = MNH_ALLOCATE_ZT4D( ZRSNWCS_OTHER, JIU,JJU,JKU, NBLOWSNOW_2D  )
+IZRRS_PPM      = MNH_ALLOCATE_ZT4D( ZRRS_PPM     , JIU,JJU,JKU, SIZE(PRT, 4)  )
+IZRSVS_PPM     = MNH_ALLOCATE_ZT4D( ZRSVS_PPM    , JIU,JJU,JKU, SIZE(PSVT,4)  )
+IZRSNWCS_PPM   = MNH_ALLOCATE_ZT4D( ZRSNWCS_PPM  , JIU,JJU,JKU, NBLOWSNOW_2D  )
+IZRHOX1        = MNH_ALLOCATE_ZT3D( ZRHOX1       , JIU,JJU,JKU                )
+IZRHOX2        = MNH_ALLOCATE_ZT3D( ZRHOX2       , JIU,JJU,JKU                )
+IZRHOY1        = MNH_ALLOCATE_ZT3D( ZRHOY1       , JIU,JJU,JKU                )
+IZRHOY2        = MNH_ALLOCATE_ZT3D( ZRHOY2       , JIU,JJU,JKU                )
+IZRHOZ1        = MNH_ALLOCATE_ZT3D( ZRHOZ1       , JIU,JJU,JKU                )
+IZRHOZ2        = MNH_ALLOCATE_ZT3D( ZRHOZ2       , JIU,JJU,JKU                )
+IZT            = MNH_ALLOCATE_ZT3D( ZT           , JIU,JJU,JKU                )
+IZEXN          = MNH_ALLOCATE_ZT3D( ZEXN         , JIU,JJU,JKU                )
+IZLV           = MNH_ALLOCATE_ZT3D( ZLV          , JIU,JJU,JKU                )
+IZLS           = MNH_ALLOCATE_ZT3D( ZLS          , JIU,JJU,JKU                )
+IZCPH          = MNH_ALLOCATE_ZT3D( ZCPH         , JIU,JJU,JKU                )
+#endif
 
-!$acc data create( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH,                        &
+!$acc data present( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH,                        &
 !$acc &            ZTKE, ZRTHS_OTHER, ZRTKES_OTHER, ZRTHS_PPM, ZRTKES_PPM,                           &
 !$acc &            ZR, ZSV, ZSNWC, ZSNWC_INIT, ZRSNWCS, ZRRS_OTHER, ZRSVS_OTHER, ZRSNWCS_OTHER,      &
 !$acc &            ZRRS_PPM, ZRSVS_PPM, ZRSNWCS_PPM, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, &
@@ -449,26 +506,37 @@ END IF
 !*       2.2 computes CFL numbers
 !
 !PW: not necessary: data already on device due to contrav_device !$acc update device(ZRUCPPM,ZRVCPPM,ZRWCPPM)
-!$acc kernels
+! acc kernels
 IF (.NOT. L1D) THEN
+  !$acc kernels 
   ZCFLU(:,:,:) = 0.0 ; ZCFLV(:,:,:) = 0.0 ;  ZCFLW(:,:,:) = 0.0
   ZCFLU(IIB:IIE,IJB:IJE,:) = ABS(ZRUCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
   ZCFLV(IIB:IIE,IJB:IJE,:) = ABS(ZRVCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
   ZCFLW(IIB:IIE,IJB:IJE,:) = ABS(ZRWCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
+  !$acc end kernels
 #ifndef MNH_BITREP
   IF (.NOT. L2D) THEN
-    ZCFL(:,:,:)  = SQRT(ZCFLU(:,:,:)**2+ZCFLV(:,:,:)**2+ZCFLW(:,:,:)**2)
+     !$acc kernels 
+     ZCFL(:,:,:)  = SQRT(ZCFLU(:,:,:)**2+ZCFLV(:,:,:)**2+ZCFLW(:,:,:)**2)
+     !$acc end kernels
   ELSE
-    ZCFL(:,:,:)  = SQRT(ZCFLU(:,:,:)**2+ZCFLW(:,:,:)**2)
+     !$acc kernels
+     ZCFL(:,:,:)  = SQRT(ZCFLU(:,:,:)**2+ZCFLW(:,:,:)**2)
+     !$acc end kernels
   END IF
 #else
   IF (.NOT. L2D) THEN
-    ZCFL(:,:,:)  = SQRT(BR_P2(ZCFLU(:,:,:))+BR_P2(ZCFLV(:,:,:))+BR_P2(ZCFLW(:,:,:)))
+     !$acc kernels 
+     ZCFL(:,:,:)  = SQRT(BR_P2(ZCFLU(:,:,:))+BR_P2(ZCFLV(:,:,:))+BR_P2(ZCFLW(:,:,:)))
+     !$acc end kernels
   ELSE
-    ZCFL(:,:,:)  = SQRT(BR_P2(ZCFLU(:,:,:))+BR_P2(ZCFLW(:,:,:)))
+     !$acc kernels 
+     ZCFL(:,:,:)  = SQRT(BR_P2(ZCFLU(:,:,:))+BR_P2(ZCFLW(:,:,:)))
+     !$acc end kernels
   END IF
-#endif
+#endif 
 ELSE
+   !$acc kernels
    ZCFLU(:,:,:) = 0.0 ; ZCFLV(:,:,:) = 0.0 ;  ZCFLW(:,:,:) = 0.0
    ZCFLW(IIB:IIE,IJB:IJE,:) = ABS(ZRWCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
 #ifndef MNH_BITREP
@@ -476,8 +544,9 @@ ELSE
 #else
    ZCFL(:,:,:) = SQRT(BR_P2(ZCFLW(:,:,:)))
 #endif
+   !$acc end kernels
 END IF
-!$acc end kernels
+! acc end kernels
 !
 !* prints in the file the 3D Courant numbers (one should flag this)
 !
@@ -704,11 +773,13 @@ CALL PPM_RHODJ(HLBCX,HLBCY, ZRUCPPM, ZRVCPPM, ZRWCPPM,              &
 !* values of the fields at the beginning of the time splitting loop
 !$acc kernels
 ZTH(:,:,:)  = PTHT(:,:,:)
-ZTKE(:,:,:) = PTKET(:,:,:)
 IF (KRR /=0 ) ZR(:,:,:,:)  = PRT(:,:,:,:)
 IF (KSV /=0 ) ZSV(:,:,:,:) = PSVT(:,:,:,:)
 !
-IF (GTKE)    PRTKES_ADV(:,:,:)  = 0.
+IF (GTKE)  THEN
+   PRTKES_ADV(:,:,:)  = 0.
+   ZTKE(:,:,:) = PTKET(:,:,:)
+END IF
 !$acc end kernels
 !
 IF(LBLOWSNOW) THEN
@@ -749,29 +820,41 @@ DO JSPL=1,KSPLIT
 !
 ! Tendencies of PPM
 !
-!$acc kernels
+! acc kernels
+   !$acc kernels
    PRTHS(:,:,:)                      = PRTHS     (:,:,:)   + ZRTHS_PPM (:,:,:)   / KSPLIT
    IF (GTKE)     PRTKES_ADV(:,:,:)   = PRTKES_ADV(:,:,:)   + ZRTKES_PPM(:,:,:)   / KSPLIT
    IF (KRR /=0)  PRRS      (:,:,:,:) = PRRS      (:,:,:,:) + ZRRS_PPM  (:,:,:,:) / KSPLIT
    IF (KSV /=0 ) PRSVS     (:,:,:,:) = PRSVS     (:,:,:,:) + ZRSVS_PPM (:,:,:,:) / KSPLIT
+   !$acc end kernels
 !
    IF (JSPL<KSPLIT) THEN
 !
 !  Guesses of the field inside the time splitting loop
 !
+   !$acc kernels   
    ZTH(:,:,:) = ZTH(:,:,:) + ( ZRTHS_PPM(:,:,:) + ZRTHS_OTHER(:,:,:) + PRTHS_CLD(:,:,:)) * &
-           ZTSTEP_PPM / PRHODJ(:,:,:)
-   IF (GTKE) ZTKE(:,:,:) = ZTKE(:,:,:) + ( ZRTKES_PPM(:,:,:) + ZRTKES_OTHER(:,:,:) ) * ZTSTEP_PPM / PRHODJ(:,:,:)
+        ZTSTEP_PPM / PRHODJ(:,:,:)
+   !$acc end kernels
+   IF (GTKE) THEN
+      !$acc kernels
+      ZTKE(:,:,:) = ZTKE(:,:,:) + ( ZRTKES_PPM(:,:,:) + ZRTKES_OTHER(:,:,:) ) * ZTSTEP_PPM / PRHODJ(:,:,:)
+      !$acc end kernels
+   END IF
+   !$acc kernels
+   !$acc loop seq
    DO JR = 1, KRR
-    ZR(:,:,:,JR) = ZR(:,:,:,JR) + ( ZRRS_PPM(:,:,:,JR) + ZRRS_OTHER(:,:,:,JR) + PRRS_CLD(:,:,:,JR) ) &
-                    * ZTSTEP_PPM / PRHODJ(:,:,:)
+      ZR(:,:,:,JR) = ZR(:,:,:,JR) + ( ZRRS_PPM(:,:,:,JR) + ZRRS_OTHER(:,:,:,JR) + PRRS_CLD(:,:,:,JR) ) &
+           * ZTSTEP_PPM / PRHODJ(:,:,:)
    END DO
+   !$acc loop seq
    DO JSV = 1, KSV
-    ZSV(:,:,:,JSV) = ZSV(:,:,:,JSV) + ( ZRSVS_PPM(:,:,:,JSV) + ZRSVS_OTHER(:,:,:,JSV) +  &
-                     PRSVS_CLD(:,:,:,JSV) ) * ZTSTEP_PPM / PRHODJ(:,:,:)
+      ZSV(:,:,:,JSV) = ZSV(:,:,:,JSV) + ( ZRSVS_PPM(:,:,:,JSV) + ZRSVS_OTHER(:,:,:,JSV) +  &
+           PRSVS_CLD(:,:,:,JSV) ) * ZTSTEP_PPM / PRHODJ(:,:,:)
    END DO
+   !$acc end kernels
    END IF
-!$acc end kernels
+! acc end kernels
 
 !PW: bug PGI 18.10: not necessary for PRRS,PRSVS but error with decriptor not present
 !$acc update self(PRRS,PRSVS)
@@ -967,6 +1050,33 @@ END IF
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate ( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH,                       &
+            ZTKE, ZRTHS_OTHER, ZRTKES_OTHER, ZRTHS_PPM, ZRTKES_PPM,                           &
+            ZR, ZSV, ZSNWC, ZSNWC_INIT, ZRSNWCS, ZRRS_OTHER, ZRSVS_OTHER, ZRSNWCS_OTHER,      &
+            ZRRS_PPM, ZRSVS_PPM, ZRSNWCS_PPM, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, &
+            ZT, ZEXN, ZLV, ZLS, ZCPH                                                          )
+#else
+CALL MNH_REL_ZT3D ( IZRHOX1, IZRHOX2, IZRHOY1, IZRHOY2, IZRHOZ1, IZRHOZ2, &
+     IZT, IZEXN, IZLV, IZLS, IZCPH                         )
+
+CALL MNH_REL_ZT4D ( NBLOWSNOW_2D , IZRSNWCS_PPM )
+CALL MNH_REL_ZT4D ( SIZE(PSVT,4) , IZRSVS_PPM )
+CALL MNH_REL_ZT4D ( SIZE(PRT, 4) , IZRRS_PPM )
+CALL MNH_REL_ZT4D ( NBLOWSNOW_2D , IZRSNWCS_OTHER )
+CALL MNH_REL_ZT4D ( SIZE(PSVT,4) , IZRSVS_OTHER )
+CALL MNH_REL_ZT4D ( SIZE(PRT, 4) , IZRRS_OTHER )
+CALL MNH_REL_ZT4D ( NBLOWSNOW_2D , IZRSNWCS )
+CALL MNH_REL_ZT4D ( NBLOWSNOW_2D , IZSNWC_INIT )
+CALL MNH_REL_ZT4D ( NBLOWSNOW_2D , IZSNWC )
+CALL MNH_REL_ZT4D ( SIZE(PSVT,4) , IZSV )
+CALL MNH_REL_ZT4D ( SIZE(PRT, 4) , IZR ) 
+
+CALL MNH_REL_ZT3D ( IZRUCPPM, IZRVCPPM, IZRWCPPM, IZCFLU, IZCFLV, IZCFLW, IZCFL, IZTH, &
+                    IZTKE, IZRTHS_OTHER, IZRTKES_OTHER, IZRTHS_PPM, IZRTKES_PPM        )
+CALL MNH_CHECK_OUT_ZT3D("ADVECTION_METSV")
+#endif
+
 !$acc end data
 
 END SUBROUTINE ADVECTION_METSV
diff --git a/src/MNH/emoist.f90 b/src/MNH/emoist.f90
index 891977a24..6486ce73f 100644
--- a/src/MNH/emoist.f90
+++ b/src/MNH/emoist.f90
@@ -41,7 +41,6 @@ END SUBROUTINE EMOIST
 END INTERFACE
 !
 END MODULE MODI_EMOIST
-!
 !   ############################################################################
 #ifndef MNH_OPENACC
 FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) RESULT(PEMOIST)
@@ -101,6 +100,10 @@ USE MODD_CST
 
 use mode_mppdb
 
+#ifdef MNH_OPENACC
+USE  MODE_MNH_ZWORK
+#endif
+
 IMPLICIT NONE
 !
 !*       0.1 declarations of arguments and result
@@ -125,10 +128,13 @@ REAL,DIMENSION(:,:,:),  INTENT(OUT):: PEMOIST ! result
 !
 !*       0.2 declarations of local variables
 !
-REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW
+REAL,DIMENSION(:,:,:), pointer,contiguous :: ZA, ZRW
+INTEGER                                   :: IZA,IZRW
 !                ZA = coeft A, ZRW = total mixing ratio rw 
 REAL                                  :: ZDELTA  ! = Rv/Rd - 1
 INTEGER                               :: JRR     ! moist loop counter
+INTEGER                               :: JIU,JJU,JKU
+INTEGER                               :: JI,JJ,JK
 !
 !---------------------------------------------------------------------------
 
@@ -143,74 +149,95 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size( pthlm, 1 )
+JJU =  size( pthlm, 2 )
+JKU =  size( pthlm, 3 )
 
-!$acc data create( za, zrw )
+#ifndef MNH_OPENACC
+allocate( za  (JIU,JJU,JKU) )
+allocate( zrw (JIU,JJU,JKU ) )
+#else
+IZA  = MNH_ALLOCATE_ZT3D( za  , JIU,JJU,JKU )
+IZRW = MNH_ALLOCATE_ZT3D( zrw , JIU,JJU,JKU )
+#endif
+
+!$acc data present( za, zrw )
 
 !
 !*       1. COMPUTE EMOIST
 !           --------------
 !
 !
-!$acc kernels
+!acc kernels 
 IF ( KRR == 0 ) THEN                                ! dry case
-  PEMOIST(:,:,:) = 0.
+!$acc kernels
+   PEMOIST(1:JIU,1:JJU,1:JKU) = 0.
+!$acc end kernels
 ELSE IF ( KRR == 1 ) THEN                           ! only vapor
+!$acc kernels   
   ZDELTA = (XRV/XRD) - 1.
-  PEMOIST(:,:,:) = ZDELTA*PTHLM(:,:,:)
+  PEMOIST(1:JIU,1:JJU,1:JKU) = ZDELTA*PTHLM(1:JIU,1:JJU,1:JKU)
+!$acc end kernels  
 ELSE                                                ! liquid water & ice present
+!$acc kernels   
   ZDELTA = (XRV/XRD) - 1.
-  ZRW(:,:,:) = PRM(:,:,:,1)
-!
-  IF ( KRRI>0) THEN  ! rc and ri case  
-    ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,3)
-    DO JRR=5,KRR
-      ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR)
-    ENDDO
-    ZA(:,:,:) = 1. + (                                    &  ! Compute A
-              (1.+ZDELTA) * (PRM(:,:,:,1) - PRM(:,:,:,2) - PRM(:,:,:,4)) &
-              -ZRW(:,:,:)                                                &
-                     )  /  (1. + ZRW(:,:,:)) 
+  ZRW(1:JIU,1:JJU,1:JKU) = PRM(1:JIU,1:JJU,1:JKU,1)
+!$acc end kernels  
+!
+  IF ( KRRI>0) THEN  ! rc and ri case
+!$acc kernels      
+   ZRW(1:JIU,1:JJU,1:JKU) = ZRW(1:JIU,1:JJU,1:JKU) + PRM(1:JIU,1:JJU,1:JKU,3)
+   DO JRR=5,KRR
+      ZRW(1:JIU,1:JJU,1:JKU) = ZRW(1:JIU,1:JJU,1:JKU) + PRM(1:JIU,1:JJU,1:JKU,JRR)
+   ENDDO
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZA(JI,JJ,JK) = 1. + (                                    &  ! Compute A
+           (1.+ZDELTA) * (PRM(JI,JJ,JK,1) - PRM(JI,JJ,JK,2) - PRM(JI,JJ,JK,4)) &
+           -ZRW(JI,JJ,JK)                                                &
+           )  /  (1. + ZRW(JI,JJ,JK))
+   END DO !CONCURRENT  
   !
   !   Emoist = ZB + ZC * Amoist
   !   ZB is computed from line 1 to line 2
   !   ZC is computed from line 3 to line 5
   !   Amoist* 2 * SRC is computed at line 6
   !
-    PEMOIST(:,:,:) = ZDELTA * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*(               &
-                                                    PRM(:,:,:,2)+PRM(:,:,:,4)))&
-                            / (1. + ZRW(:,:,:))                                &
-        +( PLOCPEXNM(:,:,:) * ZA(:,:,:)                                        &
-               -(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*(               &
-                                                    PRM(:,:,:,2)+PRM(:,:,:,4)))&
-                            / (1. + ZRW(:,:,:))                                &
-         ) * PAMOIST(:,:,:) * 2. * PSRCM(:,:,:)
-  ELSE
+    PEMOIST(1:JIU,1:JJU,1:JKU) = ZDELTA * (PTHLM(1:JIU,1:JJU,1:JKU) + PLOCPEXNM(1:JIU,1:JJU,1:JKU)*(               &
+                                                    PRM(1:JIU,1:JJU,1:JKU,2)+PRM(1:JIU,1:JJU,1:JKU,4)))&
+                            / (1. + ZRW(1:JIU,1:JJU,1:JKU))                                &
+        +( PLOCPEXNM(1:JIU,1:JJU,1:JKU) * ZA(1:JIU,1:JJU,1:JKU)                                        &
+               -(1.+ZDELTA) * (PTHLM(1:JIU,1:JJU,1:JKU) + PLOCPEXNM(1:JIU,1:JJU,1:JKU)*(               &
+                                                    PRM(1:JIU,1:JJU,1:JKU,2)+PRM(1:JIU,1:JJU,1:JKU,4)))&
+                            / (1. + ZRW(1:JIU,1:JJU,1:JKU))                                &
+                            ) * PAMOIST(1:JIU,1:JJU,1:JKU) * 2. * PSRCM(1:JIU,1:JJU,1:JKU)
+!$acc end kernels    
+ ELSE
+!$acc kernels    
     DO JRR=3,KRR
-      ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR)
-    ENDDO
-    ZA(:,:,:) = 1. + (                                    &  ! Compute ZA
-              (1.+ZDELTA) * (PRM(:,:,:,1) - PRM(:,:,:,2)) &
-              -ZRW(:,:,:)                                 &
-                     )  /  (1. + ZRW(:,:,:)) 
+      ZRW(1:JIU,1:JJU,1:JKU) = ZRW(1:JIU,1:JJU,1:JKU) + PRM(1:JIU,1:JJU,1:JKU,JRR)
+   ENDDO
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZA(JI,JJ,JK) = 1. + (                                    &  ! Compute ZA
+           (1.+ZDELTA) * (PRM(JI,JJ,JK,1) - PRM(JI,JJ,JK,2)) &
+           -ZRW(JI,JJ,JK)                                 &
+           )  /  (1. + ZRW(JI,JJ,JK))
+   END DO !CONCURRENT 
   !
   !   Emoist = ZB + ZC * Amoist
   !   ZB is computed from line 1 to line 2
   !   ZC is computed from line 3 to line 5
   !   Amoist* 2 * SRC is computed at line 6
   !
-    PEMOIST(:,:,:) = ZDELTA * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*PRM(:,:,:,2))   &
-                            / (1. + ZRW(:,:,:))                                &
-        +( PLOCPEXNM(:,:,:) * ZA(:,:,:)                                        &
-               -(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*PRM(:,:,:,2))   &
-                            / (1. + ZRW(:,:,:))                                &
-         ) * PAMOIST(:,:,:) * 2. * PSRCM(:,:,:)
+    PEMOIST(1:JIU,1:JJU,1:JKU) = ZDELTA * (PTHLM(1:JIU,1:JJU,1:JKU) + PLOCPEXNM(1:JIU,1:JJU,1:JKU)*PRM(1:JIU,1:JJU,1:JKU,2))   &
+                            / (1. + ZRW(1:JIU,1:JJU,1:JKU))                                &
+        +( PLOCPEXNM(1:JIU,1:JJU,1:JKU) * ZA(1:JIU,1:JJU,1:JKU)                                        &
+               -(1.+ZDELTA) * (PTHLM(1:JIU,1:JJU,1:JKU) + PLOCPEXNM(1:JIU,1:JJU,1:JKU)*PRM(1:JIU,1:JJU,1:JKU,2))   &
+                            / (1. + ZRW(1:JIU,1:JJU,1:JKU))                                &
+                            ) * PAMOIST(1:JIU,1:JJU,1:JKU) * 2. * PSRCM(1:JIU,1:JJU,1:JKU)
+!$acc end kernels
   END IF
 END IF
-!$acc end kernels
-
-deallocate( za, zrw )
+! acc end kernels
 
 if ( mppdb_initialized ) then
   !Check all out arrays
@@ -219,6 +246,12 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( za, zrw )
+#else
+CALL MNH_REL_ZT3D(  iza, izrw )
+#endif
+
 !$acc end data
 
 !---------------------------------------------------------------------------
@@ -228,3 +261,5 @@ END FUNCTION EMOIST
 #else
 END SUBROUTINE EMOIST
 #endif
+
+END MODULE MODI_EMOIST
diff --git a/src/MNH/etheta.f90 b/src/MNH/etheta.f90
index 53c6580c5..b5f92ac02 100644
--- a/src/MNH/etheta.f90
+++ b/src/MNH/etheta.f90
@@ -103,6 +103,10 @@ USE MODD_CST
 
 use mode_mppdb
 
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D, &
+     MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D, &
+     MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D
+
 IMPLICIT NONE
 !
 !*       0.1 declarations of arguments and result
@@ -130,8 +134,9 @@ REAL, DIMENSION(:,:,:),  INTENT(OUT):: PETHETA ! result
 !
 !*       0.2 declarations of local variables
 !
-REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW
+REAL,DIMENSION(:,:,:), pointer , contiguous :: ZA, ZRW
 !                ZA = coeft A, ZRW = total mixing ratio rw
+INTEGER  :: IZA, IZRW
 REAL                                  :: ZDELTA  ! = Rv/Rd - 1
 INTEGER                               :: JRR     ! moist loop counter
 !
@@ -148,27 +153,39 @@ if ( mppdb_initialized ) then
   call Mppdb_check( psrcm,     "Etheta beg:psrcm"     )
 end if
 
+#ifndef MNH_OPENACC
 allocate( za  ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
 allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) )
+#else
+iza  = MNH_ALLOCATE_ZT3D( za  , size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) )
+izrw = MNH_ALLOCATE_ZT3D( zrw , size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) )
+#endif
 
-!$acc data create( za, zrw )
+!$acc data present( za, zrw )
 
 !
 !*       1. COMPUTE ETHETA
 !           --------------
 !
 !
-!$acc kernels
-IF ( KRR == 0 ) THEN                                ! dry case
-  PETHETA(:,:,:) = 1.
+! acc kernels
+IF ( KRR == 0 ) THEN                               ! dry case
+   !$acc kernels
+   PETHETA(:,:,:) = 1.
+   !$acc end kernels
 ELSE IF ( KRR == 1 ) THEN                           ! only vapor
-  ZDELTA = (XRV/XRD) - 1.
-  PETHETA(:,:,:) = 1. + ZDELTA*PRM(:,:,:,1)
+   !$acc kernels
+   ZDELTA = (XRV/XRD) - 1.
+   PETHETA(:,:,:) = 1. + ZDELTA*PRM(:,:,:,1)
+   !$acc end kernels
 ELSE                                                ! liquid water & ice present
-  ZDELTA = (XRV/XRD) - 1.
-  ZRW(:,:,:) = PRM(:,:,:,1)
+   !$acc kernels
+   ZDELTA = (XRV/XRD) - 1.
+   ZRW(:,:,:) = PRM(:,:,:,1)
+   !$acc end kernels
 !
   IF ( KRRI>0 ) THEN  ! rc and ri case
+    !$acc kernels  
     ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,3)
     DO JRR=5,KRR
       ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR)
@@ -188,7 +205,9 @@ ELSE                                                ! liquid water & ice present
                                                     PRM(:,:,:,2)+PRM(:,:,:,4)))&
                             / (1. + ZRW(:,:,:))                                &
          ) * PATHETA(:,:,:) * 2. * PSRCM(:,:,:)
-  ELSE
+    !$acc end kernels
+ ELSE
+    !$acc kernels
     DO JRR=3,KRR
       ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR)
     ENDDO
@@ -206,11 +225,10 @@ ELSE                                                ! liquid water & ice present
                -(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*PRM(:,:,:,2))   &
                             / (1. + ZRW(:,:,:))                                &
          ) * PATHETA(:,:,:) * 2. * PSRCM(:,:,:)
-  END IF
+    !$acc end kernels
+ END IF
 END IF
-!$acc end kernels
-
-deallocate( za, zrw )
+! acc end kernels
 
 if ( mppdb_initialized ) then
   !Check all out arrays
@@ -219,6 +237,12 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate (za, zrw)
+#else
+CALL MNH_REL_ZT3D(iza, izrw)
+#endif
+
 !$acc end data
 
 !---------------------------------------------------------------------------
diff --git a/src/MNH/gradient_u.f90 b/src/MNH/gradient_u.f90
index 0dde760c7..fa743bbd8 100644
--- a/src/MNH/gradient_u.f90
+++ b/src/MNH/gradient_u.f90
@@ -31,7 +31,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX     ! metric coefficient dxx
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 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(:,:,:), INTENT(OUT) :: PGX_U_M_DEVICE ! result mass point
 !
 END SUBROUTINE GX_U_M_DEVICE
 #endif
@@ -58,7 +58,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY     ! metric coefficient dyy
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 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(:,:,:), INTENT(OUT) :: PGY_U_UV_DEVICE ! result UV point
 !
 END SUBROUTINE GY_U_UV_DEVICE
 #endif
@@ -81,7 +81,7 @@ INTEGER,                INTENT(IN) :: KL       ! +1 if grid goes from ground to
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PA       ! variable at the U point
 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(:,:,:), INTENT(OUT) :: PGZ_U_UW_DEVICE ! result UW point
 !
 END SUBROUTINE GZ_U_UW_DEVICE
 #endif
@@ -201,6 +201,8 @@ END FUNCTION GX_U_M
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
 !
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+!
 IMPLICIT NONE
 !
 !
@@ -213,24 +215,28 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX     ! metric coefficient dxx
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 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(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
-!
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PGX_U_M_DEVICE ! result mass point
 !
 !*       0.2   declaration of local variables
 !
-!              NONE
+REAL, DIMENSION(:,:,:), pointer , contiguous ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE
 !
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 !----------------------------------------------------------------------------
 
 !$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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
+
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
 
-!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device )
+!$acc data present( ztmp1_device, ztmp2_device, ztmp3_device )
 
 !
 !*       1.    DEFINITION of GX_U_M_DEVICE
@@ -238,12 +244,16 @@ allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
 IF (.NOT. LFLAT) THEN
   CALL DXF_DEVICE(PA,ZTMP1_DEVICE)
   CALL DZM_DEVICE(KKA,KKU,KL,PA,ZTMP2_DEVICE)
-  !$acc kernels
-  ZTMP3_DEVICE(:,:,:) = PDZX(:,:,:) * ZTMP2_DEVICE(:,:,:)
+  !$acc kernels loop independent collapse(3)
+  DO JK=1,JKU ; DO JJ=1,JJU ; DO JI=1,JIU
+     ZTMP3_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
+  END DO ; END DO ; END DO
   !$acc end kernels
   CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE)
   !$acc kernels
-  ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:) / PDZZ(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+  END DO !CONCURRENT
   !$acc end kernels
   CALL MZF_DEVICE(KKA,KKU,KL,ZTMP3_DEVICE,ZTMP2_DEVICE)
   CALL MXF_DEVICE(PDXX,ZTMP3_DEVICE)
@@ -260,6 +270,8 @@ END IF
 
 !$acc end data
 
+CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device,iztmp3_device)
+
 !$acc end data
 
 !----------------------------------------------------------------------------
@@ -375,6 +387,8 @@ END FUNCTION GY_U_UV
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
 !
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+!
 IMPLICIT NONE
 !
 !
@@ -387,24 +401,30 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY     ! metric coefficient dyy
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 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(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PGY_U_UV_DEVICE ! result UV point
 !
 !
 !*       0.2   declaration of local variables
 !
-!              NONE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 !
 !----------------------------------------------------------------------------
 
 !$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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
+
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
 
-!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device )
+!$acc data present( ztmp1_device, ztmp2_device, ztmp3_device )
 
 !
 !*       1.    DEFINITION of GY_U_UV_DEVICE
@@ -414,18 +434,24 @@ IF (.NOT. LFLAT) THEN
   CALL DZM_DEVICE(KKA,KKU,KL,PA,ZTMP1_DEVICE)
   CALL MXM_DEVICE(PDZZ,ZTMP2_DEVICE)
   !$acc kernels
-  ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)/ZTMP2_DEVICE(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK)/ZTMP2_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT    
   !$acc end kernels
   CALL MYM_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE)
   CALL MXM_DEVICE(PDZY,ZTMP2_DEVICE)
   !$acc kernels
-  ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
   CALL MZF_DEVICE(KKA,KKU,KL, ZTMP3_DEVICE,ZTMP2_DEVICE )
   CALL DYM_DEVICE(PA,ZTMP1_DEVICE)
   CALL MXM_DEVICE(PDYY,ZTMP3_DEVICE)
   !$acc kernels
-  PGY_U_UV_DEVICE(:,:,:)=  ( ZTMP1_DEVICE(:,:,:) - ZTMP2_DEVICE(:,:,:) ) / ZTMP3_DEVICE(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     PGY_U_UV_DEVICE(JI,JJ,JK)=  ( ZTMP1_DEVICE(JI,JJ,JK) - ZTMP2_DEVICE(JI,JJ,JK) ) / ZTMP3_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
 ELSE
   CALL DYM_DEVICE(PA,ZTMP1_DEVICE)
@@ -437,6 +463,8 @@ END IF
 
 !$acc end data
 
+CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device,iztmp3_device)
+
 !$acc end data
 
 !----------------------------------------------------------------------------
@@ -535,6 +563,8 @@ END FUNCTION GZ_U_UW
 !
 !
 USE MODI_SHUMAN_DEVICE
+USE MODI_SHUMAN
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
 !
 IMPLICIT NONE
 !
@@ -546,23 +576,26 @@ INTEGER,                INTENT(IN) :: KL       ! +1 if grid goes from ground to
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PA       ! variable at the U point
 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(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE
-!
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PGZ_U_UW_DEVICE ! result UW point
 !
 !*       0.2   declaration of local variables
 !
-!              NONE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE
 !
+INTEGER  :: JIU,JJU,JKU
 !----------------------------------------------------------------------------
 
 !$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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
 
-!$acc data create( ztmp1_device, ztmp2_device )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+
+!$acc data present( ztmp1_device, ztmp2_device )
 
 !
 !*       1.    DEFINITION of GZ_U_UW_DEVICE
@@ -576,6 +609,8 @@ PGZ_U_UW_DEVICE(:,:,:)= ZTMP1_DEVICE(:,:,:) / ZTMP2_DEVICE(:,:,:)
 
 !$acc end data
 
+CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device)
+
 !$acc end data
 
 !----------------------------------------------------------------------------
diff --git a/src/MNH/gradient_v.f90 b/src/MNH/gradient_v.f90
index 18730e274..0f7192cd8 100644
--- a/src/MNH/gradient_v.f90
+++ b/src/MNH/gradient_v.f90
@@ -32,7 +32,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY     ! metric coefficient dyy
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 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(:,:,:), INTENT(OUT) :: PGY_V_M_DEVICE ! result mass point
 !
 END SUBROUTINE GY_V_M_DEVICE
 #endif
@@ -60,7 +60,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX     ! metric coefficient dxx
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 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(:,:,:), INTENT(OUT) :: PGX_V_UV_DEVICE ! result UV point
 !
 END SUBROUTINE GX_V_UV_DEVICE
 #endif
@@ -84,7 +84,7 @@ INTEGER,                INTENT(IN) :: KL       ! +1 if grid goes from ground to
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PA       ! variable at the V point
 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(:,:,:), INTENT(OUT) :: PGZ_V_VW_DEVICE ! result VW point
 !
 END SUBROUTINE GZ_V_VW_DEVICE
 #endif
@@ -94,8 +94,6 @@ END INTERFACE
 !
 END MODULE MODI_GRADIENT_V
 !
-!
-!
 !     #######################################################
       FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY)      RESULT(PGY_V_M)
 !     #######################################################
@@ -201,6 +199,7 @@ END FUNCTION GY_V_M
 !
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
 !
 IMPLICIT NONE
 !
@@ -214,9 +213,13 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY     ! metric coefficient dyy
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 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(:,:,:), INTENT(INOUT) :: PGY_V_M_DEVICE ! result mass point
 !
-REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 !
 !*       0.2   declaration of local variables
 !
@@ -226,11 +229,15 @@ REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
+
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
 
-!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device )
+!$acc data present( ztmp1_device, ztmp2_device, ztmp3_device )
 
 !
 !*       1.    DEFINITION of GY_V_M_DEVICE
@@ -239,13 +246,17 @@ allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) )
 IF (.NOT. LFLAT) THEN
   CALL DYF_DEVICE(PA,ZTMP1_DEVICE)
   CALL DZM_DEVICE(KKA,KKU,KL,PA,ZTMP2_DEVICE)
-!$acc kernels
-  ZTMP3_DEVICE(:,:,:) = PDZY(:,:,:)*ZTMP2_DEVICE(:,:,:)
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT
+  !$acc end kernels
   CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE)
-!$acc kernels
-  ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)/PDZZ(:,:,:)
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK)/PDZZ(JI,JJ,JK)
+  END DO !CONCURRENT
+  !$acc end kernels
   CALL MZF_DEVICE(KKA,KKU,KL,ZTMP3_DEVICE,ZTMP2_DEVICE)
   CALL MYF_DEVICE(PDYY,ZTMP3_DEVICE)
 !$acc kernels
@@ -261,6 +272,8 @@ END IF
 
 !$acc end data
 
+CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device,iztmp3_device)
+
 !$acc end data
 
 !----------------------------------------------------------------------------
@@ -374,6 +387,7 @@ END FUNCTION GX_V_UV
 !
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
 !
 IMPLICIT NONE
 !
@@ -387,48 +401,58 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX     ! metric coefficient dxx
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 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(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
-!
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PGX_V_UV_DEVICE ! result UV point
 !
 !*       0.2   declaration of local variables
 !
-!              NONE
+REAL, DIMENSION(:,:,:), pointer , contiguous ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 !
 !----------------------------------------------------------------------------
 
 !$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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
+
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU )
 
-!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device )
+!$acc data present( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device )
 
 !
 !*       1.    DEFINITION of GX_V_UV_DEVICE
 !              ---------------------
 !
 IF (.NOT. LFLAT) THEN
-  
   CALL DXM_DEVICE(PA,ZTMP1_DEVICE)
   CALL MYM_DEVICE(PDZZ,ZTMP2_DEVICE)
   CALL DZM_DEVICE(KKA,KKU,KL,PA,ZTMP3_DEVICE)
-!$acc kernels
-  ZTMP4_DEVICE(:,:,:) = ZTMP3_DEVICE(:,:,:) / ZTMP2_DEVICE(:,:,:)
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP4_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL MXM_DEVICE(ZTMP4_DEVICE,ZTMP2_DEVICE)
   CALL MYM_DEVICE(PDZX,ZTMP3_DEVICE)
-!$acc kernels
-  ZTMP4_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:) *ZTMP3_DEVICE(:,:,:)
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP4_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK) *ZTMP3_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL MZF_DEVICE(KKA,KKU,KL,ZTMP4_DEVICE,ZTMP2_DEVICE)
   CALL MYM_DEVICE(PDXX,ZTMP3_DEVICE)
-!$acc kernels
-  PGX_V_UV_DEVICE(:,:,:)= ( ZTMP1_DEVICE(:,:,:) - ZTMP2_DEVICE(:,:,:) ) / ZTMP3_DEVICE(:,:,:)
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     PGX_V_UV_DEVICE(JI,JJ,JK)= ( ZTMP1_DEVICE(JI,JJ,JK) - ZTMP2_DEVICE(JI,JJ,JK) ) / ZTMP3_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
 ELSE
   CALL DXM_DEVICE(PA,ZTMP1_DEVICE)
   CALL MYM_DEVICE(PDXX,ZTMP2_DEVICE)
@@ -439,6 +463,8 @@ END IF
 
 !$acc end data
 
+CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device,iztmp3_device,iztmp4_device)
+
 !$acc end data
 
 !----------------------------------------------------------------------------
@@ -538,6 +564,8 @@ END FUNCTION GZ_V_VW
 !
 !
 USE MODI_SHUMAN_DEVICE
+USE MODI_SHUMAN
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
 !
 IMPLICIT NONE
 !
@@ -549,22 +577,26 @@ INTEGER,                INTENT(IN) :: KL       ! +1 if grid goes from ground to
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PA       ! variable at the V point
 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(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PGZ_V_VW_DEVICE ! result VW point
 !
 !*       0.2   declaration of local variables
 !
-!              NONE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE
 !
+INTEGER  :: JIU,JJU,JKU
 !----------------------------------------------------------------------------
 
 !$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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
 
-!$acc data create( ztmp1_device, ztmp2_device )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+
+!$acc data present( ztmp1_device, ztmp2_device )
 
 !
 !*       1.    DEFINITION of GZ_V_VW_DEVICE
@@ -578,9 +610,12 @@ PGZ_V_VW_DEVICE(:,:,:)= ZTMP1_DEVICE(:,:,:) / ZTMP2_DEVICE(:,:,:)
 
 !$acc end data
 
+CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device)
+
 !$acc end data
 
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GZ_V_VW_DEVICE
 #endif
+
diff --git a/src/MNH/gradient_w.f90 b/src/MNH/gradient_w.f90
index 83ecb6721..3133bd835 100644
--- a/src/MNH/gradient_w.f90
+++ b/src/MNH/gradient_w.f90
@@ -28,7 +28,7 @@ INTEGER,                INTENT(IN) :: KL       ! +1 if grid goes from ground to
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PA       ! variable at the W point
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGZ_W_M_DEVICE ! result mass point
+REAL, DIMENSION(:,:,:),  INTENT(OUT) :: PGZ_W_M_DEVICE ! result mass point
 !
 END SUBROUTINE GZ_W_M_DEVICE
 #endif
@@ -56,7 +56,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX     ! metric coefficient dxx
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX     ! metric coefficient dzx
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGX_W_UW_DEVICE ! result UW point
+REAL, DIMENSION(:,:,:),  INTENT(OUT) :: PGX_W_UW_DEVICE ! result UW point
 !
 END SUBROUTINE GX_W_UW_DEVICE
 #endif
@@ -84,7 +84,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY     ! metric coefficient dyy
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY     ! metric coefficient dzy
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGY_W_VW_DEVICE ! result VW point
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PGY_W_VW_DEVICE ! result VW point
 !
 END SUBROUTINE GY_W_VW_DEVICE
 #endif
@@ -93,9 +93,7 @@ END SUBROUTINE GY_W_VW_DEVICE
 END INTERFACE
 !
 END MODULE MODI_GRADIENT_W
-!
-!
-!
+!  
 !     #######################################################
       FUNCTION GZ_W_M(PA,PDZZ)      RESULT(PGZ_W_M)
 !     #######################################################
@@ -181,6 +179,8 @@ END FUNCTION GZ_W_M
 !
 !
 USE MODI_SHUMAN_DEVICE
+USE MODI_SHUMAN
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
 !
 IMPLICIT NONE
 !
@@ -192,20 +192,26 @@ INTEGER,                INTENT(IN) :: KL       ! +1 if grid goes from ground to
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PA       ! variable at the W point
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGZ_W_M_DEVICE ! result mass point
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) :: PGZ_W_M_DEVICE ! result mass point
 !
 !*       0.2   declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous ::  ZTMP1_DEVICE, ZTMP2_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE
 !
+INTEGER  :: JIU,JJU,JKU
 !----------------------------------------------------------------------------
 
 !$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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
+
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
 
-!$acc data create( ztmp1_device, ztmp2_device )
+!$acc data present( ztmp1_device, ztmp2_device )
 
 !
 !*       1.    DEFINITION of GZ_W_M_DEVICE
@@ -219,6 +225,8 @@ PGZ_W_M_DEVICE(:,:,:)= ZTMP1_DEVICE(:,:,:)/ZTMP2_DEVICE(:,:,:)
 
 !$acc end data
 
+CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device)
+
 !$acc end data
 
 !----------------------------------------------------------------------------
@@ -323,6 +331,7 @@ END FUNCTION GX_W_UW
 !
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
 !
 IMPLICIT NONE
 !
@@ -336,23 +345,29 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX     ! metric coefficient dxx
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX     ! metric coefficient dzx
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGX_W_UW_DEVICE ! result UW point
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) :: PGX_W_UW_DEVICE ! result UW point
 !
 !*       0.2   declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE,IZTMP4_DEVICE,IZTMP5_DEVICE
 !
+INTEGER  :: JIU,JJU,JKU
 !----------------------------------------------------------------------------
 
 !$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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
 
-!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU )
+iztmp5_device = MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU )
+
+!$acc data present( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
 
 !
 !*       1.    DEFINITION of GX_W_UW_DEVICE
@@ -383,6 +398,8 @@ END IF
 
 !$acc end data
 
+CALL MNH_REL_ZT3D( iztmp1_device, iztmp2_device, iztmp3_device, iztmp4_device, iztmp5_device )
+
 !$acc end data
 
 !----------------------------------------------------------------------------
@@ -487,6 +504,7 @@ END FUNCTION GY_W_VW
 !
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
 !
 IMPLICIT NONE
 !
@@ -500,23 +518,30 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY     ! metric coefficient dyy
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ     ! metric coefficient dzz
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY     ! metric coefficient dzy
 !
-REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGY_W_VW_DEVICE ! result VW point
+REAL, DIMENSION(:,:,:),  INTENT(INOUT) :: PGY_W_VW_DEVICE ! result VW point
 !
 !*       0.2   declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous ::  ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE,IZTMP4_DEVICE,IZTMP5_DEVICE
+!
+INTEGER  :: JIU,JJU,JKU
 !
 !----------------------------------------------------------------------------
 
 !$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 ) ) )
+JIU =  size(pa, 1 )
+JJU =  size(pa, 2 )
+JKU =  size(pa, 3 )
 
-!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU )
+iztmp5_device = MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU )
+
+!$acc data present( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
 
 !
 !*       1.    DEFINITION of GY_W_VW_DEVICE
@@ -547,9 +572,12 @@ END IF
 
 !$acc end data
 
+CALL MNH_REL_ZT3D( iztmp1_device, iztmp2_device, iztmp3_device, iztmp4_device, iztmp5_device )
+
 !$acc end data
 
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GY_W_VW_DEVICE
 #endif
+
diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90
index e94ced87e..bd5fbf28a 100644
--- a/src/MNH/mode_mnh_zwork.f90
+++ b/src/MNH/mode_mnh_zwork.f90
@@ -30,18 +30,30 @@ MODULE MODE_MNH_ZWORK
 
   REAL, SAVE, ALLOCATABLE , DIMENSION(:,:,:) :: ZUNIT3D
 
-  INTEGER, parameter                        :: JPMAX_T3D = 40
+  INTEGER, parameter                        :: JPMAX_T3D = 100
   INTEGER , ALLOCATABLE, DIMENSION (:)      :: NT3D_POOL
-  INTEGER                                   :: NT3D_TOP , NT3D_TOP_MAX = 0  
+  INTEGER                                   :: NT3D_TOP , NT3D_TOP_MAX = 0
+  INTEGER                                   :: NT3D_TOP_CURRENT(JPMAX_T3D+1) ,  NT3D_TOP_CURRENT_INDEX = 0
   !REAL    , ALLOCATABLE, DIMENSION(:,:,:,:) , TARGET :: ZT3D_A1,ZT3D_A2,ZT3D_A3,ZT3D_A4
   !REAL    , POINTER    , DIMENSION(:,:,:,:)          :: ZT3D
-  REAL,SAVE    , ALLOCATABLE, DIMENSION(:,:,:,:)          :: ZT3D
+  REAL,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:,:,:)          :: ZT3D
+  
+  REAL,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:)              :: ZT2D_OSIZE
+  REAL,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:,:)            :: ZT3D_OSIZE
+  REAL,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:,:,:)          :: ZT4D_OSIZE
+  
+
   TYPE TMODEL
       REAL    , POINTER, DIMENSION(:,:,:,:) :: X
   END TYPE TMODEL
 
   TYPE(TMODEL) , DIMENSION(10) :: MODEL
 
+  INTEGER, parameter                        :: JPMAX_T3D_G = 4
+  INTEGER , ALLOCATABLE, DIMENSION (:)      :: NT3D_POOL_G
+  INTEGER                                   :: NT3D_TOP_G , NT3D_TOP_G_MAX = 0  
+  LOGICAL,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:,:,:)       :: GT3D
+  
 CONTAINS
 
   SUBROUTINE MNH_ALLOC_ZWORK(IMODEL)
@@ -93,18 +105,38 @@ CONTAINS
        ALLOCATE (ZUNIT3D(IIU,IJU,IKU))
        !$acc enter data create(ZUNIT3D)
 
+!----- Real pool
+       
        !ALLOCATE (ZT3D_A1(IIU,IJU,IKU,JPMAX_T3D))
        !MODEL(1)%X => ZT3D_A1
        !ZT3D => MODEL(1)%X
        ALLOCATE (ZT3D(IIU,IJU,IKU,JPMAX_T3D))
        !$acc enter data create(ZT3D)
 
+       ALLOCATE (ZT2D_OSIZE(IIU,0))
+       ALLOCATE (ZT3D_OSIZE(IIU,IJU,0))
+       ALLOCATE (ZT4D_OSIZE(IIU,IJU,IKU,0))
+       !$acc enter data create(ZT2D_OSIZE,ZT3D_OSIZE,ZT4D_OSIZE)      
+
        ALLOCATE (NT3D_POOL(JPMAX_T3D))
        NT3D_TOP = 0
        DO JI = 1, JPMAX_T3D
           NT3D_POOL(JI) = JI
        END DO
 
+!------ Logical pool
+       
+       ALLOCATE (GT3D(IIU,IJU,IKU,JPMAX_T3D_G))
+       !$acc enter data create(GT3D)
+
+       ALLOCATE (NT3D_POOL_G(JPMAX_T3D))
+       NT3D_TOP_G = 0
+       DO JI = 1, JPMAX_T3D
+          NT3D_POOL_G(JI) = JI
+       END DO
+       
+!------ Default values
+       
        !$acc kernels 
 
        ZPSRC_HALO2_WEST = XUNDEF
@@ -135,10 +167,7 @@ CONTAINS
     ELSE
        NT3D_TOP = NT3D_TOP + 1
        KTEMP = NT3D_POOL(NT3D_TOP)
-       IF (  NT3D_POOL(NT3D_TOP) == -1 ) THEN
-         call Print_msg( NVERB_FATAL, 'GEN', 'MNH_GET_ZT3D_N0', 'slice already reserved' )
-       END IF
-       NT3D_POOL(NT3D_TOP) = -1
+       NT3D_POOL(NT3D_TOP) = - KTEMP
        IF (  NT3D_TOP > NT3D_TOP_MAX ) THEN
           NT3D_TOP_MAX = NT3D_TOP
           WRITE( *, '( " MNH_GET_ZT3D: NT3D_TOP_MAX=",I4," KTEMP=",I4 )' ) NT3D_TOP_MAX,KTEMP
@@ -176,7 +205,6 @@ CONTAINS
     IF (PRESENT(KTEMP17)) CALL MNH_GET_ZT3D_N0(KTEMP17)
     IF (PRESENT(KTEMP18)) CALL MNH_GET_ZT3D_N0(KTEMP18)
 
-
   END SUBROUTINE MNH_GET_ZT3D
 
   SUBROUTINE MNH_GET_ZT4D(KSIZE,KBEG,KEND)
@@ -195,10 +223,10 @@ CONTAINS
        KEND = NT3D_TOP + KSIZE
        NT3D_TOP = NT3D_TOP + KSIZE
        DO JI = KBEG, KEND
-         IF (NT3D_POOL(JI) == -1) THEN
+         IF (NT3D_POOL(JI) <= 0 ) THEN           
            call Print_msg( NVERB_FATAL, 'GEN', 'MNH_GET_ZT4D', 'trying to use area already reserved' )
          END IF
-         NT3D_POOL(JI) = -1
+         NT3D_POOL(JI) = -JI
        END DO
        IF ( NT3D_TOP > NT3D_TOP_MAX ) THEN
           NT3D_TOP_MAX = NT3D_TOP
@@ -215,50 +243,59 @@ CONTAINS
 
     INTEGER :: KTEMP
 
+    IF ( KTEMP .EQ. 0 ) THEN
+       ! Special case Zero size array do nothing
+       RETURN
+    ELSE
+    
     IF ( ( NT3D_TOP > JPMAX_T3D ) .OR. ( NT3D_TOP < 1 ) ) THEN
       call Print_msg( NVERB_FATAL, 'GEN', 'MNH_REL_ZT3D_N0', 'invalid value for NT3D_TOP' )
     ELSE
       NT3D_POOL(KTEMP) = KTEMP
       IF (KTEMP == NT3D_TOP) THEN
         NT3D_TOP = NT3D_TOP - 1
-        DO WHILE (NT3D_TOP > 0 )
-          if ( NT3D_POOL(NT3D_TOP) == -1 ) exit
-          NT3D_TOP = NT3D_TOP - 1
-        END DO
+     ELSE
+        WRITE( *, '( "MNH_REL_ZT3D: releasing ZT3D (",2I8,")" )' ) KTEMP, NT3D_TOP
+        call Print_msg( NVERB_FATAL, 'GEN', 'MNH_REL_ZT3D_N0', 'invalid value for KTEMP <> NT3D_TOP' )
       END IF
     ENDIF
     !WRITE( *, '( "MNH_REL_ZT3D: releasing ZT3D (",I4,")" )' ) KTEMP
+    ENDIF
 
   END SUBROUTINE MNH_REL_ZT3D_N0
 
   SUBROUTINE MNH_REL_ZT3D(KTEMP1,KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9, &
-                          KTEMP10,KTEMP11,KTEMP12,KTEMP13,KTEMP14,KTEMP15,KTEMP16,KTEMP17,KTEMP18)
+                          KTEMP10,KTEMP11,KTEMP12,KTEMP13,KTEMP14,KTEMP15,KTEMP16,KTEMP17,KTEMP18, &
+                          KTEMP19,KTEMP20)
 
     IMPLICIT NONE
 
     INTEGER          :: KTEMP1
     INTEGER,OPTIONAL :: KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9
     INTEGER,OPTIONAL :: KTEMP10,KTEMP11,KTEMP12,KTEMP13,KTEMP14,KTEMP15,KTEMP16,KTEMP17,KTEMP18
+    INTEGER,OPTIONAL :: KTEMP19,KTEMP20
 
-                          CALL MNH_REL_ZT3D_N0(KTEMP1)
-    IF (PRESENT(KTEMP2))  CALL MNH_REL_ZT3D_N0(KTEMP2)
-    IF (PRESENT(KTEMP3))  CALL MNH_REL_ZT3D_N0(KTEMP3)
-    IF (PRESENT(KTEMP4))  CALL MNH_REL_ZT3D_N0(KTEMP4)
-    IF (PRESENT(KTEMP5))  CALL MNH_REL_ZT3D_N0(KTEMP5)
-    IF (PRESENT(KTEMP6))  CALL MNH_REL_ZT3D_N0(KTEMP6)
-    IF (PRESENT(KTEMP7))  CALL MNH_REL_ZT3D_N0(KTEMP7)
-    IF (PRESENT(KTEMP8))  CALL MNH_REL_ZT3D_N0(KTEMP8)
-    IF (PRESENT(KTEMP9))  CALL MNH_REL_ZT3D_N0(KTEMP9)
-    IF (PRESENT(KTEMP10)) CALL MNH_REL_ZT3D_N0(KTEMP10)
-    IF (PRESENT(KTEMP11)) CALL MNH_REL_ZT3D_N0(KTEMP11)
-    IF (PRESENT(KTEMP12)) CALL MNH_REL_ZT3D_N0(KTEMP12)
-    IF (PRESENT(KTEMP13)) CALL MNH_REL_ZT3D_N0(KTEMP13)
-    IF (PRESENT(KTEMP14)) CALL MNH_REL_ZT3D_N0(KTEMP14)
-    IF (PRESENT(KTEMP15)) CALL MNH_REL_ZT3D_N0(KTEMP15)
-    IF (PRESENT(KTEMP16)) CALL MNH_REL_ZT3D_N0(KTEMP16)
-    IF (PRESENT(KTEMP17)) CALL MNH_REL_ZT3D_N0(KTEMP17)
+    IF (PRESENT(KTEMP20)) CALL MNH_REL_ZT3D_N0(KTEMP20)
+    IF (PRESENT(KTEMP19)) CALL MNH_REL_ZT3D_N0(KTEMP19)
     IF (PRESENT(KTEMP18)) CALL MNH_REL_ZT3D_N0(KTEMP18)
-
+    IF (PRESENT(KTEMP17)) CALL MNH_REL_ZT3D_N0(KTEMP17)
+    IF (PRESENT(KTEMP16)) CALL MNH_REL_ZT3D_N0(KTEMP16)
+    IF (PRESENT(KTEMP15)) CALL MNH_REL_ZT3D_N0(KTEMP15)
+    IF (PRESENT(KTEMP14)) CALL MNH_REL_ZT3D_N0(KTEMP14)
+    IF (PRESENT(KTEMP13)) CALL MNH_REL_ZT3D_N0(KTEMP13)
+    IF (PRESENT(KTEMP12)) CALL MNH_REL_ZT3D_N0(KTEMP12)
+    IF (PRESENT(KTEMP11)) CALL MNH_REL_ZT3D_N0(KTEMP11)
+    IF (PRESENT(KTEMP10)) CALL MNH_REL_ZT3D_N0(KTEMP10)
+    IF (PRESENT(KTEMP9))  CALL MNH_REL_ZT3D_N0(KTEMP9)
+    IF (PRESENT(KTEMP8))  CALL MNH_REL_ZT3D_N0(KTEMP8)
+    IF (PRESENT(KTEMP7))  CALL MNH_REL_ZT3D_N0(KTEMP7)
+    IF (PRESENT(KTEMP6))  CALL MNH_REL_ZT3D_N0(KTEMP6)
+    IF (PRESENT(KTEMP5))  CALL MNH_REL_ZT3D_N0(KTEMP5)
+    IF (PRESENT(KTEMP4))  CALL MNH_REL_ZT3D_N0(KTEMP4)
+    IF (PRESENT(KTEMP3))  CALL MNH_REL_ZT3D_N0(KTEMP3)
+    IF (PRESENT(KTEMP2))  CALL MNH_REL_ZT3D_N0(KTEMP2)
+                          CALL MNH_REL_ZT3D_N0(KTEMP1)
+    
   END SUBROUTINE MNH_REL_ZT3D
 
   SUBROUTINE MNH_REL_ZT4D(KSIZE,KBEG)
@@ -271,8 +308,11 @@ CONTAINS
     character(len=16) :: ytxt1, ytxt2
     INTEGER :: JI
 
+    IF ( KSIZE .EQ. 0 ) THEN
+       ! special case of O zero 4D array => ZT4D_OSIZE
+       RETURN
+    END IF
     IF ( KBEG + KSIZE -1 /= NT3D_TOP ) THEN
-!PW TODO: implement holes management
       write( ytxt1, '( I4, "-", I4 )' ) kbeg, kbeg + ksize - 1
       write( ytxt2, '( I4 )' )          NT3D_TOP
       call Print_msg( NVERB_ERROR, 'GEN', 'MNH_REL_ZT4D', 'trying to free area (' // trim( ytxt1 ) // &
@@ -283,17 +323,252 @@ CONTAINS
     END IF
 
     DO JI = KBEG, KBEG+KSIZE-1
-      IF (NT3D_POOL(JI) /= -1) THEN
-      call Print_msg( NVERB_ERROR, 'GEN', 'MNH_REL_ZT4D', 'trying to free area not reserved' )
+       IF (NT3D_POOL(JI) /= - JI ) THEN        
+          call Print_msg( NVERB_ERROR, 'GEN', 'MNH_REL_ZT4D', 'trying to free area not reserved' )
+       ELSE
+          NT3D_POOL(JI) = JI
       END IF
-      NT3D_POOL(JI) = JI
     END DO
     NT3D_TOP = NT3D_TOP - KSIZE
     !WRITE( *, '( "MNH_REL_ZT4D: releasing ZT3D (",I4,I4,")" )' ) KBEG,KBEG+KSIZE-1
 
   END SUBROUTINE MNH_REL_ZT4D
 
+  FUNCTION MNH_ALLOCATE_ZT3D(PTAB,KI,KJ,KK) RESULT (KINDEX)
+    
+    REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB
+    INTEGER , INTENT(IN)    :: KI,KJ,KK
+    INTEGER                 :: KINDEX
+
+    !local
+
+    IF ( (KI .EQ. IIU) .AND. (KJ .EQ. IJU) ) THEN
+       CALL MNH_GET_ZT3D_N0(KINDEX)
+       IF       (KK .LE. IKU)  THEN           
+          PTAB => ZT3D(:,:,1:KK,KINDEX)
+       ELSE IF (KK .EQ.0 )  THEN
+          PTAB => ZT3D_OSIZE
+       ELSE
+          call Print_msg( NVERB_ERROR, 'GEN', 'MNH_ALLOCATE_ZT3D', ' Size mismatsh ' )
+       END IF
+    ELSE
+       call Print_msg( NVERB_ERROR, 'GEN', 'MNH_ALLOCATE_ZT3D', ' Size mismatsh ' )
+    END IF
+       
+  END FUNCTION MNH_ALLOCATE_ZT3D
+
+    FUNCTION MNH_ALLOCATE_ZT4D(PTAB,KI,KJ,KK,KL) RESULT (KINDEX_BEG)
+    
+    REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:,:), INTENT(INOUT) :: PTAB
+    INTEGER , INTENT(IN)    :: KI,KJ,KK,KL
+    INTEGER                 :: KINDEX_BEG
+
+    !local
+
+    INTEGER                 :: KINDEX_END
+
+    IF ( (KI .EQ. IIU) .AND. (KJ .EQ. IJU) .AND. (KK .EQ. IKU) ) THEN
+       IF ( KL .GE. 1 ) THEN
+          CALL MNH_GET_ZT4D(KL,KINDEX_BEG,KINDEX_END)
+          PTAB => ZT3D(:,:,:,KINDEX_BEG:KINDEX_END)
+       ELSE
+          PTAB => ZT4D_OSIZE
+          KINDEX_BEG = 0
+       END IF
+    ELSE
+       call Print_msg( NVERB_ERROR, 'GEN', 'MNH_ALLOCATE_ZT4D', ' Size mismatsh ' )
+    END IF
+       
+  END FUNCTION MNH_ALLOCATE_ZT4D
+
+  FUNCTION MNH_ALLOCATE_ZT2D(PTAB,KI,KJ) RESULT (KINDEX)
+    
+    REAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: PTAB
+    INTEGER , INTENT(IN)    :: KI,KJ
+    INTEGER                 :: KINDEX
+
+    !local
+
+    IF (KI .EQ. IIU) THEN
+       CALL MNH_GET_ZT3D_N0(KINDEX)
+       IF (KJ .EQ. IJU) THEN 
+          PTAB => ZT3D(:,:,1,KINDEX)
+       ELSE IF (KJ .EQ. 0)  THEN
+          PTAB => ZT2D_OSIZE
+       ELSE
+          call Print_msg( NVERB_ERROR, 'GEN', 'MNH_ALLOCATE_ZT2D', ' Size mismatsh ' )
+       END IF
+    ELSE
+       call Print_msg( NVERB_ERROR, 'GEN', 'MNH_ALLOCATE_ZT2D', ' Size mismatsh ' )
+    END IF
+       
+  END FUNCTION MNH_ALLOCATE_ZT2D
+
+  FUNCTION MNH_ALLOCATE_ZT3DP(PTAB,KI,KJ,KKB,KKE) RESULT (KINDEX)
+    
+    REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB
+    INTEGER , INTENT(IN)    :: KI,KJ,KKB,KKE
+    INTEGER                 :: KINDEX
+
+    !local
+
+    IF ( (KI .EQ. IIU) .AND. (KJ .EQ. IJU) .AND. (KKB .LE. IKU) .AND. (KKE  .LE. IKU) ) THEN 
+       CALL MNH_GET_ZT3D_N0(KINDEX)
+       PTAB(1:,1:,KKB:) => ZT3D(:,:,KKB:KKE,KINDEX)
+    ELSE
+       call Print_msg( NVERB_ERROR, 'GEN', 'MNH_ALLOCATE_ZT3DP', ' Size mismatsh ' )
+    END IF
+       
+  END FUNCTION MNH_ALLOCATE_ZT3DP
+
+!-------- Logical Pool Managment
+  
+    SUBROUTINE MNH_GET_GT3D_N0(KTEMP)
+
+    IMPLICIT NONE
+
+    INTEGER :: KTEMP
+
+    IF (NT3D_TOP_G == JPMAX_T3D_G ) THEN
+      call Print_msg( NVERB_FATAL, 'GEN', 'MNH_GET_GT3D_N0', 'NT3D_TOP_G_G too big (increaze JPMAX_T3D_G)' )
+    ELSE
+       NT3D_TOP_G = NT3D_TOP_G + 1
+       KTEMP = NT3D_POOL_G(NT3D_TOP_G)
+       NT3D_POOL_G(NT3D_TOP_G) = - KTEMP
+       IF (  NT3D_TOP_G > NT3D_TOP_G_MAX ) THEN
+          NT3D_TOP_G_MAX = NT3D_TOP_G
+          WRITE( *, '( " MNH_GET_GT3D: NT3D_TOP_G_MAX=",I4," KTEMP=",I4 )' ) NT3D_TOP_G_MAX,KTEMP
+       END IF
+    ENDIF
+    !WRITE( *, '( "MNH_GET_GT3D: reserving GT3D (",I4,")" )' ) KTEMP
+
+  END SUBROUTINE MNH_GET_GT3D_N0
+
+  SUBROUTINE MNH_GET_GT3D(KTEMP1,KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9, &
+                          KTEMP10,KTEMP11,KTEMP12,KTEMP13,KTEMP14,KTEMP15,KTEMP16,KTEMP17,KTEMP18)
+
+    IMPLICIT NONE
+
+    INTEGER          :: KTEMP1
+    INTEGER,OPTIONAL :: KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9
+    INTEGER,OPTIONAL :: KTEMP10,KTEMP11,KTEMP12,KTEMP13,KTEMP14,KTEMP15,KTEMP16,KTEMP17,KTEMP18
+
+                          CALL MNH_GET_GT3D_N0(KTEMP1)
+    IF (PRESENT(KTEMP2))  CALL MNH_GET_GT3D_N0(KTEMP2)
+    IF (PRESENT(KTEMP3))  CALL MNH_GET_GT3D_N0(KTEMP3)
+    IF (PRESENT(KTEMP4))  CALL MNH_GET_GT3D_N0(KTEMP4)
+    IF (PRESENT(KTEMP5))  CALL MNH_GET_GT3D_N0(KTEMP5)
+    IF (PRESENT(KTEMP6))  CALL MNH_GET_GT3D_N0(KTEMP6)
+    IF (PRESENT(KTEMP7))  CALL MNH_GET_GT3D_N0(KTEMP7)
+    IF (PRESENT(KTEMP8))  CALL MNH_GET_GT3D_N0(KTEMP8)
+    IF (PRESENT(KTEMP9))  CALL MNH_GET_GT3D_N0(KTEMP9)
+    IF (PRESENT(KTEMP10)) CALL MNH_GET_GT3D_N0(KTEMP10)
+    IF (PRESENT(KTEMP11)) CALL MNH_GET_GT3D_N0(KTEMP11)
+    IF (PRESENT(KTEMP12)) CALL MNH_GET_GT3D_N0(KTEMP12)
+    IF (PRESENT(KTEMP13)) CALL MNH_GET_GT3D_N0(KTEMP13)
+    IF (PRESENT(KTEMP14)) CALL MNH_GET_GT3D_N0(KTEMP14)
+    IF (PRESENT(KTEMP15)) CALL MNH_GET_GT3D_N0(KTEMP15)
+    IF (PRESENT(KTEMP16)) CALL MNH_GET_GT3D_N0(KTEMP16)
+    IF (PRESENT(KTEMP17)) CALL MNH_GET_GT3D_N0(KTEMP17)
+    IF (PRESENT(KTEMP18)) CALL MNH_GET_GT3D_N0(KTEMP18)
+
+  END SUBROUTINE MNH_GET_GT3D
+
+    SUBROUTINE MNH_REL_GT3D_N0(KTEMP)
+
+    IMPLICIT NONE
+
+    INTEGER :: KTEMP
+
+    IF ( ( NT3D_TOP_G > JPMAX_T3D_G ) .OR. ( NT3D_TOP_G < 1 ) ) THEN
+      call Print_msg( NVERB_FATAL, 'GEN', 'MNH_REL_GT3D_N0', 'invalid value for NT3D_TOP_G' )
+    ELSE
+      NT3D_POOL_G(KTEMP) = KTEMP
+      IF (KTEMP == NT3D_TOP_G) THEN
+        NT3D_TOP_G = NT3D_TOP_G - 1
+     ELSE
+        WRITE( *, '( "MNH_REL_GT3D: releasing GT3D (",2I8,")" )' ) KTEMP, NT3D_TOP_G
+        call Print_msg( NVERB_FATAL, 'GEN', 'MNH_REL_GT3D_N0', 'invalid value for KTEMP <> NT3D_TOP_G' )
+      END IF
+    ENDIF
+    !WRITE( *, '( "MNH_REL_GT3D: releasing GT3D (",I4,")" )' ) KTEMP
+
+  END SUBROUTINE MNH_REL_GT3D_N0
+
+  SUBROUTINE MNH_REL_GT3D(KTEMP1,KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9, &
+                          KTEMP10,KTEMP11,KTEMP12,KTEMP13,KTEMP14,KTEMP15,KTEMP16,KTEMP17,KTEMP18, &
+                          KTEMP19,KTEMP20)
+
+    IMPLICIT NONE
+
+    INTEGER          :: KTEMP1
+    INTEGER,OPTIONAL :: KTEMP2,KTEMP3,KTEMP4,KTEMP5,KTEMP6,KTEMP7,KTEMP8,KTEMP9
+    INTEGER,OPTIONAL :: KTEMP10,KTEMP11,KTEMP12,KTEMP13,KTEMP14,KTEMP15,KTEMP16,KTEMP17,KTEMP18
+    INTEGER,OPTIONAL :: KTEMP19,KTEMP20
+
+    IF (PRESENT(KTEMP20)) CALL MNH_REL_GT3D_N0(KTEMP20)
+    IF (PRESENT(KTEMP19)) CALL MNH_REL_GT3D_N0(KTEMP19)
+    IF (PRESENT(KTEMP18)) CALL MNH_REL_GT3D_N0(KTEMP18)
+    IF (PRESENT(KTEMP17)) CALL MNH_REL_GT3D_N0(KTEMP17)
+    IF (PRESENT(KTEMP16)) CALL MNH_REL_GT3D_N0(KTEMP16)
+    IF (PRESENT(KTEMP15)) CALL MNH_REL_GT3D_N0(KTEMP15)
+    IF (PRESENT(KTEMP14)) CALL MNH_REL_GT3D_N0(KTEMP14)
+    IF (PRESENT(KTEMP13)) CALL MNH_REL_GT3D_N0(KTEMP13)
+    IF (PRESENT(KTEMP12)) CALL MNH_REL_GT3D_N0(KTEMP12)
+    IF (PRESENT(KTEMP11)) CALL MNH_REL_GT3D_N0(KTEMP11)
+    IF (PRESENT(KTEMP10)) CALL MNH_REL_GT3D_N0(KTEMP10)
+    IF (PRESENT(KTEMP9))  CALL MNH_REL_GT3D_N0(KTEMP9)
+    IF (PRESENT(KTEMP8))  CALL MNH_REL_GT3D_N0(KTEMP8)
+    IF (PRESENT(KTEMP7))  CALL MNH_REL_GT3D_N0(KTEMP7)
+    IF (PRESENT(KTEMP6))  CALL MNH_REL_GT3D_N0(KTEMP6)
+    IF (PRESENT(KTEMP5))  CALL MNH_REL_GT3D_N0(KTEMP5)
+    IF (PRESENT(KTEMP4))  CALL MNH_REL_GT3D_N0(KTEMP4)
+    IF (PRESENT(KTEMP3))  CALL MNH_REL_GT3D_N0(KTEMP3)
+    IF (PRESENT(KTEMP2))  CALL MNH_REL_GT3D_N0(KTEMP2)
+    CALL MNH_REL_GT3D_N0(KTEMP1)
+    
+  END SUBROUTINE MNH_REL_GT3D
+
+    FUNCTION MNH_ALLOCATE_GT3D(PTAB,KI,KJ,KK) RESULT (KINDEX)
+    
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB
+    INTEGER , INTENT(IN)    :: KI,KJ,KK
+    INTEGER                 :: KINDEX
+
+    !local
+
+    IF ( (KI .EQ. IIU) .AND. (KJ .EQ. IJU) .AND. (KK .EQ. IKU) ) THEN 
+       CALL MNH_GET_GT3D_N0(KINDEX)
+       PTAB => GT3D(:,:,:,KINDEX)
+    ELSE
+       call Print_msg( NVERB_ERROR, 'GEN', 'MNH_ALLOCATE_GT3D', ' Size mismatsh ' )
+    END IF
+       
+  END FUNCTION MNH_ALLOCATE_GT3D
+
+  SUBROUTINE MNH_CHECK_IN_ZT3D(HSUB)
+    IMPLICIT NONE
+
+    CHARACTER(LEN=*) :: HSUB
+
+    print*,"MNH_CHECK_IN_ZT3D => " , NT3D_TOP_CURRENT_INDEX+1 ,  HSUB
+    NT3D_TOP_CURRENT_INDEX = NT3D_TOP_CURRENT_INDEX + 1
+    NT3D_TOP_CURRENT(NT3D_TOP_CURRENT_INDEX) = NT3D_TOP
+  END SUBROUTINE MNH_CHECK_IN_ZT3D
+
+  SUBROUTINE MNH_CHECK_OUT_ZT3D(HSUB)
+    IMPLICIT NONE
 
+    CHARACTER(LEN=*) :: HSUB
+    
+    print*,"MNH_CHECK_OUT_ZT3D <= " ,  NT3D_TOP_CURRENT_INDEX , HSUB
+    IF ( NT3D_TOP_CURRENT(NT3D_TOP_CURRENT_INDEX) .NE.  NT3D_TOP ) THEN
+        WRITE( *, '( "MNH_CHECK_OUT_ZT3D : NT3D_TOP_CURRENT .NE. NT3D_TOP (",2I8,")" )' )  NT3D_TOP_CURRENT ,  NT3D_TOP
+        call Print_msg( NVERB_ERROR, 'GEN', 'MNH_CHECK_OUT_ZT3D', ' CHECK IN/OUT MISTASK ' )
+     ELSE
+        NT3D_TOP_CURRENT_INDEX = NT3D_TOP_CURRENT_INDEX - 1
+    END IF 
+  END SUBROUTINE MNH_CHECK_OUT_ZT3D
 
 END MODULE MODE_MNH_ZWORK
 #endif
diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90
index 04f03f419..5ac5ddc57 100644
--- a/src/MNH/mode_prandtl.f90
+++ b/src/MNH/mode_prandtl.f90
@@ -15,6 +15,7 @@ USE MODD_PARAMETERS, ONLY : JPVEXT_TURB
 
 #ifdef MNH_OPENACC
 use mode_msg
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_GT3D , MNH_REL_GT3D
 #endif
 
 #ifdef MNH_BITREP
@@ -37,9 +38,18 @@ REAL, DIMENSION(:,:,:), INTENT(IN)    :: PF_LIM  ! Value of F when Phi3 is
 !                                                ! larger than Phi_lim
 REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PF      ! function F to smooth
 !
+#ifndef MNH_OPENACC
 REAL, DIMENSION(SIZE(PF,1),SIZE(PF,2),SIZE(PF,3)) :: ZCOEF
+#else
+REAL, DIMENSION(:,:,:), pointer,contiguous ::  ZCOEF
+INTEGER ::  IZCOEF
+#endif
 
-!$acc data present( PPHI3, PF_LIM, PF ) create( ZCOEF )
+#ifdef MNH_OPENACC
+ IZCOEF = MNH_ALLOCATE_ZT3D( ZCOEF , SIZE(PF,1),SIZE(PF,2),SIZE(PF,3) )
+#endif
+
+!$acc data present( PPHI3, PF_LIM, PF ) present( ZCOEF )
 
 !* adds a artificial correction to smooth the function near the discontinuity
 !  point at Phi3 = Phi_lim
@@ -56,6 +66,10 @@ PF(:,:,:) =     ZCOEF(:,:,:)   * PF    &
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_REL_ZT3D(IZCOEF)
+#endif
+
 END SUBROUTINE SMOOTH_TURB_FUNCT
 !----------------------------------------------------------------------------
 #ifndef MNH_OPENACC
@@ -77,19 +91,33 @@ SUBROUTINE PHI3(PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PPHI3)
 #endif
 !
   INTEGER                               :: IKB, IKE
-  LOGICAL,DIMENSION(:,:,:), allocatable :: PHI3LOGIC
-  REAL,   DIMENSION(:,:,:), allocatable :: ZW1, ZW2
+  LOGICAL,DIMENSION(:,:,:),  pointer , contiguous :: GPHI3LOGIC
+  REAL,   DIMENSION(:,:,:),  pointer , contiguous :: ZW1, ZW2
+  INTEGER                                         :: IGPHI3LOGIC,IZW1, IZW2
 
+  INTEGER  :: JIU,JJU,JKU
+  INTEGER  :: JI,JJ,JK
+  
 !$acc data present( PREDTH1, PREDR1, PRED2TH3, PRED2R3, PRED2THR3, PPHI3 )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PREDTH1,3)-JPVEXT_TURB
 
+JIU =  size( predth1, 1 )
+JJU =  size( predth1, 2 )
+JKU =  size( predth1, 3 )
+
+#ifndef MNH_OPENACC
 allocate( zw1      ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
 allocate( zw2      ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
-allocate( phi3logic( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
+allocate( gphi3logic( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) )
+#else
+izw1        = MNH_ALLOCATE_ZT3D( zw1       , JIU,JJU,JKU )
+izw2        = MNH_ALLOCATE_ZT3D( zw2       , JIU,JJU,JKU )
+igphi3logic = MNH_ALLOCATE_GT3D( gphi3logic, JIU,JJU,JKU )
+#endif
 
-!$acc data create( zw1, zw2, phi3logic )
+!$acc data present( zw1, zw2, gphi3logic )
 
 !$acc kernels
 IF (HTURBDIM=='3DIM') THEN
@@ -124,8 +152,8 @@ IF (HTURBDIM=='3DIM') THEN
 !WARNING: BUG PGI (tested up to PGI 16.10): necessary to use a logical mask
 !because the compiler does not manage correctly the .OR. in the WHERE
   !WHERE( PPHI3 <= 0. .OR. PPHI3 > XPHI_LIM )
-  PHI3LOGIC = (PPHI3 <= 0. .OR. PPHI3 > XPHI_LIM)
-  WHERE( PHI3LOGIC )
+  GPHI3LOGIC = (PPHI3 <= 0. .OR. PPHI3 > XPHI_LIM)
+  WHERE( GPHI3LOGIC )
     PPHI3 = XPHI_LIM
   END WHERE
 
@@ -144,6 +172,13 @@ PPHI3(:,:,IKE+1)=PPHI3(:,:,IKE)
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate ( zw1,zw2,gphi3logic)
+#else
+CALL MNH_REL_ZT3D(IZW1,IZW2)
+CALL MNH_REL_GT3D(IGPHI3LOGIC)
+#endif
+
 !$acc end data
 
 #ifndef MNH_OPENACC
@@ -172,13 +207,18 @@ SUBROUTINE PSI_SV(PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3,PPSI_SV)
 !
   INTEGER :: IKB, IKE
   INTEGER :: JSV
-  LOGICAL, DIMENSION(:,:,:), allocatable :: PSILOGIC
+  LOGICAL, DIMENSION(:,:,:),  pointer , contiguous :: GPSILOGIC
+  INTEGER                                          :: IGPSILOGIC
 
 !$acc data present( PREDTH1, PREDR1, PREDS1, PRED2THS, PRED2RS, PPHI3, PPSI3, PPSI_SV )
 
-allocate( psilogic( size( pred2ths, 1 ), size( pred2ths, 2 ), size( pred2ths, 3 ) ) )
+#ifndef MNH_OPENACC  
+allocate( gpsilogic( size( pred2ths, 1 ), size( pred2ths, 2 ), size( pred2ths, 3 ) ) )
+#else
+igpsilogic = MNH_ALLOCATE_GT3D( gpsilogic , size( pred2ths, 1 ), size( pred2ths, 2 ), size( pred2ths, 3 ) )
+#endif  
 
-!$acc data create( psilogic )
+!$acc data present( gpsilogic )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PREDTH1,3)-JPVEXT_TURB
@@ -196,8 +236,8 @@ DO JSV=1,SIZE(PPSI_SV,4)
 !because the compiler does not manage correctly the .AND. in the WHERE
 !Failure during execution
   !WHERE ( (PPSI_SV(:,:,:,JSV) <=0.).AND. (PREDTH1+PREDR1) <= 0. )
-  PSILOGIC = ((PPSI_SV(:,:,:,JSV) <=0.).AND. (PREDTH1+PREDR1) <= 0. )
-  WHERE ( PSILOGIC )
+  GPSILOGIC = ((PPSI_SV(:,:,:,JSV) <=0.).AND. (PREDTH1+PREDR1) <= 0. )
+  WHERE ( GPSILOGIC )
     PPSI_SV(:,:,:,JSV)=XPHI_LIM
   END WHERE
   PPSI_SV(:,:,:,JSV) = MAX( 1.E-4, MIN(XPHI_LIM,PPSI_SV(:,:,:,JSV)) )
@@ -209,6 +249,12 @@ END DO
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( gpsilogic )
+#else
+CALL MNH_REL_GT3D(IGPSILOGIC)
+#endif
+
 !$acc end data
 
 #ifndef MNH_OPENACC
@@ -399,16 +445,17 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU
 #endif
   INTEGER :: IKB, IKE
 #ifdef MNH_OPENACC
-  REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+  REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE
+  INTEGER  :: IZTMP1_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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device, size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) )
 #endif
 
-!$acc data create( ztmp1_device )
+!$acc data present( ztmp1_device )
 
 IKB = 1+JPVEXT_TURB
 IKE = SIZE(PREDTH1,3)-JPVEXT_TURB
@@ -469,6 +516,10 @@ PD_PHI3DTDZ2_O_DDTDZ(:,:,IKE+1)=PD_PHI3DTDZ2_O_DDTDZ(:,:,IKE)
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_REL_ZT3D( iztmp1_device )
+#endif
+
 !$acc end data
 
 #ifndef MNH_OPENACC
diff --git a/src/MNH/ppm_met.f90 b/src/MNH/ppm_met.f90
index f9f2d3e6c..76cebf49b 100644
--- a/src/MNH/ppm_met.f90
+++ b/src/MNH/ppm_met.f90
@@ -170,7 +170,7 @@ END IF
 !*       1.     COMPUTES THE DOMAIN DIMENSIONS
 !               ------------------------------
 !
-GTKEALLOC = SIZE(PTKET,1) /= 0
+GTKEALLOC = SIZE(PTKET) /= 0
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90
index 89a3542ca..0b0815ba5 100644
--- a/src/MNH/prandtl.f90
+++ b/src/MNH/prandtl.f90
@@ -75,8 +75,6 @@ END INTERFACE
 !
 END MODULE MODI_PRANDTL
 !
-!
-!
 !     ###########################################################
       SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OCLOSE_OUT,OTURB_DIAG,&
                          HTURBDIM,                             &
@@ -220,6 +218,11 @@ USE MODI_SHUMAN
 USE MODI_SHUMAN_DEVICE
 #endif
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, &
+      MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D
+#endif
+!
 IMPLICIT NONE
 !
 !
@@ -274,7 +277,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)  ::  PEMOIST ! coefficient E_moist
 !
 !       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZW1, ZW2 ! work arrays
+REAL, DIMENSION(:,:,:),  pointer , contiguous :: ZW1
+REAL, DIMENSION(:,:,:),  pointer , contiguous :: ZW2 ! work arrays
+#ifdef MNH_OPENACC
+INTEGER                                      :: IZW1, IZW2
+#endif
 !                                                     
 INTEGER :: IKB      ! vertical index value for the first inner mass point
 INTEGER :: IKE      ! vertical index value for the last inner mass point
@@ -285,13 +292,17 @@ INTEGER :: JLOOP
 REAL    :: ZMINVAL
 !
 #ifdef MNH_OPENACC
-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(:,:,:), pointer , contiguous :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP5_DEVICE
+INTEGER   :: IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE,IZTMP4_DEVICE,IZTMP5_DEVICE
 #endif
 TYPE(TFIELDDATA)  :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PDXX, PDYY, PDZZ, PDZX, PDZY,                                               &
@@ -320,18 +331,28 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size( pthlm, 1 )
+JJU =  size( pthlm, 2 )
+JKU =  size( pthlm, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zw1(JIU,JJU,JKU ) )
+allocate( zw2(JIU,JJU,JKU ) )
+#else
+CALL MNH_CHECK_IN_ZT3D("PRANDTL")
+izw1 = MNH_ALLOCATE_ZT3D( zw1, JIU,JJU,JKU )
+izw2 = MNH_ALLOCATE_ZT3D( zw2, JIU,JJU,JKU )
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device, JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device, JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device, JIU,JJU,JKU )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device, JIU,JJU,JKU )
+iztmp5_device = MNH_ALLOCATE_ZT3D( ztmp5_device, JIU,JJU,JKU )
 #endif
 
-!$acc data create( zw1, zw2, ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
+!$acc data present( zw1, zw2, ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
 
 !
 !*      1.  DEFAULT VALUES,  1D REDELSPERGER NUMBERS 
@@ -362,7 +383,8 @@ PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL)
 !          1.3 1D Redelsperger numbers
 !
 #ifndef MNH_OPENACC
-PBLL_O_E(:,:,:) = MZM( XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:) )
+PBLL_O_E(:,:,:) = MZM( XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) &
+                                      / PTKEM(:,:,:) )
 IF (KRR /= 0) THEN                ! moist case
   PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * &
                    & GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ)
@@ -374,23 +396,24 @@ ELSE                              ! dry case
 END IF
 #else
 !$acc kernels
-ZTMP1_DEVICE(:,:,:) = XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:)
+ZTMP1_DEVICE(:,:,:) = XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) &
+                                     / PTKEM(:,:,:)
 !$acc end kernels
 CALL MZM_DEVICE(ZTMP1_DEVICE,PBLL_O_E)
 IF (KRR /= 0) THEN                ! moist case
   CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PTHLM,PDZZ,ZTMP1_DEVICE)
-!$acc kernels async
-  PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * ZTMP1_DEVICE
+!$acc kernels ! async
+  PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * ZTMP1_DEVICE(:,:,:)
 !$acc end kernels  
   CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ,ZTMP2_DEVICE)
-!$acc kernels async
-  PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * ZTMP2_DEVICE
+!$acc kernels ! async
+  PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * ZTMP2_DEVICE(:,:,:)
 !$acc end kernels  
-!$acc wait
+! acc wait
 ELSE                              ! dry case
   CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PTHLM,PDZZ,ZTMP1_DEVICE)
 !$acc kernels
-  PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:)  * ZTMP1_DEVICE
+  PREDTH1(:,:,:) = XCTV*PBLL_O_E(:,:,:)  * ZTMP1_DEVICE(:,:,:)
   PREDR1(:,:,:) = 0.
 !$acc end kernels
 END IF
@@ -399,46 +422,63 @@ END IF
 !       3. Limits on 1D Redelperger numbers
 !          --------------------------------
 !
-!$acc kernels
 ZMINVAL = (1.-1./XPHI_LIM)
 !
-ZW1 = 1.
-ZW2 = 1.
-!
-WHERE (PREDTH1+PREDR1<-ZMINVAL)
-  ZW1 = (-ZMINVAL) / (PREDTH1+PREDR1)
+!$acc kernels
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZW1(JI,JJ,JK) = 1.
+   ZW2(JI,JJ,JK) = 1.
+END DO
+
+WHERE (PREDTH1(:,:,:)+PREDR1(:,:,:) < -ZMINVAL)
+  ZW1(:,:,:) = (-ZMINVAL) / (PREDTH1(:,:,:)+PREDR1(:,:,:))
 END WHERE
-!
-WHERE (PREDTH1<-ZMINVAL)
-  ZW2 = (-ZMINVAL) / (PREDTH1)
+
+WHERE (PREDTH1(:,:,:) < -ZMINVAL)
+  ZW2(:,:,:) = (-ZMINVAL) / (PREDTH1(:,:,:))
 END WHERE
-ZW2 = MIN(ZW1,ZW2)
-!
-ZW1 = 1.
-WHERE (PREDR1<-ZMINVAL)
-  ZW1 = (-ZMINVAL) / (PREDR1)
+
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZW2(JI,JJ,JK) = MIN( ZW1(JI,JJ,JK),ZW2(JI,JJ,JK) )
+END DO
+
+ZW1(:,:,:) = 1.
+WHERE (PREDR1(:,:,:)<-ZMINVAL)
+  ZW1(:,:,:) = (-ZMINVAL) / (PREDR1(:,:,:))
 END WHERE
-ZW1 = MIN(ZW2,ZW1)
+
+!!$ZW1(:,:,:) = MIN(ZW2(:,:,:),ZW1(:,:,:))
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZW1(JI,JJ,JK) = MIN( ZW2(JI,JJ,JK),ZW1(JI,JJ,JK) )
+END DO
 !
+!$acc end kernels
 !
 !       3. Modification of Mixing length and dissipative length
 !          ----------------------------------------------------
 !
-PBLL_O_E(:,:,:) = PBLL_O_E(:,:,:) * ZW1(:,:,:)
-PREDTH1 (:,:,:) = PREDTH1 (:,:,:) * ZW1(:,:,:)
-PREDR1  (:,:,:) = PREDR1  (:,:,:) * ZW1(:,:,:)
+!$acc kernels
+!
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   PBLL_O_E(JI,JJ,JK) = PBLL_O_E(JI,JJ,JK) * ZW1(JI,JJ,JK)
+   PREDTH1 (JI,JJ,JK) = PREDTH1 (JI,JJ,JK) * ZW1(JI,JJ,JK)
+   PREDR1  (JI,JJ,JK) = PREDR1  (JI,JJ,JK) * ZW1(JI,JJ,JK)
+END DO !CONCURRENT
 !
 !       4. Threshold for very small (in absolute value) Redelperger numbers
 !          ----------------------------------------------------------------
 !
-ZW2=SIGN(1.,PREDTH1(:,:,:))
+ZW2(:,:,:)=SIGN(1.,PREDTH1(:,:,:))
 PREDTH1(:,:,:)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDTH1(:,:,:))
+!$acc end kernels
 !
 IF (KRR /= 0) THEN                ! dry case
-  ZW2=SIGN(1.,PREDR1(:,:,:))
+!$acc kernels
+  ZW2(:,:,:)=SIGN(1.,PREDR1(:,:,:))
   PREDR1(:,:,:)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDR1(:,:,:))
+ !$acc end kernels 
 END IF
-!$acc end kernels
+
 !
 !---------------------------------------------------------------------------
 !
@@ -452,14 +492,14 @@ END DO
 DO JSV=1,ISV
   CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ,ZTMP1_DEVICE)
 !$acc kernels
-  PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*ZTMP1_DEVICE
+  PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*ZTMP1_DEVICE(:,:,:)
 !$acc end kernels
 END DO
 #endif
 !
 !$acc kernels
 DO JSV=1,ISV
-  ZW2=SIGN(1.,PREDS1(:,:,:,JSV))
+  ZW2(:,:,:)=SIGN(1.,PREDS1(:,:,:,JSV))
   PREDS1(:,:,:,JSV)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDS1(:,:,:,JSV))
 END DO
 !$acc end kernels
@@ -471,7 +511,7 @@ END DO
 !
 IF(HTURBDIM=='1DIM') THEN        ! 1D case
 !
-!$acc kernels async
+!$acc kernels ! async
 #ifndef MNH_BITREP
   PRED2TH3(:,:,:)  = PREDTH1(:,:,:)**2
 #else
@@ -479,7 +519,7 @@ IF(HTURBDIM=='1DIM') THEN        ! 1D case
 #endif
 !$acc end kernels
 !
-!$acc kernels async
+!$acc kernels ! async
 #ifndef MNH_BITREP
   PRED2R3(:,:,:)   = PREDR1(:,:,:) **2
 #else
@@ -487,10 +527,10 @@ IF(HTURBDIM=='1DIM') THEN        ! 1D case
 #endif
 !$acc end kernels
 !
-!$acc kernels async
+!$acc kernels ! async
   PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:)
 !$acc end kernels
-!$acc wait
+! acc wait
 !
 ELSE IF (L2D) THEN                      ! 3D case in a 2D model
 !
@@ -508,17 +548,23 @@ ELSE IF (L2D) THEN                      ! 3D case in a 2D model
     CALL GX_M_M_DEVICE(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    ZTMP1_DEVICE = ZTMP1_DEVICE**2
+    ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)**2
 #else
-    ZTMP1_DEVICE = BR_P2(ZTMP1_DEVICE)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)    
+   ZTMP1_DEVICE(JI,JJ,JK) = BR_P2(ZTMP1_DEVICE(JI,JJ,JK))
+END DO !CONCURRENT   
 #endif
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE )
-!$acc kernels async
+!$acc kernels ! async
 #ifndef MNH_BITREP
-    PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * ZTMP2_DEVICE
+    PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 &
+                                + (XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 &
+                                * ZTMP2_DEVICE(:,:,:)
 #else
-    PRED2TH3(:,:,:)= BR_P2(PREDTH1(:,:,:))+BR_P2(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) ) * ZTMP2_DEVICE
+    PRED2TH3(:,:,:) = BR_P2(PREDTH1(:,:,:)) &
+                                + BR_P2(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) ) &
+                                * ZTMP2_DEVICE(:,:,:)
 #endif
     PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL)
 !$acc end kernels
@@ -526,28 +572,36 @@ ELSE IF (L2D) THEN                      ! 3D case in a 2D model
 !
 #ifndef MNH_OPENACC
 #ifndef MNH_BITREP
-    PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * &
-        MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 )
+    PRED2R3(:,:,:) = PREDR1(:,:,:)**2  &
+                               + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 &
+                               * MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 )
 #else
-    PRED2R3(:,:,:)= BR_P2(PREDR1(:,:,:)) + BR_P2(XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:)) * &
-        MZM( BR_P2(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)) )
+    PRED2R3(:,:,:) = BR_P2(PREDR1(:,:,:)) &
+                               + BR_P2(XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:)) &
+                               * MZM( BR_P2(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)) )
 #endif
     PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL)
 #else
     CALL GX_M_M_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    ZTMP1_DEVICE = ZTMP1_DEVICE**2
+    ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)**2
 #else
-    ZTMP1_DEVICE = BR_P2(ZTMP1_DEVICE)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP1_DEVICE(JI,JJ,JK) = BR_P2(ZTMP1_DEVICE(JI,JJ,JK))
+    END DO !CONCURRENT   
 #endif
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE )
-!$acc kernels async
+!$acc kernels ! async
 #ifndef MNH_BITREP
-    PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * ZTMP2_DEVICE
+    PRED2R3(:,:,:) = PREDR1(:,:,:)**2 &
+                               + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 &
+                               * ZTMP2_DEVICE(:,:,:)
 #else
-    PRED2R3(:,:,:)= BR_P2(PREDR1(:,:,:)) + BR_P2(XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:)) * ZTMP2_DEVICE
+    PRED2R3(:,:,:) = BR_P2(PREDR1(:,:,:)) &
+                               + BR_P2(XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:)) &
+                               * ZTMP2_DEVICE(:,:,:)
 #endif
     PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL)
 !$acc end kernels
@@ -555,9 +609,11 @@ ELSE IF (L2D) THEN                      ! 3D case in a 2D model
 !
 #ifndef MNH_OPENACC
 #ifndef MNH_BITREP
-    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) +  XCTV**2*PBLL_O_E(:,:,:)**2 *   &
+    PRED2THR3(:,:,:) = PREDR1(:,:,:) * PREDTH1(:,:,:) &
+                                 +  XCTV**2*PBLL_O_E(:,:,:)**2 *   &
 #else
-    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) *   &
+                                 PRED2THR3(:,:,:) = PREDR1(:,:,:) * PREDTH1(:,:,:) &
+                                 +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) *   &
 #endif
                   PEMOIST(:,:,:) * PETHETA(:,:,:) *                         &
       MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)*     &
@@ -567,19 +623,26 @@ ELSE IF (L2D) THEN                      ! 3D case in a 2D model
     CALL GX_M_M_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
     CALL GX_M_M_DEVICE(KKA,KKU,KKL,PTHLM       ,PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
 !$acc kernels
-    ZTMP1_DEVICE = ZTMP1_DEVICE * ZTMP2_DEVICE
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)    
+   ZTMP1_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
+END DO
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
-!$acc kernels async
+!$acc kernels ! async
 #ifndef MNH_BITREP
-    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) +  XCTV**2*PBLL_O_E(:,:,:)**2 *   &
+    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) &
+                                + XCTV**2*PBLL_O_E(:,:,:)**2   &
+                                * PEMOIST(:,:,:) * PETHETA(:,:,:) &
+                                * ZTMP2_DEVICE(:,:,:)
 #else
-    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) *   &
-#endif
-                  PEMOIST(:,:,:) * PETHETA(:,:,:) * ZTMP2_DEVICE
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)           
+    PRED2THR3(JI,JJ,JK)= PREDR1(JI,JJ,JK) * PREDTH1(JI,JJ,JK) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(JI,JJ,JK)) *   &
+         PEMOIST(JI,JJ,JK) * PETHETA(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
+END DO
+#endif                
     PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL)
 !$acc end kernels
-!$acc wait
+! acc wait
 #endif
 !
   ELSE                 ! dry 3D case in a 2D model
@@ -599,17 +662,21 @@ call Print_msg( NVERB_WARNING, 'GEN', 'PRANDTL', 'OpenACC: L2D=.T. and KRR=0 not
     CALL GX_M_M_DEVICE(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    ZTMP1_DEVICE = ZTMP1_DEVICE**2
+    ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)**2
 #else
-    ZTMP1_DEVICE = BR_P2(ZTMP1_DEVICE)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP1_DEVICE(JI,JJ,JK) = BR_P2(ZTMP1_DEVICE(JI,JJ,JK))
+    END DO !CONCURRENT 
 #endif
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 +  XCTV**2*PBLL_O_E(:,:,:)**2 * ZTMP2_DEVICE
+    PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 +  XCTV**2*PBLL_O_E(:,:,:)**2 * &
+                                  ZTMP2_DEVICE(:,:,:)
 #else
-    PRED2TH3(:,:,:) = BR_P2(PREDTH1(:,:,:)) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) * ZTMP2_DEVICE
+    PRED2TH3(:,:,:) = BR_P2(PREDTH1(:,:,:)) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) * &
+                                  ZTMP2_DEVICE(:,:,:)
 #endif
 !PW: merge kernels + remove async to prevent compiler crash...(bug PGI 19.10)
 ! !$acc end kernels
@@ -634,13 +701,15 @@ ELSE                                 ! 3D case in a 3D model
   IF (KRR /= 0) THEN                 ! moist 3D case
 #ifndef MNH_OPENACC
 #ifndef MNH_BITREP
-    PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 +  ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * &
-      MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 &
-      + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 )
+     PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2  &
+                                 +  ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 &
+                                 *  MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 &
+                                 +  GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 )
 #else
-    PRED2TH3(:,:,:)= BR_P2(PREDTH1(:,:,:)) +  BR_P2( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) ) * &
-      MZM( BR_P2(GX_M_M(PTHLM,PDXX,PDZZ,PDZX)) &
-      + BR_P2(GY_M_M(PTHLM,PDYY,PDZZ,PDZY)) )
+     PRED2TH3(:,:,:) = BR_P2(PREDTH1(:,:,:)) &
+                                 +  BR_P2( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) ) &
+                                 *  MZM( BR_P2(GX_M_M(PTHLM,PDXX,PDZZ,PDZX)) &
+                                 +  BR_P2(GY_M_M(PTHLM,PDYY,PDZZ,PDZY)) )
 #endif
     PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL)
 #else
@@ -648,17 +717,23 @@ ELSE                                 ! 3D case in a 3D model
     CALL GY_M_M_DEVICE(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY,ZTMP2_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    ZTMP1_DEVICE = ZTMP1_DEVICE**2 + ZTMP2_DEVICE**2
+    ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)**2 + ZTMP2_DEVICE(:,:,:)**2
 #else
-    ZTMP1_DEVICE = BR_P2(ZTMP1_DEVICE) + BR_P2(ZTMP2_DEVICE)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)    
+   ZTMP1_DEVICE(JI,JJ,JK) = BR_P2(ZTMP1_DEVICE(JI,JJ,JK)) + BR_P2(ZTMP2_DEVICE(JI,JJ,JK))
+END DO
 #endif
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 +  ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * ZTMP2_DEVICE
+    PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 &
+                                +  ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 &
+                                *   ZTMP2_DEVICE(:,:,:)
 #else
-    PRED2TH3(:,:,:)= BR_P2(PREDTH1(:,:,:)) +  BR_P2( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) ) * ZTMP2_DEVICE
+    PRED2TH3(:,:,:) = BR_P2(PREDTH1(:,:,:)) &
+                                + BR_P2( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) ) &
+                                * ZTMP2_DEVICE(:,:,:)
 #endif
     PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL)
 !$acc end kernels
@@ -666,13 +741,15 @@ ELSE                                 ! 3D case in a 3D model
 !
 #ifndef MNH_OPENACC
 #ifndef MNH_BITREP
-    PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 *      &
-        MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + &
-        GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 )
+    PRED2R3(:,:,:) = PREDR1(:,:,:)**2 &
+                               + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 &
+                               * MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2  &
+                               + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 )
 #else
-    PRED2R3(:,:,:)= BR_P2(PREDR1(:,:,:)) + BR_P2(XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:)) *      &
-        MZM( BR_P2(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)) + &
-        BR_P2(GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)) )
+    PRED2R3(:,:,:) = BR_P2(PREDR1(:,:,:)) &
+                               + BR_P2(XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:)) &
+                               * MZM( BR_P2(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)) &
+                               +BR_P2(GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)) )
 #endif
     PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL)
 #else
@@ -680,31 +757,39 @@ ELSE                                 ! 3D case in a 3D model
     CALL GY_M_M_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP2_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    ZTMP1_DEVICE = ZTMP1_DEVICE**2 + ZTMP2_DEVICE**2
+    ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)**2 + ZTMP2_DEVICE(:,:,:)**2
 #else
-    ZTMP1_DEVICE = BR_P2(ZTMP1_DEVICE) + BR_P2(ZTMP2_DEVICE)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)    
+   ZTMP1_DEVICE(JI,JJ,JK) = BR_P2(ZTMP1_DEVICE(JI,JJ,JK)) + BR_P2(ZTMP2_DEVICE(JI,JJ,JK))
+END DO   
 #endif
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * ZTMP2_DEVICE
+    PRED2R3(:,:,:) = PREDR1(:,:,:)**2 &
+                               + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 &
+                               *  ZTMP2_DEVICE(:,:,:)
 #else
-    PRED2R3(:,:,:)= BR_P2(PREDR1(:,:,:)) + BR_P2(XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:)) * ZTMP2_DEVICE
+    PRED2R3(:,:,:) = BR_P2(PREDR1(:,:,:)) &
+                               + BR_P2(XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:)) &
+                               * ZTMP2_DEVICE(:,:,:)
 #endif
 !$acc end kernels
-!$acc kernels async
+!$acc kernels ! async
     PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL)
 !$acc end kernels
 #endif
 !
 #ifndef MNH_OPENACC
 #ifndef MNH_BITREP
-    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) +  XCTV**2*PBLL_O_E(:,:,:)**2 *   &
+    PRED2THR3(:,:,:) = PREDR1(:,:,:) * PREDTH1(:,:,:) &
+                                +  XCTV**2*PBLL_O_E(:,:,:)**2 *  &
 #else
-    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) *   &
+                                PRED2THR3(:,:,:) = PREDR1(:,:,:) * PREDTH1(:,:,:) &
+                                +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) * &
 #endif
-         PEMOIST(:,:,:) * PETHETA(:,:,:) *                            &
+         PEMOIST(:,:,:) * PETHETA(:,:,:) *  &
          MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)*   &
          GX_M_M(PTHLM,PDXX,PDZZ,PDZX)+                           &
          GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)*                    &
@@ -716,21 +801,26 @@ ELSE                                 ! 3D case in a 3D model
     CALL GY_M_M_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP3_DEVICE)
     CALL GY_M_M_DEVICE(KKA,KKU,KKL,PTHLM       ,PDYY,PDZZ,PDZY,ZTMP4_DEVICE)
 !$acc kernels
-    ZTMP1_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE+ZTMP3_DEVICE*ZTMP4_DEVICE
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)    
+    ZTMP1_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)+ &
+                                      ZTMP3_DEVICE(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK)
+END DO    
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) +  XCTV**2*PBLL_O_E(:,:,:)**2 *   &
+    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) &
+                                +  XCTV**2*PBLL_O_E(:,:,:)**2 *   &
 #else
-    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) *   &
+    PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) &
+                                +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) *   &
 #endif
-         PEMOIST(:,:,:) * PETHETA(:,:,:) * ZTMP2_DEVICE
+         PEMOIST(:,:,:) * PETHETA(:,:,:) * ZTMP2_DEVICE(:,:,:)
 !$acc end kernels
-!$acc kernels async
+!$acc kernels ! async
     PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL)
 !$acc end kernels
-!$acc wait
+! acc wait
 #endif
 !
   ELSE                 ! dry 3D case in a 3D model
@@ -752,32 +842,36 @@ call Print_msg( NVERB_WARNING, 'GEN', 'PRANDTL', 'OpenACC: L2D=.F. and KRR=0 not
     CALL GY_M_M_DEVICE(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY,ZTMP2_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    ZTMP1_DEVICE = ZTMP1_DEVICE**2 + ZTMP2_DEVICE**2
+    ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)**2 + ZTMP2_DEVICE(:,:,:)**2
 #else
-    ZTMP1_DEVICE = BR_P2(ZTMP1_DEVICE) + BR_P2(ZTMP2_DEVICE)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)  
+   ZTMP1_DEVICE(JI,JJ,JK) = BR_P2(ZTMP1_DEVICE(JI,JJ,JK)) + BR_P2(ZTMP2_DEVICE(JI,JJ,JK))
+END DO   
 #endif
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
 #ifndef MNH_BITREP
-    PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 +  XCTV**2*PBLL_O_E(:,:,:)**2 * ZTMP2_DEVICE
+    PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 +  XCTV**2*PBLL_O_E(:,:,:)**2 &
+                                * ZTMP2_DEVICE(:,:,:)
 #else
-    PRED2TH3(:,:,:) = BR_P2(PREDTH1(:,:,:)) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) * ZTMP2_DEVICE
+    PRED2TH3(:,:,:) = BR_P2(PREDTH1(:,:,:)) +  BR_P2(XCTV)*BR_P2(PBLL_O_E(:,:,:)) &
+                                * ZTMP2_DEVICE(:,:,:)
 #endif
 !$acc end kernels
 #endif
-!$acc kernels async
+!$acc kernels ! async
     PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL)
 !$acc end kernels
 !
-!$acc kernels async
+!$acc kernels ! async
     PRED2R3(:,:,:) = 0.
 !$acc end kernels
 !
-!$acc kernels async
+!$acc kernels ! async
     PRED2THR3(:,:,:) = 0.
 !$acc end kernels
-!$acc wait
+! acc wait
 !
   END IF
 !
@@ -791,16 +885,20 @@ END IF   ! end of the if structure on the turbulence dimensionnality
 !
 IF(HTURBDIM=='1DIM') THEN
 !        1D case
-!$acc kernels
   DO JSV=1,ISV
+    !$acc kernels
     PRED2THS3(:,:,:,JSV)  = PREDS1(:,:,:,JSV) * PREDTH1(:,:,:)
+    !$acc end kernels
     IF (KRR /= 0) THEN
+      !$acc kernels
       PRED2RS3(:,:,:,JSV)   = PREDR1(:,:,:) *PREDS1(:,:,:,JSV)
+      !$acc end kernels
     ELSE
+      !$acc kernels
       PRED2RS3(:,:,:,JSV)   = 0.
+      !$acc end kernels
     END IF
   ENDDO
-!$acc end kernels
 !
 ELSE  IF (L2D) THEN ! 3D case in a 2D model
 !
@@ -823,9 +921,9 @@ ELSE  IF (L2D) THEN ! 3D case in a 2D model
   DO JSV=1,ISV
 !$acc kernels
 #ifndef MNH_BITREP
-    ZTMP1_DEVICE = (XG / PTHVREF * PLM * PLEPS / PTKEM)**2
+    ZTMP1_DEVICE(:,:,:) = (XG / PTHVREF * PLM * PLEPS / PTKEM)**2
 #else
-    ZTMP1_DEVICE = BR_P2(XG / PTHVREF * PLM * PLEPS / PTKEM)
+    ZTMP1_DEVICE(:,:,:) = BR_P2(XG / PTHVREF * PLM * PLEPS / PTKEM)
 #endif
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZW1)
@@ -846,11 +944,11 @@ ELSE  IF (L2D) THEN ! 3D case in a 2D model
     CALL GX_M_M_DEVICE(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
     CALL GX_M_M_DEVICE(KKA,KKU,KKL,PTHLM          ,PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
 !$acc kernels
-      ZTMP1_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE
+      ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
-    PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + ZW1 * ZTMP2_DEVICE
+    PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + ZW1(:,:,:) * ZTMP2_DEVICE(:,:,:)
 !$acc end kernels
 #endif
 !
@@ -865,12 +963,12 @@ ELSE  IF (L2D) THEN ! 3D case in a 2D model
       CALL GX_M_M_DEVICE(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
       CALL GX_M_M_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1)   ,PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
 !$acc kernels
-      ZTMP1_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE
+      ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
       PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV)   +        &
-                       ZW1 * PEMOIST * ZTMP2_DEVICE 
+                       ZW1(:,:,:) * PEMOIST * ZTMP2_DEVICE(:,:,:) 
 !$acc end kernels
 #endif
     ELSE
@@ -901,22 +999,22 @@ ELSE ! 3D case in a 3D model
   DO JSV=1,ISV
 !$acc kernels
 #ifndef MNH_BITREP
-    ZTMP1_DEVICE = (XG / PTHVREF * PLM * PLEPS / PTKEM)**2
+    ZTMP1_DEVICE(:,:,:) = (XG / PTHVREF * PLM * PLEPS / PTKEM)**2
 #else
-    ZTMP1_DEVICE = BR_P2(XG / PTHVREF * PLM * PLEPS / PTKEM)
+    ZTMP1_DEVICE(:,:,:) = BR_P2(XG / PTHVREF * PLM * PLEPS / PTKEM)
 #endif
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZW1)
     IF (KRR /= 0) THEN
 !$acc kernels
-      ZW1 = ZW1*PETHETA
+      ZW1(:,:,:) = ZW1(:,:,:)*PETHETA
 !$acc end kernels
     END IF
 #endif
 !
 #ifndef MNH_OPENACC
     PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV)   +        &
-                       ZW1*                                              &
+                       ZW1(:,:,:)*                                              &
                        MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*       &
                            GX_M_M(PTHLM,PDXX,PDZZ,PDZX)                  &
                           +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*       &
@@ -928,11 +1026,13 @@ ELSE ! 3D case in a 3D model
     CALL GY_M_M_DEVICE(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY,ZTMP3_DEVICE)
     CALL GY_M_M_DEVICE(KKA,KKU,KKL,PTHLM          ,PDYY,PDZZ,PDZY,ZTMP4_DEVICE)
 !$acc kernels
-      ZTMP1_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE+ZTMP3_DEVICE*ZTMP4_DEVICE
+    ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)+&
+                                      ZTMP3_DEVICE(:,:,:)*ZTMP4_DEVICE(:,:,:)
 !$acc end kernels
       CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
-    PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + ZW1 * ZTMP2_DEVICE
+    PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + &
+                           ZW1(:,:,:) * ZTMP2_DEVICE(:,:,:)
 !$acc end kernels
 #endif
 !
@@ -951,12 +1051,13 @@ ELSE ! 3D case in a 3D model
       CALL GY_M_M_DEVICE(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY,ZTMP3_DEVICE)
       CALL GY_M_M_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1)   ,PDYY,PDZZ,PDZY,ZTMP4_DEVICE)
 !$acc kernels
-      ZTMP1_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE+ZTMP3_DEVICE*ZTMP4_DEVICE
+      ZTMP1_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)+&
+                                        ZTMP3_DEVICE(:,:,:)*ZTMP4_DEVICE(:,:,:)
 !$acc end kernels
       CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
       PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV)   +        &
-                       ZW1 * PEMOIST * ZTMP2_DEVICE
+                       ZW1(:,:,:) * PEMOIST * ZTMP2_DEVICE(:,:,:)
 !$acc end kernels
 #endif
     ELSE
@@ -1059,8 +1160,16 @@ end if
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_REL_ZT3D(IZW1, IZW2,IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE,IZTMP4_DEVICE,IZTMP5_DEVICE)
+CALL MNH_CHECK_OUT_ZT3D("PRANDTL")
+#else
+DEALLOCATE(ZW1,ZW2)
+#endif
+
 !$acc end data
 
 !---------------------------------------------------------------------------
 !
 END SUBROUTINE PRANDTL
+
diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90
index 55d7384c2..ae9c4b339 100644
--- a/src/MNH/tke_eps_sources.f90
+++ b/src/MNH/tke_eps_sources.f90
@@ -206,6 +206,9 @@ USE MODI_GET_HALO
 #ifdef MNH_BITREP
 USE MODI_BITREP
 #endif
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+#endif
 !
 IMPLICIT NONE
 !
@@ -248,7 +251,7 @@ REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PDISS        ! Dissipati prod. of TKE
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable ::         &
+REAL, DIMENSION(:,:,:), pointer , contiguous ::         &
        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,6 +261,7 @@ REAL, DIMENSION(:,:,:), allocatable ::         &
        ZFLX,     & ! horizontal or vertical flux of the treated variable
        ZSOURCE,  & ! source of evolution for the treated variable
        ZKEFF       ! effectif diffusion coeff = LT * SQRT( TKE )
+INTEGER ::  IZA,IZRES,IZFLX,IZSOURCE,IZKEFF
 INTEGER             :: IIB,IIE,IJB,IJE,IKB,IKE
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain 
@@ -268,8 +272,12 @@ INTEGER                :: IINFO_ll       ! return code of parallel routine
 TYPE(TFIELDDATA) :: TZFIELD
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
 #endif
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 !----------------------------------------------------------------------------
 
 !$acc data present( PTKEM, PLM, PLEPS, PDP, PTRH,              &
@@ -299,20 +307,32 @@ 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 ) ) )
+JIU =  size(ptkem, 1 )
+JJU =  size(ptkem, 2 )
+JKU =  size(ptkem, 3 )
+
+#ifndef MNH_OPENACC
+allocate( za     (JIU,JJU,JKU ) )
+allocate( zres   (JIU,JJU,JKU ) )
+allocate( zflx   (JIU,JJU,JKU ) )
+allocate( zsource(JIU,JJU,JKU ) )
+allocate( zkeff  (JIU,JJU,JKU ) )
+#else
+iza      = MNH_ALLOCATE_ZT3D( za     ,JIU,JJU,JKU)
+izres    = MNH_ALLOCATE_ZT3D( zres   ,JIU,JJU,JKU)
+izflx    = MNH_ALLOCATE_ZT3D( zflx   ,JIU,JJU,JKU)
+izsource = MNH_ALLOCATE_ZT3D( zsource,JIU,JJU,JKU)
+izkeff   = MNH_ALLOCATE_ZT3D( zkeff  ,JIU,JJU,JKU)
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU)
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU)
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU)
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU)
 #endif
 
-!$acc data create( ZA, ZRES, ZFLX, ZSOURCE, ZKEFF, ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
+!$acc data present( ZA, ZRES, ZFLX, ZSOURCE, ZKEFF, ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
 
 NULLIFY(TZFIELDDISS_ll)
 !
@@ -365,9 +385,11 @@ ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:)
 #else
 ZFLX(:,:,:) = XCED * BR_POW(PTKEM(:,:,:),0.5) / PLEPS(:,:,:)
 #endif
-ZSOURCE(:,:,:) = PRTKES(:,:,:) / PRHODJ(:,:,:)  +  PRTKESM(:,:,:) / PRHODJ(:,:,:) &
-   - PTKEM(:,:,:) / PTSTEP &
-   + PDP(:,:,:) + PTP(:,:,:) + PTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZSOURCE(JI,JJ,JK) = PRTKES(JI,JJ,JK) / PRHODJ(JI,JJ,JK)  +  PRTKESM(JI,JJ,JK) / PRHODJ(JI,JJ,JK) &
+        - PTKEM(JI,JJ,JK) / PTSTEP &
+        + PDP(JI,JJ,JK) + PTP(JI,JJ,JK) + PTR(JI,JJ,JK) - PEXPL * ZFLX(JI,JJ,JK) * PTKEM(JI,JJ,JK)
+END DO !CONCURRENT
 !$acc end kernels
 !
 !*       2.2  implicit vertical TKE transport
@@ -390,7 +412,9 @@ CALL MZM_DEVICE(PRHODJ,ZTMP2_DEVICE) !Warning: re-used later
 #ifndef MNH_BITREP
 ZA(:,:,:)     = - PTSTEP * XCET * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) / PDZZ(:,:,:)**2
 #else
-ZA(:,:,:)     = - PTSTEP * XCET * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) / BR_P2(PDZZ(:,:,:))
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZA(JI,JJ,JK)     = - PTSTEP * XCET * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) / BR_P2(PDZZ(JI,JJ,JK))
+END DO !CONCURRENT   
 #endif
 !$acc end kernels
 #endif
@@ -403,7 +427,9 @@ CALL TRIDIAG_TKE(KKA,KKU,KKL,PTKEM,ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,&
 CALL GET_HALO(ZRES)
 #else
 !$acc kernels
-ZTMP3_DEVICE(:,:,:) = PTSTEP*ZFLX(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP3_DEVICE(JI,JJ,JK) = PTSTEP*ZFLX(JI,JJ,JK)
+END DO !CONCURRENT   
 !$acc end kernels
 CALL TRIDIAG_TKE(KKA,KKU,KKL,PTKEM,ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,&
             & ZSOURCE,ZTMP3_DEVICE,ZRES)
@@ -639,6 +665,12 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( ZA, ZRES, ZFLX, ZSOURCE, ZKEFF )
+#else
+CALL MNH_REL_ZT3D( IZA, IZRES, IZFLX, IZSOURCE, IZKEFF, IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
+#endif
+
 !$acc end data
 
 END SUBROUTINE TKE_EPS_SOURCES
diff --git a/src/MNH/tridiag_thermo.f90 b/src/MNH/tridiag_thermo.f90
index ff79d84bb..67d34204a 100644
--- a/src/MNH/tridiag_thermo.f90
+++ b/src/MNH/tridiag_thermo.f90
@@ -6,8 +6,9 @@
 !     ###################
       MODULE MODI_TRIDIAG_THERMO
 !     ###################
+!        
 INTERFACE
-!
+!        
        SUBROUTINE TRIDIAG_THERMO(KKA,KKU,KKL,PVARM,PF,PDFDDTDZ,PTSTEP,PIMPL,  &
                                  PDZZ,PRHODJ,PVARP             )
 !
@@ -30,9 +31,6 @@ END INTERFACE
 !
 END MODULE MODI_TRIDIAG_THERMO 
 !
-!
-!
-
 !      #################################################
        SUBROUTINE TRIDIAG_THERMO(KKA,KKU,KKL,PVARM,PF,PDFDDTDZ,PTSTEP,PIMPL,  &
                                  PDZZ,PRHODJ,PVARP             )
@@ -159,6 +157,11 @@ USE MODI_SHUMAN_DEVICE
 USE MODI_BITREP
 #endif
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D , MNH_ALLOCATE_ZT2D, &
+                            MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D
+#endif
+!
 IMPLICIT NONE
 !
 !
@@ -179,12 +182,14 @@ REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP   ! variable at t+1      at mass poi
 !
 !*       0.2 declarations of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZRHODJ_DFDDTDZ_O_DZ2
-REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ
-REAL, DIMENSION(:,:,:), allocatable :: ZA, ZB, ZC
-REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZRHODJ_DFDDTDZ_O_DZ2
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZMZM_RHODJ
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZA, ZB, ZC
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZY ,ZGAM
                                          ! RHS of the equation, 3D work array
-REAL, DIMENSION(:,:), allocatable   :: ZBET
+INTEGER :: IZRHODJ_DFDDTDZ_O_DZ2,IZMZM_RHODJ,IZA,IZB,IZC,IZY,IZGAM
+REAL, DIMENSION(:,:), pointer , contiguous   :: ZBET
+INTEGER :: IZBET
                                          ! 2D work array
 INTEGER             :: JI,JJ,JK      ! loop counter
 INTEGER             :: IKB,IKE       ! inner vertical limits
@@ -193,8 +198,12 @@ INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain
 !
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE
+INTEGER :: IZTMP1_DEVICE
 #endif
+
+INTEGER  :: JIU,JJU,JKU
+
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PVARM, PF, PDFDDTDZ, PDZZ, PRHODJ, PVARP )
@@ -208,20 +217,36 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size( pvarm, 1 )
+JJU =  size( pvarm, 2 )
+JKU =  size( pvarm, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zrhodj_dfddtdz_o_dz2(JIU,JJU,JKU ) )
+allocate( zmzm_rhodj          (JIU,JJU,JKU ) )
+allocate( za                  (JIU,JJU,JKU ) )
+allocate( zb                  (JIU,JJU,JKU ) )
+allocate( zc                  (JIU,JJU,JKU ) )
+allocate( zy                  (JIU,JJU,JKU ) )
+allocate( zgam                (JIU,JJU,JKU ) )
+allocate( zbet                (JIU,JJU ) )
+#else
+CALL MNH_CHECK_IN_ZT3D("TRIDIAG_THERMO")
+izrhodj_dfddtdz_o_dz2 = MNH_ALLOCATE_ZT3D( zrhodj_dfddtdz_o_dz2,JIU,JJU,JKU )
+izmzm_rhodj           = MNH_ALLOCATE_ZT3D( zmzm_rhodj          ,JIU,JJU,JKU )
+iza                   = MNH_ALLOCATE_ZT3D( za                  ,JIU,JJU,JKU )
+izb                   = MNH_ALLOCATE_ZT3D( zb                  ,JIU,JJU,JKU )
+izc                   = MNH_ALLOCATE_ZT3D( zc                  ,JIU,JJU,JKU )
+izy                   = MNH_ALLOCATE_ZT3D( zy                  ,JIU,JJU,JKU )
+izgam                 = MNH_ALLOCATE_ZT3D( zgam                ,JIU,JJU,JKU )
+izbet                 = MNH_ALLOCATE_ZT2D( zbet                ,JIU,JJU )
+#endif
 
 #ifdef MNH_OPENACC
-allocate( ztmp1_device(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
 #endif
 
-!$acc data create( zrhodj_dfddtdz_o_dz2, zmzm_rhodj, za, zb, zc, zy, zgam, zbet, ztmp1_device )
+!$acc data present( zrhodj_dfddtdz_o_dz2, zmzm_rhodj, za, zb, zc, zy, zgam, zbet, ztmp1_device )
 !
 !*      1.  Preliminaries
 !           -------------
@@ -231,60 +256,67 @@ IKTB=1+JPVEXT_TURB
 IKTE=IKT-JPVEXT_TURB
 IKB=KKA+JPVEXT_TURB*KKL
 IKE=KKU-JPVEXT_TURB*KKL
-
 !
 #ifndef MNH_OPENACC
 ZMZM_RHODJ = MZM(PRHODJ)
 #else
 CALL MZM_DEVICE(PRHODJ,ZMZM_RHODJ)
 #endif
-!$acc kernels async
+!$acc kernels ! async
 #ifndef MNH_BITREP
 ZRHODJ_DFDDTDZ_O_DZ2 = ZMZM_RHODJ*PDFDDTDZ/PDZZ**2
 #else
-ZRHODJ_DFDDTDZ_O_DZ2 = ZMZM_RHODJ*PDFDDTDZ/BR_P2(PDZZ)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) 
+   ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK) = ZMZM_RHODJ(JI,JJ,JK)*PDFDDTDZ(JI,JJ,JK)/BR_P2(PDZZ(JI,JJ,JK))
+END DO !CONCURRENT   
 #endif
 !$acc end kernels
 !
-!$acc kernels async
+!$acc kernels ! async
 ZA=0.
 ZB=0.
 ZC=0.
 ZY=0.
 !$acc end kernels
-!$acc wait
+! acc wait
 !
 !
 !*      2.  COMPUTE THE RIGHT HAND SIDE
 !           ---------------------------
 !
-!$acc kernels async
-ZY(:,:,IKB) = PRHODJ(:,:,IKB)*PVARM(:,:,IKB)/PTSTEP                  &
-    - ZMZM_RHODJ(:,:,IKB+KKL) * PF(:,:,IKB+KKL)/PDZZ(:,:,IKB+KKL)    &
-    + ZMZM_RHODJ(:,:,IKB  ) * PF(:,:,IKB  )/PDZZ(:,:,IKB  )          &
-    + ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKB+KKL) * PIMPL * PVARM(:,:,IKB+KKL) &
-    - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKB+KKL) * PIMPL * PVARM(:,:,IKB  )
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+ZY(JI,JJ,IKB) = PRHODJ(JI,JJ,IKB)*PVARM(JI,JJ,IKB)/PTSTEP                  &
+    - ZMZM_RHODJ(JI,JJ,IKB+KKL) * PF(JI,JJ,IKB+KKL)/PDZZ(JI,JJ,IKB+KKL)    &
+    + ZMZM_RHODJ(JI,JJ,IKB  ) * PF(JI,JJ,IKB  )/PDZZ(JI,JJ,IKB  )          &
+    + ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKB+KKL) * PIMPL * PVARM(JI,JJ,IKB+KKL) &
+    - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKB+KKL) * PIMPL * PVARM(JI,JJ,IKB  )
+END DO !CONCURRENT
 !$acc end kernels
 !
-!$acc kernels async
-  ZY(:,:,IKTB+1:IKTE-1) = PRHODJ(:,:,IKTB+1:IKTE-1)*PVARM(:,:,IKTB+1:IKTE-1)/PTSTEP                 &
-    - ZMZM_RHODJ(:,:,IKTB+1+KKL:IKTE-1+KKL) * PF(:,:,IKTB+1+KKL:IKTE-1+KKL)/PDZZ(:,:,IKTB+1+KKL:IKTE-1+KKL)     &
-    + ZMZM_RHODJ(:,:,IKTB+1:IKTE-1  ) * PF(:,:,IKTB+1:IKTE-1  )/PDZZ(:,:,IKTB+1:IKTE-1  )           &
-    + ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1+KKL:IKTE-1+KKL) * PIMPL * PVARM(:,:,IKTB+1+KKL:IKTE-1+KKL) &
-    - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1+KKL:IKTE-1+KKL) * PIMPL * PVARM(:,:,IKTB+1:IKTE-1  )   &
-    - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1:IKTE-1    ) * PIMPL * PVARM(:,:,IKTB+1:IKTE-1  )   &
-    + ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1:IKTE-1    ) * PIMPL * PVARM(:,:,IKTB+1-KKL:IKTE-1-KKL)
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=IKTB+1:IKTE-1)
+  ZY(JI,JJ,JK) = PRHODJ(JI,JJ,JK)*PVARM(JI,JJ,JK)/PTSTEP                 &
+    - ZMZM_RHODJ(JI,JJ,JK+KKL) * PF(JI,JJ,JK+KKL)/PDZZ(JI,JJ,JK+KKL)     &
+    + ZMZM_RHODJ(JI,JJ,JK  ) * PF(JI,JJ,JK  )/PDZZ(JI,JJ,JK  )           &
+    + ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK+KKL) * PIMPL * PVARM(JI,JJ,JK+KKL) &
+    - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK+KKL) * PIMPL * PVARM(JI,JJ,JK  )   &
+    - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK    ) * PIMPL * PVARM(JI,JJ,JK  )   &
+    + ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK    ) * PIMPL * PVARM(JI,JJ,JK-KKL)
+END DO !CONCURRENT
 !$acc end kernels
 ! 
-!$acc kernels async
-ZY(:,:,IKE) = PRHODJ(:,:,IKE)*PVARM(:,:,IKE)/PTSTEP               &
-    - ZMZM_RHODJ(:,:,IKE+KKL) * PF(:,:,IKE+KKL)/PDZZ(:,:,IKE+KKL) &
-    + ZMZM_RHODJ(:,:,IKE  ) * PF(:,:,IKE  )/PDZZ(:,:,IKE  )       &
-    - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKE ) * PIMPL * PVARM(:,:,IKE  )   &
-    + ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKE ) * PIMPL * PVARM(:,:,IKE-KKL)
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+ZY(JI,JJ,IKE) = PRHODJ(JI,JJ,IKE)*PVARM(JI,JJ,IKE)/PTSTEP               &
+    - ZMZM_RHODJ(JI,JJ,IKE+KKL) * PF(JI,JJ,IKE+KKL)/PDZZ(JI,JJ,IKE+KKL) &
+    + ZMZM_RHODJ(JI,JJ,IKE  ) * PF(JI,JJ,IKE  )/PDZZ(JI,JJ,IKE  )       &
+    - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKE ) * PIMPL * PVARM(JI,JJ,IKE  )   &
+    + ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKE ) * PIMPL * PVARM(JI,JJ,IKE-KKL)
+END DO !CONCURRENT
 !$acc end kernels
 !
-!$acc wait
+! acc wait
 !
 !*       3.  INVERSION OF THE TRIDIAGONAL SYSTEM
 !            -----------------------------------
@@ -294,77 +326,91 @@ IF ( PIMPL > 1.E-10 ) THEN
 !*       3.1 arrays A, B, C
 !            --------------
 !
-!$acc kernels async
-  ZB(:,:,IKB) =   PRHODJ(:,:,IKB)/PTSTEP                   &
-                - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKB+KKL) * PIMPL
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)   
+  ZB(JI,JJ,IKB) =   PRHODJ(JI,JJ,IKB)/PTSTEP                   &
+                - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKB+KKL) * PIMPL
+END DO !CONCURRENT 
 !$acc end kernels
 !
-!$acc kernels async
-  ZC(:,:,IKB) =   ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKB+KKL) * PIMPL
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+  ZC(JI,JJ,IKB) =   ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKB+KKL) * PIMPL
+END DO !CONCURRENT
 !$acc end kernels
 !
-!$acc kernels async
-  ZA(:,:,IKTB+1:IKTE-1) =   ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1:IKTE-1) * PIMPL
-  ZB(:,:,IKTB+1:IKTE-1) =   PRHODJ(:,:,IKTB+1:IKTE-1)/PTSTEP                        &
-                          - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1+KKL:IKTE-1+KKL) * PIMPL &
-                          - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1:IKTE-1) * PIMPL
-  ZC(:,:,IKTB+1:IKTE-1) =   ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1+KKL:IKTE-1+KKL) * PIMPL
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=IKTB+1:IKTE-1)
+  ZA(JI,JJ,JK) =   ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK) * PIMPL
+  ZB(JI,JJ,JK) =   PRHODJ(JI,JJ,JK)/PTSTEP                        &
+                          - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK+KKL) * PIMPL &
+                          - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK) * PIMPL
+  ZC(JI,JJ,JK) =   ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK+KKL) * PIMPL
+END DO !CONCURRENT
 !$acc end kernels
 !
-!$acc kernels async
-  ZA(:,:,IKE) =   ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKE  ) * PIMPL
-  ZB(:,:,IKE) =   PRHODJ(:,:,IKE)/PTSTEP                   &
-                - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKE  ) * PIMPL
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+  ZA(JI,JJ,IKE) =   ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKE  ) * PIMPL
+  ZB(JI,JJ,IKE) =   PRHODJ(JI,JJ,IKE)/PTSTEP                   &
+                - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKE  ) * PIMPL
+END DO !CONCURRENT
 !$acc end kernels
 !
-!$acc wait
+! acc wait
 !
 !
 !*       3.2 going up
 !            --------
 !
 !$acc kernels
-  ZBET(:,:) = ZB(:,:,IKB)  ! bet = b(ikb)
-  PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:)
-
-  !
-  DO JK = IKB+KKL,IKE-KKL,KKL
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+  ZBET(JI,JJ) = ZB(JI,JJ,IKB)  ! bet = b(ikb)
+  PVARP(JI,JJ,IKB) = ZY(JI,JJ,IKB) / ZBET(JI,JJ)
+END DO !CONCURRENT
+!
+!$acc loop seq
+DO JK = IKB+KKL,IKE-KKL,KKL
+   !DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
 !$acc loop collapse(2) independent
-    DO JJ=1,SIZE(ZGAM,2)
-      DO JI=1,SIZE(ZGAM,1)
-        ZGAM(JI,JJ,JK) = ZC(JI,JJ,JK-KKL) / ZBET(JI,JJ)  
-                                                    ! gam(k) = c(k-1) / bet
-        ZBET(JI,JJ)    = ZB(JI,JJ,JK) - ZA(JI,JJ,JK) * ZGAM(JI,JJ,JK)
-                                                    ! bet = b(k) - a(k)* gam(k)  
-        PVARP(JI,JJ,JK)= ( ZY(JI,JJ,JK) - ZA(JI,JJ,JK) * PVARP(JI,JJ,JK-KKL) ) / ZBET(JI,JJ)
-                                        ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
+   DO JJ=1,JJU
+      DO JI=1,JIU     
+      ZGAM(JI,JJ,JK) = ZC(JI,JJ,JK-KKL) / ZBET(JI,JJ)  
+      ! gam(k) = c(k-1) / bet
+      ZBET(JI,JJ)    = ZB(JI,JJ,JK) - ZA(JI,JJ,JK) * ZGAM(JI,JJ,JK)
+      ! bet = b(k) - a(k)* gam(k)  
+      PVARP(JI,JJ,JK)= ( ZY(JI,JJ,JK) - ZA(JI,JJ,JK) * PVARP(JI,JJ,JK-KKL) ) / ZBET(JI,JJ)
+      ! res(k) = (y(k) -a(k)*res(k-1))/ bet
       END DO
-    END DO
-  END DO 
-  ! special treatment for the last level
-  DO JJ=1,SIZE(ZGAM,2)
-    DO JI=1,SIZE(ZGAM,1)
+   END DO
+   !END DO !CONCURRENT 
+END DO
+! special treatment for the last level
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
       ZGAM(JI,JJ,IKE) = ZC(JI,JJ,IKE-KKL) / ZBET(JI,JJ) 
-                                                    ! gam(k) = c(k-1) / bet
+      ! gam(k) = c(k-1) / bet
       ZBET(JI,JJ)     = ZB(JI,JJ,IKE) - ZA(JI,JJ,IKE) * ZGAM(JI,JJ,IKE)
-                                                    ! bet = b(k) - a(k)* gam(k)  
+      ! bet = b(k) - a(k)* gam(k)  
       PVARP(JI,JJ,IKE)= ( ZY(JI,JJ,IKE) - ZA(JI,JJ,IKE) * PVARP(JI,JJ,IKE-KKL) ) / ZBET(JI,JJ)
-                                       ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
-    END DO
-  END DO
+      ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
+END DO !CONCURRENT
 !
 !*       3.3 going down
 !            ----------
 !
-  DO JK = IKE-KKL,IKB,-1*KKL
-    PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+KKL) * PVARP(:,:,JK+KKL)
-  END DO
+DO JK = IKE-KKL,IKB,-1*KKL
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+      PVARP(JI,JJ,JK) = PVARP(JI,JJ,JK) - ZGAM(JI,JJ,JK+KKL) * PVARP(JI,JJ,JK+KKL)
+   END DO !CONCURRENT
+END DO
 !$acc end kernels
 !
 ELSE
 ! 
 !$acc kernels
-  PVARP(:,:,IKTB:IKTE) = ZY(:,:,IKTB:IKTE) * PTSTEP / PRHODJ(:,:,IKTB:IKTE)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=IKTB:IKTE)   
+   PVARP(JI,JJ,JK) = ZY(JI,JJ,JK) * PTSTEP / PRHODJ(JI,JJ,JK)
+END DO !CONCURRENT
 !$acc end kernels
 !
 END IF 
@@ -374,8 +420,10 @@ END IF
 !            ----------------------------------------
 !
 !$acc kernels
-PVARP(:,:,KKA)=PVARP(:,:,IKB)
-PVARP(:,:,KKU)=PVARP(:,:,IKE)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   PVARP(JI,JJ,KKA)=PVARP(JI,JJ,IKB)
+   PVARP(JI,JJ,KKU)=PVARP(JI,JJ,IKE)
+END DO !CONCURRENT
 !$acc end kernels
 
 if ( mppdb_initialized ) then
@@ -385,6 +433,14 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate (zrhodj_dfddtdz_o_dz2,zmzm_rhodj,za,zb,zc,zy,zgam,zbet)
+#else
+CALL MNH_REL_ZT3D(IZRHODJ_DFDDTDZ_O_DZ2,IZMZM_RHODJ,IZA,IZB,IZC,IZY,IZGAM,&
+                  IZBET,iztmp1_device)
+CALL MNH_CHECK_OUT_ZT3D("TRIDIAG_THERMO")
+#endif
+
 !$acc end data
 
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/tridiag_tke.f90 b/src/MNH/tridiag_tke.f90
index 9c9fb5439..ee15d6a7b 100644
--- a/src/MNH/tridiag_tke.f90
+++ b/src/MNH/tridiag_tke.f90
@@ -142,6 +142,11 @@ END MODULE MODI_TRIDIAG_TKE
 USE MODD_PARAMETERS
 USE MODE_MPPDB
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D , MNH_ALLOCATE_ZT2D, &
+      MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D
+#endif
+!
 IMPLICIT NONE
 !
 !
@@ -167,9 +172,11 @@ 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
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZY ,ZGAM ! RHS of the equation, 3D work array
+REAL, DIMENSION(:,:),   pointer , contiguous :: ZBET     ! 2D work array
+INTEGER :: IZY ,IZGAM, IZBET
 !
+INTEGER  :: JIU,JJU,JKU
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PVARM, PA, PRHODJ, PSOURCE, PDIAG, PVARP )
@@ -183,11 +190,22 @@ 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 ) ) )
+JIU =  size( pvarm, 1 )
+JJU =  size( pvarm, 2 )
+JKU =  size( pvarm, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zy  (JIU,JJU,JKU ) )
+allocate( zgam(JIU,JJU,JKU ) )
+allocate( zbet(JIU,JJU ) )
+#else
+CALL MNH_CHECK_IN_ZT3D("TRIDIAG_TKE")
+izy   = MNH_ALLOCATE_ZT3D( zy  ,JIU,JJU,JKU )
+izgam = MNH_ALLOCATE_ZT3D( zgam,JIU,JJU,JKU )
+izbet = MNH_ALLOCATE_ZT2D( zbet,JIU,JJU )
+#endif
 
-!$acc data create( ZY, ZGAM, ZBET )
+!$acc data present( ZY, ZGAM, ZBET )
 
 !
 !*      1.  COMPUTE THE RIGHT HAND SIDE
@@ -202,20 +220,26 @@ IKE=KKU-JPVEXT_TURB*KKL
 
 !
 !
-ZY(:,:,IKB) = PVARM(:,:,IKB)  + PTSTEP*PSOURCE(:,:,IKB) -   &
-  PEXPL / PRHODJ(:,:,IKB) * PA(:,:,IKB+KKL) * (PVARM(:,:,IKB+KKL) - PVARM(:,:,IKB))
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   ZY(JI,JJ,IKB) = PVARM(JI,JJ,IKB)  + PTSTEP*PSOURCE(JI,JJ,IKB) -   &
+        PEXPL / PRHODJ(JI,JJ,IKB) * PA(JI,JJ,IKB+KKL) * (PVARM(JI,JJ,IKB+KKL) - PVARM(JI,JJ,IKB))
+END DO !CONCURRENT
 !
 DO JK=IKTB+1,IKTE-1
-  ZY(:,:,JK)= PVARM(:,:,JK)  + PTSTEP*PSOURCE(:,:,JK) -               &
-      PEXPL / PRHODJ(:,:,JK) *                                           &
-                             ( PVARM(:,:,JK-KKL)*PA(:,:,JK)                &
-                              -PVARM(:,:,JK)*(PA(:,:,JK)+PA(:,:,JK+KKL))   &
-                              +PVARM(:,:,JK+KKL)*PA(:,:,JK+KKL)              &
-                             ) 
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+      ZY(JI,JJ,JK)= PVARM(JI,JJ,JK)  + PTSTEP*PSOURCE(JI,JJ,JK) -               &
+           PEXPL / PRHODJ(JI,JJ,JK) *                                           &
+           ( PVARM(JI,JJ,JK-KKL)*PA(JI,JJ,JK)                &
+           -PVARM(JI,JJ,JK)*(PA(JI,JJ,JK)+PA(JI,JJ,JK+KKL))   &
+           +PVARM(JI,JJ,JK+KKL)*PA(JI,JJ,JK+KKL)              &
+           )
+   END DO !CONCURRENT
 END DO
-! 
-ZY(:,:,IKE)= PVARM(:,:,IKE) + PTSTEP*PSOURCE(:,:,IKE) +               &
-  PEXPL / PRHODJ(:,:,IKE) * PA(:,:,IKE) * (PVARM(:,:,IKE)-PVARM(:,:,IKE-KKL))
+!
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   ZY(JI,JJ,IKE)= PVARM(JI,JJ,IKE) + PTSTEP*PSOURCE(JI,JJ,IKE) +               &
+        PEXPL / PRHODJ(JI,JJ,IKE) * PA(JI,JJ,IKE) * (PVARM(JI,JJ,IKE)-PVARM(JI,JJ,IKE-KKL))
+END DO !CONCURRENT
 !
 !
 !*       2.  INVERSION OF THE TRIDIAGONAL SYSTEM
@@ -225,15 +249,17 @@ IF ( PIMPL > 1.E-10 ) THEN
 !
   !
   !  going up
-  !
-  ZBET(:,:) = 1. + PIMPL * (PDIAG(:,:,IKB)-PA(:,:,IKB+KKL) / PRHODJ(:,:,IKB))
-                                                    ! bet = b(ikb)
-  PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:)                
+   !
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU) 
+     ZBET(JI,JJ) = 1. + PIMPL * (PDIAG(JI,JJ,IKB)-PA(JI,JJ,IKB+KKL) / PRHODJ(JI,JJ,IKB))
+     ! bet = b(ikb)
+     PVARP(JI,JJ,IKB) = ZY(JI,JJ,IKB) / ZBET(JI,JJ)
+  END DO !CONCURRENT
   !
   DO JK = IKB+KKL,IKE-KKL,KKL
 !$acc loop collapse(2) independent
-    DO JJ=1,SIZE(ZGAM,2)
-      DO JI=1,SIZE(ZGAM,1)
+    DO JJ=1,JJU
+      DO JI=1,JIU
         ZGAM(JI,JJ,JK) = PIMPL * PA(JI,JJ,JK) / PRHODJ(JI,JJ,JK-KKL) / ZBET(JI,JJ)  
                                                     ! gam(k) = c(k-1) / bet
         ZBET(JI,JJ)    = 1. + PIMPL * ( PDIAG(JI,JJ,JK) -                 &
@@ -249,26 +275,32 @@ IF ( PIMPL > 1.E-10 ) THEN
     END DO
   END DO 
   ! special treatment for the last level
-  ZGAM(:,:,IKE) = PIMPL * PA(:,:,IKE) / PRHODJ(:,:,IKE-KKL) / ZBET(:,:) 
-                                                    ! gam(k) = c(k-1) / bet
-  ZBET(:,:)    = 1. + PIMPL * ( PDIAG(:,:,IKE) -                   &
-         (  PA(:,:,IKE) * (1. + ZGAM(:,:,IKE)) ) / PRHODJ(:,:,IKE) &
-                              )  
-                                                    ! bet = b(k) - a(k)* gam(k)  
-  PVARP(:,:,IKE)= ( ZY(:,:,IKE) - PIMPL * PA(:,:,IKE) / PRHODJ(:,:,IKE) &
-                                * PVARP(:,:,IKE-KKL)                      &
-                 ) / ZBET(:,:)
-                                       ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+     ZGAM(JI,JJ,IKE) = PIMPL * PA(JI,JJ,IKE) / PRHODJ(JI,JJ,IKE-KKL) / ZBET(JI,JJ) 
+     ! gam(k) = c(k-1) / bet
+     ZBET(JI,JJ)    = 1. + PIMPL * ( PDIAG(JI,JJ,IKE) -                   &
+          (  PA(JI,JJ,IKE) * (1. + ZGAM(JI,JJ,IKE)) ) / PRHODJ(JI,JJ,IKE) &
+          )  
+     ! bet = b(k) - a(k)* gam(k)  
+     PVARP(JI,JJ,IKE)= ( ZY(JI,JJ,IKE) - PIMPL * PA(JI,JJ,IKE) / PRHODJ(JI,JJ,IKE) &
+          * PVARP(JI,JJ,IKE-KKL)                      &
+          ) / ZBET(JI,JJ)
+     ! res(k) = (y(k) -a(k)*res(k-1))/ bet
+  END DO !CONCURRENT
   !
   !  going down
   !
   DO JK = IKE-KKL,IKB,-1*KKL
-    PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+KKL) * PVARP(:,:,JK+KKL) 
+     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+        PVARP(JI,JJ,JK) = PVARP(JI,JJ,JK) - ZGAM(JI,JJ,JK+KKL) * PVARP(JI,JJ,JK+KKL)
+     END DO !CONCURRENT   
   END DO
 !
 ELSE
-! 
-  PVARP(:,:,IKTB:IKTE) = ZY(:,:,IKTB:IKTE)
+   !
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU) 
+     PVARP(JI,JJ,IKTB:IKTE) = ZY(JI,JJ,IKTB:IKTE)
+  END DO !CONCURRENT   
 !
 END IF 
 !
@@ -276,8 +308,10 @@ END IF
 !*       3.  FILL THE UPPER AND LOWER EXTERNAL VALUES
 !            ----------------------------------------
 !
-PVARP(:,:,KKA)=PVARP(:,:,IKB)
-PVARP(:,:,KKU)=PVARP(:,:,IKE)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   PVARP(JI,JJ,KKA)=PVARP(JI,JJ,IKB)
+   PVARP(JI,JJ,KKU)=PVARP(JI,JJ,IKE)
+END DO !CONCURRENT
 !$acc end kernels
 
 if ( mppdb_initialized ) then
@@ -287,6 +321,13 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( ZY, ZGAM, ZBET )
+#else
+CALL MNH_REL_ZT3D( IZY, IZGAM, IZBET )
+CALL MNH_CHECK_OUT_ZT3D("TRIDIAG_TKE")
+#endif
+
 !$acc end data
 
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/tridiag_w.f90 b/src/MNH/tridiag_w.f90
index 74d7775d5..87965f9d0 100644
--- a/src/MNH/tridiag_w.f90
+++ b/src/MNH/tridiag_w.f90
@@ -161,6 +161,10 @@ USE MODI_SHUMAN_DEVICE
 USE MODI_BITREP
 #endif
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D , MNH_ALLOCATE_ZT2D
+#endif
+!
 IMPLICIT NONE
 !
 !
@@ -177,15 +181,18 @@ REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP   ! variable at t+1      at flux poi
 !
 !*       0.2 declarations of local variables
 !
-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
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZRHODJ_DFDDWDZ_O_DZ2
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZMZM_RHODJ
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZA, ZB, ZC
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZY ,ZGAM ! RHS of the equation, 3D work array
+REAL, DIMENSION(:,:),   pointer , contiguous :: ZBET     ! 2D work array
+INTEGER :: IZRHODJ_DFDDWDZ_O_DZ2,IZMZM_RHODJ,IZA, IZB, IZC,IZY ,IZGAM,IZBET
 !
 INTEGER                              :: JK            ! loop counter
 INTEGER                              :: IKB,IKE       ! inner vertical limits
 !
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PVARM, PF, PDFDDWDZ, PMZF_DZZ, PRHODJ, PVARP )
@@ -199,16 +206,31 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size( pvarm, 1 )
+JJU =  size( pvarm, 2 )
+JKU =  size( pvarm, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zrhodj_dfddwdz_o_dz2(JIU,JJU,JKU ) )
+allocate( zmzm_rhodj          (JIU,JJU,JKU ) )
+allocate( za                  (JIU,JJU,JKU ) )
+allocate( zb                  (JIU,JJU,JKU ) )
+allocate( zc                  (JIU,JJU,JKU ) )
+allocate( zy                  (JIU,JJU,JKU ) )
+allocate( zgam                (JIU,JJU,JKU ) )
+allocate( zbet                (JIU,JJU ) )
+#else
+izrhodj_dfddwdz_o_dz2 = MNH_ALLOCATE_ZT3D( zrhodj_dfddwdz_o_dz2,JIU,JJU,JKU )
+izmzm_rhodj           = MNH_ALLOCATE_ZT3D( zmzm_rhodj          ,JIU,JJU,JKU )
+iza                   = MNH_ALLOCATE_ZT3D( za                  ,JIU,JJU,JKU )
+izb                   = MNH_ALLOCATE_ZT3D( zb                  ,JIU,JJU,JKU )
+izc                   = MNH_ALLOCATE_ZT3D( zc                  ,JIU,JJU,JKU )
+izy                   = MNH_ALLOCATE_ZT3D( zy                  ,JIU,JJU,JKU )
+izgam                 = MNH_ALLOCATE_ZT3D( zgam                ,JIU,JJU,JKU )
+izbet                 = MNH_ALLOCATE_ZT2D( zbet                ,JIU,JJU )
+#endif 
 
-!$acc data create( ZRHODJ_DFDDWDZ_O_DZ2, ZMZM_RHODJ, ZA, ZB, ZC, ZY, ZGAM, ZBET )
+!$acc data present( ZRHODJ_DFDDWDZ_O_DZ2, ZMZM_RHODJ, ZA, ZB, ZC, ZY, ZGAM, ZBET )
 
 !
 !*      1.  Preliminaries
@@ -222,22 +244,24 @@ ZMZM_RHODJ  = MZM(PRHODJ)
 #else
 CALL MZM_DEVICE(PRHODJ,ZMZM_RHODJ)
 #endif
-!$acc kernels async 
+!$acc kernels ! async 
 #ifndef MNH_BITREP
 ZRHODJ_DFDDWDZ_O_DZ2 = PRHODJ*PDFDDWDZ/PMZF_DZZ**2
 #else
-ZRHODJ_DFDDWDZ_O_DZ2 = PRHODJ*PDFDDWDZ/BR_P2(PMZF_DZZ)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,JK) = PRHODJ(JI,JJ,JK)*PDFDDWDZ(JI,JJ,JK)/BR_P2(PMZF_DZZ(JI,JJ,JK))
+END DO !CONCURRENT   
 #endif
 !$acc end kernels
 !
-!$acc kernels async
+!$acc kernels ! async
 ZA=0.
 ZB=0.
 ZC=0.
 ZY=0.
 !$acc end kernels
 !
-!$acc wait
+! acc wait
 !
 !
 !*      2.  COMPUTE THE RIGHT HAND SIDE
@@ -258,31 +282,37 @@ ZY=0.
 !!        + PRHODJ(k-1) * PDFDDWDZ(k-1) * PVARM(k-1)/BR_P2(PMZF_DZZ(k-1))
 !!#endif
 !
-!$acc kernels async
-ZY(:,:,IKB) = ZMZM_RHODJ(:,:,IKB)*PVARM(:,:,IKB)/PTSTEP              &
-    - PRHODJ(:,:,IKB  ) * PF(:,:,IKB  )/PMZF_DZZ(:,:,IKB  )           &
-    + PRHODJ(:,:,IKB-1) * PF(:,:,IKB-1)/PMZF_DZZ(:,:,IKB-1)           &
-    + ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB) * PVARM(:,:,IKB+1)&
-    - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB) * PVARM(:,:,IKB  )
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   ZY(JI,JJ,IKB) = ZMZM_RHODJ(JI,JJ,IKB)*PVARM(JI,JJ,IKB)/PTSTEP              &
+        - PRHODJ(JI,JJ,IKB  ) * PF(JI,JJ,IKB  )/PMZF_DZZ(JI,JJ,IKB  )           &
+        + PRHODJ(JI,JJ,IKB-1) * PF(JI,JJ,IKB-1)/PMZF_DZZ(JI,JJ,IKB-1)           &
+        + ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKB) * PVARM(JI,JJ,IKB+1)&
+        - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKB) * PVARM(JI,JJ,IKB  )
+END DO !CONCURRENT
 !$acc end kernels
 !
-!$acc kernels async
-  ZY(:,:,IKB+1:IKE-1) = ZMZM_RHODJ(:,:,IKB+1:IKE-1)*PVARM(:,:,IKB+1:IKE-1)/PTSTEP               &
-    - PRHODJ(:,:,IKB+1:IKE-1  ) * PF(:,:,IKB+1:IKE-1  )/PMZF_DZZ(:,:,IKB+1:IKE-1  )              &
-    + PRHODJ(:,:,IKB:IKE-2) * PF(:,:,IKB:IKE-2)/PMZF_DZZ(:,:,IKB:IKE-2)              &
-    + ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB+1:IKE-1  ) * PVARM(:,:,IKB+2:IKE)  &
-    - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB+1:IKE-1  ) * PVARM(:,:,IKB+1:IKE-1  )  &
-    - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB:IKE-2) * PVARM(:,:,IKB+1:IKE-1  )  &
-    + ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB:IKE-2) * PVARM(:,:,IKB:IKE-2)
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+  ZY(JI,JJ,IKB+1:IKE-1) = ZMZM_RHODJ(JI,JJ,IKB+1:IKE-1)*PVARM(JI,JJ,IKB+1:IKE-1)/PTSTEP               &
+       - PRHODJ(JI,JJ,IKB+1:IKE-1  ) * PF(JI,JJ,IKB+1:IKE-1  )/PMZF_DZZ(JI,JJ,IKB+1:IKE-1  )          &
+       + PRHODJ(JI,JJ,IKB:IKE-2) * PF(JI,JJ,IKB:IKE-2)/PMZF_DZZ(JI,JJ,IKB:IKE-2)              &
+       + ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKB+1:IKE-1  ) * PVARM(JI,JJ,IKB+2:IKE)  &
+       - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKB+1:IKE-1  ) * PVARM(JI,JJ,IKB+1:IKE-1  )  &
+       - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKB:IKE-2) * PVARM(JI,JJ,IKB+1:IKE-1  )  &
+       + ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKB:IKE-2) * PVARM(JI,JJ,IKB:IKE-2)
+END DO !CONCURRENT  
 !$acc end kernels
 ! 
-!$acc kernels async
-ZY(:,:,IKE) = ZMZM_RHODJ(:,:,IKE)*PVARM(:,:,IKE)/PTSTEP              &
-    - PRHODJ(:,:,IKE  ) * PF(:,:,IKE  )/PMZF_DZZ(:,:,IKE  )           &
-    + PRHODJ(:,:,IKE-1) * PF(:,:,IKE-1)/PMZF_DZZ(:,:,IKE-1)           &
-    - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKE  ) * PVARM(:,:,IKE )  &
-    - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKE-1) * PVARM(:,:,IKE  ) &
-    + ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKE-1) * PVARM(:,:,IKE-1)
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   ZY(JI,JJ,IKE) = ZMZM_RHODJ(JI,JJ,IKE)*PVARM(JI,JJ,IKE)/PTSTEP              &
+        - PRHODJ(JI,JJ,IKE  ) * PF(JI,JJ,IKE  )/PMZF_DZZ(JI,JJ,IKE  )           &
+        + PRHODJ(JI,JJ,IKE-1) * PF(JI,JJ,IKE-1)/PMZF_DZZ(JI,JJ,IKE-1)           &
+        - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKE  ) * PVARM(JI,JJ,IKE )  &
+        - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKE-1) * PVARM(JI,JJ,IKE  ) &
+        + ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKE-1) * PVARM(JI,JJ,IKE-1)
+END DO !CONCURRENT
 !$acc end kernels
 !
 !*       3.  INVERSION OF THE TRIDIAGONAL SYSTEM
@@ -298,71 +328,90 @@ ZY(:,:,IKE) = ZMZM_RHODJ(:,:,IKE)*PVARM(:,:,IKE)/PTSTEP              &
 !!        - PRHODJ(k-1) * PDFDDWDZ(k-1)/PMZF_DZZ(k-1)**2
 !! c(k) = + PRHODJ(k)   * PDFDDWDZ(k)/PMZF_DZZ(k)**2
 !
-!$acc kernels async
-  ZB(:,:,IKB) =   ZMZM_RHODJ(:,:,IKB)/PTSTEP      &
-                - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB)
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+  ZB(JI,JJ,IKB) =   ZMZM_RHODJ(JI,JJ,IKB)/PTSTEP      &
+       - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKB)
+END DO !CONCURRENT  
 !$acc end kernels
-!$acc kernels async
-  ZC(:,:,IKB) =   ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB)
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   ZC(JI,JJ,IKB) =   ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKB)
+END DO !CONCURRENT   
 !$acc end kernels
 
-!$acc kernels async
-    ZA(:,:,IKB+1:IKE-1) =   ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB:IKE-2)
-    ZB(:,:,IKB+1:IKE-1) =   ZMZM_RHODJ(:,:,IKB+1:IKE-1)/PTSTEP      &
-                 - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB+1:IKE-1  ) &
-                 - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB:IKE-2)
-    ZC(:,:,IKB+1:IKE-1) =   ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKB+1:IKE-1  )
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=IKB+1:IKE-1)
+    ZA(JI,JJ,JK) =   ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,JK-1)
+    ZB(JI,JJ,JK) =   ZMZM_RHODJ(JI,JJ,JK)/PTSTEP      &
+                 - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,JK  ) &
+                 - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,JK-1)
+    ZC(JI,JJ,JK) =   ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,JK  )
+END DO !CONCURRENT    
 !$acc end kernels
 
-!$acc kernels async
-  ZA(:,:,IKE) =   ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKE-1)
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   ZA(JI,JJ,IKE) =   ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKE-1)
+END DO !CONCURRENT   
 !$acc end kernels
-!$acc kernels async
-  ZB(:,:,IKE) =   ZMZM_RHODJ(:,:,IKE)/PTSTEP      &
-                - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKE  ) &
-                - ZRHODJ_DFDDWDZ_O_DZ2(:,:,IKE-1)
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+  ZB(JI,JJ,IKE) =   ZMZM_RHODJ(JI,JJ,IKE)/PTSTEP      &
+                - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKE  ) &
+                - ZRHODJ_DFDDWDZ_O_DZ2(JI,JJ,IKE-1)
+END DO !CONCURRENT  
 !$acc end kernels
 !
 !
-!$acc wait
+! acc wait
 !
 !*       3.2 going up
 !            --------
 !
 !$acc kernels
-  ZBET(:,:) = ZB(:,:,IKB)  ! bet = b(ikb)
-  PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:)
-
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+  ZBET(JI,JJ) = ZB(JI,JJ,IKB)  ! bet = b(ikb)
+  PVARP(JI,JJ,IKB) = ZY(JI,JJ,IKB) / ZBET(JI,JJ)
+END DO !CONCURRENT
   !
-  DO JK = IKB+1,IKE-1
-    ZGAM(:,:,JK) = ZC(:,:,JK-1) / ZBET(:,:)  
-                                                    ! gam(k) = c(k-1) / bet
-    ZBET(:,:)    = ZB(:,:,JK) - ZA(:,:,JK) * ZGAM(:,:,JK)
-                                                    ! bet = b(k) - a(k)* gam(k)  
-    PVARP(:,:,JK)= ( ZY(:,:,JK) - ZA(:,:,JK) * PVARP(:,:,JK-1) ) / ZBET(:,:)
-                                        ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
-  END DO 
-  ! special treatment for the last level
-  ZGAM(:,:,IKE) = ZC(:,:,IKE-1) / ZBET(:,:) 
-                                                    ! gam(k) = c(k-1) / bet
-  ZBET(:,:)     = ZB(:,:,IKE) - ZA(:,:,IKE) * ZGAM(:,:,IKE)
-                                                    ! bet = b(k) - a(k)* gam(k)  
-  PVARP(:,:,IKE)= ( ZY(:,:,IKE) - ZA(:,:,IKE) * PVARP(:,:,IKE-1) ) / ZBET(:,:)
-                                       ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
+DO JK = IKB+1,IKE-1
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+      ZGAM(JI,JJ,JK) = ZC(JI,JJ,JK-1) / ZBET(JI,JJ)  
+      ! gam(k) = c(k-1) / bet
+      ZBET(JI,JJ)    = ZB(JI,JJ,JK) - ZA(JI,JJ,JK) * ZGAM(JI,JJ,JK)
+      ! bet = b(k) - a(k)* gam(k)  
+      PVARP(JI,JJ,JK)= ( ZY(JI,JJ,JK) - ZA(JI,JJ,JK) * PVARP(JI,JJ,JK-1) ) / ZBET(JI,JJ)
+      ! res(k) = (y(k) -a(k)*res(k-1))/ bet
+   END DO !CONCURRENT
+END DO
+! special treatment for the last level
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   ZGAM(JI,JJ,IKE) = ZC(JI,JJ,IKE-1) / ZBET(JI,JJ) 
+   ! gam(k) = c(k-1) / bet
+   ZBET(JI,JJ)     = ZB(JI,JJ,IKE) - ZA(JI,JJ,IKE) * ZGAM(JI,JJ,IKE)
+   ! bet = b(k) - a(k)* gam(k)  
+   PVARP(JI,JJ,IKE)= ( ZY(JI,JJ,IKE) - ZA(JI,JJ,IKE) * PVARP(JI,JJ,IKE-1) ) / ZBET(JI,JJ)
+   ! res(k) = (y(k) -a(k)*res(k-1))/ bet
+END DO !CONCURRENT  
 !
 !*       3.3 going down
 !            ----------
 !
-  DO JK = IKE-1,IKB,-1
-    PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+1) * PVARP(:,:,JK+1)
-  END DO
+DO JK = IKE-1,IKB,-1
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+      PVARP(JI,JJ,JK) = PVARP(JI,JJ,JK) - ZGAM(JI,JJ,JK+1) * PVARP(JI,JJ,JK+1)
+   END DO !CONCURRENT   
+END DO
 !
 !
 !*       4.  FILL THE UPPER AND LOWER EXTERNAL VALUES
 !            ----------------------------------------
 !
-PVARP(:,:,IKB-1)=PVARP(:,:,IKB)
-PVARP(:,:,IKE+1)=0.
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   PVARP(JI,JJ,IKB-1)=PVARP(JI,JJ,IKB)
+   PVARP(JI,JJ,IKE+1)=0.
+END DO !CONCURRENT
 !$acc end kernels
 
 if ( mppdb_initialized ) then
@@ -372,6 +421,13 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate (ZRHODJ_DFDDWDZ_O_DZ2, ZMZM_RHODJ, ZA, ZB, ZC, ZY, ZGAM, ZBET)
+#else
+CALL MNH_REL_ZT3D(IZRHODJ_DFDDWDZ_O_DZ2, IZMZM_RHODJ, IZA, IZB, IZC, IZY, IZGAM, IZBET)
+#endif
+
+
 !$acc end data
 
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/tridiag_wind.f90 b/src/MNH/tridiag_wind.f90
index b7819835b..e0451c912 100644
--- a/src/MNH/tridiag_wind.f90
+++ b/src/MNH/tridiag_wind.f90
@@ -32,7 +32,6 @@ END INTERFACE
 END MODULE MODI_TRIDIAG_WIND
 !
 !
-!
 !      #############################################################
        SUBROUTINE TRIDIAG_WIND(KKA,KKU,KKL,PVARM,PA,PCOEFS,PTSTEP,PEXPL,PIMPL, &
                                              PRHODJA,PSOURCE,PVARP )
@@ -149,6 +148,11 @@ USE MODD_PARAMETERS
 
 use mode_mppdb
 
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D , MNH_ALLOCATE_ZT2D, &
+     MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D
+#endif
+
 IMPLICIT NONE
 !
 !
@@ -174,8 +178,11 @@ 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
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZY ,ZGAM ! RHS of the equation, 3D work array
+REAL, DIMENSION(:,:),   pointer , contiguous :: ZBET     ! 2D work array
+INTEGER :: IZY ,IZGAM, IZBET
+!
+INTEGER  :: JIU,JJU,JKU
 !
 ! ---------------------------------------------------------------------------
 
@@ -190,11 +197,22 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size( pvarm, 1 )
+JJU =  size( pvarm, 2 )
+JKU =  size( pvarm, 3 )
 
-!$acc data create( ZY, ZGAM, ZBET )
+#ifndef MNH_OPENACC
+allocate( zy  (JIU,JJU,JKU ) )
+allocate( zgam(JIU,JJU,JKU ) )
+allocate( zbet(JIU,JJU ) )
+#else
+CALL MNH_CHECK_IN_ZT3D("TRIDIAG_WIND")
+izy   = MNH_ALLOCATE_ZT3D( zy  ,JIU,JJU,JKU )
+izgam = MNH_ALLOCATE_ZT3D( zgam,JIU,JJU,JKU )
+izbet = MNH_ALLOCATE_ZT2D( zbet,JIU,JJU )
+#endif
+
+!$acc data present( ZY, ZGAM, ZBET )
 
 !
 !*      1.  COMPUTE THE RIGHT HAND SIDE
@@ -208,26 +226,32 @@ IKE=KKU-JPVEXT_TURB*KKL
 
 !
 ! 
-!$acc kernels async
-ZY(:,:,IKB) = PVARM(:,:,IKB)  + PTSTEP*PSOURCE(:,:,IKB) -   &
-  PEXPL / PRHODJA(:,:,IKB) * PA(:,:,IKB+KKL) * (PVARM(:,:,IKB+KKL) - PVARM(:,:,IKB))
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+ZY(JI,JJ,IKB) = PVARM(JI,JJ,IKB)  + PTSTEP*PSOURCE(JI,JJ,IKB) -   &
+     PEXPL / PRHODJA(JI,JJ,IKB) * PA(JI,JJ,IKB+KKL) * (PVARM(JI,JJ,IKB+KKL) - PVARM(JI,JJ,IKB))
+END DO !CONCURRENT
 !$acc end kernels
 !
-!$acc kernels async
-  ZY(:,:,IKTB+1:IKTE-1)= PVARM(:,:,IKTB+1:IKTE-1)  + PTSTEP*PSOURCE(:,:,IKTB+1:IKTE-1) -               &
-      PEXPL / PRHODJA(:,:,IKTB+1:IKTE-1) *                                          &
-                             ( PVARM(:,:,IKTB+1-KKL:IKTE-1-KKL)*PA(:,:,IKTB+1:IKTE-1)                &
-                              -PVARM(:,:,IKTB+1:IKTE-1)*(PA(:,:,IKTB+1:IKTE-1)+PA(:,:,IKTB+1+KKL:IKTE-1+KKL))   &
-                              +PVARM(:,:,IKTB+1+KKL:IKTE-1+KKL)*PA(:,:,IKTB+1+KKL:IKTE-1+KKL)              &
-                             ) 
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=IKTB+1:IKTE-1)
+  ZY(JI,JJ,JK)= PVARM(JI,JJ,JK)  + PTSTEP*PSOURCE(JI,JJ,JK) -               &
+      PEXPL / PRHODJA(JI,JJ,JK) *                                          &
+                             ( PVARM(JI,JJ,JK-KKL)*PA(JI,JJ,JK)                &
+                              -PVARM(JI,JJ,JK)*(PA(JI,JJ,JK)+PA(JI,JJ,JK+KKL))   &
+                              +PVARM(JI,JJ,JK+KKL)*PA(JI,JJ,JK+KKL)              &
+                              )
+END DO !CONCURRENT  
 !$acc end kernels
 ! 
-!$acc kernels async
-ZY(:,:,IKE)= PVARM(:,:,IKE) + PTSTEP*PSOURCE(:,:,IKE) +               &
-  PEXPL / PRHODJA(:,:,IKE) * PA(:,:,IKE) * (PVARM(:,:,IKE)-PVARM(:,:,IKE-KKL))
+!$acc kernels ! async
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+ZY(JI,JJ,IKE)= PVARM(JI,JJ,IKE) + PTSTEP*PSOURCE(JI,JJ,IKE) +               &
+     PEXPL / PRHODJA(JI,JJ,IKE) * PA(JI,JJ,IKE) * (PVARM(JI,JJ,IKE)-PVARM(JI,JJ,IKE-KKL))
+END DO !CONCURRENT
 !$acc end kernels
 !
-!$acc wait
+! acc wait
 !
 !
 !*       2.  INVERSION OF THE TRIDIAGONAL SYSTEM
@@ -238,15 +262,17 @@ IF ( PIMPL > 1.E-10 ) THEN
   !
   !  going up
   !
-!$acc kernels
-  ZBET(:,:) = 1. - PIMPL * (  PA(:,:,IKB+KKL) / PRHODJA(:,:,IKB) &  
-                            + PCOEFS(:,:) *  PTSTEP        )   ! bet = b(ikb)
-  PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:)                
+   !$acc kernels
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+      ZBET(JI,JJ) = 1. - PIMPL * (  PA(JI,JJ,IKB+KKL) / PRHODJA(JI,JJ,IKB) &  
+           + PCOEFS(JI,JJ) *  PTSTEP        )   ! bet = b(ikb)
+      PVARP(JI,JJ,IKB) = ZY(JI,JJ,IKB) / ZBET(JI,JJ)
+  END DO !CONCURRENT
   !
-  DO JK = IKB+KKL,IKE-KKL,KKL
+  DO JK = IKB+KKL,IKE-KKL,KKL 
 !$acc loop collapse(2) independent
-    DO JJ=1,SIZE(ZGAM,2)
-      DO JI=1,SIZE(ZGAM,1)
+    DO JJ=1,JJU
+      DO JI=1,JIU
         ZGAM(JI,JJ,JK) = PIMPL * PA(JI,JJ,JK) / PRHODJA(JI,JJ,JK-KKL) / ZBET(JI,JJ)  
                                                     ! gam(k) = c(k-1) / bet
         ZBET(JI,JJ)    = 1. - PIMPL * (  PA(JI,JJ,JK) * (1. + ZGAM(JI,JJ,JK))  &
@@ -261,27 +287,33 @@ IF ( PIMPL > 1.E-10 ) THEN
     END DO
   END DO
   ! special treatment for the last level
-  ZGAM(:,:,IKE) = PIMPL * PA(:,:,IKE) / PRHODJA(:,:,IKE-KKL) / ZBET(:,:) 
-                                                    ! gam(k) = c(k-1) / bet
-  ZBET(:,:)    = 1. - PIMPL * (  PA(:,:,IKE) * (1. + ZGAM(:,:,IKE))  &
-                              ) / PRHODJA(:,:,IKE)  
-                                                    ! bet = b(k) - a(k)* gam(k)  
-  PVARP(:,:,IKE)= ( ZY(:,:,IKE) - PIMPL * PA(:,:,IKE) / PRHODJA(:,:,IKE) &
-                                 * PVARP(:,:,IKE-KKL)                      &
-                  ) / ZBET(:,:)
-                                        ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+     ZGAM(JI,JJ,IKE) = PIMPL * PA(JI,JJ,IKE) / PRHODJA(JI,JJ,IKE-KKL) / ZBET(JI,JJ) 
+     ! gam(k) = c(k-1) / bet
+     ZBET(JI,JJ)    = 1. - PIMPL * (  PA(JI,JJ,IKE) * (1. + ZGAM(JI,JJ,IKE))  &
+          ) / PRHODJA(JI,JJ,IKE)  
+     ! bet = b(k) - a(k)* gam(k)  
+     PVARP(JI,JJ,IKE)= ( ZY(JI,JJ,IKE) - PIMPL * PA(JI,JJ,IKE) / PRHODJA(JI,JJ,IKE) &
+          * PVARP(JI,JJ,IKE-KKL)                      &
+          ) / ZBET(JI,JJ)
+     ! res(k) = (y(k) -a(k)*res(k-1))/ bet
+  END DO !CONCURRENT
   !
   !  going down 
   !
   DO JK = IKE-KKL,IKB,-1*KKL
-    PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+KKL) * PVARP(:,:,JK+KKL) 
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+         PVARP(JI,JJ,JK) = PVARP(JI,JJ,JK) - ZGAM(JI,JJ,JK+KKL) * PVARP(JI,JJ,JK+KKL)
+      END DO !CONCURRENT   
   END DO
 !$acc end kernels
 !
 ELSE
 ! 
-!$acc kernels
-  PVARP(:,:,IKTB:IKTE) = ZY(:,:,IKTB:IKTE)
+   !$acc kernels
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=IKTB:IKTE)
+      PVARP(JI,JJ,JK) = ZY(JI,JJ,JK)
+   END DO !CONCURRENT   
 !$acc end kernels
 !
 END IF 
@@ -291,8 +323,10 @@ END IF
 !            ----------------------------------------
 !
 !$acc kernels
-PVARP(:,:,KKA)=PVARP(:,:,IKB)
-PVARP(:,:,KKU)=PVARP(:,:,IKE)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   PVARP(JI,JJ,KKA)=PVARP(JI,JJ,IKB)
+   PVARP(JI,JJ,KKU)=PVARP(JI,JJ,IKE)
+END DO !CONCURRENT
 !$acc end kernels
 
 if ( mppdb_initialized ) then
@@ -302,6 +336,13 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate ( zy,zgam,zbet )
+#else
+CALL MNH_REL_ZT3D( izy,izgam,izbet )
+CALL MNH_CHECK_OUT_ZT3D("TRIDIAG_WIND")
+#endif
+
 !$acc end data
 
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index 1eb7127f6..4e9ca2df0 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -8,7 +8,10 @@ module mode_turb
 !###############
 
 #ifdef MNH_OPENACC
-use mode_msg
+  use mode_msg
+  USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D, &
+       MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D , &
+       MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D
 #endif
 
 #ifdef MNH_BITREP
@@ -389,7 +392,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PLEM  ! Mixing length
 !
 !       0.2  declaration of local variables
 !
-REAL, ALLOCATABLE, DIMENSION(:,:,:) ::&
+REAL, POINTER , CONTIGUOUS, DIMENSION(:,:,:) ::&
           ZCP,                        &  ! Cp at t-1
           ZEXN,                       &  ! EXN at t-1
           ZT,                         &  ! T at t-1
@@ -402,10 +405,13 @@ REAL, ALLOCATABLE, DIMENSION(:,:,:) ::&
           ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,&  ! 3rd order moments
           ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,&  ! opposite of verticale derivate of 3rd order moments
           ZTHLM                          ! initial potential temp.
+INTEGER :: IZCP,IZEXN,IZT,IZLOCPEXNM,IZLEPS,IZTRH,IZATHETA,IZAMOIST &
+          ,IZCOEF_DISS,IZFRAC_ICE,IZMWTH,IZMWR,IZMTH2,IZMR2,IZMTHR &
+          ,IZFWTH,IZFWR,IZFTH2,IZFR2,IZFTHR,IZTHLM
 !
-REAL, ALLOCATABLE, DIMENSION(:,:,:,:) ::     &
+REAL, POINTER , CONTIGUOUS, DIMENSION(:,:,:,:) ::     &
           ZRM                            ! initial mixing ratio
-REAL, ALLOCATABLE, DIMENSION(:,:) ::  ZTAU11M,ZTAU12M,  &
+REAL, POINTER , CONTIGUOUS, DIMENSION(:,:) ::  ZTAU11M,ZTAU12M,  &
                                                  ZTAU22M,ZTAU33M,  &
             ! tangential surface fluxes in the axes following the orography
                                                  ZUSLOPE,ZVSLOPE,  &
@@ -420,9 +426,12 @@ REAL, ALLOCATABLE, DIMENSION(:,:) ::  ZTAU11M,ZTAU12M,  &
 !
             ! Virtual Potential Temp. used
             ! in the Deardorff mixing length computation
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: &
+INTEGER :: IZRM,IZTAU11M,IZTAU12M,IZTAU22M,IZTAU33M,IZUSLOPE,IZVSLOPE &
+          ,IZCDUEFF,IZUSTAR,IZLMO,IZRVM,IZSFRV
+REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS  :: &
           ZLVOCPEXNM,ZLSOCPEXNM,      &  ! Lv/Cp/EXNREF and Ls/Cp/EXNREF at t-1
           ZATHETA_ICE,ZAMOIST_ICE        ! coefficients for s = f (Thetal,Rnp)
+INTEGER :: IZLVOCPEXNM,IZLSOCPEXNM,IZATHETA_ICE,IZAMOIST_ICE
 !
 REAL                :: ZEXPL        ! 1-PIMPL deg of expl.
 REAL                :: ZRVORD       ! RV/RD
@@ -438,14 +447,19 @@ REAL                :: ZALPHA       ! proportionnality constant between Dz/2 and
 !                                   ! BL89 mixing length near the surface
 !
 REAL :: ZTIME1, ZTIME2
-REAL, DIMENSION(:,:,:), allocatable :: ZTT,ZEXNE,ZLV,ZCPH
-REAL, DIMENSION(:,:,:), allocatable :: ZSHEAR, ZDUDZ, ZDVDZ
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTT,ZEXNE,ZLV,ZCPH
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZSHEAR, ZDUDZ, ZDVDZ
+INTEGER :: IZTT,IZEXNE,IZLV,IZCPH,IZSHEAR, IZDUDZ, IZDVDZ
 TYPE(TFIELDDATA) :: TZFIELD
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE
+INTEGER :: IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE
 #endif
 !
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JLU_ZRM, JLU_TURB, JJU_ORMC01, JKU_CLOUD, JKU_TURB
+!
 !------------------------------------------------------------------------------------------
 !
 ! IN variables
@@ -512,70 +526,144 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prsvs,      "Turb beg:prsvs"      )
 end if
 
-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
+JIU =  size(pthlt, 1 )
+JJU =  size(pthlt, 2 )
+JKU =  size(pthlt, 3 )
 
-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
+#ifndef MNH_OPENACC
+ALLOCATE (ZCP       (JIU,JJU,JKU) )
+ALLOCATE (ZEXN      (JIU,JJU,JKU) )
+ALLOCATE (ZT        (JIU,JJU,JKU) )
+ALLOCATE (ZLOCPEXNM (JIU,JJU,JKU) )
+ALLOCATE (ZLEPS     (JIU,JJU,JKU) )
+ALLOCATE (ZTRH      (JIU,JJU,JKU) )
+ALLOCATE (ZATHETA   (JIU,JJU,JKU) )
+ALLOCATE (ZAMOIST   (JIU,JJU,JKU) )
+ALLOCATE (ZCOEF_DISS(JIU,JJU,JKU) )
+ALLOCATE (ZFRAC_ICE (JIU,JJU,JKU) )
+
+ALLOCATE (ZMWTH     (JIU,JJU,JKU) )
+ALLOCATE (ZMWR      (JIU,JJU,JKU) )
+ALLOCATE (ZMTH2     (JIU,JJU,JKU) )
+ALLOCATE (ZMR2      (JIU,JJU,JKU) )
+ALLOCATE (ZMTHR     (JIU,JJU,JKU) )
+
+ALLOCATE (ZFWTH     (JIU,JJU,JKU) )
+ALLOCATE (ZFWR      (JIU,JJU,JKU) )
+ALLOCATE (ZFTH2     (JIU,JJU,JKU) )
+ALLOCATE (ZFR2      (JIU,JJU,JKU) )
+ALLOCATE (ZFTHR     (JIU,JJU,JKU) )
+ALLOCATE (ZTHLM     (JIU,JJU,JKU) )
+
+JLU_TURB = 0 
+IF ( HTURBLEN == 'BL89' .OR. HTURBLEN == 'RM17' .OR. ORMC01 ) JLU_TURB = SIZE(PRT,4)
+ALLOCATE ( ZRM(JIU,JJU,JKU, JLU_TURB ) )
+
+ALLOCATE ( ZTAU11M(JIU,JJU) )
+ALLOCATE ( ZTAU12M(JIU,JJU) )
+ALLOCATE ( ZTAU22M(JIU,JJU) )
+ALLOCATE ( ZTAU33M(JIU,JJU) )
+ALLOCATE ( ZUSLOPE(JIU,JJU) )
+ALLOCATE ( ZVSLOPE(JIU,JJU) )
+ALLOCATE ( ZCDUEFF(JIU,JJU) )
+ALLOCATE ( ZLMO   (JIU,JJU) )
+
+JJU_ORMC01 = 0
+IF (ORMC01) JJU_ORMC01 = SIZE(PTHLT,2)
+ALLOCATE ( ZUSTAR (JIU,JJU_ORMC01) )
+ALLOCATE ( ZRVM   (JIU,JJU_ORMC01) )
+ALLOCATE ( ZSFRV  (JIU,JJU_ORMC01) )
+
+JKU_CLOUD = 0 
+IF ( HCLOUD == 'KHKO' .OR. HCLOUD == 'C2R2' ) JKU_CLOUD = size( put, 3 )
+allocate( ztt   (JIU,JJU, JKU_CLOUD ) )
+allocate( zexne (JIU,JJU, JKU_CLOUD ) )
+allocate( zlv   (JIU,JJU, JKU_CLOUD ) )
+allocate( zcph  (JIU,JJU, JKU_CLOUD ) )
+
+JKU_TURB = 0  
+IF ( HTURBLEN == 'BL89' .OR. HTURBLEN == 'RM17' ) JKU_TURB = size( put, 3 )
+allocate( zshear(JIU,JJU, JKU_TURB ) )
+
+JKU_TURB = 0
+IF ( HTURBLEN == 'RM17' ) JKU_TURB = size( put, 3 )
+allocate( zdudz (JIU,JJU, JKU_TURB ) )
+allocate( zdvdz (JIU,JJU, JKU_TURB ) )
+
+#else
+CALL MNH_CHECK_IN_ZT3D("TURB")
+IZCP =  MNH_ALLOCATE_ZT3D (ZCP       ,JIU,JJU,JKU )
+IZEXN =  MNH_ALLOCATE_ZT3D (ZEXN      ,JIU,JJU,JKU )
+IZT =  MNH_ALLOCATE_ZT3D (ZT        ,JIU,JJU,JKU )
+IZLOCPEXNM =  MNH_ALLOCATE_ZT3D (ZLOCPEXNM ,JIU,JJU,JKU )
+IZLEPS =  MNH_ALLOCATE_ZT3D (ZLEPS     ,JIU,JJU,JKU )
+IZTRH =  MNH_ALLOCATE_ZT3D (ZTRH      ,JIU,JJU,JKU )
+IZATHETA =  MNH_ALLOCATE_ZT3D (ZATHETA   ,JIU,JJU,JKU )
+IZAMOIST =  MNH_ALLOCATE_ZT3D (ZAMOIST   ,JIU,JJU,JKU )
+IZCOEF_DISS =  MNH_ALLOCATE_ZT3D (ZCOEF_DISS,JIU,JJU,JKU )
+IZFRAC_ICE =  MNH_ALLOCATE_ZT3D (ZFRAC_ICE ,JIU,JJU,JKU )
+
+IZMWTH =  MNH_ALLOCATE_ZT3D (ZMWTH     ,JIU,JJU,JKU )
+IZMWR =  MNH_ALLOCATE_ZT3D (ZMWR      ,JIU,JJU,JKU )
+IZMTH2 =  MNH_ALLOCATE_ZT3D (ZMTH2     ,JIU,JJU,JKU )
+IZMR2 =  MNH_ALLOCATE_ZT3D (ZMR2      ,JIU,JJU,JKU )
+IZMTHR =  MNH_ALLOCATE_ZT3D (ZMTHR     ,JIU,JJU,JKU )
+
+IZFWTH =  MNH_ALLOCATE_ZT3D (ZFWTH     ,JIU,JJU,JKU )
+IZFWR =  MNH_ALLOCATE_ZT3D (ZFWR      ,JIU,JJU,JKU )
+IZFTH2 =  MNH_ALLOCATE_ZT3D (ZFTH2     ,JIU,JJU,JKU )
+IZFR2 =  MNH_ALLOCATE_ZT3D (ZFR2      ,JIU,JJU,JKU )
+IZFTHR =  MNH_ALLOCATE_ZT3D (ZFTHR     ,JIU,JJU,JKU )
+IZTHLM =  MNH_ALLOCATE_ZT3D (ZTHLM     ,JIU,JJU,JKU )
+
+JLU_ZRM = 0 
+IF ( HTURBLEN == 'BL89' .OR. HTURBLEN == 'RM17' .OR. ORMC01 ) JLU_ZRM = SIZE(PRT,4)
+IZRM =  MNH_ALLOCATE_ZT4D ( ZRM,JIU,JJU,JKU, JLU_ZRM  )
+
+IZTAU11M =  MNH_ALLOCATE_ZT2D ( ZTAU11M,JIU,JJU )
+IZTAU12M =  MNH_ALLOCATE_ZT2D ( ZTAU12M,JIU,JJU )
+IZTAU22M =  MNH_ALLOCATE_ZT2D ( ZTAU22M,JIU,JJU )
+IZTAU33M =  MNH_ALLOCATE_ZT2D ( ZTAU33M,JIU,JJU )
+IZUSLOPE =  MNH_ALLOCATE_ZT2D ( ZUSLOPE,JIU,JJU )
+IZVSLOPE =  MNH_ALLOCATE_ZT2D ( ZVSLOPE,JIU,JJU )
+IZCDUEFF =  MNH_ALLOCATE_ZT2D ( ZCDUEFF,JIU,JJU )
+IZLMO =  MNH_ALLOCATE_ZT2D ( ZLMO   ,JIU,JJU )
+
+JJU_ORMC01 = 0
+IF (ORMC01) JJU_ORMC01 = SIZE(PTHLT,2)
+IZUSTAR =  MNH_ALLOCATE_ZT2D ( ZUSTAR ,JIU,JJU_ORMC01 )
+IZRVM =  MNH_ALLOCATE_ZT2D ( ZRVM   ,JIU,JJU_ORMC01 )
+IZSFRV =  MNH_ALLOCATE_ZT2D ( ZSFRV  ,JIU,JJU_ORMC01 )
+
+JKU_CLOUD = 0 
+IF ( HCLOUD == 'KHKO' .OR. HCLOUD == 'C2R2' ) JKU_CLOUD = size( put, 3 )
+iztt =  MNH_ALLOCATE_ZT3D( ztt   ,JIU,JJU,JKU_CLOUD )
+izexne =  MNH_ALLOCATE_ZT3D( zexne ,JIU,JJU,JKU_CLOUD )
+izlv =  MNH_ALLOCATE_ZT3D( zlv   ,JIU,JJU,JKU_CLOUD )
+izcph =  MNH_ALLOCATE_ZT3D( zcph  ,JIU,JJU,JKU_CLOUD )
+
+JKU_TURB = 0  
+IF ( HTURBLEN == 'BL89' .OR. HTURBLEN == 'RM17' ) JKU_TURB = size( put, 3 )
+izshear =  MNH_ALLOCATE_ZT3D( zshear,JIU,JJU, JKU_TURB )
+
+JKU_TURB = 0
+IF ( HTURBLEN == 'RM17' ) JKU_TURB = size( put, 3 )
+izdudz =  MNH_ALLOCATE_ZT3D( zdudz ,JIU,JJU, JKU_TURB )
+izdvdz =  MNH_ALLOCATE_ZT3D( zdvdz ,JIU,JJU, JKU_TURB )
+
+#endif
 
 #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
+iztmp1_device =  MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+
+JKU_TURB = 0
+IF (HTURBDIM=="1DIM") JKU_TURB = size( pthlt, 3 )
+iztmp2_device =  MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU, JKU_TURB )
+iztmp3_device =  MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU, JKU_TURB )
+
 #endif
 
-!$acc data create( zcp, zexn, zt, zlocpexnm, zleps, ztrh,         &
+!$acc data present( zcp, zexn, zt, zlocpexnm, zleps, ztrh,         &
 !$acc &            zatheta, zamoist, zcoef_diss, zfrac_ice,       &
 !$acc &            zmwth, zmwr, zmth2, zmr2, zmthr,               &
 !$acc &            zfwth, zfwr, zfth2, zfr2, zfthr, zthlm,        &
@@ -664,10 +752,10 @@ IF (KRRL >=1) THEN
 !*       2.5 Lv/Cph/Exn
 !
   IF ( KRRI >= 1 ) THEN 
-    ALLOCATE(ZLVOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)))
-    ALLOCATE(ZLSOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)))
-    ALLOCATE(ZAMOIST_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)))
-    ALLOCATE(ZATHETA_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)))
+    ALLOCATE(ZLVOCPEXNM(JIU,JJU,JKU))
+    ALLOCATE(ZLSOCPEXNM(JIU,JJU,JKU))
+    ALLOCATE(ZAMOIST_ICE(JIU,JJU,JKU))
+    ALLOCATE(ZATHETA_ICE(JIU,JJU,JKU))
 
 !$acc enter data create( zlvocpexnm, zlsocpexnm )
 !$acc data create( zamoist_ice, zatheta_ice )
@@ -1426,6 +1514,36 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( zcp, zexn, zt, zlocpexnm, zleps, ztrh,         &
+            zatheta, zamoist, zcoef_diss, zfrac_ice,       &
+            zmwth, zmwr, zmth2, zmr2, zmthr,               &
+            zfwth, zfwr, zfth2, zfr2, zfthr, zthlm,        &
+            zrm,                                           &
+            ztau11m, ztau12m, ztau22m, ztau33m,            &
+            zuslope, zvslope, zcdueff, zlmo,               &
+            zustar, zrvm, zsfrv,                           &
+            ztt, zexne, zlv, zcph, zshear,  zdudz,  zdvdz  )
+#else
+
+CALL MNH_REL_ZT3D ( iztt, izexne, izlv, izcph, izshear,  izdudz,  izdvdz, &
+     iztmp1_device, iztmp2_device, iztmp3_device       )
+
+CALL MNH_REL_ZT3D ( iztau11m, iztau12m, iztau22m, iztau33m,   &
+                    izuslope, izvslope, izcdueff, izlmo,      &
+                    izustar, izrvm, izsfrv                   )
+
+CALL MNH_REL_ZT3D ( izrm)
+
+CALL MNH_REL_ZT3D ( izmwth, izmwr, izmth2, izmr2, izmthr,        &
+                    izfwth, izfwr, izfth2, izfr2, izfthr, izthlm )
+
+CALL MNH_REL_ZT3D ( izcp, izexn, izt, izlocpexnm, izleps, iztrh, &
+                    izatheta, izamoist, izcoef_diss, izfrac_ice  )
+
+CALL MNH_CHECK_OUT_ZT3D("TURB")
+#endif
+
 !$acc end data
 
 !----------------------------------------------------------------------------
@@ -1567,8 +1685,8 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)   :: PAMOIST,PATHETA
 !*       0.2   Declarations of local variables
 !
 REAL                :: ZEPS         ! XMV / XMD
-real, dimension(:,:,:), allocatable :: zrvsat
-real, dimension(:,:,:), allocatable :: zdrvsatdt
+real, dimension(:,:,:), pointer , contiguous :: zrvsat
+real, dimension(:,:,:), pointer , contiguous :: zdrvsatdt
 !
 !-------------------------------------------------------------------------------
 
@@ -1710,10 +1828,10 @@ 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(:,:,:), allocatable :: zcoef_ampl
+real, dimension(:,:,:), pointer , contiguous :: zcoef_ampl
                           ! Amplification coefficient of the mixing length
                           ! when the instability criterium is verified 
-real, dimension(:,:,:), allocatable :: zlm_cloud
+real, dimension(:,:,:), pointer , contiguous :: zlm_cloud
                           ! Turbulent mixing length in the clouds
 !
 !-------------------------------------------------------------------------------
@@ -1902,7 +2020,7 @@ REAL                :: ZALPHA       ! proportionnality constant between Dz/2 and
 !                                   ! BL89 mixing length near the surface
 REAL                :: ZD           ! distance to the surface
 #ifdef MNH_OPENACC
-real, dimension(:,:,:), allocatable :: ztmp1_device, ztmp2_device
+real, dimension(:,:,:), pointer , contiguous :: ztmp1_device, ztmp2_device
 #endif
 !
 !-------------------------------------------------------------------------------
@@ -2080,16 +2198,17 @@ REAL                :: ZALPHA       ! proportionnality constant between Dz/2 and
 !                                   ! BL89 mixing length near the surface
 REAL                :: ZD           ! distance to the surface
 REAL                :: ZVAR         ! Intermediary variable
-REAL, DIMENSION(:,:), ALLOCATABLE ::   ZWORK2D
+REAL, DIMENSION(:,:), POINTER , CONTIGUOUS ::   ZWORK2D
 !
-REAL, DIMENSION(:,:,:), ALLOCATABLE ::     &
+REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS ::     &
             ZDTHLDZ,ZDRTDZ,     &!dtheta_l/dz, drt_dz used for computing the stablity
 !                                ! criterion
             ZETHETA,ZEMOIST             !coef ETHETA and EMOIST
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZTMP1_DEVICE,ZTMP2_DEVICE
 #endif
+INTEGER  :: JIU,JJU,JKU
 !----------------------------------------------------------------------------
 
 !$acc data present( PDXX, PDYY, PDZZ, PZZ, PDIRCOSZW, PTHLT, PTHVREF, PTKET, PSRCT, PRT, PLOCPEXNM, PATHETA, PAMOIST, PLM )
@@ -2111,15 +2230,19 @@ if ( mppdb_initialized ) then
   call Mppdb_check( pamoist,   "Dear beg:pamoist"   )
 end if
 
+JIU =  size(pthlt, 1 )
+JJU =  size(pthlt, 2 )
+JKU =  size(pthlt, 3 )
+
 !-------------------------------------------------------------------------------
 allocate( ZWORK2D(SIZE(PLM,1),SIZE(PLM,2)) )
-allocate( ZDTHLDZ(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
-allocate( ZDRTDZ (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
-allocate( ZETHETA(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
-allocate( ZEMOIST(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+allocate( ZDTHLDZ(JIU,JJU,JKU) )
+allocate( ZDRTDZ (JIU,JJU,JKU) )
+allocate( ZETHETA(JIU,JJU,JKU) )
+allocate( ZEMOIST(JIU,JJU,JKU) )
 #ifdef MNH_OPENACC
-allocate( ZTMP1_DEVICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
-allocate( ZTMP2_DEVICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) )
+allocate( ZTMP1_DEVICE(JIU,JJU,JKU) )
+allocate( ZTMP2_DEVICE(JIU,JJU,JKU) )
 #endif
 
 !$acc data create( zwork2d, zdthldz, zdrtdz, zetheta, zemoist, &
diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90
index 3fc86172e..7e4e378b7 100644
--- a/src/MNH/turb_hor_dyn_corr.f90
+++ b/src/MNH/turb_hor_dyn_corr.f90
@@ -173,6 +173,9 @@ USE MODE_MPPDB
 #ifdef MNH_BITREP
 USE MODI_BITREP
 #endif
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+#endif
 !
 IMPLICIT NONE
 !
@@ -229,9 +232,10 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP,PTP      ! TKE production terms
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays, PK is the turb. mixing coef.
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZFLX,ZWORK ! work arrays, PK is the turb. mixing coef.
 !
-REAL, DIMENSION(:,:),   allocatable ::ZDIRSINZW
+REAL, DIMENSION(:,:),   pointer , contiguous :: ZDIRSINZW
+INTEGER :: IZFLX,IZWORK,IZDIRSINZW
       ! sinus of the angle between the vertical and the normal to the orography
 INTEGER             :: IKB,IKE
                                     ! Index values for the Beginning and End
@@ -239,20 +243,23 @@ INTEGER             :: IKB,IKE
 INTEGER             :: IKU                                   
 INTEGER             :: JSV          ! scalar loop counter
 !
-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
+REAL, DIMENSION(:,:,:), pointer , contiguous :: GX_U_M_PUM
+REAL, DIMENSION(:,:,:), pointer , contiguous :: GY_V_M_PVM
+REAL, DIMENSION(:,:,:), pointer , contiguous :: GZ_W_M_PWM
+REAL, DIMENSION(:,:,:), pointer , contiguous :: GZ_W_M_ZWP
+INTEGER :: IGX_U_M_PUM,IGY_V_M_PVM,IGZ_W_M_PWM,IGZ_W_M_ZWP
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZMZF_DZZ   ! MZF(PDZZ)
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZDFDDWDZ   ! formal derivative of the
 !                                                 ! flux (variable: dW/dz)
-REAL, DIMENSION(:,:,:), allocatable :: ZWP        ! W at future   time-step
+REAL, DIMENSION(:,:,:), pointer , contiguous :: 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
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZDU_DZ_DZS_DX ! du/dz*dzs/dx surf
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZDV_DZ_DZS_DY ! dv/dz*dzs/dy surf
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZDU_DX        ! du/dx        surf
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZDV_DY        ! dv/dy        surf
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZDW_DZ        ! dw/dz        surf
+INTEGER :: IZMZF_DZZ,IZDFDDWDZ,IZWP,IZDU_DZ_DZS_DX,IZDV_DZ_DZS_DY &
+           ,IZDU_DX,IZDV_DY,IZDW_DZ 
 !
 INTEGER                :: IINFO_ll      ! return code of parallel routine
 TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
@@ -260,14 +267,19 @@ TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
 REAL :: ZTIME1, ZTIME2
 
 
-REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF , ZDZZ
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZCOEFF , ZDZZ
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
+INTEGER  :: IZCOEFF , IZDZZ
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 ! --------------------------------------------------------------------------
 
 !$acc data present( PK, PINV_PDZZ, PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ, PDIRCOSZW,     &
@@ -313,36 +325,64 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size(pum, 1 )
+JJU =  size(pum, 2 )
+JKU =  size(pum, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zflx (JIU,JJU,JKU ) )
+allocate( zwork(JIU,JJU,JKU ) )
 
-allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) )
+allocate( zdirsinzw(JIU,JJU ) )
+
+allocate( gx_u_m_pum(JIU,JJU,JKU ) )
+allocate( gy_v_m_pvm(JIU,JJU,JKU ) )
+allocate( gz_w_m_pwm(JIU,JJU,JKU ) )
+allocate( gz_w_m_zwp(JIU,JJU,JKU ) )
+allocate( zmzf_dzz  (JIU,JJU,JKU ) )
+allocate( zdfddwdz  (JIU,JJU,JKU ) )
+allocate( zwp       (JIU,JJU,JKU ) )
+
+allocate( zdu_dz_dzs_dx(JIU,JJU, 1 ) )
+allocate( zdv_dz_dzs_dy(JIU,JJU, 1 ) )
+allocate( zdu_dx       (JIU,JJU, 1 ) )
+allocate( zdv_dy       (JIU,JJU, 1 ) )
+allocate( zdw_dz       (JIU,JJU, 1 ) )
+
+allocate( zcoeff(JIU,JJU, 1 + jpvext : 3 + jpvext ) )
+allocate( zdzz  (JIU,JJU, 1 + jpvext : 3 + jpvext ) )
+#else
+izflx          = MNH_ALLOCATE_ZT3D( zflx ,JIU,JJU,JKU )
+izwork         = MNH_ALLOCATE_ZT3D( zwork,JIU,JJU,JKU )
 
-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 ) ) )
+izdirsinzw     = MNH_ALLOCATE_ZT2D( zdirsinzw,JIU,JJU )
 
-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 ) )
+igx_u_m_pum    = MNH_ALLOCATE_ZT3D( gx_u_m_pum,JIU,JJU,JKU )
+igy_v_m_pvm    = MNH_ALLOCATE_ZT3D( gy_v_m_pvm,JIU,JJU,JKU )
+igz_w_m_pwm    = MNH_ALLOCATE_ZT3D( gz_w_m_pwm,JIU,JJU,JKU )
+igz_w_m_zwp    = MNH_ALLOCATE_ZT3D( gz_w_m_zwp,JIU,JJU,JKU )
+izmzf_dzz      = MNH_ALLOCATE_ZT3D( zmzf_dzz  ,JIU,JJU,JKU )
+izdfddwdz      = MNH_ALLOCATE_ZT3D( zdfddwdz  ,JIU,JJU,JKU )
+izwp           = MNH_ALLOCATE_ZT3D( zwp       ,JIU,JJU,JKU )
 
-allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
-allocate( zdzz  (size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+izdu_dz_dzs_dx = MNH_ALLOCATE_ZT3DP( zdu_dz_dzs_dx,JIU,JJU, 1 , 1 )
+izdv_dz_dzs_dy = MNH_ALLOCATE_ZT3DP( zdv_dz_dzs_dy,JIU,JJU, 1 , 1 )
+izdu_dx        = MNH_ALLOCATE_ZT3DP( zdu_dx       ,JIU,JJU, 1 , 1 )
+izdv_dy        = MNH_ALLOCATE_ZT3DP( zdv_dy       ,JIU,JJU, 1 , 1 )
+izdw_dz        = MNH_ALLOCATE_ZT3DP( zdw_dz       ,JIU,JJU, 1 , 1 )
+
+izcoeff        = MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+izdzz          = MNH_ALLOCATE_ZT3DP( zdzz  ,JIU,JJU, 1 + jpvext , 3 + jpvext )
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU )
 #endif
 
-!$acc data create( ZFLX, ZWORK, ZDIRSINZW, ZCOEFF, ZDZZ,                  &
+!$acc data present(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,  &
@@ -395,13 +435,15 @@ CALL ADD3DFIELD_ll( TZFIELDS_ll, ZFLX, 'TURB_HOR_DYN_CORR::ZFLX' )
 !
 ! Computes the U variance
 IF (.NOT. L2D) THEN
-  !$acc kernels async(2)
-  ZFLX(:,:,:)= (2./3.) * PTKEM                                  &
-    - XCMFS * PK *( (4./3.) * GX_U_M_PUM                        &
-                   -(2./3.) * ( GY_V_M_PVM                      &
-                               +GZ_W_M_PWM                ) ) 
-  !$acc end kernels
-  !!  &   to be tested later
+   !$acc kernels async(2)
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZFLX(JI,JJ,JK)= (2./3.) * PTKEM(JI,JJ,JK)                            &
+           - XCMFS * PK(JI,JJ,JK) *( (4./3.) * GX_U_M_PUM(JI,JJ,JK)        &
+           -(2./3.) * ( GY_V_M_PVM(JI,JJ,JK)                     &
+           +GZ_W_M_PWM(JI,JJ,JK)                ) )
+   END DO !CONCURRENT
+   !$acc end kernels
+   !!  &   to be tested later
   !!  + XCMFB *  PLM / SQRT(PTKEM) * (-2./3.) * PTP 
 ELSE
   !$acc kernels async(2)
@@ -640,7 +682,9 @@ END IF
 #else
 CALL MXF_DEVICE(PDXX, ZTMP1_DEVICE)
 !$acc kernels async(10)
-ZTMP2_DEVICE = PRHODJ * ZFLX / ZTMP1_DEVICE
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) * ZFLX(JI,JJ,JK) / ZTMP1_DEVICE(JI,JJ,JK)
+END DO !CONCURRENT
 !$acc end kernels
 !
 !!! wait for the computation of ZTMP2_DEVICE and the update of ZFLX
@@ -650,33 +694,41 @@ CALL DXM_DEVICE(ZTMP2_DEVICE, ZTMP3_DEVICE)
 IF (.NOT. LFLAT) THEN
   CALL MZM_DEVICE(PDXX,ZTMP1_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = PRHODJ * ZFLX
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) * ZFLX(JI,JJ,JK)
+  END DO !CONCURRENT
   !$acc end kernels
   CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = ZTMP4_DEVICE * PINV_PDZZ
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
   CALL MXM_DEVICE( ZTMP2_DEVICE, ZTMP4_DEVICE )
   !$acc kernels
-  ZTMP2_DEVICE = PDZX / ZTMP1_DEVICE * ZTMP4_DEVICE
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK) / ZTMP1_DEVICE(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
   CALL DZF_DEVICE(1,IKU,1,ZTMP2_DEVICE,ZTMP1_DEVICE)
   !$acc kernels async(1)
-  PRUS(:,:,:)=PRUS                                            &
-              -ZTMP3_DEVICE                &
-              +ZTMP1_DEVICE
+  PRUS(:,:,:)=PRUS(:,:,:)                                           &
+              -ZTMP3_DEVICE(:,:,:)                &
+              +ZTMP1_DEVICE(:,:,:)
   !$acc end kernels
 ELSE
   !$acc kernels async(1)
-  PRUS(:,:,:)=PRUS - ZTMP3_DEVICE
+  PRUS(:,:,:)=PRUS(:,:,:) - ZTMP3_DEVICE(:,:,:)
   !$acc end kernels
 END IF
 #endif
 !
 IF (KSPLT==1) THEN
   ! Contribution to the dynamic production of TKE:
-  !$acc kernels async(2)
-  ZWORK(:,:,:)     = - ZFLX(:,:,:) * GX_U_M_PUM
+   !$acc kernels async(2)
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZWORK(JI,JJ,JK)     = - ZFLX(JI,JJ,JK) * GX_U_M_PUM(JI,JJ,JK)
+   END DO !CONCURRENT
   !$acc end kernels
   !
   ! evaluate the dynamic production at w(IKB+1) in PDP(IKB)
@@ -723,12 +775,14 @@ END IF
 !
 ! Computes the V variance
 IF (.NOT. L2D) THEN
-  !$acc kernels async(3)
-  ZFLX(:,:,:)= (2./3.) * PTKEM                                  &
-    - XCMFS * PK *( (4./3.) * GY_V_M_PVM                        &
-                   -(2./3.) * ( GX_U_M_PUM                      &
-                               +GZ_W_M_PWM                ) )  
-  !$acc end kernels
+   !$acc kernels async(3)
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZFLX(JI,JJ,JK)= (2./3.) * PTKEM(JI,JJ,JK)                                  &
+           - XCMFS * PK(JI,JJ,JK) *( (4./3.) * GY_V_M_PVM(JI,JJ,JK)                        &
+           -(2./3.) * ( GX_U_M_PUM(JI,JJ,JK)                      &
+           +GZ_W_M_PWM(JI,JJ,JK)                ) )
+   END DO !CONCURRENT
+   !$acc end kernels
   !! &  to be tested
   !!  + XCMFB *  PLM / SQRT(PTKEM) * (-2./3.) * PTP 
   !
@@ -837,7 +891,9 @@ IF (.NOT. L2D) THEN
 #else
   CALL MYF_DEVICE(PDYY, ZTMP1_DEVICE)
   !$acc kernels async(10)
-  ZTMP2_DEVICE = PRHODJ * ZFLX / ZTMP1_DEVICE
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) * ZFLX(JI,JJ,JK) / ZTMP1_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
   !
   !!! wait for the computation of ZTMP2_DEVICE and the update of ZFLX
@@ -847,31 +903,41 @@ IF (.NOT. L2D) THEN
   IF (.NOT. LFLAT) THEN
     CALL MZM_DEVICE(PDYY,ZTMP1_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = PRHODJ * ZFLX
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) * ZFLX(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels
     CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = ZTMP4_DEVICE * PINV_PDZZ
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels
     CALL MYM_DEVICE( ZTMP2_DEVICE,ZTMP4_DEVICE )
     !$acc kernels
-    ZTMP2_DEVICE = PDZY / ZTMP1_DEVICE * ZTMP4_DEVICE
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK) / ZTMP1_DEVICE(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels
     CALL DZF_DEVICE(1,IKU,1,ZTMP2_DEVICE,ZTMP4_DEVICE )
     !$acc kernels async(1)
-    PRVS(:,:,:)=PRVS                                          &
-                -ZTMP3_DEVICE              &
-                +ZTMP4_DEVICE
+    PRVS(:,:,:)=PRVS(:,:,:)                                          &
+                -ZTMP3_DEVICE(:,:,:)              &
+                +ZTMP4_DEVICE(:,:,:)
     !$acc end kernels
   ELSE
-    !$acc kernels async(1)
-    PRVS(:,:,:)=PRVS - ZTMP3_DEVICE
+     !$acc kernels async(1)
+     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+        PRVS(JI,JJ,JK)=PRVS(JI,JJ,JK) - ZTMP3_DEVICE(JI,JJ,JK)
+     END DO !CONCURRENT    
     !$acc end kernels
   END IF
 ! Contribution to the dynamic production of TKE:
   IF (KSPLT==1) THEN
-    !$acc kernels async(2)
-    ZWORK(:,:,:)     = - ZFLX(:,:,:) * GY_V_M_PVM
+     !$acc kernels async(2)
+     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+        ZWORK(JI,JJ,JK) = - ZFLX(JI,JJ,JK) * GY_V_M_PVM(JI,JJ,JK)
+     END DO !CONCURRENT   
     !$acc end kernels
   ENDIF
 #endif
@@ -923,11 +989,13 @@ END IF
 !
 ! Computes the W variance
 IF (.NOT. L2D) THEN
-  !$acc kernels async(2)
-  ZFLX(:,:,:)= (2./3.) * PTKEM                                  &
-    - XCMFS * PK *( (4./3.) * GZ_W_M_PWM                        &
-                   -(2./3.) * ( GX_U_M_PUM                      &
-                               +GY_V_M_PVM                ) ) 
+   !$acc kernels async(2)
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZFLX(JI,JJ,JK) = (2./3.) * PTKEM(JI,JJ,JK)                                  &
+           - XCMFS * PK(JI,JJ,JK) *( (4./3.) * GZ_W_M_PWM(JI,JJ,JK)                        &
+           -(2./3.) * ( GX_U_M_PUM(JI,JJ,JK)                      &
+           +GY_V_M_PVM(JI,JJ,JK)                ) )
+   END DO !CONCURRENT
   !$acc end kernels
   !!  &  to be tested
   !!    -2.* XCMFB *  PLM / SQRT(PTKEM) * (-2./3.) * PTP 
@@ -1035,15 +1103,19 @@ GZ_W_M_ZWP = GZ_W_M(ZWP,PDZZ)
 CALL GZ_W_M_DEVICE(1,IKU,1,ZWP,PDZZ,GZ_W_M_ZWP)
 #endif
 !$acc kernels async(2)
-ZFLX(:,:,IKB+1:)=ZFLX(:,:,IKB+1:) &
-  - XCMFS * PK(:,:,IKB+1:) * (4./3.) * (GZ_W_M_ZWP(:,:,IKB+1:) - GZ_W_M_PWM(:,:,IKB+1:))
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU)
+   ZFLX(JI,JJ,IKB+1:)=ZFLX(JI,JJ,IKB+1:) &
+        - XCMFS * PK(JI,JJ,IKB+1:) * (4./3.) * (GZ_W_M_ZWP(JI,JJ,IKB+1:) - GZ_W_M_PWM(JI,JJ,IKB+1:))
+END DO !CONCURRENT
 !$acc end kernels
 !
 IF (KSPLT==1) THEN
-  !Contribution to the dynamic production of TKE:
-  !$acc kernels async(2)
-  ZWORK(:,:,:) = - ZFLX(:,:,:) * GZ_W_M_ZWP
-  !$acc end kernels
+   !Contribution to the dynamic production of TKE:
+   !$acc kernels async(2)
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZWORK(JI,JJ,JK) = - ZFLX(JI,JJ,JK) * GZ_W_M_ZWP(JI,JJ,JK)
+   END DO !CONCURRENT   
+   !$acc end kernels
   !
   ! evaluate the dynamic production at w(IKB+1) in PDP(IKB)
   !
@@ -1173,6 +1245,22 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+DEALLOCATE (ZFLX, ZWORK, ZDIRSINZW, ZCOEFF, ZDZZ,                  &
+            GX_U_M_PUM, GY_V_M_PVM, GZ_W_M_PWM, GZ_W_M_ZWP,        &
+            ZMZF_DZZ, ZDFDDWDZ, ZWP,                               &
+            ZDU_DZ_DZS_DX, ZDV_DZ_DZS_DY, ZDU_DX, ZDV_DY, ZDW_DZ   )
+#else
+CALL MNH_REL_ZT3D(IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
+CALL MNH_REL_ZT3D(IZFLX, IZWORK, IZDIRSINZW,          &
+            IGX_U_M_PUM, IGY_V_M_PVM, IGZ_W_M_PWM, IGZ_W_M_ZWP,        &
+            IZMZF_DZZ, IZDFDDWDZ, IZWP,                                &
+            IZDU_DZ_DZS_DX, IZDV_DZ_DZS_DY, IZDU_DX, IZDV_DY, IZDW_DZ, &
+            IZCOEFF, IZDZZ             )
+
+#endif
+     
+
 !$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 452aeddec..05d4a0e6f 100644
--- a/src/MNH/turb_hor_splt.f90
+++ b/src/MNH/turb_hor_splt.f90
@@ -270,6 +270,10 @@ USE MODI_SHUMAN_DEVICE
 USE MODI_TURB_HOR
 USE MODI_TURB_HOR_TKE
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D, &
+                            MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D
+#endif
 !
 IMPLICIT NONE
 !
@@ -347,12 +351,13 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PSIGS
 !
 !*       0.2  declaration of local variables
 !
-REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZK           ! Turbulent diffusion doef.
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:) :: ZK           ! Turbulent diffusion doef.
                                                   ! ZK = PLM * SQRT(PTKEM)
-REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZINV_PDXX    ! 1./PDXX
-REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZINV_PDYY    ! 1./PDYY
-REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZINV_PDZZ    ! 1./PDZZ
-REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZMZM_PRHODJ  ! MZM(PRHODJ)
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:) :: ZINV_PDXX    ! 1./PDXX
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:) :: ZINV_PDYY    ! 1./PDYY
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:) :: ZINV_PDZZ    ! 1./PDZZ
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:) :: ZMZM_PRHODJ  ! MZM(PRHODJ)
+INTEGER :: IZK,IZINV_PDXX,IZINV_PDYY,IZINV_PDZZ,IZMZM_PRHODJ
 !
 INTEGER :: JSPLT ! current split
 !
@@ -362,15 +367,21 @@ INTEGER :: JRR, JSV
 INTEGER :: ISV
 INTEGER :: IINFO_ll
 !
-REAL,ALLOCATABLE,DIMENSION(:,:,:)   :: ZUM, ZVM, ZWM, ZTHLM, ZTKEM
-REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRM, ZSVM
-REAL,ALLOCATABLE,DIMENSION(:,:,:)   :: ZRUS, ZRVS, ZRWS, ZRTHLS
-REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRRS, ZRSVS
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
+!
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:)   :: ZUM, ZVM, ZWM, ZTHLM, ZTKEM
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:,:) :: ZRM, ZSVM
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:)   :: ZRUS, ZRVS, ZRWS, ZRTHLS
+REAL,POINTER , CONTIGUOUS,DIMENSION(:,:,:,:) :: ZRRS, ZRSVS
+INTEGER :: IZUM, IZVM, IZWM, IZTHLM, IZTKEM, IZRM, IZSVM &
+         , IZRUS, IZRVS, IZRWS, IZRTHLS, IZRRS, IZRSVS
 !
 TYPE(LIST_ll), POINTER, SAVE :: TZFIELDS_ll
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZTMP1_DEVICE,ZTMP2_DEVICE
+INTEGER :: IZTMP1_DEVICE,IZTMP2_DEVICE
 #endif
 ! ---------------------------------------------------------------------------
 
@@ -445,17 +456,30 @@ IKE = SIZE(PUM,3) - JPVEXT
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 ISV=SIZE(PSVM,4)
 !
-ALLOCATE(ZK(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)))
-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)))
+JIU =  size(pthlm, 1 )
+JJU =  size(pthlm, 2 )
+JKU =  size(pthlm, 3 )
+!
+#ifndef MNH_OPENACC
+ALLOCATE(ZK(JIU,JJU,JKU))
+ALLOCATE(ZINV_PDXX(JIU,JJU,JKU))
+ALLOCATE(ZINV_PDYY(JIU,JJU,JKU))
+ALLOCATE(ZINV_PDZZ(JIU,JJU,JKU))
+ALLOCATE(ZMZM_PRHODJ(JIU,JJU,JKU))
+#else
+IZK          = MNH_ALLOCATE_ZT3D(ZK, JIU,JJU,JKU)
+IZINV_PDXX   = MNH_ALLOCATE_ZT3D(ZINV_PDXX, JIU,JJU,JKU)
+IZINV_PDYY   = MNH_ALLOCATE_ZT3D(ZINV_PDYY, JIU,JJU,JKU)
+IZINV_PDZZ   = MNH_ALLOCATE_ZT3D(ZINV_PDZZ, JIU,JJU,JKU)
+IZMZM_PRHODJ = MNH_ALLOCATE_ZT3D(ZMZM_PRHODJ, JIU,JJU,JKU)
+#endif
+
 #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 ) ) )
+IZTMP1_DEVICE = MNH_ALLOCATE_ZT3D( ZTMP1_DEVICE, JIU,JJU,JKU )
+IZTMP2_DEVICE = MNH_ALLOCATE_ZT3D( ZTMP2_DEVICE, JIU,JJU,JKU )
 #endif
 
-!$acc data create( ZK, ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, &
+!$acc data present( ZK, ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, &
 !$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE )
 
 !$acc kernels
@@ -482,7 +506,8 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN
 !
 !*       2.1  allocations
 !             -----------
-!
+   !
+#ifndef MNH_OPENACC   
   ALLOCATE(ZUM(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)))
   ALLOCATE(ZVM(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3)))
   ALLOCATE(ZWM(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)))
@@ -496,7 +521,28 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN
   ALLOCATE(ZRSVS(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3),SIZE(PRSVS,4)))
   ALLOCATE(ZRTHLS(SIZE(PRTHLS,1),SIZE(PRTHLS,2),SIZE(PRTHLS,3)))
   ALLOCATE(ZRRS(SIZE(PRRS,1),SIZE(PRRS,2),SIZE(PRRS,3),SIZE(PRRS,4)))
-!$acc data create( zum, zvm, zwm, zsvm, zthlm, ztkem, zrm, zrus, zrvs, zrws, zrsvs, zrthls, zrrs )
+#else
+  IZUM    = MNH_ALLOCATE_ZT3D(ZUM,JIU,JJU,JKU)
+  IZVM    = MNH_ALLOCATE_ZT3D(ZVM,JIU,JJU,JKU)
+  IZWM    = MNH_ALLOCATE_ZT3D(ZWM,JIU,JJU,JKU)
+  
+  IZTHLM  = MNH_ALLOCATE_ZT3D(ZTHLM,JIU,JJU,JKU)
+  IZTKEM  = MNH_ALLOCATE_ZT3D(ZTKEM,JIU,JJU,JKU)
+  
+  IZRUS   = MNH_ALLOCATE_ZT3D(ZRUS,JIU,JJU,JKU)
+  IZRVS   = MNH_ALLOCATE_ZT3D(ZRVS,JIU,JJU,JKU)
+  IZRWS   = MNH_ALLOCATE_ZT3D(ZRWS,JIU,JJU,JKU)
+  
+  IZRTHLS = MNH_ALLOCATE_ZT3D(ZRTHLS,JIU,JJU,JKU)
+
+  IZSVM   = MNH_ALLOCATE_ZT4D(ZSVM,JIU,JJU,JKU, SIZE(PSVM,4) )
+  IZRM    = MNH_ALLOCATE_ZT4D(ZRM,JIU,JJU,JKU, SIZE(PRM,4) )
+  IZRSVS  = MNH_ALLOCATE_ZT4D(ZRSVS,JIU,JJU,JKU, SIZE(PRSVS,4) )
+  IZRRS   = MNH_ALLOCATE_ZT4D(ZRRS,JIU,JJU,JKU, SIZE(PRRS,4) )
+  
+#endif
+  
+!$acc data present( zum, zvm, zwm, zsvm, zthlm, ztkem, zrm, zrus, zrvs, zrws, zrsvs, zrthls, zrrs )
 !
 !
 !*       2.2  list for parallel exchanges
@@ -702,6 +748,7 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN
 !             -------------
 !
 !$acc end data
+#ifndef MNH_OPENACC  
   DEALLOCATE(ZUM)
   DEALLOCATE(ZVM)
   DEALLOCATE(ZWM)
@@ -715,6 +762,14 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN
   DEALLOCATE(ZRSVS)
   DEALLOCATE(ZRTHLS)
   DEALLOCATE(ZRRS)
+#else
+  CALL MNH_REL_ZT4D (SIZE(PRRS,4)  , IZRRS  )
+  CALL MNH_REL_ZT4D (SIZE(PRSVS,4) , IZRSVS )
+  CALL MNH_REL_ZT4D (SIZE(PRM,4)   , IZRM   )
+  CALL MNH_REL_ZT4D (SIZE(PSVM,4)  , IZSVM  )
+  CALL MNH_REL_ZT3D ( izum, izvm, izwm, izthlm, iztkem, izrus, izrvs, izrws, izrthls)
+#endif
+  
   !
   CALL CLEANLIST_ll(TZFIELDS_ll)
 !
@@ -755,14 +810,15 @@ END IF
 !
 !$acc end data
 
+#ifndef MNH_OPENACC
 DEALLOCATE(ZK)
 DEALLOCATE(ZINV_PDXX)
 DEALLOCATE(ZINV_PDYY)
 DEALLOCATE(ZINV_PDZZ)
 DEALLOCATE(ZMZM_PRHODJ)
-#ifdef MNH_OPENACC
-deallocate( ZTMP1_DEVICE )
-deallocate( ZTMP2_DEVICE )
+#else
+CALL MNH_REL_ZT3D(IZK, IZINV_PDXX, IZINV_PDYY, IZINV_PDZZ, IZMZM_PRHODJ, &
+                  IZTMP1_DEVICE, IZTMP2_DEVICE )
 #endif
 
 if ( mppdb_initialized ) then
diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90
index 2d3ce6c4e..8a80775f4 100644
--- a/src/MNH/turb_hor_sv_flux.f90
+++ b/src/MNH/turb_hor_sv_flux.f90
@@ -138,6 +138,10 @@ USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+#endif
+!
 IMPLICIT NONE
 !
 !
@@ -175,8 +179,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRSVS        ! var. at t+1 -split-
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZFLXX, ZFLXY ! work arrays
-REAL, DIMENSION(:,:,:), allocatable :: ZWORK2D
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZFLXX, ZFLXY ! work arrays
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZWORK2D
 !
 REAL :: ZCSV          !constant for the scalar flux
 
@@ -185,7 +189,8 @@ INTEGER             :: IKB,IKE
                                     ! mass points of the domain  
 INTEGER             :: JSV          ! loop counter
 INTEGER             :: ISV          ! number of scalar var.
-REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZCOEFF
+INTEGER :: IZFLXX, IZFLXY, IZWORK2D, IZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
 !
@@ -194,9 +199,13 @@ TYPE(TFIELDDATA) :: TZFIELD
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, &
-                                       ZTMP4_DEVICE, ZTMP5_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, &
+     ZTMP4_DEVICE, ZTMP5_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, IZTMP5_DEVICE
 #endif
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PK, PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, &
@@ -229,22 +238,35 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size(psvm, 1 )
+JJU =  size(psvm, 2 )
+JKU =  size(psvm, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zflxx(JIU,JJU,JKU ) )
+allocate( zflxy(JIU,JJU,JKU ) )
+
+allocate( zwork2d(JIU,JJU, 1 ) )
 
-allocate( zwork2d(size( psvm, 1 ), size( psvm, 2 ), 1 ) )
+allocate( zcoeff((JIU,JJU, 1 + jpvext : 3 + jpvext ) )
+#else
+izflxx   = MNH_ALLOCATE_ZT3D( zflxx,JIU,JJU,JKU)
+izflxy   = MNH_ALLOCATE_ZT3D( zflxy,JIU,JJU,JKU)
+
+izwork2d = MNH_ALLOCATE_ZT3DP( zwork2d,JIU,JJU, 1 , 1 )
 
-allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+izcoeff  = MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU)
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU)
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU)
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU)
+iztmp5_device = MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU)
 #endif
 
-!$acc data create( ZFLXX, ZFLXY, ZWORK2D, ZCOEFF, &
+!$acc data present( ZFLXX, ZFLXY, ZWORK2D, ZCOEFF, &
 !$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE )
 
 !
@@ -619,6 +641,13 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( ZFLXX, ZFLXY, ZWORK2D, ZCOEFF )
+#else
+CALL MNH_REL_ZT3D ( IZFLXX, IZFLXY, IZWORK2D, IZCOEFF, &
+          IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, IZTMP5_DEVICE )
+#endif
+
 !$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 6e1e1ba27..ad792de7e 100644
--- a/src/MNH/turb_hor_thermo_corr.f90
+++ b/src/MNH/turb_hor_thermo_corr.f90
@@ -149,6 +149,11 @@ USE MODI_SECOND_MNH
 USE MODI_BITREP
 #endif
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D, &
+                            MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D
+#endif
+!
 IMPLICIT NONE
 !
 !
@@ -197,22 +202,27 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PSIGS
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK,ZA ! work arrays
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZFLX,ZWORK,ZA ! work arrays
 !   
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
-REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZCOEFF
+INTEGER :: IZFLX,IZWORK,IZA,IZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
 REAL :: ZTIME1, ZTIME2
 TYPE(TFIELDDATA) :: TZFIELD
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE ,&
+           IZTMP5_DEVICE, IZTMP6_DEVICE, IZTMP7_DEVICE, IZTMP8_DEVICE
 #endif
 !
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PINV_PDXX, PINV_PDYY,               &
@@ -247,24 +257,36 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size(pthlm, 1 )
+JJU =  size(pthlm, 2 )
+JKU =  size(pthlm, 3 )
 
-allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+#ifndef MNH_OPENACC
+allocate( zflx (JIU,JJU,JKU ) )
+allocate( zwork(JIU,JJU,JKU ) )
+allocate( za   (JIU,JJU,JKU ) )
+
+allocate( zcoeff(JIU,JJU, 1 + jpvext : 3 + jpvext ) )
+#else
+izflx  = MNH_ALLOCATE_ZT3D( zflx ,JIU,JJU,JKU )
+izwork = MNH_ALLOCATE_ZT3D( zwork ,JIU,JJU,JKU )
+iza    = MNH_ALLOCATE_ZT3D( za ,JIU,JJU,JKU )
+
+izcoeff= MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+#endif
 
 #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 ) ) )
+iztmp1_device= MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU  )
+iztmp2_device= MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU  )
+iztmp3_device= MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU  )
+iztmp4_device= MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU  )
+iztmp5_device= MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU  )
+iztmp6_device= MNH_ALLOCATE_ZT3D( ztmp6_device,JIU,JJU,JKU  )
+iztmp7_device= MNH_ALLOCATE_ZT3D( ztmp7_device,JIU,JJU,JKU  )
+iztmp8_device= MNH_ALLOCATE_ZT3D( ztmp8_device,JIU,JJU,JKU  )
 #endif
 
-!$acc data create( ZFLX, ZWORK, ZA, ZCOEFF,                                    &
+!$acc data present( ZFLX, ZWORK, ZA, ZCOEFF,                                    &
 !$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, &
 !$acc &            ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE  )
 
@@ -457,7 +479,9 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. OCLOSE_OUT ) &
     CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_SUBGRID_ThlPz, .TRUE. )
     !
 !$acc end data
+    
 #endif
+
     CALL SECOND_MNH(ZTIME2)
     XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1
   END IF
@@ -488,7 +512,8 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. OCLOSE_OUT ) &
       CALL GY_M_M_DEVICE(1,IKU,1,PTHLM       ,PDYY,PDZZ,PDZY,ZTMP3_DEVICE)
       CALL GY_M_M_DEVICE(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP4_DEVICE)
 !$acc kernels
-      ZFLX(:,:,:)=PLM(:,:,:) * PLEPS(:,:,:) * (ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:)+ZTMP3_DEVICE(:,:,:)*ZTMP4_DEVICE(:,:,:) ) * (XCHT1+XCHT2)
+      ZFLX(:,:,:)=PLM(:,:,:) * PLEPS(:,:,:) * (ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) &
+                 +ZTMP3_DEVICE(:,:,:)*ZTMP4_DEVICE(:,:,:) ) * (XCHT1+XCHT2)
 !$acc end kernels
     ELSE
       CALL GX_M_M_DEVICE(1,IKU,1,PTHLM       ,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
@@ -858,6 +883,14 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate (zflx,zwork,za,zcoeff)
+#else
+CALL MNH_REL_ZT3D    ( IZFLX, IZWORK, IZA, IZCOEFF,                                    &
+                       IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, &
+                       IZTMP5_DEVICE, IZTMP6_DEVICE, IZTMP7_DEVICE, IZTMP8_DEVICE  )
+#endif
+
 !$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 f50efc83e..f589aec72 100644
--- a/src/MNH/turb_hor_thermo_flux.f90
+++ b/src/MNH/turb_hor_thermo_flux.f90
@@ -153,6 +153,12 @@ USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D, &
+     MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D, &
+     MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D
+#endif
+!
 IMPLICIT NONE
 !
 !
@@ -207,23 +213,30 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRRS         ! var. at t+1 -split-
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZFLXC ! work arrays
-!! REAL, DIMENSION(:,:,:), allocatable :: ZVPTV
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZFLX,ZFLXC ! work arrays
+!! REAL, DIMENSION(:,:,:), pointer , contiguous :: ZVPTV
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
-REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
+INTEGER :: IZFLX,IZFLXC,IZCOEFF
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE
+INTEGER ::  IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, &
+            IZTMP5_DEVICE, IZTMP6_DEVICE, IZTMP7_DEVICE, IZTMP8_DEVICE
 #endif
 !
 TYPE(TFIELDDATA) :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
+!
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PK, PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, &
@@ -263,24 +276,38 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size(pthlm, 1 )
+JJU =  size(pthlm, 2 )
+JKU =  size(pthlm, 3 )
 
-allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) )
+#ifndef MNH_OPENACC
+allocate( zflx (JIU,JJU,JKU) )
+allocate( zflxc(JIU,JJU,JKU) )
+! allocate( zvptv(JIU,JJU,JKU) )
+
+allocate( zcoeff(JIU,JJU, 1 + jpvext : 3 + jpvext ) )
+#else
+CALL  MNH_CHECK_IN_ZT3D("TURB_HOR_THERMO_FLUX")
+izflx  = MNH_ALLOCATE_ZT3D( zflx ,JIU,JJU,JKU )
+izflxc = MNH_ALLOCATE_ZT3D( zflxc,JIU,JJU,JKU )
+! izvptv= MNH_ALLOCATE_ZT3D( zvptv,JIU,JJU,JKU )
+
+izcoeff= MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+
+#endif
 
 #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 ) ) )
+iztmp1_device= MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU  )
+iztmp2_device= MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU  )
+iztmp3_device= MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU  )
+iztmp4_device= MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU  )
+iztmp5_device= MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU  )
+iztmp6_device= MNH_ALLOCATE_ZT3D( ztmp6_device,JIU,JJU,JKU  )
+iztmp7_device= MNH_ALLOCATE_ZT3D( ztmp7_device,JIU,JJU,JKU  )
+iztmp8_device= MNH_ALLOCATE_ZT3D( ztmp8_device,JIU,JJU,JKU  )
 #endif
 
-!$acc data create( ZFLX, ZFLXC, ZCOEFF,                                    &
+!$acc data present( ZFLX, ZFLXC, ZCOEFF,                                    &
 !$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, &
 !$acc &            ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE  )
 
@@ -315,7 +342,9 @@ ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE)
 CALL MXM_DEVICE( PK, ZTMP1_DEVICE )
 CALL GX_M_U_DEVICE(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
 !$acc kernels
-ZFLX(:,:,:)     = -XCSHF * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZFLX(JI,JJ,JK)     = -XCSHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
+END DO
 ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
 !$acc end kernels
 #endif
@@ -376,19 +405,27 @@ END IF
 IF (.NOT. LFLAT) THEN
   CALL MXM_DEVICE(PRHODJ, ZTMP1_DEVICE)
 !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDXX(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
+END DO
 !$acc end kernels
   CALL DXF_DEVICE(ZTMP2_DEVICE, ZTMP3_DEVICE)
 !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = ZFLX(:,:,:) * PINV_PDXX(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
+END DO
 !$acc end kernels
   CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE)
 !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = PDZX(:,:,:)*ZTMP4_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)  
+   ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK)
+END DO
 !$acc end kernels
   CALL MXF_DEVICE(ZTMP2_DEVICE, ZTMP4_DEVICE)
 !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = PMZM_PRHODJ(:,:,:) * ZTMP4_DEVICE(:,:,:) * PINV_PDZZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+END DO
 !$acc end kernels
   CALL DZF_DEVICE(1,IKU,1,ZTMP2_DEVICE,ZTMP4_DEVICE )
 !$acc kernels
@@ -606,7 +643,9 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN
     CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE,X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. )
   END IF
 !$acc end data
+ 
 #endif
+
   CALL SECOND_MNH(ZTIME2)
   XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1
 END IF
@@ -729,7 +768,9 @@ END IF
   CALL MXM_DEVICE( PK, ZTMP1_DEVICE )
   CALL GX_M_U_DEVICE(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
 !$acc kernels
-  ZFLX(:,:,:)     = -XCHF * ZTMP1_DEVICE * ZTMP2_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZFLX(JI,JJ,JK)     = -XCHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
+END DO
   ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
 !$acc end kernels
 !
@@ -765,23 +806,33 @@ END IF
   IF (.NOT. LFLAT) THEN
     CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDXX(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
+END DO
     !$acc end kernels
     CALL DXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
     !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = ZFLX(:,:,:) * PINV_PDXX(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
+END DO
     !$acc end kernels
     CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = PDZX(:,:,:)*ZTMP4_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK)
+END DO
     !$acc end kernels
     CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = PMZM_PRHODJ(:,:,:) * ZTMP4_DEVICE(:,:,:) * PINV_PDZZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+END DO
     !$acc end kernels
     CALL DZF_DEVICE(1,IKU,1, ZTMP2_DEVICE, ZTMP4_DEVICE)
     !$acc kernels
-    PRRS(:,:,:,1) = PRRS(:,:,:,1) - ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)    
+   PRRS(JI,JJ,JK,1) = PRRS(JI,JJ,JK,1) - ZTMP3_DEVICE(JI,JJ,JK) + ZTMP4_DEVICE(JI,JJ,JK)
+END DO
     !$acc end kernels
   ELSE
     CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
@@ -1089,7 +1140,9 @@ END IF
   CALL MYM_DEVICE( PK, ZTMP1_DEVICE )
   CALL GY_M_V_DEVICE(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY,ZTMP2_DEVICE)
   !$acc kernels
-  ZFLX(:,:,:)     = -XCSHF * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+  ZFLX(JI,JJ,JK)     = -XCSHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
+END DO
   ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
   !$acc end kernels
 ELSE
@@ -1133,23 +1186,33 @@ IF (.NOT. L2D) THEN
   IF (.NOT. LFLAT) THEN
     CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDYY(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
+END DO
     !$acc end kernels
     CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
     !$acc kernels
-    ZTMP1_DEVICE(:,:,:) = ZFLX(:,:,:) * PINV_PDYY(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
+END DO
     !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE, ZTMP2_DEVICE)
     !$acc kernels
-    ZTMP1_DEVICE(:,:,:) = PDZY(:,:,:)*ZTMP2_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP1_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
+END DO
     !$acc end kernels
     CALL MYF_DEVICE(ZTMP1_DEVICE, ZTMP2_DEVICE)
     !$acc kernels
-    ZTMP1_DEVICE(:,:,:) = PMZM_PRHODJ(:,:,:) * ZTMP2_DEVICE(:,:,:) * PINV_PDZZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP1_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+END DO
     !$acc end kernels
     CALL DZF_DEVICE(1,IKU,1, ZTMP1_DEVICE, ZTMP2_DEVICE )
     !$acc kernels
-    PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZTMP3_DEVICE(:,:,:) + ZTMP2_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   PRTHLS(JI,JJ,JK) = PRTHLS(JI,JJ,JK) - ZTMP3_DEVICE(JI,JJ,JK) + ZTMP2_DEVICE(JI,JJ,JK)
+END DO   
     !$acc end kernels
   ELSE
     CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
@@ -1438,7 +1501,9 @@ IF (KRR/=0) THEN
     CALL MYM_DEVICE( PK, ZTMP1_DEVICE )
     CALL GY_M_V_DEVICE(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY, ZTMP2_DEVICE)
     !$acc kernels
-    ZFLX(:,:,:)     = -XCHF * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZFLX(JI,JJ,JK)     = -XCHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK)
+    END DO !CONCURRENT
     ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
     !$acc end kernels
   ELSE
@@ -1481,25 +1546,35 @@ IF (KRR/=0) THEN
     IF (.NOT. LFLAT) THEN
       CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
       !$acc kernels
-      ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDYY(:,:,:)
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+         ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
+      END DO
       !$acc end kernels
       CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
       !
       !$acc kernels
-      ZTMP1_DEVICE(:,:,:) = ZFLX(:,:,:) * PINV_PDYY(:,:,:)
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+         ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
+      END DO
       !$acc end kernels
       CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
       !$acc kernels
-      ZTMP1_DEVICE(:,:,:) = PDZY(:,:,:)*ZTMP2_DEVICE(:,:,:)
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+         ZTMP1_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
+      END DO
       !$acc end kernels
       CALL MYF_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
       !$acc kernels
-      ZTMP1_DEVICE(:,:,:) = PMZM_PRHODJ(:,:,:) * ZTMP2_DEVICE(:,:,:) * PINV_PDZZ(:,:,:)
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+         ZTMP1_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+      END DO
       !$acc end kernels
       CALL DZF_DEVICE(1,IKU,1,ZTMP1_DEVICE,ZTMP2_DEVICE )
       !
       !$acc kernels
-      PRRS(:,:,:,1) = PRRS(:,:,:,1) - ZTMP3_DEVICE(:,:,:) + ZTMP2_DEVICE(:,:,:)
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+         PRRS(JI,JJ,JK,1) = PRRS(JI,JJ,JK,1) - ZTMP3_DEVICE(JI,JJ,JK) + ZTMP2_DEVICE(JI,JJ,JK)
+      END DO
       !$acc end kernels
     ELSE
       CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
@@ -1703,6 +1778,15 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate (zflx,zflxc,zcoeff)
+#else
+CALL MNH_REL_ZT3D ( IZFLX, IZFLXC, IZCOEFF,                                    &
+                    IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, &
+                    IZTMP5_DEVICE, IZTMP6_DEVICE, IZTMP7_DEVICE, IZTMP8_DEVICE  )
+CALL MNH_CHECK_OUT_ZT3D("TURB_HOR_THERMO_FLUX")
+#endif
+
 !$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 f98d8de25..60f38ea4d 100644
--- a/src/MNH/turb_hor_tke.f90
+++ b/src/MNH/turb_hor_tke.f90
@@ -98,7 +98,11 @@ USE MODI_GRADIENT_M
 USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
-!
+
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+#endif
+
 IMPLICIT NONE
 !
 !
@@ -125,17 +129,22 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   ::  PTRH     ! horizontal transport of T
 !
 INTEGER :: IKB, IKU
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZFLX
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZFLX
+INTEGER :: IZCOEFF,IZFLX
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE
 #endif
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PDXX, PDYY, PDZZ, PDZX, PDZY,                    &
@@ -161,18 +170,29 @@ if ( mppdb_initialized ) then
   call Mppdb_check( ptrh, "Turb_hor_tke beg:ptrh" )
 end if
 
-allocate( zflx (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) )
+JIU =  size(ptkem, 1 )
+JJU =  size(ptkem, 2 )
+JKU =  size(ptkem, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zflx (JIU,JJU,JKU ) )
+
+allocate( zcoeff(JIU,JJU,JKU, 1 + jpvext : 3 + jpvext ) )
+#else
+izflx   = MNH_ALLOCATE_ZT3D( zflx ,JIU,JJU,JKU )
+
+izcoeff = MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+#endif
 
-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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU)
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU)
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU)
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU)
 #endif
 
-!$acc data create( ZCOEFF, ZFLX, &
+!$acc data present( ZCOEFF, ZFLX, &
 !$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
 
 !
@@ -206,7 +226,9 @@ ZFLX = -XCET * MXM(PK) * GX_M_U(1,IKU,1,PTKEM,PDXX,PDZZ,PDZX) ! < u'e >
 CALL MXM_DEVICE(PK,ZTMP1_DEVICE)
 CALL GX_M_U_DEVICE(1,IKU,1,PTKEM,PDXX,PDZZ,PDZX,ZTMP2_DEVICE)
 !$acc kernels
-ZFLX = -XCET * ZTMP1_DEVICE * ZTMP2_DEVICE ! < u'e >
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZFLX(JI,JJ,JK) = -XCET * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) ! < u'e >
+END DO !CONCURRENT    
 #endif
 !
 ! special case near the ground ( uncentred gradient )
@@ -263,23 +285,33 @@ END IF
 IF (.NOT. LFLAT) THEN
   CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = ZTMP1_DEVICE * ZFLX * PINV_PDXX
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels 
   CALL DXF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = ZFLX*PINV_PDXX
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)*PINV_PDXX(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels 
   CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = PDZX * ZTMP3_DEVICE
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels 
   CALL MXF_DEVICE( ZTMP2_DEVICE,ZTMP3_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = PMZM_PRHODJ * ZTMP3_DEVICE * PINV_PDZZ
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels 
   CALL DZF_DEVICE(1,IKU,1,ZTMP2_DEVICE,ZTMP3_DEVICE)
   !$acc kernels
-  PTRH =-( ZTMP1_DEVICE - ZTMP3_DEVICE ) /PRHODJ
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     PTRH(JI,JJ,JK) =-( ZTMP1_DEVICE(JI,JJ,JK) - ZTMP3_DEVICE(JI,JJ,JK) ) /PRHODJ(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels 
 ELSE
   CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
@@ -319,12 +351,16 @@ IF (.NOT. L2D) THEN
 #else
   CALL MYM_DEVICE(PK,ZTMP1_DEVICE)
   CALL GY_M_V_DEVICE(1,IKU,1,PTKEM,PDYY,PDZZ,PDZY,ZTMP2_DEVICE)
-!$acc kernels
-  ZFLX =-XCET * ZTMP1_DEVICE * ZTMP2_DEVICE ! < v'e >
+  !$acc kernels
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZFLX(JI,JJ,JK) =-XCET * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) ! < v'e >
+   END DO !CONCURRENT   
+   !$acc end kernels  
 #endif
 !
 ! special case near the ground ( uncentred gradient )
 !
+!$acc kernels  
   ZFLX(:,:,IKB) =  ZCOEFF(:,:,IKB+2)*PTKEM(:,:,IKB+2)                     &
                  + ZCOEFF(:,:,IKB+1)*PTKEM(:,:,IKB+1)                     &
                  + ZCOEFF(:,:,IKB  )*PTKEM(:,:,IKB  )     
@@ -379,23 +415,33 @@ IF (.NOT. L2D) THEN
   IF (.NOT. LFLAT) THEN
     CALL MYM_DEVICE(PRHODJ,ZTMP1_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = ZTMP1_DEVICE * ZFLX * PINV_PDYY
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels 
     CALL DYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = ZFLX*PINV_PDYY
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)*PINV_PDYY(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels 
     CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = PDZY * ZTMP3_DEVICE
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels 
     CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = PMZM_PRHODJ * ZTMP3_DEVICE * PINV_PDZZ
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels 
     CALL DZF_DEVICE(1,IKU,1,ZTMP2_DEVICE,ZTMP3_DEVICE)
     !$acc kernels
-    PTRH = PTRH - (  ZTMP1_DEVICE - ZTMP3_DEVICE ) /PRHODJ
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       PTRH(JI,JJ,JK) = PTRH(JI,JJ,JK) - (  ZTMP1_DEVICE(JI,JJ,JK) - ZTMP3_DEVICE(JI,JJ,JK) ) /PRHODJ(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels 
   ELSE
     CALL MYM_DEVICE(PRHODJ,ZTMP1_DEVICE)
@@ -434,6 +480,13 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( ZCOEFF, ZFLX )
+#else
+CALL MNH_REL_ZT3D( IZFLX, IZCOEFF, &
+                   IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
+#endif
+
 !$acc end data
 
 !----------------------------------------------------------------------------
diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90
index d8ab326ee..328e6fd57 100644
--- a/src/MNH/turb_hor_uv.f90
+++ b/src/MNH/turb_hor_uv.f90
@@ -153,6 +153,10 @@ USE MODI_SECOND_MNH
 USE MODI_BITREP
 #endif
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+#endif
+!
 IMPLICIT NONE
 !
 !
@@ -204,29 +208,35 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP          ! TKE production terms
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZFLX,ZWORK ! work arrays
 !
-REAL, DIMENSION(:,:),   allocatable :: ZDIRSINZW
+REAL, DIMENSION(:,:),   pointer , contiguous :: 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(:,:,:), allocatable :: GY_U_UV_PUM
-REAL, DIMENSION(:,:,:), allocatable :: GX_V_UV_PVM
+REAL, DIMENSION(:,:,:), pointer , contiguous :: GY_U_UV_PUM
+REAL, DIMENSION(:,:,:), pointer , contiguous :: GX_V_UV_PVM
+INTEGER :: IZFLX,IZWORK,IZDIRSINZW,IGY_U_UV_PUM,IGX_V_UV_PVM
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-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
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP5_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP6_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP7_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE,&
+           IZTMP5_DEVICE,IZTMP6_DEVICE,IZTMP7_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PK, PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY,       &
@@ -265,25 +275,39 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size(pum, 1 )
+JJU =  size(pum, 2 )
+JKU =  size(pum, 3 )
 
-allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) )
+#ifndef MNH_OPENACC
+allocate( zflx (JIU,JJU,JKU ) )
+allocate( zwork(JIU,JJU,JKU ) )
 
-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 ) ) )
+allocate( zdirsinzw(JIU,JJU ) )
+
+allocate( gy_u_uv_pum(JIU,JJU,JKU ) )
+allocate( gx_v_uv_pvm(JIU,JJU,JKU ) )
+#else
+izflx = MNH_ALLOCATE_ZT3D( zflx ,JIU,JJU,JKU )
+izwork = MNH_ALLOCATE_ZT3D( zwork,JIU,JJU,JKU )
+
+izdirsinzw = MNH_ALLOCATE_ZT2D( zdirsinzw,JIU,JJU )
+
+igy_u_uv_pum = MNH_ALLOCATE_ZT3D( gy_u_uv_pum,JIU,JJU,JKU )
+igx_v_uv_pvm = MNH_ALLOCATE_ZT3D( gx_v_uv_pvm,JIU,JJU,JKU )
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU )
+iztmp5_device = MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU )
+iztmp6_device = MNH_ALLOCATE_ZT3D( ztmp6_device,JIU,JJU,JKU )
+iztmp7_device = MNH_ALLOCATE_ZT3D( ztmp7_device,JIU,JJU,JKU )
 #endif
 
-!$acc data create( ZFLX, ZWORK, ZDIRSINZW, GY_U_UV_PUM, GX_V_UV_PVM,       &
+!$acc data present( 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                )
 
@@ -330,9 +354,11 @@ END IF
 CALL MXM_DEVICE(PK,ZTMP1_DEVICE)
 CALL MYM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 IF (.NOT. L2D) THEN
-  !$acc kernels
-  ZFLX(:,:,:)= - XCMFS * ZTMP2_DEVICE * (GY_U_UV_PUM + GX_V_UV_PVM)
-  !$acc end kernels
+   !$acc kernels
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZFLX(JI,JJ,JK)= - XCMFS * ZTMP2_DEVICE(JI,JJ,JK) * (GY_U_UV_PUM(JI,JJ,JK) + GX_V_UV_PVM(JI,JJ,JK))
+   END DO !CONCURRENT   
+   !$acc end kernels
 ELSE
   !$acc kernels
   ZFLX(:,:,:)= - XCMFS * ZTMP2_DEVICE * (GX_V_UV_PVM)
@@ -479,35 +505,49 @@ END IF
 #else
 CALL MYM_DEVICE(PRHODJ,ZTMP1_DEVICE)
 !$acc kernels
-ZTMP2_DEVICE = ZTMP1_DEVICE * PINV_PDYY
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
+END DO !CONCURRENT   
 !$acc end kernels
 CALL MXM_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) 
 !$acc kernels
-ZTMP2_DEVICE = ZFLX * ZTMP1_DEVICE
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK)
+END DO !CONCURRENT   
 !$acc end kernels
 CALL DYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
 IF (.NOT. LFLAT) THEN
   CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE)
   CALL MZM_DEVICE(PDYY,ZTMP3_DEVICE)
-!$acc kernels
-  ZTMP4_DEVICE = PDZY/ZTMP3_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP4_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)/ZTMP3_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL MXM_DEVICE(ZTMP4_DEVICE,ZTMP5_DEVICE)
-!$acc kernels
-  ZTMP4_DEVICE = ZTMP2_DEVICE*ZTMP5_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP4_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK)*ZTMP5_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL MYF_DEVICE(ZTMP4_DEVICE,ZTMP2_DEVICE)
-!$acc kernels
-  ZTMP3_DEVICE = PMZM_PRHODJ * PINV_PDZZ
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL MXM_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
-!$acc kernels
-  ZTMP5_DEVICE = ZTMP2_DEVICE*ZTMP4_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP5_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT    
+  !$acc end kernels
   CALL DZF_DEVICE(1,IKU,1,ZTMP5_DEVICE,ZTMP3_DEVICE)
-!$acc kernels
-  PRUS(:,:,:) = PRUS(:,:,:) - ZTMP1_DEVICE + ZTMP3_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     PRUS(JI,JJ,JK) = PRUS(JI,JJ,JK) - ZTMP1_DEVICE(JI,JJ,JK) + ZTMP3_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
 ELSE
 !$acc kernels
   PRUS(:,:,:) = PRUS(:,:,:) - ZTMP1_DEVICE
@@ -528,35 +568,49 @@ END IF
 #else
 CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
 !$acc kernels
-ZTMP2_DEVICE = ZTMP1_DEVICE * PINV_PDXX
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
+END DO !CONCURRENT   
 !$acc end kernels
 CALL MYM_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) 
 !$acc kernels
-ZTMP2_DEVICE = ZFLX * ZTMP1_DEVICE
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK)
+END DO !CONCURRENT   
 !$acc end kernels
 CALL DXF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
 IF (.NOT. LFLAT) THEN
   CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE)
   CALL MZM_DEVICE(PDXX,ZTMP3_DEVICE)
-!$acc kernels
-  ZTMP4_DEVICE = PDZX/ZTMP3_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP4_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)/ZTMP3_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL MYM_DEVICE(ZTMP4_DEVICE,ZTMP5_DEVICE)
-!$acc kernels
-  ZTMP4_DEVICE = ZTMP2_DEVICE*ZTMP5_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP4_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK)*ZTMP5_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL MXF_DEVICE(ZTMP4_DEVICE,ZTMP2_DEVICE)
-!$acc kernels
-  ZTMP3_DEVICE = PMZM_PRHODJ * PINV_PDZZ
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL MYM_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
-!$acc kernels
-  ZTMP5_DEVICE = ZTMP2_DEVICE*ZTMP4_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP5_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   CALL DZF_DEVICE(1,IKU,1,ZTMP5_DEVICE,ZTMP3_DEVICE)
-!$acc kernels
-  PRVS(:,:,:) = PRVS(:,:,:) - ZTMP1_DEVICE + ZTMP3_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     PRVS(JI,JJ,JK) = PRVS(JI,JJ,JK) - ZTMP1_DEVICE(JI,JJ,JK) + ZTMP3_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
 ELSE
 !$acc kernels
   PRVS(:,:,:) = PRVS(:,:,:) - ZTMP1_DEVICE
@@ -578,8 +632,10 @@ IF (KSPLT==1) THEN
   ENDIF
 #else
   IF (.NOT. L2D) THEN
-!$acc kernels
-    ZTMP1_DEVICE = ZFLX * (GY_U_UV_PUM + GX_V_UV_PVM)
+     !$acc kernels
+     DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+        ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * (GY_U_UV_PUM(JI,JJ,JK) + GX_V_UV_PVM(JI,JJ,JK))
+     END DO !CONCURRENT   
 !$acc end kernels
   ELSE
 !$acc kernels
@@ -588,9 +644,11 @@ IF (KSPLT==1) THEN
   ENDIF
   CALL MYF_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
   CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
-!$acc kernels
-  ZWORK(:,:,:) = - ZTMP1_DEVICE
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZWORK(JI,JJ,JK) = - ZTMP1_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
 #endif
   !
   ! evaluate the dynamic production at w(IKB+1) in PDP(IKB)
@@ -612,9 +670,9 @@ IF (KSPLT==1) THEN
         ) / MXF(MYM( 0.5*(PDXX(:,:,IKB:IKB)+PDXX(:,:,IKB+1:IKB+1)) ) )&
     ) 
 #else
-!$acc kernels
+  !$acc kernels
   ZTMP1_DEVICE(:,:,1) = 0.5 * (ZFLX(:,:,IKB+1)+ZFLX(:,:,IKB))
-!$acc end kernels
+  !$acc end kernels
   CALL MYF_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1))
   CALL MXF_DEVICE(ZTMP2_DEVICE(:,:,1:1),ZTMP1_DEVICE(:,:,1:1))
   !
@@ -712,6 +770,15 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate ( ZFLX, ZWORK, ZDIRSINZW, GY_U_UV_PUM, GX_V_UV_PVM )
+#else
+CALL MNH_REL_ZT3D ( IZFLX, IZWORK, IZDIRSINZW, IGY_U_UV_PUM, IGX_V_UV_PVM, &
+            IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, &
+            IZTMP5_DEVICE, IZTMP6_DEVICE, IZTMP7_DEVICE                )
+#endif
+     
+
 !$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 f64d43c2a..ff27caa32 100644
--- a/src/MNH/turb_hor_uw.f90
+++ b/src/MNH/turb_hor_uw.f90
@@ -139,7 +139,11 @@ USE MODI_COEFJ
 USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
-!
+
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+#endif
+
 IMPLICIT NONE
 !
 !
@@ -179,24 +183,29 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP          ! TKE production terms
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays
+REAL, DIMENSION(:,:,:), pointer , contiguous :: 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(:,:,:), allocatable :: GX_W_UW_PWM
+REAL, DIMENSION(:,:,:), pointer , contiguous :: GX_W_UW_PWM
+INTEGER :: IZFLX,IZWORK,IGX_W_UW_PWM
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP4_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PK, PINV_PDXX, PINV_PDZZ, PMZM_PRHODJ, PDXX, PDZZ, PDZX, &
@@ -228,19 +237,30 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size(pwm, 1 )
+JJU =  size(pwm, 2 )
+JKU =  size(pwm, 3 )
 
-allocate( gx_w_uw_pwm(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+#ifndef MNH_OPENACC
+allocate( zflx (JIU,JJU,JKU ) )
+allocate( zwork(JIU,JJU,JKU ) )
+
+allocate( gx_w_uw_pwm(JIU,JJU,JKU ) )
+#else
+izflx        = MNH_ALLOCATE_ZT3D( zflx ,JIU,JJU,JKU)
+izwork       = MNH_ALLOCATE_ZT3D( zwork,JIU,JJU,JKU)
+
+igx_w_uw_pwm = MNH_ALLOCATE_ZT3D( gx_w_uw_pwm,JIU,JJU,JKU)
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU)
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU)
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU)
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU)
 #endif
 
-!$acc data create( ZFLX, ZWORK, GX_W_UW_PWM, &
+!$acc data present( ZFLX, ZWORK, GX_W_UW_PWM, &
 !$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
 
 !
@@ -271,7 +291,9 @@ ZFLX(:,:,:) =                                                      &
 CALL MZM_DEVICE(PK,ZTMP1_DEVICE)
 CALL MXM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
-ZFLX(:,:,:) = - XCMFS * ZTMP2_DEVICE * GX_W_UW_PWM
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZFLX(JI,JJ,JK) = - XCMFS * ZTMP2_DEVICE(JI,JJ,JK) * GX_W_UW_PWM(JI,JJ,JK)
+END DO !CONCURRENT   
 #endif
 !!         &  to be tested
 !!  - (2./3.) * XCMFB * MZM( ZVPTU * MXM( PLM / SQRT(PTKEM) * XG / PTHVREF ) )
@@ -309,11 +331,15 @@ PRUS(:,:,:) = PRUS(:,:,:) - DZF( ZFLX* MXM( PMZM_PRHODJ ) / MXM( PDZZ ) )
 CALL MXM_DEVICE( PMZM_PRHODJ, ZTMP1_DEVICE )
 CALL MXM_DEVICE( PDZZ, ZTMP2_DEVICE )
 !$acc kernels
-ZTMP3_DEVICE = ZFLX* ZTMP1_DEVICE / ZTMP2_DEVICE
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP3_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)* ZTMP1_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK)
+END DO !CONCURRENT   
 !$acc end kernels
 CALL DZF_DEVICE(1,IKU,1, ZTMP3_DEVICE, ZTMP1_DEVICE )
 !$acc kernels
-PRUS(:,:,:) = PRUS(:,:,:) - ZTMP1_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   PRUS(JI,JJ,JK) = PRUS(JI,JJ,JK) - ZTMP1_DEVICE(JI,JJ,JK)
+END DO !CONCURRENT   
 !$acc end kernels
 #endif
 !
@@ -329,32 +355,44 @@ END IF
 #else
   CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = ZTMP1_DEVICE * PINV_PDXX
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
   CALL MZM_DEVICE(ZTMP2_DEVICE, ZTMP1_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = ZTMP1_DEVICE * ZFLX
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
   CALL DXF_DEVICE( ZTMP2_DEVICE,ZTMP1_DEVICE)
 IF (.NOT. LFLAT) THEN
-  !$acc kernels
-  ZTMP2_DEVICE = ZFLX*PDZX
-  !$acc end kernels
-  CALL MZF_DEVICE(1,IKU,1, ZTMP2_DEVICE, ZTMP3_DEVICE )
-  !$acc kernels
-  ZTMP2_DEVICE = ZTMP3_DEVICE*PINV_PDXX
-  !$acc end kernels
-  CALL MXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
-  CALL MZF_DEVICE(1,IKU,1,PDZZ, ZTMP2_DEVICE)
-  !$acc kernels
-  ZTMP4_DEVICE = PRHODJ * ZTMP3_DEVICE / ZTMP2_DEVICE
-  !$acc end kernels
-  CALL DZM_DEVICE(1,IKU,1, ZTMP4_DEVICE, ZTMP2_DEVICE )
-  !$acc kernels
-  PRWS(:,:,:) = PRWS(:,:,:)                              &
-        - ZTMP1_DEVICE           &
-        + ZTMP2_DEVICE
-  !$acc end kernels
+   !$acc kernels
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)*PDZX(JI,JJ,JK)
+   END DO !CONCURRENT   
+   !$acc end kernels
+   CALL MZF_DEVICE(1,IKU,1, ZTMP2_DEVICE, ZTMP3_DEVICE )
+   !$acc kernels
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK)*PINV_PDXX(JI,JJ,JK)
+   END DO !CONCURRENT  
+   !$acc end kernels
+   CALL MXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
+   CALL MZF_DEVICE(1,IKU,1,PDZZ, ZTMP2_DEVICE)
+   !$acc kernels
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      ZTMP4_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK)
+   END DO !CONCURRENT   
+   !$acc end kernels
+   CALL DZM_DEVICE(1,IKU,1, ZTMP4_DEVICE, ZTMP2_DEVICE )
+   !$acc kernels
+   DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+      PRWS(JI,JJ,JK) = PRWS(JI,JJ,JK)         &
+           - ZTMP1_DEVICE(JI,JJ,JK)           &
+           + ZTMP2_DEVICE(JI,JJ,JK)
+   END DO !CONCURRENT
+   !$acc end kernels
 ELSE 
   !$acc kernels
   PRWS(:,:,:) = PRWS(:,:,:) - ZTMP1_DEVICE
@@ -372,12 +410,16 @@ IF (KSPLT==1) THEN
 #else
   CALL GZ_U_UW_DEVICE(1,IKU,1,PUM,PDZZ,ZTMP1_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE = ZFLX *( ZTMP1_DEVICE + GX_W_UW_PWM )
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) *( ZTMP1_DEVICE(JI,JJ,JK) + GX_W_UW_PWM(JI,JJ,JK) )
+  END DO !CONCURRENT   
   !$acc end kernels
   CALL MXF_DEVICE( ZTMP2_DEVICE,ZTMP1_DEVICE )
   CALL MZF_DEVICE(1,IKU,1, ZTMP1_DEVICE, ZTMP2_DEVICE )
   !$acc kernels
-  ZWORK(:,:,:) = -ZTMP2_DEVICE(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZWORK(JI,JJ,JK) = -ZTMP2_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
 #endif
   !
@@ -518,6 +560,13 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( ZFLX, ZWORK, GX_W_UW_PWM )
+#else
+CALL MNH_REL_ZT3D ( IZFLX, IZWORK, IGX_W_UW_PWM, &
+                    IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
+#endif
+
 !$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 475a4972e..6ea12270b 100644
--- a/src/MNH/turb_hor_vw.f90
+++ b/src/MNH/turb_hor_vw.f90
@@ -138,7 +138,11 @@ USE MODI_COEFJ
 USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
-!
+
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+#endif
+
 IMPLICIT NONE
 !
 !
@@ -177,24 +181,29 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PDP          ! TKE production terms
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays
-!! REAL, DIMENSION(:,:,:), allocatable :: ZVPTV
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZFLX,ZWORK ! work arrays
+!! REAL, DIMENSION(:,:,:), pointer , contiguous :: ZVPTV
 INTEGER             :: IKB,IKE,IKU
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
 INTEGER             :: JSV          ! scalar loop counter
 !
-REAL, DIMENSION(:,:,:), allocatable :: GY_W_VW_PWM
+REAL, DIMENSION(:,:,:), pointer , contiguous :: GY_W_VW_PWM
+INTEGER :: IZFLX,IZWORK,IGY_W_VW_PWM
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP2_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP3_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP4_DEVICE
+INTEGER :: IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 ! ---------------------------------------------------------------------------
 
 !$acc data present( PK, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, PDYY, PDZZ, PDZY, &
@@ -225,19 +234,30 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size(pwm, 1 )
+JJU =  size(pwm, 2 )
+JKU =  size(pwm, 3 )
 
-allocate( gy_w_vw_pwm(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) )
+#ifndef MNH_OPENACC
+allocate( zflx (JIU,JJU,JKU ) )
+allocate( zwork(JIU,JJU,JKU ) )
+
+allocate( gy_w_vw_pwm(JIU,JJU,JKU ) )
+#else
+izflx        = MNH_ALLOCATE_ZT3D( zflx ,JIU,JJU,JKU)
+izwork       = MNH_ALLOCATE_ZT3D( zwork,JIU,JJU,JKU)
+
+igy_w_vw_pwm = MNH_ALLOCATE_ZT3D( gy_w_vw_pwm,JIU,JJU,JKU)
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU)
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU)
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU)
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU)
 #endif
 
-!$acc data create( ZFLX, ZWORK, GY_W_VW_PWM, &
+!$acc data present( ZFLX, ZWORK, GY_W_VW_PWM, &
 !$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
 
 !
@@ -278,9 +298,11 @@ END IF
 IF (.NOT. L2D) THEN
   CALL MZM_DEVICE(PK,ZTMP1_DEVICE)
   CALL MYM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE)
-!$acc kernels
-  ZFLX(:,:,:) = - XCMFS * ZTMP2_DEVICE * GY_W_VW_PWM
-!$acc end kernels
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZFLX(JI,JJ,JK) = - XCMFS * ZTMP2_DEVICE(JI,JJ,JK) * GY_W_VW_PWM(JI,JJ,JK)
+  END DO !CONCURRENT   
+  !$acc end kernels
   !! &  to be tested
   !!  - (2./3.) * XCMFB * MZM( ZVPTV * MYM( PLM / SQRT(PTKEM) * XG / PTHVREF ) )
 ELSE
@@ -328,11 +350,15 @@ IF (.NOT. L2D) THEN
   CALL MYM_DEVICE( PMZM_PRHODJ, ZTMP1_DEVICE )
   CALL MYM_DEVICE( PDZZ, ZTMP2_DEVICE )
   !$acc kernels
-  ZTMP3_DEVICE = ZFLX* ZTMP1_DEVICE / ZTMP2_DEVICE
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)* ZTMP1_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
   CALL DZF_DEVICE(1,IKU,1, ZTMP3_DEVICE, ZTMP1_DEVICE )
   !$acc kernels
-  PRVS(:,:,:) = PRVS(:,:,:) - ZTMP1_DEVICE
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     PRVS(JI,JJ,JK) = PRVS(JI,JJ,JK) - ZTMP1_DEVICE(JI,JJ,JK)
+  END DO !CONCURRENT   
   !$acc end kernels
 ENDIF
 #endif
@@ -353,30 +379,42 @@ IF (.NOT. L2D) THEN
   IF (.NOT. LFLAT) THEN
     CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = ZTMP1_DEVICE * PINV_PDYY
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
+    END DO !CONCURRENT  
     !$acc end kernels
     CALL MZM_DEVICE(ZTMP2_DEVICE, ZTMP1_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = ZTMP1_DEVICE * ZFLX
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels
     CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP1_DEVICE )
     !$acc kernels
-    ZTMP2_DEVICE = ZFLX*PDZY
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK)  = ZFLX(JI,JJ,JK) *PDZY(JI,JJ,JK) 
+    END DO !CONCURRENT   
     !$acc end kernels
     CALL MZF_DEVICE(1,IKU,1,ZTMP2_DEVICE,ZTMP3_DEVICE )
     !$acc kernels
-    ZTMP2_DEVICE = ZTMP3_DEVICE * PINV_PDYY
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK)
+    END DO !CONCURRENT  
     !$acc end kernels
     CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE)
     CALL MZF_DEVICE(1,IKU,1,PDZZ,ZTMP2_DEVICE)
     !$acc kernels
-    ZTMP4_DEVICE = PRHODJ * ZTMP3_DEVICE / ZTMP2_DEVICE
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP4_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels
     CALL DZM_DEVICE(1,IKU,1,ZTMP4_DEVICE,ZTMP2_DEVICE)
     !$acc kernels
-    PRWS(:,:,:) = PRWS(:,:,:)  &
-          - ZTMP1_DEVICE          &
-          + ZTMP2_DEVICE
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       PRWS(JI,JJ,JK) = PRWS(JI,JJ,JK)  &
+            - ZTMP1_DEVICE(JI,JJ,JK)          &
+            + ZTMP2_DEVICE(JI,JJ,JK)
+    END DO !CONCURRENT
     !$acc end kernels
   ELSE
     CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE)
@@ -405,12 +443,16 @@ IF (KSPLT==1) THEN
 #else
     CALL GZ_V_VW_DEVICE(1,IKU,1,PVM,PDZZ,ZTMP1_DEVICE)
     !$acc kernels
-    ZTMP2_DEVICE = ZFLX *( ZTMP1_DEVICE + GY_W_VW_PWM )
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) *( ZTMP1_DEVICE(JI,JJ,JK) + GY_W_VW_PWM(JI,JJ,JK) )
+    END DO !CONCURRENT   
     !$acc end kernels
     CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
     CALL MZF_DEVICE(1,IKU,1,ZTMP1_DEVICE,ZTMP2_DEVICE)
     !$acc kernels
-    ZWORK(:,:,:) = -ZTMP2_DEVICE
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZWORK(JI,JJ,JK) = -ZTMP2_DEVICE(JI,JJ,JK)
+    END DO !CONCURRENT   
     !$acc end kernels
 #endif
   !
@@ -559,6 +601,13 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate( ZFLX, ZWORK, GY_W_VW_PWM )
+#else
+CALL MNH_REL_ZT3D ( IZFLX, IZWORK, IGY_W_VW_PWM, &
+                    IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
+#endif
+
 !$acc end data
 
 END SUBROUTINE TURB_HOR_VW
diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90
index b188f0778..673c4c304 100644
--- a/src/MNH/turb_ver.f90
+++ b/src/MNH/turb_ver.f90
@@ -343,6 +343,10 @@ USE MODE_PRANDTL
 !
 USE MODI_SECOND_MNH
 !
+#ifdef MNH_OPENACC
+USE  MODE_MNH_ZWORK, ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+#endif
+!
 IMPLICIT NONE
 !
 !*      0.1  declarations of arguments
@@ -434,7 +438,7 @@ REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV       ! scalar flux
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(:,:,:), allocatable ::  &
+REAL, DIMENSION(:,:,:), pointer,contiguous ::  &
        ZBETA,    & ! buoyancy coefficient
        ZSQRT_TKE,& ! sqrt(e)
        ZDTH_DZ,  & ! d(th)/dz
@@ -456,6 +460,10 @@ REAL, DIMENSION(:,:,:), allocatable ::  &
        ZTHLP,    & ! guess of potential temperature due to vert. turbulent flux
        ZRP         ! guess of total water due to vert. turbulent flux
 
+INTEGER :: izbeta,izsqrt_tke,izdth_dz,izdr_dz,izred2th3,izred2r3,izred2thr3, &
+           izbll_o_e,izetheta,izemoist,izredth1,izredr1,izphi3,izpsi3, &
+           izd,izwthv,izwu,izwv,izthlp,izrp
+
 REAL, DIMENSION(:,:,:,:), allocatable ::  &
        ZPSI_SV,  & ! Prandtl number for scalars
        ZREDS1,   & ! 1D Redeslperger number R_sv
@@ -471,6 +479,9 @@ REAL    :: ZTIME2
 !
 TYPE(TFIELDDATA) :: TZFIELD
 !
+INTEGER                               :: JIU,JJU,JKU
+INTEGER                               :: JI,JJ,JK
+!
 !----------------------------------------------------------------------------
 
 !$acc data present( PDXX, PDYY, PDZZ, PDZX, PDZY, PDIRCOSZW, PZZ,                   &
@@ -542,36 +553,63 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size( pthlm, 1 )
+JJU =  size( pthlm, 2 )
+JKU =  size( pthlm, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zbeta    (JIU,JJU,JKU) )
+allocate( zsqrt_tke(JIU,JJU,JKU) )
+allocate( zdth_dz  (JIU,JJU,JKU) )
+allocate( zdr_dz   (JIU,JJU,JKU) )
+allocate( zred2th3 (JIU,JJU,JKU) )
+allocate( zred2r3  (JIU,JJU,JKU) )
+allocate( zred2thr3(JIU,JJU,JKU) )
+allocate( zbll_o_e (JIU,JJU,JKU) )
+allocate( zetheta  (JIU,JJU,JKU) )
+allocate( zemoist  (JIU,JJU,JKU) )
+allocate( zredth1  (JIU,JJU,JKU) )
+allocate( zredr1   (JIU,JJU,JKU) )
+allocate( zphi3    (JIU,JJU,JKU) )
+allocate( zpsi3    (JIU,JJU,JKU) )
+allocate( zd       (JIU,JJU,JKU) )
+allocate( zwthv    (JIU,JJU,JKU) )
+allocate( zwu      (JIU,JJU,JKU) )
+allocate( zwv      (JIU,JJU,JKU) )
+allocate( zthlp    (JIU,JJU,JKU) )
+allocate( zrp      (JIU,JJU,JKU) )
+#else
+izbeta     = MNH_ALLOCATE_ZT3D( zbeta    ,JIU,JJU,JKU )
+izsqrt_tke = MNH_ALLOCATE_ZT3D( zsqrt_tke,JIU,JJU,JKU )
+izdth_dz   = MNH_ALLOCATE_ZT3D( zdth_dz  ,JIU,JJU,JKU )
+izdr_dz    = MNH_ALLOCATE_ZT3D( zdr_dz   ,JIU,JJU,JKU )
+izred2th3  = MNH_ALLOCATE_ZT3D( zred2th3 ,JIU,JJU,JKU )
+izred2r3   = MNH_ALLOCATE_ZT3D( zred2r3  ,JIU,JJU,JKU )
+izred2thr3 = MNH_ALLOCATE_ZT3D( zred2thr3,JIU,JJU,JKU )
+izbll_o_e  = MNH_ALLOCATE_ZT3D( zbll_o_e ,JIU,JJU,JKU )
+izetheta   = MNH_ALLOCATE_ZT3D( zetheta  ,JIU,JJU,JKU )
+izemoist   = MNH_ALLOCATE_ZT3D( zemoist  ,JIU,JJU,JKU )
+izredth1   = MNH_ALLOCATE_ZT3D( zredth1  ,JIU,JJU,JKU )
+izredr1    = MNH_ALLOCATE_ZT3D( zredr1   ,JIU,JJU,JKU )
+izphi3     = MNH_ALLOCATE_ZT3D( zphi3    ,JIU,JJU,JKU )
+izpsi3     = MNH_ALLOCATE_ZT3D( zpsi3    ,JIU,JJU,JKU )
+izd        = MNH_ALLOCATE_ZT3D( zd       ,JIU,JJU,JKU )
+izwthv     = MNH_ALLOCATE_ZT3D( zwthv    ,JIU,JJU,JKU )
+izwu       = MNH_ALLOCATE_ZT3D( zwu      ,JIU,JJU,JKU )
+izwv       = MNH_ALLOCATE_ZT3D( zwv      ,JIU,JJU,JKU )
+izthlp     = MNH_ALLOCATE_ZT3D( zthlp    ,JIU,JJU,JKU )
+izrp       = MNH_ALLOCATE_ZT3D( zrp      ,JIU,JJU,JKU )
+#endif
 
 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 data present (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 &             ZPHI3, ZPSI3, ZD, ZWTHV, ZWU, ZWV, ZTHLP, ZRP)                  &
+!$acc &    create  ( ZPSI_SV, ZREDS1, ZRED2THS, ZRED2RS )
 
 !
 !*       1.   PRELIMINARIES
@@ -628,7 +666,9 @@ ENDIF
 ! Denominator factor in 3rd order terms
 !
 !$acc kernels
-ZD(:,:,:) = (1.+ZREDTH1(:,:,:)+ZREDR1(:,:,:)) * (1.+0.5*(ZREDTH1(:,:,:)+ZREDR1(:,:,:)))
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZD(JI,JJ,JK) = (1.+ZREDTH1(JI,JJ,JK)+ZREDR1(JI,JJ,JK)) * (1.+0.5*(ZREDTH1(JI,JJ,JK)+ZREDR1(JI,JJ,JK)))
+END DO   
 !$acc end kernels
 !
 ! Phi3 and Psi3 Prandtl numbers
@@ -857,6 +897,16 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+DEALLOCATE(zbeta,zsqrt_tke,zdth_dz,zdr_dz,zred2th3,zred2r3,zred2thr3, &
+           zbll_o_e,zetheta,zemoist,zredth1,zredr1,zphi3,zpsi3, &
+           zd,zwthv,zwu,zwv,zthlp,zrp)
+#else
+CALL MNH_REL_ZT3D(izbeta,izsqrt_tke,izdth_dz,izdr_dz,izred2th3,izred2r3,izred2thr3, &
+           izbll_o_e,izetheta,izemoist,izredth1,izredr1,izphi3,izpsi3, &
+           izd,izwthv,izwu,izwv,izthlp,izrp)
+#endif
+
 !$acc end data
 
 !----------------------------------------------------------------------------
diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90
index 879867dd0..834aa2d85 100644
--- a/src/MNH/turb_ver_dyn_flux.f90
+++ b/src/MNH/turb_ver_dyn_flux.f90
@@ -82,7 +82,6 @@ END INTERFACE
 !
 END MODULE MODI_TURB_VER_DYN_FLUX
 !
-!
 !     ###############################################################
       SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL,                     &
                       OCLOSE_OUT,OTURB_FLX,KRR,                     &
@@ -314,6 +313,10 @@ USE MODE_IO_FIELD_WRITE, only: IO_Field_write
 USE MODE_ll
 use mode_mppdb
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+#endif
+
 IMPLICIT NONE
 !
 !*      0.1  declarations of arguments
@@ -374,11 +377,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)  ::  PDP          ! Dynamic TKE production t
 !*       0.2  declaration of local variables
 !
 !
-REAL, DIMENSION(:,:), allocatable  :: ZDIRSINZW ! sinus of the angle
+REAL, DIMENSION(:,:), pointer , contiguous  :: ZDIRSINZW ! sinus of the angle
                    ! between the normal and the vertical at the surface
-REAL, DIMENSION(:,:,:), allocatable :: ZCOEFS    ! coeff. for the
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZCOEFS    ! coeff. for the
                    ! implicit scheme for the wind at the surface
-REAL, DIMENSION(:,:,:), allocatable ::  &
+REAL, DIMENSION(:,:,:), pointer , contiguous ::  &
        ZA, &       ! under diagonal elements of the tri-diagonal matrix involved
                    ! in the temporal implicit scheme (also used to store coefficient
                    ! J in Section 5)
@@ -388,25 +391,31 @@ 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 )
+INTEGER :: IZDIRSINZW,IZCOEFS,IZA,IZRES,IZFLXZ,IZSOURCE,IZKEFF
 INTEGER             :: IIB,IIE, &   ! I index values for the Beginning and End
                        IJB,IJE, &   ! mass points of the domain in the 3 direct.
                        IKB,IKE      !
 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(:,:,:), allocatable :: ZCOEFFLXU, &
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZCOEFFLXU, &
                                     ZCOEFFLXV, ZUSLOPEM, ZVSLOPEM
                                     ! coefficients for the surface flux
                                     ! evaluation and copy of PUSLOPEM and
-                                    ! PVSLOPEM in local 3D arrays 
+                                    ! PVSLOPEM in local 3D arrays
+INTEGER :: IZCOEFFLXU,IZCOEFFLXV,IZUSLOPEM,IZVSLOPEM
 INTEGER             :: IIU,IJU      ! size of array in x,y,z directions
 !
 REAL :: ZTIME1, ZTIME2
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
+INTEGER :: IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE,IZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 !----------------------------------------------------------------------------
 
 !$acc data present( PDXX, PDYY, PDZZ, PDZX, PDZY, PDIRCOSZW,             &
@@ -449,29 +458,50 @@ if ( mppdb_initialized ) then
   call Mppdb_check( prws, "Turb_ver_dyn_flux beg:prws" )
 end if
 
-allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) )
+JIU =  size(pum, 1 )
+JJU =  size(pum, 2 )
+JKU =  size(pum, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zdirsinzw(JIU,JJU ) )
+
+allocate( zcoefs   (JIU,JJU, 1 ) )
+
+allocate( za       (JIU,JJU,JKU ) )
+allocate( zres     (JIU,JJU,JKU ) )
+allocate( zflxz    (JIU,JJU,JKU ) )
+allocate( zsource  (JIU,JJU,JKU ) )
+allocate( zkeff    (JIU,JJU,JKU ) )
 
-allocate( zcoefs   (size( pum, 1 ), size( pum, 2 ), 1 ) )
+allocate( zcoefflxu(JIU,JJU, 1 ) )
+allocate( zcoefflxv(JIU,JJU, 1 ) )
+allocate( zuslopem (JIU,JJU, 1 ) )
+allocate( zvslopem (JIU,JJU, 1 ) )
+#else
+izdirsinzw = MNH_ALLOCATE_ZT2D( zdirsinzw,JIU,JJU  )
+
+izcoefs    = MNH_ALLOCATE_ZT3DP( zcoefs   ,JIU,JJU, 1 , 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 ) ) )
+iza        = MNH_ALLOCATE_ZT3D( za       ,JIU,JJU,JKU  )
+izres      = MNH_ALLOCATE_ZT3D( zres     ,JIU,JJU,JKU  )
+izflxz     = MNH_ALLOCATE_ZT3D( zflxz    ,JIU,JJU,JKU  )
+izsource   = MNH_ALLOCATE_ZT3D( zsource  ,JIU,JJU,JKU  )
+izkeff     = MNH_ALLOCATE_ZT3D( zkeff    ,JIU,JJU,JKU  )
 
-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 ) )
+izcoefflxu = MNH_ALLOCATE_ZT3DP( zcoefflxu,JIU,JJU, 1 , 1  )
+izcoefflxv = MNH_ALLOCATE_ZT3DP( zcoefflxv,JIU,JJU, 1 , 1  )
+izuslopem  = MNH_ALLOCATE_ZT3DP( zuslopem ,JIU,JJU, 1 , 1  )
+izvslopem  = MNH_ALLOCATE_ZT3DP( zvslopem ,JIU,JJU, 1 , 1  )
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU  )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU  )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU  )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU  )
 #endif
 
-!$acc data create( zdirsinzw, zcoefs, za, zres, zflxz, zsource, zkeff, zcoefflxu, zcoefflxv, zuslopem, zvslopem, &
+!$acc data present( zdirsinzw, zcoefs, za, zres, zflxz, zsource, zkeff, zcoefflxu, zcoefflxv, zuslopem, zvslopem, &
 !$acc &            ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device )
 
                                     !
@@ -540,7 +570,9 @@ CALL MXM_DEVICE( PDZZ, ZTMP4_DEVICE )
 #ifndef MNH_BITREP
 ZA(:,:,:) = -PTSTEP * XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP3_DEVICE(:,:,:) / ZTMP4_DEVICE(:,:,:)**2
 #else
-ZA(:,:,:) = -PTSTEP * XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP3_DEVICE(:,:,:) / BR_P2(ZTMP4_DEVICE(:,:,:))
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZA(JI,JJ,JK) = -PTSTEP * XCMFS * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / BR_P2(ZTMP4_DEVICE(JI,JJ,JK))
+END DO
 #endif
 !$acc end kernels
 #endif
@@ -628,6 +660,7 @@ PRUS(:,:,:)=PRUS(:,:,:)+MXM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP
 #else
 !$acc kernels
 PRUS(:,:,:)=PRUS(:,:,:)+ZTMP1_DEVICE(:,:,:)*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP
+!$acc end kernels
 #endif
 !
 !
@@ -639,13 +672,18 @@ PRUS(:,:,:)=PRUS(:,:,:)+ZTMP1_DEVICE(:,:,:)*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP
 ZFLXZ(:,:,:)     = -XCMFS * MXM(ZKEFF) * &
                   DZM (PIMPL*ZRES + PEXPL*PUM) / MXM(PDZZ)
 #else
-ZTMP2_DEVICE(:,:,:) = PIMPL*ZRES(:,:,:) + PEXPL*PUM(:,:,:)
+!$acc kernels
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = PIMPL*ZRES(JI,JJ,JK) + PEXPL*PUM(JI,JJ,JK)
+END DO
 !$acc end kernels
 CALL MXM_DEVICE(ZKEFF,ZTMP1_DEVICE)
 CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP2_DEVICE,ZTMP3_DEVICE)
 CALL MXM_DEVICE(PDZZ,ZTMP4_DEVICE)
 !$acc kernels
-ZFLXZ(:,:,:)     = -XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP3_DEVICE(:,:,:) / ZTMP4_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZFLXZ(JI,JJ,JK)     = -XCMFS * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / ZTMP4_DEVICE(JI,JJ,JK)
+END DO
 !$acc end kernels
 #endif
 !
@@ -700,7 +738,9 @@ PDP(:,:,:) = - MZF( MXF ( ZFLXZ * GZ_U_UW(PUM,PDZZ) )  )
 #else
 CALL GZ_U_UW_DEVICE(KKA,KKU,KKL,PUM,PDZZ,ZTMP1_DEVICE)
 !$acc kernels
-ZTMP2_DEVICE(:,:,:) = ZFLXZ(:,:,:) * ZTMP1_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU )
+   ZTMP2_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK)
+END DO
 !$acc end kernels
 CALL MXF_DEVICE( ZTMP2_DEVICE,ZTMP3_DEVICE )
 CALL MZF_DEVICE(KKA,KKU,KKL, ZTMP3_DEVICE, ZTMP4_DEVICE )
@@ -785,25 +825,35 @@ IF(HTURBDIM=='3DIM') THEN
 #else
   CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE)
 !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) /PDXX(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) /PDXX(JI,JJ,JK)
+  END DO
 !$acc end kernels
   CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE )
 !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = ZTMP3_DEVICE(:,:,:) * ZFLXZ(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) 
+     ZTMP2_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK)
+  END DO
 !$acc end kernels
   CALL DXF_DEVICE( ZTMP2_DEVICE,ZTMP1_DEVICE )
   IF (.NOT. LFLAT) THEN
     CALL MZF_DEVICE(KKA,KKU,KKL,PDZZ,ZTMP2_DEVICE )
     !$acc kernels
-    ZTMP3_DEVICE(:,:,:) = ZFLXZ(:,:,:)*PDZX(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP3_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK)*PDZX(JI,JJ,JK)
+    END DO
     !$acc end kernels
     CALL MZF_DEVICE(KKA,KKU,KKL, ZTMP3_DEVICE,ZTMP4_DEVICE )
     !$acc kernels
-    ZTMP3_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:) / PDXX(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP3_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) / PDXX(JI,JJ,JK)
+    END DO   
     !$acc end kernels
     CALL MXF_DEVICE( ZTMP3_DEVICE,ZTMP4_DEVICE )
     !$acc kernels
-    ZTMP3_DEVICE(:,:,:) = PRHODJ(:,:,:) / ZTMP2_DEVICE(:,:,:) * ZTMP4_DEVICE(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP3_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK)
+    END DO
     !$acc end kernels
     CALL DZM_DEVICE(KKA,KKU,KKL, ZTMP3_DEVICE,ZTMP2_DEVICE)
     !$acc kernels
@@ -823,12 +873,16 @@ IF(HTURBDIM=='3DIM') THEN
 #else
   CALL GX_W_UW_DEVICE(KKA,KKU,KKL, PWM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE)
 !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = ZFLXZ(:,:,:) * ZTMP1_DEVICE(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK)
+  END DO
 !$acc end kernels
   CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
   CALL MZF_DEVICE(KKA,KKU,KKL, ZTMP1_DEVICE,ZTMP2_DEVICE )
 !$acc kernels
-  ZA(:,:,:)=-ZTMP2_DEVICE(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZA(JI,JJ,JK)=-ZTMP2_DEVICE(JI,JJ,JK)
+  END DO
 !$acc end kernels
 #endif
   !
@@ -959,7 +1013,9 @@ CALL MYM_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
 #ifndef MNH_BITREP
 ZA(:,:,:)    = - PTSTEP * XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP4_DEVICE(:,:,:) / ZTMP2_DEVICE(:,:,:)**2
 #else
-ZA(:,:,:)    = - PTSTEP * XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP4_DEVICE(:,:,:) / BR_P2(ZTMP2_DEVICE(:,:,:))
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZA(JI,JJ,JK)    = - PTSTEP * XCMFS * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) / BR_P2(ZTMP2_DEVICE(JI,JJ,JK))
+END DO
 #endif
 #endif
 !
@@ -1063,13 +1119,17 @@ ZFLXZ(:,:,IKB:IKB)   =   MYM(PDZZ(:,:,IKB:IKB))  *                       &
   ) / 0.5 / ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,IKB:IKB)) )
 #else
 !$acc kernels
-ZTMP1_DEVICE(:,:,:) = PIMPL*ZRES(:,:,:) + PEXPL*PVM(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+ZTMP1_DEVICE(JI,JJ,JK) = PIMPL*ZRES(JI,JJ,JK) + PEXPL*PVM(JI,JJ,JK)
+END DO
 !$acc end kernels
 CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE,ZTMP2_DEVICE)
 CALL MYM_DEVICE(PDZZ,ZTMP3_DEVICE)
 CALL MYM_DEVICE(ZKEFF,ZTMP1_DEVICE)
 !$acc kernels
-ZFLXZ(:,:,:)   = -XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) / ZTMP3_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZFLXZ(JI,JJ,JK)   = -XCMFS * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) / ZTMP3_DEVICE(JI,JJ,JK)
+END DO
 !$acc end kernels
 !
 CALL MYM_DEVICE(PDZZ(:,:,IKB:IKB),ZTMP1_DEVICE(:,:,1:1))
@@ -1115,12 +1175,16 @@ ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GZ_V_VW(PVM,PDZZ) ) )
 #else
 CALL GZ_V_VW_DEVICE(KKA,KKU,KKL,PVM,PDZZ,ZTMP1_DEVICE)
 !$acc kernels
-ZTMP2_DEVICE(:,:,:) = ZFLXZ(:,:,:) * ZTMP1_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZTMP2_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK)
+END DO
 !$acc end kernels
 CALL MYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE )
 CALL MZF_DEVICE(KKA,KKU,KKL, ZTMP3_DEVICE, ZTMP1_DEVICE )
 !$acc kernels
-ZA(:,:,:) = - ZTMP1_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZA(JI,JJ,JK) = - ZTMP1_DEVICE(JI,JJ,JK)
+END DO   
 !$acc end kernels
 #endif
 !
@@ -1198,25 +1262,35 @@ IF(HTURBDIM=='3DIM') THEN
   IF (.NOT. L2D) THEN 
     CALL MYM_DEVICE(PRHODJ,ZTMP1_DEVICE)
 !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) /PDYY(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) /PDYY(JI,JJ,JK)
+    END DO
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
 !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLXZ(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK)
+    END DO
 !$acc end kernels
     CALL DYF_DEVICE( ZTMP2_DEVICE,ZTMP1_DEVICE )
     IF (.NOT. LFLAT) THEN
       CALL MZF_DEVICE(KKA,KKU,KKL,PDZZ,ZTMP2_DEVICE )
       !$acc kernels
-      ZTMP3_DEVICE(:,:,:) = ZFLXZ(:,:,:)*PDZY(:,:,:)
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+         ZTMP3_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK)*PDZY(JI,JJ,JK)
+      END DO
       !$acc end kernels
       CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP3_DEVICE,ZTMP4_DEVICE)
       !$acc kernels
-      ZTMP3_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:) / PDYY(:,:,:)
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+         ZTMP3_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) / PDYY(JI,JJ,JK)
+      END DO
       !$acc end kernels
       CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE)
       !$acc kernels
-      ZTMP3_DEVICE(:,:,:) =  PRHODJ(:,:,:) / ZTMP2_DEVICE(:,:,:) * ZTMP4_DEVICE(:,:,:)
+      DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+         ZTMP3_DEVICE(JI,JJ,JK) =  PRHODJ(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK)
+      END DO
       !$acc end kernels
       CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP3_DEVICE, ZTMP4_DEVICE)
       !$acc kernels
@@ -1237,12 +1311,16 @@ IF(HTURBDIM=='3DIM') THEN
 #else
     CALL GY_W_VW_DEVICE(KKA,KKU,KKL, PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE)
 !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = ZFLXZ(:,:,:) * ZTMP1_DEVICE(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK)
+    END DO
 !$acc end kernels
     CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE)
     CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE,ZTMP2_DEVICE  )
 !$acc kernels
-    ZA(:,:,:) = - ZTMP2_DEVICE(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZA(JI,JJ,JK) = - ZTMP2_DEVICE(JI,JJ,JK)
+    END DO
 !$acc end kernels
 #endif
   !
@@ -1378,6 +1456,12 @@ end if
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate (zdirsinzw,zcoefs,za,zres,zflxz,zsource,zkeff,zcoefflxu,zcoefflxv,zuslopem,zvslopem)
+#else
+CALL MNH_REL_ZT3D(izdirsinzw,izcoefs,iza,izres,izflxz,izsource,izkeff,izcoefflxu,izcoefflxv,izuslopem,izvslopem,&
+                  iztmp1_device,iztmp2_device,iztmp3_device,iztmp4_device)
+#endif
 !$acc end data
 
 !----------------------------------------------------------------------------
diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90
index 8bdb18ba4..56ee3d729 100644
--- a/src/MNH/turb_ver_thermo_corr.f90
+++ b/src/MNH/turb_ver_thermo_corr.f90
@@ -319,6 +319,10 @@ USE MODI_SECOND_MNH
 USE MODI_BITREP
 #endif
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_GT3D , MNH_REL_GT3D , MNH_ALLOCATE_ZT3DP
+#endif
+
 IMPLICIT NONE
 !
 !*      0.1  declarations of arguments
@@ -384,18 +388,20 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)  ::  PSIGS     ! Vert. part of Sigma_s at
 !*       0.2  declaration of local variables
 !
 !
-REAL, DIMENSION(:,:,:), allocatable ::  &
+REAL, DIMENSION(:,:,:), pointer , contiguous ::  &
        ZFLXZ,    & ! vertical flux of 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)
+INTEGER :: IZFLXZ,IZKEFF,IZF,IZDFDDTDZ,IZDFDDRDZ
 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
-REAL, DIMENSION(:,:,:),ALLOCATABLE  :: ZCOEFF
+REAL, DIMENSION(:,:,:),POINTER , CONTIGUOUS  :: ZCOEFF
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
+INTEGER            :: IZCOEFF
 !
 REAL :: ZTIME1, ZTIME2
 !
@@ -407,10 +413,15 @@ LOGICAL :: GFWR     ! flag to use w'2r'
 LOGICAL :: GFTHR    ! flag to use w'th'r'
 !
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE,ZTMP8_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE,ZTMP8_DEVICE
+INTEGER  :: IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE,IZTMP4_DEVICE
+INTEGER  :: IZTMP5_DEVICE,IZTMP6_DEVICE,IZTMP7_DEVICE,IZTMP8_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
+!
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ,JK
 !----------------------------------------------------------------------------
 
 !$acc data present( PDZZ,                                            &
@@ -466,26 +477,41 @@ 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( 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 ) ) )
+JIU =  size( pthlm, 1 )
+JJU =  size( pthlm, 2 )
+JKU =  size( pthlm, 3 )
 
-allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), i1 : i2 ) )
+#ifndef MNH_OPENACC
+allocate( zflxz     (JIU,JJU,JKU) )
+allocate( zkeff     (JIU,JJU,JKU) )
+allocate( zf        (JIU,JJU,JKU) )
+allocate( zdfddtdz  (JIU,JJU,JKU) )
+allocate( zdfddrdz  (JIU,JJU,JKU) )
+
+allocate( zcoeff(JIU,JJU, i1 : i2 ) )
+#else
+izflxz    = MNH_ALLOCATE_ZT3D( zflxz     ,JIU,JJU,JKU )
+izkeff    = MNH_ALLOCATE_ZT3D( zkeff     ,JIU,JJU,JKU )
+izf       = MNH_ALLOCATE_ZT3D( zf        ,JIU,JJU,JKU )
+izdfddtdz = MNH_ALLOCATE_ZT3D( zdfddtdz  ,JIU,JJU,JKU )
+izdfddrdz = MNH_ALLOCATE_ZT3D( zdfddrdz  ,JIU,JJU,JKU )
+
+izcoeff   = MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, i1 , i2 )
+!!$allocate( zcoeff(JIU,JJU, i1 : i2 ) )
+#endif
 
 #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 ) ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU )
+iztmp5_device = MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU )
+iztmp6_device = MNH_ALLOCATE_ZT3D( ztmp6_device,JIU,JJU,JKU )
+iztmp7_device = MNH_ALLOCATE_ZT3D( ztmp7_device,JIU,JJU,JKU )
+iztmp8_device = MNH_ALLOCATE_ZT3D( ztmp8_device,JIU,JJU,JKU )
 #endif
 
-!$acc data create( zflxz, zkeff, zf, zdfddtdz, zdfddrdz, zcoeff,           &
+!$acc data present( zflxz, zkeff, zf, zdfddtdz, zdfddrdz, zcoeff,           &
 !$acc &            ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, &
 !$acc &            ztmp5_device, ztmp6_device, ztmp7_device, ztmp8_device  )
 
@@ -551,8 +577,10 @@ END IF
   !$acc end kernels
   CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE(:,:,:),ZTMP2_DEVICE(:,:,:))
   !$acc kernels
-  ZF      (:,:,:) = XCTV*PLM(:,:,:)*PLEPS(:,:,:)*ZTMP2_DEVICE(:,:,:)
-  ZDFDDTDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZF      (JI,JJ,JK) = XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) 
+  END DO
+  ZDFDDTDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately 
   !$acc end kernels
 #endif
   !
@@ -685,14 +713,21 @@ END IF
   !             *DZM(PTHLP(:,:,:) - PTHLM(:,:,:)) / PDZZ(:,:,:)                                        ) &
         + PIMPL * ZDFDDTDZ(:,:,:) * MZF(DZM(PTHLP(:,:,:) - PTHLM(:,:,:)) / PDZZ(:,:,:) )
 #else
+  !$acc kernels  
   ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:)
+  !$acc end kernels
   CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE(:,:,:),ZTMP2_DEVICE(:,:,:))
-  ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:) / PDZZ(:,:,:)
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP3_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+  END DO
+  !$acc end kernels
   CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP3_DEVICE(:,:,:),ZTMP4_DEVICE(:,:,:) )
-  
-!$acc kernels
-  ZFLXZ(:,:,:)   = ZF(:,:,:)                                                              &
-        + PIMPL * ZDFDDTDZ(:,:,:) * ZTMP4_DEVICE(:,:,:)
+  !$acc kernels
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZFLXZ(JI,JJ,JK)   = ZF(JI,JJ,JK)                                                              &
+          + PIMPL * ZDFDDTDZ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK)
+  END DO
 #endif
   !
   ! special case near the ground ( uncentred gradient )
@@ -808,8 +843,12 @@ END IF
 !$acc end kernels
     CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE(:,:,:),ZTMP2_DEVICE(:,:,:))
 !$acc kernels
-    ZF      (:,:,:) = XCTV*PLM(:,:,:)*PLEPS(:,:,:)*ZTMP2_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+    ZF      (JI,JJ,JK) = XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
+END DO
+!$acc end kernels    
 #endif
+!$acc kernels   
     ZDFDDTDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately
     ZDFDDRDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately
 !$acc end kernels
@@ -992,8 +1031,11 @@ END IF
     CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE(:,:,:),ZTMP3_DEVICE(:,:,:))
     CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP2_DEVICE(:,:,:),ZTMP4_DEVICE(:,:,:))
     !$acc kernels
-    ZTMP1_DEVICE(:,:,:) = ZTMP3_DEVICE(:,:,:) / PDZZ(:,:,:)
-    ZTMP2_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:) / PDZZ(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP1_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)      
+    END DO
+
     !$acc end kernels
     CALL D_PHI3DTDZ_O_DDTDZ(PPHI3(:,:,:),PREDTH1(:,:,:),PREDR1(:,:,:),PRED2TH3(:,:,:),PRED2THR3(:,:,:), &
                             HTURBDIM,GUSERV,ZTMP3_DEVICE(:,:,:)) ! d(phi3*dthdz)/ddthdz term
@@ -1011,8 +1053,12 @@ END IF
     CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP8_DEVICE(:,:,:),ZTMP1_DEVICE(:,:,:))
     !!!
     !$acc kernels
-    ZTMP7_DEVICE(:,:,:) =   ( ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:)) * PDR_DZ(:,:,:)  * ZTMP2_DEVICE(:,:,:) / PDZZ(:,:,:) &
-                   + ( ZTMP5_DEVICE(:,:,:) + ZTMP6_DEVICE(:,:,:)) * PDTH_DZ(:,:,:) * ZTMP1_DEVICE(:,:,:) / PDZZ(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP7_DEVICE(JI,JJ,JK) =   ( ZTMP3_DEVICE(JI,JJ,JK) + ZTMP4_DEVICE(JI,JJ,JK)) * PDR_DZ(JI,JJ,JK)  &
+                              * ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) &
+                              + ( ZTMP5_DEVICE(JI,JJ,JK) + ZTMP6_DEVICE(JI,JJ,JK)) * PDTH_DZ(JI,JJ,JK) &
+                              * ZTMP1_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+    END DO
     !$acc end kernels
     !!!
     !$acc kernels
@@ -1022,18 +1068,22 @@ END IF
     CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE(:,:,:),ZTMP3_DEVICE(:,:,:))
     CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP2_DEVICE(:,:,:),ZTMP4_DEVICE(:,:,:))
     !$acc kernels
-    ZTMP1_DEVICE(:,:,:) = ZTMP3_DEVICE(:,:,:) / PDZZ(:,:,:)
-    ZTMP2_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:) /PDZZ(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP1_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) /PDZZ(JI,JJ,JK)
+    END DO
     !$acc end kernels
     !!!
     CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP7_DEVICE(:,:,:),ZTMP3_DEVICE(:,:,:))
     CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) )
     CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP2_DEVICE(:,:,:), ZTMP5_DEVICE(:,:,:) )
     !$acc kernels
-    ZFLXZ(:,:,:)   = ZF(:,:,:)                           &
-        + PIMPL * XCTV*PLM(:,:,:)*PLEPS(:,:,:)*0.5 * ZTMP3_DEVICE(:,:,:)  &
-        + PIMPL * ZDFDDTDZ(:,:,:) * ZTMP4_DEVICE(:,:,:)            &
-        + PIMPL * ZDFDDRDZ(:,:,:) * ZTMP5_DEVICE(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZFLXZ(JI,JJ,JK)   = ZF(JI,JJ,JK)                           &
+            + PIMPL * XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*0.5 * ZTMP3_DEVICE(JI,JJ,JK)  &
+            + PIMPL * ZDFDDTDZ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK)            &
+            + PIMPL * ZDFDDRDZ(JI,JJ,JK) * ZTMP5_DEVICE(JI,JJ,JK)
+    END DO
 #endif
     !
     ! special case near the ground ( uncentred gradient )
@@ -1154,7 +1204,9 @@ END IF
     !$acc end kernels
     CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE(:,:,:),ZTMP2_DEVICE(:,:,:))
     !$acc kernels
-    ZF      (:,:,:) = XCTV*PLM(:,:,:)*PLEPS(:,:,:)*ZTMP2_DEVICE(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZF      (JI,JJ,JK) = XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
+    END DO
 #endif
     ZDFDDRDZ(:,:,:) = 0.     ! this term, because of discretization, is treated separately
     !$acc end kernels
@@ -1297,17 +1349,23 @@ END IF
     !$acc end kernels
     CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP2_DEVICE(:,:,:),ZTMP3_DEVICE(:,:,:))
     !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP3_DEVICE(:,:,:) / PDZZ(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+    END DO
     !$acc end kernels
     CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP2_DEVICE(:,:,:),ZTMP1_DEVICE(:,:,:))
     !$acc kernels
-    ZTMP2_DEVICE(:,:,:) = ZTMP3_DEVICE(:,:,:) / PDZZ(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZTMP2_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+    END DO
     !$acc end kernels
     CALL MZF_DEVICE(KKA,KKU,KKL,ZTMP2_DEVICE(:,:,:),ZTMP3_DEVICE(:,:,:))
     !$acc kernels
-    ZFLXZ(:,:,:)   = ZF(:,:,:)                        &
-          + PIMPL * XCTV*PLM(:,:,:)*PLEPS(:,:,:) * ZTMP1_DEVICE(:,:,:) &
-          + PIMPL * ZDFDDRDZ(:,:,:) * ZTMP3_DEVICE(:,:,:)
+    DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+       ZFLXZ(JI,JJ,JK)   = ZF(JI,JJ,JK)                        &
+            + PIMPL * XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) &
+            + PIMPL * ZDFDDRDZ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK)
+    END DO
 #endif
     !
     ! special case near the ground ( uncentred gradient )
@@ -1419,6 +1477,12 @@ end if
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_REL_ZT3D(IZFLXZ,IZKEFF,IZF,IZDFDDTDZ,IZDFDDRDZ,IZCOEFF,&
+                  IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE,IZTMP4_DEVICE,&
+                  IZTMP5_DEVICE,IZTMP6_DEVICE,IZTMP7_DEVICE,IZTMP8_DEVICE )
+#endif
+
 !$acc end data
 
 !----------------------------------------------------------------------------
diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90
index 25dd18151..866cfd407 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.f90
@@ -353,8 +353,11 @@ USE MODE_PRANDTL
 !
 USE MODI_SECOND_MNH
 USE MODE_MPPDB
-
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_GT3D , MNH_REL_GT3D
+#endif
+
 IMPLICIT NONE
 !
 !*      0.1  declarations of arguments
@@ -458,7 +461,7 @@ 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 ::  &
+REAL, DIMENSION(:,:,:), pointer , contiguous  ::  &
        ZA,       & ! work variable for wrc or LES computation
        ZFLXZ,    & ! vertical flux of the treated variable
        ZSOURCE,  & ! source of evolution for the treated variable
@@ -467,10 +470,16 @@ REAL, DIMENSION(:,:,:), allocatable ::  &
        ZDFDDTDZ, & ! dF/d(dTh/dz)
        ZDFDDRDZ, & ! dF/d(dr/dz)
        Z3RDMOMENT  ! 3 order term in flux or variance equation
+INTEGER :: IZA,IZFLXZ,IZSOURCE,IZKEFF,IZF,IZDFDDTDZ,IZDFDDRDZ,IZ3RDMOMENT
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
+REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE
+INTEGER :: IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE,IZTMP4_DEVICE
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
+
+INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JI,JJ
+
 !----------------------------------------------------------------------------
 
 !$acc data present( PDZZ, PDIRCOSZW, PZZ,                            &
@@ -532,23 +541,42 @@ if ( mppdb_initialized ) then
   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 ) ) )
+JIU =  size( pthlm, 1 )
+JJU =  size( pthlm, 2 )
+JKU =  size( pthlm, 3 )
+
+#ifndef MNH_OPENACC
+allocate( za        (JIU,JJU,JKU ) )
+allocate( zflxz     (JIU,JJU,JKU ) )
+allocate( zsource   (JIU,JJU,JKU ) )
+allocate( zkeff     (JIU,JJU,JKU ) )
+allocate( zf        (JIU,JJU,JKU ) )
+allocate( zdfddtdz  (JIU,JJU,JKU ) )
+allocate( zdfddrdz  (JIU,JJU,JKU ) )
+allocate( z3rdmoment(JIU,JJU,JKU ) )
+#else
+iza         = MNH_ALLOCATE_ZT3D( za        ,JIU,JJU,JKU  )
+izflxz      = MNH_ALLOCATE_ZT3D( zflxz     ,JIU,JJU,JKU  )
+izsource    = MNH_ALLOCATE_ZT3D( zsource   ,JIU,JJU,JKU  )
+izkeff      = MNH_ALLOCATE_ZT3D( zkeff     ,JIU,JJU,JKU  )
+izf         = MNH_ALLOCATE_ZT3D( zf        ,JIU,JJU,JKU  )
+izdfddtdz   = MNH_ALLOCATE_ZT3D( zdfddtdz  ,JIU,JJU,JKU  )
+izdfddrdz   = MNH_ALLOCATE_ZT3D( zdfddrdz  ,JIU,JJU,JKU  )
+iz3rdmoment = MNH_ALLOCATE_ZT3D( z3rdmoment,JIU,JJU,JKU  )
+#endif
 
 #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( ztmp1_device(JIU,JJU,JKU ) )
+!!$allocate( ztmp2_device(JIU,JJU,JKU ) )
+!!$allocate( ztmp3_device(JIU,JJU,JKU ) )
+!!$allocate( ztmp4_device(JIU,JJU,JKU ) )
+iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU  )
+iztmp2_device = MNH_ALLOCATE_ZT3D( ztmp2_device,JIU,JJU,JKU  )
+iztmp3_device = MNH_ALLOCATE_ZT3D( ztmp3_device,JIU,JJU,JKU  )
+iztmp4_device = MNH_ALLOCATE_ZT3D( ztmp4_device,JIU,JJU,JKU  )
 #endif
 
-!$acc data create( ZA, ZFLXZ, ZSOURCE, ZKEFF, ZF, ZDFDDTDZ, ZDFDDRDZ, Z3RDMOMENT,  &
+!$acc data present( ZA, ZFLXZ, ZSOURCE, ZKEFF, ZF, ZDFDDTDZ, ZDFDDRDZ, Z3RDMOMENT,  &
 !$acc &            ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
 
 !
@@ -606,12 +634,16 @@ ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF(:,:,:)*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PR
 #else
 CALL DZM_DEVICE(KKA,KKU,KKL,PTHLM,ZTMP1_DEVICE)
 !$acc kernels
-ZF      (:,:,:) = -XCSHF*PPHI3(:,:,:)*ZKEFF(:,:,:)*ZTMP1_DEVICE(:,:,:)/PDZZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZF      (JI,JJ,JK) = -XCSHF*PPHI3(JI,JJ,JK)*ZKEFF(JI,JJ,JK)*ZTMP1_DEVICE(JI,JJ,JK)/PDZZ(JI,JJ,JK)
+END DO    
 !$acc end kernels
 !
 CALL D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV,ZTMP2_DEVICE)
 !$acc kernels
-ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF(:,:,:)*ZTMP2_DEVICE(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZDFDDTDZ(JI,JJ,JK) = -XCSHF*ZKEFF(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK)
+END DO   
 !$acc end kernels
 #endif
 !
@@ -783,9 +815,13 @@ ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:)
 !$acc end kernels
 CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
-ZFLXZ(:,:,:)   = ZF(:,:,:) + PIMPL * ZDFDDTDZ(:,:,:) * ZTMP2_DEVICE(:,:,:) / PDZZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+   ZFLXZ(JI,JJ,JK)   =  ZF(JI,JJ,JK) + PIMPL * ZDFDDTDZ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+END DO
+!$acc end kernels
 #endif
 !
+!$acc kernels
 ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) 
 !  
   DO JK=IKTB+1,IKTE-1
@@ -826,7 +862,9 @@ END IF
 IF (KRR /= 0) THEN
   CALL MZM_DEVICE(PETHETA,ZTMP1_DEVICE)
 !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLXZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)  
+  ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK)
+END DO
 !$acc end kernels
   CALL MZF_DEVICE(KKA,KKU,KKL, ZTMP2_DEVICE,ZTMP3_DEVICE)
 !$acc kernels
@@ -878,7 +916,9 @@ IF ( KRRL >= 1 ) THEN
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE )
 !$acc kernels
-    ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLXZ(:,:,:)/PDZZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)    
+    ZTMP1_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK)*ZFLXZ(JI,JJ,JK)/PDZZ(JI,JJ,JK)
+END DO
 !$acc end kernels
     CALL DZF_DEVICE(KKA,KKU,KKL, ZTMP1_DEVICE,ZTMP3_DEVICE )
 !$acc kernels
@@ -891,7 +931,9 @@ IF ( KRRL >= 1 ) THEN
 !$acc end kernels
     CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE )
 !$acc kernels
-  ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLXZ(:,:,:)/PDZZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+    ZTMP1_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK)*ZFLXZ(JI,JJ,JK)/PDZZ(JI,JJ,JK)
+END DO
 !$acc end kernels
     CALL DZF_DEVICE(KKA,KKU,KKL, ZTMP1_DEVICE,ZTMP3_DEVICE )
 !$acc kernels
@@ -1005,12 +1047,16 @@ IF (KRR /= 0) THEN
 #else
   CALL DZM_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1),ZTMP1_DEVICE)
   !$acc kernels
-  ZF      (:,:,:) = -XCSHF*PPSI3(:,:,:)*ZKEFF(:,:,:)*ZTMP1_DEVICE(:,:,:)/PDZZ(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZF      (JI,JJ,JK) = -XCSHF*PPSI3(JI,JJ,JK)*ZKEFF(JI,JJ,JK)*ZTMP1_DEVICE(JI,JJ,JK)/PDZZ(JI,JJ,JK)
+  END DO
   !$acc end kernels
   CALL D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV,ZTMP1_DEVICE)
 !CALL D_PHI3DRDZ_O_DDRDZ_DEVICE(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV,ZTMP1_DEVICE)
   !$acc kernels
-  ZDFDDRDZ(:,:,:) = -XCSHF*ZKEFF(:,:,:)*ZTMP1_DEVICE(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZDFDDRDZ(JI,JJ,JK) = -XCSHF*ZKEFF(JI,JJ,JK)*ZTMP1_DEVICE(JI,JJ,JK)
+  END DO
   !$acc end kernels
 #endif
   !
@@ -1181,7 +1227,9 @@ IF (KRR /= 0) THEN
 !$acc end kernels
   CALL DZM_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE,ZTMP2_DEVICE)
 !$acc kernels
-  ZFLXZ(:,:,:)   = ZF(:,:,:) + PIMPL * ZDFDDRDZ(:,:,:) *ZTMP2_DEVICE(:,:,:) / PDZZ(:,:,:)
+DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)  
+   ZFLXZ(JI,JJ,JK)   = ZF(JI,JJ,JK) + PIMPL * ZDFDDRDZ(JI,JJ,JK) *ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+END DO
 !$acc end kernels
 #endif
   !
@@ -1220,12 +1268,18 @@ IF (KRR /= 0) THEN
 #else
   CALL MZM_DEVICE(PEMOIST,ZTMP1_DEVICE)
   !$acc kernels
-  ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLXZ(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK)
+  END DO
   !$acc end kernels
   CALL MZF_DEVICE(KKA,KKU,KKL, ZTMP2_DEVICE, ZTMP3_DEVICE )
   !$acc kernels
-  ZA(:,:,:)   =  PBETA(:,:,:) * ZTMP3_DEVICE(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     ZA(JI,JJ,JK)   =  PBETA(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK)
+  END DO
+  !$acc end kernels
 #endif
+  !$acc kernels
   ZA(:,:,IKB) =  PBETA(:,:,IKB) * PEMOIST(:,:,IKB) *   &
                  0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) )
   PTP(:,:,:) = PTP(:,:,:) + ZA(:,:,:)
@@ -1238,8 +1292,12 @@ IF (KRR /= 0) THEN
 #else
   CALL MZM_DEVICE(PEMOIST,ZTMP1_DEVICE)
   !$acc kernels
-  PWTHV(:,:,:)          = PWTHV(:,:,:)          + ZTMP1_DEVICE(:,:,:) * ZFLXZ(:,:,:)
+  DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU)
+     PWTHV(JI,JJ,JK)          = PWTHV(JI,JJ,JK)          + ZTMP1_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK)
+  END DO
+  !$acc end kernels
 #endif
+  !$acc kernels
   PWTHV(:,:,IKB) = PWTHV(:,:,IKB) + PEMOIST(:,:,IKB) * ZFLXZ(:,:,IKB)
   !$acc end kernels
 !
@@ -1455,6 +1513,11 @@ end if
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_REL_ZT3D(IZA, IZFLXZ, IZSOURCE, IZKEFF, IZF, IZDFDDTDZ, IZDFDDRDZ, IZ3RDMOMENT,  &
+                  IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE)
+#endif
+
 !$acc end data
 
 !----------------------------------------------------------------------------
-- 
GitLab