From 3cc6429ca4c8dc6e18f1a0f6e640cb115be02e7f Mon Sep 17 00:00:00 2001
From: Juan ESCOBAR <juan.escobar@aero.obs-mip.fr>
Date: Fri, 4 Nov 2022 18:20:31 +0100
Subject: [PATCH] Juan 04/11/2022:ZSOLVER/rain_ice_red.f90, ATTENTION , for CCE
 > 14.X, temporarely inhibe compilation of rain_ice_red, MORE THEN 30 minutes
 !!!

---
 src/ZSOLVER/rain_ice_red.f90 | 183 ++++++++++++++++++++---------------
 1 file changed, 103 insertions(+), 80 deletions(-)

diff --git a/src/ZSOLVER/rain_ice_red.f90 b/src/ZSOLVER/rain_ice_red.f90
index 0c7cc4017..3aeb5a133 100644
--- a/src/ZSOLVER/rain_ice_red.f90
+++ b/src/ZSOLVER/rain_ice_red.f90
@@ -359,6 +359,11 @@ REAL, DIMENSION(:,:,:), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. source
 REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT)      :: PINPRH! Hail instant precip
 REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT)  :: PFPR ! upper-air precipitation fluxes
 !
+#ifdef MNH_COMPILER_CCE
+STOP "RAIN_ICE_RED TROP LENT A COMPILER AVEC CRAY/CCE >> 30 Minutes "
+STOP "ENLEVE LE ifdefMNH_COMPILER_CCE , SI VOUS EN AVEZ BESOIN sur GPU AMD "
+#else
+!
 !*       0.2   Declarations of local variables :
 !
 INTEGER :: IIB           !  Define the domain where is
@@ -734,9 +739,9 @@ END IF
 imicro = count(odmicro)
 !$acc end kernels
 
-JIU =  size(ptht, 1 )
-JJU =  size(ptht, 2 )
-JKU =  size(ptht, 3 )
+JIU = SIZE( ptht, 1 )
+JJU = SIZE( ptht, 2 )
+JKU = SIZE( ptht, 3 )
 
 #ifndef MNH_OPENACC
 allocate( i1(imicro ) )
