From 51bab8e9828c0ab3f03122b26566157afbf75262 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 8 Feb 2022 10:44:24 +0100
Subject: [PATCH] Philippe 08/02/2022: OpenACC: replace MEM_GET_ZT3D family
 calls by MNH_MEM_ALLOCATE family calls (not yet finished)

---
 src/MNH/advec_ppm_algo.f90        |  82 ++------
 src/MNH/advection_metsv.f90       |  14 +-
 src/MNH/advection_uvw.f90         |  77 +-------
 src/MNH/advection_uvw_cen.f90     |  16 +-
 src/MNH/advecuvw_4th.f90          | 112 ++++-------
 src/MNH/advecuvw_rk.f90           | 146 ++++++--------
 src/MNH/advecuvw_weno_k.f90       | 306 +++++++++++++++++-------------
 src/MNH/contrav.f90               |  31 ++-
 src/MNH/gradient_m.f90            | 128 ++++++++-----
 src/ZSOLVER/advection_metsv.f90   |  14 +-
 src/ZSOLVER/advection_uvw.f90     |  78 +-------
 src/ZSOLVER/advection_uvw_cen.f90 |  16 +-
 src/ZSOLVER/advecuvw_rk.f90       | 140 ++++++--------
 src/ZSOLVER/advecuvw_weno_k.f90   | 302 ++++++++++++++++-------------
 src/ZSOLVER/contrav.f90           |  39 ++--
 src/ZSOLVER/gdiv.f90              |   9 +-
 16 files changed, 659 insertions(+), 851 deletions(-)

diff --git a/src/MNH/advec_ppm_algo.f90 b/src/MNH/advec_ppm_algo.f90
index 8e0bcaf4a..b594d954a 100644
--- a/src/MNH/advec_ppm_algo.f90
+++ b/src/MNH/advec_ppm_algo.f90
@@ -42,70 +42,11 @@ END INTERFACE
 END MODULE MODI_ADVEC_PPM_ALGO
 !
 !
-#ifdef MNH_OPENACC
-!     ##########################################################################
-      SUBROUTINE  ADVEC_PPM_ALGO(HMET_ADV_SCHEME, HLBCX, HLBCY, KGRID, PFIELDT, &
-                                 PRHODJ, PTSTEP, PTSTEP_PPM,                   &
-                                 PRHOX1, PRHOX2, PRHOY1, PRHOY2, PRHOZ1,PRHOZ2,&
-                                 PSRC, TPDTCUR, PCRU, PCRV, PCRW)
-!
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
-USE MODD_TIME, ONLY: DATE_TIME
-!
-IMPLICIT NONE
-!
-!*       0.1   Declarations of dummy arguments :
-!
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX  ! X direction LBC type
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY  ! Y direction LBC type
-CHARACTER (LEN=6),               INTENT(IN) :: HMET_ADV_SCHEME
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PFIELDT      ! variable at t
-INTEGER,                INTENT(IN)  :: KGRID        ! C grid localisation
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PCRU, PCRV, PCRW ! Courant numbers 
-!
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHODJ  ! density
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHOX1, PRHOX2
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHOY1, PRHOY2
-REAL, DIMENSION(:,:,:), INTENT(IN)  :: PRHOZ1, PRHOZ2
-REAL,                   INTENT(IN)  :: PTSTEP  ! Time step 
-REAL,                   INTENT(IN)  :: PTSTEP_PPM ! Time Step PPM
-TYPE (DATE_TIME),       INTENT(IN)  :: TPDTCUR ! current date and time
-!
-REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRC    ! source term after advection
-
-INTEGER :: IZPPM
-
-!$acc data present( PFIELDT, PCRU, PCRV, PCRW, PRHODJ, PRHOX1, PRHOX2, PRHOY1, PRHOY2, PRHOZ1, PRHOZ2, PSRC )
-
-           CALL  MNH_GET_ZT3D(IZPPM)
-
-           CALL ADVEC_PPM_ALGO_D(HMET_ADV_SCHEME, HLBCX, HLBCY, KGRID, PFIELDT, &
-                               & PRHODJ, PTSTEP, PTSTEP_PPM, &
-                               & PRHOX1, PRHOX2, PRHOY1, PRHOY2, PRHOZ1,PRHOZ2,&
-                               & PSRC, TPDTCUR, PCRU, PCRV, PCRW, & 
-                               & ZT3D(:,:,:,IZPPM) )
-
-           CALL  MNH_REL_ZT3D(IZPPM)
-
-!$acc end data
-
-CONTAINS
-#endif
 !     ##########################################################################
-#ifndef MNH_OPENACC
       SUBROUTINE  ADVEC_PPM_ALGO(HMET_ADV_SCHEME, HLBCX, HLBCY, KGRID, PFIELDT, &
                                  PRHODJ, PTSTEP, PTSTEP_PPM, &
                                  PRHOX1, PRHOX2, PRHOY1, PRHOY2, PRHOZ1,PRHOZ2,&
                                  PSRC, TPDTCUR, PCRU, PCRV, PCRW)
-#else
-      SUBROUTINE  ADVEC_PPM_ALGO_D(HMET_ADV_SCHEME, HLBCX, HLBCY, KGRID, PFIELDT, &
-                                 PRHODJ, PTSTEP, PTSTEP_PPM, &
-                                 PRHOX1, PRHOX2, PRHOY1, PRHOY2, PRHOZ1,PRHOZ2,&
-                                 PSRC, TPDTCUR, PCRU, PCRV, PCRW, &
-                                 ZPPM)
-#endif
 !     ##########################################################################
 !!
 !!****  *ADVEC_PPM_ALGO* - interface for 3D advection with PPM type scheme
@@ -137,6 +78,7 @@ CONTAINS
 USE MODD_TYPE_DATE
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
+USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 use mode_mppdb
 #ifdef MNH_OPENACC
@@ -175,12 +117,12 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRC    ! source term after advection
 !
 LOGICAL  :: GFLAG   ! Logical flag
 #ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:) :: ZPPM   ! temp PPM output
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZPPM   ! temp PPM output
 #endif
 !
 !-------------------------------------------------------------------------------
 !
-!$acc data present( PFIELDT, PCRU, PCRV, PCRW, PRHODJ, PRHOX1, PRHOX2, PRHOY1, PRHOY2, PRHOZ1, PRHOZ2, PSRC, ZPPM )
+!$acc data present( PFIELDT, PCRU, PCRV, PCRW, PRHODJ, PRHOX1, PRHOX2, PRHOY1, PRHOY2, PRHOZ1, PRHOZ2, PSRC )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -303,6 +245,13 @@ CASE('PPM_00')
 CASE('PPM_01')
 !
 #ifdef MNH_OPENACC
+  !Pin positions in the pools of MNH memory
+  CALL MNH_MEM_POSITION_PIN()
+
+  CALL MNH_MEM_GET( ZPPM, SIZE( PSRC, 1 ), SIZE( PSRC, 2 ), SIZE( PSRC, 3 ) )
+
+  !$acc data present( ZPPM )
+
   CALL INIT_ON_HOST_AND_DEVICE(ZPPM,PVALUE=-1e99,HNAME='ADVEC_PPM_ALGO::ZPPM')
 #endif
    IF (GFLAG ) THEN
@@ -400,6 +349,13 @@ CASE('PPM_01')
 #endif
 !
    END IF
+
+   !$acc end data
+
+#ifdef MNH_OPENACC
+  !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+  CALL MNH_MEM_RELEASE()
+#endif
 !
 ! monotonic scheme (Skamarock notation)
 !
@@ -507,8 +463,4 @@ END IF
 !
 !$acc end data
 
-#ifdef MNH_OPENACC
-END SUBROUTINE ADVEC_PPM_ALGO_D
-#endif
-!
 END SUBROUTINE ADVEC_PPM_ALGO
diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index ea8140def..6ba1850b6 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -174,8 +174,7 @@ 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_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE, &
-                               MNH_GET_ZT3D, MNH_REL_ZT3D, ZT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 use mode_exchange_ll,    only: UPDATE_HALO_ll
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
@@ -299,7 +298,6 @@ INTEGER             :: ISPLIT_PPM   ! temporal time splitting
 INTEGER             :: IIB, IIE, IJB, IJE,IKB,IKE
 #ifdef MNH_OPENACC
 CHARACTER(LEN=3) :: YNUM
-INTEGER :: IZ1, IZ2
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 !
@@ -481,8 +479,6 @@ CALL INIT_ON_HOST_AND_DEVICE(ZRHOY1,PVALUE=-1e95,HNAME='ADVECTION_METSV::ZRHOY1'
 CALL INIT_ON_HOST_AND_DEVICE(ZRHOY2,PVALUE=-1e96,HNAME='ADVECTION_METSV::ZRHOY2')
 CALL INIT_ON_HOST_AND_DEVICE(ZRHOZ1,PVALUE=-1e97,HNAME='ADVECTION_METSV::ZRHOZ1')
 CALL INIT_ON_HOST_AND_DEVICE(ZRHOZ2,PVALUE=-1e98,HNAME='ADVECTION_METSV::ZRHOZ2')
-!
-CALL MNH_GET_ZT3D(IZ1, IZ2)
 #endif
 !
 IF(LBLOWSNOW) THEN    ! Put 2D Canopy blowing snow variables into a 3D array for advection
@@ -515,10 +511,10 @@ END IF
 #else
 IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN
  CALL CONTRAV_DEVICE (HLBCX,HLBCY,PUT,PVT,PWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCPPM,ZRVCPPM,ZRWCPPM,2, &
-                ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+                ODATA_ON_DEVICE=.TRUE.)
 ELSE
  CALL CONTRAV_DEVICE (HLBCX,HLBCY,PUT,PVT,PWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCPPM,ZRVCPPM,ZRWCPPM,4, &
-                ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+                ODATA_ON_DEVICE=.TRUE.)
 END IF
 #endif
 !
@@ -1072,10 +1068,6 @@ end if
 ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
 call Sources_neg_correct( hcloud, 'NEADV', krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs )
 
-#ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D(IZ1, IZ2)
-#endif
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRTHS,"ADVECTION_METSV end:PRTHS")
diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90
index 24047a92f..2d08a7842 100644
--- a/src/MNH/advection_uvw.f90
+++ b/src/MNH/advection_uvw.f90
@@ -107,7 +107,6 @@ 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_GET_ZT3D , MNH_REL_ZT3D, MNH_GET_ZT4D , MNH_REL_ZT4D
 #endif
 use mode_mppdb
 
@@ -193,11 +192,6 @@ TYPE(LIST_ll), POINTER      :: TZFIELD_ll  ! list of fields to exchange
 TYPE(LIST_ll), POINTER      :: TZFIELDS_ll ! list of fields to exchange
 TYPE(LIST_ll), POINTER      :: TZFIELDS0_ll ! list of fields to exchange
 !
-#ifdef MNH_OPENACC
-INTEGER :: ISPL, IZUT, IZVT, IZWT, IZ1, IZ2
-INTEGER :: IZRUSB, IZRUSE, IZRVSB, IZRVSE, IZRWSB, IZRWSE, IIBMS, IIBME
-#endif
-!
 INTEGER :: IIU,IJU,IKU
 !
 !-------------------------------------------------------------------------------
@@ -255,60 +249,6 @@ ALLOCATE( ZMZM_RHODJ( IIU,IJU,IKU ) )
 !$acc &            zrus_other, zrvs_other, zrws_other, zrus_adv, zrvs_adv, zrws_adv, &
 !$acc &            zmxm_rhodj, zmym_rhodj, zmzm_rhodj  )
 
-#ifdef MNH_OPENACC
-#if 0
-CALL INIT_ON_HOST_AND_DEVICE(ZRUT,-1e99,'ADVECTION_UVW::ZRUT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRVT,-2e99,'ADVECTION_UVW::ZRVT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRWT,-3e99,'ADVECTION_UVW::ZRWT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRUCT,-1e98,'ADVECTION_UVW::ZRUCT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRVCT,-2e98,'ADVECTION_UVW::ZRVCT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRWCT,-3e98,'ADVECTION_UVW::ZRWCT')
-CALL INIT_ON_HOST_AND_DEVICE(ZU,-1e99,'ADVECTION_UVW::ZU')
-CALL INIT_ON_HOST_AND_DEVICE(ZV,-1e99,'ADVECTION_UVW::ZV')
-CALL INIT_ON_HOST_AND_DEVICE(ZW,-1e99,'ADVECTION_UVW::ZW')
-CALL INIT_ON_HOST_AND_DEVICE(ZRUS_OTHER,-1e99,'ADVECTION_UVW::ZRUS_OTHER')
-CALL INIT_ON_HOST_AND_DEVICE(ZRVS_OTHER,-1e99,'ADVECTION_UVW::ZRVS_OTHER')
-CALL INIT_ON_HOST_AND_DEVICE(ZRWS_OTHER,-1e99,'ADVECTION_UVW::ZRWS_OTHER')
-CALL INIT_ON_HOST_AND_DEVICE(ZRUS_ADV,-1e99,'ADVECTION_UVW::ZRUS_ADV')
-CALL INIT_ON_HOST_AND_DEVICE(ZRVS_ADV,-1e99,'ADVECTION_UVW::ZRVS_ADV')
-CALL INIT_ON_HOST_AND_DEVICE(ZRWS_ADV,-1e99,'ADVECTION_UVW::ZRWS_ADV')
-CALL INIT_ON_HOST_AND_DEVICE(ZMXM_RHODJ,-1e97,'ADVECTION_UVW::ZMXM_RHODJ')
-CALL INIT_ON_HOST_AND_DEVICE(ZMYM_RHODJ,-2e97,'ADVECTION_UVW::ZMYM_RHODJ')
-CALL INIT_ON_HOST_AND_DEVICE(ZMZM_RHODJ,-3e97,'ADVECTION_UVW::ZMZM_RHODJ')
-#endif
-!
-SELECT CASE (HTEMP_SCHEME)
- CASE('RK11')
-  ISPL = 1
- CASE('RK21')
-  ISPL = 2
- CASE('NP32')
-  ISPL = 3
- CASE('SP32')
-  ISPL = 3
- CASE('RK33')
-  ISPL = 3
- CASE('RKC4')
-  ISPL = 4
- CASE('RK4B')
-  ISPL = 4
- CASE('RK53')
-  ISPL = 5
- CASE('RK62')
-  ISPL = 6
- CASE('RK65')
-  ISPL = 6
- CASE DEFAULT
-  call Print_msg( NVERB_FATAL, 'GEN', 'ADVECTION_UVW', 'unknown htemp_scheme' )
-END SELECT
-!
-CALL MNH_GET_ZT3D(IZUT, IZVT, IZWT, IZ1, IZ2)
-CALL MNH_GET_ZT4D(ISPL, IZRUSB, IZRUSE)
-CALL MNH_GET_ZT4D(ISPL, IZRVSB, IZRVSE)
-CALL MNH_GET_ZT4D(ISPL, IZRWSB, IZRWSE)
-CALL MNH_GET_ZT4D(3,    IIBMS,  IIBME)
-#endif
-!
 IKE = SIZE(PWT,3) - JPVEXT
 !
 #ifndef MNH_OPENACC
@@ -358,7 +298,7 @@ NULLIFY(TZFIELD_ll)
 CALL CONTRAV (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,4)
 #else
 CALL CONTRAV_DEVICE (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,4,&
-               ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+               ODATA_ON_DEVICE=.TRUE.)
 !Not necessary: already done in contrav_device !$acc update self(ZRUCT,ZRVCT,ZRWCT)
 #endif
 !
@@ -463,13 +403,7 @@ DO JSPL=1,ISPLIT
                     ZMXM_RHODJ, ZMYM_RHODJ, ZMZM_RHODJ,                &
                     ZRUCT, ZRVCT, ZRWCT,                               &
                     ZRUS_ADV, ZRVS_ADV, ZRWS_ADV,                      &
-                    ZRUS_OTHER, ZRVS_OTHER, ZRWS_OTHER                 &
-#ifndef MNH_OPENACC
-                    )
-#else
-                    ,ZT3D(:,:,:,IZUT), ZT3D(:,:,:,IZVT), ZT3D(:,:,:,IZWT), &
-                    ZT3D(:,:,:,IZRUSB:IZRUSE), ZT3D(:,:,:,IZRVSB:IZRVSE), ZT3D(:,:,:,IZRWSB:IZRWSE), ZT3D(:,:,:,IIBMS:IIBME) )
-#endif
+                    ZRUS_OTHER, ZRVS_OTHER, ZRWS_OTHER                 )
 !
 ! Tendencies on wind
 !$acc update device(ZRUS_ADV,ZRVS_ADV,ZRWS_ADV)
