From 111dd0a9dca0ffd9111cdd8cbb26a9c9074ed97d Mon Sep 17 00:00:00 2001
From: Juan Escobar <juan.escobar@aero.obs-mip.fr>
Date: Tue, 21 Sep 2021 11:16:21 +0200
Subject: [PATCH] Juan 21/09/2021:p_abs.f90, add acc kernels + BIT_REPRO call

---
 src/ZSOLVER/p_abs.f90 | 53 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 40 insertions(+), 13 deletions(-)

diff --git a/src/ZSOLVER/p_abs.f90 b/src/ZSOLVER/p_abs.f90
index f00d38d38..5a20ed84a 100644
--- a/src/ZSOLVER/p_abs.f90
+++ b/src/ZSOLVER/p_abs.f90
@@ -122,6 +122,10 @@ USE MODE_ll
 !JUAN
 USE MODE_REPRO_SUM
 !JUAN
+!
+#ifdef MNH_BITREP
+USE MODI_BITREP
+#endif
 !  
 IMPLICIT NONE
 !  
@@ -185,6 +189,7 @@ REAL     ::  ZPHI0
 !
 INTEGER  :: IINFO_ll
 !
+LOGICAL :: GPRVREF0
 !-------------------------------------------------------------------------------
 !
 !*       1.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES:
@@ -196,6 +201,8 @@ IKE = IKU - JPVEXT
 !
 CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
 !
+GPRVREF0 =  ( SIZE(PRVREF,1) == 0 )
+!
 ALLOCATE(ZMASS_O_PI_2D(IIB:IIE,IJB:IJE))
 ALLOCATE(ZMASSGUESS_2D(IIB:IIE,IJB:IJE))
 ALLOCATE(ZWATERMASST_2D(IIB:IIE,IJB:IJE))
@@ -212,7 +219,8 @@ ZCVD_O_RD = (XCPD - XRD) / XRD
 !       
 !
 IF ( CEQNSYS=='DUR' .OR. CEQNSYS=='MAE' ) THEN
-!
+  !
+  !$acc kernels  
   IF(KRR > 0) THEN
   !
   !   compute the mixing ratio of the total water (ZRTOT)
@@ -227,21 +235,29 @@ IF ( CEQNSYS=='DUR' .OR. CEQNSYS=='MAE' ) THEN
   ZMASSGUESS_2D  = 0.  
   ZMASS_O_PI_2D  = 0.      
   ZWATERMASST_2D = 0.
+  !$acc end kernels
 !
   IF ( CEQNSYS == 'DUR' ) THEN
+    !$acc kernels 
     ! compute the Jacobian in ZWORK
-    IF ( SIZE(PRVREF,1) == 0 ) THEN
+    IF ( GPRVREF0 ) THEN
       ZWORK(:,:,:)=  PRHODJ * XTH00  / ( PRHODREF * PTHVREF )
     ELSE
       ZWORK(:,:,:)=PRHODJ * XTH00  &
            / ( PRHODREF * PTHVREF * (1. + PRVREF) )
     END IF
     !
+    !$acc loop seq
     DO JK = IKB,IKE
+      !$acc loop independent collapse(2) 
       DO JJ = IJB,IJE
         DO JI = IIB,IIE
-          ZMASSGUESS_2D(JI,JJ)  = ZMASSGUESS_2D(JI,JJ) +                          &
-             (PEXNREF(JI,JJ,JK)+PPHIT(JI,JJ,JK))**ZCVD_O_RD   &
+           ZMASSGUESS_2D(JI,JJ)  = ZMASSGUESS_2D(JI,JJ) +                          &
+#ifndef MNH_OPENACC
+                (PEXNREF(JI,JJ,JK)+PPHIT(JI,JJ,JK))**ZCVD_O_RD   &
+#else
+                BR_POW((PEXNREF(JI,JJ,JK)+PPHIT(JI,JJ,JK)),ZCVD_O_RD) &
+#endif
              * ZWORK(JI,JJ,JK) / PTHETAV(JI,JJ,JK)
           ZMASS_O_PI_2D(JI,JJ)  = ZMASS_O_PI_2D(JI,JJ) + ZWORK(JI,JJ,JK) / PTHETAV(JI,JJ,JK)
           ZWATERMASST_2D(JI,JJ) = ZWATERMASST_2D(JI,JJ) +       &
@@ -249,7 +265,8 @@ IF ( CEQNSYS=='DUR' .OR. CEQNSYS=='MAE' ) THEN
         END DO
       END DO
     END DO
-!
+    !$acc end kernels
+    !
   ELSE
     DO JK = IKB,IKE
       DO JJ = IJB,IJE
@@ -273,23 +290,31 @@ IF ( CEQNSYS=='DUR' .OR. CEQNSYS=='MAE' ) THEN
   !
   ZMASS_O_PI  = ZMASS_O_PI*ZP00_O_RD*ZCVD_O_RD
   ZPI0 = (PDRYMASST + ZWATERMASST - ZP00_O_RD*ZMASSGUESS ) / ZMASS_O_PI
+  !$acc kernels
   PPHIT(:,:,:) = PPHIT(:,:,:) + ZPI0
+  !$acc end kernels
 !
 !
   !
   !          Second iteration
   !
+  !$acc kernels
   ZMASSGUESS_2D  = 0.
+  !$acc end kernels
   IF ( CEQNSYS == 'DUR' ) THEN
-    DO JK = IKB,IKE
-      DO JJ = IJB,IJE
-        DO JI = IIB,IIE
-          ZMASSGUESS_2D(JI,JJ)  = ZMASSGUESS_2D(JI,JJ) +                               &
-           (PEXNREF(JI,JJ,JK)+PPHIT(JI,JJ,JK))**ZCVD_O_RD          &
-          * ZWORK(JI,JJ,JK) / PTHETAV(JI,JJ,JK)
+     !$acc kernels
+     !$acc loop seq 
+     DO JK = IKB,IKE
+        !$acc loop independent collapse(2)  
+        DO JJ = IJB,IJE
+           DO JI = IIB,IIE
+              ZMASSGUESS_2D(JI,JJ)  = ZMASSGUESS_2D(JI,JJ) +                               &
+                   (PEXNREF(JI,JJ,JK)+PPHIT(JI,JJ,JK))**ZCVD_O_RD          &
+                   * ZWORK(JI,JJ,JK) / PTHETAV(JI,JJ,JK)
+           END DO
         END DO
-      END DO
-    END DO
+     END DO
+     !$acc end kernels
   ELSE
     DO JK = IKB,IKE
       DO JJ = IJB,IJE
@@ -306,7 +331,9 @@ IF ( CEQNSYS=='DUR' .OR. CEQNSYS=='MAE' ) THEN
   ZMASSGUESS  = SUM_DD_R2_ll(ZMASSGUESS_2D)
   !
   ZPI0 = (PDRYMASST + ZWATERMASST - ZP00_O_RD*ZMASSGUESS ) / ZMASS_O_PI
+  !$acc kernels
   PPHIT(:,:,:) = PPHIT(:,:,:) + ZPI0
+  !$acc end kernels
 !
 !
 ELSEIF( CEQNSYS == 'LHE' ) THEN
-- 
GitLab