From b030d7ae46cd9cc7bdf8097b24de82dbe3a6dfa1 Mon Sep 17 00:00:00 2001
From: Juan ESCOBAR <juan.escobar@aero.obs-mip.fr>
Date: Tue, 7 Mar 2023 14:49:12 +0100
Subject: [PATCH] Juan 07/03/2023:slow_terms.f90, Bypass CRAY CCE/15.0.1
 compiler bug => remove size(...) in kernels + use MNH_MEM_GET

---
 src/MNH/slow_terms.f90 | 97 +++++++++++++++++++++++++++---------------
 1 file changed, 63 insertions(+), 34 deletions(-)

diff --git a/src/MNH/slow_terms.f90 b/src/MNH/slow_terms.f90
index c962c7112..d26ffcbdf 100644
--- a/src/MNH/slow_terms.f90
+++ b/src/MNH/slow_terms.f90
@@ -166,9 +166,16 @@ USE MODD_PARAMETERS, only: JPVEXT
 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
 #if defined(MNH_BITREP) || defined(MNH_BITREP_OMP)
 use modi_bitrep
 #endif
+#if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP)
+!$mnh_undef(LOOP)
+!$mnh_undef(OPENACC)
+#endif
 
 IMPLICIT NONE
 !
@@ -213,19 +220,21 @@ INTEGER :: IKE           !  the microphysical sources have to be computed
 !
 REAL    :: ZTSPLITR      ! Small time step for rain sedimentation
 !
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZT,ZW,ZW1,ZW2,ZW3,ZEXNT,ZDZZ  ! Work arrays
-LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: G3D
+REAL,    DIMENSION(:,:,:), POINTER,CONTIGUOUS :: ZT,ZW,ZW1,ZW2,ZW3,ZEXNT,ZDZZ  ! Work arrays
+LOGICAL, DIMENSION(:,:,:), POINTER,CONTIGUOUS :: G3D
 !
 INTEGER                              :: JI,JJ,IC,JL ! loop control for packed array
+INTEGER                              :: JIU, JJU, JKU
 
 !-------------------------------------------------------------------------------
 
+JIU = size(pzz,1)
+JJU = size(pzz,2)
+JKU = size(pzz,3)
+
 !$acc data present( PZZ, PRHODJ, PRHODREF, PCLDFR, PTHT, PRVT, PRCT, PRRT,      &
 !$acc &             PPABST, PTHS, PRVS, PRCS, PRRS, PINPRR, PINPRR3D, PEVAP3D )
 
-! !$acc &     copyin( XC1RC, XC2RC, XC1RE, XC2RE, XCEXRA, XCEXRE, XCEXRS, XCEXVT, XCRA, XCRS, XDIVA, XTHCO, &
-! !$acc &             XALPW, XBETAW, XGAMW, XCL, XCPD, XCPV, XLVTT, XMD, XMV, XP00, XRD, XRHOLW, XRV, XTT )
-
 IF (MPPDB_INITIALIZED) THEN
   !Check all IN arrays
   CALL MPPDB_CHECK(PZZ,     "SLOW_TERMS beg:PZZ")
@@ -247,16 +256,29 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PEVAP3D, "SLOW_TERMS beg:PEVAP3D")
 END IF
 
-allocate( zt   ( size(pzz,1), size(pzz,2), size(pzz,3) ) )
-allocate( zw   ( size(pzz,1), size(pzz,2), size(pzz,3) ) )
-allocate( zw1  ( size(pzz,1), size(pzz,2), size(pzz,3) ) )
-allocate( zw2  ( size(pzz,1), size(pzz,2), size(pzz,3) ) )
-allocate( zw3  ( size(pzz,1), size(pzz,2), size(pzz,3) ) )
-allocate( zexnt( size(pzz,1), size(pzz,2), size(pzz,3) ) )
-allocate( zdzz ( size(pzz,1), size(pzz,2), size(pzz,3) ) )
-allocate( g3d   ( size(prhodj,1), size(prhodj,2), size(prhodj,3) ) )
+#ifndef MNH_OPENACC
+allocate( zt   ,JIU,JJU,JKU )
+allocate( zw   ,JIU,JJU,JKU )
+allocate( zw1  ,JIU,JJU,JKU )
+allocate( zw2  ,JIU,JJU,JKU )
+allocate( zw3  ,JIU,JJU,JKU )
+allocate( zexnt,JIU,JJU,JKU )
+allocate( zdzz ,JIU,JJU,JKU )
+allocate( g3d   )
+#else
+!Pin positions in the pools of MNH memory
+CALL MNH_MEM_POSITION_PIN()
+CALL MNH_MEM_GET( zt   ,JIU,JJU,JKU )
+CALL MNH_MEM_GET( zw   ,JIU,JJU,JKU )
+CALL MNH_MEM_GET( zw1  ,JIU,JJU,JKU )
+CALL MNH_MEM_GET( zw2  ,JIU,JJU,JKU )
+CALL MNH_MEM_GET( zw3  ,JIU,JJU,JKU )
+CALL MNH_MEM_GET( zexnt,JIU,JJU,JKU )
+CALL MNH_MEM_GET( zdzz ,JIU,JJU,JKU )
+CALL MNH_MEM_GET( g3d  ,JIU,JJU,JKU )
+#endif
 