@@ -522,13 +456,6 @@ if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'ADV', prws(:, :, :
 
 !-------------------------------------------------------------------------------
 !
-#ifdef MNH_OPENACC
-CALL MNH_REL_ZT4D(3,    IIBMS )
-CALL MNH_REL_ZT4D(ISPL, IZRWSB)
-CALL MNH_REL_ZT4D(ISPL, IZRVSB)
-CALL MNH_REL_ZT4D(ISPL, IZRUSB)
-CALL MNH_REL_ZT3D(IZUT, IZVT, IZWT, IZ1, IZ2)
-#endif
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90
index 442c45475..b16d803f2 100644
--- a/src/MNH/advection_uvw_cen.f90
+++ b/src/MNH/advection_uvw_cen.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2013-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,6 @@ 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_GET_ZT3D , MNH_REL_ZT3D
 use mode_msg
 #endif
 use mode_mppdb
@@ -177,9 +176,6 @@ REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ
 !
 INTEGER                     :: IINFO_ll    ! return code of parallel routine
 TYPE(LIST_ll), POINTER      :: TZFIELDS_ll ! list of fields to exchange
-#ifdef MNH_OPENACC
-INTEGER :: IZ1, IZ2
-#endif
 !
 !-------------------------------------------------------------------------------
 !$acc data present( PUM, PVM, PWM, PDUM, PDVM, PDWM, PUT, PVT, PWT, PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY, PRUS, PRVS, PRWS )
@@ -246,8 +242,6 @@ CALL INIT_ON_HOST_AND_DEVICE(ZRWCT,-3e98,'ADVECTION_UVW_CEN::ZRWCT')
 CALL INIT_ON_HOST_AND_DEVICE(ZMXM_RHODJ,-1e97,'ADVECTION_UVW_CEN::ZMXM_RHODJ')
 CALL INIT_ON_HOST_AND_DEVICE(ZMYM_RHODJ,-2e97,'ADVECTION_UVW_CEN::ZMYM_RHODJ')
 CALL INIT_ON_HOST_AND_DEVICE(ZMZM_RHODJ,-3e97,'ADVECTION_UVW_CEN::ZMZM_RHODJ')
-!
-CALL MNH_GET_ZT3D(IZ1, IZ2)
 #endif
 
 #ifndef MNH_OPENACC
@@ -278,10 +272,10 @@ END IF
 #else
 IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN
   CALL CONTRAV_DEVICE (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,2, &
-                 ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+                 ODATA_ON_DEVICE=.TRUE.)
 ELSEIF (HUVW_ADV_SCHEME=='CEN4TH') THEN
   CALL CONTRAV_DEVICE (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,4, &
-                 ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+                 ODATA_ON_DEVICE=.TRUE.)
 END IF
 !Not necessary: already done in contrav_device !$acc update self(ZRUCT,ZRVCT,ZRWCT)
 #endif
@@ -349,10 +343,6 @@ if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U), 'ADV', prus(:, :, :
 if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V), 'ADV', prvs(:, :, :) )
 if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'ADV', prws(:, :, :) )
 
-#ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D(IZ1, IZ2)
-#endif
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRUS,"ADVECTION_UVW_CEN end:PRUS")
diff --git a/src/MNH/advecuvw_4th.f90 b/src/MNH/advecuvw_4th.f90
index c220818c8..7f596bd9d 100644
--- a/src/MNH/advecuvw_4th.f90
+++ b/src/MNH/advecuvw_4th.f90
@@ -34,73 +34,10 @@ END INTERFACE
 END MODULE MODI_ADVECUVW_4TH
 !
 !
-#ifdef MNH_OPENACC
-!     ######################################################################
-      SUBROUTINE ADVECUVW_4TH ( HLBCX, HLBCY, PRUCT, PRVCT, PRWCT,           &
-                                PUT, PVT, PWT, PRUS, PRVS, PRWS, TPHALO2LIST ) 
-!     ######################################################################
-
-        USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll
-        USE MODE_MNH_ZWORK  , ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D 
-        USE MODE_MNH_ZWORK, ONLY : IIU,IJU,IKU
-
-IMPLICIT NONE
-!
-!*       0.1   Declarations of dummy arguments :
-!
-!
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type
-CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type
-!
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRUCT  ! contravariant
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRVCT  !  components
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRWCT  ! of momentum
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PUT, PVT, PWT        ! Variables at t
-!
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS, PRVS, PRWS     ! Source terms
-!
-TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion
-!
-!*       0.2   Declarations of local variables :
-!
-INTEGER:: IIB,IJB        ! Begining useful area  in x,y,z directions
-INTEGER:: IIE,IJE        ! End useful area in x,y,z directions
-!
-TYPE(HALO2LIST_ll), POINTER :: TZHALO2LIST
-
-INTEGER   :: IZMEANX, IZMEANY, IZTEMP1,IZTEMP2,IZTEMP3,IZTEMP4
-
-!$acc data present( PRUCT, PRVCT, PRWCT, PUT, PVT, PWT, PRUS, PRVS, PRWS )
-         CALL  MNH_GET_ZT3D(IZMEANX, IZMEANY,IZTEMP1,IZTEMP2,IZTEMP3,IZTEMP4 )
-
-         CALL  ADVECUVW_4TH_D ( IIU,IJU,IKU,HLBCX, HLBCY, &
-                              & PRUCT, PRVCT, PRWCT,        &
-                              & PUT, PVT, PWT, PRUS, PRVS, PRWS, TPHALO2LIST, & 
-                              & ZT3D(:,:,:,IZMEANX),ZT3D(:,:,:,IZMEANY), &
-                              & ZT3D(:,:,:,IZTEMP1),ZT3D(:,:,:,IZTEMP2), & 
-                              & ZT3D(:,:,:,IZTEMP3),ZT3D(:,:,:,IZTEMP4)  & 
-                              & )
-
-         CALL  MNH_REL_ZT3D(IZMEANX, IZMEANY, IZTEMP1,IZTEMP2,IZTEMP3,IZTEMP4)
-!$acc end data
-!
-CONTAINS
-!
-!     ######################################################################
-      SUBROUTINE ADVECUVW_4TH_D ( IIU,IJU,IKU,HLBCX, HLBCY, &
-                              & PRUCT, PRVCT, PRWCT,           &
-                              & PUT, PVT, PWT, PRUS, PRVS, PRWS, TPHALO2LIST , &
-                              & ZMEANX, ZMEANY, ZTEMP1,ZTEMP2,ZTEMP3,ZTEMP4 )
-         
-!     ######################################################################
-#else
 !     ######################################################################
       SUBROUTINE ADVECUVW_4TH ( HLBCX, HLBCY, PRUCT, PRVCT, PRWCT,           &
                                 PUT, PVT, PWT, PRUS, PRVS, PRWS, TPHALO2LIST )              
 !     ######################################################################
-#endif
 !
 !!****  *ADVECUVW_4TH * - routine to compute the 4th order centered
 !!                           advection tendency of momentum (U,V,W)
@@ -175,6 +112,9 @@ USE MODD_GRID_n
 USE MODD_PARAMETERS
 
 USE MODE_ll
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
+#endif
 use mode_mppdb
 
 USE MODI_ADVEC_4TH_ORDER_AUX
@@ -189,9 +129,6 @@ IMPLICIT NONE
 !*       0.1   Declarations of dummy arguments :
 !
 !
-#ifdef MNH_OPENACC
-INTEGER                        , INTENT(IN) :: IIU,IJU,IKU
-#endif
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type
 !
@@ -214,11 +151,10 @@ INTEGER :: IGRID ! localisation on the model grid
 #ifndef MNH_OPENACC
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMEANX, ZMEANY ! fluxes
 #else
-REAL, DIMENSION(:,:,:) :: ZMEANX, ZMEANY ! fluxes
+INTEGER                                     :: IIU, IJU, IKU
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZMEANX, ZMEANY ! fluxes
 !
-REAL, DIMENSION(:,:,:) :: ZTEMP1,ZTEMP2,ZTEMP3,ZTEMP4
-
-INTEGER                                              :: II
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZTEMP1, ZTEMP2, ZTEMP3, ZTEMP4
 #endif
 !
 #if 0
@@ -240,10 +176,6 @@ INTEGER                                              :: II
   PMZF4(:,:,1) = 0.5*( PA(:,:,2)+PA(:,:,1) ) ; PMZF4(:,:,IKU-1) = 0.5*( PA(:,:,IKU)+PA(:,:,IKU-1) ) ; PMZF4(:,:,IKU) = -999.
 #endif
 !
-
-
-!$acc data present( PRUCT, PRVCT, PRWCT, PUT, PVT, PWT, PRUS, PRVS, PRWS, ZMEANX, ZMEANY, ZTEMP1, ZTEMP2, ZTEMP3, ZTEMP4 )
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK(PRUCT,"ADVECUVW_4TH beg:PRUCT")
@@ -257,6 +189,26 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRVS,"ADVECUVW_4TH beg:PRVS")
   CALL MPPDB_CHECK(PRWS,"ADVECUVW_4TH beg:PRWS")
 END IF
+
+#ifdef MNH_OPENACC
+IIU = SIZE( PUT, 1 )
+IJU = SIZE( PUT, 2 )
+IKU = SIZE( PUT, 3 )
+
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ZMEANX, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZMEANY, IIU, IJU, IKU )
+
+CALL MNH_MEM_GET( ZTEMP1, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTEMP2, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTEMP3, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTEMP4, IIU, IJU, IKU )
+#endif
+
+!$acc data present( PRUCT, PRVCT, PRWCT, PUT, PVT, PWT, PRUS, PRVS, PRWS, ZMEANX, ZMEANY, ZTEMP1, ZTEMP2, ZTEMP3, ZTEMP4 )
+
 !-------------------------------------------------------------------------------
 !
 !*       2.     CALL THE ADVEC_4TH_ORDER_ALGO ROUTINE FOR MOMENTUM
@@ -409,7 +361,12 @@ call dzm_device( ZTEMP1, ZTEMP4 )
 PRWS(:,:,:) = PRWS(:,:,:) - ZTEMP4
 !$acc end kernels
 #endif
-!
+
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRUS,"ADVECUVW_4TH end:PRUS")
@@ -417,12 +374,7 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWS,"ADVECUVW_4TH end:PRWS")
 END IF
 
-!$acc end data
-
 !-------------------------------------------------------------------------------
 !
-#ifdef MNH_OPENACC
-END SUBROUTINE ADVECUVW_4TH_D
-#endif
 !
 END SUBROUTINE ADVECUVW_4TH
diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90
index 403eb3277..fe1f69f13 100644
--- a/src/MNH/advecuvw_rk.f90
+++ b/src/MNH/advecuvw_rk.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.
@@ -16,12 +16,7 @@ INTERFACE
                     PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ,                &
                     PRUCT, PRVCT, PRWCT,                               &
                     PRUS_ADV, PRVS_ADV, PRWS_ADV,                      &
-                    PRUS_OTHER, PRVS_OTHER, PRWS_OTHER                 &
-#ifndef MNH_OPENACC
-                    )
-#else
-                    , ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS, ZIBM )
-#endif
+                    PRUS_OTHER, PRVS_OTHER, PRWS_OTHER                 )
 !
 CHARACTER(LEN=6),         INTENT(IN)    :: HUVW_ADV_SCHEME! to the selected
 CHARACTER(LEN=4),         INTENT(IN)    :: HTEMP_SCHEME   ! Temporal scheme
@@ -47,13 +42,6 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRUS_ADV , PRVS_ADV, PRWS_ADV
                                                   ! Tendency due to advection
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRUS_OTHER , PRVS_OTHER, PRWS_OTHER
 !                                                 ! tendencies from other processes
-#ifdef MNH_OPENACC
-! Work arrays
-REAL, DIMENSION(:,:,:)   :: ZUT, ZVT, ZWT
-REAL, DIMENSION(:,:,:,:) :: ZRUS, ZRVS, ZRWS, ZIBM
-#endif
-!
-!
 END SUBROUTINE ADVECUVW_RK
 !
 END INTERFACE
@@ -68,12 +56,7 @@ END MODULE MODI_ADVECUVW_RK
                     PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ,                &
                     PRUCT, PRVCT, PRWCT,                               &
                     PRUS_ADV, PRVS_ADV, PRWS_ADV,                      &
-                    PRUS_OTHER, PRVS_OTHER, PRWS_OTHER                 &
-#ifndef MNH_OPENACC
-                    )
-#else
-                    , ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS, ZIBM )
-#endif
+                    PRUS_OTHER, PRVS_OTHER, PRWS_OTHER                 )
 !     ##########################################################################
 !
 !!****  *ADVECUVW_RK * - routine to call the specialized advection routines for wind
@@ -150,7 +133,7 @@ USE MODI_SHUMAN
 !
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,     ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 !
 !-------------------------------------------------------------------------------
@@ -183,17 +166,9 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRUS_ADV , PRVS_ADV, PRWS_ADV
                                                   ! Tendency due to advection
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRUS_OTHER , PRVS_OTHER, PRWS_OTHER
 !                                                 ! tendencies from other processes
-#ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:)   :: ZUT, ZVT, ZWT
-REAL, DIMENSION(:,:,:,:) :: ZRUS, ZRVS, ZRWS, ZIBM
-#endif
-!
-!
 !
 !*       0.2   declarations of local variables
 !
-!
-!
 character(len=3)    :: ynum
 INTEGER             :: IKE       ! indice K End       in z direction
 !
@@ -201,13 +176,23 @@ INTEGER             :: IKE       ! indice K End       in z direction
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUT, ZVT, ZWT
 ! Intermediate Guesses inside the RK loop
 !
-REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRUS,ZRVS,ZRWS,ZIBM
-#endif
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRUS, ZRVS, ZRWS, ZIBM
 ! Momentum tendencies due to advection
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZBUT ! Butcher array coefficients
                                           ! at the RK sub time step
 REAL, DIMENSION(:),   ALLOCATABLE :: ZBUTS! Butcher array coefficients
                                           ! at the end of the RK loop
+#else
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZUT, ZVT, ZWT
+! Intermediate Guesses inside the RK loop
+!
+REAL, DIMENSION(:,:,:,:), POINTER, CONTIGUOUS :: ZRUS, ZRVS, ZRWS, ZIBM
+! Momentum tendencies due to advection
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZBUT ! Butcher array coefficients
+                                          ! at the RK sub time step
+REAL, DIMENSION(:),   POINTER, CONTIGUOUS :: ZBUTS! Butcher array coefficients
+                                          ! at the end of the RK loop
+#endif
 !JUAN
 TYPE(LIST_ll), POINTER      :: TZFIELDMT_ll ! list of fields to exchange
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll ! momentum variables
@@ -215,9 +200,6 @@ INTEGER                     :: INBVAR
 INTEGER :: IIU, IJU, IKU ! array sizes
 !JUAN
 
-#ifdef MNH_OPENACC
-INTEGER :: IZMEAN, IZWORK
-#endif
 ! Momentum tendencies due to advection
 INTEGER :: ISPL                ! Number of RK splitting loops
 INTEGER :: JI, JS              ! Loop index
@@ -232,10 +214,6 @@ LOGICAL :: GIBM !Intermediate variable used to work around a Cray compiler bug (
 REAL    :: ZIBM_EPSI !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0)
 REAL          :: ZTIME1,ZTIME2
 !-------------------------------------------------------------------------------
