From adf7f115e5cd27c0bd3e65bea942bab518b28a61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Riette?= <sebastien.riette@meteo.fr> Date: Tue, 12 Dec 2023 13:43:18 +0100 Subject: [PATCH] S. Riette 12 Dec 2023: merge Ryad's optimisation of ice_adjust introduced in IAL --- src/common/micro/ice_adjust.F90 | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/common/micro/ice_adjust.F90 b/src/common/micro/ice_adjust.F90 index b480da710..611c3b17c 100644 --- a/src/common/micro/ice_adjust.F90 +++ b/src/common/micro/ice_adjust.F90 @@ -103,6 +103,7 @@ ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets !! 2020-12 U. Andrae : Introduce SPP for HARMONIE-AROME !! R. El Khatib 24-Aug-2021 Optimizations +!! R. El Khatib 24-Oct-2023 Re-vectorize ;-) !! !------------------------------------------------------------------------------- ! @@ -216,6 +217,8 @@ INTEGER :: IKTB, IKTE, IIJB, IIJE ! REAL, DIMENSION(D%NIJT,D%NKT) :: ZSIGS, ZSRCS REAL, DIMENSION(D%NIJT) :: ZSIGQSAT +LOGICAL :: LLNONE, LLTRIANGLE, LLHLC_H, LLHLI_H + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! !------------------------------------------------------------------------------- @@ -319,6 +322,13 @@ DO JK=IKTB,IKTE END IF ENDDO ELSE !NEBN%LSUBG_COND case + ! Tests on characters strings can break the vectorization, or at least they would + ! slow down considerably the performance of a vector loop. One should use tests on + ! reals, integers or booleans only. REK. + LLNONE=PARAMI%CSUBG_MF_PDF=='NONE' + LLTRIANGLE=PARAMI%CSUBG_MF_PDF=='TRIANGLE' + LLHLC_H=PRESENT(PHLC_HRC).AND.PRESENT(PHLC_HCF) + LLHLI_H=PRESENT(PHLI_HRI).AND.PRESENT(PHLI_HCF) DO JIJ=IIJB,IIJE !We limit PRC_MF+PRI_MF to PRVS*PTSTEP to avoid negative humidity ZW1=PRC_MF(JIJ,JK)/PTSTEP @@ -334,14 +344,14 @@ DO JK=IKTB,IKTE PTHS(JIJ,JK) = PTHS(JIJ,JK) + & (ZW1 * ZLV(JIJ,JK) + ZW2 * ZLS(JIJ,JK)) / ZCPH(JIJ,JK) / PEXNREF(JIJ,JK) ! - IF(PRESENT(PHLC_HRC) .AND. PRESENT(PHLC_HCF)) THEN + IF(LLHLC_H) THEN ZCRIAUT=ICEP%XCRIAUTC/PRHODREF(JIJ,JK) - IF(PARAMI%CSUBG_MF_PDF=='NONE')THEN + IF(LLNONE)THEN IF(ZW1*PTSTEP>PCF_MF(JIJ,JK) * ZCRIAUT) THEN PHLC_HRC(JIJ,JK)=PHLC_HRC(JIJ,JK)+ZW1*PTSTEP PHLC_HCF(JIJ,JK)=MIN(1.,PHLC_HCF(JIJ,JK)+PCF_MF(JIJ,JK)) ENDIF - ELSEIF(PARAMI%CSUBG_MF_PDF=='TRIANGLE')THEN + ELSEIF(LLTRIANGLE)THEN !ZHCF is the precipitating part of the *cloud* and not of the grid cell IF(ZW1*PTSTEP>PCF_MF(JIJ,JK)*ZCRIAUT) THEN ZHCF=1.-.5*(ZCRIAUT*PCF_MF(JIJ,JK) / MAX(1.E-20, ZW1*PTSTEP))**2 @@ -362,14 +372,14 @@ DO JK=IKTB,IKTE PHLC_HRC(JIJ,JK)=PHLC_HRC(JIJ,JK)+ZHR ENDIF ENDIF - IF(PRESENT(PHLI_HRI) .AND. PRESENT(PHLI_HCF)) THEN + IF(LLHLI_H) THEN ZCRIAUT=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(ZT(JIJ,JK)-CST%XTT)+ICEP%XBCRIAUTI)) - IF(PARAMI%CSUBG_MF_PDF=='NONE')THEN + IF(LLNONE)THEN IF(ZW2*PTSTEP>PCF_MF(JIJ,JK) * ZCRIAUT) THEN PHLI_HRI(JIJ,JK)=PHLI_HRI(JIJ,JK)+ZW2*PTSTEP PHLI_HCF(JIJ,JK)=MIN(1.,PHLI_HCF(JIJ,JK)+PCF_MF(JIJ,JK)) ENDIF - ELSEIF(PARAMI%CSUBG_MF_PDF=='TRIANGLE')THEN + ELSEIF(LLTRIANGLE)THEN !ZHCF is the precipitating part of the *cloud* and not of the grid cell IF(ZW2*PTSTEP>PCF_MF(JIJ,JK)*ZCRIAUT) THEN ZHCF=1.-.5*(ZCRIAUT*PCF_MF(JIJ,JK) / (ZW2*PTSTEP))**2 -- GitLab