-!$acc data create( zt, zw, zw1, zw2, zw3, zexnt, zdzz, g3d )
+!$acc data present( zt, zw, zw1, zw2, zw3, zexnt, zdzz, g3d )
 !
 !*       1.     COMPUTE THE LOOP BOUNDS AND EXNER FUNCTION
 !   	        ------------------------------------------
@@ -279,33 +301,24 @@ if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:,
 !
 !*       2.1    time splitting loop initialization        
 !
-!$acc kernels
 ZTSPLITR = PTSTEP / REAL(KSPLITR)       ! Small time step
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!$acc kernels
 ! 
 ZW1(:,:,:) = PRRS(:,:,:) * PTSTEP
 ZW2(:,:,:) = 0.
 ZW3(:,:,:) = 0.
 !
-#ifndef MNH_OPENACC
 G3D(:,:,:)=.FALSE.
 DO JK=IKE,1,-1
+  !$mnh_expand_where(JI=1:JIU,JJ=1:JJU) 
   WHERE( ZW1(:,:,JK)>0. .OR. G3D(:,:,JK+1) )
     G3D(:,:,JK)=.TRUE.
   END WHERE
+  !$mnh_end_expand_where()
 END DO
-#else
-g3d(:, :, : ) = .false.
-do jk = ike, 1, -1
-  do jj = 1, size(pzz,2)
-    do ji = 1, size(pzz,1)
-      if ( zw1(ji, jj, jk ) >0. .or. g3d(ji, jj, jk+1 ) ) then
-        g3d(ji, jj, jk ) = .true.
-      end if
-    end do
-  end do
-end do
-#endif
 !
+!$mnh_expand_where(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
 WHERE (G3D(:,:,:))
 #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
   ZW3(:,:,:) = PRHODREF(:,:,:) ** (XCEXRS-XCEXVT)
@@ -313,7 +326,9 @@ WHERE (G3D(:,:,:))
   ZW3(:,:,:) = BR_POW( PRHODREF(:,:,:), XCEXRS - XCEXVT )
 #endif
 END WHERE
+!$mnh_end_expand_where()
 !
+!$mnh_expand_where(JI=1:JIU,JJ=1:JJU)
 WHERE (ZW1(:,:,IKE+1)>0.)
 #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
   ZW2(:,:,IKE+1) =   XCRS                         &
@@ -325,6 +340,7 @@ WHERE (ZW1(:,:,IKE+1)>0.)
                   * BR_POW( PRHODREF(:,:,IKE+1), XCEXRS - XCEXVT )
 #endif
 END WHERE
+!$mnh_end_expand_where()
 !
 !
 !*       2.2    small time step integration
@@ -337,9 +353,7 @@ DO JN=1,KSPLITR
 !
 
   DO JK=IKE,IKB,-1
-!$acc loop collapse(2) independent
-    DO JJ = 1,SIZE( ZW1,2)
-      DO JI = 1,SIZE( ZW1,1)
+    !$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU)
         IF ( ( ZW1(JI,JJ,JK+1)>0. ) .AND. ( ZW1(JI,JJ,JK)>0. ) )  THEN
 !
 !*       2.2.2    compute the rain flux