-!$acc data present( PU, PV, PW, PUT, PVT, PWT, PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ, &
-!$acc &             PRUCT, PRVCT, PRWCT, PRUS_ADV, PRVS_ADV, PRWS_ADV,             &
-!$acc &             PRUS_OTHER, PRVS_OTHER, PRWS_OTHER, ZUT, ZVT, ZWT,             &
-!$acc &             ZRUS, ZRVS, ZRWS, ZIBM )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -266,20 +244,6 @@ if ( LIBM ) call Print_msg( NVERB_FATAL, 'GEN', 'ADVECUVW_RK', 'OpenACC: LIBM=T
 !*       0.     INITIALIZATION
 !        ---------------------
 !
-#ifndef MNH_OPENACC
-allocate(ZUT(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
-allocate(ZVT(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
-allocate(ZWT(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
-#endif
-
-#ifdef MNH_OPENACC
-CALL INIT_ON_HOST_AND_DEVICE(ZUT,4e99,'ADVECUVW_RK::ZUT')
-CALL INIT_ON_HOST_AND_DEVICE(ZVT,5e99,'ADVECUVW_RK::ZVT')
-CALL INIT_ON_HOST_AND_DEVICE(ZWT,6e99,'ADVECUVW_RK::ZWT')
-!
-CALL MNH_GET_ZT3D(IZMEAN,IZWORK)
-#endif
-!
 IKE = SIZE(PWT,3) - JPVEXT
 IIU=SIZE(PUT,1)
 IJU=SIZE(PUT,2)
@@ -310,11 +274,47 @@ SELECT CASE (HTEMP_SCHEME)
   call Print_msg(NVERB_FATAL,'GEN','ADVECUVW_RK','unknown HTEMP_SCHEME')
 END SELECT
 !
-!
+#ifndef MNH_OPENACC
+allocate( ZUT(IIU, IJU, IKU) )
+allocate( ZVT(IIU, IJU, IKU) )
+allocate( ZWT(IIU, IJU, IKU) )
+
+ALLOCATE( ZRUS(IIU, IJU, IKU, ISPL) )
+ALLOCATE( ZRVS(IIU, IJU, IKU, ISPL) )
+ALLOCATE( ZRWS(IIU, IJU, IKU, ISPL) )
+
+IF ( GIBM ) ALLOCATE( ZIBM(IIU, IJU, IKU, 3) )
+
 ALLOCATE(ZBUT(ISPL-1,ISPL-1))
 ALLOCATE(ZBUTS(ISPL))
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ZUT, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZVT, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZWT, IIU, IJU, IKU )
 
-!$acc data create(ZBUT,ZBUTS)
+CALL MNH_MEM_GET( ZRUS, IIU, IJU, IKU, ISPL )
+CALL MNH_MEM_GET( ZRVS, IIU, IJU, IKU, ISPL )
+CALL MNH_MEM_GET( ZRWS, IIU, IJU, IKU, ISPL )
+
+IF ( GIBM ) CALL MNH_MEM_GET( ZIBM, IIU, IJU, IKU, 3 )
+
+CALL MNH_MEM_GET( ZBUT,  ISPL-1, ISPL-1 )
+CALL MNH_MEM_GET( ZBUTS, ISPL )
+#endif
+
+#ifdef MNH_OPENACC
+CALL INIT_ON_HOST_AND_DEVICE(ZUT,4e99,'ADVECUVW_RK::ZUT')
+CALL INIT_ON_HOST_AND_DEVICE(ZVT,5e99,'ADVECUVW_RK::ZVT')
+CALL INIT_ON_HOST_AND_DEVICE(ZWT,6e99,'ADVECUVW_RK::ZWT')
+#endif
+
+!$acc data present( PU, PV, PW, PUT, PVT, PWT, PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ, &
+!$acc &             PRUCT, PRVCT, PRWCT, PRUS_ADV, PRVS_ADV, PRWS_ADV,             &
+!$acc &             PRUS_OTHER, PRVS_OTHER, PRWS_OTHER, ZUT, ZVT, ZWT,             &
+!$acc &             ZRUS, ZRVS, ZRWS, ZIBM, ZBUT, ZBUTS )
 
 SELECT CASE (HTEMP_SCHEME)
   CASE('RK11')
@@ -401,16 +401,7 @@ CASE('RK65')
 END SELECT
 !$acc update device(ZBUTS,ZBUT)
 !
-#ifndef MNH_OPENACC
-ALLOCATE(ZRUS(SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3),ISPL))
-ALLOCATE(ZRVS(SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3),ISPL))
-ALLOCATE(ZRWS(SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3),ISPL))
-#endif
-
 IF ( GIBM ) THEN
-#ifndef MNH_OPENACC
-  ALLOCATE( ZIBM(SIZE(PUT,1), SIZE(PUT,2), SIZE(PWT,3), 3) )
-#endif
 !$acc kernels
   ZIBM(:,:,:,:) = 1.
 !$acc end kernels
@@ -506,11 +497,7 @@ RKLOOP: DO JS = 1, ISPL
     CALL ADVECUVW_WENO_K (HLBCX, HLBCY, KWENO_ORDER, ZUT, ZVT, ZWT,     &
                         PRUCT, PRVCT, PRWCT,                            &
                         ZRUS(:,:,:,JS), ZRVS(:,:,:,JS), ZRWS(:,:,:,JS), &
-#ifndef MNH_OPENACC
                         TZHALO2MT_ll                                    )
-#else
-                        TZHALO2MT_ll, ZT3D(:,:,:,IZMEAN), ZT3D(:,:,:,IZWORK) )
-#endif
   ELSE IF ((HUVW_ADV_SCHEME=='CEN4TH') .AND. (HTEMP_SCHEME=='RKC4')) THEN
     CALL ADVECUVW_4TH (HLBCX, HLBCY, PRUCT, PRVCT, PRWCT,               &
                        ZUT, ZVT, ZWT,                                   &
@@ -523,11 +510,7 @@ RKLOOP: DO JS = 1, ISPL
       CALL ADVECUVW_WENO_K (HLBCX, HLBCY,           3, ZUT, ZVT, ZWT,    &
                           PRUCT, PRVCT, PRWCT,                           &
                           ZIBM(:,:,:,1),  ZIBM(:,:,:,2),  ZIBM(:,:,:,3) ,&
-#ifndef MNH_OPENACC
                         TZHALO2MT_ll                                    )
-#else
-                        TZHALO2MT_ll, ZT3D(:,:,:,IZMEAN), ZT3D(:,:,:,IZWORK) )
-#endif
     ENDIF
     IF (HUVW_ADV_SCHEME=='CEN4TH') THEN
        CALL ADVECUVW_2ND (ZUT, ZVT, ZWT, PRUCT, PRVCT, PRWCT,            &
@@ -587,7 +570,7 @@ RKLOOP: DO JS = 1, ISPL
 ! !$acc & present(ZRUS,ZRVS,ZRWS,ZIBM) present(PRUS_OTHER,PRVS_OTHER,PRWS_OTHER) &
 ! !$acc & present(PMXM_RHODJ,PMYM_RHODJ,PMZM_RHODJ)
 !
-!$acc kernels
+!$acc kernels present( ZUT, ZVT, ZWT )
     ZUT(:,:,:) = PU(:,:,:)
     ZVT(:,:,:) = PV(:,:,:)
     ZWT(:,:,:) = PW(:,:,:)
@@ -598,7 +581,7 @@ RKLOOP: DO JS = 1, ISPL
 ! Intermediate guesses inside the RK loop
 !
       IF ( .NOT. GIBM ) THEN
-!$acc kernels
+!$acc kernels present( ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS )
         ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) *  PTSTEP *  &
           ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:)
         ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) *  PTSTEP *  &
@@ -607,7 +590,7 @@ RKLOOP: DO JS = 1, ISPL
           ( ZRWS(:,:,:,JI) + PRWS_OTHER(:,:,:) ) / PMZM_RHODJ(:,:,:)
 !$acc end kernels
       ELSE
-!$acc kernels
+!$acc kernels present( ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS, ZIBM )
         ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) *  PTSTEP *  &
           ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:) * ZIBM(:,:,:,1)
         ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) *  PTSTEP *  &
@@ -626,15 +609,16 @@ RKLOOP: DO JS = 1, ISPL
  END DO RKLOOP
 !
 !
-#ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D(IZMEAN,IZWORK)
-#endif
-!
 CALL CLEANLIST_ll(TZFIELDMT_ll)
 CALL DEL_HALO2_ll(TZHALO2MT_ll)
 !$acc update self(PRUS_ADV,PRVS_ADV,PRWS_ADV)
 !-------------------------------------------------------------------------------
-!
+
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all OUT arrays
   CALL MPPDB_CHECK(PRUS_ADV,"ADVECUVW_RK end:PRUS_ADV")
@@ -642,8 +626,4 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWS_ADV,"ADVECUVW_RK end:PRWS_ADV")
 END IF
 
-!$acc end data
-
-!$acc end data
-
 END SUBROUTINE ADVECUVW_RK
diff --git a/src/MNH/advecuvw_weno_k.f90 b/src/MNH/advecuvw_weno_k.f90
index 4353eab11..3d5e27a03 100644
--- a/src/MNH/advecuvw_weno_k.f90
+++ b/src/MNH/advecuvw_weno_k.f90
@@ -11,11 +11,7 @@ INTERFACE
 !
       SUBROUTINE ADVECUVW_WENO_K(HLBCX, HLBCY, KWENO_ORDER, PUT, PVT, PWT,       &
                              PRUCT, PRVCT, PRWCT, PRUS, PRVS, PRWS, TPHALO2LIST  &
-#ifndef MNH_OPENACC
                              )
-#else
-                             , ZMEAN, ZWORK)
-#endif
 !
 USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll
 !
@@ -34,10 +30,6 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS, PRVS, PRWS     ! Source terms
 !
 TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion
 !
-#ifdef MNH_OPENACC
-! Work arrays
-REAL, DIMENSION(:,:,:) :: ZMEAN, ZWORK
-#endif
 !
 END SUBROUTINE ADVECUVW_WENO_K
 !
@@ -48,11 +40,7 @@ END MODULE MODI_ADVECUVW_WENO_K
 !     ##########################################################################
       SUBROUTINE ADVECUVW_WENO_K(HLBCX, HLBCY, KWENO_ORDER, PUT, PVT, PWT,      &
                              PRUCT, PRVCT, PRWCT, PRUS, PRVS, PRWS, TPHALO2LIST &
-#ifndef MNH_OPENACC
                              )
-#else
-                             , ZMEAN, ZWORK)
-#endif
 !     ##########################################################################
 !
 !!    AUTHOR
@@ -78,7 +66,7 @@ USE MODD_PARAMETERS
 USE MODE_ll
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 USE MODE_MPPDB
 
@@ -113,27 +101,23 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion
 !
 !*       0.2   Declarations of local variables :
 !
+INTEGER                     :: IIU, IJU, IKU
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2_UT,TZHALO2_VT,TZHALO2_WT
-
-TYPE(LIST_ll), POINTER :: TZHALO2_ZMEAN
 INTEGER                     :: IINFO_ll    ! return code of parallel routine
 !
 #ifndef MNH_OPENACC
 REAL, DIMENSION(:,:,:), allocatable :: ZMEAN, ZWORK
 #else
-REAL, DIMENSION(:,:,:) :: ZMEAN, ZWORK
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZMEAN, ZWORK
+!
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZFPOS1, ZFPOS2, ZFPOS3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZFNEG1, ZFNEG2, ZFNEG3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZBPOS1, ZBPOS2, ZBPOS3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZBNEG1, ZBNEG2, ZBNEG3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZOMP1,  ZOMP2,  ZOMP3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZOMN1,  ZOMN2,  ZOMN3
 #endif
 !
-#ifdef MNH_OPENACC
-INTEGER :: IZFPOS1, IZFPOS2, IZFPOS3
-INTEGER :: IZFNEG1, IZFNEG2, IZFNEG3
-INTEGER :: IZBPOS1, IZBPOS2, IZBPOS3
-INTEGER :: IZBNEG1, IZBNEG2, IZBNEG3
-INTEGER :: IZOMP1,  IZOMP2,  IZOMP3
-INTEGER :: IZOMN1,  IZOMN2,  IZOMN3
-#endif
-!
-!$acc data present( PRUCT, PRVCT, PRWCT, PUT, PVT, PWT, PRUS, PRVS, PRWS, ZMEAN, ZWORK )
 !
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -149,9 +133,19 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWS,"ADVECUVW_WENO_K beg:PRWS")
 END IF
 
+IIU = SIZE( PUT, 1 )
+IJU = SIZE( PUT, 2 )
+IKU = SIZE( PUT, 3 )
+
 #ifndef MNH_OPENACC
-allocate(ZMEAN(SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3)))
-allocate(ZWORK(SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3)))
+allocate( ZMEAN(IIU, IJU, IKU) )
+allocate( ZWORK(IIU, IJU, IKU) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ZMEAN, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZWORK, IIU, IJU, IKU )
 #endif
 
 #ifdef MNH_OPENACC
@@ -167,7 +161,9 @@ TZHALO2_VT => TPHALO2LIST%NEXT              ! 2nd  add3dfield in model_n
 TZHALO2_WT => TPHALO2LIST%NEXT%NEXT         ! 3rst add3dfield in model_n
 !
 !      -------------------------------------------------------
-!
+
+!$acc data present( PRUCT, PRVCT, PRWCT, PUT, PVT, PWT, PRUS, PRVS, PRWS, ZMEAN, ZWORK )
+
 SELECT CASE(KWENO_ORDER)
 !
 CASE(1) ! WENO 1
@@ -324,15 +320,29 @@ CASE(3) ! WENO 3
 !
   PRWS = PRWS - DZM(WENO_K_2_WZ(PWT,MZF(PRWCT)))
 #else
-  CALL MNH_GET_ZT3D(IZFPOS1,IZFPOS2,IZFNEG1,IZFNEG2,IZBPOS1,IZBPOS2,IZBNEG1,IZBNEG2,IZOMP1,IZOMP2,IZOMN1,IZOMN2)
+  !Pin positions in the pools of MNH memory
+  CALL MNH_MEM_POSITION_PIN()
+
+  CALL MNH_MEM_GET( ZFPOS1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFPOS2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP1,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP2,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN1,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN2,  IIU, IJU, IKU )
 !
 ! U component
 !
   CALL MXF_DEVICE(PRUCT,ZWORK)
-  CALL ADVEC_WENO_K_2_UX(HLBCX, PUT, ZWORK, ZMEAN, TZHALO2_UT%HALO2%WEST, TZHALO2_UT%HALO2%EAST,             &
-                         ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                         ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                         ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+  CALL ADVEC_WENO_K_2_UX(HLBCX, PUT, ZWORK, ZMEAN, TZHALO2_UT%HALO2%WEST, TZHALO2_UT%HALO2%EAST, &
+                         ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),             &
+                         ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),             &
+                         ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)               )
   CALL DXM_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
   PRUS(:,:,:) = PRUS(:,:,:) - ZWORK(:,:,:)
@@ -340,10 +350,10 @@ CASE(3) ! WENO 3
 !   
   IF (.NOT.L2D) THEN
     CALL MXM_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_2_MY(HLBCY, PUT, ZWORK, ZMEAN, TZHALO2_UT%HALO2%NORTH, TZHALO2_UT%HALO2%SOUTH,           &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL ADVEC_WENO_K_2_MY(HLBCY, PUT, ZWORK, ZMEAN, TZHALO2_UT%HALO2%NORTH, TZHALO2_UT%HALO2%SOUTH, &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),               &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),               &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)                 )
     CALL DYF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
     PRUS(:,:,:) = PRUS(:,:,:) - ZWORK(:,:,:)
@@ -352,10 +362,10 @@ CASE(3) ! WENO 3
 !
 !  PRUS = PRUS - DZF(WENO_K_2_MZ(PUT, MXM(PRWCT)))
   CALL MXM_DEVICE(PRWCT,ZWORK)
-  CALL WENO_K_2_MZ(PUT, ZWORK, ZMEAN,                                                                  &
-                   ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                   ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                   ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+  CALL WENO_K_2_MZ(PUT, ZWORK, ZMEAN,                                          &
+                   ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:), &
+                   ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:), &
+                   ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)   )
   CALL DZF_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
   PRUS(:,:,:) = PRUS(:,:,:) - ZWORK(:,:,:)
@@ -365,20 +375,20 @@ CASE(3) ! WENO 3
 !
   IF (.NOT.L2D) THEN
     CALL MYM_DEVICE(PRUCT,ZWORK)
