From ce843fba137d2879c0bae9130fbb319d9e04aa97 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 1 Feb 2022 11:57:28 +0100
Subject: [PATCH] Philippe 01/02/2022: OpenACC: use MNH_ALLOCATE_FLAT and
 MNH_RELEASE_FLAT instead of old allocate/release procedures

---
 src/MNH/advection_metsv.f90              |  96 +++++++-------
 src/MNH/advection_uvw.f90                |   4 +-
 src/MNH/emoist.f90                       |   8 +-
 src/MNH/etheta.f90                       |  10 +-
 src/MNH/gradient_u.f90                   |  28 ++--
 src/MNH/gradient_v.f90                   |  31 +++--
 src/MNH/gradient_w.f90                   |  36 ++---
 src/MNH/ice4_fast_rg.f90                 |  16 +--
 src/MNH/ice4_fast_rs.f90                 |  14 +-
 src/MNH/ice4_sedimentation_split.f90     |  24 ++--
 src/MNH/ice4_tendencies.f90              |  14 +-
 src/MNH/mode_mnh_zwork.f90               |  15 ++-
 src/MNH/mode_prandtl.f90                 |  24 ++--
 src/MNH/modeln.f90                       |  12 +-
 src/MNH/prandtl.f90                      |  21 ++-
 src/MNH/rain_ice.f90                     | 160 +++++++++++------------
 src/MNH/rain_ice_nucleation.f90          |  38 +++---
 src/MNH/rain_ice_sedimentation_split.f90 | 118 ++++++++++-------
 src/MNH/resolved_cloud.f90               |  51 ++++----
 src/MNH/sources_neg_correct.f90          |  22 ++--
 src/MNH/tke_eps_sources.f90              |  22 ++--
 src/MNH/tridiag_thermo.f90               |  27 ++--
 src/MNH/tridiag_tke.f90                  |  13 +-
 src/MNH/tridiag_w.f90                    |  20 +--
 src/MNH/tridiag_wind.f90                 |  13 +-
 src/MNH/turb.f90                         | 141 ++++++++++----------
 src/MNH/turb_hor_dyn_corr.f90            |  62 ++++-----
 src/MNH/turb_hor_splt.f90                |  61 +++++----
 src/MNH/turb_hor_sv_flux.f90             |  24 ++--
 src/MNH/turb_hor_thermo_corr.f90         |  29 ++--
 src/MNH/turb_hor_thermo_flux.f90         |  37 +++---
 src/MNH/turb_hor_tke.f90                 |  18 +--
 src/MNH/turb_hor_uv.f90                  |  32 ++---
 src/MNH/turb_hor_uw.f90                  |  20 +--
 src/MNH/turb_hor_vw.f90                  |  20 +--
 src/MNH/turb_ver.f90                     |  66 +++++-----
 src/MNH/turb_ver_dyn_flux.f90            |  37 +++---
 src/MNH/turb_ver_thermo_corr.f90         |  36 ++---
 src/MNH/turb_ver_thermo_flux.f90         |  42 +++---
 src/ZSOLVER/advection_metsv.f90          |  96 +++++++-------
 src/ZSOLVER/advection_uvw.f90            |  46 +++----
 src/ZSOLVER/gdiv.f90                     |  22 ++--
 src/ZSOLVER/modeln.f90                   |  12 +-
 src/ZSOLVER/p_abs.f90                    |  12 +-
 src/ZSOLVER/pressurez.f90                |  24 ++--
 src/ZSOLVER/qlap.f90                     |  32 ++---
 src/ZSOLVER/tridiag_thermo.f90           |  27 ++--
 src/ZSOLVER/turb.f90                     | 141 ++++++++++----------
 src/ZSOLVER/turb_hor_dyn_corr.f90        |  56 ++++----
 src/ZSOLVER/turb_hor_thermo_flux.f90     |  36 +++--
 src/ZSOLVER/zsolver.f90                  |  14 +-
 src/ZSOLVER/zsolver_inv.f90              |   6 +-
 52 files changed, 974 insertions(+), 1012 deletions(-)

diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index 6ba8a05bb..43e6ce771 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -174,8 +174,8 @@ use mode_argslist_ll,    only: ADD3DFIELD_ll, ADD4DFIELD_ll, CLEANLIST_ll, LIST_
 use mode_budget,         only: Budget_store_init, Budget_store_end
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_ZT3D, MNH_ALLOCATE_ZT4D, MNH_CHECK_IN_ZT3D, MNH_CHECK_OUT_ZT3D, &
-                               MNH_GET_ZT3D, MNH_REL_ZT3D, MNH_REL_ZT4D, ZT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_CHECK_IN_ZT3D, MNH_CHECK_OUT_ZT3D, &
+                               MNH_GET_ZT3D, MNH_RELEASE_FLAT, MNH_REL_ZT3D, ZT3D
 #endif
 use mode_exchange_ll,    only: UPDATE_HALO_ll
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
@@ -400,41 +400,41 @@ 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                )
+IZRUCPPM       = MNH_ALLOCATE_FLAT( ZRUCPPM      , JIU, JJU, JKU               )
+IZRVCPPM       = MNH_ALLOCATE_FLAT( ZRVCPPM      , JIU, JJU, JKU               )
+IZRWCPPM       = MNH_ALLOCATE_FLAT( ZRWCPPM      , JIU, JJU, JKU               )
+IZCFLU         = MNH_ALLOCATE_FLAT( ZCFLU        , JIU, JJU, JKU               )
+IZCFLV         = MNH_ALLOCATE_FLAT( ZCFLV        , JIU, JJU, JKU               )
+IZCFLW         = MNH_ALLOCATE_FLAT( ZCFLW        , JIU, JJU, JKU               )
+IZCFL          = MNH_ALLOCATE_FLAT( ZCFL         , JIU, JJU, JKU               )
+IZTH           = MNH_ALLOCATE_FLAT( ZTH          , JIU, JJU, JKU               )
+IZTKE          = MNH_ALLOCATE_FLAT( ZTKE         , JIU, JJU, SIZE(PTKET,3)     )
+IZRTHS_OTHER   = MNH_ALLOCATE_FLAT( ZRTHS_OTHER  , JIU, JJU, JKU               )
+IZRTKES_OTHER  = MNH_ALLOCATE_FLAT( ZRTKES_OTHER , JIU, JJU, SIZE(PTKET,3)     )
+IZRTHS_PPM     = MNH_ALLOCATE_FLAT( ZRTHS_PPM    , JIU, JJU, JKU               )
+IZRTKES_PPM    = MNH_ALLOCATE_FLAT( ZRTKES_PPM   , JIU, JJU, SIZE(PTKET,3)     )
+IZR            = MNH_ALLOCATE_FLAT( ZR           , JIU, JJU, JKU, SIZE(PRT, 4) )
+IZSV           = MNH_ALLOCATE_FLAT( ZSV          , JIU, JJU, JKU, SIZE(PSVT,4) )
+IZSNWC         = MNH_ALLOCATE_FLAT( ZSNWC        , JIU, JJU, JKU, NBLOWSNOW_2D )
+IZSNWC_INIT    = MNH_ALLOCATE_FLAT( ZSNWC_INIT   , JIU, JJU, JKU, NBLOWSNOW_2D )
+IZRSNWCS       = MNH_ALLOCATE_FLAT( ZRSNWCS      , JIU, JJU, JKU, NBLOWSNOW_2D )
+IZRRS_OTHER    = MNH_ALLOCATE_FLAT( ZRRS_OTHER   , JIU, JJU, JKU, SIZE(PRT, 4) )
+IZRSVS_OTHER   = MNH_ALLOCATE_FLAT( ZRSVS_OTHER  , JIU, JJU, JKU, SIZE(PSVT,4) )
+IZRSNWCS_OTHER = MNH_ALLOCATE_FLAT( ZRSNWCS_OTHER, JIU, JJU, JKU, NBLOWSNOW_2D )
+IZRRS_PPM      = MNH_ALLOCATE_FLAT( ZRRS_PPM     , JIU, JJU, JKU, SIZE(PRT, 4) )
+IZRSVS_PPM     = MNH_ALLOCATE_FLAT( ZRSVS_PPM    , JIU, JJU, JKU, SIZE(PSVT,4) )
+IZRSNWCS_PPM   = MNH_ALLOCATE_FLAT( ZRSNWCS_PPM  , JIU, JJU, JKU, NBLOWSNOW_2D )
+IZRHOX1        = MNH_ALLOCATE_FLAT( ZRHOX1       , JIU, JJU, JKU               )
+IZRHOX2        = MNH_ALLOCATE_FLAT( ZRHOX2       , JIU, JJU, JKU               )
+IZRHOY1        = MNH_ALLOCATE_FLAT( ZRHOY1       , JIU, JJU, JKU               )
+IZRHOY2        = MNH_ALLOCATE_FLAT( ZRHOY2       , JIU, JJU, JKU               )
+IZRHOZ1        = MNH_ALLOCATE_FLAT( ZRHOZ1       , JIU, JJU, JKU               )
+IZRHOZ2        = MNH_ALLOCATE_FLAT( ZRHOZ2       , JIU, JJU, JKU               )
+IZT            = MNH_ALLOCATE_FLAT( ZT           , JIU, JJU, JKU               )
+IZEXN          = MNH_ALLOCATE_FLAT( ZEXN         , JIU, JJU, JKU               )
+IZLV           = MNH_ALLOCATE_FLAT( ZLV          , JIU, JJU, JKU               )
+IZLS           = MNH_ALLOCATE_FLAT( ZLS          , JIU, JJU, JKU               )
+IZCPH          = MNH_ALLOCATE_FLAT( ZCPH         , JIU, JJU, JKU                )
 #endif
 
 !$acc data present( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH,                        &
@@ -1113,23 +1113,15 @@ deallocate ( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH,
             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_RELEASE_FLAT ( 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_RELEASE_FLAT ( IZR, IZSV, IZSNWC, IZSNWC_INIT, IZRSNWCS, IZRRS_OTHER, IZRSVS_OTHER, &
+                        IZRSNWCS_OTHER, IZRRS_PPM, IZRSVS_PPM, IZRSNWCS_PPM)
+
+CALL MNH_RELEASE_FLAT ( IZRUCPPM, IZRVCPPM, IZRWCPPM, IZCFLU, IZCFLV, IZCFLW, IZCFL, IZTH, &
+                        IZTKE, IZRTHS_OTHER, IZRTKES_OTHER, IZRTHS_PPM, IZRTKES_PPM        )
 
-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
 
diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90
index f6e1f9bfe..24047a92f 100644
--- a/src/MNH/advection_uvw.f90
+++ b/src/MNH/advection_uvw.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -107,7 +107,7 @@ use mode_budget,      only: Budget_store_init, Budget_store_end
 USE MODE_ll
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_ALLOCATE_ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D, MNH_GET_ZT4D , MNH_REL_ZT4D
+USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D, MNH_GET_ZT4D , MNH_REL_ZT4D
 #endif
 use mode_mppdb
 
diff --git a/src/MNH/emoist.f90 b/src/MNH/emoist.f90
index 50d6d0779..962e7961e 100644
--- a/src/MNH/emoist.f90
+++ b/src/MNH/emoist.f90
@@ -101,7 +101,7 @@ USE MODD_CST
 USE MODD_DYN_n, ONLY : LOCEAN
 
 #ifdef MNH_OPENACC
-USE  MODE_MNH_ZWORK
+USE  MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 use mode_mppdb
 
@@ -160,8 +160,8 @@ JKU =  size( pthlm, 3 )
 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 )
+IZA  = MNH_ALLOCATE_FLAT( za,  JIU, JJU, JKU )
+IZRW = MNH_ALLOCATE_FLAT( zrw, JIU, JJU, JKU )
 #endif
 
 !$acc data present( za, zrw )
@@ -272,7 +272,7 @@ end if
 #ifndef MNH_OPENACC
 deallocate( za, zrw )
 #else
-CALL MNH_REL_ZT3D(  iza, izrw )
+CALL MNH_RELEASE_FLAT(  iza, izrw )
 #endif
 
 !$acc end data
diff --git a/src/MNH/etheta.f90 b/src/MNH/etheta.f90
index 9e0099214..5bf6e04d4 100644
--- a/src/MNH/etheta.f90
+++ b/src/MNH/etheta.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -104,7 +104,7 @@ USE MODD_CST
 USE MODD_DYN_n, ONLY : LOCEAN
 
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT , MNH_RELEASE_FLAT
 #endif
 use mode_mppdb
 
@@ -160,8 +160,8 @@ end if
 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 ) )
+iza  = MNH_ALLOCATE_FLAT( za  , size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) )
+izrw = MNH_ALLOCATE_FLAT( zrw , size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) )
 #endif
 
 !$acc data present( za, zrw )
@@ -251,7 +251,7 @@ end if
 #ifndef MNH_OPENACC
 deallocate (za, zrw)
 #else
-CALL MNH_REL_ZT3D(iza, izrw)
+CALL MNH_RELEASE_FLAT( iza, izrw )
 #endif
 
 !$acc end data
diff --git a/src/MNH/gradient_u.f90 b/src/MNH/gradient_u.f90
index 68c007167..3d89a476e 100644
--- a/src/MNH/gradient_u.f90
+++ b/src/MNH/gradient_u.f90
@@ -195,7 +195,7 @@ END FUNCTION GX_U_M
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
 !
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -224,9 +224,9 @@ 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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device, ztmp3_device )
 
@@ -268,7 +268,7 @@ END IF
 
 !$acc end data
 
-CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device,iztmp3_device)
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device, iztmp3_device )
 
 !$acc end data
 
@@ -385,7 +385,7 @@ END FUNCTION GY_U_UV
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
 !
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -416,9 +416,9 @@ 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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device, ztmp3_device )
 
@@ -468,7 +468,7 @@ END IF
 
 !$acc end data
 
-CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device,iztmp3_device)
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device, iztmp3_device )
 
 !$acc end data
 
@@ -568,7 +568,7 @@ END FUNCTION GZ_U_UW
 !
 !
 USE MODI_SHUMAN_DEVICE
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -594,8 +594,8 @@ 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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device )
 
@@ -611,7 +611,7 @@ PGZ_U_UW_DEVICE(:,:,:)= ZTMP1_DEVICE(:,:,:) / ZTMP2_DEVICE(:,:,:)
 
 !$acc end data
 
-CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device)
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device )
 
 !$acc end data
 
diff --git a/src/MNH/gradient_v.f90 b/src/MNH/gradient_v.f90
index 6bda4c104..33a49d5e1 100644
--- a/src/MNH/gradient_v.f90
+++ b/src/MNH/gradient_v.f90
@@ -193,7 +193,7 @@ END FUNCTION GY_V_M
 !
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -225,9 +225,9 @@ 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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device, ztmp3_device )
 
@@ -270,7 +270,7 @@ END IF
 
 !$acc end data
 
-CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device,iztmp3_device)
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device, iztmp3_device )
 
 !$acc end data
 
@@ -385,7 +385,7 @@ END FUNCTION GX_V_UV
 !
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -415,10 +415,10 @@ 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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device )
 
@@ -468,7 +468,7 @@ END IF
 
 !$acc end data
 
-CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device,iztmp3_device,iztmp4_device)
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device, iztmp3_device, iztmp4_device )
 
 !$acc end data
 
@@ -570,7 +570,7 @@ END FUNCTION GZ_V_VW
 !
 USE MODI_SHUMAN_DEVICE
 USE MODI_SHUMAN
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -596,8 +596,8 @@ 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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device )
 
@@ -613,7 +613,7 @@ PGZ_V_VW_DEVICE(:,:,:)= ZTMP1_DEVICE(:,:,:) / ZTMP2_DEVICE(:,:,:)
 
 !$acc end data
 
-CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device)
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device )
 
 !$acc end data
 
@@ -621,4 +621,3 @@ CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device)
 !
 END SUBROUTINE GZ_V_VW_DEVICE
 #endif
-
diff --git a/src/MNH/gradient_w.f90 b/src/MNH/gradient_w.f90
index 4a73fc8a2..7053c663e 100644
--- a/src/MNH/gradient_w.f90
+++ b/src/MNH/gradient_w.f90
@@ -174,7 +174,7 @@ END FUNCTION GZ_W_M
 !
 USE MODI_SHUMAN_DEVICE
 USE MODI_SHUMAN
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -200,8 +200,8 @@ 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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device )
 
@@ -217,7 +217,7 @@ PGZ_W_M_DEVICE(:,:,:)= ZTMP1_DEVICE(:,:,:)/ZTMP2_DEVICE(:,:,:)
 
 !$acc end data
 
-CALL MNH_REL_ZT3D(iztmp1_device,iztmp2_device)
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device )
 
 !$acc end data
 
@@ -323,7 +323,7 @@ END FUNCTION GX_W_UW
 !
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -351,11 +351,11 @@ 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 )
-iztmp5_device = MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
+iztmp5_device = MNH_ALLOCATE_FLAT( ztmp5_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
 
@@ -388,7 +388,7 @@ END IF
 
 !$acc end data
 
-CALL MNH_REL_ZT3D( iztmp1_device, iztmp2_device, iztmp3_device, iztmp4_device, iztmp5_device )
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device, iztmp3_device, iztmp4_device, iztmp5_device )
 
 !$acc end data
 
@@ -494,7 +494,7 @@ END FUNCTION GY_W_VW
 !
 USE MODI_SHUMAN_DEVICE
 USE MODD_CONF
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 IMPLICIT NONE
 !
