From 12881278a61e8ccdf02eb6b510991b7b31e2365e Mon Sep 17 00:00:00 2001
From: Juan Escobar <juan.escobar@aero.obs-mip.fr>
Date: Tue, 21 Sep 2021 16:22:12 +0200
Subject: [PATCH] Juan 21/09/2021:p_abs.f90, use pointer contiguous +
 MNH_ALLOCATE , and add loop seq to avoid collapse(4) no reproductible
 computation

---
 src/ZSOLVER/p_abs.f90 | 39 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)

diff --git a/src/ZSOLVER/p_abs.f90 b/src/ZSOLVER/p_abs.f90
index 5a20ed84a..adfa745cb 100644
--- a/src/ZSOLVER/p_abs.f90
+++ b/src/ZSOLVER/p_abs.f90
@@ -126,6 +126,9 @@ USE MODE_REPRO_SUM
 #ifdef MNH_BITREP
 USE MODI_BITREP
 #endif
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D
+#endif
 !  
 IMPLICIT NONE
 !  
@@ -179,22 +182,30 @@ REAL     ::  ZMASSGUESS    ! guess of mass resulting of the pressure function
                                        ! provided by the pressure solveur, to an arbitary constant
 REAL     ::  ZWATERMASST   ! Total mass of water Mw
 !JUAN16
-REAL, ALLOCATABLE, DIMENSION(:,:)     :: ZMASS_O_PI_2D,ZMASSGUESS_2D,ZWATERMASST_2D
+REAL, SAVE , ALLOCATABLE, DIMENSION(:,:)     :: ZMASS_O_PI_2D,ZMASSGUESS_2D,ZWATERMASST_2D
 !JUAN16
 REAL     ::  ZPI0          ! constant to retrieve the absolute Exner pressure
 INTEGER  ::  JWATER        ! loop index on the different types of water
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))       &
+REAL,  DIMENSION(:,:,:) , POINTER , CONTIGUOUS &
          ::  ZRTOT, ZRHOREF, ZWORK
+INTEGER :: IZRTOT, IZRHOREF, IZWORK
 REAL     ::  ZPHI0
 !
 INTEGER  :: IINFO_ll
 !
 LOGICAL :: GPRVREF0
+!
+INTEGER         :: IIU,IJU
+!
+LOGICAL, SAVE :: GFIRST_CALL_P_ABS = .TRUE.
+!
 !-------------------------------------------------------------------------------
 !
 !*       1.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES:
 !              ----------------------------------------------
 !
+IIU = SIZE(PTHT,1)
+IJU = SIZE(PTHT,2)
 IKU = SIZE(PTHT,3)
 IKB = 1 + JPVEXT
 IKE = IKU - JPVEXT
@@ -203,13 +214,24 @@ 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))
+IF (GFIRST_CALL_P_ABS) THEN
+   GFIRST_CALL_P_ABS = .FALSE. 
+   ALLOCATE(ZMASS_O_PI_2D(IIB:IIE,IJB:IJE))
+   ALLOCATE(ZMASSGUESS_2D(IIB:IIE,IJB:IJE))
+   ALLOCATE(ZWATERMASST_2D(IIB:IIE,IJB:IJE))
+END IF
 !
 ZP00_O_RD = XP00 / XRD
 ZCVD_O_RD = (XCPD - XRD) / XRD
 !
+#ifndef MNH_OPENACC
+ALLOCATE (ZRTOT(IIU,IJU,IKU), ZRHOREF(IIU,IJU,IKU), ZWORK(IIU,IJU,IKU))
+#else
+IZRTOT   = MNH_ALLOCATE_ZT3D(ZRTOT,IIU,IJU,IKU  )
+IZRHOREF = MNH_ALLOCATE_ZT3D(ZRHOREF,IIU,IJU,IKU  )
+IZWORK   = MNH_ALLOCATE_ZT3D(ZWORK,IIU,IJU,IKU  )
+#endif
+
 !-------------------------------------------------------------------------------
 !
 !
@@ -225,6 +247,7 @@ IF ( CEQNSYS=='DUR' .OR. CEQNSYS=='MAE' ) THEN
   !
   !   compute the mixing ratio of the total water (ZRTOT)
     ZRTOT(:,:,:) = PRT(:,:,:,1)
+    !$acc loop seq 
     DO JWATER = 2 , 1+KRRL+KRRI                
       ZRTOT(:,:,:) = ZRTOT(:,:,:) + PRT(:,:,:,JWATER)
     END DO
@@ -365,6 +388,7 @@ ELSEIF( CEQNSYS == 'LHE' ) THEN
   !   compute the mixing ratio of the total water (ZRRTOT)
     ZRV_O_RD = XRV / XRD
     ZRTOT(:,:,:) = PRT(:,:,:,1)
+    !$acc loop seq
     DO JWATER = 2 , 1+KRRL+KRRI                
       ZRTOT(:,:,:) = ZRTOT(:,:,:) + PRT(:,:,:,JWATER)
     END DO
@@ -405,6 +429,11 @@ ELSEIF( CEQNSYS == 'LHE' ) THEN
   !
 END IF
 !
+#ifndef MNH_OPENACC
+DEALLOCATE (ZRTOT, ZRHOREF, ZWORK)
+#else
+CALL MNH_REL_ZT3D ( IZRTOT, IZRHOREF, IZWORK )
+#endif
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE P_ABS
-- 
GitLab