-    CALL ADVEC_WENO_K_2_MX(HLBCX, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2%WEST, TZHALO2_VT%HALO2%EAST,             &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL ADVEC_WENO_K_2_MX(HLBCX, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2%WEST, TZHALO2_VT%HALO2%EAST, &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),             &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),             &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)               )
     CALL DXF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
     PRVS(:,:,:) = PRVS(:,:,:) - ZWORK(:,:,:)
 !$acc end kernels
 !   
     CALL MYF_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_2_VY(HLBCY, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2%NORTH, TZHALO2_VT%HALO2%SOUTH,           &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL ADVEC_WENO_K_2_VY(HLBCY, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2%NORTH, TZHALO2_VT%HALO2%SOUTH, &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),               &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),               &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)                 )
     CALL DYM_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
     PRVS(:,:,:) = PRVS(:,:,:) - ZWORK(:,:,:)
@@ -386,10 +396,10 @@ CASE(3) ! WENO 3
 !
 !    PRVS = PRVS - DZF(WENO_K_2_MZ(PVT, MYM(PRWCT)))
     CALL MYM_DEVICE(PRWCT,ZWORK)
-    CALL WENO_K_2_MZ(PVT, ZWORK, ZMEAN,                                                                  &
-                     ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                     ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                     ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL WENO_K_2_MZ(PVT, ZWORK, ZMEAN,                                          &
+                     ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:), &
+                     ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:), &
+                     ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)   )
     CALL DZF_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
     PRVS(:,:,:) = PRVS(:,:,:) - ZWORK(:,:,:)
@@ -400,10 +410,10 @@ CASE(3) ! WENO 3
 !
 !  ZWORK = MZM(PRUCT)
   CALL MZM_DEVICE(PRUCT,ZWORK)
-  CALL ADVEC_WENO_K_2_MX(HLBCX, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2%WEST, TZHALO2_WT%HALO2%EAST,             &
-                         ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                         ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                         ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+  CALL ADVEC_WENO_K_2_MX(HLBCX, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2%WEST, TZHALO2_WT%HALO2%EAST, &
+                         ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),             &
+                         ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),             &
+                         ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)               )
   CALL DXF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
   PRWS(:,:,:) = PRWS(:,:,:) - ZWORK(:,:,:)
@@ -412,10 +422,10 @@ CASE(3) ! WENO 3
   IF (.NOT.L2D) THEN
 !    ZWORK = MZM(PRVCT)
     CALL MZM_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_2_MY(HLBCY, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2%NORTH, TZHALO2_WT%HALO2%SOUTH,           &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL ADVEC_WENO_K_2_MY(HLBCY, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2%NORTH, TZHALO2_WT%HALO2%SOUTH, &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),               &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),               &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)                 )
     CALL DYF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
     PRWS(:,:,:) = PRWS(:,:,:) - ZWORK(:,:,:)
@@ -424,16 +434,17 @@ CASE(3) ! WENO 3
 !
 !  PRWS = PRWS - DZM(WENO_K_2_WZ(PWT,MZF(PRWCT)))
   CALL MZF_DEVICE( PRWCT, ZWORK )
-  CALL WENO_K_2_WZ(PWT, ZWORK, ZMEAN,                                                                  &
-                   ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                   ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                   ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+  CALL WENO_K_2_WZ(PWT, ZWORK, ZMEAN,                                          &
+                   ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:), &
+                   ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:), &
+                   ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)   )
   CALL DZM_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
   PRWS(:,:,:) = PRWS(:,:,:) - ZWORK(:,:,:)
 !$acc end kernels
 !
-  CALL MNH_REL_ZT3D(IZFPOS1,IZFPOS2,IZFNEG1,IZFNEG2,IZBPOS1,IZBPOS2,IZBNEG1,IZBNEG2,IZOMP1,IZOMP2,IZOMN1,IZOMN2)
+  !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+  CALL MNH_MEM_RELEASE()
 #endif
 !
 !
@@ -496,19 +507,38 @@ CASE(5) ! WENO 5
   CALL GET_HALO(ZMEAN)! Update HALO - maybe not necessary (T.Lunet)
   PRWS = PRWS - DZM(ZMEAN)
 #else
-  CALL MNH_GET_ZT3D(IZFPOS1,IZFPOS2,IZFPOS3,IZFNEG1,IZFNEG2,IZFNEG3,IZBPOS1, &
-                    IZBPOS2,IZBPOS3,IZBNEG1,IZBNEG2,IZBNEG3,IZOMP1,IZOMP2,IZOMP3,IZOMN1,IZOMN2,IZOMN3)
+  !Pin positions in the pools of MNH memory
+  CALL MNH_MEM_POSITION_PIN()
+
+  CALL MNH_MEM_GET( ZFPOS1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFPOS2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFPOS3, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG3, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS3, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG3, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP1,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP2,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP3,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN1,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN2,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN3,  IIU, IJU, IKU )
 !
 ! U component
 !
   CALL MXF_DEVICE(PRUCT,ZWORK)
