From 3f5363599fff283df3b7836a1c287e241a974cf9 Mon Sep 17 00:00:00 2001
From: Wautelet Philippe <waup@aeropc45.aero.obs-mip.fr>
Date: Tue, 26 Oct 2021 16:28:08 +0200
Subject: [PATCH] Philippe 26/10/2021: OpenACC: use GT1DFLAT and ZT1DFLAT

---
 src/MNH/ice4_fast_rg.f90             | 102 ++++++++++++++++++++-------
 src/MNH/ice4_fast_rs.f90             | 101 +++++++++++++++++++-------
 src/MNH/ice4_sedimentation_split.f90 |  65 +++++++++++++----
 src/MNH/ice4_tendencies.f90          |  90 +++++++++++++++++++++--
 4 files changed, 284 insertions(+), 74 deletions(-)

diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90
index 94a782ef7..5e04585a9 100644
--- a/src/MNH/ice4_fast_rg.f90
+++ b/src/MNH/ice4_fast_rg.f90
@@ -106,13 +106,16 @@ USE MODD_RAIN_ICE_PARAM, ONLY: NDRYLBDAG,NDRYLBDAR,NDRYLBDAS,X0DEPG,X1DEPG,XCOLE
                                XDRYINTP1R,XDRYINTP1S,XDRYINTP2G,XDRYINTP2R,XDRYINTP2S,XEX0DEPG,XEX1DEPG,XEXICFRR,      &
                                XEXRCFRI,XFCDRYG,XFIDRYG,XFRDRYG,XFSDRYG,XICFRR,XKER_RDRYG,XKER_SDRYG,XLBRDRYG1,        &
                                XLBRDRYG2,XLBRDRYG3,XLBSDRYG1,XLBSDRYG2,XLBSDRYG3,XRCFRI
-!
+
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1DP, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1D
+#endif
+USE MODE_MPPDB
+
 #ifdef MNH_BITREP
 USE MODI_BITREP
 #endif
-!
-USE MODE_MPPDB
-!
+
 IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
@@ -174,14 +177,21 @@ INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRR
 INTEGER                            :: IGDRY
 INTEGER                            :: ISIZE
 INTEGER                            :: IDX, JJ, JL
-INTEGER, DIMENSION(:), allocatable :: I1
-INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2
-LOGICAL, DIMENSION(:), allocatable :: GDRY
-REAL,    DIMENSION(:), allocatable :: ZDRY, ZDRYG, ZMASK
-REAL,    DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3
-REAL,    DIMENSION(:), allocatable :: ZZW,         &
-                                      ZRDRYG_INIT, & !Initial dry growth rate of the graupeln
-                                      ZRWETG_INIT    !Initial wet growth rate of the graupeln
+INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: I1
+INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: IVEC1, IVEC2
+LOGICAL, DIMENSION(:), POINTER, CONTIGUOUS :: GDRY
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS :: ZDRY, ZDRYG, ZMASK
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS :: ZVEC1, ZVEC2, ZVEC3
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS :: ZZW,         &
+                                              ZRDRYG_INIT, & !Initial dry growth rate of the graupeln
+                                              ZRWETG_INIT    !Initial wet growth rate of the graupeln
+#ifdef MNH_OPENACC
+INTEGER                                    :: II1, IIVEC1, IIVEC2
+INTEGER                                    :: IDXGDRY
+INTEGER                                    :: IZDRY, IZDRYG, IZMASK
+INTEGER                                    :: IZVEC1, IZVEC2, IZVEC3
+INTEGER                                    :: IZZW, IZRDRYG_INIT, IZRWETG_INIT
+#endif
 !
 !-------------------------------------------------------------------------------
 !
@@ -232,21 +242,41 @@ END IF
 
 ISIZE = Size( PRHODREF )
 
