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 32c89bc74f05b320197a43fb3531c7437ded6111..0000000000000000000000000000000000000000 --- a/src/common/micro/ice4_nucleation_elem.func.h +++ /dev/null @@ -1,114 +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(CST, PARAMI, ICEP, ICED, 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: CST_t -USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t -USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t -USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -TYPE(CST_t), INTENT(IN) :: CST -TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI -TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP -TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED -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<CST%XTT .AND. PRVT>ICED%XRTMIN(1) .AND. ODCOMPUTE - -PRVHENI_MR=0. -IF(GNEGT) THEN - ZZW=ALOG(PT) - ZUSW=EXP(CST%XALPW - CST%XBETAW/PT - CST%XGAMW*ZZW) ! es_w - ZZW=EXP(CST%XALPI - CST%XBETAI/PT - CST%XGAMI*ZZW) ! es_i - - ZZW=MIN(PPABST/2., ZZW) ! safety limitation - ZSSI=PRVT*(PPABST-ZZW) / (CST%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<CST%XTT-5. .AND. ZSSI>0.) THEN - ZZW=ICEP%XNU20*EXP(ICEP%XALPHA2*ZSSI-ICEP%XBETA2) - ELSEIF(PT<=CST%XTT-2. .AND. PT>=CST%XTT-5. .AND. ZSSI>0.) THEN - ZZW=MAX(ICEP%XNU20*EXP(-ICEP%XBETA2 ), & - ICEP%XNU10*EXP(-ICEP%XBETA1*(PT-CST%XTT))*(ZSSI/ZUSW)**ICEP%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)*ICEP%XMNU0/PRHODREF - PRVHENI_MR=MIN(PRVT, PRVHENI_MR) - ! - !Limitation due to 0 crossing of temperature - ! - IF(PARAMI%LFEEDBACKT) THEN - ZW=MIN(PRVHENI_MR, MAX(0., (CST%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 0000000000000000000000000000000000000000..1ba3335b97e17fe3c7384fd210aebf21fe3d3e04 --- /dev/null +++ b/src/common/micro/mode_ice4_nucleation.F90 @@ -0,0 +1,148 @@ +!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(CST, PARAMI, ICEP, ICED, 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: CST_t +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t +USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +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 +INTEGER :: JI +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 0, ZHOOK_HANDLE)! +! +!$mnh_expand_where(JI=1:KSIZE) +GNEGT(:)=PT(:)<CST%XTT .AND. PRVT(:)>ICED%XRTMIN(1) .AND. ODCOMPUTE(:) +!$mnh_end_expand_where(JI=1:KSIZE) + +ZUSW(:)=0. +ZZW(:)=0. +!$mnh_expand_where(JI=1:KSIZE) +WHERE(GNEGT(:)) + ZZW(:)=ALOG(PT(:)) + ZUSW(:)=EXP(CST%XALPW - CST%XBETAW/PT(:) - CST%XGAMW*ZZW(:)) ! es_w + ZZW(:)=EXP(CST%XALPI - CST%XBETAI/PT(:) - CST%XGAMI*ZZW(:)) ! es_i +END WHERE +!$mnh_end_expand_where(JI=1:KSIZE) + +ZSSI(:)=0. +!$mnh_expand_where(JI=1:KSIZE) +WHERE(GNEGT(:)) + ZZW(:)=MIN(PPABST(:)/2., ZZW(:)) ! safety limitation + ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / (CST%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 +!$mnh_end_expand_where(JI=1:KSIZE) + +ZZW(:)=0. +!$mnh_expand_where(JI=1:KSIZE) +WHERE(GNEGT(:) .AND. PT(:)<CST%XTT-5.0 .AND. ZSSI(:)>0.0 ) + ZZW(:)=ICEP%XNU20*EXP(ICEP%XALPHA2*ZSSI(:)-ICEP%XBETA2) +ELSEWHERE(GNEGT(:) .AND. PT(:)<=CST%XTT-2.0 .AND. PT(:)>=CST%XTT-5.0 .AND. ZSSI(:)>0.0) + ZZW(:)=MAX(ICEP%XNU20*EXP(-ICEP%XBETA2 ), & + ICEP%XNU10*EXP(-ICEP%XBETA1*(PT(:)-CST%XTT))*(ZSSI(:)/ZUSW(:))**ICEP%XALPHA1) +END WHERE +!$mnh_end_expand_where(JI=1:KSIZE) +!$mnh_expand_where(JI=1:KSIZE) +WHERE(GNEGT(:)) + ZZW(:)=ZZW(:)-PCIT(:) + ZZW(:)=MIN(ZZW(:), 50.E3) ! limitation provisoire a 50 l^-1 +END WHERE +!$mnh_end_expand_where(JI=1:KSIZE) + +PRVHENI_MR(:)=0. +!$mnh_expand_where(JI=1:KSIZE) +WHERE(GNEGT(:)) + ! + !* 3.1.2 update the r_i and r_v mixing ratios + ! + PRVHENI_MR(:)=MAX(ZZW(:), 0.0)*ICEP%XMNU0/PRHODREF(:) + PRVHENI_MR(:)=MIN(PRVT(:), PRVHENI_MR(:)) +END WHERE +!$mnh_end_expand_where(JI=1:KSIZE) +!Limitation due to 0 crossing of temperature +IF(PARAMI%LFEEDBACKT) THEN + ZW(:)=0. + !$mnh_expand_where(JI=1:KSIZE) + WHERE(GNEGT(:)) + ZW(:)=MIN(PRVHENI_MR(:), & + MAX(0., (CST%XTT/PEXN(:)-PTHT(:))/PLSFACT(:))) / & + MAX(PRVHENI_MR(:), 1.E-20) + END WHERE + PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) + ZZW(:)=ZZW(:)*ZW(:) + !$mnh_end_expand_where(JI=1:KSIZE) +ENDIF +!$mnh_expand_where(JI=1:KSIZE) +PCIT(:)=MAX(ZZW(:)+PCIT(:), PCIT(:)) +!$mnh_end_expand_where(JI=1:KSIZE) +! +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 346a3eb494e34a17ded77597bd5d61d691e06d6a..5cdcfcba54cf8d5c0b1814f8467ae2f10e71826c 100644 --- a/src/common/micro/mode_ice4_tendencies.F90 +++ b/src/common/micro/mode_ice4_tendencies.F90 @@ -76,6 +76,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 @@ -211,13 +212,10 @@ ELSE ! !* 2. COMPUTES THE SLOW COLD PROCESS SOURCES ! -------------------------------------- -!DIR$ VECTOR ALWAYS - DO CONCURRENT (JL=1:KSIZE) - CALL ICE4_NUCLEATION_ELEM(CST, PARAMI, ICEP, ICED, LDCOMPUTE(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(CST, PARAMI, ICEP, ICED, KSIZE, LDCOMPUTE(:), & + 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) @@ -610,7 +608,5 @@ ENDDO ! 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 657f11f458986d9cea510fd46e49ba27b7bb5524..a38ae64d0b1f00b13b6ee52cb33aa25ec62ec9c2 100644 --- a/src/common/micro/rain_ice.F90 +++ b/src/common/micro/rain_ice.F90 @@ -206,6 +206,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 ! @@ -426,7 +427,9 @@ REAL :: ZDEVIDE, ZX, ZRICE ! INTEGER :: IC, JMICRO LOGICAL :: LLSIGMA_RC, LL_ANY_ITER, LL_AUCV_ADJU - +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: ZW3D +LOGICAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: LLW3D ! !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE) @@ -1106,19 +1109,21 @@ PCIT(:,:,:)=ZCITOUT(:,:,:) ! DO JK=D%NKTB,D%NKTE DO JJ=D%NJB,D%NJE -!DIR$ VECTOR ALWAYS - DO CONCURRENT (JI=D%NIB:D%NIE) + DO JI=D%NIB,D%NIE 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(CST, PARAMI, ICEP, ICED, .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(CST, PARAMI, ICEP, ICED, D%NIT*D%NJT*D%NKT, LLW3D(:,:,:), & + PTHT(:, :, :), PPABST(:, :, :), PRHODREF(:, :, :), & + PEXN(:, :, :), ZW3D(:, :, :), ZT(:, :, :), & + PRVT(:, :, :), & + PCIT(:, :, :), ZZ_RVHENI_MR(:, :, :)) ! !------------------------------------------------------------------------------- ! @@ -1811,6 +1816,4 @@ CONTAINS ! END SUBROUTINE CORRECT_NEGATIVITIES ! -INCLUDE "ice4_nucleation_elem.func.h" -! END SUBROUTINE RAIN_ICE