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