-allocate( i1         ( size( prhodref ) ) )
-allocate( ivec1      ( size( prhodref ) ) )
-allocate( ivec2      ( size( prhodref ) ) )
-allocate( gdry       ( size( prhodref ) ) )
-allocate( zdry       ( size( prhodref ) ) )
-allocate( zdryg      ( size( prhodref ) ) )
-allocate( zmask      ( size( prhodref ) ) )
-allocate( zvec1      ( size( prhodref ) ) )
-allocate( zvec2      ( size( prhodref ) ) )
-allocate( zvec3      ( size( prhodref ) ) )
-allocate( zzw        ( size( prhodref ) ) )
-allocate( zrdryg_init( size( prhodref ) ) )
-allocate( zrwetg_init( size( prhodref ) ) )
-
-!$acc data create(I1,IVEC1,IVEC2,GDRY, ZDRY, ZDRYG, ZMASK, ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYG_INIT,ZRWETG_INIT)
+#ifndef MNH_OPENACC
+allocate( i1         ( isize ) )
+allocate( ivec1      ( isize ) )
+allocate( ivec2      ( isize ) )
+allocate( gdry       ( isize ) )
+allocate( zdry       ( isize ) )
+allocate( zdryg      ( isize ) )
+allocate( zmask      ( isize ) )
+allocate( zvec1      ( isize ) )
+allocate( zvec2      ( isize ) )
+allocate( zvec3      ( isize ) )
+allocate( zzw        ( isize ) )
+allocate( zrdryg_init( isize ) )
+allocate( zrwetg_init( isize ) )
+#else
+II1    = MNH_ALLOCATE_IT1DP( I1,    ISIZE )
+IIVEC1 = MNH_ALLOCATE_IT1DP( IVEC1, ISIZE )
+IIVEC2 = MNH_ALLOCATE_IT1DP( IVEC2, ISIZE )
+
+IDXGDRY      = MNH_ALLOCATE_FLAT( gdry,        isize )
+
+IZDRY        = MNH_ALLOCATE_FLAT( zdry,        isize )
+IZDRYG       = MNH_ALLOCATE_FLAT( zdryg,       isize )
+IZMASK       = MNH_ALLOCATE_FLAT( zmask,       isize )
+IZVEC1       = MNH_ALLOCATE_FLAT( zvec1,       isize )
+IZVEC2       = MNH_ALLOCATE_FLAT( zvec2,       isize )
+IZVEC3       = MNH_ALLOCATE_FLAT( zvec3,       isize )
+IZZW         = MNH_ALLOCATE_FLAT( zzw,         isize )
+IZRDRYG_INIT = MNH_ALLOCATE_FLAT( zrdryg_init, isize )
+IZRWETG_INIT = MNH_ALLOCATE_FLAT( zrwetg_init, isize )
+#endif
+
+!$acc data create ( IGDRY ) &
+!$acc&     present( I1, IVEC1, IVEC2, GDRY, ZDRY, ZDRYG, ZMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZRDRYG_INIT, ZRWETG_INIT ) &
+!$acc&     copyin ( XRTMIN )
 
 !
 !*       6.1    rain contact freezing
@@ -791,6 +821,24 @@ END IF
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_RELEASE_FLAT( IZRWETG_INIT )
+CALL MNH_RELEASE_FLAT( IZRDRYG_INIT )
+CALL MNH_RELEASE_FLAT( IZZW   )
+CALL MNH_RELEASE_FLAT( IZVEC3 )
+CALL MNH_RELEASE_FLAT( IZVEC2 )
+CALL MNH_RELEASE_FLAT( IZVEC1 )
+CALL MNH_RELEASE_FLAT( IZMASK )
+CALL MNH_RELEASE_FLAT( IZDRYG )
+CALL MNH_RELEASE_FLAT( IZDRY  )
+
+CALL MNH_REL_GT1DFLAT( IDXGDRY )
+
+CALL MNH_REL_IT1D( IIVEC2 )
+CALL MNH_REL_IT1D( IIVEC1 )
+CALL MNH_REL_IT1D( II1    )
+#endif
+
 !$acc end data
 
 END SUBROUTINE ICE4_FAST_RG
diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90
index 6b48adced..7acd05b48 100644
--- a/src/MNH/ice4_fast_rs.f90
+++ b/src/MNH/ice4_fast_rs.f90
@@ -92,12 +92,16 @@ USE MODD_RAIN_ICE_PARAM, ONLY: NACCLBDAR,NACCLBDAS,NGAMINC,X0DEPS,X1DEPS,XACCINT
                                XFSACCRG,XFSCVMG,XGAMINC_RIM1,XGAMINC_RIM2,XGAMINC_RIM4,XKER_RACCS,                    &
                                XKER_RACCSS,XKER_SACCRG,XLBRACCS1,XLBRACCS2,XLBRACCS3,XLBSACCR1,XLBSACCR2,XLBSACCR3,   &
                                XRIMINTP1,XRIMINTP2,XSRIMCG,XSRIMCG2,XSRIMCG3