@@ -523,11 +523,11 @@ 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 )
-iztmp5_device = MNH_ALLOCATE_ZT3D( ztmp5_device,JIU,JJU,JKU )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
+iztmp5_device = MNH_ALLOCATE_FLAT( ztmp5_device, JIU, JJU, JKU )
 
 !$acc data present( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
 
@@ -560,7 +560,7 @@ END IF
 
 !$acc end data
 
-CALL MNH_REL_ZT3D( iztmp1_device, iztmp2_device, iztmp3_device, iztmp4_device, iztmp5_device )
+CALL MNH_RELEASE_FLAT( iztmp1_device, iztmp2_device, iztmp3_device, iztmp4_device, iztmp5_device )
 
 !$acc end data
 
diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90
index 0577bfbf4..039cd33f8 100644
--- a/src/MNH/ice4_fast_rg.f90
+++ b/src/MNH/ice4_fast_rg.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -108,7 +108,7 @@ USE MODD_RAIN_ICE_PARAM, ONLY: NDRYLBDAG,NDRYLBDAR,NDRYLBDAS,X0DEPG,X1DEPG,XCOLE
                                XLBRDRYG2,XLBRDRYG3,XLBSDRYG1,XLBSDRYG2,XLBSDRYG3,XRCFRI
 
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1DP, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1DFLAT
 #endif
 USE MODE_MPPDB
 
@@ -257,9 +257,9 @@ allocate( zzw        ( isize ) )
 allocate( zrdryg_init( isize ) )
 allocate( zrwetg_init( isize ) )
 #else
-II1    = MNH_ALLOCATE_IT1DP( I1,    ISIZE )
-IIVEC1 = MNH_ALLOCATE_IT1DP( IVEC1, ISIZE )
-IIVEC2 = MNH_ALLOCATE_IT1DP( IVEC2, ISIZE )
+II1    = MNH_ALLOCATE_FLAT( I1,    ISIZE )
+IIVEC1 = MNH_ALLOCATE_FLAT( IVEC1, ISIZE )
+IIVEC2 = MNH_ALLOCATE_FLAT( IVEC2, ISIZE )
 
 IDXGDRY      = MNH_ALLOCATE_FLAT( gdry,        isize )
 
@@ -867,9 +867,9 @@ CALL MNH_RELEASE_FLAT( IZDRY  )
 
 CALL MNH_REL_GT1DFLAT( IDXGDRY )
 
-CALL MNH_REL_IT1D( IIVEC2 )
-CALL MNH_REL_IT1D( IIVEC1 )
-CALL MNH_REL_IT1D( II1    )
+CALL MNH_REL_IT1DFLAT( IIVEC2 )
+CALL MNH_REL_IT1DFLAT( IIVEC1 )
+CALL MNH_REL_IT1DFLAT( II1    )
 #endif
 
 !$acc end data
diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90
index ea3c59731..1304368e4 100644
--- a/src/MNH/ice4_fast_rs.f90
+++ b/src/MNH/ice4_fast_rs.f90
@@ -94,7 +94,7 @@ USE MODD_RAIN_ICE_PARAM, ONLY: NACCLBDAR,NACCLBDAS,NGAMINC,X0DEPS,X1DEPS,XACCINT
                                XRIMINTP1,XRIMINTP2,XSRIMCG,XSRIMCG2,XSRIMCG3
 
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1DP, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1DFLAT
 #endif
 USE MODE_MPPDB
 
@@ -218,9 +218,9 @@ allocate( zzw2        ( isize ) )
 allocate( zzw6        ( isize ) )
 allocate( zfreez_rate ( isize ) )
 #else
-II1    = MNH_ALLOCATE_IT1DP( I1,    ISIZE )
-IIVEC1 = MNH_ALLOCATE_IT1DP( IVEC1, ISIZE )
-IIVEC2 = MNH_ALLOCATE_IT1DP( IVEC2, ISIZE )
+II1    = MNH_ALLOCATE_FLAT( I1,    ISIZE )
+IIVEC1 = MNH_ALLOCATE_FLAT( IVEC1, ISIZE )
+IIVEC2 = MNH_ALLOCATE_FLAT( IVEC2, ISIZE )
 
 IDXGRIM = MNH_ALLOCATE_FLAT( grim, ISIZE )
 IDXGACC = MNH_ALLOCATE_FLAT( gacc, ISIZE )
@@ -783,9 +783,9 @@ CALL MNH_RELEASE_FLAT( IZRIM        )
 CALL MNH_REL_GT1DFLAT( IDXGACC )
 CALL MNH_REL_GT1DFLAT( IDXGRIM )
 
-CALL MNH_REL_IT1D( IIVEC2 )
-CALL MNH_REL_IT1D( IIVEC1 )
-CALL MNH_REL_IT1D( II1    )
+CALL MNH_REL_IT1DFLAT( IIVEC2 )
+CALL MNH_REL_IT1DFLAT( IIVEC1 )
+CALL MNH_REL_IT1DFLAT( II1    )
 #endif
 
 !$acc end data
diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90
index b6ff2f792..d500c1a0c 100644
--- a/src/MNH/ice4_sedimentation_split.f90
+++ b/src/MNH/ice4_sedimentation_split.f90
@@ -403,9 +403,7 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XCC,XCEXVT,XDC,XLBEXC,XRTMIN
 USE MODD_RAIN_ICE_PARAM, ONLY: XEXCSEDI,XEXSEDG,XEXSEDH,XEXSEDR,XEXSEDS,XFSEDG,XFSEDH,XFSEDI,XFSEDR,XFSEDS
 
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1D, MNH_ALLOCATE_ZT1D, &
-                               MNH_ALLOCATE_ZT2D, MNH_ALLOCATE_ZT3DP, &
-                               MNH_RELEASE_FLAT, MNH_REL_IT1D, MNH_REL_ZT1D, MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT, MNH_REL_IT1DFLAT
 
 #endif
 use mode_mppdb
@@ -491,16 +489,16 @@ allocate( zremaint(size( prhodref, 1 ), size( prhodref, 2 ) ) )
 
 allocate( zwsed(size( prhodref, 1 ), size( prhodref, 2 ), 0 : size( prhodref, 3 ) + 1 ) )
 #else
-II1 = MNH_ALLOCATE_IT1D( i1, kit * kjt * kkt )
-II2 = MNH_ALLOCATE_IT1D( i2, kit * kjt * kkt )
-II3 = MNH_ALLOCATE_IT1D( i3, kit * kjt * kkt )
+II1 = MNH_ALLOCATE_FLAT( i1, kit * kjt * kkt )
+II2 = MNH_ALLOCATE_FLAT( i2, kit * kjt * kkt )
+II3 = MNH_ALLOCATE_FLAT( i3, kit * kjt * kkt )
 
-IZMRCHANGE  = MNH_ALLOCATE_ZT2D( zmrchange,  kit, kjt )
-IZMAX_TSTEP = MNH_ALLOCATE_ZT2D( zmax_tstep, kit, kjt )
+IZMRCHANGE  = MNH_ALLOCATE_FLAT( zmrchange,  kit, kjt )
+IZMAX_TSTEP = MNH_ALLOCATE_FLAT( zmax_tstep, kit, kjt )
 
 IZRSMIN = MNH_ALLOCATE_FLAT( zrsmin, Size( xrtmin ) )
 
-IZREMAINT = MNH_ALLOCATE_ZT2D( zremaint, Size( prhodref, 1 ), Size( prhodref, 2 ) )
+IZREMAINT = MNH_ALLOCATE_FLAT( zremaint, Size( prhodref, 1 ), Size( prhodref, 2 ) )
 
 IZWSED = MNH_ALLOCATE_FLAT( zwsed, 1, Size( prhodref, 1 ), 1, Size( prhodref, 2 ), 0, Size( prhodref, 3 ) + 1 )
 #endif
@@ -724,10 +722,10 @@ deallocate( i3 )
 deallocate( i2 )
 deallocate( i1 )
 #else
-CALL MNH_REL_IT1D( ii1, ii2, ii3 )
-CALL MNH_RELEASE_FLAT( IZWSED )
-CALL MNH_RELEASE_FLAT( IZRSMIN )
-CALL MNH_REL_ZT3D( IZMRCHANGE, IZMAX_TSTEP, IZREMAINT )
+CALL MNH_REL_IT1DFLAT( ii3 )
+CALL MNH_REL_IT1DFLAT( ii2 )
+CALL MNH_REL_IT1DFLAT( ii1 )
+CALL MNH_RELEASE_FLAT( IZMRCHANGE, IZMAX_TSTEP, IZRSMIN, IZREMAINT, IZWSED )
 #endif
 
 !$acc end data
diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90
index 2329e5d1b..6e6d056ec 100644
--- a/src/MNH/ice4_tendencies.f90
+++ b/src/MNH/ice4_tendencies.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -186,7 +186,7 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XLBDAS_MAX,XLBEXG,XLBEXH,XLBEXR,XLBEXS,XLBG,XLBH,
 USE MODD_RAIN_ICE_PARAM, ONLY: XSCFAC
 
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_ZT3D, MNH_RELEASE_FLAT, MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 USE MODI_ICE4_COMPUTE_PDF
@@ -458,10 +458,10 @@ IZLBDAR_RF = MNH_ALLOCATE_FLAT( zlbdar_rf, isize )
 IZRGSI     = MNH_ALLOCATE_FLAT( zrgsi,     isize )
 IZRGSI_MR  = MNH_ALLOCATE_FLAT( zrgsi_mr,  isize )
 
-IZRRT3D = MNH_ALLOCATE_ZT3D( zrrt3d, kit, kjt, kkt )
-IZRST3D = MNH_ALLOCATE_ZT3D( zrst3d, kit, kjt, kkt )
-IZRGT3D = MNH_ALLOCATE_ZT3D( zrgt3d, kit, kjt, kkt )
-IZRHT3D = MNH_ALLOCATE_ZT3D( zrht3d, kit, kjt, kkt )
+IZRRT3D = MNH_ALLOCATE_FLAT( zrrt3d, kit, kjt, kkt )
+IZRST3D = MNH_ALLOCATE_FLAT( zrst3d, kit, kjt, kkt )
+IZRGT3D = MNH_ALLOCATE_FLAT( zrgt3d, kit, kjt, kkt )
+IZRHT3D = MNH_ALLOCATE_FLAT( zrht3d, kit, kjt, kkt )
 #endif
 
 !$acc data create( GLDCOMPUTE )  &
@@ -1011,7 +1011,7 @@ deallocate( zrvt     )
 deallocate( zwetg    )
 deallocate( gldcompute )
 #else
-CALL MNH_REL_ZT3D( IZRRT3D, IZRST3D, IZRGT3D, IZRHT3D )
+CALL MNH_RELEASE_FLAT( IZRRT3D, IZRST3D, IZRGT3D, IZRHT3D )
 CALL MNH_RELEASE_FLAT( IZRGSI_MR )
 CALL MNH_RELEASE_FLAT( IZRGSI )
 CALL MNH_RELEASE_FLAT( IZLBDAR_RF )
diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90
index 8bcc98143..bbd89b7cb 100644
--- a/src/MNH/mode_mnh_zwork.f90
+++ b/src/MNH/mode_mnh_zwork.f90
@@ -54,23 +54,23 @@ MODULE MODE_MNH_ZWORK
 
   TYPE(TMODEL) , DIMENSION(10) :: MODEL
 
-  INTEGER, parameter                        :: JPMAX_T3D_G = 12
+  INTEGER, parameter                        :: JPMAX_T3D_G = 1
   INTEGER , ALLOCATABLE, DIMENSION (:)      :: NT3D_POOL_G
   INTEGER                                   :: NT3D_TOP_G , NT3D_TOP_G_MAX = 0  
   LOGICAL,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:,:,:)       :: GT3D
   LOGICAL,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:)           :: GT2D_OSIZE
 
-  INTEGER, parameter                        :: JPMAX_T3D_I = 4
+  INTEGER, parameter                        :: JPMAX_T3D_I = 1
   INTEGER , ALLOCATABLE, DIMENSION (:)      :: NT3D_POOL_I
   INTEGER                                   :: NT3D_TOP_I , NT3D_TOP_I_MAX = 0  
   INTEGER,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:,:,:)       :: IT3D
 
-  INTEGER, parameter                        :: JPMAX_T1D_R = 60
+  INTEGER, parameter                        :: JPMAX_T1D_R = 10
   INTEGER , ALLOCATABLE, DIMENSION (:)      :: NT1D_POOL_R
   INTEGER                                   :: NT1D_TOP_R , NT1D_TOP_R_MAX = 0  
   REAL,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:)       :: ZT1D 
   
-  INTEGER, parameter                        :: JPMAX_T1D_I = 30
+  INTEGER, parameter                        :: JPMAX_T1D_I = 1
   INTEGER , ALLOCATABLE, DIMENSION (:)      :: NT1D_POOL_I
   INTEGER                                   :: NT1D_TOP_I , NT1D_TOP_I_MAX = 0  
   INTEGER,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:,:)       :: IT1D
@@ -104,7 +104,7 @@ MODULE MODE_MNH_ZWORK
 
 
   !------ Integer 1DFLAT pool
-  INTEGER, PARAMETER                                 :: JPMAX_T1DFLAT_I = 10       !Used to determine max size of buffer IT1DFLAT
+  INTEGER, PARAMETER                                 :: JPMAX_T1DFLAT_I = 30       !Used to determine max size of buffer IT1DFLAT
                                                                                    !(3D size of the mesh * JPMAX_T1DFLAT_I)
   INTEGER,                SAVE                       :: NPMAX_POOL_T1DFLAT_I = 100 !Maximum size of the pool (max number of arrays)
   INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: NT1DFLAT_POOL_I   !Position in ZT1DFLAT of the beginning of each array
@@ -128,7 +128,7 @@ MODULE MODE_MNH_ZWORK
 
 
 !------ Real 1DFLAT pool
-  INTEGER, PARAMETER                                 :: JPMAX_T1DFLAT_R = 60       !Used to determine max size of buffer ZT1DFLAT
+  INTEGER, PARAMETER                                 :: JPMAX_T1DFLAT_R = 80       !Used to determine max size of buffer ZT1DFLAT
                                                                                    !(3D size of the mesh * JPMAX_T1DFLAT_R)
   INTEGER,                SAVE                       :: NPMAX_POOL_T1DFLAT_R = 100 !Maximum size of the pool (max number of arrays)
   INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: NT1DFLAT_POOL_R   !Position in ZT1DFLAT of the beginning of each array
@@ -1814,6 +1814,7 @@ CONTAINS
     Write( cmnhmsg(4), "( '    2D     = ', I20 )" ) NTOT_ALLOCSIZE_GT2DFLAT
     Write( cmnhmsg(5), "( '    3D     = ', I20 )" ) NTOT_ALLOCSIZE_GT3DFLAT
     Write( cmnhmsg(6), "( '  Released = ', I20 )" ) NTOT_RELSIZE_GT1DFLAT
+    Write( cmnhmsg(7), "( '-------------', '--------------------' )" )
     call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
 
 
@@ -1838,6 +1839,7 @@ CONTAINS
     Write( cmnhmsg(4), "( '    2D     = ', I20 )" ) NTOT_ALLOCSIZE_IT2DFLAT
     Write( cmnhmsg(5), "( '    3D     = ', I20 )" ) NTOT_ALLOCSIZE_IT3DFLAT
     Write( cmnhmsg(6), "( '  Released = ', I20 )" ) NTOT_RELSIZE_IT1DFLAT
+    Write( cmnhmsg(7), "( '-------------', '--------------------' )" )
     call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
 
 
@@ -1864,6 +1866,7 @@ CONTAINS
     Write( cmnhmsg(5), "( '    3D     = ', I20 )" ) NTOT_ALLOCSIZE_ZT3DFLAT
     Write( cmnhmsg(6), "( '    4D     = ', I20 )" ) NTOT_ALLOCSIZE_ZT4DFLAT
     Write( cmnhmsg(7), "( '  Released = ', I20 )" ) NTOT_RELSIZE_ZT1DFLAT
+    Write( cmnhmsg(8), "( '-------------', '--------------------' )" )
     call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
 
   END SUBROUTINE PRINT_FLATPOOL_STATS
diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90
index 492fa71f0..0a898573e 100644
--- a/src/MNH/mode_prandtl.f90
+++ b/src/MNH/mode_prandtl.f90
@@ -16,7 +16,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
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_FLAT , MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT
 #endif
 
 #ifdef MNH_BITREP
@@ -47,7 +47,7 @@ INTEGER ::  IZCOEF
 #endif
 
 #ifdef MNH_OPENACC
- IZCOEF = MNH_ALLOCATE_ZT3D( ZCOEF , SIZE(PF,1),SIZE(PF,2),SIZE(PF,3) )
+ IZCOEF = MNH_ALLOCATE_FLAT( ZCOEF , SIZE(PF,1),SIZE(PF,2),SIZE(PF,3) )
 #endif
 
 !$acc data present( PPHI3, PF_LIM, PF ) present( ZCOEF )
@@ -68,7 +68,7 @@ PF(:,:,:) =     ZCOEF(:,:,:)   * PF    &
 !$acc end data
 
 #ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D(IZCOEF)
+CALL MNH_RELEASE_FLAT(IZCOEF)
 #endif
 
 END SUBROUTINE SMOOTH_TURB_FUNCT
@@ -115,9 +115,9 @@ allocate( zw1      ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 )
 allocate( zw2      ( 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 )
+izw1        = MNH_ALLOCATE_FLAT( zw1       , JIU,JJU,JKU )
+izw2        = MNH_ALLOCATE_FLAT( zw2       , JIU,JJU,JKU )
+igphi3logic = MNH_ALLOCATE_FLAT( gphi3logic, JIU,JJU,JKU )
 #endif
 
 !$acc data present( zw1, zw2, gphi3logic )
@@ -190,8 +190,8 @@ PPHI3(:,:,IKE+1)=PPHI3(:,:,IKE)
 #ifndef MNH_OPENACC
 deallocate ( zw1,zw2,gphi3logic)
 #else
-CALL MNH_REL_ZT3D(IZW1,IZW2)
-CALL MNH_REL_GT3D(IGPHI3LOGIC)
+CALL MNH_RELEASE_FLAT(IZW1,IZW2)
+CALL MNH_REL_GT1DFLAT(IGPHI3LOGIC)
 #endif
 
 !$acc end data
@@ -232,7 +232,7 @@ SUBROUTINE PSI_SV(PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3,PPSI_SV)
 #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 ) )
+igpsilogic = MNH_ALLOCATE_FLAT( gpsilogic , size( pred2ths, 1 ), size( pred2ths, 2 ), size( pred2ths, 3 ) )
 #endif  
 
 !$acc data present( gpsilogic )
@@ -269,7 +269,7 @@ END DO
 #ifndef MNH_OPENACC
 deallocate( gpsilogic )
 #else
-CALL MNH_REL_GT3D(IGPSILOGIC)
+CALL MNH_REL_GT1DFLAT(IGPSILOGIC)
 #endif
 
 !$acc end data
@@ -469,7 +469,7 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU
 !$acc data present( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, PDTDZ, PD_PHI3DTDZ2_O_DDTDZ )
 
 #ifdef MNH_OPENACC
-iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device, size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) )
 #endif
 
 !$acc data present( ztmp1_device )
@@ -547,7 +547,7 @@ PD_PHI3DTDZ2_O_DDTDZ(:,:,IKE+1)=PD_PHI3DTDZ2_O_DDTDZ(:,:,IKE)
 !$acc end data
 
 #ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D( iztmp1_device )
