From 2c0a736a245752b2bc03869fe4de8be6eca60f73 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 10 Feb 2022 13:23:25 +0100
Subject: [PATCH] Philippe 10/02/2022: OpenACC: use MNH_MEM_GET family calls in
 several subroutines

---
 src/MNH/advection_uvw.f90     | 72 +++++++++++++++++++++--------
 src/MNH/condensation.f90      | 61 +++++++++++++++++--------
 src/MNH/gravity.f90           | 46 ++++++++++++++-----
 src/MNH/gravity_impl.f90      | 49 +++++++++++++-------
 src/MNH/ice_adjust.f90        | 85 ++++++++++++++++++++++++-----------
 src/ZSOLVER/advection_uvw.f90 |  1 +
 6 files changed, 222 insertions(+), 92 deletions(-)

diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90
index 2d08a7842..f9f9048a4 100644
--- a/src/MNH/advection_uvw.f90
+++ b/src/MNH/advection_uvw.f90
@@ -107,6 +107,7 @@ use mode_budget,      only: Budget_store_init, Budget_store_end
 USE MODE_ll
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
+USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 use mode_mppdb
 
@@ -155,32 +156,32 @@ REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRUS_PRES, PRVS_PRES, PRWS_PRES
 !  
 INTEGER             :: IKE       ! indice K End       in z direction
 !
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUT
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVT
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWT
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRUT
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRVT
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRWT
                                                   ! cartesian
                                                   ! components of
                                                   ! momentum
 !
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUCT
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVCT
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWCT
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRUCT
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRVCT
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRWCT
                                                   ! contravariant
                                                   ! components
                                                   ! of momentum
 !
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU, ZV, ZW
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZU, ZV, ZW
 ! Guesses at the end of the sub time step
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS_OTHER
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVS_OTHER
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWS_OTHER
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRUS_OTHER
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRVS_OTHER
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRWS_OTHER
 ! Contribution of the RK time step
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS_ADV
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVS_ADV
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWS_ADV
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMXM_RHODJ
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMYM_RHODJ
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMZM_RHODJ
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRUS_ADV
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRVS_ADV
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRWS_ADV
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZMXM_RHODJ
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZMYM_RHODJ
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZMZM_RHODJ
 !
 ! Momentum tendencies due to advection
 INTEGER :: ISPLIT              ! Number of splitting loops
@@ -226,6 +227,7 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWS,"ADVECTION_UVW beg:PRWS")
 END IF
 
+#ifndef MNH_OPENACC
 ALLOCATE( ZRUT      ( IIU,IJU,IKU ) )
 ALLOCATE( ZRVT      ( IIU,IJU,IKU ) )
 ALLOCATE( ZRWT      ( IIU,IJU,IKU ) )