@@ -746,22 +751,22 @@ allocate( i3(imicro ) )
 allocate( zw(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
 allocate( zt(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) )
 
-allocate( zz_rvheni_mr(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zz_rvheni   (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zz_lvfact   (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zz_lsfact   (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zlsfact3d   (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( zz_rvheni_mr(jiu, jju, jku ) )
+allocate( zz_rvheni   (jiu, jju, jku ) )
+allocate( zz_lvfact   (jiu, jju, jku ) )
+allocate( zz_lsfact   (jiu, jju, jku ) )
+allocate( zlsfact3d   (jiu, jju, jku ) )
 
-allocate( ZHLC_HCF3D(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( ZHLC_LCF3D(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( ZHLC_HRC3D(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( ZHLC_LRC3D(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( ZHLI_HCF3D(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( ZHLI_LCF3D(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( ZHLI_HRI3D(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( ZHLI_LRI3D(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
+allocate( ZHLC_HCF3D(jiu, jju, jku ) )
+allocate( ZHLC_LCF3D(jiu, jju, jku ) )
+allocate( ZHLC_HRC3D(jiu, jju, jku ) )
+allocate( ZHLC_LRC3D(jiu, jju, jku ) )
+allocate( ZHLI_HCF3D(jiu, jju, jku ) )
+allocate( ZHLI_LCF3D(jiu, jju, jku ) )
+allocate( ZHLI_HRI3D(jiu, jju, jku ) )
+allocate( ZHLI_LRI3D(jiu, jju, jku ) )
 
-allocate( zinpri(size( ptht, 1 ), size( ptht, 2 ) ) )
+allocate( zinpri(jiu, jju ) )
 
 allocate( zrvt     (imicro ) )
 allocate( zrct     (imicro ) )
@@ -934,15 +939,14 @@ allocate( zrh_tend(imicro, 10 ) )
 
 allocate( zssi(imicro ) )
 
-allocate( zw_rvs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zw_rcs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zw_rrs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zw_ris(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zw_rss(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zw_rgs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zw_rhs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-allocate( zw_ths(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) )
-
+allocate( zw_rvs(jiu, jju, jku ) )
+allocate( zw_rcs(jiu, jju, jku ) )
+allocate( zw_rrs(jiu, jju, jku ) )
+allocate( zw_ris(jiu, jju, jku ) )
+allocate( zw_rss(jiu, jju, jku ) )
+allocate( zw_rgs(jiu, jju, jku ) )
+allocate( zw_rhs(jiu, jju, jku ) )
+allocate( zw_ths(jiu, jju, jku ) )
 allocate( ZTEMP_BUD(JIU,JJU,JKU) )
 #else
 !Pin positions in the pools of MNH memory
@@ -955,22 +959,22 @@ CALL MNH_MEM_GET( i3, imicro )
 CALL MNH_MEM_GET( zw, size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) )
 CALL MNH_MEM_GET( zt, size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) )
 
-CALL MNH_MEM_GET( zz_rvheni_mr, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zz_rvheni,    size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zz_lvfact,    size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zz_lsfact,    size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zlsfact3d,    size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
+CALL MNH_MEM_GET( zz_rvheni_mr, jiu, jju, jku )
+CALL MNH_MEM_GET( zz_rvheni,    jiu, jju, jku )
+CALL MNH_MEM_GET( zz_lvfact,    jiu, jju, jku )
+CALL MNH_MEM_GET( zz_lsfact,    jiu, jju, jku )
+CALL MNH_MEM_GET( zlsfact3d,    jiu, jju, jku )
 
-CALL MNH_MEM_GET( ZHLC_HCF3D, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( ZHLC_LCF3D, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( ZHLC_HRC3D, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( ZHLC_LRC3D, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( ZHLI_HCF3D, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( ZHLI_LCF3D, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( ZHLI_HRI3D, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( ZHLI_LRI3D, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
+CALL MNH_MEM_GET( ZHLC_HCF3D, jiu, jju, jku )
+CALL MNH_MEM_GET( ZHLC_LCF3D, jiu, jju, jku )
+CALL MNH_MEM_GET( ZHLC_HRC3D, jiu, jju, jku )
+CALL MNH_MEM_GET( ZHLC_LRC3D, jiu, jju, jku )
+CALL MNH_MEM_GET( ZHLI_HCF3D, jiu, jju, jku )
+CALL MNH_MEM_GET( ZHLI_LCF3D, jiu, jju, jku )
+CALL MNH_MEM_GET( ZHLI_HRI3D, jiu, jju, jku )
+CALL MNH_MEM_GET( ZHLI_LRI3D, jiu, jju, jku )
 
-CALL MNH_MEM_GET( zinpri, size( ptht, 1 ), size( ptht, 2 ) )
+CALL MNH_MEM_GET( zinpri, jiu, jju )
 
 CALL MNH_MEM_GET( zrvt     , imicro )
 CALL MNH_MEM_GET( zrct     , imicro )
@@ -1143,17 +1147,15 @@ CALL MNH_MEM_GET( zrh_tend, imicro, 10 )
 
 CALL MNH_MEM_GET( zssi, imicro )
 
-CALL MNH_MEM_GET( zw_rvs, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zw_rcs, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zw_rrs, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zw_ris, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zw_rss, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zw_rgs, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zw_rhs, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-CALL MNH_MEM_GET( zw_ths, size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) )
-
+CALL MNH_MEM_GET( zw_rvs, jiu, jju, jku )
+CALL MNH_MEM_GET( zw_rcs, jiu, jju, jku )
+CALL MNH_MEM_GET( zw_rrs, jiu, jju, jku )
+CALL MNH_MEM_GET( zw_ris, jiu, jju, jku )
+CALL MNH_MEM_GET( zw_rss, jiu, jju, jku )
+CALL MNH_MEM_GET( zw_rgs, jiu, jju, jku )
+CALL MNH_MEM_GET( zw_rhs, jiu, jju, jku )
+CALL MNH_MEM_GET( zw_ths, jiu, jju, jku )
 CALL MNH_MEM_GET( ZTEMP_BUD, JIU, JJU, JKU )
-
 !$acc data present( I1, I2, I3,                                                                                                &
 !$acc &            ZW, ZT, ZZ_RVHENI_MR, ZZ_RVHENI, ZZ_LVFACT, ZZ_LSFACT, ZLSFACT3D, ZINPRI,                                   &
 !$acc &            ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, ZCIT, ZTHT, ZRHODREF, ZZT, ZPRES, ZEXN,                           &
@@ -1184,13 +1186,13 @@ CALL MNH_MEM_GET( ZTEMP_BUD, JIU, JJU, JKU )
 !-------------------------------------------------------------------------------
 if ( lbu_enable ) then
    if ( lbudget_th ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  pths(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', ZTEMP_BUD(:,:,:) )
    end if
    if ( lbudget_rv ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prvs(:, :, :) * prhodj(:, :, :)
       !$acc end kernels      
       call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', ZTEMP_BUD(:,:,:) )
@@ -1202,7 +1204,13 @@ end if
 !               -----------------------
 !
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+#ifdef MNH_COMPILER_CCE
+!$acc kernels present(ZRS_TEND,ZRG_TEND,ZRH_TEND,ZRCHONI,ZRVDEPS,ZRIAGGS,ZRIAUTS,     &
+!$acc &               ZRVDEPG,ZRCAUTR,ZRCACCR,ZRREVAV,ZRSMLTG,ZRCMLTSR,ZRICFRRG,      &
+!$acc &               ZRRCFRIG,ZRICFRR,ZRGMLTR,ZRHMLTR,ZRCBERI)
+#else
 !$acc kernels
+#endif
 IKB=KKA+JPVEXT*KKL
 IKE=KKU-JPVEXT*KKL
 IKTB=1+JPVEXT
@@ -1277,37 +1285,37 @@ IF(.NOT. LSEDIM_AFTER) THEN
   !*       2.1     sedimentation
   !
    if ( lbudget_rc .and. osedic ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prcs(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', ZTEMP_BUD(:,:,:) )
    end if
    if ( lbudget_rr  ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prrs(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', ZTEMP_BUD(:,:,:) )
    end if
    if ( lbudget_ri  ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  pris(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', ZTEMP_BUD(:,:,:) )
    end if
    if ( lbudget_rs  ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prss(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', ZTEMP_BUD(:,:,:) )
    end if
    if ( lbudget_rg  ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prgs(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', ZTEMP_BUD(:,:,:) )
    end if
    if ( lbudget_rh  ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prhs(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
       call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', ZTEMP_BUD(:,:,:) )
@@ -1317,7 +1325,7 @@ IF(.NOT. LSEDIM_AFTER) THEN
   !Remark: the 2 source terms SEDI and DEPO could be mixed and stored in the same source term (SEDI)
   !        if osedic=T and ldeposc=T (a warning is printed in ini_budget in that case)
    if ( lbudget_rc .and. ldeposc .and. .not.osedic ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prcs(:, :, :) * prhodj(:, :, :)
       !$acc end kernels      
       call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', ZTEMP_BUD(:,:,:) )
@@ -1394,37 +1402,37 @@ IF(.NOT. LSEDIM_AFTER) THEN
   !*       2.2     budget storage
   !
   if ( lbudget_rc .and. osedic ) then
-     !$acc kernels present(ZTEMP_BUD)
+     !$acc kernels present_cr(ZTEMP_BUD)
      ZTEMP_BUD(:,:,:) =  prcs(:, :, :) * prhodj(:, :, :)
      !$acc end kernels
      call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', ZTEMP_BUD(:,:,:) )
   end if
   if ( lbudget_rr  ) then
-     !$acc kernels present(ZTEMP_BUD)
+     !$acc kernels present_cr(ZTEMP_BUD)
      ZTEMP_BUD(:,:,:) =  prrs(:, :, :) * prhodj(:, :, :)
      !$acc end kernels
      call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', ZTEMP_BUD(:,:,:) )
   end if
   if ( lbudget_ri  ) then
-     !$acc kernels present(ZTEMP_BUD)
+     !$acc kernels present_cr(ZTEMP_BUD)
      ZTEMP_BUD(:,:,:) =  pris(:, :, :) * prhodj(:, :, :)
      !$acc end kernels
      call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', ZTEMP_BUD(:,:,:) )
   end if
   if ( lbudget_rs  ) then
-     !$acc kernels present(ZTEMP_BUD)
+     !$acc kernels present_cr(ZTEMP_BUD)
      ZTEMP_BUD(:,:,:) =  prss(:, :, :) * prhodj(:, :, :)
      !$acc end kernels
      call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', ZTEMP_BUD(:,:,:) )
   end if
   if ( lbudget_rg  ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  prgs(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
      call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', ZTEMP_BUD(:,:,:) )
   end if
   if ( lbudget_rh  ) then
-     !$acc kernels present(ZTEMP_BUD)
+     !$acc kernels present_cr(ZTEMP_BUD)
      ZTEMP_BUD(:,:,:) =  prhs(:, :, :) * prhodj(:, :, :)
      !$acc end kernels
      call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', ZTEMP_BUD(:,:,:) )
@@ -1433,7 +1441,7 @@ IF(.NOT. LSEDIM_AFTER) THEN
   !If osedic=T and ldeposc=T, DEPO is in fact mixed and stored with the SEDI source term
   !(a warning is printed in ini_budget in that case)
   if ( lbudget_rc .and. ldeposc .and. .not.osedic) then
-     !$acc kernels present(ZTEMP_BUD)
+     !$acc kernels present_cr(ZTEMP_BUD)
      ZTEMP_BUD(:,:,:) =  prcs(:, :, :) * prhodj(:, :, :)
      !$acc end kernels      
      call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', ZTEMP_BUD(:,:,:) )
@@ -1455,10 +1463,21 @@ CALL COUNTJV_DEVICE(ODMICRO(:,:,:),I1(:),I2(:),I3(:),IMICRO)
 !Packing
 GTEST=.false.
 IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') GTEST=.true.
+#ifdef MNH_COMPILER_CCE
+!$acc kernels present(ZSIGMA_RC,ZRHT,ZEXT_RH,                                                                                  &
+!$acc &            ZTOT_RVHENI, ZTOT_RCHONI, ZTOT_RRHONG, ZTOT_RVDEPS, ZTOT_RIAGGS, ZTOT_RIAUTS, ZTOT_RVDEPG, ZTOT_RCAUTR,     &
+!$acc &            ZTOT_RCACCR, ZTOT_RREVAV, ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, ZTOT_RIMLTC, ZTOT_RCBERI, ZTOT_RHMLTR,  &
+!$acc &            ZTOT_RSMLTG, ZTOT_RCMLTSR, ZTOT_RRACCSS,  ZTOT_RRACCSG,  ZTOT_RSACCRG, ZTOT_RICFRRG,  ZTOT_RRCFRIG,         &
+!$acc &            ZTOT_RICFRR, ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG,     &
+!$acc &            ZTOT_RSDRYG, ZTOT_RWETGH, ZTOT_RGMLTR, ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH,     &
+!$acc &            ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, ZTOT_RDRYHG)                              
+#else
 !$acc kernels
+#endif
+
 IF(IMICRO>0) THEN
-!$acc loop independent
-  DO JL=1, IMICRO
+!acc loop independent
+  !$mnh_do_concurrent(JL=1:IMICRO)
     ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL))
     ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))
     ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL))
@@ -1487,7 +1506,7 @@ IF(IMICRO>0) THEN
     ELSE
       ZHLI_LCF(JL)=0.
     ENDIF
-  ENDDO
+  !$mnh_end_do()
   IF(GEXT_TEND) THEN
 !$acc loop independent
     DO JL=1, IMICRO
@@ -1589,7 +1608,7 @@ IF(XTSTEP_TS/=0.)THEN
   INB_ITER_MAX=MAX(NMAXITER, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time
 ENDIF
 !acc end kernels
-!$acc kernels
+!$acc kernels present_cr(IITER,ZTIME)
 IITER(:)=0
 ZTIME(:)=0. ! Current integration time (all points may have a different integration time)
 !$acc end kernels
@@ -1977,7 +1996,7 @@ ENDDO
 !
 ! !$acc kernels
 IF(IMICRO>0) THEN
-!$acc kernels
+!$acc kernels present_cr(ZHLC_HCF3D,ZHLC_LCF3D,ZHLC_HRC3D,ZHLC_LRC3D,ZHLI_HCF3D,ZHLI_LCF3D,ZHLI_HRI3D,ZHLI_LRI3D)
   ZHLC_HCF3D(:,:,:)=0.
   ZHLC_LCF3D(:,:,:)=0.
   ZHLC_HRC3D(:,:,:)=0.
@@ -2000,7 +2019,7 @@ IF(IMICRO>0) THEN
   END DO
 !$acc end kernels
 ELSE
-!$acc kernels
+!$acc kernels present_cr(PRAINFR,ZHLC_HCF3D,ZHLC_LCF3D,ZHLC_HRC3D,ZHLC_LRC3D,ZHLI_HCF3D,ZHLI_LCF3D,ZHLI_HRI3D,ZHLI_LRI3D,PCIT)
   PRAINFR(:,:,:)=0.
   ZHLC_HCF3D(:,:,:)=0.
   ZHLC_LCF3D(:,:,:)=0.
@@ -2013,7 +2032,7 @@ ELSE
   PCIT(:,:,:) = 0.
 !$acc end kernels
 ENDIF
-!$acc kernels
+!$acc kernels present_cr(PEVAP3D)
 IF(OWARM) THEN
   PEVAP3D(:,:,:) = 0.
 !$acc loop independent
@@ -2053,19 +2072,19 @@ ENDDO
 if ( lbu_enable ) then
   !Note: there is an other contribution for HENU later
    if ( lbudget_th ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) =  pths(:, :, :) * prhodj(:, :, :)
       !$acc end kernels
       call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', ZTEMP_BUD(:,:,:) )
    end if
    if ( lbudget_rv ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) = prvs(:, :, :) * prhodj(:, :, :)
       !$acc end kernels      
       call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', ZTEMP_BUD(:,:,:) )
    end if
    if ( lbudget_ri ) then
-      !$acc kernels present(ZTEMP_BUD)
+      !$acc kernels present_cr(ZTEMP_BUD)
       ZTEMP_BUD(:,:,:) = zz_rvheni(:, :, :)  * prhodj(:, :, :)
       !$acc end kernels      
       call Budget_store_add( tbudgets(NBUDGET_RI), 'HENU', ZTEMP_BUD(:,:,:) )
@@ -2227,7 +2246,7 @@ ELSE
   END DO
 !$acc end kernels
 !
-!$acc kernels
+!$acc kernels present_cr(ZW_RHS)
   ZW_RVS(:,:,:) = ( ZW_RVS(:,:,:) - PRVT(:,:,:) ) * ZINV_TSTEP
   ZW_RCS(:,:,:) = ( ZW_RCS(:,:,:) - PRCT(:,:,:) ) * ZINV_TSTEP
   ZW_RRS(:,:,:) = ( ZW_RRS(:,:,:) - PRRT(:,:,:) ) * ZINV_TSTEP
@@ -2801,7 +2820,6 @@ CONTAINS
   REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZW
 #endif
   !
-!$acc data present( PRV, PRC, PRR, PRI, PRS, PRG, PTH, PLVFACT, PLSFACT, PRH )
   !
   IF (MPPDB_INITIALIZED) THEN
     !Check all IN arrays
@@ -2818,6 +2836,8 @@ CONTAINS
     CALL MPPDB_CHECK(PTH,"CORRECT_NEGATIVITIES beg:PTH")
   END IF
 
+!$acc data present( PRV, PRC, PRR, PRI, PRS, PRG, PTH, PLVFACT, PLSFACT )
+
 #ifndef MNH_OPENACC
   allocate( gw(size( prv, 1 ), size( prv, 2 ), size( prv, 3 ) ) )
   allocate( zw(size( prv, 1 ), size( prv, 2 ), size( prv, 3 ) ) )
@@ -2831,6 +2851,7 @@ CONTAINS
 !$acc data present( GW, ZW )
 #endif
 
+!$acc data present( PRH ) if ( present( PRH ) )
 !$acc kernels
   !We correct negativities with conservation
   ! 1) deal with negative values for mixing ratio, except for vapor
@@ -2926,6 +2947,7 @@ CONTAINS
     ENDDO
   ENDIF
 !$acc end kernels
+!$acc end data
 
 !$acc end data
 
@@ -2934,6 +2956,8 @@ CONTAINS
   CALL MNH_MEM_RELEASE()
 #endif
 
+!$acc end data
+
   IF (MPPDB_INITIALIZED) THEN
     !Check all INOUT arrays
     CALL MPPDB_CHECK(PRV,"CORRECT_NEGATIVITIES end:PRV")
@@ -2946,9 +2970,8 @@ CONTAINS
     CALL MPPDB_CHECK(PTH,"CORRECT_NEGATIVITIES end:PTH")
   END IF
 
-!$acc end data
-
   END SUBROUTINE CORRECT_NEGATIVITIES
 !
+#endif  
 END SUBROUTINE RAIN_ICE_RED
 
-- 
GitLab