+CALL MNH_RELEASE_FLAT( iztmp1_device )
 #endif
 
 !$acc end data
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index de3e496b0..b75a4f185 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -579,8 +579,8 @@ allocate( ZRVS  (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
 allocate( ZRWS  (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
 allocate( ZPABST(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
 #else
-IZRWS   = MNH_ALLOCATE_FLAT( ZRWS,   1, SIZE( XTHT, 1 ), 1, SIZE( XTHT, 2 ), 1, SIZE( XTHT, 3 ) )
-IZPABST = MNH_ALLOCATE_FLAT( ZPABST, 1, SIZE( XTHT, 1 ), 1, SIZE( XTHT, 2 ), 1, SIZE( XTHT, 3 ) )
+IZRWS   = MNH_ALLOCATE_FLAT( ZRWS,   SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 ) )
+IZPABST = MNH_ALLOCATE_FLAT( ZPABST, SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 ) )
 IZSEA = -1  !Set to -1 because not (yet) allocated
 IZTOWN = -1 !Set to -1 because not (yet) allocated
 #endif
@@ -1941,8 +1941,8 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
     ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
     ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
 #else
-    IZSEA  = MNH_ALLOCATE_FLAT( ZSEA,  1, SIZE( XRHODJ, 1 ), 1, SIZE( XRHODJ, 2 ) )
-    IZTOWN = MNH_ALLOCATE_FLAT( ZTOWN, 1, SIZE( XRHODJ, 1 ), 1, SIZE( XRHODJ, 2 ) )
+    IZSEA  = MNH_ALLOCATE_FLAT( ZSEA,  SIZE( XRHODJ, 1 ), SIZE( XRHODJ, 2 ) )
+    IZTOWN = MNH_ALLOCATE_FLAT( ZTOWN, SIZE( XRHODJ, 1 ), SIZE( XRHODJ, 2 ) )
 #endif
     CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
 !$acc update device( ZSEA, ZTOWN )
@@ -2056,8 +2056,8 @@ IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN
     ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
     ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
 #else
-    IZSEA  = MNH_ALLOCATE_FLAT( ZSEA,  1, SIZE( XRHODJ, 1 ), 1, SIZE( XRHODJ, 2 ) )
-    IZTOWN = MNH_ALLOCATE_FLAT( ZTOWN, 1, SIZE( XRHODJ, 1 ), 1, SIZE( XRHODJ, 2 ) )
+    IZSEA  = MNH_ALLOCATE_FLAT( ZSEA,  SIZE( XRHODJ, 1 ), SIZE( XRHODJ, 2 ) )
+    IZTOWN = MNH_ALLOCATE_FLAT( ZTOWN, SIZE( XRHODJ, 1 ), SIZE( XRHODJ, 2 ) )
 #endif
     CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
     CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD,                     &
diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90
index d87bca878..41ebf0536 100644
--- a/src/MNH/prandtl.f90
+++ b/src/MNH/prandtl.f90
@@ -219,8 +219,7 @@ 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
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -337,17 +336,16 @@ JKU =  size( pthlm, 3 )
 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 )
+izw1 = MNH_ALLOCATE_FLAT( zw1, JIU,JJU,JKU )
+izw2 = MNH_ALLOCATE_FLAT( zw2, JIU,JJU,JKU )
 #endif
 
 #ifdef MNH_OPENACC
-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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU,JJU,JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU,JJU,JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU,JJU,JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU,JJU,JKU )
+iztmp5_device = MNH_ALLOCATE_FLAT( ztmp5_device, JIU,JJU,JKU )
 #endif
 
 !$acc data present( zw1, zw2, ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device )
@@ -1265,8 +1263,7 @@ 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")
+CALL MNH_RELEASE_FLAT( IZW1, IZW2, IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, IZTMP5_DEVICE )
 #else
 DEALLOCATE(ZW1,ZW2)
 #endif
diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90
index ff06abb2e..4e6708e61 100644
--- a/src/MNH/rain_ice.f90
+++ b/src/MNH/rain_ice.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -255,9 +255,7 @@ USE MODI_BITREP
 #endif
 USE MODI_ICE4_RAINFR_VERT
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT1DP , MNH_REL_ZT1D , &
-                            MNH_ALLOCATE_GT3D , MNH_REL_GT3D, &
-                            MNH_ALLOCATE_IT1D , MNH_REL_IT1D
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1DFLAT
 #endif
 
 IMPLICIT NONE
@@ -502,9 +500,9 @@ IIJKU = IIU * IJU * IKU
 #ifndef MNH_OPENACC
 ALLOCATE( I1(SIZE(PEXNREF)), I2(SIZE(PEXNREF)), I3(SIZE(PEXNREF)) )
 #else
-II1 = MNH_ALLOCATE_IT1D( I1, IIJKU )
-II2 = MNH_ALLOCATE_IT1D( I2, IIJKU )
-II3 = MNH_ALLOCATE_IT1D( I3, IIJKU )
+II1 = MNH_ALLOCATE_FLAT( I1, IIJKU )
+II2 = MNH_ALLOCATE_FLAT( I2, IIJKU )
+II3 = MNH_ALLOCATE_FLAT( I3, IIJKU )
 #endif
 
 #ifndef MNH_OPENACC
@@ -514,13 +512,13 @@ ALLOCATE( ZRS   (IIU,IJU,IKU) )
 ALLOCATE( ZRG   (IIU,IJU,IKU) )
 ALLOCATE( ZT    (IIU,IJU,IKU) )
 #else
-IGMICRO   = MNH_ALLOCATE_GT3D( GMICRO,  IIU,IJU,IKU )
-IZRR      = MNH_ALLOCATE_ZT3D( ZRR,     IIU,IJU,IKU )
-IZRS      = MNH_ALLOCATE_ZT3D( ZRS,     IIU,IJU,IKU )
-IZRG      = MNH_ALLOCATE_ZT3D( ZRG,     IIU,IJU,IKU )
-IZRS_ZERO = MNH_ALLOCATE_ZT3D( ZRS_ZERO,IIU,IJU,IKU )
-IZRG_ZERO = MNH_ALLOCATE_ZT3D( ZRG_ZERO,IIU,IJU,IKU )
-IZT       = MNH_ALLOCATE_ZT3D( ZT,      IIU,IJU,IKU )
+IGMICRO   = MNH_ALLOCATE_FLAT( GMICRO,  IIU,IJU,IKU )
+IZRR      = MNH_ALLOCATE_FLAT( ZRR,     IIU,IJU,IKU )
+IZRS      = MNH_ALLOCATE_FLAT( ZRS,     IIU,IJU,IKU )
+IZRG      = MNH_ALLOCATE_FLAT( ZRG,     IIU,IJU,IKU )
+IZRS_ZERO = MNH_ALLOCATE_FLAT( ZRS_ZERO,IIU,IJU,IKU )
+IZRG_ZERO = MNH_ALLOCATE_FLAT( ZRG_ZERO,IIU,IJU,IKU )
+IZT       = MNH_ALLOCATE_FLAT( ZT,      IIU,IJU,IKU )
 #endif
 
 !$acc data present( I1, I2, I3, GMICRO, ZRR, ZRS, ZRG, ZRS_ZERO, ZRG_ZERO, ZT )
@@ -654,73 +652,73 @@ IF( IMICRO >= 0 ) THEN
     ALLOCATE(ZRHODJ(0))
   END IF
 #else
-IZRVT  = MNH_ALLOCATE_ZT1DP(ZRVT,IMICRO)
-IZRCT  = MNH_ALLOCATE_ZT1DP(ZRCT,IMICRO)
-IZRRT  = MNH_ALLOCATE_ZT1DP(ZRRT,IMICRO)
-IZRIT  = MNH_ALLOCATE_ZT1DP(ZRIT,IMICRO)
-IZRST  = MNH_ALLOCATE_ZT1DP(ZRST,IMICRO)
-IZRGT  = MNH_ALLOCATE_ZT1DP(ZRGT,IMICRO)
+IZRVT  = MNH_ALLOCATE_FLAT(ZRVT,IMICRO)
+IZRCT  = MNH_ALLOCATE_FLAT(ZRCT,IMICRO)
+IZRRT  = MNH_ALLOCATE_FLAT(ZRRT,IMICRO)
+IZRIT  = MNH_ALLOCATE_FLAT(ZRIT,IMICRO)
+IZRST  = MNH_ALLOCATE_FLAT(ZRST,IMICRO)
+IZRGT  = MNH_ALLOCATE_FLAT(ZRGT,IMICRO)
   IF ( KRR == 7 ) THEN
-IZRHT    = MNH_ALLOCATE_ZT1DP(ZRHT,IMICRO)
+IZRHT    = MNH_ALLOCATE_FLAT(ZRHT,IMICRO)
   ELSE
-IZRHT    = MNH_ALLOCATE_ZT1DP(ZRHT,0)
+IZRHT    = MNH_ALLOCATE_FLAT(ZRHT,0)
   END IF
-IZCIT  = MNH_ALLOCATE_ZT1DP(ZCIT,IMICRO)
-IZRVS  = MNH_ALLOCATE_ZT1DP(ZRVS,IMICRO)
-IZRCS  = MNH_ALLOCATE_ZT1DP(ZRCS,IMICRO)
-IZRRS  = MNH_ALLOCATE_ZT1DP(ZRRS,IMICRO)
-IZRIS  = MNH_ALLOCATE_ZT1DP(ZRIS,IMICRO)
-IZRSS  = MNH_ALLOCATE_ZT1DP(ZRSS,IMICRO)
-IZRGS  = MNH_ALLOCATE_ZT1DP(ZRGS,IMICRO)
+IZCIT  = MNH_ALLOCATE_FLAT(ZCIT,IMICRO)
+IZRVS  = MNH_ALLOCATE_FLAT(ZRVS,IMICRO)
+IZRCS  = MNH_ALLOCATE_FLAT(ZRCS,IMICRO)
+IZRRS  = MNH_ALLOCATE_FLAT(ZRRS,IMICRO)
+IZRIS  = MNH_ALLOCATE_FLAT(ZRIS,IMICRO)
+IZRSS  = MNH_ALLOCATE_FLAT(ZRSS,IMICRO)
+IZRGS  = MNH_ALLOCATE_FLAT(ZRGS,IMICRO)
   IF ( KRR == 7 ) THEN
-IZRHS    = MNH_ALLOCATE_ZT1DP(ZRHS,IMICRO)
+IZRHS    = MNH_ALLOCATE_FLAT(ZRHS,IMICRO)
   ELSE
-IZRHS    = MNH_ALLOCATE_ZT1DP(ZRHS,0)
+IZRHS    = MNH_ALLOCATE_FLAT(ZRHS,0)
   END IF
-IZTHS  = MNH_ALLOCATE_ZT1DP(ZTHS,IMICRO)
-IZTHT  = MNH_ALLOCATE_ZT1DP(ZTHT,IMICRO)
-IZTHLT  = MNH_ALLOCATE_ZT1DP(ZTHLT,IMICRO)
-IZRHODREF  = MNH_ALLOCATE_ZT1DP(ZRHODREF,IMICRO)
-IZZT  = MNH_ALLOCATE_ZT1DP(ZZT,IMICRO)
-IZPRES  = MNH_ALLOCATE_ZT1DP(ZPRES,IMICRO)
-IZEXNREF  = MNH_ALLOCATE_ZT1DP(ZEXNREF,IMICRO)
-IZSIGMA_RC  = MNH_ALLOCATE_ZT1DP(ZSIGMA_RC,IMICRO)
-IZCF  = MNH_ALLOCATE_ZT1DP(ZCF,IMICRO)
-IZRF  = MNH_ALLOCATE_ZT1DP(ZRF,IMICRO)
-IZHLC_HCF  = MNH_ALLOCATE_ZT1DP(ZHLC_HCF,IMICRO)
-IZHLC_LCF  = MNH_ALLOCATE_ZT1DP(ZHLC_LCF,IMICRO)
-IZHLC_HRC  = MNH_ALLOCATE_ZT1DP(ZHLC_HRC,IMICRO)
-IZHLC_LRC  = MNH_ALLOCATE_ZT1DP(ZHLC_LRC,IMICRO)
-IZHLC_RCMAX  = MNH_ALLOCATE_ZT1DP(ZHLC_RCMAX,IMICRO)
-IZRCRAUTC  = MNH_ALLOCATE_ZT1DP(ZRCRAUTC,IMICRO)
-IZHLC_HRCLOCAL  = MNH_ALLOCATE_ZT1DP(ZHLC_HRCLOCAL,IMICRO)
-IZHLC_LRCLOCAL  = MNH_ALLOCATE_ZT1DP(ZHLC_LRCLOCAL,IMICRO)
-!
-IZZW  = MNH_ALLOCATE_ZT1DP(ZZW,IMICRO)
-IZLSFACT  = MNH_ALLOCATE_ZT1DP(ZLSFACT,IMICRO)
-IZLVFACT  = MNH_ALLOCATE_ZT1DP(ZLVFACT,IMICRO)
-IZUSW  = MNH_ALLOCATE_ZT1DP(ZUSW,IMICRO)
-IZSSI  = MNH_ALLOCATE_ZT1DP(ZSSI,IMICRO)
-IZLBDAR  = MNH_ALLOCATE_ZT1DP(ZLBDAR,IMICRO)
-IZLBDAR_RF  = MNH_ALLOCATE_ZT1DP(ZLBDAR_RF,IMICRO)
-IZLBDAS  = MNH_ALLOCATE_ZT1DP(ZLBDAS,IMICRO)
-IZLBDAG  = MNH_ALLOCATE_ZT1DP(ZLBDAG,IMICRO)
+IZTHS  = MNH_ALLOCATE_FLAT(ZTHS,IMICRO)
+IZTHT  = MNH_ALLOCATE_FLAT(ZTHT,IMICRO)
+IZTHLT  = MNH_ALLOCATE_FLAT(ZTHLT,IMICRO)
+IZRHODREF  = MNH_ALLOCATE_FLAT(ZRHODREF,IMICRO)
+IZZT  = MNH_ALLOCATE_FLAT(ZZT,IMICRO)
+IZPRES  = MNH_ALLOCATE_FLAT(ZPRES,IMICRO)
+IZEXNREF  = MNH_ALLOCATE_FLAT(ZEXNREF,IMICRO)
+IZSIGMA_RC  = MNH_ALLOCATE_FLAT(ZSIGMA_RC,IMICRO)
+IZCF  = MNH_ALLOCATE_FLAT(ZCF,IMICRO)
+IZRF  = MNH_ALLOCATE_FLAT(ZRF,IMICRO)
+IZHLC_HCF  = MNH_ALLOCATE_FLAT(ZHLC_HCF,IMICRO)
+IZHLC_LCF  = MNH_ALLOCATE_FLAT(ZHLC_LCF,IMICRO)
+IZHLC_HRC  = MNH_ALLOCATE_FLAT(ZHLC_HRC,IMICRO)
+IZHLC_LRC  = MNH_ALLOCATE_FLAT(ZHLC_LRC,IMICRO)
+IZHLC_RCMAX  = MNH_ALLOCATE_FLAT(ZHLC_RCMAX,IMICRO)
+IZRCRAUTC  = MNH_ALLOCATE_FLAT(ZRCRAUTC,IMICRO)
+IZHLC_HRCLOCAL  = MNH_ALLOCATE_FLAT(ZHLC_HRCLOCAL,IMICRO)
+IZHLC_LRCLOCAL  = MNH_ALLOCATE_FLAT(ZHLC_LRCLOCAL,IMICRO)
+!
+IZZW  = MNH_ALLOCATE_FLAT(ZZW,IMICRO)
+IZLSFACT  = MNH_ALLOCATE_FLAT(ZLSFACT,IMICRO)
+IZLVFACT  = MNH_ALLOCATE_FLAT(ZLVFACT,IMICRO)
+IZUSW  = MNH_ALLOCATE_FLAT(ZUSW,IMICRO)
+IZSSI  = MNH_ALLOCATE_FLAT(ZSSI,IMICRO)
+IZLBDAR  = MNH_ALLOCATE_FLAT(ZLBDAR,IMICRO)
+IZLBDAR_RF  = MNH_ALLOCATE_FLAT(ZLBDAR_RF,IMICRO)
+IZLBDAS  = MNH_ALLOCATE_FLAT(ZLBDAS,IMICRO)
+IZLBDAG  = MNH_ALLOCATE_FLAT(ZLBDAG,IMICRO)
   IF ( KRR == 7 ) THEN
-IZLBDAH    = MNH_ALLOCATE_ZT1DP(ZLBDAH,IMICRO)
+IZLBDAH    = MNH_ALLOCATE_FLAT(ZLBDAH,IMICRO)
   ELSE
-IZLBDAH    = MNH_ALLOCATE_ZT1DP(ZLBDAH,0)
+IZLBDAH    = MNH_ALLOCATE_FLAT(ZLBDAH,0)
   END IF
-IZRDRYG  = MNH_ALLOCATE_ZT1DP(ZRDRYG,IMICRO)
-IZRWETG  = MNH_ALLOCATE_ZT1DP(ZRWETG,IMICRO)
-IZAI  = MNH_ALLOCATE_ZT1DP(ZAI,IMICRO)
-IZCJ  = MNH_ALLOCATE_ZT1DP(ZCJ,IMICRO)
-IZKA  = MNH_ALLOCATE_ZT1DP(ZKA,IMICRO)
-IZDV  = MNH_ALLOCATE_ZT1DP(ZDV,IMICRO)
+IZRDRYG  = MNH_ALLOCATE_FLAT(ZRDRYG,IMICRO)
+IZRWETG  = MNH_ALLOCATE_FLAT(ZRWETG,IMICRO)
+IZAI  = MNH_ALLOCATE_FLAT(ZAI,IMICRO)
+IZCJ  = MNH_ALLOCATE_FLAT(ZCJ,IMICRO)
+IZKA  = MNH_ALLOCATE_FLAT(ZKA,IMICRO)
+IZDV  = MNH_ALLOCATE_FLAT(ZDV,IMICRO)
 !
   IF (LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) THEN
-IZRHODJ    = MNH_ALLOCATE_ZT1DP(ZRHODJ,IMICRO)
+IZRHODJ    = MNH_ALLOCATE_FLAT(ZRHODJ,IMICRO)
   ELSE
-IZRHODJ    = MNH_ALLOCATE_ZT1DP(ZRHODJ,0)
+IZRHODJ    = MNH_ALLOCATE_FLAT(ZRHODJ,0)
   END IF
 #endif
  
@@ -1238,14 +1236,14 @@ IZRHODJ    = MNH_ALLOCATE_ZT1DP(ZRHODJ,0)
   DEALLOCATE(ZHLC_HRCLOCAL)
   DEALLOCATE(ZHLC_LRCLOCAL)
 #else
-  CALL MNH_REL_ZT1D(IZKA,IZDV,IZRHODJ)
-  CALL MNH_REL_ZT1D(IZLBDAS,IZLBDAG,IZLBDAH,IZRDRYG,IZRWETG,IZAI,IZCJ)
-  CALL MNH_REL_ZT1D(IZZW,IZLSFACT,IZLVFACT,IZUSW,IZSSI,IZLBDAR,IZLBDAR_RF)
-  CALL MNH_REL_ZT1D(IZRCRAUTC,IZHLC_HRCLOCAL,IZHLC_LRCLOCAL)
-  CALL MNH_REL_ZT1D(IZHLC_HCF,IZHLC_LCF,IZHLC_HRC,IZHLC_LRC,IZHLC_RCMAX)
-  CALL MNH_REL_ZT1D(IZRHODREF,IZZT,IZPRES,IZEXNREF,IZSIGMA_RC,IZCF,IZRF)
-  CALL MNH_REL_ZT1D(IZRVS,IZRCS,IZRRS,IZRIS,IZRSS,IZRGS,IZRHS,IZTHS,IZTHT,IZTHLT)
-  CALL MNH_REL_ZT1D(IZRVT,IZRCT,IZRRT,IZRIT,IZRST,IZRGT,IZRHT,IZCIT)
+  CALL MNH_RELEASE_FLAT(IZKA,IZDV,IZRHODJ)
+  CALL MNH_RELEASE_FLAT(IZLBDAS,IZLBDAG,IZLBDAH,IZRDRYG,IZRWETG,IZAI,IZCJ)
+  CALL MNH_RELEASE_FLAT(IZZW,IZLSFACT,IZLVFACT,IZUSW,IZSSI,IZLBDAR,IZLBDAR_RF)
+  CALL MNH_RELEASE_FLAT(IZRCRAUTC,IZHLC_HRCLOCAL,IZHLC_LRCLOCAL)
+  CALL MNH_RELEASE_FLAT(IZHLC_HCF,IZHLC_LCF,IZHLC_HRC,IZHLC_LRC,IZHLC_RCMAX)
+  CALL MNH_RELEASE_FLAT(IZRHODREF,IZZT,IZPRES,IZEXNREF,IZSIGMA_RC,IZCF,IZRF)
+  CALL MNH_RELEASE_FLAT(IZRVS,IZRCS,IZRRS,IZRIS,IZRSS,IZRGS,IZRHS,IZTHS,IZTHT,IZTHLT)
+  CALL MNH_RELEASE_FLAT(IZRVT,IZRCT,IZRRT,IZRIT,IZRST,IZRGT,IZRHT,IZCIT)
 #endif
 END IF
 !
@@ -1312,9 +1310,11 @@ END IF
 DEALLOCATE ( I1,I2,I3 )
 DEALLOCATE ( GMICRO, ZRR, ZRS, ZRG, ZT )
 #else
-CALL MNH_REL_IT1D(II1, II2, II3)
-CALL MNH_REL_GT3D ( IGMICRO )
-CALL MNH_REL_ZT3D ( IZRR, IZRS, IZRG, IZRS_ZERO, IZRG_ZERO, IZT )
+CALL MNH_REL_IT1DFLAT( II3 )
+CALL MNH_REL_IT1DFLAT( II2 )
+CALL MNH_REL_IT1DFLAT( II1 )
+CALL MNH_REL_GT1DFLAT ( IGMICRO )
+CALL MNH_RELEASE_FLAT( IZRR, IZRS, IZRG, IZRS_ZERO, IZRG_ZERO, IZT )
 #endif
 
 !$acc end data
diff --git a/src/MNH/rain_ice_nucleation.f90 b/src/MNH/rain_ice_nucleation.f90
index 4fcdd4718..494f012b1 100644
--- a/src/MNH/rain_ice_nucleation.f90
+++ b/src/MNH/rain_ice_nucleation.f90
@@ -46,9 +46,7 @@ use modi_bitrep
 #endif
 
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT1DP , MNH_REL_ZT1D , &
-                            MNH_ALLOCATE_GT3D , MNH_REL_GT3D, &
-                            MNH_ALLOCATE_IT1D ,MNH_ALLOCATE_IT1DP , MNH_REL_IT1D  
+USE MODE_MNH_ZWORK,       ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1DFLAT
 #endif
 
 IMPLICIT NONE
@@ -157,11 +155,11 @@ allocate( i3( JIJKU ) )
 allocate( gnegt( JIU,JJU,JKU ) )
 allocate( zw   ( JIU,JJU,JKU ) )
 #else
-II1 = MNH_ALLOCATE_IT1D( i1, JIJKU )
-II2 = MNH_ALLOCATE_IT1D( i2, JIJKU )
-II3 = MNH_ALLOCATE_IT1D( i3, JIJKU )
-IGNEGT = MNH_ALLOCATE_GT3D( gnegt, JIU,JJU,JKU  )
-IZW = MNH_ALLOCATE_ZT3D( zw   , JIU,JJU,JKU  )
+II1 = MNH_ALLOCATE_FLAT( i1, JIJKU )
+II2 = MNH_ALLOCATE_FLAT( i2, JIJKU )
+II3 = MNH_ALLOCATE_FLAT( i3, JIJKU )
+IGNEGT = MNH_ALLOCATE_FLAT( gnegt, JIU,JJU,JKU )
+IZW =    MNH_ALLOCATE_FLAT( zw   , JIU,JJU,JKU )
 #endif
 
 !$acc data present( i1, i2, i3, gnegt, zw )
@@ -205,13 +203,13 @@ IF( INEGT >= 1 ) THEN
   ALLOCATE(ZUSW(INEGT))
   ALLOCATE(ZSSI(INEGT))
 #else
-  IZRVT   = MNH_ALLOCATE_ZT1DP(ZRVT,INEGT) 
-  IZCIT   = MNH_ALLOCATE_ZT1DP(ZCIT,INEGT) 
-  IZZT    = MNH_ALLOCATE_ZT1DP(ZZT,INEGT)  
-  IZPRES  = MNH_ALLOCATE_ZT1DP(ZPRES,INEGT)
-  IZZW    = MNH_ALLOCATE_ZT1DP(ZZW,INEGT)
-  IZUSW   = MNH_ALLOCATE_ZT1DP(ZUSW,INEGT)
-  IZSSI   = MNH_ALLOCATE_ZT1DP(ZSSI,INEGT)  
+  IZRVT   = MNH_ALLOCATE_FLAT( ZRVT,  INEGT )
+  IZCIT   = MNH_ALLOCATE_FLAT( ZCIT,  INEGT )
+  IZZT    = MNH_ALLOCATE_FLAT( ZZT,   INEGT )
+  IZPRES  = MNH_ALLOCATE_FLAT( ZPRES, INEGT )
+  IZZW    = MNH_ALLOCATE_FLAT( ZZW,   INEGT )
+  IZUSW   = MNH_ALLOCATE_FLAT( ZUSW,  INEGT )
+  IZSSI   = MNH_ALLOCATE_FLAT( ZSSI,  INEGT )
 #endif
   
 !$acc data present( zrvt, zcit, zzt, zpres, zzw, zusw, zssi )
@@ -350,7 +348,7 @@ END IF
   DEALLOCATE(ZCIT)
   DEALLOCATE(ZRVT)
 #else
-  CALL MNH_REL_ZT1D(izrvt, izcit, izzt, izpres, izzw, izusw, izssi)
+  CALL MNH_RELEASE_FLAT( izrvt, izcit, izzt, izpres, izzw, izusw, izssi )
 #endif  
   
 END IF
@@ -374,9 +372,11 @@ END IF
 #ifndef MNH_OPENACC
 deallocate (i1, i2, i3, gnegt, zw )
 #else
-CALL MNH_REL_IT1D(ii1, ii2, ii3)
-CALL MNH_REL_GT3D(IGNEGT)
-CALL MNH_REL_ZT3D(IZW)
+CALL MNH_REL_IT1DFLAT( ii3 )
+CALL MNH_REL_IT1DFLAT( ii2 )
+CALL MNH_REL_IT1DFLAT( ii1 )
+CALL MNH_REL_GT1DFLAT( IGNEGT )
+CALL MNH_RELEASE_FLAT( IZW )
 #endif
 !$acc end data
 
diff --git a/src/MNH/rain_ice_sedimentation_split.f90 b/src/MNH/rain_ice_sedimentation_split.f90
index 38f7f55e3..39ab2ffd7 100644
--- a/src/MNH/rain_ice_sedimentation_split.f90
+++ b/src/MNH/rain_ice_sedimentation_split.f90
@@ -52,9 +52,7 @@ USE MODI_BITREP
 #endif
 
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_ALLOCATE_ZT2D, MNH_REL_ZT3D, MNH_ALLOCATE_ZT1DP , MNH_REL_ZT1D , &
-                            MNH_ALLOCATE_GT3D , MNH_ALLOCATE_GT2D, MNH_REL_GT3D, &
-                            MNH_ALLOCATE_IT1D , MNH_REL_IT1D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1DFLAT
 #endif
 
 IMPLICIT NONE
@@ -217,24 +215,24 @@ ALLOCATE( II1(IIJKU), II2(IIJKU), II3(IIJKU) )
 ALLOCATE( IG1(IIJKU), IG2(IIJKU), IG3(IIJKU) )
 ALLOCATE( IH1(IIJKU), IH2(IIJKU), IH3(IIJKU) )
 #else
-IIC1 = MNH_ALLOCATE_IT1D(IC1,IIJKU)
-IIC2 = MNH_ALLOCATE_IT1D(IC2,IIJKU)
-IIC3 = MNH_ALLOCATE_IT1D(IC3,IIJKU)
-IIR1 = MNH_ALLOCATE_IT1D(IR1,IIJKU)
-IIR2 = MNH_ALLOCATE_IT1D(IR2,IIJKU)
-IIR3 = MNH_ALLOCATE_IT1D(IR3,IIJKU)
-IIS1 = MNH_ALLOCATE_IT1D(IS1,IIJKU)
-IIS2 = MNH_ALLOCATE_IT1D(IS2,IIJKU)
-IIS3 = MNH_ALLOCATE_IT1D(IS3,IIJKU)
-III1 = MNH_ALLOCATE_IT1D(II1,IIJKU)
-III2 = MNH_ALLOCATE_IT1D(II2,IIJKU)
-III3 = MNH_ALLOCATE_IT1D(II3,IIJKU) 
-IIG1 = MNH_ALLOCATE_IT1D(IG1,IIJKU)
-IIG2 = MNH_ALLOCATE_IT1D(IG2,IIJKU)
-IIG3 = MNH_ALLOCATE_IT1D(IG3,IIJKU)
-IIH1 = MNH_ALLOCATE_IT1D(IH1,IIJKU)
-IIH2 = MNH_ALLOCATE_IT1D(IH2,IIJKU)
-IIH3 = MNH_ALLOCATE_IT1D(IH3,IIJKU)
+IIC1 = MNH_ALLOCATE_FLAT(IC1,IIJKU)
+IIC2 = MNH_ALLOCATE_FLAT(IC2,IIJKU)
+IIC3 = MNH_ALLOCATE_FLAT(IC3,IIJKU)
+IIR1 = MNH_ALLOCATE_FLAT(IR1,IIJKU)
+IIR2 = MNH_ALLOCATE_FLAT(IR2,IIJKU)
+IIR3 = MNH_ALLOCATE_FLAT(IR3,IIJKU)
+IIS1 = MNH_ALLOCATE_FLAT(IS1,IIJKU)
+IIS2 = MNH_ALLOCATE_FLAT(IS2,IIJKU)
+IIS3 = MNH_ALLOCATE_FLAT(IS3,IIJKU)
+III1 = MNH_ALLOCATE_FLAT(II1,IIJKU)
+III2 = MNH_ALLOCATE_FLAT(II2,IIJKU)
+III3 = MNH_ALLOCATE_FLAT(II3,IIJKU)
+IIG1 = MNH_ALLOCATE_FLAT(IG1,IIJKU)
+IIG2 = MNH_ALLOCATE_FLAT(IG2,IIJKU)
+IIG3 = MNH_ALLOCATE_FLAT(IG3,IIJKU)
+IIH1 = MNH_ALLOCATE_FLAT(IH1,IIJKU)
+IIH2 = MNH_ALLOCATE_FLAT(IH2,IIJKU)
+IIH3 = MNH_ALLOCATE_FLAT(IH3,IIJKU)
 #endif
 #ifndef MNH_OPENACC
 ALLOCATE( GDEP(IIU,IJU) )
@@ -245,13 +243,13 @@ ALLOCATE( GSEDIMS(IIU,IJU,IKU) )
 ALLOCATE( GSEDIMG(IIU,IJU,IKU) )
 ALLOCATE( GSEDIMH(IIU,IJU,IKU) )
 #else
-IGDEP    = MNH_ALLOCATE_GT2D( GDEP,IIU,IJU )
-IGSEDIMR = MNH_ALLOCATE_GT3D( GSEDIMR,IIU,IJU,IKU )
-IGSEDIMC = MNH_ALLOCATE_GT3D( GSEDIMC,IIU,IJU,IKU )
-IGSEDIMI = MNH_ALLOCATE_GT3D( GSEDIMI,IIU,IJU,IKU )
-IGSEDIMS = MNH_ALLOCATE_GT3D( GSEDIMS,IIU,IJU,IKU )
-IGSEDIMG = MNH_ALLOCATE_GT3D( GSEDIMG,IIU,IJU,IKU )
-IGSEDIMH = MNH_ALLOCATE_GT3D( GSEDIMH,IIU,IJU,IKU )
+IGDEP    = MNH_ALLOCATE_FLAT( GDEP,IIU,IJU )
+IGSEDIMR = MNH_ALLOCATE_FLAT( GSEDIMR,IIU,IJU,IKU )
+IGSEDIMC = MNH_ALLOCATE_FLAT( GSEDIMC,IIU,IJU,IKU )
+IGSEDIMI = MNH_ALLOCATE_FLAT( GSEDIMI,IIU,IJU,IKU )
+IGSEDIMS = MNH_ALLOCATE_FLAT( GSEDIMS,IIU,IJU,IKU )
+IGSEDIMG = MNH_ALLOCATE_FLAT( GSEDIMG,IIU,IJU,IKU )
+IGSEDIMH = MNH_ALLOCATE_FLAT( GSEDIMH,IIU,IJU,IKU )
 #endif
 ALLOCATE( ZRTMIN(SIZE(XRTMIN)) )
 #ifndef MNH_OPENACC
@@ -273,22 +271,22 @@ ALLOCATE( ZPRHS  (IIU,IJU,IKU) )
 ALLOCATE( ZW     (IIU,IJU,IKU) )
 ALLOCATE( ZWSED  (IIU,IJU,0:IKU+1) )
 #else
-IZCONC_TMP = MNH_ALLOCATE_ZT2D( ZCONC_TMP,IIU,IJU )
-IZOMPSEA   = MNH_ALLOCATE_ZT2D( ZOMPSEA  ,IIU,IJU )
-IZTMP1_2D  = MNH_ALLOCATE_ZT2D( ZTMP1_2D ,IIU,IJU )
-IZTMP2_2D  = MNH_ALLOCATE_ZT2D( ZTMP2_2D ,IIU,IJU )
-IZTMP3_2D  = MNH_ALLOCATE_ZT2D( ZTMP3_2D ,IIU,IJU )
-IZTMP4_2D  = MNH_ALLOCATE_ZT2D( ZTMP4_2D ,IIU,IJU )
-IZCONC3D   = MNH_ALLOCATE_ZT3D( ZCONC3D,IIU,IJU,IKU )
-IZRAY      = MNH_ALLOCATE_ZT3D( ZRAY   ,IIU,IJU,IKU )
-IZLBC      = MNH_ALLOCATE_ZT3D( ZLBC   ,IIU,IJU,IKU )
-IZFSEDC    = MNH_ALLOCATE_ZT3D( ZFSEDC ,IIU,IJU,IKU )
-IZPRCS     = MNH_ALLOCATE_ZT3D( ZPRCS  ,IIU,IJU,IKU )
-IZPRRS     = MNH_ALLOCATE_ZT3D( ZPRRS  ,IIU,IJU,IKU )
-IZPRSS     = MNH_ALLOCATE_ZT3D( ZPRSS  ,IIU,IJU,IKU )
-IZPRGS     = MNH_ALLOCATE_ZT3D( ZPRGS  ,IIU,IJU,IKU )
-IZPRHS     = MNH_ALLOCATE_ZT3D( ZPRHS  ,IIU,IJU,IKU )
-IZW = MNH_ALLOCATE_ZT3D( ZW     ,IIU,IJU,IKU )
+IZCONC_TMP = MNH_ALLOCATE_FLAT( ZCONC_TMP,IIU,IJU )
+IZOMPSEA   = MNH_ALLOCATE_FLAT( ZOMPSEA  ,IIU,IJU )
+IZTMP1_2D  = MNH_ALLOCATE_FLAT( ZTMP1_2D ,IIU,IJU )
+IZTMP2_2D  = MNH_ALLOCATE_FLAT( ZTMP2_2D ,IIU,IJU )
+IZTMP3_2D  = MNH_ALLOCATE_FLAT( ZTMP3_2D ,IIU,IJU )
+IZTMP4_2D  = MNH_ALLOCATE_FLAT( ZTMP4_2D ,IIU,IJU )
+IZCONC3D   = MNH_ALLOCATE_FLAT( ZCONC3D,IIU,IJU,IKU )
+IZRAY      = MNH_ALLOCATE_FLAT( ZRAY   ,IIU,IJU,IKU )
+IZLBC      = MNH_ALLOCATE_FLAT( ZLBC   ,IIU,IJU,IKU )
+IZFSEDC    = MNH_ALLOCATE_FLAT( ZFSEDC ,IIU,IJU,IKU )
+IZPRCS     = MNH_ALLOCATE_FLAT( ZPRCS  ,IIU,IJU,IKU )
+IZPRRS     = MNH_ALLOCATE_FLAT( ZPRRS  ,IIU,IJU,IKU )
+IZPRSS     = MNH_ALLOCATE_FLAT( ZPRSS  ,IIU,IJU,IKU )
+IZPRGS     = MNH_ALLOCATE_FLAT( ZPRGS  ,IIU,IJU,IKU )
+IZPRHS     = MNH_ALLOCATE_FLAT( ZPRHS  ,IIU,IJU,IKU )
+IZW = MNH_ALLOCATE_FLAT( ZW     ,IIU,IJU,IKU )
 ALLOCATE( ZWSED  (IIU,IJU,0:IKU+1) )
 #endif
 
@@ -765,21 +763,43 @@ END IF
 #ifndef MNH_OPENACC
 DEALLOCATE(IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3)
 #else
-CALL MNH_REL_IT1D(IIC1, IIC2, IIC3, IIR1, IIR2, IIR3, IIS1, IIS2, IIS3,&
-                  III1, III2, III3, IIG1, IIG2, IIG3, IIH1, IIH2, IIH3)
+CALL MNH_REL_IT1DFLAT( IIH3 )
+CALL MNH_REL_IT1DFLAT( IIH2 )
+CALL MNH_REL_IT1DFLAT( IIH1 )
+CALL MNH_REL_IT1DFLAT( IIG3 )
+CALL MNH_REL_IT1DFLAT( IIG2 )
+CALL MNH_REL_IT1DFLAT( IIG1 )
+CALL MNH_REL_IT1DFLAT( III3 )
+CALL MNH_REL_IT1DFLAT( III2 )
+CALL MNH_REL_IT1DFLAT( III1 )
+CALL MNH_REL_IT1DFLAT( IIS3 )
+CALL MNH_REL_IT1DFLAT( IIS2 )
+CALL MNH_REL_IT1DFLAT( IIS1 )
+CALL MNH_REL_IT1DFLAT( IIR3 )
+CALL MNH_REL_IT1DFLAT( IIR2 )
+CALL MNH_REL_IT1DFLAT( IIR1 )
+CALL MNH_REL_IT1DFLAT( IIC3 )
+CALL MNH_REL_IT1DFLAT( IIC2 )
+CALL MNH_REL_IT1DFLAT( IIC1 )
 #endif
 #ifndef MNH_OPENACC
 DEALLOCATE(GDEP, GSEDIMR, GSEDIMC,  GSEDIMI,  GSEDIMS,  GSEDIMG,  GSEDIMH)
 #else
-CALL MNH_REL_GT3D(IGDEP, IGSEDIMR, IGSEDIMC,  IGSEDIMI,  IGSEDIMS,  IGSEDIMG,  IGSEDIMH)
+CALL MNH_REL_GT1DFLAT( IGSEDIMH )
+CALL MNH_REL_GT1DFLAT( IGSEDIMG )
+CALL MNH_REL_GT1DFLAT( IGSEDIMS )
+CALL MNH_REL_GT1DFLAT( IGSEDIMI )
+CALL MNH_REL_GT1DFLAT( IGSEDIMC )
+CALL MNH_REL_GT1DFLAT( IGSEDIMR )
+CALL MNH_REL_GT1DFLAT( IGDEP    )
 #endif
 DEALLOCATE(ZRTMIN)
 #ifndef MNH_OPENACC
 DEALLOCATE(ZCONC_TMP,ZOMPSEA, ZTMP1_2D, ZTMP2_2D, ZTMP3_2D, ZTMP4_2D, ZCONC3D)
 DEALLOCATE(ZRAY, ZLBC, ZFSEDC,ZPRCS, ZPRRS, ZPRSS, ZPRGS, ZPRHS, ZW)
 #else
-CALL MNH_REL_ZT3D(IZRAY, IZLBC, IZFSEDC,IZPRCS, IZPRRS, IZPRSS, IZPRGS, IZPRHS, IZW)
-CALL MNH_REL_ZT3D(IZCONC_TMP,IZOMPSEA, IZTMP1_2D, IZTMP2_2D, IZTMP3_2D, IZTMP4_2D, IZCONC3D)
+CALL MNH_RELEASE_FLAT( IZRAY, IZLBC, IZFSEDC,IZPRCS, IZPRRS, IZPRSS, IZPRGS, IZPRHS, IZW )
+CALL MNH_RELEASE_FLAT( IZCONC_TMP, IZOMPSEA, IZTMP1_2D, IZTMP2_2D, IZTMP3_2D, IZTMP4_2D, IZCONC3D )
 #endif
 DEALLOCATE(ZWSED)
 
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 9cba44767..02b590708 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -339,8 +339,7 @@ USE MODI_SHUMAN_DEVICE
 #endif
 USE MODI_SLOW_TERMS
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D , MNH_ALLOCATE_ZT2D , &
-                            MNH_ALLOCATE_GT3D , MNH_REL_GT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT
 #endif
 !
 IMPLICIT NONE
@@ -610,29 +609,28 @@ allocate ( ZINPRI   ( JIU,JJU ) )
 allocate ( ZTHSSTEP ( SIZE(PTHS,1), SIZE(PTHS,2), SIZE(PTHS,3) ) )
 allocate ( ZRSSTEP  ( SIZE(PRS,1),  SIZE(PRS,2),  SIZE(PRS,3), SIZE(PRS,4) ) )
 #else
-ILLMICRO  = MNH_ALLOCATE_GT3D ( LLMICRO   ,JIU,JJU,JKU )
-IZDZZ     = MNH_ALLOCATE_ZT3D ( ZDZZ      ,JIU,JJU,JKU )
-
+ILLMICRO  = MNH_ALLOCATE_FLAT( LLMICRO   ,JIU,JJU,JKU )
+IZDZZ     = MNH_ALLOCATE_FLAT( ZDZZ      ,JIU,JJU,JKU )
 if ( hcloud == 'ICE3' .or. hcloud == 'ICE4' ) then
-  IZEXN     = MNH_ALLOCATE_ZT3D ( ZEXN    ,JIU,JJU,JKU )
-  IZFPR     = MNH_ALLOCATE_ZT4D ( ZFPR    ,JIU,JJU,JKU,KRR )
+  IZEXN     = MNH_ALLOCATE_FLAT( ZEXN    ,JIU,JJU,JKU )
+  IZFPR     = MNH_ALLOCATE_FLAT( ZFPR    ,JIU,JJU,JKU,KRR )
 else
-  IZEXN     = MNH_ALLOCATE_ZT3D ( ZEXN    ,0,0,0 )
-  IZFPR     = MNH_ALLOCATE_ZT4D ( ZFPR    ,0,0,0,0 )
+  IZEXN     = MNH_ALLOCATE_FLAT( ZEXN    ,0,0,0 )
+  IZFPR     = MNH_ALLOCATE_FLAT( ZFPR    ,0,0,0,0 )
 end if
 
 if ( hcloud == 'LIMA' .and. lptsplit ) then
-  IZICEFR   = MNH_ALLOCATE_ZT3D ( ZICEFR  ,JIU,JJU,JKU )
-  IZPRCFR   = MNH_ALLOCATE_ZT3D ( ZPRCFR  ,JIU,JJU,JKU )
+  IZICEFR   = MNH_ALLOCATE_FLAT( ZICEFR  ,JIU,JJU,JKU )
+  IZPRCFR   = MNH_ALLOCATE_FLAT( ZPRCFR  ,JIU,JJU,JKU )
 else
-  IZICEFR   = MNH_ALLOCATE_ZT3D ( ZICEFR  ,0,0,0 )
-  IZPRCFR   = MNH_ALLOCATE_ZT3D ( ZPRCFR  ,0,0,0 )
+  IZICEFR   = MNH_ALLOCATE_FLAT( ZICEFR  ,0,0,0 )
+  IZPRCFR   = MNH_ALLOCATE_FLAT( ZPRCFR  ,0,0,0 )
 end if
 
-IZZZ      = MNH_ALLOCATE_ZT3D ( ZZZ       ,JIU,JJU,JKU )
-IZINPRI   = MNH_ALLOCATE_ZT2D ( ZINPRI    ,JIU,JJU )
-IZTHSSTEP = MNH_ALLOCATE_ZT3D ( ZTHSSTEP , SIZE(PTHS,1), SIZE(PTHS,2), SIZE(PTHS,3) )
-IZRSSTEP  = MNH_ALLOCATE_ZT4D ( ZRSSTEP  , SIZE(PRS,1),  SIZE(PRS,2), SIZE(PRS,3), SIZE(PRS,4) )
+IZZZ      = MNH_ALLOCATE_FLAT( ZZZ       ,JIU,JJU,JKU )
+IZINPRI   = MNH_ALLOCATE_FLAT( ZINPRI    ,JIU,JJU )
+IZTHSSTEP = MNH_ALLOCATE_FLAT( ZTHSSTEP , SIZE(PTHS,1), SIZE(PTHS,2), SIZE(PTHS,3) )
+IZRSSTEP  = MNH_ALLOCATE_FLAT( ZRSSTEP  , SIZE(PRS,1),  SIZE(PRS,2), SIZE(PRS,3), SIZE(PRS,4) )
 #endif
 
 
@@ -1304,15 +1302,16 @@ deallocate( ZEXN )
 deallocate( ZDZZ )
 deallocate( LLMICRO )
 #else
-CALL MNH_REL_ZT4D(SIZE(PRS,4) , IZRSSTEP )
-CALL MNH_REL_ZT3D ( IZTHSSTEP )
-CALL MNH_REL_ZT3D ( IZINPRI )
-CALL MNH_REL_ZT3D ( IZZZ )
-CALL MNH_REL_ZT3D ( IZICEFR, IZPRCFR )
-CALL MNH_REL_ZT4D ( KRR, IZFPR )
-CALL MNH_REL_ZT3D ( IZDZZ, IZEXN )
-
-CALL MNH_REL_GT3D ( ILLMICRO )
+CALL MNH_RELEASE_FLAT( IZRSSTEP )
+CALL MNH_RELEASE_FLAT( IZTHSSTEP )
+CALL MNH_RELEASE_FLAT( IZINPRI )
+CALL MNH_RELEASE_FLAT( IZZZ )
+CALL MNH_RELEASE_FLAT( IZPRCFR )
+CALL MNH_RELEASE_FLAT( IZICEFR )
+CALL MNH_RELEASE_FLAT( IZFPR )
+CALL MNH_RELEASE_FLAT( IZEXN )
+CALL MNH_RELEASE_FLAT( IZDZZ )
+CALL MNH_REL_GT1DFLAT( ILLMICRO )
 #endif
 
 !$acc end data
diff --git a/src/MNH/sources_neg_correct.f90 b/src/MNH/sources_neg_correct.f90
index eba53946c..e1aca3017 100644
--- a/src/MNH/sources_neg_correct.f90
+++ b/src/MNH/sources_neg_correct.f90
@@ -33,7 +33,7 @@ use modd_param_lima, only: lcold_lima => lcold, lrain_lima => lrain, lspro_lima
 
 use mode_budget,         only: Budget_store_init, Budget_store_end
 #ifdef MNH_OPENACC
-use mode_mnh_zwork,  only: Mnh_allocate_zt3d , Mnh_rel_zt3d
+use mode_mnh_zwork,  only: Mnh_allocate_flat , Mnh_release_flat
 #endif
 use mode_mppdb
 use mode_msg
@@ -173,20 +173,20 @@ else
 end if
 if ( .not. Associated( zcor ) ) Allocate( zcor(0, 0, 0) )
 #else
-izt   = Mnh_allocate_zt3d( zt,   jiu, jju, jku )
-izexn = Mnh_allocate_zt3d( zexn, jiu, jju, jku )
-izlv  = Mnh_allocate_zt3d( zlv,  jiu, jju, jku )
-izcph = Mnh_allocate_zt3d( zcph, jiu, jju, jku )
+izt   = Mnh_allocate_flat( zt,   jiu, jju, jku )
+izexn = Mnh_allocate_flat( zexn, jiu, jju, jku )
+izlv  = Mnh_allocate_flat( zlv,  jiu, jju, jku )
+izcph = Mnh_allocate_flat( zcph, jiu, jju, jku )
 if ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' ) then
-  izls = Mnh_allocate_zt3d( zls, jiu, jju, jku )
+  izls = Mnh_allocate_flat( zls, jiu, jju, jku )
   if ( krr > 3 ) then
-    izcor = Mnh_allocate_zt3d( zcor, jiu, jju, jku )
+    izcor = Mnh_allocate_flat( zcor, jiu, jju, jku )
   else
-    izcor = Mnh_allocate_zt3d( zcor, 0, 0, 0 )
+    izcor = Mnh_allocate_flat( zcor, 0, 0, 0 )
   end if
 else
-  izls  = Mnh_allocate_zt3d( zls,  0, 0, 0 )
-  izcor = Mnh_allocate_zt3d( zcor, 0, 0, 0 )
+  izls  = Mnh_allocate_flat( zls,  0, 0, 0 )
+  izcor = Mnh_allocate_flat( zcor, 0, 0, 0 )
 end if
 #endif
 
@@ -411,7 +411,7 @@ end select CLOUD
 #ifndef MNH_OPENACC
 deallocate( zexn, zlv, zcph, zls, zcor )
 #else
-call Mnh_rel_zt3d ( izt, izexn, izlv, izcph, izls, izcor )
+call Mnh_release_flat ( izt, izexn, izlv, izcph, izls, izcor )
 #endif
 
 if ( hbudname /= 'NECON' .and. hbudname /= 'NEGA' ) then
diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90
index 777745fce..1d427f976 100644
--- a/src/MNH/tke_eps_sources.f90
+++ b/src/MNH/tke_eps_sources.f90
@@ -187,7 +187,7 @@ use mode_budget,         only: Budget_store_add, Budget_store_end, Budget_store_
 USE MODE_EXCHANGE_ll,    ONLY: UPDATE_HALO_ll
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_ZT3D, MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 use mode_mppdb
 !
@@ -315,18 +315,18 @@ 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)
+iza      = MNH_ALLOCATE_FLAT( za     ,JIU,JJU,JKU)
+izres    = MNH_ALLOCATE_FLAT( zres   ,JIU,JJU,JKU)
+izflx    = MNH_ALLOCATE_FLAT( zflx   ,JIU,JJU,JKU)
+izsource = MNH_ALLOCATE_FLAT( zsource,JIU,JJU,JKU)
+izkeff   = MNH_ALLOCATE_FLAT( zkeff  ,JIU,JJU,JKU)
 #endif
 
 #ifdef MNH_OPENACC
-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)
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device,JIU,JJU,JKU)
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device,JIU,JJU,JKU)
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device,JIU,JJU,JKU)
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device,JIU,JJU,JKU)
 #endif
 
 !$acc data present( ZA, ZRES, ZFLX, ZSOURCE, ZKEFF, ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE )
