From ce070e94ccdbeaf777a7f7ce1116d18fae3a16a5 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 10 Sep 2021 15:31:58 +0200
Subject: [PATCH] Philippe 10/09/2021: OpenACC: add missing data on device (due
 to transition to MNH 5.5.0)

---
 src/MNH/ice4_tendencies.f90 | 10 ++++++++--
 src/MNH/modeln.f90          |  3 ++-
 src/MNH/rain_ice.f90        | 17 ++++++++++++++++-
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90
index 87f1eb77a..5c86a1dd2 100644
--- a/src/MNH/ice4_tendencies.f90
+++ b/src/MNH/ice4_tendencies.f90
@@ -318,6 +318,7 @@ 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, &
                                     & ZT, ZTHT, ZRHT, &
@@ -385,6 +386,7 @@ END IF
 
 isize = size( pcompute )
 
+allocate( gldcompute(isize ) )
 allocate( zwetg    (isize ) )
 allocate( zrvt     (isize ) )
 allocate( zrct     (isize ) )
@@ -414,7 +416,7 @@ allocate( zrst3d(kit, kjt, kkt ) )
 allocate( zrgt3d(kit, kjt, kkt ) )
 allocate( zrht3d(kit, kjt, kkt ) )
 
-!$acc data create(ZWETG,ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZRHT,ZZW,ZKA,ZDV,ZAI,ZCJ,ZRF,               &
+!$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 kernels
@@ -458,7 +460,11 @@ ELSE
   !
   !*       2.     COMPUTES THE SLOW COLD PROCESS SOURCES
   !               --------------------------------------
-  CALL ICE4_NUCLEATION(ODSOFT, PCOMPUTE==1., &
+!$acc kernels
+  GLDCOMPUTE = PCOMPUTE==1.
+!$acc end kernels
+
+  CALL ICE4_NUCLEATION(ODSOFT, GLDCOMPUTE, &
                        ZTHT, PPRES, PRHODREF, PEXN, PLSFACT, ZT, &
                        ZRVT, &
                        PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI)
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index e885690fc..3ad1f6d48 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -1898,7 +1898,8 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
 !$acc &            XSOLORG, XMI)                                                                 &
 !$acc &    copy   (XSUPSAT, XNACT, XNPRO, XSSPRO,                                                &
 !$acc &            XRTHS, XRT, XRRS, XSVT, XRSVS, XCLDFR, XCIT, XINPRR3D, XEVAP3D,               &
-!$acc &            XINPRC, XINPRR, XINPRS, XINPRG, XINPRH, XINDEP)                               &
+!$acc &            XINPRC, XINPRR, XINPRS, XINPRG, XINPRH, XINDEP,                               &
+!$acc &            XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF)                                       &
 !$acc &    copyout(XSRCT, XRAINFR)
   IF (CSURF=='EXTE') THEN
     ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90
index 457174c73..ddad84fcc 100644
--- a/src/MNH/rain_ice.f90
+++ b/src/MNH/rain_ice.f90
@@ -397,6 +397,9 @@ REAL, DIMENSION(:), ALLOCATABLE   :: ZRHODREF, &      ! RHO Dry REFerence
                                                       !                     = ZHLC_HRC/HCF+ ZHLC_LRC/LCF
 REAL, DIMENSION(:,:),   ALLOCATABLE :: ZZW1 ! Work arrays
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRR, ZRS, ZRG ! work arrays
+#ifdef MNH_OPENACC
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRS_ZERO, ZRG_ZERO ! work arrays filled with zeros
+#endif
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZT ! Temperature
 !
 ! IN variables
@@ -464,9 +467,13 @@ ALLOCATE( GMICRO(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
 ALLOCATE( ZRR   (SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
 ALLOCATE( ZRS   (SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
 ALLOCATE( ZRG   (SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
+#ifdef MNH_OPENACC
+ALLOCATE( ZRS_ZERO(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
+ALLOCATE( ZRG_ZERO(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
+#endif
 ALLOCATE( ZT    (SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) )
 
-!$acc data create( I1, I2, I3, GMICRO, ZRR, ZRS, ZRG, ZT )
+!$acc data create( I1, I2, I3, GMICRO, ZRR, ZRS, ZRG, ZRS_ZERO, ZRG_ZERO, ZT )
 
 !-------------------------------------------------------------------------------
 !
@@ -878,14 +885,22 @@ IF( IMICRO >= 0 ) THEN
   !Diagnostic of precipitation fraction
 !$acc kernels
   PRAINFR(:,:,:) = 0.
+#ifdef MNH_OPENACC
+  ZRS_ZERO(:,:,:) = 0.
+  ZRG_ZERO(:,:,:) = 0.
+#endif
 !$acc loop independent
   DO JL=1,IMICRO
     PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL)
   END DO
 !$acc end kernels
   CALL ICE4_RAINFR_VERT( IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRT(:,:,:),      &
+#ifndef MNH_OPENACC
                          RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRSS ) ) ], SHAPE = SHAPE( PRSS ) ), &
                          RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRGS ) ) ], SHAPE = SHAPE( PRGS ) )  )
+#else
+                         ZRS_ZERO(:,:,:), ZRG_ZERO(:,:,:) )
+#endif
 !$acc kernels
 !$acc loop independent
   DO JL=1,IMICRO
-- 
GitLab