@@ -360,9 +374,8 @@ DO JN=1,KSPLITR
                     ( ZW2(JI,JJ,JK+1)-ZW2(JI,JJ,JK) ) /    &
                     ( ZDZZ(JI,JJ,JK) * PRHODREF(JI,JJ,JK) )
         END IF
-      END DO
-    ENDDO
-  ENDDO
+    !$mnh_end_do()
+  END DO     
 !
 !*       2.2.4    compute the explicit accumulated precipitations
 !                 -----------------------------------------------
@@ -378,6 +391,7 @@ END DO
 !
 PRRS(:,:,:) = ZW1(:,:,:) / PTSTEP
 !$acc end kernels
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !
 !*       2.5     budget storage
 !
@@ -396,6 +410,7 @@ if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'ACCR', prrs(:,
 !
 !$acc kernels
 G3D(:,:,:) = PRCT(:,:,:)>0.0 .AND. PRRT(:,:,:)>0.0 .AND. PRCS(:,:,:)>0.0
+!$mnh_expand_where(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
 WHERE ( G3D(:,:,:) )
 #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP)
   ZW(:,:,:) = XCRA * PRCT(:,:,:)                        &
@@ -411,6 +426,7 @@ WHERE ( G3D(:,:,:) )
   PRCS(:,:,:) = PRCS(:,:,:) - ZW(:,:,:)
   PRRS(:,:,:) = PRRS(:,:,:) + ZW(:,:,:)
 END WHERE
+!$mnh_end_expand_where()
 !$acc end kernels
 !
 !*       3.2     budget storage
@@ -432,14 +448,17 @@ if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'AUTO', prrs(:,
 !$acc kernels
 IF ( HSUBG_AUCV == 'CLFR' ) THEN
  G3D(:,:,:) = PRCT(:,:,:)>0.0 .AND. PRCS(:,:,:)>0.0 .AND. PCLDFR(:,:,:)>0.0
+ !$mnh_expand_where(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
  WHERE ( G3D(:,:,:) )
   ZW(:,:,:) = XC1RC * MAX(PRCT(:,:,:) /(PCLDFR(:,:,:)) - XC2RC / PRHODREF(:,:,:),0.)
   ZW(:,:,:) = MIN ( (ZW(:,:,:)* PCLDFR(:,:,:)), PRCS(:,:,:) )
   PRCS(:,:,:) = PRCS(:,:,:) - ZW(:,:,:)
   PRRS(:,:,:) = PRRS(:,:,:) + ZW(:,:,:)
  END WHERE
+ !$mnh_end_expand_where()
 ELSE
  G3D(:,:,:) = PRCT(:,:,:)>0.0 .AND. PRCS(:,:,:)>0.0
+ !$mnh_expand_where(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
  WHERE ( G3D(:,:,:) )
   ZW(:,:,:) = XC1RC * MAX ( PRCT(:,:,:) - XC2RC / PRHODREF(:,:,:), 0. )
   ZW(:,:,:) = MIN ( ZW(:,:,:) , PRCS(:,:,:) )
@@ -447,6 +466,7 @@ ELSE
   PRCS(:,:,:) = PRCS(:,:,:) - ZW(:,:,:)
   PRRS(:,:,:) = PRRS(:,:,:) + ZW(:,:,:)
  END WHERE
+ !$mnh_end_expand_where()
 END IF
 !$acc end kernels
 !
@@ -467,6 +487,7 @@ if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'REVA', prrs(:,
 !$acc kernels
 PEVAP3D(:,:,:)=0.
 G3D(:,:,:) = PRRT(:,:,:)>0.0 .AND. PRCT(:,:,:)==0.0
+!$mnh_expand_where(JI=1:JIU,JJ=1:JJU,JK=1:JKU)
 WHERE ( G3D(:,:,:) )
 !
 !*       5.1    compute the Exner function
@@ -531,6 +552,7 @@ WHERE ( G3D(:,:,:) )
                       + XCL * (PRCT(:,:,:) + PRRT(:,:,:)) ) )
   PEVAP3D(:,:,:)=ZW(:,:,:)
 END WHERE
+!$mnh_end_expand_where()
 !$acc end kernels
 !
 !*       5.8     budget storage
@@ -565,6 +587,13 @@ END IF
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+deallocate (zt, zw, zw1, zw2, zw3, zexnt, zdzz, g3d )
+#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 SLOW_TERMS
-- 
GitLab