-  CALL ADVEC_WENO_K_3_UX(HLBCX, PUT, ZWORK, ZMEAN, &
-                         ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                         ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                         ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                         ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                         ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                         ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+  CALL ADVEC_WENO_K_3_UX(HLBCX, PUT, ZWORK, ZMEAN,                    &
+                         ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                         ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                         ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                         ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                         ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                         ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
   CALL GET_HALO_D(ZMEAN)! Update HALO 
   CALL DXM_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -517,13 +547,13 @@ CASE(5) ! WENO 5
 !
   IF (.NOT.L2D) THEN
     CALL MXM_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_3_MY(HLBCY, PUT, ZWORK, ZMEAN, &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                           ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                           ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                           ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL ADVEC_WENO_K_3_MY(HLBCY, PUT, ZWORK, ZMEAN,                    &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                           ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                           ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                           ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO 
     CALL DYF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -532,13 +562,13 @@ CASE(5) ! WENO 5
   END IF
 !
   CALL MXM_DEVICE(PRWCT,ZWORK)
-  CALL WENO_K_3_MZ(PUT,ZWORK,ZMEAN, &
-                   ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                   ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                   ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                   ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                   ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                   ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+  CALL WENO_K_3_MZ(PUT,ZWORK,ZMEAN,                             &
+                   ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                   ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                   ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                   ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                   ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                   ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
   CALL GET_HALO_D(ZMEAN)! Update HALO - maybe not necessary (T.Lunet)
   CALL DZF_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
@@ -549,13 +579,13 @@ CASE(5) ! WENO 5
 !
   IF (.NOT.L2D) THEN
     CALL MYM_DEVICE(PRUCT,ZWORK)
-    CALL ADVEC_WENO_K_3_MX(HLBCX, PVT, ZWORK, ZMEAN, &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                           ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                           ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                           ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL ADVEC_WENO_K_3_MX(HLBCX, PVT, ZWORK, ZMEAN,                    &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                           ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                           ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                           ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO 
     CALL DXF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -563,13 +593,13 @@ CASE(5) ! WENO 5
 !$acc end kernels
 !   
     CALL MYF_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_3_VY(HLBCY, PVT, ZWORK, ZMEAN, &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                           ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                           ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                           ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL ADVEC_WENO_K_3_VY(HLBCY, PVT, ZWORK, ZMEAN,                    &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                           ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                           ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                           ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO 
     CALL DYM_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -577,13 +607,13 @@ CASE(5) ! WENO 5
 !$acc end kernels
 !
     CALL MYM_DEVICE(PRWCT,ZWORK)
-    CALL WENO_K_3_MZ(PVT,ZWORK,ZMEAN, &
-                     ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                     ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                     ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                     ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                     ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                     ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL WENO_K_3_MZ(PVT, ZWORK, ZMEAN,                           &
+                     ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                     ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                     ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                     ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                     ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                     ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO - maybe not necessary (T.Lunet)
     CALL DZF_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
@@ -594,13 +624,13 @@ CASE(5) ! WENO 5
 ! W component
 !
   CALL MZM_DEVICE(PRUCT,ZWORK)
-  CALL ADVEC_WENO_K_3_MX(HLBCX, PWT, ZWORK, ZMEAN, &
-                         ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                         ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                         ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                         ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                         ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                         ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+  CALL ADVEC_WENO_K_3_MX(HLBCX, PWT, ZWORK, ZMEAN,                    &
+                         ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                         ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                         ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                         ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                         ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                         ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
   CALL GET_HALO_D(ZMEAN)! Update HALO 
   CALL DXF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -609,13 +639,13 @@ CASE(5) ! WENO 5
 !
   IF (.NOT.L2D) THEN
   CALL MZM_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_3_MY(HLBCY, PWT, ZWORK, ZMEAN, &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                           ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                           ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                           ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL ADVEC_WENO_K_3_MY(HLBCY, PWT, ZWORK, ZMEAN,                    &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                           ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                           ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                           ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO 
     CALL DYF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -624,34 +654,38 @@ CASE(5) ! WENO 5
   END IF
 !
   CALL MZF_DEVICE( PRWCT, ZWORK )
-  CALL WENO_K_3_WZ(PWT,ZWORK,ZMEAN, &
-                   ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                   ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                   ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                   ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                   ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                   ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+  CALL WENO_K_3_WZ(PWT,ZWORK,ZMEAN,                             &
+                   ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                   ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                   ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                   ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                   ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                   ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
   CALL GET_HALO_D(ZMEAN)! Update HALO - maybe not necessary (T.Lunet)
   CALL DZM_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
   PRWS(:,:,:) = PRWS(:,:,:) - ZWORK(:,:,:)
 !$acc end kernels
 !
-  CALL MNH_REL_ZT3D(IZFPOS1,IZFPOS2,IZFPOS3,IZFNEG1,IZFNEG2,IZFNEG3,IZBPOS1, &
-                    IZBPOS2,IZBPOS3,IZBNEG1,IZBNEG2,IZBNEG3,IZOMP1,IZOMP2,IZOMP3,IZOMN1,IZOMN2,IZOMN3)
+  !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+  CALL MNH_MEM_RELEASE()
 #endif
 !
 !
 END SELECT
 !             ---------------------------------
 !$acc update self(PRUS,PRVS,PRWS)
-!
+
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since beginning of subroutine
+CALL MNH_MEM_RELEASE()
+
 IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRUS,"ADVECUVW_WENO_K end:PRUS")
   CALL MPPDB_CHECK(PRVS,"ADVECUVW_WENO_K end:PRVS")
   CALL MPPDB_CHECK(PRWS,"ADVECUVW_WENO_K end:PRWS")
 END IF
 
-!$acc end data
 
 END SUBROUTINE ADVECUVW_WENO_K
diff --git a/src/MNH/contrav.f90 b/src/MNH/contrav.f90
index cf8a2c9b2..7bf731022 100644
--- a/src/MNH/contrav.f90
+++ b/src/MNH/contrav.f90
@@ -32,7 +32,7 @@ END SUBROUTINE CONTRAV
 !
 #ifdef MNH_OPENACC
       SUBROUTINE CONTRAV_DEVICE(HLBCX,HLBCY,PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,  &
-                         PRUCT,PRVCT,PRWCT,KADV_ORDER,Z1,Z2,ODATA_ON_DEVICE     )
+                         PRUCT,PRVCT,PRWCT,KADV_ORDER,ODATA_ON_DEVICE     )
 !
 !
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX  ! X direction LBC type
@@ -49,7 +49,6 @@ REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRUCT      ! Contrav comp along x-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRVCT      ! Contrav comp along y-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRWCT      ! Contrav comp along z-bar
 INTEGER,                 INTENT(IN)    ::  KADV_ORDER ! Order of the advection scheme
-REAL, DIMENSION(:,:,:),  INTENT(OUT)   :: Z1,Z2       ! Work arrays
 LOGICAL, OPTIONAL,       INTENT(IN)    :: ODATA_ON_DEVICE ! Is some of the data on the accelerator device
 !
 !
@@ -450,7 +449,7 @@ END SUBROUTINE CONTRAV
 #ifdef MNH_OPENACC
 !     ##############################################################
       SUBROUTINE CONTRAV_DEVICE(HLBCX,HLBCY,PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,  &
-                         PRUCT,PRVCT,PRWCT,KADV_ORDER,Z1,Z2,ODATA_ON_DEVICE     )
+                         PRUCT,PRVCT,PRWCT,KADV_ORDER,ODATA_ON_DEVICE     )
 !     ##############################################################
 !
 !!****  *CONTRAV * - computes the contravariant components from the
@@ -524,6 +523,7 @@ USE MODD_PARAMETERS
 USE MODE_ll
 USE MODE_MPPDB
 #ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,     ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 use mode_msg
 #endif
 !
@@ -552,7 +552,6 @@ REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRUCT    ! Contrav comp along x-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRVCT    ! Contrav comp along y-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRWCT    ! Contrav comp along z-bar
 INTEGER,                 INTENT(IN)    ::  KADV_ORDER ! Order of the advection scheme
-REAL, DIMENSION(:,:,:),  INTENT(OUT)   :: Z1,Z2       ! Work arrays
 LOGICAL,   OPTIONAL,     INTENT(IN)    :: ODATA_ON_DEVICE ! Is some of the data on the accelerator device
 !
 !
@@ -566,12 +565,12 @@ INTEGER                             :: IINFO_ll
 LOGICAL                             :: GDATA_ON_DEVICE
 real                                :: ZTMP1, ZTMP2 ! Intermediate work variables
 REAL,   DIMENSION(:,:), ALLOCATABLE :: ZU_EAST, ZV_NORTH, ZDZX_EAST, ZDZY_NORTH
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: Z1,Z2       ! Work arrays
 TYPE(LIST_ll),          POINTER     :: TZFIELD_U, TZFIELD_V, TZFIELD_DZX, TZFIELD_DZY
 TYPE(HALO2LIST_ll),     POINTER     :: TZHALO2_U, TZHALO2_V, TZHALO2_DZX, TZHALO2_DZY
 !
 LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH
 !
-!$acc data present( PRUT, PRVT, PRWT, PDXX, PDYY, PDZZ, PDZX, PDZY, PRUCT, PRVCT, PRWCT, Z1, Z2 )
 
 IF ( PRESENT(ODATA_ON_DEVICE) ) THEN
   GDATA_ON_DEVICE = ODATA_ON_DEVICE
@@ -598,7 +597,13 @@ END IF
 IIU= SIZE(PDXX,1)
 IJU= SIZE(PDXX,2)
 IKU= SIZE(PDXX,3)
-!
+
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( Z1, IIU, IJU, IKU )
+CALL MNH_MEM_GET( Z2, IIU, IJU, IKU )
+
 GWEST  = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() )
 GEAST  = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() )
 GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() )
@@ -608,7 +613,9 @@ CALL GET_INDICE_ll( IIB,IJB,IIE,IJE)
 !
 IKB=1+JPVEXT
 IKE=IKU - JPVEXT
-!
+
+!$acc data present( PRUT, PRVT, PRWT, PDXX, PDYY, PDZZ, PDZX, PDZY, PRUCT, PRVCT, PRWCT, Z1, Z2 )
+
 IF (GDATA_ON_DEVICE) THEN
 !PW TODO:remplacer (ailleurs aussi...) 1/PDXX... par PINV_PDXX (fait pour la turbulence...) cfr MNH/turb_hor_splt.f90
 !$acc kernels
@@ -891,7 +898,12 @@ IF (KADV_ORDER == 4 ) THEN
 END IF
 
 END IF FLAT
-!-----------------------------------------------------------------------
+
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all OUT arrays
   CALL MPPDB_CHECK(PRUCT,"CONTRAV end:PRUCT")
@@ -899,7 +911,6 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWCT,"CONTRAV end:PRWCT")
 END IF
 
-!$acc end data
-
+!-----------------------------------------------------------------------
 END SUBROUTINE CONTRAV_DEVICE
 #endif
diff --git a/src/MNH/gradient_m.f90 b/src/MNH/gradient_m.f90
index f99ed00d5..4bcc5378a 100644
--- a/src/MNH/gradient_m.f90
+++ b/src/MNH/gradient_m.f90
@@ -277,9 +277,9 @@ END FUNCTION GX_M_M
 !
 !
 USE MODI_SHUMAN_DEVICE
-USE MODD_CONF, ONLY:LFLAT
+USE MODD_CONF,          ONLY: LFLAT
 !
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,     ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 !
 IMPLICIT NONE
 !
@@ -297,44 +297,54 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGX_M_M ! res
 !
 !*       0.2   declaration of local variables
 !
-INTEGER :: IDX1,IDX2,IDX3,IDX4
+INTEGER                                      :: IIU, IJU, IKU
+REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZTMP1, ZTMP2, ZTMP3, ZTMP4
 !
 !----------------------------------------------------------------------------
+IIU = SIZE( PA, 1 )
+IJU = SIZE( PA, 2 )
+IKU = SIZE( PA, 3 )
+
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
 
-!$acc data present( PA, PDXX, PDZZ, PDZX, PGX_M_M )
+CALL MNH_MEM_GET( ZTMP1, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTMP2, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTMP3, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTMP4, IIU, IJU, IKU )
 
-CALL  MNH_GET_ZT3D(IDX1,IDX2,IDX3,IDX4)
+!$acc data present( PA, PDXX, PDZZ, PDZX, PGX_M_M, ZTMP1, ZTMP2, ZTMP3, ZTMP4)
 !
 !*       1.    DEFINITION of GX_M_M
 !              --------------------
 !
 IF (.NOT. LFLAT) THEN
-  CALL MXM_DEVICE(PA(:,:,:),ZT3D(:,:,:,IDX1))
-  CALL DXF_DEVICE(ZT3D(:,:,:,IDX1),ZT3D(:,:,:,IDX2))
-  CALL MXF_DEVICE(PDZX,ZT3D(:,:,:,IDX1))
-  CALL DZM_DEVICE( PA(:,:,:), ZT3D(:,:,:,IDX3) )
+  CALL MXM_DEVICE( PA(:,:,:), ZTMP1(:,:,:) )
+  CALL DXF_DEVICE( ZTMP1(:,:,:), ZTMP2(:,:,:) )
+  CALL MXF_DEVICE( PDZX, ZTMP1(:,:,:) )
+  CALL DZM_DEVICE( PA(:,:,:), ZTMP3(:,:,:) )
   !$acc kernels
-  ZT3D(:,:,:,IDX4) = ZT3D(:,:,:,IDX1)*ZT3D(:,:,:,IDX3)/PDZZ(:,:,:)
+  ZTMP4(:,:,:) = ZTMP1(:,:,:) * ZTMP3(:,:,:) / PDZZ(:,:,:)
   !$acc end kernels
-  CALL MZF_DEVICE( ZT3D(:,:,:,IDX4), ZT3D(:,:,:,IDX1) )
-  CALL MXF_DEVICE(PDXX(:,:,:),ZT3D(:,:,:,IDX3))
+  CALL MZF_DEVICE( ZTMP4(:,:,:), ZTMP1(:,:,:) )
+  CALL MXF_DEVICE( PDXX(:,:,:), ZTMP3(:,:,:) )
   !$acc kernels
-  PGX_M_M(:,:,:)= (ZT3D(:,:,:,IDX2)   -  ZT3D(:,:,:,IDX1)                   &
-                    )        /ZT3D(:,:,:,IDX3)
+  PGX_M_M(:,:,:)= (ZTMP2(:,:,:) - ZTMP1(:,:,:) ) / ZTMP3(:,:,:)
   !$acc end kernels
 ELSE
-  CALL MXM_DEVICE(PA(:,:,:),ZT3D(:,:,:,IDX1))
-  CALL DXF_DEVICE(ZT3D(:,:,:,IDX1),ZT3D(:,:,:,IDX2))
-  CALL MXF_DEVICE(PDXX(:,:,:),ZT3D(:,:,:,IDX3))
+  CALL MXM_DEVICE( PA(:,:,:), ZTMP1(:,:,:) )
+  CALL DXF_DEVICE( ZTMP1(:,:,:), ZTMP2(:,:,:) )
+  CALL MXF_DEVICE( PDXX(:,:,:), ZTMP3(:,:,:) )
   !$acc kernels
-  PGX_M_M(:,:,:)= ZT3D(:,:,:,IDX2) / ZT3D(:,:,:,IDX3)
+  PGX_M_M(:,:,:)= ZTMP2(:,:,:) / ZTMP3(:,:,:)
   !$acc end kernels
 END IF
 !
-CALL  MNH_REL_ZT3D(IDX1,IDX2,IDX3,IDX4)
-
 !$acc end data
 
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GX_M_M_DEVICE
@@ -444,10 +454,10 @@ END FUNCTION GY_M_M
 !*       0.    DECLARATIONS
 !
 !
-USE MODD_CONF, ONLY:LFLAT
+USE MODD_CONF,          ONLY:LFLAT
 USE MODI_SHUMAN_DEVICE
 !
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,     ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 !
 IMPLICIT NONE
 !
@@ -463,45 +473,55 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGY_M_M ! res
 !
 !*       0.2   declaration of local variables
 !
-INTEGER :: IDX1,IDX2,IDX3,IDX4
+INTEGER                                     :: IIU, IJU, IKU
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZTMP1, ZTMP2, ZTMP3, ZTMP4
 !
 !----------------------------------------------------------------------------
+IIU = SIZE( PA, 1 )
+IJU = SIZE( PA, 2 )
+IKU = SIZE( PA, 3 )
+
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
 
-!$acc data present( PA, PDYY, PDZZ, PDZY, PGY_M_M )
+CALL MNH_MEM_GET( ZTMP1, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTMP2, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTMP3, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTMP4, IIU, IJU, IKU )
 
-CALL  MNH_GET_ZT3D(IDX1,IDX2,IDX3,IDX4)
+!$acc data present( PA, PDYY, PDZZ, PDZY, PGY_M_M, ZTMP1, ZTMP2, ZTMP3, ZTMP4)
 !
 !*       1.    DEFINITION of GY_M_M
 !              --------------------
 !
 !
 IF (.NOT. LFLAT) THEN
-  CALL MYM_DEVICE(PA,ZT3D(:,:,:,IDX1))
-  CALL DYF_DEVICE(ZT3D(:,:,:,IDX1),ZT3D(:,:,:,IDX2))
-  CALL MYF_DEVICE(PDZY,ZT3D(:,:,:,IDX1))
-  CALL DZM_DEVICE( PA, ZT3D(:,:,:,IDX3) )
+  CALL MYM_DEVICE( PA, ZTMP1(:,:,:) )
+  CALL DYF_DEVICE( ZTMP1(:,:,:), ZTMP2(:,:,:) )
+  CALL MYF_DEVICE( PDZY, ZTMP1(:,:,:) )
+  CALL DZM_DEVICE( PA, ZTMP3(:,:,:) )
   !$acc kernels
-  ZT3D(:,:,:,IDX4) = ZT3D(:,:,:,IDX1)*ZT3D(:,:,:,IDX3)/PDZZ
+  ZTMP4(:,:,:) = ZTMP1(:,:,:) * ZTMP3(:,:,:) / PDZZ(:,:,:)
   !$acc end kernels
-  CALL MZF_DEVICE( ZT3D(:,:,:,IDX4), ZT3D(:,:,:,IDX1) )
-  CALL MYF_DEVICE(PDYY,ZT3D(:,:,:,IDX3))
+  CALL MZF_DEVICE( ZTMP4(:,:,:), ZTMP1(:,:,:) )
+  CALL MYF_DEVICE( PDYY, ZTMP3(:,:,:) )
   !$acc kernels
-  PGY_M_M(:,:,:)= (ZT3D(:,:,:,IDX2)   -  ZT3D(:,:,:,IDX1)                   &
-                    )        /ZT3D(:,:,:,IDX3)
+  PGY_M_M(:,:,:)= ( ZTMP2(:,:,:) - ZTMP1(:,:,:) ) / ZTMP3(:,:,:)
   !$acc end kernels
 ELSE
-  CALL MYM_DEVICE(PA,ZT3D(:,:,:,IDX1))
-  CALL DYF_DEVICE(ZT3D(:,:,:,IDX1),ZT3D(:,:,:,IDX2))
-  CALL MYF_DEVICE(PDYY,ZT3D(:,:,:,IDX1))
+  CALL MYM_DEVICE( PA, ZTMP1(:,:,:) )
+  CALL DYF_DEVICE( ZTMP1(:,:,:), ZTMP2(:,:,:) )
+  CALL MYF_DEVICE( PDYY, ZTMP1(:,:,:) )
   !$acc kernels
-  PGY_M_M(:,:,:)= ZT3D(:,:,:,IDX2)/ZT3D(:,:,:,IDX1)
+  PGY_M_M(:,:,:)= ZTMP2(:,:,:) / ZTMP1(:,:,:)
   !$acc end kernels
 ENDIF
 !
-CALL  MNH_REL_ZT3D(IDX1,IDX2,IDX3,IDX4)
-
 !$acc end data
 
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GY_M_M_DEVICE
@@ -600,7 +620,7 @@ END FUNCTION GZ_M_M
 !
 USE MODI_SHUMAN_DEVICE
 !
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,     ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 use mode_msg
 !
 IMPLICIT NONE
@@ -615,28 +635,38 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)),  INTENT(OUT) :: PGZ_M_M ! res
 !
 !*       0.2   declaration of local variables
 !
-INTEGER :: IDX1,IDX2
+INTEGER                                      :: IIU, IJU, IKU
+REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZTMP1, ZTMP2, ZTMP3, ZTMP4
 !
 !----------------------------------------------------------------------------
+IIU = SIZE( PA, 1 )
+IJU = SIZE( PA, 2 )
+IKU = SIZE( PA, 3 )
+
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
 
-!$acc data present( PA, PDZZ, PGZ_M_M )
+CALL MNH_MEM_GET( ZTMP1, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZTMP2, IIU, IJU, IKU )
+
+!$acc data present( PA, PDZZ, PGZ_M_M, ZTMP1, ZTMP2 )
 
 call Print_msg( NVERB_WARNING, 'GEN', 'GZ_M_M_DEVICE', 'OpenACC: not yet tested' )
-CALL  MNH_GET_ZT3D(IDX1,IDX2)
 !
 !*       1.    DEFINITION of GZ_M_M
 !              --------------------
 !
-CALL DZM_DEVICE( PA(:,:,:), ZT3D(:,:,:,IDX1) )
+CALL DZM_DEVICE( PA(:,:,:), ZTMP1(:,:,:) )
 !$acc kernels
-ZT3D(:,:,:,IDX2) = ZT3D(:,:,:,IDX1)/PDZZ(:,:,:)
+ZTMP2(:,:,:) = ZTMP1(:,:,:) / PDZZ(:,:,:)
 !$acc end kernels
-CALL MZF_DEVICE( ZT3D(:,:,:,IDX2), PGZ_M_M )
-!
-CALL  MNH_REL_ZT3D(IDX1,IDX2)
+CALL MZF_DEVICE( ZTMP2(:,:,:), PGZ_M_M(:,:,:) )
 
 !$acc end data
 
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
 !----------------------------------------------------------------------------
 !
 END SUBROUTINE GZ_M_M_DEVICE
diff --git a/src/ZSOLVER/advection_metsv.f90 b/src/ZSOLVER/advection_metsv.f90
index 71049d6b1..e0e2c003d 100644
--- a/src/ZSOLVER/advection_metsv.f90
+++ b/src/ZSOLVER/advection_metsv.f90
@@ -175,8 +175,7 @@ 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_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE, &
-                               MNH_GET_ZT3D, MNH_REL_ZT3D, ZT3D
+USE MODE_MNH_ZWORK,      ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 use mode_exchange_ll,    only: UPDATE_HALO_ll
 USE MODE_IO_FIELD_WRITE, only: IO_Field_write
@@ -301,7 +300,6 @@ INTEGER             :: ISPLIT_PPM   ! temporal time splitting
 INTEGER             :: IIB, IIE, IJB, IJE,IKB,IKE
 #ifdef MNH_OPENACC
 CHARACTER(LEN=3) :: YNUM
-INTEGER :: IZ1, IZ2
 #endif
 TYPE(TFIELDDATA) :: TZFIELD
 !
@@ -483,8 +481,6 @@ CALL INIT_ON_HOST_AND_DEVICE(ZRHOY1,PVALUE=-1e95,HNAME='ADVECTION_METSV::ZRHOY1'
 CALL INIT_ON_HOST_AND_DEVICE(ZRHOY2,PVALUE=-1e96,HNAME='ADVECTION_METSV::ZRHOY2')
 CALL INIT_ON_HOST_AND_DEVICE(ZRHOZ1,PVALUE=-1e97,HNAME='ADVECTION_METSV::ZRHOZ1')
 CALL INIT_ON_HOST_AND_DEVICE(ZRHOZ2,PVALUE=-1e98,HNAME='ADVECTION_METSV::ZRHOZ2')
-!
-CALL MNH_GET_ZT3D(IZ1, IZ2)
 #endif
 !
 IF(LBLOWSNOW) THEN    ! Put 2D Canopy blowing snow variables into a 3D array for advection
@@ -517,10 +513,10 @@ END IF
 #else
 IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN
  CALL CONTRAV_DEVICE (HLBCX,HLBCY,PUT,PVT,PWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCPPM,ZRVCPPM,ZRWCPPM,2, &
-                ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+                ODATA_ON_DEVICE=.TRUE.)
 ELSE
  CALL CONTRAV_DEVICE (HLBCX,HLBCY,PUT,PVT,PWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCPPM,ZRVCPPM,ZRWCPPM,4, &
-                ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+                ODATA_ON_DEVICE=.TRUE.)
 END IF
 #endif
 !
@@ -1074,10 +1070,6 @@ end if
 ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
 call Sources_neg_correct( hcloud, 'NEADV', krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs )
 
-#ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D(IZ1, IZ2)
-#endif
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRTHS,"ADVECTION_METSV end:PRTHS")
diff --git a/src/ZSOLVER/advection_uvw.f90 b/src/ZSOLVER/advection_uvw.f90
index 6f2e14a80..b731655b2 100644
--- a/src/ZSOLVER/advection_uvw.f90
+++ b/src/ZSOLVER/advection_uvw.f90
@@ -108,8 +108,6 @@ use mode_budget,      only: Budget_store_init, Budget_store_end
 USE MODE_ll
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE, &
-                            MNH_GET_ZT3D, MNH_GET_ZT4D, MNH_REL_ZT3D, MNH_REL_ZT4D, ZT3D
 #endif
 use mode_mppdb
 
@@ -196,11 +194,6 @@ TYPE(LIST_ll), POINTER      :: TZFIELD_ll  ! list of fields to exchange
 TYPE(LIST_ll), POINTER      :: TZFIELDS_ll ! list of fields to exchange
 TYPE(LIST_ll), POINTER      :: TZFIELDS0_ll ! list of fields to exchange
 !
-#ifdef MNH_OPENACC
-INTEGER :: ISPL, IZUT, IZVT, IZWT, IZ1, IZ2
-INTEGER :: IZRUSB, IZRUSE, IZRVSB, IZRVSE, IZRWSB, IZRWSE, IIBMS, IIBME
-#endif
-!
 INTEGER :: IIU,IJU,IKU
 !
 !-------------------------------------------------------------------------------
@@ -282,60 +275,6 @@ CALL MNH_MEM_GET( ZMZM_RHODJ, IIU, IJU, IKU )
 !$acc &            zrus_other, zrvs_other, zrws_other, zrus_adv, zrvs_adv, zrws_adv, &
 !$acc &            zmxm_rhodj, zmym_rhodj, zmzm_rhodj  )
 
-#ifdef MNH_OPENACC
-#if 0
-CALL INIT_ON_HOST_AND_DEVICE(ZRUT,-1e99,'ADVECTION_UVW::ZRUT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRVT,-2e99,'ADVECTION_UVW::ZRVT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRWT,-3e99,'ADVECTION_UVW::ZRWT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRUCT,-1e98,'ADVECTION_UVW::ZRUCT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRVCT,-2e98,'ADVECTION_UVW::ZRVCT')
-CALL INIT_ON_HOST_AND_DEVICE(ZRWCT,-3e98,'ADVECTION_UVW::ZRWCT')
-CALL INIT_ON_HOST_AND_DEVICE(ZU,-1e99,'ADVECTION_UVW::ZU')
-CALL INIT_ON_HOST_AND_DEVICE(ZV,-1e99,'ADVECTION_UVW::ZV')
-CALL INIT_ON_HOST_AND_DEVICE(ZW,-1e99,'ADVECTION_UVW::ZW')
-CALL INIT_ON_HOST_AND_DEVICE(ZRUS_OTHER,-1e99,'ADVECTION_UVW::ZRUS_OTHER')
-CALL INIT_ON_HOST_AND_DEVICE(ZRVS_OTHER,-1e99,'ADVECTION_UVW::ZRVS_OTHER')
-CALL INIT_ON_HOST_AND_DEVICE(ZRWS_OTHER,-1e99,'ADVECTION_UVW::ZRWS_OTHER')
-CALL INIT_ON_HOST_AND_DEVICE(ZRUS_ADV,-1e99,'ADVECTION_UVW::ZRUS_ADV')
-CALL INIT_ON_HOST_AND_DEVICE(ZRVS_ADV,-1e99,'ADVECTION_UVW::ZRVS_ADV')
-CALL INIT_ON_HOST_AND_DEVICE(ZRWS_ADV,-1e99,'ADVECTION_UVW::ZRWS_ADV')
-CALL INIT_ON_HOST_AND_DEVICE(ZMXM_RHODJ,-1e97,'ADVECTION_UVW::ZMXM_RHODJ')
-CALL INIT_ON_HOST_AND_DEVICE(ZMYM_RHODJ,-2e97,'ADVECTION_UVW::ZMYM_RHODJ')
-CALL INIT_ON_HOST_AND_DEVICE(ZMZM_RHODJ,-3e97,'ADVECTION_UVW::ZMZM_RHODJ')
-#endif
-!
-SELECT CASE (HTEMP_SCHEME)
- CASE('RK11')
-  ISPL = 1
- CASE('RK21')
-  ISPL = 2
- CASE('NP32')
-  ISPL = 3
- CASE('SP32')
-  ISPL = 3
- CASE('RK33')
-  ISPL = 3
- CASE('RKC4')
-  ISPL = 4
- CASE('RK4B')
-  ISPL = 4
- CASE('RK53')
-  ISPL = 5
- CASE('RK62')
-  ISPL = 6
- CASE('RK65')
-  ISPL = 6
- CASE DEFAULT
-  call Print_msg( NVERB_FATAL, 'GEN', 'ADVECTION_UVW', 'unknown htemp_scheme' )
-END SELECT
-!
-CALL MNH_GET_ZT3D(IZUT, IZVT, IZWT, IZ1, IZ2)
-CALL MNH_GET_ZT4D(ISPL, IZRUSB, IZRUSE)
-CALL MNH_GET_ZT4D(ISPL, IZRVSB, IZRVSE)
-CALL MNH_GET_ZT4D(ISPL, IZRWSB, IZRWSE)
-CALL MNH_GET_ZT4D(3,    IIBMS,  IIBME)
-#endif
-!
 IKE = SIZE(PWT,3) - JPVEXT
 !
 #ifndef MNH_OPENACC
@@ -385,7 +324,7 @@ NULLIFY(TZFIELD_ll)
 CALL CONTRAV (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,4)
 #else
 CALL CONTRAV_DEVICE (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,4,&
-               ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+               ODATA_ON_DEVICE=.TRUE.)
 !Not necessary: already done in contrav_device !$acc update self(ZRUCT,ZRVCT,ZRWCT)
 #endif
 !
@@ -490,13 +429,7 @@ DO JSPL=1,ISPLIT
                     ZMXM_RHODJ, ZMYM_RHODJ, ZMZM_RHODJ,                &
                     ZRUCT, ZRVCT, ZRWCT,                               &
                     ZRUS_ADV, ZRVS_ADV, ZRWS_ADV,                      &
-                    ZRUS_OTHER, ZRVS_OTHER, ZRWS_OTHER                 &
-#ifndef MNH_OPENACC
-                    )
-#else
-                    ,ZT3D(:,:,:,IZUT), ZT3D(:,:,:,IZVT), ZT3D(:,:,:,IZWT), &
-                    ZT3D(:,:,:,IZRUSB:IZRUSE), ZT3D(:,:,:,IZRVSB:IZRVSE), ZT3D(:,:,:,IZRWSB:IZRWSE), ZT3D(:,:,:,IIBMS:IIBME) )
-#endif
+                    ZRUS_OTHER, ZRVS_OTHER, ZRWS_OTHER                 )
 !
 ! Tendencies on wind
 !$acc update device(ZRUS_ADV,ZRVS_ADV,ZRWS_ADV)
@@ -551,13 +484,6 @@ if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'ADV', prws(:, :, :
 
 !-------------------------------------------------------------------------------
 !
-#ifdef MNH_OPENACC
-CALL MNH_REL_ZT4D(3,    IIBMS )
-CALL MNH_REL_ZT4D(ISPL, IZRWSB)
-CALL MNH_REL_ZT4D(ISPL, IZRVSB)
-CALL MNH_REL_ZT4D(ISPL, IZRUSB)
-CALL MNH_REL_ZT3D(IZUT, IZVT, IZWT, IZ1, IZ2)
-#endif
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
diff --git a/src/ZSOLVER/advection_uvw_cen.f90 b/src/ZSOLVER/advection_uvw_cen.f90
index fd980ac36..7a8df745e 100644
--- a/src/ZSOLVER/advection_uvw_cen.f90
+++ b/src/ZSOLVER/advection_uvw_cen.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2013-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.
@@ -105,7 +105,6 @@ 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_GET_ZT3D , MNH_REL_ZT3D
 use mode_msg
 #endif
 use mode_mppdb
@@ -179,9 +178,6 @@ REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ
 !
 INTEGER                     :: IINFO_ll    ! return code of parallel routine
 TYPE(LIST_ll), POINTER      :: TZFIELDS_ll ! list of fields to exchange
-#ifdef MNH_OPENACC
-INTEGER :: IZ1, IZ2
-#endif
 !
 !-------------------------------------------------------------------------------
 !$acc data present( PUM, PVM, PWM, PDUM, PDVM, PDWM, PUT, PVT, PWT, PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY, PRUS, PRVS, PRWS )
@@ -248,8 +244,6 @@ CALL INIT_ON_HOST_AND_DEVICE(ZRWCT,-3e98,'ADVECTION_UVW_CEN::ZRWCT')
 CALL INIT_ON_HOST_AND_DEVICE(ZMXM_RHODJ,-1e97,'ADVECTION_UVW_CEN::ZMXM_RHODJ')
 CALL INIT_ON_HOST_AND_DEVICE(ZMYM_RHODJ,-2e97,'ADVECTION_UVW_CEN::ZMYM_RHODJ')
 CALL INIT_ON_HOST_AND_DEVICE(ZMZM_RHODJ,-3e97,'ADVECTION_UVW_CEN::ZMZM_RHODJ')
-!
-CALL MNH_GET_ZT3D(IZ1, IZ2)
 #endif
 
 #ifndef MNH_OPENACC
@@ -280,10 +274,10 @@ END IF
 #else
 IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN
   CALL CONTRAV_DEVICE (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,2, &
-                 ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+                 ODATA_ON_DEVICE=.TRUE.)
 ELSEIF (HUVW_ADV_SCHEME=='CEN4TH') THEN
   CALL CONTRAV_DEVICE (HLBCX,HLBCY,ZRUT,ZRVT,ZRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCT,ZRVCT,ZRWCT,4, &
-                 ZT3D(:,:,:,IZ1),ZT3D(:,:,:,IZ2),ODATA_ON_DEVICE=.TRUE.)
+                 ODATA_ON_DEVICE=.TRUE.)
 END IF
 !Not necessary: already done in contrav_device !$acc update self(ZRUCT,ZRVCT,ZRWCT)
 #endif
@@ -351,10 +345,6 @@ if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U), 'ADV', prus(:, :, :
 if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V), 'ADV', prvs(:, :, :) )
 if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'ADV', prws(:, :, :) )
 
-#ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D(IZ1, IZ2)
-#endif
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRUS,"ADVECTION_UVW_CEN end:PRUS")
diff --git a/src/ZSOLVER/advecuvw_rk.f90 b/src/ZSOLVER/advecuvw_rk.f90
index 6a4b8117c..8f62e91d0 100644
--- a/src/ZSOLVER/advecuvw_rk.f90
+++ b/src/ZSOLVER/advecuvw_rk.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.
@@ -16,12 +16,7 @@ INTERFACE
                     PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ,                &
                     PRUCT, PRVCT, PRWCT,                               &
                     PRUS_ADV, PRVS_ADV, PRWS_ADV,                      &
-                    PRUS_OTHER, PRVS_OTHER, PRWS_OTHER                 &
-#ifndef MNH_OPENACC
-                    )
-#else
-                    , ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS, ZIBM )
-#endif
+                    PRUS_OTHER, PRVS_OTHER, PRWS_OTHER                 )
 !
 CHARACTER(LEN=6),         INTENT(IN)    :: HUVW_ADV_SCHEME! to the selected
 CHARACTER(LEN=4),         INTENT(IN)    :: HTEMP_SCHEME   ! Temporal scheme