@@ -675,7 +675,7 @@ end if
 #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 )
+CALL MNH_RELEASE_FLAT( IZA, IZRES, IZFLX, IZSOURCE, IZKEFF, IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
 #endif
 
 !$acc end data
diff --git a/src/MNH/tridiag_thermo.f90 b/src/MNH/tridiag_thermo.f90
index 07b817501..b7462995a 100644
--- a/src/MNH/tridiag_thermo.f90
+++ b/src/MNH/tridiag_thermo.f90
@@ -158,8 +158,7 @@ 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
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_FLAT , MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -235,19 +234,18 @@ 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 )
+izrhodj_dfddtdz_o_dz2 = MNH_ALLOCATE_FLAT( zrhodj_dfddtdz_o_dz2, JIU, JJU, JKU )
+izmzm_rhodj           = MNH_ALLOCATE_FLAT( zmzm_rhodj          , JIU, JJU, JKU )
+iza                   = MNH_ALLOCATE_FLAT( za                  , JIU, JJU, JKU )
+izb                   = MNH_ALLOCATE_FLAT( zb                  , JIU, JJU, JKU )
+izc                   = MNH_ALLOCATE_FLAT( zc                  , JIU, JJU, JKU )
+izy                   = MNH_ALLOCATE_FLAT( zy                  , JIU, JJU, JKU )
+izgam                 = MNH_ALLOCATE_FLAT( zgam                , JIU, JJU, JKU )
+izbet                 = MNH_ALLOCATE_FLAT( zbet                , JIU, JJU )
 #endif
 
 #ifdef MNH_OPENACC
-iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( zrhodj_dfddtdz_o_dz2, zmzm_rhodj, za, zb, zc, zy, zgam, zbet, ztmp1_device )
@@ -484,9 +482,8 @@ end if
 #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")
+CALL MNH_RELEASE_FLAT( IZRHODJ_DFDDTDZ_O_DZ2, IZMZM_RHODJ, IZA, IZB, IZC, IZY, IZGAM, &
+                       IZBET, iztmp1_device )
 #endif
 
 !$acc end data
diff --git a/src/MNH/tridiag_tke.f90 b/src/MNH/tridiag_tke.f90
index fcee8400d..87251eada 100644
--- a/src/MNH/tridiag_tke.f90
+++ b/src/MNH/tridiag_tke.f90
@@ -143,8 +143,7 @@ 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
+USE MODE_MNH_ZWORK,  ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -201,10 +200,9 @@ 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 )
+izy   = MNH_ALLOCATE_FLAT( zy  , JIU, JJU, JKU )
+izgam = MNH_ALLOCATE_FLAT( zgam, JIU, JJU, JKU )
+izbet = MNH_ALLOCATE_FLAT( zbet, JIU, JJU )
 #endif
 
 !$acc data present( ZY, ZGAM, ZBET )
@@ -352,8 +350,7 @@ end if
 #ifndef MNH_OPENACC
 deallocate( ZY, ZGAM, ZBET )
 #else
-CALL MNH_REL_ZT3D( IZY, IZGAM, IZBET )
-CALL MNH_CHECK_OUT_ZT3D("TRIDIAG_TKE")
+CALL MNH_RELEASE_FLAT( IZY, IZGAM, IZBET )
 #endif
 
 !$acc end data
diff --git a/src/MNH/tridiag_w.f90 b/src/MNH/tridiag_w.f90
index 67a4895fd..4a572e2c9 100644
--- a/src/MNH/tridiag_w.f90
+++ b/src/MNH/tridiag_w.f90
@@ -162,7 +162,7 @@ USE MODI_BITREP
 #endif
 !
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D , MNH_ALLOCATE_ZT2D
+USE MODE_MNH_ZWORK,  ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -222,14 +222,14 @@ 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 )
+izrhodj_dfddwdz_o_dz2 = MNH_ALLOCATE_FLAT( zrhodj_dfddwdz_o_dz2,JIU,JJU,JKU )
+izmzm_rhodj           = MNH_ALLOCATE_FLAT( zmzm_rhodj          ,JIU,JJU,JKU )
+iza                   = MNH_ALLOCATE_FLAT( za                  ,JIU,JJU,JKU )
+izb                   = MNH_ALLOCATE_FLAT( zb                  ,JIU,JJU,JKU )
+izc                   = MNH_ALLOCATE_FLAT( zc                  ,JIU,JJU,JKU )
+izy                   = MNH_ALLOCATE_FLAT( zy                  ,JIU,JJU,JKU )
+izgam                 = MNH_ALLOCATE_FLAT( zgam                ,JIU,JJU,JKU )
+izbet                 = MNH_ALLOCATE_FLAT( zbet                ,JIU,JJU )
 #endif 
 
 !$acc data present( ZRHODJ_DFDDWDZ_O_DZ2, ZMZM_RHODJ, ZA, ZB, ZC, ZY, ZGAM, ZBET )
