From 0184b00db9fb9bf33c3bebd82d39dffa1bc2442f Mon Sep 17 00:00:00 2001
From: ESCOBAR Juan <escj@nuwa>
Date: Fri, 18 Sep 2020 15:54:58 +0200
Subject: [PATCH] Juan 18/09/2020: Opimisation OpenACC , BR_POW parallelized by
 adding temp 1D array ZLBEXI(:) = XLBEXI , DO CONCURRENT not bit-reporductible
 <-> NVHPC 20.7 Bug ?

---
 src/MNH/rain_ice_fast_ri.f90 | 41 ++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/src/MNH/rain_ice_fast_ri.f90 b/src/MNH/rain_ice_fast_ri.f90
index 5ebaf71d1..b5319b9fd 100644
--- a/src/MNH/rain_ice_fast_ri.f90
+++ b/src/MNH/rain_ice_fast_ri.f90
@@ -60,7 +60,9 @@ REAL,     DIMENSION(:),     INTENT(INOUT) :: PTHS     ! Theta source
 !
 LOGICAL, DIMENSION(:), ALLOCATABLE :: GWORK
 REAL,    DIMENSION(:), ALLOCATABLE :: ZZW  ! Work array
+REAL,    DIMENSION(:), ALLOCATABLE :: ZLBEXI
 !
+INTEGER :: JL,JLU
 !-------------------------------------------------------------------------------
 !
 ! IN variables
@@ -98,10 +100,13 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PTHS,"RAIN_ICE_FAST_RI beg:PTHS")
 END IF
 !
+JLU = size(PRHODREF)
+!
 ALLOCATE( GWORK(size(PRHODREF)) )
 ALLOCATE( ZZW  (size(PRHODREF)) )
+ALLOCATE( ZLBEXI   (size(PRHODREF)) )
 
-!$acc data create( GWORK, ZZW )
+!$acc data create( GWORK, ZZW , ZLBEXI )
 
 !
 !*       7.1    cloud ice melting
@@ -131,21 +136,43 @@ ALLOCATE( ZZW  (size(PRHODREF)) )
 !*       7.2    Bergeron-Findeisen effect: RCBERI
 !
 !$acc kernels
-  GWORK(:) = PRCS(:)>0.0 .AND. PSSI(:)>0.0 .AND. PRIT(:)>XRTMIN(4) .AND. PCIT(:)>0.0
-  WHERE( GWORK(:) )
+
+  GWORK(:) = PRCS(:)>0.0 .AND. PSSI(:)>0.0 .AND. PRIT(:)>XRTMIN(4) .AND. PCIT(:)>0.0 
 #ifndef MNH_BITREP
+  WHERE( GWORK(:) )
     ZZW(:) = MIN(1.E8,XLBI*( PRHODREF(:)*PRIT(:)/PCIT(:) )**XLBEXI) ! Lbda_i
     ZZW(:) = MIN( PRCS(:),( PSSI(:) / (PRHODREF(:)*PAI(:)) ) * PCIT(:) * &
                   ( X0DEPI/ZZW(:) + X2DEPI*PCJ(:)*PCJ(:)/ZZW(:)**(XDI+2.0) ) )
+    PRCS(:) = PRCS(:) - ZZW(:)
+    PRIS(:) = PRIS(:) + ZZW(:)
+    PTHS(:) = PTHS(:) + ZZW(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(RCBERI))
+ END WHERE
 #else
-    ZZW(:) = MIN(1.E8,XLBI*BR_POW( PRHODREF(:)*PRIT(:)/PCIT(:), XLBEXI ) ) ! Lbda_i
+
+!!$ Le DO concurrent n'est pas bit-reproductible BUG NVHPC 20.7
+!!$ DO CONCURRENT ( JL=1:JLU )
+!!$    ZLBEXI(JL) = XLBEXI
+!!$    IF ( GWORK(JL)  ) THEN
+!!$       ZZW(JL) = MIN(1.E8,XLBI*BR_POW( PRHODREF(JL)*PRIT(JL)/PCIT(JL), ZLBEXI(JL) ) ) ! Lbda_i
+!!$       ZZW(JL) = MIN( PRCS(JL),( PSSI(JL) / (PRHODREF(JL)*PAI(JL)) ) * PCIT(JL) * &
+!!$            ( X0DEPI/ZZW(JL) + X2DEPI*PCJ(JL)*PCJ(JL)/BR_POW(ZZW(JL),XDI+2.0) ) )
+!!$       PRCS(JL) = PRCS(JL) - ZZW(JL)
+!!$       PRIS(JL) = PRIS(JL) + ZZW(JL)
+!!$       PTHS(JL) = PTHS(JL) + ZZW(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCBERI))
+!!$    END IF
+!!$ END DO ! CONCURRENT
+ 
+ WHERE( GWORK(:) )
+    ZLBEXI(:) = XLBEXI
+    ZZW(:) = MIN(1.E8,XLBI*BR_POW( PRHODREF(:)*PRIT(:)/PCIT(:), ZLBEXI(:) ) ) ! Lbda_i
     ZZW(:) = MIN( PRCS(:),( PSSI(:) / (PRHODREF(:)*PAI(:)) ) * PCIT(:) * &
-                  ( X0DEPI/ZZW(:) + X2DEPI*PCJ(:)*PCJ(:)/BR_POW(ZZW(:),XDI+2.0) ) )
-#endif
+         ( X0DEPI/ZZW(:) + X2DEPI*PCJ(:)*PCJ(:)/BR_POW(ZZW(:),XDI+2.0) ) )
     PRCS(:) = PRCS(:) - ZZW(:)
     PRIS(:) = PRIS(:) + ZZW(:)
     PTHS(:) = PTHS(:) + ZZW(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(RCBERI))
-  END WHERE
+ END WHERE
+ 
+#endif 
 !$acc end kernels
   IF (LBUDGET_TH) THEN
 !$acc update self(PTHS)
-- 
GitLab