From a5462c37e1184346adeb37a7d09ef5d999b9e3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Riette?= <sebastien.riette@meteo.fr> Date: Mon, 23 May 2022 18:24:50 +0200 Subject: [PATCH] S. Riette 23/05/2022 Revert ice4_nucleation For GPU, ice4_nucleation cannot be put in an include file as included subroutine must not contain local variables. --- src/common/micro/ice4_nucleation_elem.func.h | 110 ---------------- src/common/micro/mode_ice4_nucleation.F90 | 127 +++++++++++++++++++ src/common/micro/mode_ice4_tendencies.F90 | 14 +- src/common/micro/rain_ice.F90 | 27 ++-- 4 files changed, 147 insertions(+), 131 deletions(-) delete mode 100644 src/common/micro/ice4_nucleation_elem.func.h create mode 100644 src/common/micro/mode_ice4_nucleation.F90 diff --git a/src/common/micro/ice4_nucleation_elem.func.h b/src/common/micro/ice4_nucleation_elem.func.h deleted file mode 100644 index f9ef73991..000000000 --- a/src/common/micro/ice4_nucleation_elem.func.h +++ /dev/null @@ -1,110 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -ELEMENTAL SUBROUTINE ICE4_NUCLEATION_ELEM(ODCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) -! ******* TO BE INCLUDED IN THE *CONTAINS* OF A SUBROUTINE, IN ORDER TO EASE AUTOMATIC INLINING ****** -! => Don't use drHook !!! -! - -!! -!!** PURPOSE -!! ------- -!! Computes the nucleation -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -!! R. El Khatib 24-Aug-2021 Optimizations -!! S. Riette Feb 2022: as an include file -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMI, XGAMW, XMD, XMV, XTT, XEPSILO -USE MODD_PARAM_ICE, ONLY: LFEEDBACKT -USE MODD_RAIN_ICE_PARAM, ONLY: XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20 -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -LOGICAL, INTENT(IN) :: ODCOMPUTE -REAL, INTENT(IN) :: PTHT ! Theta at t -REAL, INTENT(IN) :: PPABST ! absolute pressure at t -REAL, INTENT(IN) :: PRHODREF! Reference density -REAL, INTENT(IN) :: PEXN ! Exner function -REAL, INTENT(IN) :: PLSFACT -REAL, INTENT(IN) :: PT ! Temperature at time t -REAL, INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation -! -!* 0.2 declaration of local variables -! -REAL :: ZW ! work array -LOGICAL :: GNEGT ! Test where to compute the HEN process -REAL :: ZZW, & ! Work scalar - ZUSW, & ! Undersaturation over water - ZSSI ! Supersaturation over ice -!------------------------------------------------------------------------------- -! -GNEGT=PT<XTT .AND. PRVT>XRTMIN(1) .AND. ODCOMPUTE - -PRVHENI_MR=0. -IF(GNEGT) THEN - ZZW=ALOG(PT) - ZUSW=EXP(XALPW - XBETAW/PT - XGAMW*ZZW) ! es_w - ZZW=EXP(XALPI - XBETAI/PT - XGAMI*ZZW) ! es_i - - ZZW=MIN(PPABST/2., ZZW) ! safety limitation - ZSSI=PRVT*(PPABST-ZZW) / (XEPSILO*ZZW) - 1.0 ! Supersaturation over ice - ZUSW=MIN(PPABST/2., ZUSW) ! safety limitation - ZUSW=(ZUSW/ZZW)*((PPABST-ZZW)/(PPABST-ZUSW)) - 1.0 - ! Supersaturation of saturated water vapor over ice - ! - !* 3.1 compute the heterogeneous nucleation source RVHENI - ! - !* 3.1.1 compute the cloud ice concentration - ! - ZSSI=MIN(ZSSI, ZUSW) ! limitation of SSi according to SSw=0 - - IF(PT<XTT-5. .AND. ZSSI>0.) THEN - ZZW=XNU20*EXP(XALPHA2*ZSSI-XBETA2) - ELSEIF(PT<=XTT-2. .AND. PT>=XTT-5. .AND. ZSSI>0.) THEN - ZZW=MAX(XNU20*EXP(-XBETA2 ), & - XNU10*EXP(-XBETA1*(PT-XTT))*(ZSSI/ZUSW)**XALPHA1) - ELSE - ZZW=0. - ENDIF - - ZZW=ZZW-PCIT - ZZW=MIN(ZZW, 50.E3) ! limitation provisoire a 50 l^-1 - ! - !* 3.1.2 update the r_i and r_v mixing ratios - ! - PRVHENI_MR=MAX(ZZW, 0.0)*XMNU0/PRHODREF - PRVHENI_MR=MIN(PRVT, PRVHENI_MR) - ! - !Limitation due to 0 crossing of temperature - ! - IF(LFEEDBACKT) THEN - ZW=MIN(PRVHENI_MR, MAX(0., (XTT/PEXN-PTHT)/PLSFACT)) / & - MAX(PRVHENI_MR, 1.E-20) - PRVHENI_MR=PRVHENI_MR*ZW - ZZW=ZZW*ZW - ENDIF - ! - PCIT=MAX(ZZW+PCIT, PCIT) -ENDIF -! -END SUBROUTINE ICE4_NUCLEATION_ELEM diff --git a/src/common/micro/mode_ice4_nucleation.F90 b/src/common/micro/mode_ice4_nucleation.F90 new file mode 100644 index 000000000..7d5423327 --- /dev/null +++ b/src/common/micro/mode_ice4_nucleation.F90 @@ -0,0 +1,127 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODE_ICE4_NUCLEATION +IMPLICIT NONE +CONTAINS +SUBROUTINE ICE4_NUCLEATION(KSIZE, ODCOMPUTE, & + PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & + PRVT, & + PCIT, PRVHENI_MR) +!! +!!** PURPOSE +!! ------- +!! Computes the nucleation +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +!! R. El Khatib 24-Aug-2021 Optimizations +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMI, XGAMW, XMD, XMV, XTT, XEPSILO +USE MODD_PARAM_ICE, ONLY: LFEEDBACKT +USE MODD_RAIN_ICE_PARAM, ONLY: XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20 +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: ODCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature at time t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZW ! work array +REAL(KIND=JPRB) :: ZHOOK_HANDLE +LOGICAL, DIMENSION(KSIZE) :: GNEGT ! Test where to compute the HEN process +REAL, DIMENSION(KSIZE) :: ZZW, & ! Work array + ZUSW, & ! Undersaturation over water + ZSSI ! Supersaturation over ice +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 0, ZHOOK_HANDLE)! +! +GNEGT(:)=PT(:)<XTT .AND. PRVT(:)>XRTMIN(1) .AND. ODCOMPUTE(:) + +ZUSW(:)=0. +ZZW(:)=0. +WHERE(GNEGT(:)) + ZZW(:)=ALOG(PT(:)) + ZUSW(:)=EXP(XALPW - XBETAW/PT(:) - XGAMW*ZZW(:)) ! es_w + ZZW(:)=EXP(XALPI - XBETAI/PT(:) - XGAMI*ZZW(:)) ! es_i +END WHERE + +ZSSI(:)=0. +WHERE(GNEGT(:)) + ZZW(:)=MIN(PPABST(:)/2., ZZW(:)) ! safety limitation + ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / (XEPSILO*ZZW(:)) - 1.0 + ! Supersaturation over ice + ZUSW(:)=MIN(PPABST(:)/2., ZUSW(:)) ! safety limitation + ZUSW(:)=(ZUSW(:)/ZZW(:))*((PPABST(:)-ZZW(:))/(PPABST(:)-ZUSW(:))) - 1.0 + ! Supersaturation of saturated water vapor over ice + ! + !* 3.1 compute the heterogeneous nucleation source RVHENI + ! + !* 3.1.1 compute the cloud ice concentration + ! + ZSSI(:)=MIN(ZSSI(:), ZUSW(:)) ! limitation of SSi according to SSw=0 +END WHERE + +ZZW(:)=0. +WHERE(GNEGT(:) .AND. PT(:)<XTT-5.0 .AND. ZSSI(:)>0.0 ) + ZZW(:)=XNU20*EXP(XALPHA2*ZSSI(:)-XBETA2) +ELSEWHERE(GNEGT(:) .AND. PT(:)<=XTT-2.0 .AND. PT(:)>=XTT-5.0 .AND. ZSSI(:)>0.0) + ZZW(:)=MAX(XNU20*EXP(-XBETA2 ), & + XNU10*EXP(-XBETA1*(PT(:)-XTT))*(ZSSI(:)/ZUSW(:))**XALPHA1) +END WHERE +WHERE(GNEGT(:)) + ZZW(:)=ZZW(:)-PCIT(:) + ZZW(:)=MIN(ZZW(:), 50.E3) ! limitation provisoire a 50 l^-1 +END WHERE + +PRVHENI_MR(:)=0. +WHERE(GNEGT(:)) + ! + !* 3.1.2 update the r_i and r_v mixing ratios + ! + PRVHENI_MR(:)=MAX(ZZW(:), 0.0)*XMNU0/PRHODREF(:) + PRVHENI_MR(:)=MIN(PRVT(:), PRVHENI_MR(:)) +END WHERE +!Limitation due to 0 crossing of temperature +IF(LFEEDBACKT) THEN + ZW(:)=0. + WHERE(GNEGT(:)) + ZW(:)=MIN(PRVHENI_MR(:), & + MAX(0., (XTT/PEXN(:)-PTHT(:))/PLSFACT(:))) / & + MAX(PRVHENI_MR(:), 1.E-20) + END WHERE + PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) + ZZW(:)=ZZW(:)*ZW(:) +ENDIF +PCIT(:)=MAX(ZZW(:)+PCIT(:), PCIT(:)) +! +IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 1, ZHOOK_HANDLE) +END SUBROUTINE ICE4_NUCLEATION +END MODULE MODE_ICE4_NUCLEATION diff --git a/src/common/micro/mode_ice4_tendencies.F90 b/src/common/micro/mode_ice4_tendencies.F90 index 047e481c5..e00c28266 100644 --- a/src/common/micro/mode_ice4_tendencies.F90 +++ b/src/common/micro/mode_ice4_tendencies.F90 @@ -75,6 +75,7 @@ USE MODE_ICE4_FAST_RS, ONLY: ICE4_FAST_RS USE MODE_ICE4_FAST_RG, ONLY: ICE4_FAST_RG USE MODE_ICE4_FAST_RH, ONLY: ICE4_FAST_RH USE MODE_ICE4_FAST_RI, ONLY: ICE4_FAST_RI +USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION ! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -206,13 +207,10 @@ ELSE ! !* 2. COMPUTES THE SLOW COLD PROCESS SOURCES ! -------------------------------------- -!DIR$ VECTOR ALWAYS - DO CONCURRENT (JL=1:KSIZE) - CALL ICE4_NUCLEATION_ELEM(LLCOMPUTE(JL), & - ZVART(JL,ITH), PPRES(JL), PRHODREF(JL), PEXN(JL), PLSFACT(JL), ZT(JL), & - ZVART(JL,IRV), & - PCIT(JL), PRVHENI_MR(JL)) - ENDDO + CALL ICE4_NUCLEATION(KSIZE, LLCOMPUTE(:), & + ZVART(:,ITH), PPRES(:), PRHODREF(:), PEXN(:), PLSFACT(:), ZT(:), & + ZVART(:,IRV), & + PCIT(:), PRVHENI_MR(:)) DO JL=1, KSIZE ZVART(JL,ITH)=ZVART(JL,ITH) + PRVHENI_MR(JL)*PLSFACT(JL) ZT(JL) = ZVART(JL,ITH) * PEXN(JL) @@ -492,7 +490,5 @@ CALL ICE4_FAST_RI(KSIZE, ODSOFT, PCOMPUTE, & ! IF (LHOOK) CALL DR_HOOK('ICE4_TENDENCIES', 1, ZHOOK_HANDLE) ! -CONTAINS -INCLUDE "ice4_nucleation_elem.func.h" END SUBROUTINE ICE4_TENDENCIES END MODULE MODE_ICE4_TENDENCIES diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90 index 9894bc0bf..3f2e20f3b 100644 --- a/src/common/micro/rain_ice.F90 +++ b/src/common/micro/rain_ice.F90 @@ -207,6 +207,7 @@ USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES +USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION ! IMPLICIT NONE ! @@ -434,7 +435,9 @@ REAL :: ZDEVIDE, ZX, ZRICE ! INTEGER :: IC, JMICRO LOGICAL :: LLSIGMA_RC, LL_ANY_ITER, LL_AUCV_ADJU - +! +REAL, DIMENSION(KIT,KJT,KKT) :: ZW3D +LOGICAL, DIMENSION(KIT,KJT,KKT) :: LLW3D ! !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE) @@ -1115,21 +1118,23 @@ PCIT(:,:,:)=ZCITOUT(:,:,:) !* 6. COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS ! ---------------------------------------------------------------- ! -DO JK=1, KKT +DO JK=1, KKT DO JJ=1, KJT -!DIR$ VECTOR ALWAYS - DO CONCURRENT (JI=1:KIT) + DO JI=1, KIT IF (.NOT. ODMICRO(JI, JJ, JK)) THEN - ZW0D=ZZ_LSFACT(JI, JJ, JK)/PEXN(JI, JJ, JK) + LLW3D(JI, JJ, JK)=.TRUE. + ZW3D(JI, JJ, JK)=ZZ_LSFACT(JI, JJ, JK)/PEXN(JI, JJ, JK) + ELSE + LLW3D(JI, JJ, JK)=.FALSE. ENDIF - CALL ICE4_NUCLEATION_ELEM(.NOT. ODMICRO(JI, JJ, JK), & - PTHT(JI, JJ, JK), PPABST(JI, JJ, JK), PRHODREF(JI, JJ, JK), & - PEXN(JI, JJ, JK), ZW0D, ZT(JI, JJ, JK), & - PRVT(JI, JJ, JK), & - PCIT(JI, JJ, JK), ZZ_RVHENI_MR(JI, JJ, JK)) ENDDO ENDDO ENDDO +CALL ICE4_NUCLEATION(KIT*KJT*KKT, LLW3D(:,:,:), & + PTHT(:, :, :), PPABST(:, :, :), PRHODREF(:, :, :), & + PEXN(:, :, :), ZW3D(:, :, :), ZT(:, :, :), & + PRVT(:, :, :), & + PCIT(:, :, :), ZZ_RVHENI_MR(:, :, :)) ! !------------------------------------------------------------------------------- ! @@ -1808,6 +1813,4 @@ CONTAINS ! END SUBROUTINE CORRECT_NEGATIVITIES ! -INCLUDE "ice4_nucleation_elem.func.h" -! END SUBROUTINE RAIN_ICE -- GitLab