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