@@ -47,13 +42,6 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRUS_ADV , PRVS_ADV, PRWS_ADV
                                                   ! Tendency due to advection
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRUS_OTHER , PRVS_OTHER, PRWS_OTHER
 !                                                 ! tendencies from other processes
-#ifdef MNH_OPENACC
-! Work arrays
-REAL, DIMENSION(:,:,:)   :: ZUT, ZVT, ZWT
-REAL, DIMENSION(:,:,:,:) :: ZRUS, ZRVS, ZRWS, ZIBM
-#endif
-!
-!
 END SUBROUTINE ADVECUVW_RK
 !
 END INTERFACE
@@ -68,12 +56,7 @@ END MODULE MODI_ADVECUVW_RK
                     PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ,                &
                     PRUCT, PRVCT, PRWCT,                               &
                     PRUS_ADV, PRVS_ADV, PRWS_ADV,                      &
-                    PRUS_OTHER, PRVS_OTHER, PRWS_OTHER                 &
-#ifndef MNH_OPENACC
-                    )
-#else
-                    , ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS, ZIBM )
-#endif
+                    PRUS_OTHER, PRVS_OTHER, PRWS_OTHER                 )
 !     ##########################################################################
 !
 !!****  *ADVECUVW_RK * - routine to call the specialized advection routines for wind
@@ -150,7 +133,7 @@ USE MODI_SHUMAN
 !
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,     ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 !
 !-------------------------------------------------------------------------------
@@ -183,17 +166,9 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRUS_ADV , PRVS_ADV, PRWS_ADV
                                                   ! Tendency due to advection
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRUS_OTHER , PRVS_OTHER, PRWS_OTHER
 !                                                 ! tendencies from other processes
-#ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:)   :: ZUT, ZVT, ZWT
-REAL, DIMENSION(:,:,:,:) :: ZRUS, ZRVS, ZRWS, ZIBM
-#endif
-!
-!
 !
 !*       0.2   declarations of local variables
 !
-!
-!
 character(len=3)    :: ynum
 INTEGER             :: IKE       ! indice K End       in z direction
 !
@@ -201,13 +176,23 @@ INTEGER             :: IKE       ! indice K End       in z direction
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUT, ZVT, ZWT
 ! Intermediate Guesses inside the RK loop
 !
-REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRUS,ZRVS,ZRWS,ZIBM
-#endif
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRUS, ZRVS, ZRWS, ZIBM
 ! Momentum tendencies due to advection
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZBUT ! Butcher array coefficients
                                           ! at the RK sub time step
 REAL, DIMENSION(:),   ALLOCATABLE :: ZBUTS! Butcher array coefficients
                                           ! at the end of the RK loop
+#else
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZUT, ZVT, ZWT
+! Intermediate Guesses inside the RK loop
+!
+REAL, DIMENSION(:,:,:,:), POINTER, CONTIGUOUS :: ZRUS, ZRVS, ZRWS, ZIBM
+! Momentum tendencies due to advection
+REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZBUT ! Butcher array coefficients
+                                          ! at the RK sub time step
+REAL, DIMENSION(:),   POINTER, CONTIGUOUS :: ZBUTS! Butcher array coefficients
+                                          ! at the end of the RK loop
+#endif
 !JUAN
 TYPE(LIST_ll), POINTER      :: TZFIELDMT_ll ! list of fields to exchange
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll ! momentum variables
@@ -219,9 +204,6 @@ INTEGER                     :: INBVAR
 INTEGER :: IIU, IJU, IKU ! array sizes
 !JUAN
 
-#ifdef MNH_OPENACC
-INTEGER :: IZMEAN, IZWORK
-#endif
 ! Momentum tendencies due to advection
 INTEGER :: ISPL                ! Number of RK splitting loops
 INTEGER :: JI, JS              ! Loop index
@@ -236,10 +218,6 @@ LOGICAL :: GIBM !Intermediate variable used to work around a Cray compiler bug (
 REAL    :: ZIBM_EPSI !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0)
 REAL          :: ZTIME1,ZTIME2
 !-------------------------------------------------------------------------------
-!$acc data present( PU, PV, PW, PUT, PVT, PWT, PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ, &
-!$acc &             PRUCT, PRVCT, PRWCT, PRUS_ADV, PRVS_ADV, PRWS_ADV,             &
-!$acc &             PRUS_OTHER, PRVS_OTHER, PRWS_OTHER, ZUT, ZVT, ZWT,             &
-!$acc &             ZRUS, ZRVS, ZRWS, ZIBM )
 
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -270,20 +248,6 @@ if ( LIBM ) call Print_msg( NVERB_FATAL, 'GEN', 'ADVECUVW_RK', 'OpenACC: LIBM=T
 !*       0.     INITIALIZATION
 !        ---------------------
 !
-#ifndef MNH_OPENACC
-allocate(ZUT(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
-allocate(ZVT(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
-allocate(ZWT(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)))
-#endif
-
-#ifdef MNH_OPENACC
-CALL INIT_ON_HOST_AND_DEVICE(ZUT,4e99,'ADVECUVW_RK::ZUT')
-CALL INIT_ON_HOST_AND_DEVICE(ZVT,5e99,'ADVECUVW_RK::ZVT')
-CALL INIT_ON_HOST_AND_DEVICE(ZWT,6e99,'ADVECUVW_RK::ZWT')
-!
-CALL MNH_GET_ZT3D(IZMEAN,IZWORK)
-#endif
-!
 IKE = SIZE(PWT,3) - JPVEXT
 IIU=SIZE(PUT,1)
 IJU=SIZE(PUT,2)
@@ -314,11 +278,47 @@ SELECT CASE (HTEMP_SCHEME)
   call Print_msg(NVERB_FATAL,'GEN','ADVECUVW_RK','unknown HTEMP_SCHEME')
 END SELECT
 !
-!
+#ifndef MNH_OPENACC
+allocate( ZUT(IIU, IJU, IKU) )
+allocate( ZVT(IIU, IJU, IKU) )
+allocate( ZWT(IIU, IJU, IKU) )
+
+ALLOCATE( ZRUS(IIU, IJU, IKU, ISPL) )
+ALLOCATE( ZRVS(IIU, IJU, IKU, ISPL) )
+ALLOCATE( ZRWS(IIU, IJU, IKU, ISPL) )
+
+IF ( GIBM ) ALLOCATE( ZIBM(IIU, IJU, IKU, 3) )
+
 ALLOCATE(ZBUT(ISPL-1,ISPL-1))
 ALLOCATE(ZBUTS(ISPL))
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ZUT, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZVT, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZWT, IIU, IJU, IKU )
+
+CALL MNH_MEM_GET( ZRUS, IIU, IJU, IKU, ISPL )
+CALL MNH_MEM_GET( ZRVS, IIU, IJU, IKU, ISPL )
+CALL MNH_MEM_GET( ZRWS, IIU, IJU, IKU, ISPL )
+
+IF ( GIBM ) CALL MNH_MEM_GET( ZIBM, IIU, IJU, IKU, 3 )
 
-!$acc data create(ZBUT,ZBUTS)
+CALL MNH_MEM_GET( ZBUT,  ISPL-1, ISPL-1 )
+CALL MNH_MEM_GET( ZBUTS, ISPL )
+#endif
+
+#ifdef MNH_OPENACC
+CALL INIT_ON_HOST_AND_DEVICE(ZUT,4e99,'ADVECUVW_RK::ZUT')
+CALL INIT_ON_HOST_AND_DEVICE(ZVT,5e99,'ADVECUVW_RK::ZVT')
+CALL INIT_ON_HOST_AND_DEVICE(ZWT,6e99,'ADVECUVW_RK::ZWT')
+#endif
+
+!$acc data present( PU, PV, PW, PUT, PVT, PWT, PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ, &
+!$acc &             PRUCT, PRVCT, PRWCT, PRUS_ADV, PRVS_ADV, PRWS_ADV,             &
+!$acc &             PRUS_OTHER, PRVS_OTHER, PRWS_OTHER, ZUT, ZVT, ZWT,             &
+!$acc &             ZRUS, ZRVS, ZRWS, ZIBM, ZBUT, ZBUTS )
 
 SELECT CASE (HTEMP_SCHEME)
   CASE('RK11')
@@ -405,16 +405,7 @@ CASE('RK65')
 END SELECT
 !$acc update device(ZBUTS,ZBUT)
 !
-#ifndef MNH_OPENACC
-ALLOCATE(ZRUS(SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3),ISPL))
-ALLOCATE(ZRVS(SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3),ISPL))
-ALLOCATE(ZRWS(SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3),ISPL))
-#endif
-
 IF ( GIBM ) THEN