@@ -244,10 +246,33 @@ ALLOCATE( ZRWS_ADV  ( IIU,IJU,IKU ) )
 ALLOCATE( ZMXM_RHODJ( IIU,IJU,IKU ) )
 ALLOCATE( ZMYM_RHODJ( IIU,IJU,IKU ) )
 ALLOCATE( ZMZM_RHODJ( IIU,IJU,IKU ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ZRUT,       IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRVT,       IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRWT,       IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRUCT,      IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRVCT,      IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRWCT,      IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZU,         IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZV,         IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZW,         IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRUS_OTHER, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRVS_OTHER, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRWS_OTHER, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRUS_ADV,   IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRVS_ADV,   IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZRWS_ADV,   IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZMXM_RHODJ, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZMYM_RHODJ, IIU, IJU, IKU )
+CALL MNH_MEM_GET( ZMZM_RHODJ, IIU, IJU, IKU )
+#endif
 
-!$acc data create( zrut, zrvt, zrwt, zruct, zrvct, zrwct, zu, zv, zw,                &
-!$acc &            zrus_other, zrvs_other, zrws_other, zrus_adv, zrvs_adv, zrws_adv, &
-!$acc &            zmxm_rhodj, zmym_rhodj, zmzm_rhodj  )
+!$acc data present( zrut, zrvt, zrwt, zruct, zrvct, zrwct, zu, zv, zw,                &
+!$acc &             zrus_other, zrvs_other, zrws_other, zrus_adv, zrvs_adv, zrws_adv, &
+!$acc &             zmxm_rhodj, zmym_rhodj, zmzm_rhodj  )
 
 IKE = SIZE(PWT,3) - JPVEXT
 !
@@ -466,6 +491,15 @@ END IF
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+DEALLOCATE(zrut, zrvt, zrwt, zruct, zrvct, zrwct, zu, zv, zw,                &
+           zrus_other, zrvs_other, zrws_other, zrus_adv, zrvs_adv, zrws_adv, &
+           zmxm_rhodj, zmym_rhodj, zmzm_rhodj )
+#else
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
+
 !$acc end data
 
 END SUBROUTINE ADVECTION_UVW
diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90
index 771779ed4..150598e52 100644
--- a/src/MNH/condensation.f90
+++ b/src/MNH/condensation.f90
@@ -136,6 +136,9 @@ USE MODD_CST
 USE MODD_PARAMETERS
 USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI
 !
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,      ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
+#endif
 USE MODE_MPPDB
 use mode_msg
 !
@@ -196,15 +199,15 @@ REAL, INTENT(IN)                            :: PSIGQSAT ! use an extra "qsat" va
 !*       0.2   Declarations of local variables :
 !
 INTEGER  :: JI, JJ, JK, JKP, JKM, IKTB, IKTE    ! loop index
-REAL,    DIMENSION(:,:,:), allocatable :: ZTLK, ZRT       ! work arrays for T_l and total water mixing ratio
-REAL,    DIMENSION(:,:,:), allocatable :: ZL              ! length scale
-REAL,    DIMENSION(:,:,:), allocatable :: ZFRAC           ! Ice fraction
-REAL                                   :: ZCRIAUTI        !
-INTEGER, DIMENSION(:,:),   allocatable :: ITPL            ! top levels of troposphere
-REAL,    DIMENSION(:,:),   allocatable :: ZTMIN           ! minimum Temp. related to ITPL
-!
-REAL,    DIMENSION(:,:,:), allocatable :: ZLV, ZLS, ZCPD
-REAL                                   :: ZCOND
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZTLK, ZRT       ! work arrays for T_l and total water mixing ratio
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZL              ! length scale
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFRAC           ! Ice fraction
+REAL                                           :: ZCRIAUTI        !
+INTEGER, DIMENSION(:,:),   POINTER, CONTIGUOUS :: ITPL            ! top levels of troposphere
+REAL,    DIMENSION(:,:),   POINTER, CONTIGUOUS :: ZTMIN           ! minimum Temp. related to ITPL
+!
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZLV, ZLS, ZCPD
+REAL                                           :: ZCOND
 REAL :: ZGCOND, ZSBAR, ZSBARC, ZQ1, ZAUTC, ZAUTI, ZGAUV, ZGAUC, ZGAUI, ZGAUTC, ZGAUTI   ! Used for integration in Gaussian Probability Density Function
 REAL :: ZTEMP, ZPV, ZQSL, ZPIV, ZQSI, ZLVS ! thermodynamics
 REAL :: ZLL, DZZ, ZZZ                           ! used for length scales
@@ -213,7 +216,7 @@ REAL :: ZRCOLD, ZRIOLD
 INTEGER  :: INQ1
 REAL :: ZINC
 LOGICAL :: GPRESENT_PLV, GPRESENT_PLS, GPRESENT_PCPH
-LOGICAL, DIMENSION(:,:,:), allocatable :: GWORK
+LOGICAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: GWORK
 CHARACTER(LEN=4) :: YLAMBDA3 !Necessary to workaround NVHPC bug (version 21.7 if OpenACC enabled)
 !
 !*       0.3  Definition of constants :
@@ -238,8 +241,6 @@ REAL, DIMENSION(-22:11),PARAMETER :: ZSRC_1D =(/                         &
 !
 !-------------------------------------------------------------------------------
 !
-!$acc data present(PPABS, PZZ, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC)
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK3D(PPABS,"CONDENSATION beg:PPABS",PRECISION)
@@ -263,6 +264,7 @@ YLAMBDA3 = HLAMBDA3
 IF( YLAMBDA3 /='CB' .AND. YLAMBDA3 /='NONE' ) &
   call Print_msg( NVERB_FATAL, 'GEN', 'CONDENSATION', 'invalid value for YLAMBDA3: ' // TRIM( YLAMBDA3 ) )
 
+#ifndef MNH_OPENACC
 allocate( ztlk (kiu, kju, kku ) )
 allocate( zrt  (kiu, kju, kku ) )
 allocate( zl   (kiu, kju, kku ) )
@@ -275,8 +277,26 @@ allocate( zlv  (kiu, kju, kku ) )
 allocate( zls  (kiu, kju, kku ) )
 allocate( zcpd (kiu, kju, kku ) )
 allocate( gwork(kiu, kju, kku ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( ztlk,  kiu, kju, kku )
+CALL MNH_MEM_GET( zrt,   kiu, kju, kku )
+CALL MNH_MEM_GET( zl,    kiu, kju, kku )
+CALL MNH_MEM_GET( zfrac, kiu, kju, kku )
 
-!$acc data create( ztlk, zrt, zl, zfrac, itpl, ztmin, zlv, zls,zcpd, gwork )
+CALL MNH_MEM_GET( itpl,  kiu, kju )
+CALL MNH_MEM_GET( ztmin, kiu, kju )
+
+CALL MNH_MEM_GET( zlv,   kiu, kju, kku )
+CALL MNH_MEM_GET( zls,   kiu, kju, kku )
+CALL MNH_MEM_GET( zcpd,  kiu, kju, kku )
+CALL MNH_MEM_GET( gwork, kiu, kju, kku )
+
+!$acc data present( PPABS, PZZ, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, &
+!$acc &             ztlk, zrt, zl, zfrac, itpl, ztmin, zlv, zls,zcpd, gwork )
+#endif
 
 IKTB=1+JPVEXT
 IKTE=KKU-JPVEXT
@@ -612,7 +632,16 @@ DO JK=IKTB,IKTE
 !acc end kernels
 END DO
 !$acc end kernels
-!
+
+!$acc end data
+
+#ifndef MNH_OPENACC
+deallocate( ztlk, zrt, zl, zfrac, itpl, ztmin, zlv, zls,zcpd, gwork )
+#else
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK3D(PT,"CONDENSATION end:PT",PRECISION)
@@ -624,8 +653,4 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK3D(PSIGRC,"CONDENSATION end:PSIGRC",PRECISION)
 END IF
 
-!$acc end data
-
-!$acc end data
-
 END SUBROUTINE CONDENSATION
diff --git a/src/MNH/gravity.f90 b/src/MNH/gravity.f90
index da511c0da..66e3bdb79 100644
--- a/src/MNH/gravity.f90
+++ b/src/MNH/gravity.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.
@@ -109,6 +109,9 @@ USE MODD_CONF
 USE MODD_CST
 USE MODD_DYN_n, ONLY : LOCEAN
 
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
+#endif
 use mode_mppdb
 
 USE MODI_GET_HALO
@@ -137,15 +140,15 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRWS      ! Sources of Momentum
 !
 !*       0.2   Declarations of local variables :
 !
+CHARACTER(LEN=3) :: YNUM
+INTEGER          :: IIU, IJU, IKU ! dimensions of dummy arrays
 REAL       ::  ZRV_OV_RD    ! = RV / RD
 INTEGER    ::  JWATER       ! loop index on the different types of water
-REAL, DIMENSION(:,:,:), allocatable :: ZWORK1, ZWORK2
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZWORK1, ZWORK2
 !
 !
 !-------------------------------------------------------------------------------
 
-!$acc data present(PTHT, PRT, PRHODJ, PTHVREF, PRWS)
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK(PRHODJ,   "GRAVITY beg:PRHODJ")
@@ -155,10 +158,24 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRT,      "GRAVITY beg:PRT")
 END IF
 
-allocate( zwork1(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zwork2(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+IIU = SIZE( ptht, 1 )
+IJU = SIZE( ptht, 2 )
+IKU = SIZE( ptht, 3 )
+
+#ifndef MNH_OPENACC
+allocate( zwork1(IIU, IJU, IKU ) )
+allocate( zwork2(IIU, IJU, IKU ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( zwork1, IIU, IJU, IKU )
+CALL MNH_MEM_GET( zwork2, IIU, IJU, IKU )
+#endif
+
 
-!$acc data create( zwork1, zwork2 )
+!$acc data present( PTHT, PRT, PRHODJ, PTHVREF, PRWS, &
+!$acc &             zwork1, zwork2 )
 !
 !*       1.     COMPUTES THE GRAVITY TERM
 !	        -------------------------
@@ -242,7 +259,16 @@ ELSE
 !
   END IF
 END IF
-!
+
+!$acc end data
+
+#ifndef MNH_OPENACC
+deallocate( zwork1, zwork2 )
+#else
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PTHT,     "GRAVITY end:PTHT")
@@ -251,10 +277,6 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRWS,     "GRAVITY end:PRWS")
 END IF
 
-!$acc end data
-
-!$acc end data
-
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE GRAVITY 
diff --git a/src/MNH/gravity_impl.f90 b/src/MNH/gravity_impl.f90
index 3b6366dda..a5f7acadc 100644
--- a/src/MNH/gravity_impl.f90
+++ b/src/MNH/gravity_impl.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2011-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2011-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.
@@ -82,6 +82,9 @@ use modd_budget,         only: lbudget_w, NBUDGET_W, tbudgets
 
 use mode_budget,         only: Budget_store_init, Budget_store_end
 use mode_mppdb
+#ifdef MNH_OPENACC
+use mode_mnh_zwork,      only: Mnh_mem_get, Mnh_mem_position_pin, Mnh_mem_release
+#endif
 
 use modi_adv_boundaries
 use modi_gravity
@@ -119,21 +122,19 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRRS_CLD
 !
 !  
 ! Tendencies of W due to gravity
-REAL, DIMENSION(:,:,:),   allocatable :: ZRWS_GRAV
+REAL, DIMENSION(:,:,:),   POINTER, CONTIGUOUS :: ZRWS_GRAV
 ! Guess of future theta
-REAL, DIMENSION(:,:,:),   allocatable :: ZTH
+REAL, DIMENSION(:,:,:),   POINTER, CONTIGUOUS :: ZTH
 ! Guess of future mixing ratios
-REAL, DIMENSION(:,:,:,:), allocatable :: ZR
+REAL, DIMENSION(:,:,:,:), POINTER, CONTIGUOUS :: ZR
 !
 INTEGER :: JR
 !
 INTEGER  :: JI,JJ,JK
-INTEGER  :: JIU,JJU,JKU
+INTEGER  :: JIU, JJU, JKU, JRU
 !
 !-------------------------------------------------------------------------------
 
-!$acc data present( PTHT, PRHODJ, PRT, PTHVREF, PRWS, PRTHS, PRRS, PRTHS_CLD, PRRS_CLD )
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK(PTHT,     "GRAVITY_IMPL beg:PTHT")
@@ -151,12 +152,23 @@ END IF
 JIU =  size(ptht, 1 )
 JJU =  size(ptht, 2 )
 JKU =  size(ptht, 3 )
+JRU =  size( prt, 4 )
 
-allocate( zrws_grav( size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zth      ( size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zr       ( size( prt,  1 ), size( prt,  2 ), size( prt,  3 ), size( prt, 4 ) ) )
+#ifndef MNH_OPENACC
+allocate( zrws_grav(JIU, JJU, JKU ) )
+allocate( zth      (JIU, JJU, JKU ) )
+allocate( zr       (JIU, JJU, JKU, JRU ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
 
-!$acc data create( zrws_grav, zth, zr )
+CALL MNH_MEM_GET( zrws_grav, JIU, JJU, JKU )
+CALL MNH_MEM_GET( zth,       JIU, JJU, JKU )
+CALL MNH_MEM_GET( zr,        JIU, JJU, JKU, JRU )
+#endif
+
+!$acc data present( PTHT, PRHODJ, PRT, PTHVREF, PRWS, PRTHS, PRRS, PRTHS_CLD, PRRS_CLD, &
+!$acc &             zrws_grav, zth, zr )
 
 if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'GRAV', prws(:, :, :) )
 
@@ -195,16 +207,21 @@ if ( lbudget_w ) then
 !$acc update self(PRWS)
   call Budget_store_end( tbudgets(NBUDGET_W), 'GRAV', prws(:, :, :) )
 end if
-!
+
+!$acc end data
+
+#ifndef MNH_OPENACC
+DEALLOCATE( zrws_grav, zth, zr )
+#else
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
+
 IF (MPPDB_INITIALIZED) THEN
   !Check all INOUT arrays
   CALL MPPDB_CHECK(PRWS,"GRAVITY_IMPL end:PRWS")
 END IF
 
-!$acc end data
-
-!$acc end data
-
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE GRAVITY_IMPL
diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90
index 931a76fdb..58580edaa 100644
--- a/src/MNH/ice_adjust.f90
+++ b/src/MNH/ice_adjust.f90
@@ -190,6 +190,9 @@ USE MODD_PARAMETERS
 USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI
 
 use mode_budget,       only: Budget_store_init, Budget_store_end
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,    ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
+#endif
 USE MODE_MPPDB
 #ifdef MNH_OPENACC
 use mode_msg
@@ -277,10 +280,10 @@ INTEGER             :: IKE        ! K index value of the last inner mass point
 INTEGER             :: JITER,ITERMAX ! iterative loop for first order adjustment
 INTEGER             :: JI,JJ,JK
 !
-LOGICAL,DIMENSION(:,:,:), allocatable :: GTEMP
+LOGICAL,DIMENSION(:,:,:), POINTER, CONTIGUOUS :: GTEMP
 !
-REAL, DIMENSION(:,:,:), allocatable :: ZSIGS,ZSRCS
-REAL, DIMENSION(:,:,:), allocatable &
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZSIGS,ZSRCS
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS &
                          :: ZT,   &  ! adjusted temperature
                    ZRV, ZRC, ZRI, &  ! adjusted state
                             ZCPH, &  ! guess of the CPh for the mixing
@@ -336,35 +339,56 @@ CALL MPPDB_CHECK3D(PRCS,"ICE_ADJUST beg:PRCS",PRECISION)
 CALL MPPDB_CHECK3D(PTHS,"ICE_ADJUST beg:PTHS",PRECISION)
 CALL MPPDB_CHECK3D(PRIS,"ICE_ADJUST beg:PRIS",PRECISION)
 
-allocate( gtemp  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zsigs  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zsrcs  (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zt     (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zrv    (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zrc    (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zri    (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zcph   (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zlv    (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zls    (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zw1    (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zw2    (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zcriaut(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zhcf   (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-allocate( zhr    (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
-
-!$acc data create( gtemp, zsigs, zsrcs, zt, zrv, zrc, zri, zcph, zlv, zls, zw1, zw2, zcriaut, zhcf, zhr )
-
-if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), trim( hbuname ), pths(:, :, :) * prhodj(:, :, :) )
-if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), trim( hbuname ), prvs(:, :, :) * prhodj(:, :, :) )
-if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), trim( hbuname ), prcs(:, :, :) * prhodj(:, :, :) )
-if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), trim( hbuname ), pris(:, :, :) * prhodj(:, :, :) )
-
 IIU = SIZE(PEXNREF,1)
 IJU = SIZE(PEXNREF,2)
 IKU = SIZE(PEXNREF,3)
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IKB=KKA+JPVEXT*KKL
 IKE=KKU-JPVEXT*KKL
+
+#ifndef MNH_OPENACC
+allocate( gtemp  (IIU, IJU, IKU ) )
+allocate( zsigs  (IIU, IJU, IKU ) )
+allocate( zsrcs  (IIU, IJU, IKU ) )
+allocate( zt     (IIU, IJU, IKU ) )
+allocate( zrv    (IIU, IJU, IKU ) )
+allocate( zrc    (IIU, IJU, IKU ) )
+allocate( zri    (IIU, IJU, IKU ) )
+allocate( zcph   (IIU, IJU, IKU ) )
+allocate( zlv    (IIU, IJU, IKU ) )
+allocate( zls    (IIU, IJU, IKU ) )
+allocate( zw1    (IIU, IJU, IKU ) )
+allocate( zw2    (IIU, IJU, IKU ) )
+allocate( zcriaut(IIU, IJU, IKU ) )
+allocate( zhcf   (IIU, IJU, IKU ) )
+allocate( zhr    (IIU, IJU, IKU ) )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+
+CALL MNH_MEM_GET( gtemp  , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zsigs  , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zsrcs  , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zt     , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zrv    , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zrc    , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zri    , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zcph   , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zlv    , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zls    , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zw1    , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zw2    , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zcriaut, IIU, IJU, IKU )
+CALL MNH_MEM_GET( zhcf   , IIU, IJU, IKU )
+CALL MNH_MEM_GET( zhr    , IIU, IJU, IKU )
+
+!$acc data present( gtemp, zsigs, zsrcs, zt, zrv, zrc, zri, zcph, zlv, zls, zw1, zw2, zcriaut, zhcf, zhr )
+#endif
+
+if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), trim( hbuname ), pths(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), trim( hbuname ), prvs(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), trim( hbuname ), prcs(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), trim( hbuname ), pris(:, :, :) * prhodj(:, :, :) )
 !
 ITERMAX=1
 !
@@ -620,6 +644,14 @@ if ( lbudget_ri ) then
   call Budget_store_end( tbudgets(NBUDGET_RI), trim( hbuname ), pris(:, :, :) * prhodj(:, :, :) )
 end if
 
+!$acc end data
+
+#ifndef MNH_OPENACC
+deallocate( gtemp, zsigs, zsrcs, zt, zrv, zrc, zri, zcph, zlv, zls, zw1, zw2, zcriaut, zhcf, zhr )
+#else
+!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN
+CALL MNH_MEM_RELEASE()
+#endif
 !------------------------------------------------------------------------------
 !
 !Check all INOUT arrays
@@ -638,7 +670,6 @@ IF (PRESENT(PHLC_HRC)) CALL MPPDB_CHECK3D(PHLC_HRC,"ICE_ADJUST end:PHLC_HRC")
 IF (PRESENT(PHLC_HCF)) CALL MPPDB_CHECK3D(PHLC_HCF,"ICE_ADJUST end:PHLC_HCF")
 IF (PRESENT(PHLI_HRI)) CALL MPPDB_CHECK3D(PHLI_HRI,"ICE_ADJUST end:PHLI_HRI")
 IF (PRESENT(PHLI_HCF)) CALL MPPDB_CHECK3D(PHLI_HCF,"ICE_ADJUST end:PHLI_HCF")
-!$acc end data
 
 !$acc end data
 
diff --git a/src/ZSOLVER/advection_uvw.f90 b/src/ZSOLVER/advection_uvw.f90
index b731655b2..9660d8993 100644
--- a/src/ZSOLVER/advection_uvw.f90
+++ b/src/ZSOLVER/advection_uvw.f90
@@ -108,6 +108,7 @@ use mode_budget,      only: Budget_store_init, Budget_store_end
 USE MODE_ll
 #ifdef MNH_OPENACC
 USE MODE_DEVICE
+USE MODE_MNH_ZWORK,   ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE
 #endif
 use mode_mppdb
 
-- 
GitLab