-!
+
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1DP, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1D
+#endif
+USE MODE_MPPDB
+
 #ifdef MNH_BITREP
 USE MODI_BITREP
 #endif
 !
-USE MODE_MPPDB
 !
 IMPLICIT NONE
 !
@@ -143,13 +147,19 @@ INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5,
 INTEGER                            :: IGRIM, IGACC
 INTEGER                            :: ISIZE
 INTEGER                            :: IDX, JJ, JL
-INTEGER, DIMENSION(:), allocatable :: I1
-INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2
-LOGICAL, DIMENSION(:), allocatable :: GRIM, GACC
-REAL,    DIMENSION(:), allocatable :: ZRIM, ZACC, ZMASK
-REAL,    DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3
-REAL,    DIMENSION(:), allocatable :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE
-! real,    DIMENSION(:), allocatable :: xprov
+INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: I1
+INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: IVEC1, IVEC2
+LOGICAL, DIMENSION(:), POINTER, CONTIGUOUS :: GRIM, GACC
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS :: ZRIM, ZACC, ZMASK
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS :: ZVEC1, ZVEC2, ZVEC3
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE
+#ifdef MNH_OPENACC
+INTEGER                                    :: II1, IIVEC1, IIVEC2
+INTEGER                                    :: IDXGRIM, IDXGACC
+INTEGER                                    :: IZRIM, IZACC, IZMASK
+INTEGER                                    :: IZVEC1, IZVEC2, IZVEC3
+INTEGER                                    :: IZZW, IZZW2, IZZW6, IZFREEZ_RATE
+#endif
 
 !$acc data present( PCOMPUTE, PRHODREF, PLVFACT, PLSFACT, PPRES, PDV, PKA, PCJ,                        &
 !$acc&              PLBDAR, PLBDAS, PT, PRVT, PRCT, PRRT, PRST, PRIAGGS, PRCRIMSS, PRCRIMSG, PRSRIMCG, &
@@ -190,23 +200,44 @@ END IF
 
 ISIZE = Size( PRHODREF )
 
-allocate( i1          ( size( prhodref ) ) )
-allocate( ivec1       ( size( prhodref ) ) )
-allocate( ivec2       ( size( prhodref ) ) )
-allocate( grim        ( size( prhodref ) ) )
-allocate( gacc        ( size( prhodref ) ) )
-allocate( zrim        ( size( prhodref ) ) )
-allocate( zacc        ( size( prhodref ) ) )
-allocate( zmask       ( size( prhodref ) ) )
-allocate( zvec1       ( size( prhodref ) ) )
-allocate( zvec2       ( size( prhodref ) ) )
-allocate( zvec3       ( size( prhodref ) ) )
-allocate( zzw         ( size( prhodref ) ) )
-allocate( zzw2        ( size( prhodref ) ) )
-allocate( zzw6        ( size( prhodref ) ) )
-allocate( zfreez_rate ( size( prhodref ) ) )
+#ifndef MNH_OPENACC
+allocate( i1          ( isize ) )
+allocate( ivec1       ( isize ) )
+allocate( ivec2       ( isize ) )
+allocate( grim        ( isize ) )
+allocate( gacc        ( isize ) )
+allocate( zrim        ( isize ) )
+allocate( zacc        ( isize ) )
+allocate( zmask       ( isize ) )
+allocate( zvec1       ( isize ) )
+allocate( zvec2       ( isize ) )
+allocate( zvec3       ( isize ) )
+allocate( zzw         ( isize ) )
+allocate( zzw2        ( isize ) )
+allocate( zzw6        ( isize ) )
+allocate( zfreez_rate ( isize ) )
+#else
+II1    = MNH_ALLOCATE_IT1DP( I1,    ISIZE )
+IIVEC1 = MNH_ALLOCATE_IT1DP( IVEC1, ISIZE )
+IIVEC2 = MNH_ALLOCATE_IT1DP( IVEC2, ISIZE )
+
+IDXGRIM = MNH_ALLOCATE_FLAT( grim, ISIZE )
+IDXGACC = MNH_ALLOCATE_FLAT( gacc, ISIZE )
+
+IZRIM        = MNH_ALLOCATE_FLAT( zrim,        ISIZE )
+IZACC        = MNH_ALLOCATE_FLAT( zacc,        ISIZE )
+IZMASK       = MNH_ALLOCATE_FLAT( zmask,       ISIZE )
+IZVEC1       = MNH_ALLOCATE_FLAT( zvec1,       ISIZE )
+IZVEC2       = MNH_ALLOCATE_FLAT( zvec2,       ISIZE )
+IZVEC3       = MNH_ALLOCATE_FLAT( zvec3,       ISIZE )
+IZZW         = MNH_ALLOCATE_FLAT( zzw,         ISIZE )
+IZZW2        = MNH_ALLOCATE_FLAT( zzw2,        ISIZE )
+IZZW6        = MNH_ALLOCATE_FLAT( zzw6,        ISIZE )
+IZFREEZ_RATE = MNH_ALLOCATE_FLAT( zfreez_rate, ISIZE )
+#endif
 !
-!$acc data create( I1, IVEC1, IVEC2, GRIM, GACC, ZRIM, ZACC, ZMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZZW2, ZZW6, ZFREEZ_RATE )
+!$acc data present( I1, IVEC1, IVEC2, GRIM, GACC, ZRIM, ZACC, ZMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZZW2, ZZW6, ZFREEZ_RATE ) &
+!$acc&     copyin ( XRTMIN )
 
 !
 !*       5.0    maximum freezing rate
@@ -693,6 +724,26 @@ END IF
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_RELEASE_FLAT( IZFREEZ_RATE )
+CALL MNH_RELEASE_FLAT( IZZW6        )
+CALL MNH_RELEASE_FLAT( IZZW2        )
+CALL MNH_RELEASE_FLAT( IZZW         )
+CALL MNH_RELEASE_FLAT( IZVEC3       )
+CALL MNH_RELEASE_FLAT( IZVEC2       )
+CALL MNH_RELEASE_FLAT( IZVEC1       )
+CALL MNH_RELEASE_FLAT( IZMASK       )
+CALL MNH_RELEASE_FLAT( IZACC        )
+CALL MNH_RELEASE_FLAT( IZRIM        )
+
+CALL MNH_REL_GT1DFLAT( IDXGACC )
+CALL MNH_REL_GT1DFLAT( IDXGRIM )
+
+CALL MNH_REL_IT1D( IIVEC2 )
+CALL MNH_REL_IT1D( IIVEC1 )
+CALL MNH_REL_IT1D( II1    )
+#endif
+
 !$acc end data
 
 END SUBROUTINE ICE4_FAST_RS
diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90
index dba66e7db..8eb745cb7 100644
--- a/src/MNH/ice4_sedimentation_split.f90
+++ b/src/MNH/ice4_sedimentation_split.f90
@@ -401,7 +401,16 @@ SUBROUTINE INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT,KKB,KKTB,KKTE,KKT,KKL,KRR
 USE MODD_CST,            ONLY: XCPD,XP00,XRD
 USE MODD_RAIN_ICE_DESCR, ONLY: XCC,XCEXVT,XDC,XLBEXC,XRTMIN
 USE MODD_RAIN_ICE_PARAM, ONLY: XEXCSEDI,XEXSEDG,XEXSEDH,XEXSEDR,XEXSEDS,XFSEDG,XFSEDH,XFSEDI,XFSEDR,XFSEDS
-!
+
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1D, MNH_ALLOCATE_ZT1D, &
+                               MNH_ALLOCATE_ZT2D, MNH_ALLOCATE_ZT3DP, &
+                               MNH_RELEASE_FLAT, MNH_REL_IT1D, MNH_REL_ZT1D, MNH_REL_ZT3D
+
+#endif
+use mode_mppdb
+use mode_msg
+
 #ifdef MNH_BITREP
 USE MODI_BITREP
 #endif
@@ -428,19 +437,23 @@ REAL, DIMENSION(:,:,:,:),     INTENT(INOUT), OPTIONAL :: PFPR    ! upper-air pre
 !
 !*       0.2  declaration of local variables
 !
-character(len=10)                      :: yspe ! String for error message
-INTEGER                                :: IDX, ISEDIM
-INTEGER                                :: JI, JJ, JK, JL
-INTEGER, DIMENSION(:),     allocatable :: I1,I2,I3 ! Used to replace the COUNT
-LOGICAL                                :: GPRESENT_PFPR
-REAL                                   :: ZINVTSTEP
-REAL                                   :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC
-REAL                                   :: ZFSED, ZEXSED
-REAL,    DIMENSION(:,:),   allocatable :: ZMRCHANGE
-REAL,    DIMENSION(:,:),   allocatable :: ZMAX_TSTEP ! Maximum CFL in column
-REAL,    DIMENSION(:),     allocatable :: ZRSMIN
-REAL,    DIMENSION(:,:),   allocatable :: ZREMAINT                   ! Remaining time until the timestep end
-REAL,    DIMENSION(:,:,:), allocatable :: ZWSED ! Sedimentation fluxes
+character(len=10)                              :: yspe ! String for error message
+INTEGER                                        :: IDX, ISEDIM
+INTEGER                                        :: JI, JJ, JK, JL
+#ifdef MNH_OPENACC
+INTEGER                                        :: II1, II2, II3
+INTEGER                                        :: IZMRCHANGE, IZMAX_TSTEP, IZRSMIN, IZREMAINT, IZWSED
+#endif
+INTEGER, DIMENSION(:),     POINTER, CONTIGUOUS :: I1, I2, I3 ! Used to replace the COUNT
+LOGICAL                                        :: GPRESENT_PFPR
+REAL                                           :: ZINVTSTEP
+REAL                                           :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC
+REAL                                           :: ZFSED, ZEXSED
+REAL,    DIMENSION(:,:),   POINTER, CONTIGUOUS :: ZMRCHANGE
+REAL,    DIMENSION(:,:),   POINTER, CONTIGUOUS :: ZMAX_TSTEP ! Maximum CFL in column
+REAL,    DIMENSION(:),     POINTER, CONTIGUOUS :: ZRSMIN
+REAL,    DIMENSION(:,:),   POINTER, CONTIGUOUS :: ZREMAINT                   ! Remaining time until the timestep end
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZWSED ! Sedimentation fluxes
 
 !$acc data present(PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PRXT,PRXS,PINPRX,PPRXS, &
 !$acc&             PRAY,PLBC,PFSEDC,PCONC3D,PFPR)
@@ -463,6 +476,7 @@ IF (MPPDB_INITIALIZED) THEN
   IF (PRESENT(PFPR))    CALL MPPDB_CHECK(PFPR,"INTERNAL_SEDIM_SPLI beg:PFPR")
 END IF
 
+#ifndef MNH_OPENACC
 allocate( i1(kit * kjt * kkt ) )
 allocate( i2(kit * kjt * kkt ) )
 allocate( i3(kit * kjt * kkt ) )
@@ -475,8 +489,22 @@ allocate( zrsmin(size( xrtmin ) ) )
 allocate( zremaint(size( prhodref, 1 ), size( prhodref, 2 ) ) )
 
 allocate( zwsed(size( prhodref, 1 ), size( prhodref, 2 ), 0 : size( prhodref, 3 ) + 1 ) )
+#else
+II1 = MNH_ALLOCATE_IT1D( i1, kit * kjt * kkt )
+II2 = MNH_ALLOCATE_IT1D( i2, kit * kjt * kkt )
+II3 = MNH_ALLOCATE_IT1D( i3, kit * kjt * kkt )
 
-!$acc data create( i1, i2, i3, zmrchange, zmax_tstep, zrsmin, zremaint, zwsed )
+IZMRCHANGE  = MNH_ALLOCATE_ZT2D( zmrchange,  kit, kjt )
+IZMAX_TSTEP = MNH_ALLOCATE_ZT2D( zmax_tstep, kit, kjt )
+
+IZRSMIN = MNH_ALLOCATE_FLAT( zrsmin, Size( xrtmin ) )
+
+IZREMAINT = MNH_ALLOCATE_ZT2D( zremaint, Size( prhodref, 1 ), Size( prhodref, 2 ) )
+
+IZWSED = MNH_ALLOCATE_FLAT( zwsed, 1, Size( prhodref, 1 ), 1, Size( prhodref, 2 ), 0, Size( prhodref, 3 ) + 1 )
+#endif
+
+!$acc data present( i1, i2, i3, zmrchange, zmax_tstep, zrsmin, zremaint, zwsed )
 
 !
 !-------------------------------------------------------------------------------
@@ -685,6 +713,13 @@ END IF
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_REL_IT1D( ii1, ii2, ii3 )
+CALL MNH_RELEASE_FLAT( IZWSED )
+CALL MNH_RELEASE_FLAT( IZRSMIN )
+CALL MNH_REL_ZT3D( IZMRCHANGE, IZMAX_TSTEP, IZREMAINT )
+#endif
+
 !$acc end data
 
 END SUBROUTINE INTERNAL_SEDIM_SPLI
diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90
index df8e68246..5f2fea0d1 100644
--- a/src/MNH/ice4_tendencies.f90
+++ b/src/MNH/ice4_tendencies.f90
@@ -184,7 +184,11 @@ USE MODD_PARAMETERS,     ONLY: XUNDEF
 USE MODD_PARAM_ICE,      ONLY: CSNOWRIMING
 USE MODD_RAIN_ICE_DESCR, ONLY: XLBDAS_MAX,XLBEXG,XLBEXH,XLBEXR,XLBEXS,XLBG,XLBH,XLBR,XLBS,XRTMIN
 USE MODD_RAIN_ICE_PARAM, ONLY: XSCFAC
-!
+
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK,      ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_ZT3D, MNH_RELEASE_FLAT, MNH_REL_ZT3D
+#endif
+
 USE MODI_ICE4_COMPUTE_PDF
 USE MODI_ICE4_FAST_RG
 USE MODI_ICE4_FAST_RH
@@ -319,16 +323,27 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRAINFR   ! Rain fraction
 !
 INTEGER                            :: IDX,JI,JJ,JK,JL
 INTEGER                            :: ISIZE
-LOGICAL, DIMENSION(:), allocatable :: GLDCOMPUTE
-REAL,    DIMENSION(:), allocatable :: ZWETG ! 1. if graupel growths in wet mode, 0. otherwise
-REAL,    DIMENSION(:), allocatable :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, &
+LOGICAL, DIMENSION(:), POINTER, CONTIGUOUS :: GLDCOMPUTE
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS :: ZWETG ! 1. if graupel growths in wet mode, 0. otherwise
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, &
                                     & ZT, ZTHT, ZRHT, &
                                     & ZZW, &
                                     & ZKA, ZDV, ZAI, ZCJ, &
                                     & ZRF, &
                                     & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, &
                                     & ZRGSI, ZRGSI_MR
-REAL, DIMENSION(:,:,:), allocatable :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D
+REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D
+#ifdef MNH_OPENACC
+INTEGER                             :: IZWETG
+INTEGER                             :: IZRVT, IZRCT, IZRRT, IZRIT, IZRST, IZRGT,       &
+                                       IZT, IZTHT, IZRHT,                              &
+                                       IZZW,                                           &
+                                       IZKA, IZDV, IZAI, IZCJ,                         &
+                                       IZRF,                                           &
+                                       IZLBDAR, IZLBDAS, IZLBDAG, IZLBDAH, IZLBDAR_RF, &
+                                       IZRGSI, IZRGSI_MR
+INTEGER                             :: IZRRT3D, IZRST3D, IZRGT3D, IZRHT3D
+#endif
 !
 !$acc data present(PCOMPUTE,PEXN,PRHODREF,PLVFACT,PLSFACT,K1,K2,K3,PPRES,PCF,PCIT,PT,PTHT,                             &
 !$acc&                PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRHT,PSIGMA_RC,PRVHENI_MR,PRRHONG_MR,PRIMLTC_MR,                   &
@@ -387,6 +402,7 @@ END IF
 
 isize = size( pcompute )
 
+#ifndef MNH_OPENACC
 allocate( gldcompute(isize ) )
 allocate( zwetg    (isize ) )
 allocate( zrvt     (isize ) )
@@ -416,9 +432,42 @@ allocate( zrrt3d(kit, kjt, kkt ) )
 allocate( zrst3d(kit, kjt, kkt ) )
 allocate( zrgt3d(kit, kjt, kkt ) )
 allocate( zrht3d(kit, kjt, kkt ) )
+#else
+allocate( gldcompute(isize ) )
+IZWETG = MNH_ALLOCATE_FLAT( zwetg, isize )
+IZRVT = MNH_ALLOCATE_FLAT( zrvt, isize )
+IZRCT = MNH_ALLOCATE_FLAT( zrct, isize )
+IZRRT = MNH_ALLOCATE_FLAT( zrrt, isize )
+IZRIT = MNH_ALLOCATE_FLAT( zrit, isize )
+IZRST = MNH_ALLOCATE_FLAT( zrst, isize )
+IZRGT = MNH_ALLOCATE_FLAT( zrgt, isize )
+IZT   = MNH_ALLOCATE_FLAT( zt,   isize )
+IZTHT = MNH_ALLOCATE_FLAT( ztht, isize )
+IZRHT = MNH_ALLOCATE_FLAT( zrht, isize )
+IZZW = MNH_ALLOCATE_FLAT( zzw, isize )
+IZKA = MNH_ALLOCATE_FLAT( zka, isize )
+IZDV = MNH_ALLOCATE_FLAT( zdv, isize )
+IZAI = MNH_ALLOCATE_FLAT( zai, isize )
+IZCJ = MNH_ALLOCATE_FLAT( zcj, isize )
+IZRF = MNH_ALLOCATE_FLAT( zrf, isize )
+IZLBDAR = MNH_ALLOCATE_FLAT( zlbdar, isize )
+IZLBDAS = MNH_ALLOCATE_FLAT( zlbdas, isize )
+IZLBDAG = MNH_ALLOCATE_FLAT( zlbdag, isize )
+IZLBDAH = MNH_ALLOCATE_FLAT( zlbdah, isize )
+IZLBDAR_RF = MNH_ALLOCATE_FLAT( zlbdar_rf, isize )
+IZRGSI     = MNH_ALLOCATE_FLAT( zrgsi,     isize )
+IZRGSI_MR  = MNH_ALLOCATE_FLAT( zrgsi_mr,  isize )
+
+IZRRT3D = MNH_ALLOCATE_ZT3D( zrrt3d, kit, kjt, kkt )
+IZRST3D = MNH_ALLOCATE_ZT3D( zrst3d, kit, kjt, kkt )
+IZRGT3D = MNH_ALLOCATE_ZT3D( zrgt3d, kit, kjt, kkt )
+IZRHT3D = MNH_ALLOCATE_ZT3D( zrht3d, kit, kjt, kkt )
+#endif
 
-!$acc data create(GLDCOMPUTE, ZWETG,ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZRHT,ZZW,ZKA,ZDV,ZAI,ZCJ,ZRF,               &
-!$acc&               ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,ZLBDAR_RF,ZRGSI,ZRGSI_MR,ZRRT3D,ZRST3D,ZRGT3D,ZRHT3D)
+!$acc data create( GLDCOMPUTE )  &
+!$acc&     present( ZWETG,ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZRHT,ZZW,ZKA,ZDV,ZAI,ZCJ, &
+!$acc&              ZRF,ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,ZLBDAR_RF,ZRGSI,ZRGSI_MR,  &
+!$acc&              ZRRT3D,ZRST3D,ZRGT3D,ZRHT3D )
 
 !$acc kernels
 PA_TH(:)=0.
@@ -890,6 +939,33 @@ END IF
 
 !$acc end data
 
+#ifdef MNH_OPENACC
+CALL MNH_REL_ZT3D( IZRRT3D, IZRST3D, IZRGT3D, IZRHT3D )
+CALL MNH_RELEASE_FLAT( IZRGSI_MR )
+CALL MNH_RELEASE_FLAT( IZRGSI )
+CALL MNH_RELEASE_FLAT( IZLBDAR_RF )
+CALL MNH_RELEASE_FLAT( IZLBDAH )
+CALL MNH_RELEASE_FLAT( IZLBDAG )
+CALL MNH_RELEASE_FLAT( IZLBDAS )
+CALL MNH_RELEASE_FLAT( IZLBDAR )
+CALL MNH_RELEASE_FLAT( IZRF )
+CALL MNH_RELEASE_FLAT( IZCJ )
+CALL MNH_RELEASE_FLAT( IZAI )
+CALL MNH_RELEASE_FLAT( IZDV )
+CALL MNH_RELEASE_FLAT( IZKA )
+CALL MNH_RELEASE_FLAT( IZZW )
+CALL MNH_RELEASE_FLAT( IZRHT )
+CALL MNH_RELEASE_FLAT( IZTHT )
+CALL MNH_RELEASE_FLAT( IZT )
+CALL MNH_RELEASE_FLAT( IZRGT )
+CALL MNH_RELEASE_FLAT( IZRST )
+CALL MNH_RELEASE_FLAT( IZRIT )
+CALL MNH_RELEASE_FLAT( IZRRT )
+CALL MNH_RELEASE_FLAT( IZRCT )
+CALL MNH_RELEASE_FLAT( IZRVT )
+CALL MNH_RELEASE_FLAT( IZWETG )
+#endif
+
 !$acc end data
 
 END SUBROUTINE ICE4_TENDENCIES
-- 
GitLab