-#ifndef MNH_OPENACC
-  ALLOCATE( ZIBM(SIZE(PUT,1), SIZE(PUT,2), SIZE(PWT,3), 3) )
-#endif
 !$acc kernels
   ZIBM(:,:,:,:) = 1.
 !$acc end kernels
@@ -522,8 +513,7 @@ RKLOOP: DO JS = 1, ISPL
 #ifndef MNH_OPENACC
                         TZHALO2MT_ll                                    )
 #else
-                        TZHALO2_UT,TZHALO2_VT,TZHALO2_WT &
-                        , ZT3D(:,:,:,IZMEAN), ZT3D(:,:,:,IZWORK)        )
+                        TZHALO2_UT,TZHALO2_VT,TZHALO2_WT                )
 #endif
   ELSE IF ((HUVW_ADV_SCHEME=='CEN4TH') .AND. (HTEMP_SCHEME=='RKC4')) THEN
     CALL ADVECUVW_4TH (HLBCX, HLBCY, PRUCT, PRVCT, PRWCT,               &
@@ -540,8 +530,7 @@ RKLOOP: DO JS = 1, ISPL
 #ifndef MNH_OPENACC
                           TZHALO2MT_ll                                    )
 #else
-                          TZHALO2_UT,TZHALO2_VT,TZHALO2_WT &
-                          , ZT3D(:,:,:,IZMEAN), ZT3D(:,:,:,IZWORK)        )
+                          TZHALO2_UT,TZHALO2_VT,TZHALO2_WT                )
 #endif
     ENDIF
     IF (HUVW_ADV_SCHEME=='CEN4TH') THEN
@@ -599,7 +588,7 @@ RKLOOP: DO JS = 1, ISPL
   IF ( JS < ISPL ) THEN
 !$acc kernels present(ZUT,ZVT,ZWT) present(ZBUT) present(PU,PV,PW)        &
 !$acc & present(ZRUS,ZRVS,ZRWS) present(PRUS_OTHER,PRVS_OTHER,PRWS_OTHER) &
-!$acc & present(PMXM_RHODJ,PMYM_RHODJ,PMZM_RHODJ)
+!$acc & present(PMXM_RHODJ,PMYM_RHODJ,PMZM_RHODJ, ZIBM )
 !
     ZUT(:,:,:) = PU(:,:,:)
     ZVT(:,:,:) = PV(:,:,:)
@@ -634,15 +623,16 @@ RKLOOP: DO JS = 1, ISPL
  END DO RKLOOP
 !
 !
-#ifdef MNH_OPENACC
-CALL MNH_REL_ZT3D(IZMEAN,IZWORK)
-#endif
-!
 CALL CLEANLIST_ll(TZFIELDMT_ll)
 CALL DEL_HALO2_ll(TZHALO2MT_ll)
 !$acc update self(PRUS_ADV,PRVS_ADV,PRWS_ADV)
 !-------------------------------------------------------------------------------
-!
+
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all OUT arrays
   CALL MPPDB_CHECK(PRUS_ADV,"ADVECUVW_RK end:PRUS_ADV")
@@ -650,8 +640,4 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWS_ADV,"ADVECUVW_RK end:PRWS_ADV")
 END IF
 
-!$acc end data
-
-!$acc end data
-
 END SUBROUTINE ADVECUVW_RK
diff --git a/src/ZSOLVER/advecuvw_weno_k.f90 b/src/ZSOLVER/advecuvw_weno_k.f90
index 8486449ef..098ab2c8c 100644
--- a/src/ZSOLVER/advecuvw_weno_k.f90
+++ b/src/ZSOLVER/advecuvw_weno_k.f90
@@ -14,8 +14,7 @@ INTERFACE
 #ifndef MNH_OPENACC
                              TPHALO2LIST )
 #else
-                             TPHALO2_UT,TPHALO2_VT,TPHALO2_WT &
-                             , ZMEAN, ZWORK)
+                             TPHALO2_UT,TPHALO2_VT,TPHALO2_WT )
 #endif
 !
 USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll
@@ -39,10 +38,6 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2LIST ! list for diffusion
 TYPE(HALO2LIST_ll), POINTER :: TPHALO2_UT,TPHALO2_VT,TPHALO2_WT
 #endif
 !
-#ifdef MNH_OPENACC
-! Work arrays
-REAL, DIMENSION(:,:,:) :: ZMEAN, ZWORK
-#endif
 !
 END SUBROUTINE ADVECUVW_WENO_K
 !
@@ -56,8 +51,7 @@ END MODULE MODI_ADVECUVW_WENO_K
 #ifndef MNH_OPENACC
                              TPHALO2LIST )
 #else
-                             TPHALO2_UT,TPHALO2_VT,TPHALO2_WT &
-                             , ZMEAN, ZWORK)
+                             TPHALO2_UT,TPHALO2_VT,TPHALO2_WT )
 #endif
 !     ##########################################################################
 !
@@ -84,7 +78,7 @@ USE MODD_PARAMETERS
 USE MODE_ll
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
-USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D
+USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 USE MODE_MPPDB
 
@@ -123,25 +117,23 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2_UT,TPHALO2_VT,TPHALO2_WT
 !
 !*       0.2   Declarations of local variables :
 !
+INTEGER                     :: IIU, IJU, IKU
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2_UT,TZHALO2_VT,TZHALO2_WT
 INTEGER                     :: IINFO_ll    ! return code of parallel routine
 !
 #ifndef MNH_OPENACC
 REAL, DIMENSION(:,:,:), allocatable :: ZMEAN, ZWORK
 #else
-REAL, DIMENSION(:,:,:) :: ZMEAN, ZWORK
-#endif
-!
-#ifdef MNH_OPENACC
-INTEGER :: IZFPOS1, IZFPOS2, IZFPOS3
-INTEGER :: IZFNEG1, IZFNEG2, IZFNEG3
-INTEGER :: IZBPOS1, IZBPOS2, IZBPOS3
-INTEGER :: IZBNEG1, IZBNEG2, IZBNEG3
-INTEGER :: IZOMP1,  IZOMP2,  IZOMP3
-INTEGER :: IZOMN1,  IZOMN2,  IZOMN3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZMEAN, ZWORK
+!
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZFPOS1, ZFPOS2, ZFPOS3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZFNEG1, ZFNEG2, ZFNEG3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZBPOS1, ZBPOS2, ZBPOS3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZBNEG1, ZBNEG2, ZBNEG3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZOMP1,  ZOMP2,  ZOMP3
+REAL, DIMENSION(:,:,:), POINTER ,CONTIGUOUS :: ZOMN1,  ZOMN2,  ZOMN3
 #endif
 !
-!$acc data present( PRUCT, PRVCT, PRWCT, PUT, PVT, PWT, PRUS, PRVS, PRWS, ZMEAN, ZWORK )
 !
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
@@ -157,9 +149,19 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWS,"ADVECUVW_WENO_K beg:PRWS")
 END IF
 
+IIU = SIZE( PUT, 1 )
+IJU = SIZE( PUT, 2 )
+IKU = SIZE( PUT, 3 )
+
 #ifndef MNH_OPENACC
-allocate(ZMEAN(SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3)))
-allocate(ZWORK(SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3)))
+allocate( ZMEAN(IIU, IJU, IKU) )
+allocate( ZWORK(IIU, IJU, IKU) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ZMEAN, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZWORK, IIU, IJU, IKU )
 #endif
 
 #ifdef MNH_OPENACC
@@ -181,7 +183,9 @@ TZHALO2_WT => TPHALO2_WT
 #endif
 !
 !      -------------------------------------------------------
-!
+
+!$acc data present( PRUCT, PRVCT, PRWCT, PUT, PVT, PWT, PRUS, PRVS, PRWS, ZMEAN, ZWORK )
+
 SELECT CASE(KWENO_ORDER)
 !
 CASE(1) ! WENO 1
@@ -338,15 +342,29 @@ CASE(3) ! WENO 3
 !
   PRWS = PRWS - DZM(WENO_K_2_WZ(PWT,MZF(PRWCT)))
 #else
-  CALL MNH_GET_ZT3D(IZFPOS1,IZFPOS2,IZFNEG1,IZFNEG2,IZBPOS1,IZBPOS2,IZBNEG1,IZBNEG2,IZOMP1,IZOMP2,IZOMN1,IZOMN2)
+  !Pin positions in the pools of MNH memory
+  CALL MNH_MEM_POSITION_PIN()
+
+  CALL MNH_MEM_GET( ZFPOS1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFPOS2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP1,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP2,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN1,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN2,  IIU, IJU, IKU )
 !
 ! U component
 !
   CALL MXF_DEVICE(PRUCT,ZWORK)
-  CALL ADVEC_WENO_K_2_UX(HLBCX, PUT, ZWORK, ZMEAN, TZHALO2_UT%HALO2%WEST, TZHALO2_UT%HALO2%EAST,             &
-                         ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                         ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                         ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+  CALL ADVEC_WENO_K_2_UX(HLBCX, PUT, ZWORK, ZMEAN, TZHALO2_UT%HALO2%WEST, TZHALO2_UT%HALO2%EAST, &
+                         ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),             &
+                         ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),             &
+                         ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)               )
   CALL DXM_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
   PRUS(:,:,:) = PRUS(:,:,:) - ZWORK(:,:,:)
@@ -354,10 +372,10 @@ CASE(3) ! WENO 3
 !   
   IF (.NOT.L2D) THEN
     CALL MXM_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_2_MY(HLBCY, PUT, ZWORK, ZMEAN, TZHALO2_UT%HALO2%NORTH, TZHALO2_UT%HALO2%SOUTH,           &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL ADVEC_WENO_K_2_MY(HLBCY, PUT, ZWORK, ZMEAN, TZHALO2_UT%HALO2%NORTH, TZHALO2_UT%HALO2%SOUTH, &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),               &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),               &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)                 )
     CALL DYF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
     PRUS(:,:,:) = PRUS(:,:,:) - ZWORK(:,:,:)
@@ -366,10 +384,10 @@ CASE(3) ! WENO 3
 !
 !  PRUS = PRUS - DZF(WENO_K_2_MZ(PUT, MXM(PRWCT)))
   CALL MXM_DEVICE(PRWCT,ZWORK)
-  CALL WENO_K_2_MZ(PUT, ZWORK, ZMEAN,                                                                  &
-                   ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                   ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                   ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+  CALL WENO_K_2_MZ(PUT, ZWORK, ZMEAN,                                          &
+                   ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:), &
+                   ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:), &
+                   ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)   )
   CALL DZF_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
   PRUS(:,:,:) = PRUS(:,:,:) - ZWORK(:,:,:)
@@ -379,20 +397,20 @@ CASE(3) ! WENO 3
 !
   IF (.NOT.L2D) THEN
     CALL MYM_DEVICE(PRUCT,ZWORK)
-    CALL ADVEC_WENO_K_2_MX(HLBCX, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2%WEST, TZHALO2_VT%HALO2%EAST,             &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL ADVEC_WENO_K_2_MX(HLBCX, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2%WEST, TZHALO2_VT%HALO2%EAST, &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),             &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),             &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)               )
     CALL DXF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
     PRVS(:,:,:) = PRVS(:,:,:) - ZWORK(:,:,:)
 !$acc end kernels
 !   
     CALL MYF_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_2_VY(HLBCY, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2%NORTH, TZHALO2_VT%HALO2%SOUTH,           &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL ADVEC_WENO_K_2_VY(HLBCY, PVT, ZWORK, ZMEAN, TZHALO2_VT%HALO2%NORTH, TZHALO2_VT%HALO2%SOUTH, &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),               &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),               &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)                 )
     CALL DYM_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
     PRVS(:,:,:) = PRVS(:,:,:) - ZWORK(:,:,:)
@@ -400,10 +418,10 @@ CASE(3) ! WENO 3
 !
 !    PRVS = PRVS - DZF(WENO_K_2_MZ(PVT, MYM(PRWCT)))
     CALL MYM_DEVICE(PRWCT,ZWORK)
-    CALL WENO_K_2_MZ(PVT, ZWORK, ZMEAN,                                                                  &
-                     ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                     ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                     ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL WENO_K_2_MZ(PVT, ZWORK, ZMEAN,                                          &
+                     ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:), &
+                     ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:), &
+                     ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)   )
     CALL DZF_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
     PRVS(:,:,:) = PRVS(:,:,:) - ZWORK(:,:,:)
@@ -414,10 +432,10 @@ CASE(3) ! WENO 3
 !
 !  ZWORK = MZM(PRUCT)
   CALL MZM_DEVICE(PRUCT,ZWORK)
-  CALL ADVEC_WENO_K_2_MX(HLBCX, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2%WEST, TZHALO2_WT%HALO2%EAST,             &
-                         ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                         ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                         ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+  CALL ADVEC_WENO_K_2_MX(HLBCX, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2%WEST, TZHALO2_WT%HALO2%EAST, &
+                         ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),             &
+                         ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),             &
+                         ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)               )
   CALL DXF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
   PRWS(:,:,:) = PRWS(:,:,:) - ZWORK(:,:,:)
@@ -426,10 +444,10 @@ CASE(3) ! WENO 3
   IF (.NOT.L2D) THEN
 !    ZWORK = MZM(PRVCT)
     CALL MZM_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_2_MY(HLBCY, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2%NORTH, TZHALO2_WT%HALO2%SOUTH,           &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+    CALL ADVEC_WENO_K_2_MY(HLBCY, PWT, ZWORK, ZMEAN, TZHALO2_WT%HALO2%NORTH, TZHALO2_WT%HALO2%SOUTH, &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:),               &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:),               &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)                 )
     CALL DYF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
     PRWS(:,:,:) = PRWS(:,:,:) - ZWORK(:,:,:)
@@ -438,16 +456,17 @@ CASE(3) ! WENO 3
 !
 !  PRWS = PRWS - DZM(WENO_K_2_WZ(PWT,MZF(PRWCT)))
   CALL MZF_DEVICE( PRWCT, ZWORK )
-  CALL WENO_K_2_WZ(PWT, ZWORK, ZMEAN,                                                                  &
-                   ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), &
-                   ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), &
-                   ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2) )
+  CALL WENO_K_2_WZ(PWT, ZWORK, ZMEAN,                                          &
+                   ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFNEG1(:,:,:), ZFNEG2(:,:,:), &
+                   ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBNEG1(:,:,:), ZBNEG2(:,:,:), &
+                   ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMN1(:,:,:),  ZOMN2(:,:,:)   )
   CALL DZM_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
   PRWS(:,:,:) = PRWS(:,:,:) - ZWORK(:,:,:)
 !$acc end kernels
 !
-  CALL MNH_REL_ZT3D(IZFPOS1,IZFPOS2,IZFNEG1,IZFNEG2,IZBPOS1,IZBPOS2,IZBNEG1,IZBNEG2,IZOMP1,IZOMP2,IZOMN1,IZOMN2)
+  !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+  CALL MNH_MEM_RELEASE()
 #endif
 !
 !
@@ -510,19 +529,38 @@ CASE(5) ! WENO 5
   CALL GET_HALO(ZMEAN)! Update HALO - maybe not necessary (T.Lunet)
   PRWS = PRWS - DZM(ZMEAN)
 #else
-  CALL MNH_GET_ZT3D(IZFPOS1,IZFPOS2,IZFPOS3,IZFNEG1,IZFNEG2,IZFNEG3,IZBPOS1, &
-                    IZBPOS2,IZBPOS3,IZBNEG1,IZBNEG2,IZBNEG3,IZOMP1,IZOMP2,IZOMP3,IZOMN1,IZOMN2,IZOMN3)
+  !Pin positions in the pools of MNH memory
+  CALL MNH_MEM_POSITION_PIN()
+
+  CALL MNH_MEM_GET( ZFPOS1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFPOS2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFPOS3, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZFNEG3, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBPOS3, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG1, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG2, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZBNEG3, IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP1,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP2,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMP3,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN1,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN2,  IIU, IJU, IKU )
+  CALL MNH_MEM_GET( ZOMN3,  IIU, IJU, IKU )
 !
 ! U component
 !
   CALL MXF_DEVICE(PRUCT,ZWORK)