@@ -464,7 +464,7 @@ end if
 #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)
+CALL MNH_RELEASE_FLAT( IZRHODJ_DFDDWDZ_O_DZ2, IZMZM_RHODJ, IZA, IZB, IZC, IZY, IZGAM, IZBET )
 #endif
 
 
diff --git a/src/MNH/tridiag_wind.f90 b/src/MNH/tridiag_wind.f90
index 2a1298642..7e3c0dfce 100644
--- a/src/MNH/tridiag_wind.f90
+++ b/src/MNH/tridiag_wind.f90
@@ -149,8 +149,7 @@ 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
+USE MODE_MNH_ZWORK,  ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 IMPLICIT NONE
@@ -208,10 +207,9 @@ 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 )
+izy   = MNH_ALLOCATE_FLAT( zy  , JIU, JJU, JKU )
+izgam = MNH_ALLOCATE_FLAT( zgam, JIU, JJU, JKU )
+izbet = MNH_ALLOCATE_FLAT( zbet, JIU, JJU )
 #endif
 
 !$acc data present( ZY, ZGAM, ZBET )
@@ -352,8 +350,7 @@ end if
 #ifndef MNH_OPENACC
 deallocate ( zy,zgam,zbet )
 #else
-CALL MNH_REL_ZT3D( izy,izgam,izbet )
-CALL MNH_CHECK_OUT_ZT3D("TRIDIAG_WIND")
+CALL MNH_RELEASE_FLAT( izy, izgam, izbet )
 #endif
 
 !$acc end data
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index 6f234ab39..753c9c42c 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -9,9 +9,7 @@ module mode_turb
 
 #ifdef MNH_OPENACC
   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
+  USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 #ifdef MNH_BITREP
@@ -617,75 +615,74 @@ 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 )
+IZCP        = MNH_ALLOCATE_FLAT( ZCP,        JIU, JJU, JKU )
+IZEXN       = MNH_ALLOCATE_FLAT( ZEXN,       JIU, JJU, JKU )
+IZT         = MNH_ALLOCATE_FLAT( ZT,         JIU, JJU, JKU )
+IZLOCPEXNM  = MNH_ALLOCATE_FLAT( ZLOCPEXNM,  JIU, JJU, JKU )
+IZLEPS      = MNH_ALLOCATE_FLAT( ZLEPS,      JIU, JJU, JKU )
+IZTRH       = MNH_ALLOCATE_FLAT( ZTRH,       JIU, JJU, JKU )
+IZATHETA    = MNH_ALLOCATE_FLAT( ZATHETA,    JIU, JJU, JKU )
+IZAMOIST    = MNH_ALLOCATE_FLAT( ZAMOIST,    JIU, JJU, JKU )
+IZCOEF_DISS = MNH_ALLOCATE_FLAT( ZCOEF_DISS, JIU, JJU, JKU )
+IZFRAC_ICE  = MNH_ALLOCATE_FLAT( ZFRAC_ICE,  JIU, JJU, JKU )
+
+IZMWTH = MNH_ALLOCATE_FLAT( ZMWTH, JIU, JJU, JKU )
+IZMWR  = MNH_ALLOCATE_FLAT( ZMWR,  JIU, JJU, JKU )
+IZMTH2 = MNH_ALLOCATE_FLAT( ZMTH2, JIU, JJU, JKU )
+IZMR2  = MNH_ALLOCATE_FLAT( ZMR2,  JIU, JJU, JKU )
+IZMTHR = MNH_ALLOCATE_FLAT( ZMTHR, JIU, JJU, JKU )
+
+IZFWTH = MNH_ALLOCATE_FLAT( ZFWTH, JIU, JJU, JKU )
+IZFWR  = MNH_ALLOCATE_FLAT( ZFWR,  JIU, JJU, JKU )
+IZFTH2 = MNH_ALLOCATE_FLAT( ZFTH2, JIU, JJU, JKU )
+IZFR2  = MNH_ALLOCATE_FLAT( ZFR2,  JIU, JJU, JKU )
+IZFTHR = MNH_ALLOCATE_FLAT( ZFTHR, JIU, JJU, JKU )
+IZTHLM = MNH_ALLOCATE_FLAT( 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  )
+IZRM = MNH_ALLOCATE_FLAT( 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 )
+IZTAU11M = MNH_ALLOCATE_FLAT( ZTAU11M, JIU, JJU )
+IZTAU12M = MNH_ALLOCATE_FLAT( ZTAU12M, JIU, JJU )
+IZTAU22M = MNH_ALLOCATE_FLAT( ZTAU22M, JIU, JJU )
+IZTAU33M = MNH_ALLOCATE_FLAT( ZTAU33M, JIU, JJU )
+IZUSLOPE = MNH_ALLOCATE_FLAT( ZUSLOPE, JIU, JJU )
+IZVSLOPE = MNH_ALLOCATE_FLAT( ZVSLOPE, JIU, JJU )
+IZCDUEFF = MNH_ALLOCATE_FLAT( ZCDUEFF, JIU, JJU )
+IZLMO    = MNH_ALLOCATE_FLAT( 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 )
+IZUSTAR = MNH_ALLOCATE_FLAT( ZUSTAR, JIU, JJU_ORMC01 )
+IZRVM   = MNH_ALLOCATE_FLAT( ZRVM,   JIU, JJU_ORMC01 )
+IZSFRV  = MNH_ALLOCATE_FLAT( 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 )
+iztt   = MNH_ALLOCATE_FLAT( ztt,   JIU, JJU, JKU_CLOUD )
+izexne = MNH_ALLOCATE_FLAT( zexne, JIU, JJU, JKU_CLOUD )
+izlv   = MNH_ALLOCATE_FLAT( zlv,   JIU, JJU, JKU_CLOUD )
+izcph  = MNH_ALLOCATE_FLAT( 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 )
+izshear = MNH_ALLOCATE_FLAT( 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 )
+izdudz = MNH_ALLOCATE_FLAT( zdudz, JIU, JJU, JKU_TURB )
+izdvdz = MNH_ALLOCATE_FLAT( zdvdz, JIU, JJU, JKU_TURB )
 
 #endif
 
 #ifdef MNH_OPENACC
-iztmp1_device =  MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp1_device = MNH_ALLOCATE_FLAT( 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 )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU_TURB )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU_TURB )
 
 #endif
 