-  CALL ADVEC_WENO_K_3_UX(HLBCX, PUT, ZWORK, ZMEAN, &
-                         ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                         ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                         ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                         ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                         ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                         ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+  CALL ADVEC_WENO_K_3_UX(HLBCX, PUT, ZWORK, ZMEAN,                    &
+                         ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                         ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                         ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                         ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                         ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                         ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
   CALL GET_HALO_D(ZMEAN)! Update HALO 
   CALL DXM_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -531,13 +569,13 @@ CASE(5) ! WENO 5
 !
   IF (.NOT.L2D) THEN
     CALL MXM_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_3_MY(HLBCY, PUT, ZWORK, ZMEAN, &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                           ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                           ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                           ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL ADVEC_WENO_K_3_MY(HLBCY, PUT, ZWORK, ZMEAN,                    &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                           ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                           ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                           ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO 
     CALL DYF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -546,13 +584,13 @@ CASE(5) ! WENO 5
   END IF
 !
   CALL MXM_DEVICE(PRWCT,ZWORK)
-  CALL WENO_K_3_MZ(PUT,ZWORK,ZMEAN, &
-                   ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                   ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                   ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                   ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                   ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                   ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+  CALL WENO_K_3_MZ(PUT,ZWORK,ZMEAN,                             &
+                   ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                   ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                   ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                   ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                   ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                   ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
   CALL GET_HALO_D(ZMEAN)! Update HALO - maybe not necessary (T.Lunet)
   CALL DZF_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
@@ -563,13 +601,13 @@ CASE(5) ! WENO 5
 !
   IF (.NOT.L2D) THEN
     CALL MYM_DEVICE(PRUCT,ZWORK)
-    CALL ADVEC_WENO_K_3_MX(HLBCX, PVT, ZWORK, ZMEAN, &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                           ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                           ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                           ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL ADVEC_WENO_K_3_MX(HLBCX, PVT, ZWORK, ZMEAN,                    &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                           ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                           ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                           ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO 
     CALL DXF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -577,13 +615,13 @@ CASE(5) ! WENO 5
 !$acc end kernels
 !   
     CALL MYF_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_3_VY(HLBCY, PVT, ZWORK, ZMEAN, &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                           ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                           ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                           ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL ADVEC_WENO_K_3_VY(HLBCY, PVT, ZWORK, ZMEAN,                    &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                           ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                           ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                           ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO 
     CALL DYM_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -591,13 +629,13 @@ CASE(5) ! WENO 5
 !$acc end kernels
 !
     CALL MYM_DEVICE(PRWCT,ZWORK)
-    CALL WENO_K_3_MZ(PVT,ZWORK,ZMEAN, &
-                     ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                     ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                     ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                     ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                     ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                     ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL WENO_K_3_MZ(PVT, ZWORK, ZMEAN,                           &
+                     ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                     ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                     ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                     ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                     ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                     ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO - maybe not necessary (T.Lunet)
     CALL DZF_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
@@ -608,13 +646,13 @@ CASE(5) ! WENO 5
 ! W component
 !
   CALL MZM_DEVICE(PRUCT,ZWORK)
-  CALL ADVEC_WENO_K_3_MX(HLBCX, PWT, ZWORK, ZMEAN, &
-                         ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                         ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                         ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                         ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                         ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                         ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+  CALL ADVEC_WENO_K_3_MX(HLBCX, PWT, ZWORK, ZMEAN,                    &
+                         ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                         ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                         ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                         ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                         ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                         ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
   CALL GET_HALO_D(ZMEAN)! Update HALO 
   CALL DXF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -623,13 +661,13 @@ CASE(5) ! WENO 5
 !
   IF (.NOT.L2D) THEN
   CALL MZM_DEVICE(PRVCT,ZWORK)
-    CALL ADVEC_WENO_K_3_MY(HLBCY, PWT, ZWORK, ZMEAN, &
-                           ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                           ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                           ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                           ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                           ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                           ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+    CALL ADVEC_WENO_K_3_MY(HLBCY, PWT, ZWORK, ZMEAN,                    &
+                           ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                           ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                           ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                           ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                           ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                           ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
     CALL GET_HALO_D(ZMEAN)! Update HALO 
     CALL DYF_DEVICE(ZMEAN,ZWORK)
 !$acc kernels
@@ -638,34 +676,38 @@ CASE(5) ! WENO 5
   END IF
 !
   CALL MZF_DEVICE( PRWCT, ZWORK )
-  CALL WENO_K_3_WZ(PWT,ZWORK,ZMEAN, &
-                   ZT3D(:,:,:,IZFPOS1), ZT3D(:,:,:,IZFPOS2), ZT3D(:,:,:,IZFPOS3), &
-                   ZT3D(:,:,:,IZFNEG1), ZT3D(:,:,:,IZFNEG2), ZT3D(:,:,:,IZFNEG3), &
-                   ZT3D(:,:,:,IZBPOS1), ZT3D(:,:,:,IZBPOS2), ZT3D(:,:,:,IZBPOS3), &
-                   ZT3D(:,:,:,IZBNEG1), ZT3D(:,:,:,IZBNEG2), ZT3D(:,:,:,IZBNEG3), &
-                   ZT3D(:,:,:,IZOMP1),  ZT3D(:,:,:,IZOMP2),  ZT3D(:,:,:,IZOMP3),  &
-                   ZT3D(:,:,:,IZOMN1),  ZT3D(:,:,:,IZOMN2),  ZT3D(:,:,:,IZOMN3) )
+  CALL WENO_K_3_WZ(PWT,ZWORK,ZMEAN,                             &
+                   ZFPOS1(:,:,:), ZFPOS2(:,:,:), ZFPOS3(:,:,:), &
+                   ZFNEG1(:,:,:), ZFNEG2(:,:,:), ZFNEG3(:,:,:), &
+                   ZBPOS1(:,:,:), ZBPOS2(:,:,:), ZBPOS3(:,:,:), &
+                   ZBNEG1(:,:,:), ZBNEG2(:,:,:), ZBNEG3(:,:,:), &
+                   ZOMP1(:,:,:),  ZOMP2(:,:,:),  ZOMP3(:,:,:),  &
+                   ZOMN1(:,:,:),  ZOMN2(:,:,:),  ZOMN3(:,:,:)   )
   CALL GET_HALO_D(ZMEAN)! Update HALO - maybe not necessary (T.Lunet)
   CALL DZM_DEVICE( ZMEAN, ZWORK )
 !$acc kernels
   PRWS(:,:,:) = PRWS(:,:,:) - ZWORK(:,:,:)
 !$acc end kernels
 !
-  CALL MNH_REL_ZT3D(IZFPOS1,IZFPOS2,IZFPOS3,IZFNEG1,IZFNEG2,IZFNEG3,IZBPOS1, &
-                    IZBPOS2,IZBPOS3,IZBNEG1,IZBNEG2,IZBNEG3,IZOMP1,IZOMP2,IZOMP3,IZOMN1,IZOMN2,IZOMN3)
+  !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+  CALL MNH_MEM_RELEASE()
 #endif
 !
 !
 END SELECT
 !             ---------------------------------
 !$acc update self(PRUS,PRVS,PRWS)
-!
+
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since beginning of subroutine
+CALL MNH_MEM_RELEASE()
+
 IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRUS,"ADVECUVW_WENO_K end:PRUS")
   CALL MPPDB_CHECK(PRVS,"ADVECUVW_WENO_K end:PRVS")
   CALL MPPDB_CHECK(PRWS,"ADVECUVW_WENO_K end:PRWS")
 END IF
 
-!$acc end data
 
 END SUBROUTINE ADVECUVW_WENO_K
diff --git a/src/ZSOLVER/contrav.f90 b/src/ZSOLVER/contrav.f90
index 8329a9eb2..ec2915c81 100644
--- a/src/ZSOLVER/contrav.f90
+++ b/src/ZSOLVER/contrav.f90
@@ -32,7 +32,7 @@ END SUBROUTINE CONTRAV
 !
 #ifdef MNH_OPENACC
       SUBROUTINE CONTRAV_DEVICE(HLBCX,HLBCY,PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,  &
-                         PRUCT,PRVCT,PRWCT,KADV_ORDER,Z1,Z2,ODATA_ON_DEVICE     )
+                         PRUCT,PRVCT,PRWCT,KADV_ORDER,ODATA_ON_DEVICE     )
 !
 !
 CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX  ! X direction LBC type
@@ -49,7 +49,6 @@ REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRUCT      ! Contrav comp along x-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRVCT      ! Contrav comp along y-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRWCT      ! Contrav comp along z-bar
 INTEGER,                 INTENT(IN)    ::  KADV_ORDER ! Order of the advection scheme
-REAL, DIMENSION(:,:,:),  INTENT(OUT)   :: Z1,Z2       ! Work arrays
 LOGICAL, OPTIONAL,       INTENT(IN)    :: ODATA_ON_DEVICE ! Is some of the data on the accelerator device
 !
 !
@@ -450,7 +449,7 @@ END SUBROUTINE CONTRAV
 #ifdef MNH_OPENACC
 !     ##############################################################
       SUBROUTINE CONTRAV_DEVICE(HLBCX,HLBCY,PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY,  &
-                         PRUCT,PRVCT,PRWCT,KADV_ORDER,Z1,Z2,ODATA_ON_DEVICE     )
+                         PRUCT,PRVCT,PRWCT,KADV_ORDER,ODATA_ON_DEVICE     )
 !     ##############################################################
 !
 !!****  *CONTRAV * - computes the contravariant components from the
@@ -524,6 +523,7 @@ USE MODD_PARAMETERS
 USE MODE_ll
 USE MODE_MPPDB
 #ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,     ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 use mode_msg
 #endif
 !
@@ -552,7 +552,6 @@ REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRUCT    ! Contrav comp along x-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRVCT    ! Contrav comp along y-bar
 REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PRWCT    ! Contrav comp along z-bar
 INTEGER,                 INTENT(IN)    ::  KADV_ORDER ! Order of the advection scheme
-REAL, DIMENSION(:,:,:),  INTENT(OUT)   :: Z1,Z2       ! Work arrays
 LOGICAL,   OPTIONAL,     INTENT(IN)    :: ODATA_ON_DEVICE ! Is some of the data on the accelerator device
 !
 !
@@ -566,13 +565,13 @@ INTEGER                             :: IINFO_ll
 LOGICAL                             :: GDATA_ON_DEVICE
 real                                :: ZTMP1, ZTMP2 ! Intermediate work variables
 REAL,   DIMENSION(:,:), POINTER , CONTIGUOUS :: ZU_EAST, ZV_NORTH, ZDZX_EAST, ZDZY_NORTH
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: Z1,Z2       ! Work arrays
 TYPE(LIST_ll),          POINTER     :: TZFIELD_U, TZFIELD_V, TZFIELD_DZX, TZFIELD_DZY
 TYPE(HALO2LIST_ll), SAVE, POINTER  :: TZHALO2_U, TZHALO2_V, TZHALO2_DZX, TZHALO2_DZY
 LOGICAL , SAVE :: GFIRST_CALL_CONTRAV_DEVICE = .TRUE.
 !
 LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH
 !
-!$acc data present( PRUT, PRVT, PRWT, PDXX, PDYY, PDZZ, PDZX, PDZY, PRUCT, PRVCT, PRWCT, Z1, Z2 )
 
 IF ( PRESENT(ODATA_ON_DEVICE) ) THEN
   GDATA_ON_DEVICE = ODATA_ON_DEVICE
@@ -599,7 +598,13 @@ END IF
 IIU= SIZE(PDXX,1)
 IJU= SIZE(PDXX,2)
 IKU= SIZE(PDXX,3)
-!
+
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( Z1, IIU, IJU, IKU )
+CALL MNH_MEM_GET( Z2, IIU, IJU, IKU )
+
 GWEST  = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() )
 GEAST  = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() )
 GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() )
@@ -609,7 +614,9 @@ CALL GET_INDICE_ll( IIB,IJB,IIE,IJE)
 !
 IKB=1+JPVEXT
 IKE=IKU - JPVEXT
-!
+
+!$acc data present( PRUT, PRVT, PRWT, PDXX, PDYY, PDZZ, PDZX, PDZY, PRUCT, PRVCT, PRWCT, Z1, Z2 )
+
 IF (GDATA_ON_DEVICE) THEN
 !PW TODO:remplacer (ailleurs aussi...) 1/PDXX... par PINV_PDXX (fait pour la turbulence...) cfr MNH/turb_hor_splt.f90
 !$acc kernels
@@ -734,12 +741,12 @@ ELSE IF (KADV_ORDER == 4 ) THEN
       END IF
       IE=IIE-1
 !!$   ELSE
-!!$      IF (LWEST_ll()) THEN
+!!$      IF ( GWEST ) THEN
 !!$         IW=IIB+1
 !!$      ELSE
 !!$         IW=IIB
 !!$      END IF
-!!$      IF (LEAST_ll() .AND. HLBCX(2)/='CYCL' ) THEN
+!!$      IF ( GEAST ) THEN
 !!$         IE=IIE-1
 !!$      ELSE
 !!$         IE=IIE
@@ -754,12 +761,12 @@ ELSE IF (KADV_ORDER == 4 ) THEN
       END IF
       IN=IJE-1
 !!$   ELSE
-!!$      IF (LSOUTH_ll()) THEN
+!!$      IF ( GSOUTH ) THEN
 !!$         IS=IJB+1
 !!$      ELSE
 !!$         IS=IJB
 !!$      END IF
-!!$      IF (LNORTH_ll() .AND. HLBCY(2)/='CYCL' ) THEN
+!!$      IF ( GNORTH ) THEN
 !!$         IN=IJE-1
 !!$      ELSE
 !!$         IN=IJE
@@ -902,7 +909,12 @@ IF (KADV_ORDER == 4 ) THEN
 END IF
 
 END IF FLAT
-!-----------------------------------------------------------------------
+
+!$acc end data
+
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all OUT arrays
   CALL MPPDB_CHECK(PRUCT,"CONTRAV end:PRUCT")
@@ -910,7 +922,6 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWCT,"CONTRAV end:PRWCT")
 END IF
 
-!$acc end data
-
+!-----------------------------------------------------------------------
 END SUBROUTINE CONTRAV_DEVICE
 #endif
diff --git a/src/ZSOLVER/gdiv.f90 b/src/ZSOLVER/gdiv.f90
index b82d37e71..d1db7f3ef 100644
--- a/src/ZSOLVER/gdiv.f90
+++ b/src/ZSOLVER/gdiv.f90
@@ -151,10 +151,6 @@ INTEGER :: JI,JJ,JK                         ! loop indexes
 !
 INTEGER :: IIU,IJU,IKU
 !
-#ifdef MNH_OPENACC
-REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZTMP1,ZTMP2
-#endif
-!
 LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH
 !
 !-------------------------------------------------------------------------------
@@ -185,9 +181,6 @@ CALL MNH_MEM_GET( ZWC, IIU, IJU, IKU )
 CALL MNH_MEM_GET( Z1,  IIU, IJU, IKU )
 CALL MNH_MEM_GET( Z2,  IIU, IJU, IKU )
 CALL MNH_MEM_GET( Z3,  IIU, IJU, IKU )
-
-CALL MNH_MEM_GET( ZTMP1, IIU, IJU, IKU )
-CALL MNH_MEM_GET( ZTMP2, IIU, IJU, IKU )
 #endif
 !
 GWEST  = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() )
@@ -219,7 +212,7 @@ GNORTH = ( .NOT. L2D .AND. HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() )
 CALL CONTRAV(HLBCX,HLBCY,PU,PV,PW,PDXX,PDYY,PDZZ,PDZX,PDZY,ZUC,ZVC,ZWC,4)
 #else
 CALL CONTRAV_DEVICE(HLBCX,HLBCY,PU,PV,PW,PDXX,PDYY,PDZZ,PDZX,PDZY,ZUC,ZVC,ZWC,4, &
-     ZTMP1,ZTMP2,ODATA_ON_DEVICE=.TRUE.)
+                    ODATA_ON_DEVICE=.TRUE.)
 #endif
 !
 !-------------------------------------------------------------------------------
-- 
GitLab