@@ -1608,22 +1605,20 @@ deallocate( zcp, zexn, zt, zlocpexnm, zleps, ztrh,         &
             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_RELEASE_FLAT( 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_RELEASE_FLAT( iztau11m, iztau12m, iztau22m, iztau33m,   &
+                       izuslope, izvslope, izcdueff, izlmo,      &
+                       izustar, izrvm, izsfrv                   )
 
-CALL MNH_REL_ZT3D ( izrm)
+CALL MNH_RELEASE_FLAT( izrm)
 
-CALL MNH_REL_ZT3D ( izmwth, izmwr, izmth2, izmr2, izmthr,        &
-                    izfwth, izfwr, izfth2, izfr2, izfthr, izthlm )
+CALL MNH_RELEASE_FLAT( 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")
+CALL MNH_RELEASE_FLAT( izcp, izexn, izt, izlocpexnm, izleps, iztrh, &
+                       izatheta, izamoist, izcoef_diss, izfrac_ice  )
 #endif
 
 !$acc end data
@@ -1788,8 +1783,8 @@ INTEGER :: izrvsat, izdrvsatdt
   allocate( zrvsat   ( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) )
   allocate( zdrvsatdt( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) )
 #else
-izrvsat    = MNH_ALLOCATE_ZT3D( zrvsat   , size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) 
-izdrvsatdt = MNH_ALLOCATE_ZT3D( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
+izrvsat    = MNH_ALLOCATE_FLAT( zrvsat   , size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
+izdrvsatdt = MNH_ALLOCATE_FLAT( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
 #endif
 
 !$acc data present( zrvsat, zdrvsatdt )
@@ -1864,7 +1859,7 @@ izdrvsatdt = MNH_ALLOCATE_ZT3D( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), siz
 #ifndef MNH_OPENACC 
   deallocate( zrvsat, zdrvsatdt )
 #else
-  CALL MNH_REL_ZT3D(izrvsat, izdrvsatdt )
+  CALL MNH_RELEASE_FLAT( izrvsat, izdrvsatdt )
 #endif
  
 !$acc end data
@@ -2400,16 +2395,16 @@ allocate( ZDRTDZ (JIU,JJU,JKU) )
 allocate( ZETHETA(JIU,JJU,JKU) )
 allocate( ZEMOIST(JIU,JJU,JKU) )
 #else
-IZWORK2D = MNH_ALLOCATE_ZT2D( ZWORK2D,JIU,JJU)
-IZDTHLDZ = MNH_ALLOCATE_ZT3D( ZDTHLDZ,JIU,JJU,JKU)
-IZDRTDZ  = MNH_ALLOCATE_ZT3D( ZDRTDZ ,JIU,JJU,JKU)
-IZETHETA = MNH_ALLOCATE_ZT3D( ZETHETA,JIU,JJU,JKU)
-IZEMOIST = MNH_ALLOCATE_ZT3D( ZEMOIST,JIU,JJU,JKU)
+IZWORK2D = MNH_ALLOCATE_FLAT( ZWORK2D, JIU, JJU )
+IZDTHLDZ = MNH_ALLOCATE_FLAT( ZDTHLDZ, JIU, JJU, JKU )
+IZDRTDZ  = MNH_ALLOCATE_FLAT( ZDRTDZ,  JIU, JJU, JKU )
+IZETHETA = MNH_ALLOCATE_FLAT( ZETHETA, JIU, JJU, JKU )
+IZEMOIST = MNH_ALLOCATE_FLAT( ZEMOIST, JIU, JJU, JKU )
 #endif
 
 #ifdef MNH_OPENACC
-IZTMP1_DEVICE = MNH_ALLOCATE_ZT3D( ZTMP1_DEVICE,JIU,JJU,JKU)
-IZTMP2_DEVICE = MNH_ALLOCATE_ZT3D( ZTMP2_DEVICE,JIU,JJU,JKU)
+IZTMP1_DEVICE = MNH_ALLOCATE_FLAT( ZTMP1_DEVICE, JIU, JJU, JKU )
+IZTMP2_DEVICE = MNH_ALLOCATE_FLAT( ZTMP2_DEVICE, JIU, JJU, JKU )
 #endif
 
 !$acc data present(zwork2d, zdthldz, zdrtdz, zetheta, zemoist, &
@@ -2624,8 +2619,8 @@ end if
 #ifndef MNH_OPENACC
 deallocate(zwork2d, zdthldz, zdrtdz, zetheta, zemoist ) 
 #else
-CALL MNH_REL_ZT3D(izwork2d, izdthldz, izdrtdz, izetheta, izemoist, &
-                iztmp1_device, iztmp2_device )
+CALL MNH_RELEASE_FLAT( izwork2d, izdthldz, izdrtdz, izetheta, izemoist, &
+                       iztmp1_device, iztmp2_device )
 #endif
 
 !$acc end data
diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90
index 4eace2008..9803af842 100644
--- a/src/MNH/turb_hor_dyn_corr.f90
+++ b/src/MNH/turb_hor_dyn_corr.f90
@@ -150,8 +150,11 @@ USE MODD_PARAMETERS
 USE MODD_LES
 USE MODD_NSV
 !
-USE MODE_ll
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
+USE MODE_ll
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
+#endif
 use mode_mppdb
 !
 USE MODI_GRADIENT_M
@@ -172,9 +175,6 @@ 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
 !
@@ -357,34 +357,34 @@ 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 )
+izflx          = MNH_ALLOCATE_FLAT( zflx,  JIU, JJU, JKU )
+izwork         = MNH_ALLOCATE_FLAT( zwork, JIU, JJU, JKU )
 
-izdirsinzw     = MNH_ALLOCATE_ZT2D( zdirsinzw,JIU,JJU )
+izdirsinzw     = MNH_ALLOCATE_FLAT( zdirsinzw,JIU,JJU )
 
-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 )
+igx_u_m_pum    = MNH_ALLOCATE_FLAT( gx_u_m_pum, JIU, JJU, JKU )
+igy_v_m_pvm    = MNH_ALLOCATE_FLAT( gy_v_m_pvm, JIU, JJU, JKU )
+igz_w_m_pwm    = MNH_ALLOCATE_FLAT( gz_w_m_pwm, JIU, JJU, JKU )
+igz_w_m_zwp    = MNH_ALLOCATE_FLAT( gz_w_m_zwp, JIU, JJU, JKU )
+izmzf_dzz      = MNH_ALLOCATE_FLAT( zmzf_dzz,   JIU, JJU, JKU )
+izdfddwdz      = MNH_ALLOCATE_FLAT( zdfddwdz,   JIU, JJU, JKU )
+izwp           = MNH_ALLOCATE_FLAT( zwp,        JIU, JJU, JKU )
 
-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 )
+izdu_dz_dzs_dx = MNH_ALLOCATE_FLAT( zdu_dz_dzs_dx,1, JIU, 1, JJU, 1 , 1 )
+izdv_dz_dzs_dy = MNH_ALLOCATE_FLAT( zdv_dz_dzs_dy,1, JIU, 1, JJU, 1 , 1 )
+izdu_dx        = MNH_ALLOCATE_FLAT( zdu_dx,       1, JIU, 1, JJU, 1 , 1 )
+izdv_dy        = MNH_ALLOCATE_FLAT( zdv_dy,       1, JIU, 1, JJU, 1 , 1 )
+izdw_dz        = MNH_ALLOCATE_FLAT( zdw_dz,       1, JIU, 1, 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 )
+izcoeff        = MNH_ALLOCATE_FLAT( zcoeff,1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
+izdzz          = MNH_ALLOCATE_FLAT( zdzz,  1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
 #endif
 
 #ifdef MNH_OPENACC
-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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present(ZFLX, ZWORK, ZDIRSINZW, ZCOEFF, ZDZZ,                  &
@@ -1329,12 +1329,12 @@ DEALLOCATE (ZFLX, ZWORK, ZDIRSINZW, ZCOEFF, ZDZZ,                  &
             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             )
+CALL MNH_RELEASE_FLAT( IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
+CALL MNH_RELEASE_FLAT( 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
      
diff --git a/src/MNH/turb_hor_splt.f90 b/src/MNH/turb_hor_splt.f90
index 8996757cc..078d9a562 100644
--- a/src/MNH/turb_hor_splt.f90
+++ b/src/MNH/turb_hor_splt.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -269,8 +269,7 @@ 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
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -467,16 +466,16 @@ 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)
+IZK          = MNH_ALLOCATE_FLAT( ZK,          JIU, JJU, JKU )
+IZINV_PDXX   = MNH_ALLOCATE_FLAT( ZINV_PDXX,   JIU, JJU, JKU )
+IZINV_PDYY   = MNH_ALLOCATE_FLAT( ZINV_PDYY,   JIU, JJU, JKU )
+IZINV_PDZZ   = MNH_ALLOCATE_FLAT( ZINV_PDZZ,   JIU, JJU, JKU )
+IZMZM_PRHODJ = MNH_ALLOCATE_FLAT( ZMZM_PRHODJ, JIU, JJU, JKU )
 #endif
 
 #ifdef MNH_OPENACC
-IZTMP1_DEVICE = MNH_ALLOCATE_ZT3D( ZTMP1_DEVICE, JIU,JJU,JKU )
-IZTMP2_DEVICE = MNH_ALLOCATE_ZT3D( ZTMP2_DEVICE, JIU,JJU,JKU )
+IZTMP1_DEVICE = MNH_ALLOCATE_FLAT( ZTMP1_DEVICE, JIU, JJU, JKU )
+IZTMP2_DEVICE = MNH_ALLOCATE_FLAT( ZTMP2_DEVICE, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZK, ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, &
@@ -522,23 +521,23 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN
   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)))
 #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)
+  IZUM    = MNH_ALLOCATE_FLAT( ZUM, JIU, JJU, JKU )
+  IZVM    = MNH_ALLOCATE_FLAT( ZVM, JIU, JJU, JKU )
+  IZWM    = MNH_ALLOCATE_FLAT( ZWM, JIU, JJU, JKU )
   
-  IZTHLM  = MNH_ALLOCATE_ZT3D(ZTHLM,JIU,JJU,JKU)
-  IZTKEM  = MNH_ALLOCATE_ZT3D(ZTKEM,JIU,JJU,JKU)
+  IZTHLM  = MNH_ALLOCATE_FLAT( ZTHLM, JIU, JJU, JKU )
+  IZTKEM  = MNH_ALLOCATE_FLAT( 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)
+  IZRUS   = MNH_ALLOCATE_FLAT( ZRUS, JIU, JJU, JKU )
+  IZRVS   = MNH_ALLOCATE_FLAT( ZRVS, JIU, JJU, JKU )
+  IZRWS   = MNH_ALLOCATE_FLAT( ZRWS, JIU, JJU, JKU )
+
+  IZRTHLS = MNH_ALLOCATE_FLAT( 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) )
+  IZSVM   = MNH_ALLOCATE_FLAT( ZSVM,  JIU, JJU, JKU, SIZE(PSVM,4)  )
+  IZRM    = MNH_ALLOCATE_FLAT( ZRM,   JIU, JJU, JKU, SIZE(PRM,4)   )
+  IZRSVS  = MNH_ALLOCATE_FLAT( ZRSVS, JIU, JJU, JKU, SIZE(PRSVS,4) )
+  IZRRS   = MNH_ALLOCATE_FLAT( ZRRS,  JIU, JJU, JKU, SIZE(PRRS,4)  )
   
 #endif
   
@@ -763,11 +762,11 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN
   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)
+  CALL MNH_RELEASE_FLAT( IZRRS  )
+  CALL MNH_RELEASE_FLAT( IZRSVS )
+  CALL MNH_RELEASE_FLAT( IZRM   )
+  CALL MNH_RELEASE_FLAT( IZSVM  )
+  CALL MNH_RELEASE_FLAT( izum, izvm, izwm, izthlm, iztkem, izrus, izrvs, izrws, izrthls )
 #endif
   
   !
@@ -817,8 +816,8 @@ DEALLOCATE(ZINV_PDYY)
 DEALLOCATE(ZINV_PDZZ)
 DEALLOCATE(ZMZM_PRHODJ)
 #else
-CALL MNH_REL_ZT3D(IZK, IZINV_PDXX, IZINV_PDYY, IZINV_PDZZ, IZMZM_PRHODJ, &
-                  IZTMP1_DEVICE, IZTMP2_DEVICE )
+CALL MNH_RELEASE_FLAT( 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 aeeb39f67..458c2bd05 100644
--- a/src/MNH/turb_hor_sv_flux.f90
+++ b/src/MNH/turb_hor_sv_flux.f90
@@ -137,7 +137,7 @@ 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
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -248,20 +248,20 @@ allocate( zwork2d(JIU,JJU, 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)
+izflxx   = MNH_ALLOCATE_FLAT( zflxx, JIU, JJU, JKU )
+izflxy   = MNH_ALLOCATE_FLAT( zflxy, JIU, JJU, JKU )
 
-izwork2d = MNH_ALLOCATE_ZT3DP( zwork2d,JIU,JJU, 1 , 1 )
+izwork2d = MNH_ALLOCATE_FLAT( zwork2d, 1, JIU, 1, JJU, 1, 1 )
 
-izcoeff  = MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+izcoeff  = MNH_ALLOCATE_FLAT( zcoeff,  1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
 #endif
 
 #ifdef MNH_OPENACC
-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)
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
+iztmp5_device = MNH_ALLOCATE_FLAT( ztmp5_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZFLXX, ZFLXY, ZWORK2D, ZCOEFF, &
@@ -642,8 +642,8 @@ end if
 #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 )
+CALL MNH_RELEASE_FLAT( IZFLXX, IZFLXY, IZWORK2D, IZCOEFF, &
+                       IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, IZTMP5_DEVICE )
 #endif
 
 !$acc end data
diff --git a/src/MNH/turb_hor_thermo_corr.f90 b/src/MNH/turb_hor_thermo_corr.f90
index eb3ec18e8..137754554 100644
--- a/src/MNH/turb_hor_thermo_corr.f90
+++ b/src/MNH/turb_hor_thermo_corr.f90
@@ -151,8 +151,7 @@ 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
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -270,22 +269,22 @@ 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 )
+izflx  = MNH_ALLOCATE_FLAT( zflx ,  JIU, JJU, JKU )
+izwork = MNH_ALLOCATE_FLAT( zwork , JIU, JJU, JKU )
+iza    = MNH_ALLOCATE_FLAT( za ,    JIU, JJU, JKU )
 
-izcoeff= MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+izcoeff= MNH_ALLOCATE_FLAT( zcoeff, 1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
 #endif
 
 #ifdef MNH_OPENACC
-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  )
+iztmp1_device= MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device= MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device= MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device= MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
+iztmp5_device= MNH_ALLOCATE_FLAT( ztmp5_device, JIU, JJU, JKU )
+iztmp6_device= MNH_ALLOCATE_FLAT( ztmp6_device, JIU, JJU, JKU )
+iztmp7_device= MNH_ALLOCATE_FLAT( ztmp7_device, JIU, JJU, JKU )
+iztmp8_device= MNH_ALLOCATE_FLAT( ztmp8_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZFLX, ZWORK, ZA, ZCOEFF,                                    &
@@ -891,7 +890,7 @@ end if
 #ifndef MNH_OPENACC
 deallocate (zflx,zwork,za,zcoeff)
 #else
-CALL MNH_REL_ZT3D    ( IZFLX, IZWORK, IZA, IZCOEFF,                                    &
+CALL MNH_RELEASE_FLAT( IZFLX, IZWORK, IZA, IZCOEFF,                                &
                        IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE, &
                        IZTMP5_DEVICE, IZTMP6_DEVICE, IZTMP7_DEVICE, IZTMP8_DEVICE  )
 #endif
diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90
index 2ef2f3d1a..eddbe7796 100644
--- a/src/MNH/turb_hor_thermo_flux.f90
+++ b/src/MNH/turb_hor_thermo_flux.f90
@@ -152,8 +152,7 @@ USE MODI_LES_MEAN_SUBGRID
 USE MODI_SECOND_MNH
 !
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_FLAT, MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP, &
-                            MNH_RELEASE_FLAT, MNH_CHECK_IN_ZT3D, MNH_CHECK_OUT_ZT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -284,24 +283,23 @@ allocate( zflxc(JIU,JJU,JKU) )
 
 allocate( zcoeff(JIU,JJU, 1 + jpvext : 3 + jpvext ) )
 #else
-CALL  MNH_CHECK_IN_ZT3D("TURB_HOR_THERMO_FLUX")
-izflx  = MNH_ALLOCATE_FLAT( zflx,  1, JIU, 1, JJU,1, JKU )
-izflxc = MNH_ALLOCATE_FLAT( zflxc, 1, JIU, 1, JJU,1, JKU )
-! izvptv= MNH_ALLOCATE_ZT3D( zvptv,JIU,JJU,JKU )
+izflx  = MNH_ALLOCATE_FLAT( zflx,  JIU, JJU, JKU )
+izflxc = MNH_ALLOCATE_FLAT( zflxc, JIU, JJU, JKU )
+! izvptv= MNH_ALLOCATE_FLAT( zvptv, JIU, JJU, JKU )
 
-izcoeff= MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+izcoeff= MNH_ALLOCATE_FLAT( zcoeff, 1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
 
 #endif
 
 #ifdef MNH_OPENACC
-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  )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
+iztmp5_device = MNH_ALLOCATE_FLAT( ztmp5_device, JIU, JJU, JKU )
+iztmp6_device = MNH_ALLOCATE_FLAT( ztmp6_device, JIU, JJU, JKU )
+iztmp7_device = MNH_ALLOCATE_FLAT( ztmp7_device, JIU, JJU, JKU )
+iztmp8_device = MNH_ALLOCATE_FLAT( ztmp8_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZFLX, ZFLXC, ZCOEFF,                                    &
@@ -1853,12 +1851,9 @@ end if
 #ifndef MNH_OPENACC
 deallocate (zflx,zflxc,zcoeff)
 #else
-CALL MNH_RELEASE_FLAT( IZFLXC )
-CALL MNH_RELEASE_FLAT( IZFLX  )
-CALL MNH_REL_ZT3D ( 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")
+CALL MNH_RELEASE_FLAT( IZFLX, IZFLXC, 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_hor_tke.f90 b/src/MNH/turb_hor_tke.f90
index c4cc5f5f1..1a673d844 100644
--- a/src/MNH/turb_hor_tke.f90
+++ b/src/MNH/turb_hor_tke.f90
@@ -100,7 +100,7 @@ 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
+USE MODE_MNH_ZWORK,  ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 IMPLICIT NONE
@@ -181,17 +181,17 @@ allocate( zflx (JIU,JJU,JKU ) )
 
 allocate( zcoeff(JIU,JJU, 1 + jpvext : 3 + jpvext ) )
 #else
-izflx   = MNH_ALLOCATE_ZT3D( zflx ,JIU,JJU,JKU )
+izflx   = MNH_ALLOCATE_FLAT( zflx, JIU, JJU, JKU )
 
-izcoeff = MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+izcoeff = MNH_ALLOCATE_FLAT( zcoeff, 1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
 #endif
 
 
 #ifdef MNH_OPENACC
-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)
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZCOEFF, ZFLX, &
@@ -527,8 +527,8 @@ end if
 #ifndef MNH_OPENACC
 deallocate( ZCOEFF, ZFLX )
 #else
-CALL MNH_REL_ZT3D( IZFLX, IZCOEFF, &
-                   IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
+CALL MNH_RELEASE_FLAT( 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 a4f3c565d..ad31595c5 100644
--- a/src/MNH/turb_hor_uv.f90
+++ b/src/MNH/turb_hor_uv.f90
@@ -155,7 +155,7 @@ USE MODI_BITREP
 #endif
 !
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -289,23 +289,23 @@ 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 )
+izflx  = MNH_ALLOCATE_FLAT( zflx,  JIU, JJU, JKU )
+izwork = MNH_ALLOCATE_FLAT( zwork, JIU, JJU, JKU )
 
-izdirsinzw = MNH_ALLOCATE_ZT2D( zdirsinzw,JIU,JJU )
+izdirsinzw = MNH_ALLOCATE_FLAT( 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 )
+igy_u_uv_pum = MNH_ALLOCATE_FLAT( gy_u_uv_pum, JIU, JJU, JKU )
+igx_v_uv_pvm = MNH_ALLOCATE_FLAT( gx_v_uv_pvm, JIU, JJU, JKU )
 #endif
 
 #ifdef MNH_OPENACC
-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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
+iztmp5_device = MNH_ALLOCATE_FLAT( ztmp5_device, JIU, JJU, JKU )
+iztmp6_device = MNH_ALLOCATE_FLAT( ztmp6_device, JIU, JJU, JKU )
+iztmp7_device = MNH_ALLOCATE_FLAT( ztmp7_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZFLX, ZWORK, ZDIRSINZW, GY_U_UV_PUM, GX_V_UV_PVM,       &
@@ -835,9 +835,9 @@ end if
 #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                )
+CALL MNH_RELEASE_FLAT( 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
      
 
diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90
index bb57c98c4..dc4bacc2d 100644
--- a/src/MNH/turb_hor_uw.f90
+++ b/src/MNH/turb_hor_uw.f90
@@ -139,7 +139,7 @@ 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
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 IMPLICIT NONE
@@ -245,17 +245,17 @@ 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)
+izflx        = MNH_ALLOCATE_FLAT( zflx,  JIU, JJU, JKU )
+izwork       = MNH_ALLOCATE_FLAT( zwork, JIU, JJU, JKU )
 
-igx_w_uw_pwm = MNH_ALLOCATE_ZT3D( gx_w_uw_pwm,JIU,JJU,JKU)
+igx_w_uw_pwm = MNH_ALLOCATE_FLAT( gx_w_uw_pwm, JIU, JJU, JKU )
 #endif
 
 #ifdef MNH_OPENACC
-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)
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZFLX, ZWORK, GX_W_UW_PWM, &
@@ -594,8 +594,8 @@ end if
 #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 )
+CALL MNH_RELEASE_FLAT( IZFLX, IZWORK, IGX_W_UW_PWM, &
+                       IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
 #endif
 
 !$acc end data
diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90
index 2e03a3586..a3340a9a0 100644
--- a/src/MNH/turb_hor_vw.f90
+++ b/src/MNH/turb_hor_vw.f90
@@ -138,7 +138,7 @@ 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
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 IMPLICIT NONE
@@ -242,17 +242,17 @@ 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)
+izflx        = MNH_ALLOCATE_FLAT( zflx,  JIU, JJU, JKU )
+izwork       = MNH_ALLOCATE_FLAT( zwork, JIU, JJU, JKU )
 
-igy_w_vw_pwm = MNH_ALLOCATE_ZT3D( gy_w_vw_pwm,JIU,JJU,JKU)
+igy_w_vw_pwm = MNH_ALLOCATE_FLAT( gy_w_vw_pwm, JIU, JJU, JKU )
 #endif
 
 #ifdef MNH_OPENACC
-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)
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZFLX, ZWORK, GY_W_VW_PWM, &
@@ -623,8 +623,8 @@ end if
 #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 )
+CALL MNH_RELEASE_FLAT( IZFLX, IZWORK, IGY_W_VW_PWM, &
+                       IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
 #endif
 
 !$acc end data
diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90
index 6ed71c529..ebc1dc40b 100644
--- a/src/MNH/turb_ver.f90
+++ b/src/MNH/turb_ver.f90
@@ -343,7 +343,7 @@ USE MODE_PRANDTL
 USE MODI_SECOND_MNH
 !
 #ifdef MNH_OPENACC
-USE  MODE_MNH_ZWORK, ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -584,26 +584,26 @@ 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 )
+izbeta     = MNH_ALLOCATE_FLAT( zbeta,     JIU, JJU, JKU )
+izsqrt_tke = MNH_ALLOCATE_FLAT( zsqrt_tke, JIU, JJU, JKU )
+izdth_dz   = MNH_ALLOCATE_FLAT( zdth_dz,   JIU, JJU, JKU )
+izdr_dz    = MNH_ALLOCATE_FLAT( zdr_dz,    JIU, JJU, JKU )
+izred2th3  = MNH_ALLOCATE_FLAT( zred2th3,  JIU, JJU, JKU )
+izred2r3   = MNH_ALLOCATE_FLAT( zred2r3,   JIU, JJU, JKU )
+izred2thr3 = MNH_ALLOCATE_FLAT( zred2thr3, JIU, JJU, JKU )
+izbll_o_e  = MNH_ALLOCATE_FLAT( zbll_o_e,  JIU, JJU, JKU )
+izetheta   = MNH_ALLOCATE_FLAT( zetheta,   JIU, JJU, JKU )
+izemoist   = MNH_ALLOCATE_FLAT( zemoist,   JIU, JJU, JKU )
+izredth1   = MNH_ALLOCATE_FLAT( zredth1,   JIU, JJU, JKU )
+izredr1    = MNH_ALLOCATE_FLAT( zredr1,    JIU, JJU, JKU )
+izphi3     = MNH_ALLOCATE_FLAT( zphi3,     JIU, JJU, JKU )
+izpsi3     = MNH_ALLOCATE_FLAT( zpsi3,     JIU, JJU, JKU )
+izd        = MNH_ALLOCATE_FLAT( zd,        JIU, JJU, JKU )
+izwthv     = MNH_ALLOCATE_FLAT( zwthv,     JIU, JJU, JKU )
+izwu       = MNH_ALLOCATE_FLAT( zwu,       JIU, JJU, JKU )
+izwv       = MNH_ALLOCATE_FLAT( zwv,       JIU, JJU, JKU )
+izthlp     = MNH_ALLOCATE_FLAT( zthlp,     JIU, JJU, JKU )
+izrp       = MNH_ALLOCATE_FLAT( zrp,       JIU, JJU, JKU )
 #endif
 
 #ifndef MNH_OPENACC
@@ -612,10 +612,10 @@ allocate( zreds1  (JIU,JJU,JKU, nsv ) )
 allocate( zred2ths(JIU,JJU,JKU, nsv ) )
 allocate( zred2rs (JIU,JJU,JKU, nsv ) )
 #else
-izpsi_sv  = MNH_ALLOCATE_ZT4D( zpsi_sv ,JIU,JJU,JKU, nsv )
-izreds1   = MNH_ALLOCATE_ZT4D( zreds1  ,JIU,JJU,JKU, nsv )
-izred2ths = MNH_ALLOCATE_ZT4D( zred2ths,JIU,JJU,JKU, nsv )
-izred2rs  = MNH_ALLOCATE_ZT4D( zred2rs ,JIU,JJU,JKU, nsv )
+izpsi_sv  = MNH_ALLOCATE_FLAT( zpsi_sv,  JIU, JJU, JKU, nsv )
+izreds1   = MNH_ALLOCATE_FLAT( zreds1,   JIU, JJU, JKU, nsv )
+izred2ths = MNH_ALLOCATE_FLAT( zred2ths, JIU, JJU, JKU, nsv )
+izred2rs  = MNH_ALLOCATE_FLAT( zred2rs,  JIU, JJU, JKU, nsv )
 #endif
 
 !$acc data present (ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, ZRED2R3, ZRED2THR3,&
@@ -920,20 +920,14 @@ end if
 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
-
-#ifndef MNH_OPENACC
 DEALLOCATE(zpsi_sv,zreds1,zred2ths,zred2rs)
 #else
-CALL MNH_REL_ZT4D (nsv  , izred2rs  )
-CALL MNH_REL_ZT4D (nsv  , izred2ths  )
-CALL MNH_REL_ZT4D (nsv  , izreds1  )
-CALL MNH_REL_ZT4D (nsv  , izpsi_sv  )
+CALL MNH_RELEASE_FLAT( izpsi_sv, izreds1, izred2ths, izred2rs )
+CALL MNH_RELEASE_FLAT( 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 15df973c6..18d9a481b 100644
--- a/src/MNH/turb_ver_dyn_flux.f90
+++ b/src/MNH/turb_ver_dyn_flux.f90
@@ -321,7 +321,7 @@ USE MODE_MSG
 #endif
 !
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 IMPLICIT NONE
@@ -488,27 +488,27 @@ allocate( zcoefflxv(JIU,JJU, 1 ) )
 allocate( zuslopem (JIU,JJU, 1 ) )
 allocate( zvslopem (JIU,JJU, 1 ) )
 #else
-izdirsinzw = MNH_ALLOCATE_ZT2D( zdirsinzw,JIU,JJU  )
+izdirsinzw = MNH_ALLOCATE_FLAT( zdirsinzw, JIU, JJU )
 
-izcoefs    = MNH_ALLOCATE_ZT3DP( zcoefs   ,JIU,JJU, 1 , 1  )
+izcoefs    = MNH_ALLOCATE_FLAT( zcoefs, 1, JIU, 1, JJU, 1, 1 )
 
-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  )
+iza        = MNH_ALLOCATE_FLAT( za,      JIU, JJU, JKU )
+izres      = MNH_ALLOCATE_FLAT( zres,    JIU, JJU, JKU )
+izflxz     = MNH_ALLOCATE_FLAT( zflxz,   JIU, JJU, JKU )
+izsource   = MNH_ALLOCATE_FLAT( zsource, JIU, JJU, JKU )
+izkeff     = MNH_ALLOCATE_FLAT( zkeff,   JIU, JJU, JKU )
 
-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  )
+izcoefflxu = MNH_ALLOCATE_FLAT( zcoefflxu, 1, JIU, 1, JJU, 1 , 1 )
+izcoefflxv = MNH_ALLOCATE_FLAT( zcoefflxv, 1, JIU, 1, JJU, 1 , 1 )
+izuslopem  = MNH_ALLOCATE_FLAT( zuslopem,  1, JIU, 1, JJU, 1 , 1 )
+izvslopem  = MNH_ALLOCATE_FLAT( zvslopem,  1, JIU, 1, JJU, 1 , 1 )
 #endif
 
 #ifdef MNH_OPENACC
-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  )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( zdirsinzw, zcoefs, za, zres, zflxz, zsource, zkeff, zcoefflxu, zcoefflxv, zuslopem, zvslopem, &
@@ -1700,8 +1700,9 @@ end if
 #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)
+CALL MNH_RELEASE_FLAT( 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 e94a0cbb2..6e1170f5e 100644
--- a/src/MNH/turb_ver_thermo_corr.f90
+++ b/src/MNH/turb_ver_thermo_corr.f90
@@ -318,7 +318,7 @@ 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
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 IMPLICIT NONE
@@ -490,25 +490,25 @@ 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 )
+izflxz    = MNH_ALLOCATE_FLAT( zflxz,    JIU, JJU, JKU )
+izkeff    = MNH_ALLOCATE_FLAT( zkeff,    JIU, JJU, JKU )
+izf       = MNH_ALLOCATE_FLAT( zf,       JIU, JJU, JKU )
+izdfddtdz = MNH_ALLOCATE_FLAT( zdfddtdz, JIU, JJU, JKU )
+izdfddrdz = MNH_ALLOCATE_FLAT( zdfddrdz, JIU, JJU, JKU )
 
-izcoeff   = MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, i1 , i2 )
+izcoeff   = MNH_ALLOCATE_FLAT( zcoeff, 1, JIU, 1, JJU, i1, i2 )
 
 #endif
 
 #ifdef MNH_OPENACC
-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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
+iztmp5_device = MNH_ALLOCATE_FLAT( ztmp5_device, JIU, JJU, JKU )
+iztmp6_device = MNH_ALLOCATE_FLAT( ztmp6_device, JIU, JJU, JKU )
+iztmp7_device = MNH_ALLOCATE_FLAT( ztmp7_device, JIU, JJU, JKU )
+iztmp8_device = MNH_ALLOCATE_FLAT( ztmp8_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( zflxz, zkeff, zf, zdfddtdz, zdfddrdz, zcoeff,           &
@@ -1540,9 +1540,9 @@ end if
 #ifndef MNH_OPENACC
 deallocate( zflxz, zkeff, zf , zdfddtdz , zdfddrdz , zcoeff )
 #else
-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 )
+CALL MNH_RELEASE_FLAT( 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 9b924f0ac..1b0bfcf93 100644
--- a/src/MNH/turb_ver_thermo_flux.f90
+++ b/src/MNH/turb_ver_thermo_flux.f90
@@ -376,7 +376,7 @@ USE MODE_PRANDTL
 USE MODI_SECOND_MNH
 !
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_GT3D , MNH_REL_GT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 IMPLICIT NONE
@@ -617,26 +617,26 @@ allocate( zrwrnp    (JIU,JJU,JKU ) )
 allocate( zcld_thold(JIU,JJU,JKU ) )
 allocate( zalt      (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  )
-izf_new     = MNH_ALLOCATE_ZT3D( zf_new    ,JIU,JJU,JKU  )
-izrwthl     = MNH_ALLOCATE_ZT3D( zrwthl    ,JIU,JJU,JKU  )
-izrwrnp     = MNH_ALLOCATE_ZT3D( zrwrnp    ,JIU,JJU,JKU  )
-izcld_thold = MNH_ALLOCATE_ZT3D( zcld_thold,JIU,JJU,JKU  )
-izalt       = MNH_ALLOCATE_ZT3D( zalt      ,JIU,JJU,JKU  )
+iza         = MNH_ALLOCATE_FLAT( za,         JIU,JJU,JKU )
+izflxz      = MNH_ALLOCATE_FLAT( zflxz,      JIU,JJU,JKU )
+izsource    = MNH_ALLOCATE_FLAT( zsource,    JIU,JJU,JKU )
+izkeff      = MNH_ALLOCATE_FLAT( zkeff,      JIU,JJU,JKU )
+izf         = MNH_ALLOCATE_FLAT( zf,         JIU,JJU,JKU )
+izdfddtdz   = MNH_ALLOCATE_FLAT( zdfddtdz,   JIU,JJU,JKU )
+izdfddrdz   = MNH_ALLOCATE_FLAT( zdfddrdz,   JIU,JJU,JKU )
+iz3rdmoment = MNH_ALLOCATE_FLAT( z3rdmoment, JIU,JJU,JKU )
+izf_new     = MNH_ALLOCATE_FLAT( zf_new,     JIU,JJU,JKU )
+izrwthl     = MNH_ALLOCATE_FLAT( zrwthl,     JIU,JJU,JKU )
+izrwrnp     = MNH_ALLOCATE_FLAT( zrwrnp,     JIU,JJU,JKU )
+izcld_thold = MNH_ALLOCATE_FLAT( zcld_thold, JIU,JJU,JKU )
+izalt       = MNH_ALLOCATE_FLAT( zalt,       JIU,JJU,JKU )
 #endif
 
 #ifdef MNH_OPENACC
-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  )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZA, ZFLXZ, ZSOURCE, ZKEFF, ZF, ZDFDDTDZ, ZDFDDRDZ, Z3RDMOMENT,  &
@@ -1802,9 +1802,9 @@ end if
 #ifndef MNH_OPENACC
 Deallocate( za, zflxz, zsource, zkeff, zf, zdfddtdz, zdfddrdz, z3rdmoment, zf_new, zrwthl, zrwrnp, zcld_thold, zalt )
 #else
-CALL MNH_REL_ZT3D( IZA, IZFLXZ, IZSOURCE, IZKEFF, IZF, IZDFDDTDZ, IZDFDDRDZ, IZ3RDMOMENT, &
-                   IZF_NEW, IZRWTHL, IZRWRNP, IZCLD_THOLD, IZALT,                         &
-                   IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE             )
+CALL MNH_RELEASE_FLAT( IZA, IZFLXZ, IZSOURCE, IZKEFF, IZF, IZDFDDTDZ, IZDFDDRDZ, IZ3RDMOMENT, &
+                       IZF_NEW, IZRWTHL, IZRWRNP, IZCLD_THOLD, IZALT,                         &
+                       IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE             )
 #endif
 
 !$acc end data
diff --git a/src/ZSOLVER/advection_metsv.f90 b/src/ZSOLVER/advection_metsv.f90
index bda429f84..3f0444f7f 100644
--- a/src/ZSOLVER/advection_metsv.f90
+++ b/src/ZSOLVER/advection_metsv.f90
@@ -175,8 +175,8 @@ use mode_argslist_ll,    only: ADD3DFIELD_ll, ADD4DFIELD_ll, CLEANLIST_ll, LIST_
 use mode_budget,         only: Budget_store_init, Budget_store_end
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_ZT3D, MNH_ALLOCATE_ZT4D, MNH_CHECK_IN_ZT3D, MNH_CHECK_OUT_ZT3D, &
-                               MNH_GET_ZT3D, MNH_REL_ZT3D, MNH_REL_ZT4D, ZT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_CHECK_IN_ZT3D, MNH_CHECK_OUT_ZT3D, &
+                               MNH_GET_ZT3D, MNH_RELEASE_FLAT, MNH_REL_ZT3D, ZT3D
 #endif
 use mode_exchange_ll,    only: UPDATE_HALO_ll
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
@@ -402,41 +402,41 @@ 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                )
+IZRUCPPM       = MNH_ALLOCATE_FLAT( ZRUCPPM      , JIU, JJU, JKU               )
+IZRVCPPM       = MNH_ALLOCATE_FLAT( ZRVCPPM      , JIU, JJU, JKU               )
+IZRWCPPM       = MNH_ALLOCATE_FLAT( ZRWCPPM      , JIU, JJU, JKU               )
+IZCFLU         = MNH_ALLOCATE_FLAT( ZCFLU        , JIU, JJU, JKU               )
+IZCFLV         = MNH_ALLOCATE_FLAT( ZCFLV        , JIU, JJU, JKU               )
+IZCFLW         = MNH_ALLOCATE_FLAT( ZCFLW        , JIU, JJU, JKU               )
+IZCFL          = MNH_ALLOCATE_FLAT( ZCFL         , JIU, JJU, JKU               )
+IZTH           = MNH_ALLOCATE_FLAT( ZTH          , JIU, JJU, JKU               )
+IZTKE          = MNH_ALLOCATE_FLAT( ZTKE         , JIU, JJU, SIZE(PTKET,3)     )
+IZRTHS_OTHER   = MNH_ALLOCATE_FLAT( ZRTHS_OTHER  , JIU, JJU, JKU               )
+IZRTKES_OTHER  = MNH_ALLOCATE_FLAT( ZRTKES_OTHER , JIU, JJU, SIZE(PTKET,3)     )
+IZRTHS_PPM     = MNH_ALLOCATE_FLAT( ZRTHS_PPM    , JIU, JJU, JKU               )
+IZRTKES_PPM    = MNH_ALLOCATE_FLAT( ZRTKES_PPM   , JIU, JJU, SIZE(PTKET,3)     )
+IZR            = MNH_ALLOCATE_FLAT( ZR           , JIU, JJU, JKU, SIZE(PRT, 4) )
+IZSV           = MNH_ALLOCATE_FLAT( ZSV          , JIU, JJU, JKU, SIZE(PSVT,4) )
+IZSNWC         = MNH_ALLOCATE_FLAT( ZSNWC        , JIU, JJU, JKU, NBLOWSNOW_2D )
+IZSNWC_INIT    = MNH_ALLOCATE_FLAT( ZSNWC_INIT   , JIU, JJU, JKU, NBLOWSNOW_2D )
+IZRSNWCS       = MNH_ALLOCATE_FLAT( ZRSNWCS      , JIU, JJU, JKU, NBLOWSNOW_2D )
+IZRRS_OTHER    = MNH_ALLOCATE_FLAT( ZRRS_OTHER   , JIU, JJU, JKU, SIZE(PRT, 4) )
+IZRSVS_OTHER   = MNH_ALLOCATE_FLAT( ZRSVS_OTHER  , JIU, JJU, JKU, SIZE(PSVT,4) )
+IZRSNWCS_OTHER = MNH_ALLOCATE_FLAT( ZRSNWCS_OTHER, JIU, JJU, JKU, NBLOWSNOW_2D )
+IZRRS_PPM      = MNH_ALLOCATE_FLAT( ZRRS_PPM     , JIU, JJU, JKU, SIZE(PRT, 4) )
+IZRSVS_PPM     = MNH_ALLOCATE_FLAT( ZRSVS_PPM    , JIU, JJU, JKU, SIZE(PSVT,4) )
+IZRSNWCS_PPM   = MNH_ALLOCATE_FLAT( ZRSNWCS_PPM  , JIU, JJU, JKU, NBLOWSNOW_2D )
+IZRHOX1        = MNH_ALLOCATE_FLAT( ZRHOX1       , JIU, JJU, JKU               )
+IZRHOX2        = MNH_ALLOCATE_FLAT( ZRHOX2       , JIU, JJU, JKU               )
+IZRHOY1        = MNH_ALLOCATE_FLAT( ZRHOY1       , JIU, JJU, JKU               )
+IZRHOY2        = MNH_ALLOCATE_FLAT( ZRHOY2       , JIU, JJU, JKU               )
+IZRHOZ1        = MNH_ALLOCATE_FLAT( ZRHOZ1       , JIU, JJU, JKU               )
+IZRHOZ2        = MNH_ALLOCATE_FLAT( ZRHOZ2       , JIU, JJU, JKU               )
+IZT            = MNH_ALLOCATE_FLAT( ZT           , JIU, JJU, JKU               )
+IZEXN          = MNH_ALLOCATE_FLAT( ZEXN         , JIU, JJU, JKU               )
+IZLV           = MNH_ALLOCATE_FLAT( ZLV          , JIU, JJU, JKU               )
+IZLS           = MNH_ALLOCATE_FLAT( ZLS          , JIU, JJU, JKU               )
+IZCPH          = MNH_ALLOCATE_FLAT( ZCPH         , JIU, JJU, JKU                )
 #endif
 
 !$acc data present( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH,                        &
@@ -1115,23 +1115,15 @@ deallocate ( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH,
             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_RELEASE_FLAT ( 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_RELEASE_FLAT ( IZR, IZSV, IZSNWC, IZSNWC_INIT, IZRSNWCS, IZRRS_OTHER, IZRSVS_OTHER, &
+                        IZRSNWCS_OTHER, IZRRS_PPM, IZRSVS_PPM, IZRSNWCS_PPM)
+
+CALL MNH_RELEASE_FLAT ( IZRUCPPM, IZRVCPPM, IZRWCPPM, IZCFLU, IZCFLV, IZCFLW, IZCFL, IZTH, &
+                        IZTKE, IZRTHS_OTHER, IZRTKES_OTHER, IZRTHS_PPM, IZRTKES_PPM        )
 
-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
 
diff --git a/src/ZSOLVER/advection_uvw.f90 b/src/ZSOLVER/advection_uvw.f90
index 6782a74d2..999dff33a 100644
--- a/src/ZSOLVER/advection_uvw.f90
+++ b/src/ZSOLVER/advection_uvw.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -108,7 +108,7 @@ use mode_budget,      only: Budget_store_init, Budget_store_end
 USE MODE_ll
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_ALLOCATE_ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D, MNH_GET_ZT4D , MNH_REL_ZT4D
+USE MODE_MNH_ZWORK,   ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT, ZT3D, MNH_GET_ZT3D, MNH_REL_ZT3D, MNH_GET_ZT4D, MNH_REL_ZT4D
 #endif
 use mode_mppdb
 
@@ -270,24 +270,24 @@ ALLOCATE( ZMXM_RHODJ( IIU,IJU,IKU ) )
 ALLOCATE( ZMYM_RHODJ( IIU,IJU,IKU ) )
 ALLOCATE( ZMZM_RHODJ( IIU,IJU,IKU ) )
 #else
-IZRUT       = MNH_ALLOCATE_ZT3D( ZRUT      ,IIU,IJU,IKU )
-IZRVT       = MNH_ALLOCATE_ZT3D( ZRVT      ,IIU,IJU,IKU )
-IZRWT       = MNH_ALLOCATE_ZT3D( ZRWT      ,IIU,IJU,IKU )
-IZRUCT      = MNH_ALLOCATE_ZT3D( ZRUCT     ,IIU,IJU,IKU )
-IZRVCT      = MNH_ALLOCATE_ZT3D( ZRVCT     ,IIU,IJU,IKU )
-IZRWCT      = MNH_ALLOCATE_ZT3D( ZRWCT     ,IIU,IJU,IKU )
-IZU         = MNH_ALLOCATE_ZT3D( ZU        ,IIU,IJU,IKU )
-IZV         = MNH_ALLOCATE_ZT3D( ZV        ,IIU,IJU,IKU )
-IZW         = MNH_ALLOCATE_ZT3D( ZW        ,IIU,IJU,IKU )
-IZRUS_OTHER = MNH_ALLOCATE_ZT3D( ZRUS_OTHER,IIU,IJU,IKU )
-IZRVS_OTHER = MNH_ALLOCATE_ZT3D( ZRVS_OTHER,IIU,IJU,IKU )
-IZRWS_OTHER = MNH_ALLOCATE_ZT3D( ZRWS_OTHER,IIU,IJU,IKU )
-IZRUS_ADV   = MNH_ALLOCATE_ZT3D( ZRUS_ADV  ,IIU,IJU,IKU )
-IZRVS_ADV   = MNH_ALLOCATE_ZT3D( ZRVS_ADV  ,IIU,IJU,IKU )
-IZRWS_ADV   = MNH_ALLOCATE_ZT3D( ZRWS_ADV  ,IIU,IJU,IKU )
-IZMXM_RHODJ = MNH_ALLOCATE_ZT3D( ZMXM_RHODJ,IIU,IJU,IKU )
-IZMYM_RHODJ = MNH_ALLOCATE_ZT3D( ZMYM_RHODJ,IIU,IJU,IKU )
-IZMZM_RHODJ = MNH_ALLOCATE_ZT3D( ZMZM_RHODJ,IIU,IJU,IKU )
+IZRUT       = MNH_ALLOCATE_FLAT( ZRUT,       IIU, IJU, IKU )
+IZRVT       = MNH_ALLOCATE_FLAT( ZRVT,       IIU, IJU, IKU )
+IZRWT       = MNH_ALLOCATE_FLAT( ZRWT,       IIU, IJU, IKU )
+IZRUCT      = MNH_ALLOCATE_FLAT( ZRUCT,      IIU, IJU, IKU )
+IZRVCT      = MNH_ALLOCATE_FLAT( ZRVCT,      IIU, IJU, IKU )
+IZRWCT      = MNH_ALLOCATE_FLAT( ZRWCT,      IIU, IJU, IKU )
+IZU         = MNH_ALLOCATE_FLAT( ZU,         IIU, IJU, IKU )
+IZV         = MNH_ALLOCATE_FLAT( ZV,         IIU, IJU, IKU )
+IZW         = MNH_ALLOCATE_FLAT( ZW,         IIU, IJU, IKU )
+IZRUS_OTHER = MNH_ALLOCATE_FLAT( ZRUS_OTHER, IIU, IJU, IKU )
+IZRVS_OTHER = MNH_ALLOCATE_FLAT( ZRVS_OTHER, IIU, IJU, IKU )
+IZRWS_OTHER = MNH_ALLOCATE_FLAT( ZRWS_OTHER, IIU, IJU, IKU )
+IZRUS_ADV   = MNH_ALLOCATE_FLAT( ZRUS_ADV,   IIU, IJU, IKU )
+IZRVS_ADV   = MNH_ALLOCATE_FLAT( ZRVS_ADV,   IIU, IJU, IKU )
+IZRWS_ADV   = MNH_ALLOCATE_FLAT( ZRWS_ADV,   IIU, IJU, IKU )
+IZMXM_RHODJ = MNH_ALLOCATE_FLAT( ZMXM_RHODJ, IIU, IJU, IKU )
+IZMYM_RHODJ = MNH_ALLOCATE_FLAT( ZMYM_RHODJ, IIU, IJU, IKU )
+IZMZM_RHODJ = MNH_ALLOCATE_FLAT( ZMZM_RHODJ, IIU, IJU, IKU )
 #endif
 
 !$acc data present( zrut, zrvt, zrwt, zruct, zrvct, zrwct, zu, zv, zw,                &
@@ -585,9 +585,9 @@ DEALLOCATE(zrut, zrvt, zrwt, zruct, zrvct, zrwct, zu, zv, zw,                &
            zrus_other, zrvs_other, zrws_other, zrus_adv, zrvs_adv, zrws_adv, &
            zmxm_rhodj, zmym_rhodj, zmzm_rhodj )
 #else
-CALL MNH_REL_ZT3D(izmxm_rhodj, izmym_rhodj, izmzm_rhodj )
-CALL MNH_REL_ZT3D(izrus_other, izrvs_other, izrws_other, izrus_adv, izrvs_adv, izrws_adv )
-CALL MNH_REL_ZT3D(izrut, izrvt, izrwt, izruct, izrvct, izrwct, izu, izv, izw)
+CALL MNH_RELEASE_FLAT( izmxm_rhodj, izmym_rhodj, izmzm_rhodj )
+CALL MNH_RELEASE_FLAT( izrus_other, izrvs_other, izrws_other, izrus_adv, izrvs_adv, izrws_adv )
+CALL MNH_RELEASE_FLAT( izrut, izrvt, izrwt, izruct, izrvct, izrwct, izu, izv, izw)
 #endif
 
 !$acc end data
diff --git a/src/ZSOLVER/gdiv.f90 b/src/ZSOLVER/gdiv.f90
index 567912df0..c13e3aaa9 100644
--- a/src/ZSOLVER/gdiv.f90
+++ b/src/ZSOLVER/gdiv.f90
@@ -107,7 +107,7 @@ USE MODI_CONTRAV
 USE MODE_ll
 !
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,   ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -178,15 +178,15 @@ IKU=SIZE(PU,3)
 ALLOCATE(ZUC(IIU,IJU,IKU),ZVC(IIU,IJU,IKU),ZWC(IIU,IJU,IKU))
 ALLOCATE(Z1(IIU,IJU,IKU),Z2(IIU,IJU,IKU),Z3(IIU,IJU,IKU))
 #else
-IZUC = MNH_ALLOCATE_ZT3D(ZUC,IIU,IJU,IKU  )
-IZVC = MNH_ALLOCATE_ZT3D(ZVC,IIU,IJU,IKU  )
-IZWC = MNH_ALLOCATE_ZT3D(ZWC,IIU,IJU,IKU  )
-IZ1 = MNH_ALLOCATE_ZT3D(Z1,IIU,IJU,IKU  )
-IZ2 = MNH_ALLOCATE_ZT3D(Z2,IIU,IJU,IKU  )
-IZ3 = MNH_ALLOCATE_ZT3D(Z3,IIU,IJU,IKU  )
-!
-IZTMP1 = MNH_ALLOCATE_ZT3D( ZTMP1,IIU,IJU,IKU  )
-IZTMP2 = MNH_ALLOCATE_ZT3D( ZTMP2,IIU,IJU,IKU  )
+IZUC = MNH_ALLOCATE_FLAT( ZUC, IIU, IJU, IKU )
+IZVC = MNH_ALLOCATE_FLAT( ZVC, IIU, IJU, IKU )
+IZWC = MNH_ALLOCATE_FLAT( ZWC, IIU, IJU, IKU )
+IZ1  = MNH_ALLOCATE_FLAT( Z1,  IIU, IJU, IKU )
+IZ2  = MNH_ALLOCATE_FLAT( Z2,  IIU, IJU, IKU )
+IZ3  = MNH_ALLOCATE_FLAT( Z3,  IIU, IJU, IKU )
+!
+IZTMP1 = MNH_ALLOCATE_FLAT( ZTMP1, IIU, IJU, IKU )
+IZTMP2 = MNH_ALLOCATE_FLAT( ZTMP2, IIU, IJU, IKU )
 #endif
 !
 GWEST  = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() )
@@ -347,7 +347,7 @@ END IF
 #ifndef MNH_OPENACC
 DEALLOCATE( ZUC, ZVC, ZWC, Z1, Z2, Z3 )
 #else
-CALL MNH_REL_ZT3D (IZUC,IZVC,IZWC,IZ1,IZ2,IZ3,IZTMP1,IZTMP2)
+CALL MNH_RELEASE_FLAT( IZUC, IZVC, IZWC, IZ1, IZ2, IZ3, IZTMP1, IZTMP2 )
 #endif
 !
 !-------------------------------------------------------------------------------
diff --git a/src/ZSOLVER/modeln.f90 b/src/ZSOLVER/modeln.f90
index 4b03ed13b..14685ecbf 100644
--- a/src/ZSOLVER/modeln.f90
+++ b/src/ZSOLVER/modeln.f90
@@ -579,8 +579,8 @@ allocate( ZRVS  (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
 allocate( ZRWS  (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
 allocate( ZPABST(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) )
 #else
-IZRWS   = MNH_ALLOCATE_FLAT( ZRWS,   1, SIZE( XTHT, 1 ), 1, SIZE( XTHT, 2 ), 1, SIZE( XTHT, 3 ) )
-IZPABST = MNH_ALLOCATE_FLAT( ZPABST, 1, SIZE( XTHT, 1 ), 1, SIZE( XTHT, 2 ), 1, SIZE( XTHT, 3 ) )
+IZRWS   = MNH_ALLOCATE_FLAT( ZRWS,   SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 ) )
+IZPABST = MNH_ALLOCATE_FLAT( ZPABST, SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 ) )
 IZSEA = -1  !Set to -1 because not (yet) allocated
 IZTOWN = -1 !Set to -1 because not (yet) allocated
 #endif
@@ -1937,8 +1937,8 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
     ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
     ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
 #else
-    IZSEA  = MNH_ALLOCATE_FLAT( ZSEA,  1, SIZE( XRHODJ, 1 ), 1, SIZE( XRHODJ, 2 ) )
-    IZTOWN = MNH_ALLOCATE_FLAT( ZTOWN, 1, SIZE( XRHODJ, 1 ), 1, SIZE( XRHODJ, 2 ) )
+    IZSEA  = MNH_ALLOCATE_FLAT( ZSEA,  SIZE( XRHODJ, 1 ), SIZE( XRHODJ, 2 ) )
+    IZTOWN = MNH_ALLOCATE_FLAT( ZTOWN, SIZE( XRHODJ, 1 ), SIZE( XRHODJ, 2 ) )
 #endif
     CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
 !$acc update device( ZSEA, ZTOWN )
@@ -2052,8 +2052,8 @@ IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN
     ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
     ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
 #else
-    IZSEA  = MNH_ALLOCATE_FLAT( ZSEA,  1, SIZE( XRHODJ, 1 ), 1, SIZE( XRHODJ, 2 ) )
-    IZTOWN = MNH_ALLOCATE_FLAT( ZTOWN, 1, SIZE( XRHODJ, 1 ), 1, SIZE( XRHODJ, 2 ) )
+    IZSEA  = MNH_ALLOCATE_FLAT( ZSEA,  SIZE( XRHODJ, 1 ), SIZE( XRHODJ, 2 ) )
+    IZTOWN = MNH_ALLOCATE_FLAT( ZTOWN, SIZE( XRHODJ, 1 ), SIZE( XRHODJ, 2 ) )
 #endif
     CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
     CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD,                     &
diff --git a/src/ZSOLVER/p_abs.f90 b/src/ZSOLVER/p_abs.f90
index cd9786888..e2c098887 100644
--- a/src/ZSOLVER/p_abs.f90
+++ b/src/ZSOLVER/p_abs.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -124,7 +124,7 @@ USE MODE_REPRO_SUM
 USE MODI_BITREP
 #endif
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,   ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !  
 IMPLICIT NONE
@@ -227,9 +227,9 @@ ZCVD_O_RD = (XCPD - XRD) / XRD
 #ifndef MNH_OPENACC
 ALLOCATE (ZRTOT(IIU,IJU,IKU), ZRHOREF(IIU,IJU,IKU), ZWORK(IIU,IJU,IKU))
 #else
-IZRTOT   = MNH_ALLOCATE_ZT3D(ZRTOT,IIU,IJU,IKU  )
-IZRHOREF = MNH_ALLOCATE_ZT3D(ZRHOREF,IIU,IJU,IKU  )
-IZWORK   = MNH_ALLOCATE_ZT3D(ZWORK,IIU,IJU,IKU  )
+IZRTOT   = MNH_ALLOCATE_FLAT( ZRTOT,   IIU, IJU, IKU )
+IZRHOREF = MNH_ALLOCATE_FLAT( ZRHOREF, IIU, IJU, IKU )
+IZWORK   = MNH_ALLOCATE_FLAT( ZWORK,   IIU, IJU, IKU )
 #endif
 
 !-------------------------------------------------------------------------------
@@ -445,7 +445,7 @@ END IF
 #ifndef MNH_OPENACC
 DEALLOCATE (ZRTOT, ZRHOREF, ZWORK)
 #else
-CALL MNH_REL_ZT3D ( IZRTOT, IZRHOREF, IZWORK )
+CALL MNH_RELEASE_FLAT( IZRTOT, IZRHOREF, IZWORK )
 #endif
 !-------------------------------------------------------------------------------
 !
diff --git a/src/ZSOLVER/pressurez.f90 b/src/ZSOLVER/pressurez.f90
index 2d9b879ea..dd59a8483 100644
--- a/src/ZSOLVER/pressurez.f90
+++ b/src/ZSOLVER/pressurez.f90
@@ -257,7 +257,7 @@ USE MODD_VAR_ll,      ONLY: NMNH_COMM_WORLD , NPROC
 use mode_budget,      only: Budget_store_end
 USE MODE_ll
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK,   ONLY: MNH_ALLOCATE_ZT3D, MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,   ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 USE MODE_MPPDB
 USE MODE_MSG
@@ -498,15 +498,15 @@ ALLOCATE( ZDV_SOURCE(IIU, IJU, IKU) )
 ALLOCATE( ZTHETAV   (IIU, IJU, IKU) )
 ALLOCATE( ZPHIT     (IIU, IJU, IKU) )
 #else
-IZDV_SOURCE = MNH_ALLOCATE_ZT3D(ZDV_SOURCE ,IIU,IJU,IKU  )
-IZTHETAV    = MNH_ALLOCATE_ZT3D(ZTHETAV ,IIU,IJU,IKU  )
-IZPHIT      = MNH_ALLOCATE_ZT3D(ZPHIT ,IIU,IJU,IKU  )
-!
-IZPRHODJ     = MNH_ALLOCATE_ZT3D( ZPRHODJ,IIU,IJU,IKU  )
-IZMXM_PRHODJ = MNH_ALLOCATE_ZT3D( ZMXM_PRHODJ,IIU,IJU,IKU  )
-IZMZM_PRHODJ = MNH_ALLOCATE_ZT3D( ZMZM_PRHODJ,IIU,IJU,IKU  )
-IZGZ_M_W     = MNH_ALLOCATE_ZT3D( ZGZ_M_W,IIU,IJU,IKU  )
-IZMYM_PRHODJ = MNH_ALLOCATE_ZT3D( ZMYM_PRHODJ,IIU,IJU,IKU  )
+IZDV_SOURCE = MNH_ALLOCATE_FLAT( ZDV_SOURCE, IIU, IJU, IKU )
+IZTHETAV    = MNH_ALLOCATE_FLAT( ZTHETAV,    IIU, IJU, IKU )
+IZPHIT      = MNH_ALLOCATE_FLAT( ZPHIT,      IIU, IJU, IKU )
+!
+IZPRHODJ     = MNH_ALLOCATE_FLAT( ZPRHODJ,     IIU, IJU, IKU )
+IZMXM_PRHODJ = MNH_ALLOCATE_FLAT( ZMXM_PRHODJ, IIU, IJU, IKU )
+IZMZM_PRHODJ = MNH_ALLOCATE_FLAT( ZMZM_PRHODJ, IIU, IJU, IKU )
+IZGZ_M_W     = MNH_ALLOCATE_FLAT( ZGZ_M_W,     IIU, IJU, IKU )
+IZMYM_PRHODJ = MNH_ALLOCATE_FLAT( ZMYM_PRHODJ, IIU, IJU, IKU )
 #endif
 !
 IF (GFIRST_CALL_PRESSUREZ) THEN
@@ -1123,8 +1123,8 @@ deallocate( ZDV_SOURCE )
 deallocate( ZTHETAV )
 deallocate( ZPHIT )
 #else
-CALL MNH_REL_ZT3D ( IZPRHODJ,IZMXM_PRHODJ,IZMZM_PRHODJ,IZGZ_M_W,IZMYM_PRHODJ )
-CALL MNH_REL_ZT3D ( IZDV_SOURCE,IZTHETAV,IZPHIT)
+CALL MNH_RELEASE_FLAT( IZPRHODJ, IZMXM_PRHODJ, IZMZM_PRHODJ, IZGZ_M_W, IZMYM_PRHODJ )
+CALL MNH_RELEASE_FLAT( IZDV_SOURCE, IZTHETAV, IZPHIT )
 #endif
 !-------------------------------------------------------------------------------
 !
diff --git a/src/ZSOLVER/qlap.f90 b/src/ZSOLVER/qlap.f90
index a92963b96..288ab841f 100644
--- a/src/ZSOLVER/qlap.f90
+++ b/src/ZSOLVER/qlap.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -154,7 +154,7 @@ USE MODI_SHUMAN
 !
 USE MODE_MPPDB
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_FLAT , MNH_RELEASE_FLAT
 #endif
 !
 USE MODD_IBM_PARAM_n, ONLY: XIBM_LS, LIBM, XIBM_SU
@@ -218,9 +218,9 @@ IKE = IKU - JPVEXT
 IKB =   1 + JPVEXT
 !
 #ifdef MNH_OPENACC
-IZU = MNH_ALLOCATE_ZT3D( ZU,IIU,IJU,IKU  )
-IZV = MNH_ALLOCATE_ZT3D( ZV,IIU,IJU,IKU  )   
-IZW = MNH_ALLOCATE_ZT3D( ZW,IIU,IJU,IKU  )
+IZU = MNH_ALLOCATE_FLAT( ZU,IIU,IJU,IKU  )
+IZV = MNH_ALLOCATE_FLAT( ZV,IIU,IJU,IKU  )
+IZW = MNH_ALLOCATE_FLAT( ZW,IIU,IJU,IKU  )
 #endif
 !
 ZU = GX_M_U(1,IKU,1,PY,PDXX,PDZZ,PDZX)
@@ -331,7 +331,7 @@ IF (LIBM)  THEN
 ENDIF
 !
 #ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D (  IZU,IZV,IZW )
+CALL MNH_RELEASE_FLAT (  IZU,IZV,IZW )
 #endif
 !-------------------------------------------------------------------------------
 !
@@ -426,7 +426,7 @@ USE MODI_SHUMAN_DEVICE
 !
 USE MODE_MPPDB
 !
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,   ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 !
 USE MODI_GET_HALO
 USE MODD_IBM_PARAM_n, ONLY: XIBM_LS, LIBM, XIBM_SU
@@ -491,15 +491,15 @@ GEAST  = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() )
 GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() )
 GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() )
 !
-IZU = MNH_ALLOCATE_ZT3D( ZU,IIU,IJU,IKU  )
-IZV = MNH_ALLOCATE_ZT3D( ZV,IIU,IJU,IKU  )   
-IZW = MNH_ALLOCATE_ZT3D( ZW,IIU,IJU,IKU  )
+IZU = MNH_ALLOCATE_FLAT( ZU, IIU, IJU, IKU )
+IZV = MNH_ALLOCATE_FLAT( ZV, IIU, IJU, IKU )
+IZW = MNH_ALLOCATE_FLAT( ZW, IIU, IJU, IKU )
 !
-IZMXM = MNH_ALLOCATE_ZT3D( ZMXM,IIU,IJU,IKU  )
-IZMYM = MNH_ALLOCATE_ZT3D( ZMYM,IIU,IJU,IKU  )
-IZMZM = MNH_ALLOCATE_ZT3D( ZMZM,IIU,IJU,IKU  )
-IZRHODJ = MNH_ALLOCATE_ZT3D( ZRHODJ ,IIU,IJU,IKU  )
-IZGZMW  = MNH_ALLOCATE_ZT3D( ZGZMW  ,IIU,IJU,IKU  )
+IZMXM   = MNH_ALLOCATE_FLAT( ZMXM,   IIU, IJU, IKU )
+IZMYM   = MNH_ALLOCATE_FLAT( ZMYM,   IIU, IJU, IKU )
+IZMZM   = MNH_ALLOCATE_FLAT( ZMZM,   IIU, IJU, IKU )
+IZRHODJ = MNH_ALLOCATE_FLAT( ZRHODJ, IIU, IJU, IKU )
+IZGZMW  = MNH_ALLOCATE_FLAT( ZGZMW,  IIU, IJU, IKU )
 !
 CALL GX_M_U_DEVICE(1,IKU,1,PY,PDXX,PDZZ,PDZX,ZU)
 CALL MPPDB_CHECK3D(ZU,'QLAP::ZU',PRECISION)
@@ -632,7 +632,7 @@ IF (LIBM)  THEN
    !
 ENDIF
 !
-CALL MNH_REL_ZT3D (  IZU,IZV,IZW, IZMXM,IZMYM,IZMZM,IZRHODJ,IZGZMW )
+CALL MNH_RELEASE_FLAT( IZU, IZV, IZW, IZMXM, IZMYM, IZMZM, IZRHODJ, IZGZMW )
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE QLAP_DEVICE
diff --git a/src/ZSOLVER/tridiag_thermo.f90 b/src/ZSOLVER/tridiag_thermo.f90
index 0e6f21de9..333047bf3 100644
--- a/src/ZSOLVER/tridiag_thermo.f90
+++ b/src/ZSOLVER/tridiag_thermo.f90
@@ -158,8 +158,7 @@ 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
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_FLAT , MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -235,19 +234,18 @@ 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 )
+izrhodj_dfddtdz_o_dz2 = MNH_ALLOCATE_FLAT( zrhodj_dfddtdz_o_dz2, JIU, JJU, JKU )
+izmzm_rhodj           = MNH_ALLOCATE_FLAT( zmzm_rhodj          , JIU, JJU, JKU )
+iza                   = MNH_ALLOCATE_FLAT( za                  , JIU, JJU, JKU )
+izb                   = MNH_ALLOCATE_FLAT( zb                  , JIU, JJU, JKU )
+izc                   = MNH_ALLOCATE_FLAT( zc                  , JIU, JJU, JKU )
+izy                   = MNH_ALLOCATE_FLAT( zy                  , JIU, JJU, JKU )
+izgam                 = MNH_ALLOCATE_FLAT( zgam                , JIU, JJU, JKU )
+izbet                 = MNH_ALLOCATE_FLAT( zbet                , JIU, JJU )
 #endif
 
 #ifdef MNH_OPENACC
-iztmp1_device = MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( zrhodj_dfddtdz_o_dz2, zmzm_rhodj, za, zb, zc, zy, zgam, zbet, ztmp1_device )
@@ -480,9 +478,8 @@ end if
 #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")
+CALL MNH_RELEASE_FLAT( IZRHODJ_DFDDTDZ_O_DZ2, IZMZM_RHODJ, IZA, IZB, IZC, IZY, IZGAM, &
+                       IZBET, iztmp1_device )
 #endif
 
 !$acc end data
diff --git a/src/ZSOLVER/turb.f90 b/src/ZSOLVER/turb.f90
index 66b8ae380..450f91cc1 100644
--- a/src/ZSOLVER/turb.f90
+++ b/src/ZSOLVER/turb.f90
@@ -9,9 +9,7 @@ module mode_turb
 
 #ifdef MNH_OPENACC
   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
+  USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 
 #ifdef MNH_BITREP
@@ -617,75 +615,74 @@ 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 )
+IZCP        = MNH_ALLOCATE_FLAT( ZCP,        JIU, JJU, JKU )
+IZEXN       = MNH_ALLOCATE_FLAT( ZEXN,       JIU, JJU, JKU )
+IZT         = MNH_ALLOCATE_FLAT( ZT,         JIU, JJU, JKU )
+IZLOCPEXNM  = MNH_ALLOCATE_FLAT( ZLOCPEXNM,  JIU, JJU, JKU )
+IZLEPS      = MNH_ALLOCATE_FLAT( ZLEPS,      JIU, JJU, JKU )
+IZTRH       = MNH_ALLOCATE_FLAT( ZTRH,       JIU, JJU, JKU )
+IZATHETA    = MNH_ALLOCATE_FLAT( ZATHETA,    JIU, JJU, JKU )
+IZAMOIST    = MNH_ALLOCATE_FLAT( ZAMOIST,    JIU, JJU, JKU )
+IZCOEF_DISS = MNH_ALLOCATE_FLAT( ZCOEF_DISS, JIU, JJU, JKU )
+IZFRAC_ICE  = MNH_ALLOCATE_FLAT( ZFRAC_ICE,  JIU, JJU, JKU )
+
+IZMWTH = MNH_ALLOCATE_FLAT( ZMWTH, JIU, JJU, JKU )
+IZMWR  = MNH_ALLOCATE_FLAT( ZMWR,  JIU, JJU, JKU )
+IZMTH2 = MNH_ALLOCATE_FLAT( ZMTH2, JIU, JJU, JKU )
+IZMR2  = MNH_ALLOCATE_FLAT( ZMR2,  JIU, JJU, JKU )
+IZMTHR = MNH_ALLOCATE_FLAT( ZMTHR, JIU, JJU, JKU )
+
+IZFWTH = MNH_ALLOCATE_FLAT( ZFWTH, JIU, JJU, JKU )
+IZFWR  = MNH_ALLOCATE_FLAT( ZFWR,  JIU, JJU, JKU )
+IZFTH2 = MNH_ALLOCATE_FLAT( ZFTH2, JIU, JJU, JKU )
+IZFR2  = MNH_ALLOCATE_FLAT( ZFR2,  JIU, JJU, JKU )
+IZFTHR = MNH_ALLOCATE_FLAT( ZFTHR, JIU, JJU, JKU )
+IZTHLM = MNH_ALLOCATE_FLAT( 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  )
+IZRM = MNH_ALLOCATE_FLAT( 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 )
+IZTAU11M = MNH_ALLOCATE_FLAT( ZTAU11M, JIU, JJU )
+IZTAU12M = MNH_ALLOCATE_FLAT( ZTAU12M, JIU, JJU )
+IZTAU22M = MNH_ALLOCATE_FLAT( ZTAU22M, JIU, JJU )
+IZTAU33M = MNH_ALLOCATE_FLAT( ZTAU33M, JIU, JJU )
+IZUSLOPE = MNH_ALLOCATE_FLAT( ZUSLOPE, JIU, JJU )
+IZVSLOPE = MNH_ALLOCATE_FLAT( ZVSLOPE, JIU, JJU )
+IZCDUEFF = MNH_ALLOCATE_FLAT( ZCDUEFF, JIU, JJU )
+IZLMO    = MNH_ALLOCATE_FLAT( 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 )
+IZUSTAR = MNH_ALLOCATE_FLAT( ZUSTAR, JIU, JJU_ORMC01 )
+IZRVM   = MNH_ALLOCATE_FLAT( ZRVM,   JIU, JJU_ORMC01 )
+IZSFRV  = MNH_ALLOCATE_FLAT( 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 )
+iztt   = MNH_ALLOCATE_FLAT( ztt,   JIU, JJU, JKU_CLOUD )
+izexne = MNH_ALLOCATE_FLAT( zexne, JIU, JJU, JKU_CLOUD )
+izlv   = MNH_ALLOCATE_FLAT( zlv,   JIU, JJU, JKU_CLOUD )
+izcph  = MNH_ALLOCATE_FLAT( 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 )
+izshear = MNH_ALLOCATE_FLAT( 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 )
+izdudz = MNH_ALLOCATE_FLAT( zdudz, JIU, JJU, JKU_TURB )
+izdvdz = MNH_ALLOCATE_FLAT( zdvdz, JIU, JJU, JKU_TURB )
 
 #endif
 
 #ifdef MNH_OPENACC
-iztmp1_device =  MNH_ALLOCATE_ZT3D( ztmp1_device,JIU,JJU,JKU )
+iztmp1_device = MNH_ALLOCATE_FLAT( 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 )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU_TURB )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU_TURB )
 
 #endif
 
@@ -1609,22 +1606,20 @@ deallocate( zcp, zexn, zt, zlocpexnm, zleps, ztrh,         &
             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_RELEASE_FLAT( 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_RELEASE_FLAT( iztau11m, iztau12m, iztau22m, iztau33m,   &
+                       izuslope, izvslope, izcdueff, izlmo,      &
+                       izustar, izrvm, izsfrv                   )
 
-CALL MNH_REL_ZT3D ( izrm)
+CALL MNH_RELEASE_FLAT( izrm)
 
-CALL MNH_REL_ZT3D ( izmwth, izmwr, izmth2, izmr2, izmthr,        &
-                    izfwth, izfwr, izfth2, izfr2, izfthr, izthlm )
+CALL MNH_RELEASE_FLAT( 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")
+CALL MNH_RELEASE_FLAT( izcp, izexn, izt, izlocpexnm, izleps, iztrh, &
+                       izatheta, izamoist, izcoef_diss, izfrac_ice  )
 #endif
 
 !$acc end data
@@ -1799,8 +1794,8 @@ INTEGER :: izrvsat, izdrvsatdt
   allocate( zrvsat   ( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) )
   allocate( zdrvsatdt( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) )
 #else
-izrvsat    = MNH_ALLOCATE_ZT3D( zrvsat   , size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) 
-izdrvsatdt = MNH_ALLOCATE_ZT3D( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
+izrvsat    = MNH_ALLOCATE_FLAT( zrvsat   , size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
+izdrvsatdt = MNH_ALLOCATE_FLAT( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) )
 #endif
 
 !$acc data present( zrvsat, zdrvsatdt )
@@ -1875,7 +1870,7 @@ izdrvsatdt = MNH_ALLOCATE_ZT3D( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), siz
 #ifndef MNH_OPENACC 
   deallocate( zrvsat, zdrvsatdt )
 #else
-  CALL MNH_REL_ZT3D(izrvsat, izdrvsatdt )
+  CALL MNH_RELEASE_FLAT( izrvsat, izdrvsatdt )
 #endif
  
 !$acc end data
@@ -2411,16 +2406,16 @@ allocate( ZDRTDZ (JIU,JJU,JKU) )
 allocate( ZETHETA(JIU,JJU,JKU) )
 allocate( ZEMOIST(JIU,JJU,JKU) )
 #else
-IZWORK2D = MNH_ALLOCATE_ZT2D( ZWORK2D,JIU,JJU)
-IZDTHLDZ = MNH_ALLOCATE_ZT3D( ZDTHLDZ,JIU,JJU,JKU)
-IZDRTDZ  = MNH_ALLOCATE_ZT3D( ZDRTDZ ,JIU,JJU,JKU)
-IZETHETA = MNH_ALLOCATE_ZT3D( ZETHETA,JIU,JJU,JKU)
-IZEMOIST = MNH_ALLOCATE_ZT3D( ZEMOIST,JIU,JJU,JKU)
+IZWORK2D = MNH_ALLOCATE_FLAT( ZWORK2D, JIU, JJU )
+IZDTHLDZ = MNH_ALLOCATE_FLAT( ZDTHLDZ, JIU, JJU, JKU )
+IZDRTDZ  = MNH_ALLOCATE_FLAT( ZDRTDZ,  JIU, JJU, JKU )
+IZETHETA = MNH_ALLOCATE_FLAT( ZETHETA, JIU, JJU, JKU )
+IZEMOIST = MNH_ALLOCATE_FLAT( ZEMOIST, JIU, JJU, JKU )
 #endif
 
 #ifdef MNH_OPENACC
-IZTMP1_DEVICE = MNH_ALLOCATE_ZT3D( ZTMP1_DEVICE,JIU,JJU,JKU)
-IZTMP2_DEVICE = MNH_ALLOCATE_ZT3D( ZTMP2_DEVICE,JIU,JJU,JKU)
+IZTMP1_DEVICE = MNH_ALLOCATE_FLAT( ZTMP1_DEVICE, JIU, JJU, JKU )
+IZTMP2_DEVICE = MNH_ALLOCATE_FLAT( ZTMP2_DEVICE, JIU, JJU, JKU )
 #endif
 
 !$acc data present(zwork2d, zdthldz, zdrtdz, zetheta, zemoist, &
@@ -2635,8 +2630,8 @@ end if
 #ifndef MNH_OPENACC
 deallocate(zwork2d, zdthldz, zdrtdz, zetheta, zemoist ) 
 #else
-CALL MNH_REL_ZT3D(izwork2d, izdthldz, izdrtdz, izetheta, izemoist, &
-                iztmp1_device, iztmp2_device )
+CALL MNH_RELEASE_FLAT( izwork2d, izdthldz, izdrtdz, izetheta, izemoist, &
+                       iztmp1_device, iztmp2_device )
 #endif
 
 !$acc end data
diff --git a/src/ZSOLVER/turb_hor_dyn_corr.f90 b/src/ZSOLVER/turb_hor_dyn_corr.f90
index 55c14bce6..6b74f21fd 100644
--- a/src/ZSOLVER/turb_hor_dyn_corr.f90
+++ b/src/ZSOLVER/turb_hor_dyn_corr.f90
@@ -153,7 +153,7 @@ USE MODD_NSV
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
 USE MODE_ll
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 use mode_mppdb
 !
@@ -359,34 +359,34 @@ 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 )
+izflx          = MNH_ALLOCATE_FLAT( zflx,  JIU, JJU, JKU )
+izwork         = MNH_ALLOCATE_FLAT( zwork, JIU, JJU, JKU )
 
-izdirsinzw     = MNH_ALLOCATE_ZT2D( zdirsinzw,JIU,JJU )
+izdirsinzw     = MNH_ALLOCATE_FLAT( zdirsinzw,JIU,JJU )
 
-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 )
+igx_u_m_pum    = MNH_ALLOCATE_FLAT( gx_u_m_pum, JIU, JJU, JKU )
+igy_v_m_pvm    = MNH_ALLOCATE_FLAT( gy_v_m_pvm, JIU, JJU, JKU )
+igz_w_m_pwm    = MNH_ALLOCATE_FLAT( gz_w_m_pwm, JIU, JJU, JKU )
+igz_w_m_zwp    = MNH_ALLOCATE_FLAT( gz_w_m_zwp, JIU, JJU, JKU )
+izmzf_dzz      = MNH_ALLOCATE_FLAT( zmzf_dzz,   JIU, JJU, JKU )
+izdfddwdz      = MNH_ALLOCATE_FLAT( zdfddwdz,   JIU, JJU, JKU )
+izwp           = MNH_ALLOCATE_FLAT( zwp,        JIU, JJU, JKU )
 
-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 )
+izdu_dz_dzs_dx = MNH_ALLOCATE_FLAT( zdu_dz_dzs_dx,1, JIU, 1, JJU, 1 , 1 )
+izdv_dz_dzs_dy = MNH_ALLOCATE_FLAT( zdv_dz_dzs_dy,1, JIU, 1, JJU, 1 , 1 )
+izdu_dx        = MNH_ALLOCATE_FLAT( zdu_dx,       1, JIU, 1, JJU, 1 , 1 )
+izdv_dy        = MNH_ALLOCATE_FLAT( zdv_dy,       1, JIU, 1, JJU, 1 , 1 )
+izdw_dz        = MNH_ALLOCATE_FLAT( zdw_dz,       1, JIU, 1, 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 )
+izcoeff        = MNH_ALLOCATE_FLAT( zcoeff,1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
+izdzz          = MNH_ALLOCATE_FLAT( zdzz,  1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
 #endif
 
 #ifdef MNH_OPENACC
-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 )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present(ZFLX, ZWORK, ZDIRSINZW, ZCOEFF, ZDZZ,                  &
@@ -1337,12 +1337,12 @@ DEALLOCATE (ZFLX, ZWORK, ZDIRSINZW, ZCOEFF, ZDZZ,                  &
             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             )
+CALL MNH_RELEASE_FLAT( IZTMP1_DEVICE, IZTMP2_DEVICE, IZTMP3_DEVICE, IZTMP4_DEVICE )
+CALL MNH_RELEASE_FLAT( 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
      
diff --git a/src/ZSOLVER/turb_hor_thermo_flux.f90 b/src/ZSOLVER/turb_hor_thermo_flux.f90
index 2a7724466..a6b56908f 100644
--- a/src/ZSOLVER/turb_hor_thermo_flux.f90
+++ b/src/ZSOLVER/turb_hor_thermo_flux.f90
@@ -152,9 +152,7 @@ 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
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 IMPLICIT NONE
@@ -285,24 +283,23 @@ allocate( zflxc(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 )
+izflx  = MNH_ALLOCATE_FLAT( zflx,  JIU, JJU, JKU )
+izflxc = MNH_ALLOCATE_FLAT( zflxc, JIU, JJU, JKU )
+! izvptv= MNH_ALLOCATE_FLAT( zvptv, JIU, JJU, JKU )
 
-izcoeff= MNH_ALLOCATE_ZT3DP( zcoeff,JIU,JJU, 1 + jpvext , 3 + jpvext )
+izcoeff= MNH_ALLOCATE_FLAT( zcoeff, 1, JIU, 1, JJU, 1 + jpvext, 3 + jpvext )
 
 #endif
 
 #ifdef MNH_OPENACC
-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  )
+iztmp1_device = MNH_ALLOCATE_FLAT( ztmp1_device, JIU, JJU, JKU )
+iztmp2_device = MNH_ALLOCATE_FLAT( ztmp2_device, JIU, JJU, JKU )
+iztmp3_device = MNH_ALLOCATE_FLAT( ztmp3_device, JIU, JJU, JKU )
+iztmp4_device = MNH_ALLOCATE_FLAT( ztmp4_device, JIU, JJU, JKU )
+iztmp5_device = MNH_ALLOCATE_FLAT( ztmp5_device, JIU, JJU, JKU )
+iztmp6_device = MNH_ALLOCATE_FLAT( ztmp6_device, JIU, JJU, JKU )
+iztmp7_device = MNH_ALLOCATE_FLAT( ztmp7_device, JIU, JJU, JKU )
+iztmp8_device = MNH_ALLOCATE_FLAT( ztmp8_device, JIU, JJU, JKU )
 #endif
 
 !$acc data present( ZFLX, ZFLXC, ZCOEFF,                                    &
@@ -1847,10 +1844,9 @@ end if
 #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")
+CALL MNH_RELEASE_FLAT( IZFLX, IZFLXC, 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/ZSOLVER/zsolver.f90 b/src/ZSOLVER/zsolver.f90
index edc63f40b..ab198f36e 100644
--- a/src/ZSOLVER/zsolver.f90
+++ b/src/ZSOLVER/zsolver.f90
@@ -154,7 +154,7 @@ USE MODI_ZSOLVER_INV
 USE MODI_DOTPROD
 !
 #ifdef MNH_OPENACC
-USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
 !
 !
@@ -240,11 +240,11 @@ JKU =  size(PPHI, 3 )
 #ifndef MNH_OPENACC
 ALLOCATE(ZDELTA(JIU,JJU,JKU),ZKSI(JIU,JJU,JKU),ZP(JIU,JJU,JKU),ZQ(JIU,JJU,JKU),ZRESIDUE(JIU,JJU,JKU))
 #else
-IZDELTA   = MNH_ALLOCATE_ZT3D(ZDELTA   ,JIU,JJU,JKU )
-IZKSI     = MNH_ALLOCATE_ZT3D(ZKSI     ,JIU,JJU,JKU )
-IZP       = MNH_ALLOCATE_ZT3D(ZP       ,JIU,JJU,JKU )
-IZQ       = MNH_ALLOCATE_ZT3D(ZQ       ,JIU,JJU,JKU )
-IZRESIDUE = MNH_ALLOCATE_ZT3D(ZRESIDUE ,JIU,JJU,JKU )
+IZDELTA   = MNH_ALLOCATE_FLAT( ZDELTA   , JIU, JJU, JKU )
+IZKSI     = MNH_ALLOCATE_FLAT( ZKSI     , JIU, JJU, JKU )
+IZP       = MNH_ALLOCATE_FLAT( ZP       , JIU, JJU, JKU )
+IZQ       = MNH_ALLOCATE_FLAT( ZQ       , JIU, JJU, JKU )
+IZRESIDUE = MNH_ALLOCATE_FLAT( ZRESIDUE , JIU, JJU, JKU )
 
 #endif
 !*       1.1    compute the vector: r^(0) =  Q(PHI) - Y
@@ -333,7 +333,7 @@ END DO              ! end of the loop for the iterative solver
 #ifndef MNH_OPENACC
 DEALLOCATE(ZDELTA,ZKSI,ZP,ZQ,ZRESIDUE)
 #else
-CALL MNH_REL_ZT3D(IZDELTA,IZKSI,IZP,IZQ,IZRESIDUE)
+CALL MNH_RELEASE_FLAT( IZDELTA, IZKSI, IZP, IZQ, IZRESIDUE )
 #endif
 !-------------------------------------------------------------------------------
 !
diff --git a/src/ZSOLVER/zsolver_inv.f90 b/src/ZSOLVER/zsolver_inv.f90
index ceaa670be..cc4d32025 100644
--- a/src/ZSOLVER/zsolver_inv.f90
+++ b/src/ZSOLVER/zsolver_inv.f90
@@ -146,7 +146,7 @@ SUBROUTINE ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, &
   !
   USE mode_mg_main_mnh
 #ifdef MNH_OPENACC
-  USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+  USE MODE_MNH_ZWORK,   ONLY: MNH_ALLOCATE_FLAT, MNH_RELEASE_FLAT
 #endif
   !
   IMPLICIT NONE
@@ -219,7 +219,7 @@ SUBROUTINE ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, &
 #ifndef MNH_OPENACC
   ALLOCATE(ZY(IIU,IJU,IKU))
 #else
-  IZY = MNH_ALLOCATE_ZT3D(ZY ,IIU,IJU,IKU )
+  IZY = MNH_ALLOCATE_FLAT( ZY, IIU, IJU, IKU )
 #endif
   !
   !-------------------------------------------------------------------------------
@@ -318,7 +318,7 @@ SUBROUTINE ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, &
 #ifndef MNH_OPENACC
   DEALLOCATE(ZY)
 #else
-  CALL MNH_REL_ZT3D(IZY)
+  CALL MNH_RELEASE_FLAT( IZY )
 #endif  
   !
 CONTAINS
-- 
GitLab