diff --git a/docs/TODO b/docs/TODO index 32bfd81be2f219b3dd33705f9dcc4b8557fde4ac..cf5bc57274f710708c0a1fdf457ab2fae2319eb8 100644 --- a/docs/TODO +++ b/docs/TODO @@ -17,12 +17,6 @@ Clé de compilation REPRO48 ajoutée pour permettre de reproduire le cycle 48, e Cette clé devra être supprimée Merge pb: -- ice4_nucleation_wrapper: - Tableaux allocatable introduits par Philippe dans meso-nh. - Pas introduits (pour l'instant?) dans version common. - Ryad a fait des tests pour regarder impact des allocatable sur CPU => temps * 2 - Code à nettoyer quelque soit l'option retenue - Dernier code de Ryad: /home/gmap/mrpm/khatib/public/modset/mods_ice4_nucleation_wrapper.tgz et/ou /home/gmap/mrpm/khatib/public/modset/ice4_nucleation_wrapper.f90 - shallow_mf (appels dans aro_shallow et arp_shallow): Dans Méso-NH: shallow_mf doit être appelé avec PDX=XDXHAT(1) et PDY=XDYHAT(1) Dans AROME/ARP: où trouver la taille de maille? @@ -36,7 +30,6 @@ Etape 2: array syntax -> loop - transformer sedimentation_split_momentum comme sedimentation_split - une distinction KSIZE/KPROMA est à faire dans la microphysique. Pour une meilleure compréhension du code, il faut partir du principe de déclarer tous les tableaux en KPROMA et de les utiliser que jusqu'à KSIZE -- essayer l'outil développé par Juan Pb identifiés à corriger plus tard: - deposition devrait être déplacée dans ice4_tendencies diff --git a/src/common/micro/ice4_nucleation_elem.func.h b/src/common/micro/ice4_nucleation_elem.func.h index f9ef73991cae536f9e15786a60d153b783da3c69..32c89bc74f05b320197a43fb3531c7437ded6111 100644 --- a/src/common/micro/ice4_nucleation_elem.func.h +++ b/src/common/micro/ice4_nucleation_elem.func.h @@ -2,7 +2,7 @@ !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, & +ELEMENTAL SUBROUTINE ICE4_NUCLEATION_ELEM(CST, PARAMI, ICEP, ICED, ODCOMPUTE, & PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & PRVT, & PCIT, PRVHENI_MR) @@ -29,15 +29,19 @@ ELEMENTAL SUBROUTINE ICE4_NUCLEATION_ELEM(ODCOMPUTE, & !* 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 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 @@ -58,16 +62,16 @@ REAL :: ZZW, & ! Work scalar ZSSI ! Supersaturation over ice !------------------------------------------------------------------------------- ! -GNEGT=PT<XTT .AND. PRVT>XRTMIN(1) .AND. ODCOMPUTE +GNEGT=PT<CST%XTT .AND. PRVT>ICED%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 + 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) / (XEPSILO*ZZW) - 1.0 ! Supersaturation over ice + 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 @@ -78,11 +82,11 @@ IF(GNEGT) THEN ! 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) + 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 @@ -92,13 +96,13 @@ IF(GNEGT) THEN ! !* 3.1.2 update the r_i and r_v mixing ratios ! - PRVHENI_MR=MAX(ZZW, 0.0)*XMNU0/PRHODREF + PRVHENI_MR=MAX(ZZW, 0.0)*ICEP%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)) / & + 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 diff --git a/src/common/micro/mode_ice4_compute_pdf.F90 b/src/common/micro/mode_ice4_compute_pdf.F90 index 411cdddad26897dcf9f0fbc50c4a4459fdf946e7..ab0851d54b60af84c1a22e09ed1446c1ad6e91d2 100644 --- a/src/common/micro/mode_ice4_compute_pdf.F90 +++ b/src/common/micro/mode_ice4_compute_pdf.F90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_COMPUTE_PDF IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & +SUBROUTINE ICE4_COMPUTE_PDF(CST, ICEP, ICED, KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & PRHODREF, PRCT, PRIT, PCF, PT, PSIGMA_RC,& PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, & PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRF) @@ -28,11 +28,11 @@ SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & ! ------------ ! ! +USE MODD_CST, ONLY: CST_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 -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: XCRIAUTC, XBCRIAUTI, XACRIAUTI, XCRIAUTI -USE MODD_CST, ONLY : XTT ! USE MODE_MSG ! @@ -40,6 +40,9 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KSIZE CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method for cloud water CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method for cloud ice @@ -81,7 +84,7 @@ INTEGER :: JI IF (LHOOK) CALL DR_HOOK('ICE4_COMPUTE_PDF', 0, ZHOOK_HANDLE)! !Cloud water split between high and low content part is done according to autoconversion option -ZRCRAUTC(:)=XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold +ZRCRAUTC(:)=ICEP%XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold IF(HSUBG_AUCV_RC=='NONE') THEN !Cloud water is entirely in low or high part !$mnh_expand_where(JI=1:KSIZE) @@ -90,7 +93,7 @@ IF(HSUBG_AUCV_RC=='NONE') THEN PHLC_LCF(:)=0. PHLC_HRC(:)=PRCT(:) PHLC_LRC(:)=0. - ELSEWHERE(PRCT(:)>XRTMIN(2)) + ELSEWHERE(PRCT(:)>ICED%XRTMIN(2)) PHLC_HCF(:)=0. PHLC_LCF(:)=1. PHLC_HRC(:)=0. @@ -111,7 +114,7 @@ ELSEIF(HSUBG_AUCV_RC=='CLFR') THEN PHLC_LCF(:)=0. PHLC_HRC(:)=PRCT(:) PHLC_LRC(:)=0. - ELSEWHERE(PCF(:)>0. .AND. PRCT(:)>XRTMIN(2)) + ELSEWHERE(PCF(:)>0. .AND. PRCT(:)>ICED%XRTMIN(2)) PHLC_HCF(:)=0. PHLC_LCF(:)=PCF(:) PHLC_HRC(:)=0.0 @@ -158,7 +161,7 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN &(PRCT(:)+PSIGMA_RC(:)+ZRCRAUTC(:))/ & &(4.*PSIGMA_RC(:)) PHLC_LRC(:)=MAX(0., PRCT(:)-PHLC_HRC(:)) - ELSEWHERE(PRCT(:)>XRTMIN(2) .AND. PCF(:)>0.) + ELSEWHERE(PRCT(:)>ICED%XRTMIN(2) .AND. PCF(:)>0.) PHLC_HCF(:)=0. PHLC_LCF(:)=PCF(:) PHLC_HRC(:)=0. @@ -258,7 +261,7 @@ ENDIF ! !Ice water split between high and low content part is done according to autoconversion option !$mnh_expand_where(JI=1:KSIZE) - ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) ! Autoconversion ri threshold + ZCRIAUTI(:)=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(PT(:)-CST%XTT)+ICEP%XBCRIAUTI)) ! Autoconversion ri threshold !$mnh_end_expand_where(JI=1:KSIZE) IF(HSUBG_AUCV_RI=='NONE') THEN !$mnh_expand_where(JI=1:KSIZE) @@ -277,7 +280,7 @@ IF(HSUBG_AUCV_RI=='NONE') THEN PHLI_LCF(:)=0. PHLI_HRI(:)=PRIT(:) PHLI_LRI(:)=0. - ELSEWHERE(PRIT(:)>XRTMIN(4)) + ELSEWHERE(PRIT(:)>ICED%XRTMIN(4)) PHLI_HCF(:)=0. PHLI_LCF(:)=1. PHLI_HRI(:)=0. @@ -298,7 +301,7 @@ ELSEIF(HSUBG_AUCV_RI=='CLFR') THEN PHLI_LCF(:)=0. PHLI_HRI(:)=PRIT(:) PHLI_LRI(:)=0. - ELSEWHERE(PCF(:)>0. .AND. PRIT(:)>XRTMIN(4)) + ELSEWHERE(PCF(:)>0. .AND. PRIT(:)>ICED%XRTMIN(4)) PHLI_HCF(:)=0. PHLI_LCF(:)=PCF(:) PHLI_HRI(:)=0.0 diff --git a/src/common/micro/mode_ice4_fast_rg.F90 b/src/common/micro/mode_ice4_fast_rg.F90 index c55e068823b4dd9599b28bfc0f127434071979da..b441822f5bbd6a96ef806cdc41350ae6625ea2a9 100644 --- a/src/common/micro/mode_ice4_fast_rg.F90 +++ b/src/common/micro/mode_ice4_fast_rg.F90 @@ -5,7 +5,7 @@ MODULE MODE_ICE4_FAST_RG IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_FAST_RG(KPROMA,KSIZE, LDSOFT, PCOMPUTE, KRR, & +SUBROUTINE ICE4_FAST_RG(CST, PARAMI, ICEP, ICED, KPROMA,KSIZE, LDSOFT, PCOMPUTE, KRR, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &PDV, PKA, PCJ, PCIT, & &PLBDAR, PLBDAS, PLBDAG, & @@ -36,15 +36,10 @@ SUBROUTINE ICE4_FAST_RG(KPROMA,KSIZE, LDSOFT, PCOMPUTE, KRR, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMW, XCI, XCL, XCPV, XESTT, XGAMI, & - & XLMTT, XLVTT, XMD, XMV, XRV, XTT, XEPSILO -USE MODD_PARAM_ICE, ONLY: LCRFLIMIT, LEVLIMIT, LNULLWETG, LWETGPOST -USE MODD_RAIN_ICE_DESCR, ONLY: XBS, XCEXVT, XCXG, XCXS, XDG, XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: NDRYLBDAG, NDRYLBDAR, NDRYLBDAS, X0DEPG, X1DEPG, XCOLEXIG, XCOLEXSG, XCOLIG, & - & XCOLSG, XDRYINTP1G, XDRYINTP1R, XDRYINTP1S, XDRYINTP2G, XDRYINTP2R, XDRYINTP2S, & - & XEX0DEPG, XEX1DEPG, XEXICFRR, XEXRCFRI, XFCDRYG, XFIDRYG, XFRDRYG, & - & XFSDRYG, XICFRR, XKER_RDRYG, XKER_SDRYG, XLBRDRYG1, XLBRDRYG2, XLBRDRYG3, & - & XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XRCFRI +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 ! @@ -52,6 +47,10 @@ 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) :: KPROMA,KSIZE LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE @@ -127,8 +126,8 @@ IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RG', 0, ZHOOK_HANDLE) !* 6.1 rain contact freezing ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) + &MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -141,21 +140,21 @@ ELSE PRICFRRG(:)=0. PRRCFRIG(:)=0. WHERE(ZMASK(:)==1.) - PRICFRRG(:) = XICFRR*PRIT(:) & ! RICFRRG - *PLBDAR(:)**XEXICFRR & - *PRHODREF(:)**(-XCEXVT) - PRRCFRIG(:) = XRCFRI*PCIT(:) & ! RRCFRIG - * PLBDAR(:)**XEXRCFRI & - * PRHODREF(:)**(-XCEXVT-1.) + PRICFRRG(:) = ICEP%XICFRR*PRIT(:) & ! RICFRRG + *PLBDAR(:)**ICEP%XEXICFRR & + *PRHODREF(:)**(-ICED%XCEXVT) + PRRCFRIG(:) = ICEP%XRCFRI*PCIT(:) & ! RRCFRIG + * PLBDAR(:)**ICEP%XEXRCFRI & + * PRHODREF(:)**(-ICED%XCEXVT-1.) END WHERE - IF(LCRFLIMIT) THEN + IF(PARAMI%LCRFLIMIT) THEN DO JL=1, KSIZE !Comparison between heat to be released (to freeze rain) and heat sink (rain and ice temperature change) !ZZW is the proportion of process that can take place ZZW(JL)=(1.-ZMASK(JL)) + & ! 1. outside of mask - ZMASK(JL) * MAX(0., MIN(1., (PRICFRRG(JL)*XCI+PRRCFRIG(JL)*XCL)*(XTT-PT(JL)) / & - MAX(1.E-20, XLVTT*PRRCFRIG(JL)))) + ZMASK(JL) * MAX(0., MIN(1., (PRICFRRG(JL)*CST%XCI+PRRCFRIG(JL)*CST%XCL)*(CST%XTT-PT(JL)) / & + MAX(1.E-20, CST%XLVTT*PRRCFRIG(JL)))) ENDDO ELSE ZZW(:)=1. @@ -172,8 +171,8 @@ ENDIF ! ! Wet and dry collection of rc and ri on graupel DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &MAX(0., -SIGN(1., ICED%XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -183,16 +182,16 @@ IF(LDSOFT) THEN ELSE ZZW(:)=0. WHERE(ZMASK(:)==1.) - ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) + ZZW(:)=PLBDAG(:)**(ICED%XCXG-ICED%XDG-2.) * PRHODREF(:)**(-ICED%XCEXVT) END WHERE DO JL=1, KSIZE - PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*XFCDRYG * PRCT(JL) * ZZW(JL) + PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*ICEP%XFCDRYG * PRCT(JL) * ZZW(JL) ENDDO ENDIF DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &MAX(0., -SIGN(1., ICED%XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -204,17 +203,17 @@ ELSE PRG_TEND(:, IRIDRYG)=0. PRG_TEND(:, IRIWETG)=0. WHERE(ZMASK(1:KSIZE)==1.) - ZZW(1:KSIZE)=PLBDAG(1:KSIZE)**(XCXG-XDG-2.) * PRHODREF(1:KSIZE)**(-XCEXVT) - PRG_TEND(1:KSIZE, IRIDRYG)=XFIDRYG*EXP(XCOLEXIG*(PT(1:KSIZE)-XTT))*PRIT(1:KSIZE)*ZZW(1:KSIZE) - PRG_TEND(1:KSIZE, IRIWETG)=PRG_TEND(1:KSIZE, IRIDRYG) / (XCOLIG*EXP(XCOLEXIG*(PT(1:KSIZE)-XTT))) + ZZW(1:KSIZE)=PLBDAG(1:KSIZE)**(ICED%XCXG-ICED%XDG-2.) * PRHODREF(1:KSIZE)**(-ICED%XCEXVT) + PRG_TEND(1:KSIZE, IRIDRYG)=ICEP%XFIDRYG*EXP(ICEP%XCOLEXIG*(PT(1:KSIZE)-CST%XTT))*PRIT(1:KSIZE)*ZZW(1:KSIZE) + PRG_TEND(1:KSIZE, IRIWETG)=PRG_TEND(1:KSIZE, IRIDRYG) / (ICEP%XCOLIG*EXP(ICEP%XCOLEXIG*(PT(1:KSIZE)-CST%XTT))) END WHERE ENDIF ! Wet and dry collection of rs on graupel (6.2.1) IGDRY = 0 DO JJ = 1, KSIZE - ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + ZDRY(JJ)=MAX(0., -SIGN(1., ICED%XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) + &MAX(0., -SIGN(1., ICED%XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) &PCOMPUTE(JJ) IF (ZDRY(JJ)>0) THEN IGDRY = IGDRY + 1 @@ -245,13 +244,13 @@ ELSE ! in the geometrical set of (Lbda_g,Lbda_s) couplet use to ! tabulate the SDRYG-kernel ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN(REAL(NDRYLBDAG)-0.00001, & - XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) + ZVEC1(1:IGDRY)=MAX(1.00001, MIN(REAL(ICEP%NDRYLBDAG)-0.00001, & + ICEP%XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+ICEP%XDRYINTP2G)) IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY) ) ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAS)-0.00001, & - XDRYINTP1S*LOG(ZVEC2(1:IGDRY))+XDRYINTP2S)) + ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(ICEP%NDRYLBDAS)-0.00001, & + ICEP%XDRYINTP1S*LOG(ZVEC2(1:IGDRY))+ICEP%XDRYINTP2S)) IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) ! @@ -259,11 +258,11 @@ ELSE ! SDRYG-kernel ! DO JJ=1, IGDRY - ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + ZVEC3(JJ) = ( ICEP%XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + - ( ICEP%XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & *(ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. @@ -272,14 +271,14 @@ ELSE END DO ! WHERE(GDRY(1:KSIZE)) - PRG_TEND(1:KSIZE, IRSWETG)=XFSDRYG*ZZW(1:KSIZE) & ! RSDRYG - / XCOLSG & - *(PLBDAS(1:KSIZE)**(XCXS-XBS))*( PLBDAG(1:KSIZE)**XCXG ) & - *(PRHODREF(1:KSIZE)**(-XCEXVT-1.)) & - *( XLBSDRYG1/( PLBDAG(1:KSIZE)**2 ) + & - XLBSDRYG2/( PLBDAG(1:KSIZE) * PLBDAS(1:KSIZE) ) + & - XLBSDRYG3/( PLBDAS(1:KSIZE)**2)) - PRG_TEND(1:KSIZE, IRSDRYG)=PRG_TEND(1:KSIZE, IRSWETG)*XCOLSG*EXP(XCOLEXSG*(PT(1:KSIZE)-XTT)) + PRG_TEND(1:KSIZE, IRSWETG)=ICEP%XFSDRYG*ZZW(1:KSIZE) & ! RSDRYG + / ICEP%XCOLSG & + *(PLBDAS(1:KSIZE)**(ICED%XCXS-ICED%XBS))*( PLBDAG(1:KSIZE)**ICED%XCXG ) & + *(PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.)) & + *( ICEP%XLBSDRYG1/( PLBDAG(1:KSIZE)**2 ) + & + ICEP%XLBSDRYG2/( PLBDAG(1:KSIZE) * PLBDAS(1:KSIZE) ) + & + ICEP%XLBSDRYG3/( PLBDAS(1:KSIZE)**2)) + PRG_TEND(1:KSIZE, IRSDRYG)=PRG_TEND(1:KSIZE, IRSWETG)*ICEP%XCOLSG*EXP(ICEP%XCOLEXSG*(PT(1:KSIZE)-CST%XTT)) END WHERE ENDIF ENDIF @@ -288,8 +287,8 @@ ENDIF ! IGDRY = 0 DO JJ = 1, KSIZE - ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + ZDRY(JJ)=MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) + &MAX(0., -SIGN(1., ICED%XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) &PCOMPUTE(JJ) IF (ZDRY(JJ)>0) THEN IGDRY = IGDRY + 1 @@ -319,13 +318,13 @@ ELSE ! in the geometrical set of (Lbda_g,Lbda_r) couplet use to ! tabulate the RDRYG-kernel ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & - XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) + ZVEC1(1:IGDRY)=MAX(1.00001, MIN( REAL(ICEP%NDRYLBDAG)-0.00001, & + ICEP%XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+ICEP%XDRYINTP2G)) IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY)) ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAR)-0.00001, & - XDRYINTP1R*LOG(ZVEC2(1:IGDRY))+XDRYINTP2R)) + ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(ICEP%NDRYLBDAR)-0.00001, & + ICEP%XDRYINTP1R*LOG(ZVEC2(1:IGDRY))+ICEP%XDRYINTP2R)) IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) ! @@ -333,11 +332,11 @@ ELSE ! RDRYG-kernel ! DO JJ=1, IGDRY - ZVEC3(JJ)= ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + ZVEC3(JJ)= ( ICEP%XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + - ( ICEP%XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & *(ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. @@ -346,12 +345,12 @@ ELSE END DO ! WHERE(GDRY(1:KSIZE)) - PRG_TEND(1:KSIZE, IRRDRYG) = XFRDRYG*ZZW(1:KSIZE) & ! RRDRYG - *( PLBDAR(1:KSIZE)**(-4) )*( PLBDAG(1:KSIZE)**XCXG ) & - *( PRHODREF(1:KSIZE)**(-XCEXVT-1.) ) & - *( XLBRDRYG1/( PLBDAG(1:KSIZE)**2 ) + & - XLBRDRYG2/( PLBDAG(1:KSIZE) * PLBDAR(1:KSIZE) ) + & - XLBRDRYG3/( PLBDAR(1:KSIZE)**2) ) + PRG_TEND(1:KSIZE, IRRDRYG) = ICEP%XFRDRYG*ZZW(1:KSIZE) & ! RRDRYG + *( PLBDAR(1:KSIZE)**(-4) )*( PLBDAG(1:KSIZE)**ICED%XCXG ) & + *( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) & + *( ICEP%XLBRDRYG1/( PLBDAG(1:KSIZE)**2 ) + & + ICEP%XLBRDRYG2/( PLBDAG(1:KSIZE) * PLBDAR(1:KSIZE) ) + & + ICEP%XLBRDRYG3/( PLBDAR(1:KSIZE)**2) ) END WHERE ENDIF ENDIF @@ -363,7 +362,7 @@ ENDDO !Freezing rate DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -373,23 +372,23 @@ IF(LDSOFT) THEN ENDDO ELSE DO JL=1, KSIZE - PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(CST%XEPSILO+PRVT(JL)) ! Vapor pressure ENDDO - IF(LEVLIMIT) THEN + IF(PARAMI%LEVLIMIT) THEN WHERE(ZMASK(1:KSIZE)==1.) - PRG_TEND(1:KSIZE, IFREEZ1)=MIN(PRG_TEND(1:KSIZE, IFREEZ1), EXP(XALPI-XBETAI/PT(1:KSIZE)-XGAMI*ALOG(PT(1:KSIZE)))) ! min(ev, es_i(T)) + PRG_TEND(1:KSIZE, IFREEZ1)=MIN(PRG_TEND(1:KSIZE, IFREEZ1), EXP(CST%XALPI-CST%XBETAI/PT(1:KSIZE)-CST%XGAMI*ALOG(PT(1:KSIZE)))) ! min(ev, es_i(T)) END WHERE ENDIF PRG_TEND(:, IFREEZ2)=0. WHERE(ZMASK(1:KSIZE)==1.) - PRG_TEND(1:KSIZE, IFREEZ1)=PKA(1:KSIZE)*(XTT-PT(1:KSIZE)) + & - (PDV(1:KSIZE)*(XLVTT+(XCPV-XCL)*(PT(1:KSIZE)-XTT)) & - *(XESTT-PRG_TEND(1:KSIZE, IFREEZ1))/(XRV*PT(1:KSIZE)) ) - PRG_TEND(1:KSIZE, IFREEZ1)=PRG_TEND(1:KSIZE, IFREEZ1)* ( X0DEPG* PLBDAG(1:KSIZE)**XEX0DEPG + & - X1DEPG*PCJ(1:KSIZE)*PLBDAG(1:KSIZE)**XEX1DEPG )/ & - ( PRHODREF(1:KSIZE)*(XLMTT-XCL*(XTT-PT(1:KSIZE))) ) - PRG_TEND(1:KSIZE, IFREEZ2)=(PRHODREF(1:KSIZE)*(XLMTT+(XCI-XCL)*(XTT-PT(1:KSIZE))) ) / & - ( PRHODREF(1:KSIZE)*(XLMTT-XCL*(XTT-PT(1:KSIZE))) ) + PRG_TEND(1:KSIZE, IFREEZ1)=PKA(1:KSIZE)*(CST%XTT-PT(1:KSIZE)) + & + (PDV(1:KSIZE)*(CST%XLVTT+(CST%XCPV-CST%XCL)*(PT(1:KSIZE)-CST%XTT)) & + *(CST%XESTT-PRG_TEND(1:KSIZE, IFREEZ1))/(CST%XRV*PT(1:KSIZE)) ) + PRG_TEND(1:KSIZE, IFREEZ1)=PRG_TEND(1:KSIZE, IFREEZ1)* ( ICEP%X0DEPG* PLBDAG(1:KSIZE)**ICEP%XEX0DEPG + & + ICEP%X1DEPG*PCJ(1:KSIZE)*PLBDAG(1:KSIZE)**ICEP%XEX1DEPG )/ & + ( PRHODREF(1:KSIZE)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(1:KSIZE))) ) + PRG_TEND(1:KSIZE, IFREEZ2)=(PRHODREF(1:KSIZE)*(CST%XLMTT+(CST%XCI-CST%XCL)*(CST%XTT-PT(1:KSIZE))) ) / & + ( PRHODREF(1:KSIZE)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(1:KSIZE))) ) END WHERE ENDIF DO JL=1, KSIZE @@ -406,7 +405,7 @@ DO JL=1, KSIZE & MAX(0., SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - & &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG)))) ENDDO -IF(LNULLWETG) THEN +IF(PARAMI%LNULLWETG) THEN DO JL=1, KSIZE PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRDRYG_INIT(JL))) ENDDO @@ -415,14 +414,14 @@ ELSE PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRWETG_INIT(JL))) ENDDO ENDIF -IF(.NOT. LWETGPOST) THEN +IF(.NOT. PARAMI%LWETGPOST) THEN DO JL=1, KSIZE - PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) + PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., PT(JL)-CST%XTT)) ENDDO ENDIF DO JL=1, KSIZE ZDRYG(JL) = ZMASK(JL) * & ! - & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) + & MAX(0., -SIGN(1., PT(JL)-CST%XTT)) * & ! WHERE(PT(:)<XTT) #ifdef REPRO48 & MAX(0., -SIGN(1., -ZRDRYG_INIT(JL))) * & ! WHERE(ZRDRYG_INIT(:)>0.) #else @@ -463,8 +462,8 @@ ENDDO !* 6.5 Melting of the graupeln ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &MAX(0., -SIGN(1., CST%XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -473,28 +472,28 @@ IF(LDSOFT) THEN ENDDO ELSE DO JL=1, KSIZE - PRGMLTR(JL)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + PRGMLTR(JL)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(CST%XEPSILO+PRVT(JL)) ! Vapor pressure ENDDO - IF(LEVLIMIT) THEN + IF(PARAMI%LEVLIMIT) THEN WHERE(ZMASK(:)==1.) - PRGMLTR(:)=MIN(PRGMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) + PRGMLTR(:)=MIN(PRGMLTR(:), EXP(CST%XALPW-CST%XBETAW/PT(:)-CST%XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) END WHERE ENDIF DO JL=1, KSIZE - PRGMLTR(JL)=ZMASK(JL) * (PKA(JL)*(XTT-PT(JL)) + & - ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - *(XESTT-PRGMLTR(JL))/(XRV*PT(JL)) )) + PRGMLTR(JL)=ZMASK(JL) * (PKA(JL)*(CST%XTT-PT(JL)) + & + ( PDV(JL)*(CST%XLVTT + ( CST%XCPV - CST%XCL ) * ( PT(JL) - CST%XTT )) & + *(CST%XESTT-PRGMLTR(JL))/(CST%XRV*PT(JL)) )) ENDDO WHERE(ZMASK(1:KSIZE)==1.) ! ! compute RGMLTR ! PRGMLTR(1:KSIZE) = MAX( 0.0,( -PRGMLTR(1:KSIZE) * & - ( X0DEPG* PLBDAG(1:KSIZE)**XEX0DEPG + & - X1DEPG*PCJ(1:KSIZE)*PLBDAG(1:KSIZE)**XEX1DEPG ) - & + ( ICEP%X0DEPG* PLBDAG(1:KSIZE)**ICEP%XEX0DEPG + & + ICEP%X1DEPG*PCJ(1:KSIZE)*PLBDAG(1:KSIZE)**ICEP%XEX1DEPG ) - & ( PRG_TEND(1:KSIZE, IRCDRYG)+PRG_TEND(1:KSIZE, IRRDRYG) ) * & - ( PRHODREF(1:KSIZE)*XCL*(XTT-PT(1:KSIZE))) ) / & - ( PRHODREF(1:KSIZE)*XLMTT ) ) + ( PRHODREF(1:KSIZE)*CST%XCL*(CST%XTT-PT(1:KSIZE))) ) / & + ( PRHODREF(1:KSIZE)*CST%XLMTT ) ) END WHERE ENDIF diff --git a/src/common/micro/mode_ice4_fast_rh.F90 b/src/common/micro/mode_ice4_fast_rh.F90 index dc6ed246c540116021fbf3b0f8431269f924d4ff..5664025e3a714c3f36e79f6f1976a4c0f8d14a68 100644 --- a/src/common/micro/mode_ice4_fast_rh.F90 +++ b/src/common/micro/mode_ice4_fast_rh.F90 @@ -5,7 +5,7 @@ MODULE MODE_ICE4_FAST_RH IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_FAST_RH(KPROMA,KSIZE, LDSOFT, PCOMPUTE, PWETG, & +SUBROUTINE ICE4_FAST_RH(CST, PARAMI, ICEP, ICED, KPROMA,KSIZE, LDSOFT, PCOMPUTE, PWETG, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &PDV, PKA, PCJ, & &PLBDAS, PLBDAG, PLBDAR, PLBDAH, & @@ -34,16 +34,10 @@ SUBROUTINE ICE4_FAST_RH(KPROMA,KSIZE, LDSOFT, PCOMPUTE, PWETG, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMW, XCI, XCL, XCPV, XESTT, XGAMI, XLMTT, & - & XLVTT, XMD, XMV, XRV, XTT, XEPSILO -USE MODD_PARAM_ICE, ONLY: LCONVHG, LEVLIMIT, LNULLWETH, LWETHPOST -USE MODD_RAIN_ICE_DESCR, ONLY: XBG, XBS, XCEXVT, XCXG, XCXH, XCXS, XDH, XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: NWETLBDAG, NWETLBDAH, NWETLBDAR, NWETLBDAS, X0DEPH, X1DEPH, XCOLEXGH, XCOLEXIH, & - & XCOLGH, XCOLIH, XCOLEXSH, XCOLSH, XEX0DEPH, XEX1DEPH, XFGWETH, XFRWETH, & - & XFSWETH, XFWETH, XKER_GWETH, XKER_RWETH, XKER_SWETH, XLBGWETH1, XLBGWETH2, & - & XLBGWETH3, XLBRWETH1, XLBRWETH2, XLBRWETH3, XLBSWETH1, XLBSWETH2, XLBSWETH3, & - & XWETINTP1G, XWETINTP1H, XWETINTP1R, XWETINTP1S, XWETINTP2G, XWETINTP2H, & - & XWETINTP2R, XWETINTP2S +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 @@ -52,6 +46,10 @@ 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) :: KPROMA,KSIZE LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE @@ -119,8 +117,8 @@ IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RH',0,ZHOOK_HANDLE) !* 7.2 compute the Wet and Dry growth of hail ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., ICED%XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -130,13 +128,13 @@ IF(LDSOFT) THEN ELSE PRH_TEND(:, IRCWETH)=0. WHERE(ZMASK(1:KSIZE)==1.) - ZZW(1:KSIZE) = PLBDAH(1:KSIZE)**(XCXH-XDH-2.0) * PRHODREF(1:KSIZE)**(-XCEXVT) - PRH_TEND(1:KSIZE, IRCWETH)=XFWETH * PRCT(1:KSIZE) * ZZW(1:KSIZE) ! RCWETH + ZZW(1:KSIZE) = PLBDAH(1:KSIZE)**(ICED%XCXH-ICED%XDH-2.0) * PRHODREF(1:KSIZE)**(-ICED%XCEXVT) + PRH_TEND(1:KSIZE, IRCWETH)=ICEP%XFWETH * PRCT(1:KSIZE) * ZZW(1:KSIZE) ! RCWETH END WHERE ENDIF DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., ICED%XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -148,9 +146,9 @@ ELSE PRH_TEND(:, IRIWETH)=0. PRH_TEND(:, IRIDRYH)=0. WHERE(ZMASK(1:KSIZE)==1.) - ZZW(1:KSIZE) = PLBDAH(1:KSIZE)**(XCXH-XDH-2.0) * PRHODREF(1:KSIZE)**(-XCEXVT) - PRH_TEND(1:KSIZE, IRIWETH)=XFWETH * PRIT(1:KSIZE) * ZZW(1:KSIZE) ! RIWETH - PRH_TEND(1:KSIZE, IRIDRYH)=PRH_TEND(1:KSIZE, IRIWETH)*(XCOLIH*EXP(XCOLEXIH*(PT(1:KSIZE)-XTT))) ! RIDRYH + ZZW(1:KSIZE) = PLBDAH(1:KSIZE)**(ICED%XCXH-ICED%XDH-2.0) * PRHODREF(1:KSIZE)**(-ICED%XCEXVT) + PRH_TEND(1:KSIZE, IRIWETH)=ICEP%XFWETH * PRIT(1:KSIZE) * ZZW(1:KSIZE) ! RIWETH + PRH_TEND(1:KSIZE, IRIDRYH)=PRH_TEND(1:KSIZE, IRIWETH)*(ICEP%XCOLIH*EXP(ICEP%XCOLEXIH*(PT(1:KSIZE)-CST%XTT))) ! RIDRYH END WHERE ENDIF @@ -159,8 +157,8 @@ ENDIF ! IGWET = 0 DO JJ = 1, KSIZE - ZWET(JJ) = MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) + ZWET(JJ) = MAX(0., -SIGN(1., ICED%XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., ICED%XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) &PCOMPUTE(JJ) IF (ZWET(JJ)>0) THEN IGWET = IGWET + 1 @@ -191,13 +189,13 @@ ELSE ! in the geometrical set of (Lbda_h,Lbda_s) couplet use to ! tabulate the SWETH-kernel ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAH)-0.00001, & - XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(ICEP%NWETLBDAH)-0.00001, & + ICEP%XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + ICEP%XWETINTP2H ) ) IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAS)-0.00001, & - XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + XWETINTP2S ) ) + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(ICEP%NWETLBDAS)-0.00001, & + ICEP%XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + ICEP%XWETINTP2S ) ) IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) ! @@ -205,11 +203,11 @@ ELSE ! SWETH-kernel ! DO JJ = 1,IGWET - ZVEC3(JJ) = ( XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + ZVEC3(JJ) = ( ICEP%XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - - ( XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + - ( ICEP%XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. @@ -218,13 +216,13 @@ ELSE END DO ! WHERE(GWET(1:KSIZE)) - PRH_TEND(1:KSIZE, IRSWETH)=XFSWETH*ZZW(1:KSIZE) & ! RSWETH - *( PLBDAS(1:KSIZE)**(XCXS-XBS) )*( PLBDAH(1:KSIZE)**XCXH ) & - *( PRHODREF(1:KSIZE)**(-XCEXVT-1.) ) & - *( XLBSWETH1/( PLBDAH(1:KSIZE)**2 ) + & - XLBSWETH2/( PLBDAH(1:KSIZE) * PLBDAS(1:KSIZE) ) + & - XLBSWETH3/( PLBDAS(1:KSIZE)**2) ) - PRH_TEND(1:KSIZE, IRSDRYH)=PRH_TEND(1:KSIZE, IRSWETH)*(XCOLSH*EXP(XCOLEXSH*(PT(1:KSIZE)-XTT))) + PRH_TEND(1:KSIZE, IRSWETH)=ICEP%XFSWETH*ZZW(1:KSIZE) & ! RSWETH + *( PLBDAS(1:KSIZE)**(ICED%XCXS-ICED%XBS) )*( PLBDAH(1:KSIZE)**ICED%XCXH ) & + *( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) & + *( ICEP%XLBSWETH1/( PLBDAH(1:KSIZE)**2 ) + & + ICEP%XLBSWETH2/( PLBDAH(1:KSIZE) * PLBDAS(1:KSIZE) ) + & + ICEP%XLBSWETH3/( PLBDAS(1:KSIZE)**2) ) + PRH_TEND(1:KSIZE, IRSDRYH)=PRH_TEND(1:KSIZE, IRSWETH)*(ICEP%XCOLSH*EXP(ICEP%XCOLEXSH*(PT(1:KSIZE)-CST%XTT))) END WHERE ENDIF ENDIF @@ -233,8 +231,8 @@ ENDIF ! IGWET = 0 DO JJ = 1, KSIZE - ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + ZWET(JJ)=MAX(0., -SIGN(1., ICED%XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., ICED%XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) &PCOMPUTE(JJ) IF (ZWET(JJ)>0) THEN IGWET = IGWET + 1 @@ -265,13 +263,13 @@ ELSE ! in the geometrical set of (Lbda_h,Lbda_g) couplet use to ! tabulate the GWETH-kernel ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & - XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(ICEP%NWETLBDAG)-0.00001, & + ICEP%XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + ICEP%XWETINTP2H ) ) IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & - XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + XWETINTP2G ) ) + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(ICEP%NWETLBDAG)-0.00001, & + ICEP%XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + ICEP%XWETINTP2G ) ) IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) ! @@ -279,11 +277,11 @@ ELSE ! GWETH-kernel ! DO JJ = 1,IGWET - ZVEC3(JJ) = ( XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + ZVEC3(JJ) = ( ICEP%XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - - ( XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + - ( ICEP%XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. @@ -292,17 +290,17 @@ ELSE END DO ! WHERE(GWET(1:KSIZE)) - PRH_TEND(1:KSIZE, IRGWETH)=XFGWETH*ZZW(1:KSIZE) & ! RGWETH - *( PLBDAG(1:KSIZE)**(XCXG-XBG) )*( PLBDAH(1:KSIZE)**XCXH ) & - *( PRHODREF(1:KSIZE)**(-XCEXVT-1.) ) & - *( XLBGWETH1/( PLBDAH(1:KSIZE)**2 ) + & - XLBGWETH2/( PLBDAH(1:KSIZE) * PLBDAG(1:KSIZE) ) + & - XLBGWETH3/( PLBDAG(1:KSIZE)**2) ) + PRH_TEND(1:KSIZE, IRGWETH)=ICEP%XFGWETH*ZZW(1:KSIZE) & ! RGWETH + *( PLBDAG(1:KSIZE)**(ICED%XCXG-ICED%XBG) )*( PLBDAH(1:KSIZE)**ICED%XCXH ) & + *( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) & + *( ICEP%XLBGWETH1/( PLBDAH(1:KSIZE)**2 ) + & + ICEP%XLBGWETH2/( PLBDAH(1:KSIZE) * PLBDAG(1:KSIZE) ) + & + ICEP%XLBGWETH3/( PLBDAG(1:KSIZE)**2) ) PRH_TEND(1:KSIZE, IRGDRYH)=PRH_TEND(1:KSIZE, IRGWETH) END WHERE !When graupel grows in wet mode, graupel is wet (!) and collection efficiency must remain the same WHERE(GWET(1:KSIZE) .AND. .NOT. PWETG(1:KSIZE)==1.) - PRH_TEND(1:KSIZE, IRGDRYH)=PRH_TEND(1:KSIZE, IRGDRYH)*(XCOLGH*EXP(XCOLEXGH*(PT(1:KSIZE)-XTT))) + PRH_TEND(1:KSIZE, IRGDRYH)=PRH_TEND(1:KSIZE, IRGDRYH)*(ICEP%XCOLGH*EXP(ICEP%XCOLEXGH*(PT(1:KSIZE)-CST%XTT))) END WHERE END IF ENDIF @@ -311,8 +309,8 @@ ENDIF ! IGWET = 0 DO JJ = 1, KSIZE - ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) + ZWET(JJ)=MAX(0., -SIGN(1., ICED%XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) &PCOMPUTE(JJ) IF (ZWET(JJ)>0) THEN IGWET = IGWET + 1 @@ -341,13 +339,13 @@ ELSE ! in the geometrical set of (Lbda_h,Lbda_r) couplet use to ! tabulate the RWETH-kernel ! - ZVEC1(1:IGWET)=MAX(1.00001, MIN( REAL(NWETLBDAH)-0.00001, & - XWETINTP1H*LOG(ZVEC1(1:IGWET))+XWETINTP2H)) + ZVEC1(1:IGWET)=MAX(1.00001, MIN( REAL(ICEP%NWETLBDAH)-0.00001, & + ICEP%XWETINTP1H*LOG(ZVEC1(1:IGWET))+ICEP%XWETINTP2H)) IVEC1(1:IGWET)=INT(ZVEC1(1:IGWET)) ZVEC1(1:IGWET)=ZVEC1(1:IGWET)-REAL(IVEC1(1:IGWET)) ! - ZVEC2(1:IGWET)=MAX(1.00001, MIN( REAL(NWETLBDAR)-0.00001, & - XWETINTP1R*LOG(ZVEC2(1:IGWET))+XWETINTP2R)) + ZVEC2(1:IGWET)=MAX(1.00001, MIN( REAL(ICEP%NWETLBDAR)-0.00001, & + ICEP%XWETINTP1R*LOG(ZVEC2(1:IGWET))+ICEP%XWETINTP2R)) IVEC2(1:IGWET)=INT(ZVEC2(1:IGWET)) ZVEC2(1:IGWET)=ZVEC2(1:IGWET)-REAL(IVEC2(1:IGWET)) ! @@ -355,11 +353,11 @@ ELSE ! RWETH-kernel ! DO JJ=1, IGWET - ZVEC3(JJ)= ( XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + ZVEC3(JJ)= ( ICEP%XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - - ( XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + - ( ICEP%XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & *(ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. @@ -368,12 +366,12 @@ ELSE END DO ! WHERE(GWET(1:KSIZE)) - PRH_TEND(1:KSIZE, IRRWETH) = XFRWETH*ZZW(1:KSIZE) & ! RRWETH - *( PLBDAR(1:KSIZE)**(-4) )*( PLBDAH(1:KSIZE)**XCXH ) & - *( PRHODREF(1:KSIZE)**(-XCEXVT-1.) ) & - *( XLBRWETH1/( PLBDAH(1:KSIZE)**2 ) + & - XLBRWETH2/( PLBDAH(1:KSIZE) * PLBDAR(1:KSIZE) ) + & - XLBRWETH3/( PLBDAR(1:KSIZE)**2) ) + PRH_TEND(1:KSIZE, IRRWETH) = ICEP%XFRWETH*ZZW(1:KSIZE) & ! RRWETH + *( PLBDAR(1:KSIZE)**(-4) )*( PLBDAH(1:KSIZE)**ICED%XCXH ) & + *( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) & + *( ICEP%XLBRWETH1/( PLBDAH(1:KSIZE)**2 ) + & + ICEP%XLBRWETH2/( PLBDAH(1:KSIZE) * PLBDAR(1:KSIZE) ) + & + ICEP%XLBRWETH3/( PLBDAR(1:KSIZE)**2) ) END WHERE ENDIF ENDIF @@ -386,7 +384,7 @@ ENDDO !* 7.3 compute the Wet growth of hail ! DO JL=1, KSIZE - ZHAIL(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + ZHAIL(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -396,23 +394,23 @@ IF(LDSOFT) THEN ENDDO ELSE DO JL=1, KSIZE - PRH_TEND(JL, IFREEZ1)=PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + PRH_TEND(JL, IFREEZ1)=PRVT(JL)*PPRES(JL)/(CST%XEPSILO+PRVT(JL)) ! Vapor pressure ENDDO - IF(LEVLIMIT) THEN + IF(PARAMI%LEVLIMIT) THEN WHERE(ZHAIL(1:KSIZE)==1.) - PRH_TEND(1:KSIZE, IFREEZ1)=MIN(PRH_TEND(1:KSIZE, IFREEZ1), EXP(XALPI-XBETAI/PT(1:KSIZE)-XGAMI*ALOG(PT(1:KSIZE)))) ! min(ev, es_i(T)) + PRH_TEND(1:KSIZE, IFREEZ1)=MIN(PRH_TEND(1:KSIZE, IFREEZ1), EXP(CST%XALPI-CST%XBETAI/PT(1:KSIZE)-CST%XGAMI*ALOG(PT(1:KSIZE)))) ! min(ev, es_i(T)) END WHERE ENDIF PRH_TEND(:, IFREEZ2)=0. WHERE(ZHAIL(1:KSIZE)==1.) - PRH_TEND(1:KSIZE, IFREEZ1)=PKA(1:KSIZE)*(XTT-PT(1:KSIZE)) + & - (PDV(1:KSIZE)*(XLVTT+(XCPV-XCL)*(PT(1:KSIZE)-XTT)) & - *(XESTT-PRH_TEND(1:KSIZE, IFREEZ1))/(XRV*PT(1:KSIZE)) ) - PRH_TEND(1:KSIZE, IFREEZ1)=PRH_TEND(1:KSIZE, IFREEZ1)* ( X0DEPH* PLBDAH(1:KSIZE)**XEX0DEPH + & - X1DEPH*PCJ(1:KSIZE)*PLBDAH(1:KSIZE)**XEX1DEPH )/ & - ( PRHODREF(1:KSIZE)*(XLMTT-XCL*(XTT-PT(1:KSIZE))) ) - PRH_TEND(1:KSIZE, IFREEZ2)=(PRHODREF(1:KSIZE)*(XLMTT+(XCI-XCL)*(XTT-PT(1:KSIZE))) ) / & - ( PRHODREF(1:KSIZE)*(XLMTT-XCL*(XTT-PT(1:KSIZE))) ) + PRH_TEND(1:KSIZE, IFREEZ1)=PKA(1:KSIZE)*(CST%XTT-PT(1:KSIZE)) + & + (PDV(1:KSIZE)*(CST%XLVTT+(CST%XCPV-CST%XCL)*(PT(1:KSIZE)-CST%XTT)) & + *(CST%XESTT-PRH_TEND(1:KSIZE, IFREEZ1))/(CST%XRV*PT(1:KSIZE)) ) + PRH_TEND(1:KSIZE, IFREEZ1)=PRH_TEND(1:KSIZE, IFREEZ1)* ( ICEP%X0DEPH* PLBDAH(1:KSIZE)**ICEP%XEX0DEPH + & + ICEP%X1DEPH*PCJ(1:KSIZE)*PLBDAH(1:KSIZE)**ICEP%XEX1DEPH )/ & + ( PRHODREF(1:KSIZE)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(1:KSIZE))) ) + PRH_TEND(1:KSIZE, IFREEZ2)=(PRHODREF(1:KSIZE)*(CST%XLMTT+(CST%XCI-CST%XCL)*(CST%XTT-PT(1:KSIZE))) ) / & + ( PRHODREF(1:KSIZE)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(1:KSIZE))) ) END WHERE ENDIF DO JL=1, KSIZE @@ -431,7 +429,7 @@ DO JL=1, KSIZE & MAX(0., SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)-PRH_TEND(JL, IRGDRYH)) - & &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)-PRH_TEND(JL, IRGWETH)))) ENDDO -IF(LNULLWETH) THEN +IF(PARAMI%LNULLWETH) THEN DO JL=1, KSIZE ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRDRYH_INIT(JL))) ! WHERE(ZRDRYH_INIT(:)>0.) ENDDO @@ -440,21 +438,21 @@ ELSE ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRWETH_INIT(JL))) ! WHERE(ZRWETH_INIT(:)>0.) ENDDO ENDIF -IF(.NOT. LWETHPOST) THEN +IF(.NOT. PARAMI%LWETHPOST) THEN DO JL=1, KSIZE - ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) + ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., PT(JL)-CST%XTT)) ! WHERE(PT(:)<XTT) ENDDO ENDIF DO JL=1, KSIZE ZDRYH(JL) = ZHAIL(JL) * & - & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) + & MAX(0., -SIGN(1., PT(JL)-CST%XTT)) * & ! WHERE(PT(:)<XTT) & MAX(0., -SIGN(1., 1.E-20-ZRDRYH_INIT(JL))) * & !WHERE(ZRDRYH_INIT(:)>0.) & MAX(0., -SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)) - & &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)))) ENDDO ! ZRDRYHG(:)=0. -IF(LCONVHG)THEN +IF(PARAMI%LCONVHG)THEN WHERE(ZDRYH(:)==1.) ZRDRYHG(:)=ZRDRYH_INIT(:)*ZRWETH_INIT(:)/(ZRDRYH_INIT(:)+ZRWETH_INIT(:)) END WHERE @@ -496,8 +494,8 @@ ENDDO !* 7.5 Melting of the hailstones ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., CST%XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -506,28 +504,28 @@ IF(LDSOFT) THEN ENDDO ELSE DO JL=1, KSIZE - PRHMLTR(JL) = ZMASK(JL)* PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + PRHMLTR(JL) = ZMASK(JL)* PRVT(JL)*PPRES(JL)/(CST%XEPSILO+PRVT(JL)) ! Vapor pressure ENDDO - IF(LEVLIMIT) THEN + IF(PARAMI%LEVLIMIT) THEN WHERE(ZMASK(:)==1.) - PRHMLTR(:)=MIN(PRHMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) + PRHMLTR(:)=MIN(PRHMLTR(:), EXP(CST%XALPW-CST%XBETAW/PT(:)-CST%XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) END WHERE ENDIF DO JL=1, KSIZE - PRHMLTR(JL) = ZMASK(JL)* (PKA(JL)*(XTT-PT(JL)) + & - ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - *(XESTT-PRHMLTR(JL))/(XRV*PT(JL)) )) + PRHMLTR(JL) = ZMASK(JL)* (PKA(JL)*(CST%XTT-PT(JL)) + & + ( PDV(JL)*(CST%XLVTT + ( CST%XCPV - CST%XCL ) * ( PT(JL) - CST%XTT )) & + *(CST%XESTT-PRHMLTR(JL))/(CST%XRV*PT(JL)) )) ENDDO WHERE(ZMASK(1:KSIZE)==1.) ! ! compute RHMLTR ! PRHMLTR(1:KSIZE) = MAX( 0.0,( -PRHMLTR(1:KSIZE) * & - ( X0DEPH* PLBDAH(1:KSIZE)**XEX0DEPH + & - X1DEPH*PCJ(1:KSIZE)*PLBDAH(1:KSIZE)**XEX1DEPH ) - & + ( ICEP%X0DEPH* PLBDAH(1:KSIZE)**ICEP%XEX0DEPH + & + ICEP%X1DEPH*PCJ(1:KSIZE)*PLBDAH(1:KSIZE)**ICEP%XEX1DEPH ) - & ( PRH_TEND(1:KSIZE, IRCWETH)+PRH_TEND(1:KSIZE, IRRWETH) )* & - ( PRHODREF(1:KSIZE)*XCL*(XTT-PT(1:KSIZE))) ) / & - ( PRHODREF(1:KSIZE)*XLMTT ) ) + ( PRHODREF(1:KSIZE)*CST%XCL*(CST%XTT-PT(1:KSIZE))) ) / & + ( PRHODREF(1:KSIZE)*CST%XLMTT ) ) END WHERE END IF DO JL=1, KSIZE diff --git a/src/common/micro/mode_ice4_fast_ri.F90 b/src/common/micro/mode_ice4_fast_ri.F90 index 0e1e1e0ff5042d73efa6574eea56b073ed4567db..d24c0cccd53892a830964f5b2eaca3521c4312e1 100644 --- a/src/common/micro/mode_ice4_fast_ri.F90 +++ b/src/common/micro/mode_ice4_fast_ri.F90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_FAST_RI IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_FAST_RI(KSIZE, LDSOFT, PCOMPUTE, & +SUBROUTINE ICE4_FAST_RI(ICEP, ICED, KSIZE, LDSOFT, PCOMPUTE, & &PRHODREF, PLVFACT, PLSFACT, & &PAI, PCJ, PCIT, & &PSSI, & @@ -30,8 +30,8 @@ SUBROUTINE ICE4_FAST_RI(KSIZE, LDSOFT, PCOMPUTE, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_RAIN_ICE_PARAM, ONLY: X0DEPI,X2DEPI -USE MODD_RAIN_ICE_DESCR, ONLY: XDI,XLBEXI,XLBI,XRTMIN +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 ! @@ -39,6 +39,8 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KSIZE LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE @@ -70,18 +72,18 @@ IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RI',0,ZHOOK_HANDLE) !* 7.2 Bergeron-Findeisen effect: RCBERI ! DO JL=1, KSIZE - LMASK = PSSI(JL)>0. .AND. PRCT(JL)>XRTMIN(2) .AND. & + LMASK = PSSI(JL)>0. .AND. PRCT(JL)>ICED%XRTMIN(2) .AND. & #ifdef REPRO48 - & PRIT(JL)>XRTMIN(4) .AND. PCIT(JL)>0. .AND. & + & PRIT(JL)>ICED%XRTMIN(4) .AND. PCIT(JL)>0. .AND. & #else - & PRIT(JL)>XRTMIN(4) .AND. PCIT(JL)>1.E-20 .AND. & + & PRIT(JL)>ICED%XRTMIN(4) .AND. PCIT(JL)>1.E-20 .AND. & #endif & PCOMPUTE(JL)==1 IF(LMASK) THEN IF(.NOT. LDSOFT) THEN - PRCBERI(JL) = MIN(1.E8, XLBI*(PRHODREF(JL)*PRIT(JL)/PCIT(JL))**XLBEXI) ! Lbda_i + PRCBERI(JL) = MIN(1.E8, ICED%XLBI*(PRHODREF(JL)*PRIT(JL)/PCIT(JL))**ICED%XLBEXI) ! Lbda_i PRCBERI(JL) = ( PSSI(JL) / (PRHODREF(JL)*PAI(JL)) ) * PCIT(JL) * & - ( X0DEPI/PRCBERI(JL) + X2DEPI*PCJ(JL)*PCJ(JL)/PRCBERI(JL)**(XDI+2.0) ) + ( ICEP%X0DEPI/PRCBERI(JL) + ICEP%X2DEPI*PCJ(JL)*PCJ(JL)/PRCBERI(JL)**(ICED%XDI+2.0) ) ENDIF PA_RC(JL) = PA_RC(JL) - PRCBERI(JL) PA_RI(JL) = PA_RI(JL) + PRCBERI(JL) diff --git a/src/common/micro/mode_ice4_fast_rs.F90 b/src/common/micro/mode_ice4_fast_rs.F90 index 9775ff1559937c0570f62c9124247c474aeb2d5b..208c6b7b64aff4073f32340c0409d0323c866565 100644 --- a/src/common/micro/mode_ice4_fast_rs.F90 +++ b/src/common/micro/mode_ice4_fast_rs.F90 @@ -5,7 +5,7 @@ MODULE MODE_ICE4_FAST_RS IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_FAST_RS(KPROMA,KSIZE, LDSOFT, PCOMPUTE, & +SUBROUTINE ICE4_FAST_RS(CST, PARAMI, ICEP, ICED, KPROMA,KSIZE, LDSOFT, PCOMPUTE, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &PDV, PKA, PCJ, & &PLBDAR, PLBDAS, & @@ -36,16 +36,10 @@ SUBROUTINE ICE4_FAST_RS(KPROMA,KSIZE, LDSOFT, PCOMPUTE, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XCI, XCL, XCPV, XESTT, XGAMI, XGAMW, & - & XLMTT, XLVTT, XMD, XMV, XRV, XTT, XEPSILO -USE MODD_PARAM_ICE, ONLY: LEVLIMIT, CSNOWRIMING -USE MODD_RAIN_ICE_DESCR, ONLY: XBS, XCEXVT, XCXS, XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: NACCLBDAR, NACCLBDAS, NGAMINC, X0DEPS, X1DEPS, XACCINTP1R, XACCINTP1S, & - & XACCINTP2R, XACCINTP2S, XCRIMSG, XCRIMSS, XEX0DEPS, XEX1DEPS, XEXCRIMSG, & - & XEXCRIMSS, XEXSRIMCG, XEXSRIMCG2, XFRACCSS, XFSACCRG, XFSCVMG, XGAMINC_RIM1, & - & XGAMINC_RIM1, XGAMINC_RIM2, XGAMINC_RIM4, XKER_RACCS, XKER_RACCSS, & - & XKER_SACCRG, XLBRACCS1, XLBRACCS2, XLBRACCS3, XLBSACCR1, XLBSACCR2, XLBSACCR3, & - & XRIMINTP1, XRIMINTP2, XSRIMCG, XSRIMCG2, XSRIMCG3 +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 ! @@ -53,6 +47,10 @@ 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) :: KPROMA,KSIZE LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE @@ -110,7 +108,7 @@ IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RS', 0, ZHOOK_HANDLE) !* 5.0 maximum freezing rate ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -120,23 +118,23 @@ IF(LDSOFT) THEN ENDDO ELSE DO JL=1, KSIZE - PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(CST%XEPSILO+PRVT(JL)) ! Vapor pressure ENDDO - IF(LEVLIMIT) THEN + IF(PARAMI%LEVLIMIT) THEN WHERE(ZMASK(1:KSIZE)==1.) - PRS_TEND(1:KSIZE, IFREEZ1)=MIN(PRS_TEND(1:KSIZE, IFREEZ1), EXP(XALPI-XBETAI/PT(1:KSIZE)-XGAMI*ALOG(PT(1:KSIZE)))) ! min(ev, es_i(T)) + PRS_TEND(1:KSIZE, IFREEZ1)=MIN(PRS_TEND(1:KSIZE, IFREEZ1), EXP(CST%XALPI-CST%XBETAI/PT(1:KSIZE)-CST%XGAMI*ALOG(PT(1:KSIZE)))) ! min(ev, es_i(T)) END WHERE ENDIF PRS_TEND(:, IFREEZ2)=0. WHERE(ZMASK(1:KSIZE)==1.) - PRS_TEND(1:KSIZE, IFREEZ1)=PKA(1:KSIZE)*(XTT-PT(1:KSIZE)) + & - (PDV(1:KSIZE)*(XLVTT+(XCPV-XCL)*(PT(1:KSIZE)-XTT)) & - *(XESTT-PRS_TEND(1:KSIZE, IFREEZ1))/(XRV*PT(1:KSIZE)) ) - PRS_TEND(1:KSIZE, IFREEZ1)=PRS_TEND(1:KSIZE, IFREEZ1)* ( X0DEPS* PLBDAS(1:KSIZE)**XEX0DEPS + & - X1DEPS*PCJ(1:KSIZE)*PLBDAS(1:KSIZE)**XEX1DEPS )/ & - ( PRHODREF(1:KSIZE)*(XLMTT-XCL*(XTT-PT(1:KSIZE))) ) - PRS_TEND(1:KSIZE, IFREEZ2)=(PRHODREF(1:KSIZE)*(XLMTT+(XCI-XCL)*(XTT-PT(1:KSIZE))) ) / & - ( PRHODREF(1:KSIZE)*(XLMTT-XCL*(XTT-PT(1:KSIZE))) ) + PRS_TEND(1:KSIZE, IFREEZ1)=PKA(1:KSIZE)*(CST%XTT-PT(1:KSIZE)) + & + (PDV(1:KSIZE)*(CST%XLVTT+(CST%XCPV-CST%XCL)*(PT(1:KSIZE)-CST%XTT)) & + *(CST%XESTT-PRS_TEND(1:KSIZE, IFREEZ1))/(CST%XRV*PT(1:KSIZE)) ) + PRS_TEND(1:KSIZE, IFREEZ1)=PRS_TEND(1:KSIZE, IFREEZ1)* ( ICEP%X0DEPS* PLBDAS(1:KSIZE)**ICEP%XEX0DEPS + & + ICEP%X1DEPS*PCJ(1:KSIZE)*PLBDAS(1:KSIZE)**ICEP%XEX1DEPS )/ & + ( PRHODREF(1:KSIZE)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(1:KSIZE))) ) + PRS_TEND(1:KSIZE, IFREEZ2)=(PRHODREF(1:KSIZE)*(CST%XLMTT+(CST%XCI-CST%XCL)*(CST%XTT-PT(1:KSIZE))) ) / & + ( PRHODREF(1:KSIZE)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(1:KSIZE))) ) END WHERE ENDIF DO JL=1, KSIZE @@ -151,8 +149,8 @@ ENDDO ! IGRIM = 0 DO JL=1, KSIZE - ZRIM(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & !WHERE(PRCT(:)>XRTMIN(2)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !WHERE(PRST(:)>XRTMIN(5)) + ZRIM(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(2)-PRCT(JL))) * & !WHERE(PRCT(:)>XRTMIN(2)) + &MAX(0., -SIGN(1., ICED%XRTMIN(5)-PRST(JL))) * & !WHERE(PRST(:)>XRTMIN(5)) &PCOMPUTE(JL) IF (ZRIM(JL)>0) THEN IGRIM = IGRIM + 1 @@ -187,16 +185,16 @@ ELSE ! set of Lbda_s used to tabulate some moments of the incomplete ! gamma function ! - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & - XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(ICEP%NGAMINC)-0.00001, & + ICEP%XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + ICEP%XRIMINTP2 ) ) IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) ! ! 5.1.3 perform the linear interpolation of the normalized ! "2+XDS"-moment of the incomplete gamma function ! - ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZVEC1(1:IGRIM) = ICEP%XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - ICEP%XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) ZZW(:) = 0. DO JJ = 1, IGRIM ZZW(I1(JJ)) = ZVEC1(JJ) @@ -205,24 +203,24 @@ ELSE ! 5.1.4 riming of the small sized aggregates ! WHERE (GRIM(1:KSIZE)) - PRS_TEND(1:KSIZE, IRCRIMSS) = XCRIMSS * ZZW(1:KSIZE) * PRCT(1:KSIZE) & ! RCRIMSS - * PLBDAS(1:KSIZE)**XEXCRIMSS & - * PRHODREF(1:KSIZE)**(-XCEXVT) + PRS_TEND(1:KSIZE, IRCRIMSS) = ICEP%XCRIMSS * ZZW(1:KSIZE) * PRCT(1:KSIZE) & ! RCRIMSS + * PLBDAS(1:KSIZE)**ICEP%XEXCRIMSS & + * PRHODREF(1:KSIZE)**(-ICED%XCEXVT) END WHERE ! ! 5.1.5 perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) and ! "XBG"-moment of the incomplete gamma function (XGAMINC_RIM4) ! - ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZVEC1(1:IGRIM) = ICEP%XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - ICEP%XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) ZZW(:) = 0. DO JJ = 1, IGRIM ZZW(I1(JJ)) = ZVEC1(JJ) END DO - ZVEC1(1:IGRIM) = XGAMINC_RIM4( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM4( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZVEC1(1:IGRIM) = ICEP%XGAMINC_RIM4( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - ICEP%XGAMINC_RIM4( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) ZZW2(:) = 0. DO JJ = 1, IGRIM ZZW2(I1(JJ)) = ZVEC1(JJ) @@ -232,20 +230,20 @@ ELSE ! ! WHERE(GRIM(1:KSIZE)) - PRS_TEND(1:KSIZE, IRCRIMS)=XCRIMSG * PRCT(1:KSIZE) & ! RCRIMS - * PLBDAS(1:KSIZE)**XEXCRIMSG & - * PRHODREF(1:KSIZE)**(-XCEXVT) + PRS_TEND(1:KSIZE, IRCRIMS)=ICEP%XCRIMSG * PRCT(1:KSIZE) & ! RCRIMS + * PLBDAS(1:KSIZE)**ICEP%XEXCRIMSG & + * PRHODREF(1:KSIZE)**(-ICED%XCEXVT) ZZW6(1:KSIZE) = PRS_TEND(1:KSIZE, IRCRIMS) - PRS_TEND(1:KSIZE, IRCRIMSS) ! RCRIMSG END WHERE - IF(CSNOWRIMING=='M90 ')THEN + IF(PARAMI%CSNOWRIMING=='M90 ')THEN !Murakami 1990 WHERE(GRIM(1:KSIZE)) - PRS_TEND(1:KSIZE, IRSRIMCG)=XSRIMCG * PLBDAS(1:KSIZE)**XEXSRIMCG*(1.0-ZZW(1:KSIZE)) + PRS_TEND(1:KSIZE, IRSRIMCG)=ICEP%XSRIMCG * PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG*(1.0-ZZW(1:KSIZE)) PRS_TEND(1:KSIZE, IRSRIMCG)=ZZW6(1:KSIZE)*PRS_TEND(1:KSIZE, IRSRIMCG)/ & MAX(1.E-20, & - XSRIMCG3*XSRIMCG2*PLBDAS(1:KSIZE)**XEXSRIMCG2*(1.-ZZW2(1:KSIZE)) - & - XSRIMCG3*PRS_TEND(1:KSIZE, IRSRIMCG)) + ICEP%XSRIMCG3*ICEP%XSRIMCG2*PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG2*(1.-ZZW2(1:KSIZE)) - & + ICEP%XSRIMCG3*PRS_TEND(1:KSIZE, IRSRIMCG)) END WHERE ELSE PRS_TEND(:, IRSRIMCG)=0. @@ -256,7 +254,7 @@ ENDIF DO JL=1, KSIZE ! More restrictive RIM mask to be used for riming by negative temperature only ZRIM(JL)=ZRIM(JL) * & - &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) + &MAX(0., -SIGN(1., PT(JL)-CST%XTT)) ! WHERE(PT(:)<XTT) PRCRIMSS(JL)=ZRIM(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRCRIMSS)) ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSS(JL)) ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL))) ! proportion we are able to freeze @@ -273,8 +271,8 @@ ENDDO ! IGACC = 0 DO JJ = 1, KSIZE - ZACC(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & !WHERE(PRRT(:)>XRTMIN(3)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) + ZACC(JJ)=MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JJ))) * & !WHERE(PRRT(:)>XRTMIN(3)) + &MAX(0., -SIGN(1., ICED%XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) &PCOMPUTE(JJ) IF (ZACC(JJ)>0) THEN IGACC = IGACC + 1 @@ -308,13 +306,13 @@ ELSE ! in the geometrical set of (Lbda_s,Lbda_r) couplet use to ! tabulate the RACCSS-kernel ! - ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & - XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) + ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(ICEP%NACCLBDAS)-0.00001, & + ICEP%XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + ICEP%XACCINTP2S ) ) IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) ! - ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & - XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) + ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(ICEP%NACCLBDAR)-0.00001, & + ICEP%XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + ICEP%XACCINTP2R ) ) IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) ! @@ -322,11 +320,11 @@ ELSE ! RACCSS-kernel ! DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + ZVEC3(JJ) = ( ICEP%XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + - ( ICEP%XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. @@ -338,10 +336,10 @@ ELSE ! WHERE(GACC(1:KSIZE)) ZZW6(1:KSIZE) = & !! coef of RRACCS - XFRACCSS*( PLBDAS(1:KSIZE)**XCXS )*( PRHODREF(1:KSIZE)**(-XCEXVT-1.) ) & - *( XLBRACCS1/((PLBDAS(1:KSIZE)**2) ) + & - XLBRACCS2/( PLBDAS(1:KSIZE) * PLBDAR(1:KSIZE) ) + & - XLBRACCS3/( (PLBDAR(1:KSIZE)**2)) )/PLBDAR(1:KSIZE)**4 + ICEP%XFRACCSS*( PLBDAS(1:KSIZE)**ICED%XCXS )*( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) & + *( ICEP%XLBRACCS1/((PLBDAS(1:KSIZE)**2) ) + & + ICEP%XLBRACCS2/( PLBDAS(1:KSIZE) * PLBDAR(1:KSIZE) ) + & + ICEP%XLBRACCS3/( (PLBDAR(1:KSIZE)**2)) )/PLBDAR(1:KSIZE)**4 PRS_TEND(1:KSIZE, IRRACCSS) =ZZW(1:KSIZE)*ZZW6(1:KSIZE) END WHERE ! @@ -349,11 +347,11 @@ ELSE ! RACCS-kernel ! DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + ZVEC3(JJ) = ( ICEP%XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - - ( XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + - ( ICEP%XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - ICEP%XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. @@ -367,11 +365,11 @@ ELSE ! SACCRG-kernel ! DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & - - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + ZVEC3(JJ) = ( ICEP%XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & + - ICEP%XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * ZVEC2(JJ) & - - ( XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & - - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + - ( ICEP%XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & + - ICEP%XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * (ZVEC2(JJ) - 1.0) END DO ZZW(:) = 0. @@ -383,11 +381,11 @@ ELSE ! into graupeln ! WHERE(GACC(1:KSIZE)) - PRS_TEND(1:KSIZE, IRSACCRG) = XFSACCRG*ZZW(1:KSIZE)* & ! RSACCRG - ( PLBDAS(1:KSIZE)**(XCXS-XBS) )*( PRHODREF(1:KSIZE)**(-XCEXVT-1.) ) & - *( XLBSACCR1/((PLBDAR(1:KSIZE)**2) ) + & - XLBSACCR2/( PLBDAR(1:KSIZE) * PLBDAS(1:KSIZE) ) + & - XLBSACCR3/( (PLBDAS(1:KSIZE)**2)) )/PLBDAR(1:KSIZE) + PRS_TEND(1:KSIZE, IRSACCRG) = ICEP%XFSACCRG*ZZW(1:KSIZE)* & ! RSACCRG + ( PLBDAS(1:KSIZE)**(ICED%XCXS-ICED%XBS) )*( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) & + *( ICEP%XLBSACCR1/((PLBDAR(1:KSIZE)**2) ) + & + ICEP%XLBSACCR2/( PLBDAR(1:KSIZE) * PLBDAS(1:KSIZE) ) + & + ICEP%XLBSACCR3/( (PLBDAS(1:KSIZE)**2)) )/PLBDAR(1:KSIZE) END WHERE ENDIF ENDIF @@ -395,7 +393,7 @@ ENDIF DO JL=1, KSIZE ! More restrictive ACC mask to be used for accretion by negative temperature only ZACC(JL) = ZACC(JL) * & - &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) + &MAX(0., -SIGN(1., PT(JL)-CST%XTT)) ! WHERE(PT(:)<XTT) PRRACCSS(JL)=ZACC(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRRACCSS)) ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRRACCSS(JL)) ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRRACCS)-PRRACCSS(JL))) ! proportion we are able to freeze @@ -412,8 +410,8 @@ ENDDO !* 5.3 Conversion-Melting of the aggregates ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) + &MAX(0., -SIGN(1., CST%XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -423,18 +421,18 @@ IF(LDSOFT) THEN ENDDO ELSE DO JL=1, KSIZE - PRSMLTG(JL)=ZMASK(JL)*PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + PRSMLTG(JL)=ZMASK(JL)*PRVT(JL)*PPRES(JL)/(CST%XEPSILO+PRVT(JL)) ! Vapor pressure ENDDO - IF(LEVLIMIT) THEN + IF(PARAMI%LEVLIMIT) THEN WHERE(ZMASK(:)==1.) - PRSMLTG(:)=MIN(PRSMLTG(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) + PRSMLTG(:)=MIN(PRSMLTG(:), EXP(CST%XALPW-CST%XBETAW/PT(:)-CST%XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) END WHERE ENDIF DO JL=1, KSIZE PRSMLTG(JL)=ZMASK(JL)*( & - & PKA(JL)*(XTT-PT(JL)) + & - & ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - & *(XESTT-PRSMLTG(JL))/(XRV*PT(JL)) ) & + & PKA(JL)*(CST%XTT-PT(JL)) + & + & ( PDV(JL)*(CST%XLVTT + ( CST%XCPV - CST%XCL ) * ( PT(JL) - CST%XTT )) & + & *(CST%XESTT-PRSMLTG(JL))/(CST%XRV*PT(JL)) ) & &) ENDDO PRCMLTSR(:) = 0. @@ -442,12 +440,12 @@ ELSE ! ! compute RSMLT ! - PRSMLTG(1:KSIZE) = XFSCVMG*MAX( 0.0,( -PRSMLTG(1:KSIZE) * & - ( X0DEPS* PLBDAS(1:KSIZE)**XEX0DEPS + & - X1DEPS*PCJ(1:KSIZE)*PLBDAS(1:KSIZE)**XEX1DEPS ) - & + PRSMLTG(1:KSIZE) = ICEP%XFSCVMG*MAX( 0.0,( -PRSMLTG(1:KSIZE) * & + ( ICEP%X0DEPS* PLBDAS(1:KSIZE)**ICEP%XEX0DEPS + & + ICEP%X1DEPS*PCJ(1:KSIZE)*PLBDAS(1:KSIZE)**ICEP%XEX1DEPS ) - & ( PRS_TEND(1:KSIZE, IRCRIMS) + PRS_TEND(1:KSIZE, IRRACCS) ) * & - ( PRHODREF(1:KSIZE)*XCL*(XTT-PT(1:KSIZE))) ) / & - ( PRHODREF(1:KSIZE)*XLMTT ) ) + ( PRHODREF(1:KSIZE)*CST%XCL*(CST%XTT-PT(1:KSIZE))) ) / & + ( PRHODREF(1:KSIZE)*CST%XLMTT ) ) ! When T < XTT, rc is collected by snow (riming) to produce snow and graupel ! When T > XTT, if riming was still enabled, rc would produce snow and graupel with snow becomming graupel (conversion/melting) and graupel becomming rain (melting) ! To insure consistency when crossing T=XTT, rc collected with T>XTT must be transformed in rain. diff --git a/src/common/micro/mode_ice4_rimltc.F90 b/src/common/micro/mode_ice4_rimltc.F90 index eec978566f405fd7695ee6ba98d3d27af4978bf7..d8957254c79e2b5800c1fe6bd5c0d8e10d25a016 100644 --- a/src/common/micro/mode_ice4_rimltc.F90 +++ b/src/common/micro/mode_ice4_rimltc.F90 @@ -7,7 +7,7 @@ MODULE MODE_ICE4_RIMLTC IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_RIMLTC(KSIZE, PCOMPUTE, & +SUBROUTINE ICE4_RIMLTC(CST, PARAMI, KSIZE, PCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &PT, & &PTHT, PRIT, & @@ -29,8 +29,8 @@ SUBROUTINE ICE4_RIMLTC(KSIZE, PCOMPUTE, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XTT -USE MODD_PARAM_ICE, ONLY: LFEEDBACKT +USE MODD_CST, ONLY: CST_t +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! @@ -38,6 +38,8 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI INTEGER, INTENT(IN) :: KSIZE REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function @@ -62,15 +64,15 @@ IF (LHOOK) CALL DR_HOOK('ICE4_RIMLTC',0,ZHOOK_HANDLE) PRIMLTC_MR(:)=0. DO JL=1, KSIZE ZMASK(JL)=MAX(0., -SIGN(1., -PRIT(JL))) * & ! PRIT(:)>0. - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! PT(:)>XTT + &MAX(0., -SIGN(1., CST%XTT-PT(JL))) * & ! PT(:)>XTT &PCOMPUTE(JL) PRIMLTC_MR(JL)=PRIT(JL) * ZMASK(JL) ENDDO -IF(LFEEDBACKT) THEN +IF(PARAMI%LFEEDBACKT) THEN !Limitation due to 0 crossing of temperature DO JL=1, KSIZE - PRIMLTC_MR(JL)=MIN(PRIMLTC_MR(JL), MAX(0., (PTHT(JL)-XTT/PEXN(JL)) / (PLSFACT(JL)-PLVFACT(JL)))) + PRIMLTC_MR(JL)=MIN(PRIMLTC_MR(JL), MAX(0., (PTHT(JL)-CST%XTT/PEXN(JL)) / (PLSFACT(JL)-PLVFACT(JL)))) ENDDO ENDIF diff --git a/src/common/micro/mode_ice4_rrhong.F90 b/src/common/micro/mode_ice4_rrhong.F90 index 0dde4062887f9af811ae6139a88241d6375c61e5..bd1fcd413b2b0cd6b99ddb847ca00f135caa49d0 100644 --- a/src/common/micro/mode_ice4_rrhong.F90 +++ b/src/common/micro/mode_ice4_rrhong.F90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_RRHONG IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_RRHONG(KSIZE, PCOMPUTE, & +SUBROUTINE ICE4_RRHONG(CST, PARAMI, ICED, KSIZE, PCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &PT, PRRT, & &PTHT, & @@ -28,9 +28,9 @@ SUBROUTINE ICE4_RRHONG(KSIZE, PCOMPUTE, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XTT -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN -USE MODD_PARAM_ICE, ONLY: LFEEDBACKT +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 PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! @@ -38,6 +38,9 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KSIZE REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function @@ -61,15 +64,15 @@ IF (LHOOK) CALL DR_HOOK('ICE4_RRHONG',0,ZHOOK_HANDLE) ! PRRHONG_MR(:) = 0. DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0 - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(CST%XTT-35.0))) * & ! PT(:)<XTT-35.0 + &MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) &PCOMPUTE(JL) PRRHONG_MR(JL)=PRRT(JL) * ZMASK(JL) ENDDO -IF(LFEEDBACKT) THEN +IF(PARAMI%LFEEDBACKT) THEN !Limitation due to -35 crossing of temperature DO JL=1, KSIZE - PRRHONG_MR(JL)=MIN(PRRHONG_MR(JL), MAX(0., ((XTT-35.)/PEXN(JL)-PTHT(JL))/(PLSFACT(JL)-PLVFACT(JL)))) + PRRHONG_MR(JL)=MIN(PRRHONG_MR(JL), MAX(0., ((CST%XTT-35.)/PEXN(JL)-PTHT(JL))/(PLSFACT(JL)-PLVFACT(JL)))) ENDDO ENDIF ! diff --git a/src/common/micro/mode_ice4_rsrimcg_old.F90 b/src/common/micro/mode_ice4_rsrimcg_old.F90 index ff29be25fd07ae4515f0be23d6fe76c44f126381..c833ca45f53e72380e7d272ec23a48a73c375a77 100644 --- a/src/common/micro/mode_ice4_rsrimcg_old.F90 +++ b/src/common/micro/mode_ice4_rsrimcg_old.F90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_RSRIMCG_OLD IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_RSRIMCG_OLD(KSIZE, LDSOFT, LDCOMPUTE, & +SUBROUTINE ICE4_RSRIMCG_OLD(CST, ICEP, ICED, KSIZE, LDSOFT, LDCOMPUTE, & &PRHODREF, & &PLBDAS, & &PT, PRCT, PRST, & @@ -30,10 +30,9 @@ SUBROUTINE ICE4_RSRIMCG_OLD(KSIZE, LDSOFT, LDCOMPUTE, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XTT -USE MODD_PARAM_ICE, ONLY: CSNOWRIMING -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: NGAMINC, XEXSRIMCG, XGAMINC_RIM2, XRIMINTP1, XRIMINTP2, XSRIMCG +USE MODD_CST, ONLY: CST_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 ! @@ -41,6 +40,9 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KSIZE LOGICAL, INTENT(IN) :: LDSOFT LOGICAL, DIMENSION(KSIZE), INTENT(IN) :: LDCOMPUTE @@ -74,7 +76,7 @@ IF(.NOT. LDSOFT) THEN IGRIM = 0 GRIM(:) = .FALSE. DO JL = 1, SIZE(GRIM) - IF(PRCT(JL)>XRTMIN(2) .AND. PRST(JL)>XRTMIN(5) .AND. LDCOMPUTE(JL) .AND. PT(JL)<XTT) THEN + IF(PRCT(JL)>ICED%XRTMIN(2) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL) .AND. PT(JL)<CST%XTT) THEN IGRIM = IGRIM + 1 IVEC1(IGRIM) = JL GRIM(JL) = .TRUE. @@ -93,8 +95,8 @@ IF(.NOT. LDSOFT) THEN ! set of Lbda_s used to tabulate some moments of the incomplete ! gamma function ! - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN(REAL(NGAMINC)-0.00001, & - XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN(REAL(ICEP%NGAMINC)-0.00001, & + ICEP%XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + ICEP%XRIMINTP2 ) ) IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) @@ -102,8 +104,8 @@ IF(.NOT. LDSOFT) THEN ! 5.1.5 perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) ! - ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZVEC1(1:IGRIM) = ICEP%XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - ICEP%XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) ZZW(:) = 0. DO JL = 1, IGRIM ZZW(IVEC1(JL)) = ZVEC1(JL) @@ -114,7 +116,7 @@ IF(.NOT. LDSOFT) THEN ! ! WHERE(GRIM(:)) - PRSRIMCG_MR(:) = XSRIMCG * PLBDAS(:)**XEXSRIMCG & ! RSRIMCG + PRSRIMCG_MR(:) = ICEP%XSRIMCG * PLBDAS(:)**ICEP%XEXSRIMCG & ! RSRIMCG * (1.0 - ZZW(:) )/PRHODREF(:) PRSRIMCG_MR(:)=MIN(PRST(:), PRSRIMCG_MR(:)) END WHERE diff --git a/src/common/micro/mode_ice4_sedimentation_split.F90 b/src/common/micro/mode_ice4_sedimentation_split.F90 index 403e7b89b68185dca6d0b6f610066be4df6b75cc..4390221369162981bf149baa01d972a171634a39 100644 --- a/src/common/micro/mode_ice4_sedimentation_split.F90 +++ b/src/common/micro/mode_ice4_sedimentation_split.F90 @@ -42,7 +42,7 @@ USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t ! USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL ! -USE MODI_GAMMA +USE MODI_GAMMA, ONLY: GAMMA ! IMPLICIT NONE ! diff --git a/src/common/micro/mode_ice4_sedimentation_stat.F90 b/src/common/micro/mode_ice4_sedimentation_stat.F90 index 760283f88769e9260584fd79c070df0153226863..937b9a32a7c3ef217bb4e5d7637dcce6d8c069cf 100644 --- a/src/common/micro/mode_ice4_sedimentation_stat.F90 +++ b/src/common/micro/mode_ice4_sedimentation_stat.F90 @@ -43,7 +43,7 @@ USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_CST, ONLY: CST_t USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t -USE MODI_GAMMA +USE MODI_GAMMA, ONLY: GAMMA ! IMPLICIT NONE ! diff --git a/src/common/micro/mode_ice4_slow.F90 b/src/common/micro/mode_ice4_slow.F90 index d4282190654f60bc33f820cce7d441cc8d311a5d..093cba7aeb85a77b7cde467d5295258420453488 100644 --- a/src/common/micro/mode_ice4_slow.F90 +++ b/src/common/micro/mode_ice4_slow.F90 @@ -5,7 +5,7 @@ MODULE MODE_ICE4_SLOW IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT, & +SUBROUTINE ICE4_SLOW(CST, ICEP, ICED, KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT, & &PSSI, PLVFACT, PLSFACT, & &PRVT, PRCT, PRIT, PRST, PRGT, & &PLBDAS, PLBDAG, & @@ -30,11 +30,9 @@ SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XTT -USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT, XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: X0DEPG, X0DEPS, X1DEPG, X1DEPS, XACRIAUTI, XALPHA3, XBCRIAUTI, XBETA3, & - & XCOLEXIS, XCRIAUTI, XEX0DEPG, XEX0DEPS, XEX1DEPG, XEX1DEPS, XEXIAGGS, & - & XFIAGGS, XHON, XTEXAUTI, XTIMAUTI +USE MODD_CST, ONLY: CST_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 ! @@ -42,6 +40,9 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KSIZE LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE @@ -89,8 +90,8 @@ IF (LHOOK) CALL DR_HOOK('ICE4_SLOW', 0, ZHOOK_HANDLE) !* 3.2 compute the homogeneous nucleation source: RCHONI ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0 - &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) + ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(CST%XTT-35.0))) * & ! PT(:)<XTT-35.0 + &MAX(0., -SIGN(1., ICED%XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -101,11 +102,11 @@ ELSE PRCHONI(:) = 0. WHERE(ZMASK(:)==1.) #ifdef REPRO48 - PRCHONI(:) = XHON*PRHODREF(:)*PRCT(:) & - *EXP( XALPHA3*(PT(:)-XTT)-XBETA3 ) + PRCHONI(:) = ICEP%XHON*PRHODREF(:)*PRCT(:) & + *EXP( ICEP%XALPHA3*(PT(:)-CST%XTT)-ICEP%XBETA3 ) #else - PRCHONI(:) = MIN(1000.,XHON*PRHODREF(:)*PRCT(:) & - *EXP( XALPHA3*(PT(:)-XTT)-XBETA3 )) + PRCHONI(:) = MIN(1000.,ICEP%XHON*PRHODREF(:)*PRCT(:) & + *EXP( ICEP%XALPHA3*(PT(:)-CST%XTT)-ICEP%XBETA3 )) #endif ENDWHERE ENDIF @@ -116,7 +117,7 @@ ENDIF !* 3.4.2 compute the riming-conversion of r_c for r_i production: RCAUTI ! ! ZZW(:) = 0.0 -! ZTIMAUTIC = SQRT( XTIMAUTI*XTIMAUTC ) +! ZTIMAUTIC = SQRT( ICEP%XTIMAUTI*ICEP%XTIMAUTC ) ! WHERE ( (PRCT(:)>0.0) .AND. (PRIT(:)>0.0) .AND. (PRCS(:)>0.0) ) ! ZZW(:) = MIN( PRCS(:),ZTIMAUTIC * MAX( SQRT( PRIT(:)*PRCT(:) ),0.0 ) ) ! PRIS(:) = PRIS(:) + ZZW(:) @@ -127,8 +128,8 @@ ENDIF !* 3.4.3 compute the deposition on r_s: RVDEPS ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(1)-PRVT(JL))) * & !PRVT(:)>XRTMIN(1) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !PRST(:)>XRTMIN(5) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(1)-PRVT(JL))) * & !PRVT(:)>XRTMIN(1) + &MAX(0., -SIGN(1., ICED%XRTMIN(5)-PRST(JL))) * & !PRST(:)>XRTMIN(5) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -139,15 +140,15 @@ ELSE PRVDEPS(:) = 0. WHERE(ZMASK(:)==1.) PRVDEPS(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & - ( X0DEPS*PLBDAS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) + ( ICEP%X0DEPS*PLBDAS(:)**ICEP%XEX0DEPS + ICEP%X1DEPS*PCJ(:)*PLBDAS(:)**ICEP%XEX1DEPS ) END WHERE ENDIF ! !* 3.4.4 compute the aggregation on r_s: RIAGGS ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! PRIT(:)>XRTMIN(4) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! PRST(:)>XRTMIN(5) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(4)-PRIT(JL))) * & ! PRIT(:)>XRTMIN(4) + &MAX(0., -SIGN(1., ICED%XRTMIN(5)-PRST(JL))) * & ! PRST(:)>XRTMIN(5) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -157,17 +158,17 @@ IF(LDSOFT) THEN ELSE PRIAGGS(:) = 0. WHERE(ZMASK(:)==1) - PRIAGGS(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) & + PRIAGGS(:) = ICEP%XFIAGGS * EXP( ICEP%XCOLEXIS*(PT(:)-CST%XTT) ) & * PRIT(:) & - * PLBDAS(:)**XEXIAGGS & - * PRHODREF(:)**(-XCEXVT) + * PLBDAS(:)**ICEP%XEXIAGGS & + * PRHODREF(:)**(-ICED%XCEXVT) END WHERE ENDIF ! !* 3.4.5 compute the autoconversion of r_i for r_s production: RIAUTS ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PHLI_HRI(JL))) * & ! PHLI_HRI(:)>XRTMIN(4) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(4)-PHLI_HRI(JL))) * & ! PHLI_HRI(:)>XRTMIN(4) &MAX(0., -SIGN(1., 1.E-20-PHLI_HCF(JL))) * & ! PHLI_HCF(:) .GT. 1.E-20 &PCOMPUTE(JL) ENDDO @@ -177,10 +178,10 @@ IF(LDSOFT) THEN ENDDO ELSE PRIAUTS(:) = 0. - !ZCRIAUTI(:)=MIN(XCRIAUTI,10**(0.06*(PT(:)-XTT)-3.5)) - ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) + !ZCRIAUTI(:)=MIN(ICEP%XCRIAUTI,10**(0.06*(PT(:)-CST%XTT)-3.5)) + ZCRIAUTI(:)=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(PT(:)-CST%XTT)+ICEP%XBCRIAUTI)) WHERE(ZMASK(:)==1.) - PRIAUTS(:) = XTIMAUTI * EXP( XTEXAUTI*(PT(:)-XTT) ) & + PRIAUTS(:) = ICEP%XTIMAUTI * EXP( ICEP%XTEXAUTI*(PT(:)-CST%XTT) ) & * MAX( PHLI_HRI(:)/PHLI_HCF(:)-ZCRIAUTI(:),0.0 ) PRIAUTS(:) = PHLI_HCF(:)*PRIAUTS(:) END WHERE @@ -190,8 +191,8 @@ ENDIF ! ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(1)-PRVT(JL))) * & ! PRVT(:)>XRTMIN(1) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! PRGT(:)>XRTMIN(6) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(1)-PRVT(JL))) * & ! PRVT(:)>XRTMIN(1) + &MAX(0., -SIGN(1., ICED%XRTMIN(6)-PRGT(JL))) * & ! PRGT(:)>XRTMIN(6) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -202,7 +203,7 @@ ELSE PRVDEPG(:) = 0. WHERE(ZMASK(:)==1.) PRVDEPG(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & - ( X0DEPG*PLBDAG(:)**XEX0DEPG + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) + ( ICEP%X0DEPG*PLBDAG(:)**ICEP%XEX0DEPG + ICEP%X1DEPG*PCJ(:)*PLBDAG(:)**ICEP%XEX1DEPG ) END WHERE ENDIF DO JL=1, KSIZE diff --git a/src/common/micro/mode_ice4_tendencies.F90 b/src/common/micro/mode_ice4_tendencies.F90 index b07aaebebe7564db43f285b570079b085786d7a4..a81e92979cf90486003d0a898844f18e65094935 100644 --- a/src/common/micro/mode_ice4_tendencies.F90 +++ b/src/common/micro/mode_ice4_tendencies.F90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_TENDENCIES IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, & +SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, & &KRR, ODSOFT, PCOMPUTE, & &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & &HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & @@ -47,7 +47,7 @@ SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_BUDGET, ONLY : LBU_ENABLE +USE MODD_BUDGET, ONLY: TBUDGETCONF_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL USE MODD_CST, ONLY: CST_t @@ -89,6 +89,7 @@ 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 +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF INTEGER, INTENT(IN) :: KPROMA, KSIZE INTEGER, INTENT(IN) :: KRR LOGICAL, INTENT(IN) :: ODSOFT @@ -214,7 +215,7 @@ ELSE ! -------------------------------------- !DIR$ VECTOR ALWAYS DO CONCURRENT (JL=1:KSIZE) - CALL ICE4_NUCLEATION_ELEM(LLCOMPUTE(JL), & + CALL ICE4_NUCLEATION_ELEM(CST, PARAMI, ICEP, ICED, LLCOMPUTE(JL), & ZVART(JL,ITH), PPRES(JL), PRHODREF(JL), PEXN(JL), PLSFACT(JL), ZT(JL), & ZVART(JL,IRV), & PCIT(JL), PRVHENI_MR(JL)) @@ -228,7 +229,7 @@ ELSE ! !* 3.3 compute the spontaneous freezing source: RRHONG ! - CALL ICE4_RRHONG(KSIZE, PCOMPUTE, & + CALL ICE4_RRHONG(CST, PARAMI, ICED, KSIZE, PCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &ZT, ZVART(:,IRR), & &ZVART(:,ITH), & @@ -242,7 +243,7 @@ ELSE ! !* 7.1 cloud ice melting ! - CALL ICE4_RIMLTC(KSIZE, PCOMPUTE, & + CALL ICE4_RIMLTC(CST, PARAMI, KSIZE, PCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &ZT, & &ZVART(:,ITH), ZVART(:,IRI), & @@ -261,7 +262,7 @@ ELSE WHERE(ZVART(1:KSIZE,IRS)>0.) ZLBDAS(1:KSIZE) = MIN(ICED%XLBDAS_MAX, ICED%XLBS*(PRHODREF(1:KSIZE)*MAX(ZVART(1:KSIZE,IRS), ICED%XRTMIN(5)))**ICED%XLBEXS) END WHERE - CALL ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, LLCOMPUTE, & + CALL ICE4_RSRIMCG_OLD(CST, ICEP, ICED, KSIZE, ODSOFT, LLCOMPUTE, & &PRHODREF, & &ZLBDAS, & &ZT, ZVART(:,IRC), ZVART(:,IRS), & @@ -309,7 +310,7 @@ ELSE ENDIF ! ODSOFT ! !Cloud water split between high and low content part is done here -CALL ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF,& +CALL ICE4_COMPUTE_PDF(CST, ICEP, ICED, KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF,& PRHODREF, ZVART(:,IRC), ZVART(:,IRI), PCF, ZT, PSIGMA_RC, & PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, & PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, ZRAINFR) @@ -383,7 +384,7 @@ DO JL=1, KSIZE ENDDO ! ! -CALL ICE4_SLOW(KSIZE, ODSOFT, PCOMPUTE, PRHODREF, ZT, & +CALL ICE4_SLOW(CST, ICEP, ICED, KSIZE, ODSOFT, PCOMPUTE, PRHODREF, ZT, & &PSSI, PLVFACT, PLSFACT, & &ZVART(:,IRV), ZVART(:,IRC), ZVART(:,IRI), ZVART(:,IRS), ZVART(:,IRG), & &ZLBDAS, ZLBDAG, & @@ -400,7 +401,7 @@ CALL ICE4_SLOW(KSIZE, ODSOFT, PCOMPUTE, PRHODREF, ZT, & ! IF(OWARM) THEN ! Check if the formation of the raindrops by the slow ! warm processes is allowed - CALL ICE4_WARM(KSIZE, ODSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & + CALL ICE4_WARM(CST, ICEP, ICED, KSIZE, ODSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & &PRHODREF, PLVFACT, ZT, PPRES, ZVART(:,ITH),& &ZLBDAR, ZLBDAR_RF, ZKA, ZDV, ZCJ, & &PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & @@ -420,7 +421,7 @@ END IF !* 4. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_s ! ---------------------------------------------- ! -CALL ICE4_FAST_RS(KPROMA, KSIZE, ODSOFT, PCOMPUTE, & +CALL ICE4_FAST_RS(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, ODSOFT, PCOMPUTE, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &ZDV, ZKA, ZCJ, & &ZLBDAR, ZLBDAS, & @@ -443,7 +444,7 @@ DO JL=1, KSIZE & PRSACCRG(JL) + PRCRIMSG(JL) + PRSRIMCG(JL) ZRGSI_MR(JL) = PRRHONG_MR(JL) + PRSRIMCG_MR(JL) ENDDO -CALL ICE4_FAST_RG(KPROMA, KSIZE, ODSOFT, PCOMPUTE, KRR, & +CALL ICE4_FAST_RG(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, ODSOFT, PCOMPUTE, KRR, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &ZDV, ZKA, ZCJ, PCIT, & &ZLBDAR, ZLBDAS, ZLBDAG, & @@ -462,7 +463,7 @@ CALL ICE4_FAST_RG(KPROMA, KSIZE, ODSOFT, PCOMPUTE, KRR, & ! ---------------------------------------------- ! IF (KRR==7) THEN - CALL ICE4_FAST_RH(KPROMA, KSIZE, ODSOFT, PCOMPUTE, ZWETG, & + CALL ICE4_FAST_RH(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, ODSOFT, PCOMPUTE, ZWETG, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &ZDV, ZKA, ZCJ, & &ZLBDAS, ZLBDAG, ZLBDAR, ZLBDAH, & @@ -471,7 +472,7 @@ IF (KRR==7) THEN &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & &PRH_TEND, & &PA(:,ITH), PA(:,IRC), PA(:,IRR), PA(:,IRI), PA(:,IRS), PA(:,IRG), PA(:,IRH)) -ELSEIF (LBU_ENABLE) THEN +ELSEIF (BUCONF%LBU_ENABLE) THEN PRCWETH(:)=0. PRIWETH(:)=0. PRSWETH(:)=0. @@ -492,7 +493,7 @@ END IF !* 7. COMPUTES SPECIFIC SOURCES OF THE WARM AND COLD CLOUDY SPECIES ! ------------------------------------------------------------- ! -CALL ICE4_FAST_RI(KSIZE, ODSOFT, PCOMPUTE, & +CALL ICE4_FAST_RI(ICEP, ICED, KSIZE, ODSOFT, PCOMPUTE, & &PRHODREF, PLVFACT, PLSFACT, & &ZAI, ZCJ, PCIT, & &PSSI, & diff --git a/src/common/micro/mode_ice4_warm.F90 b/src/common/micro/mode_ice4_warm.F90 index 8c844f09292f070d1fa220b6c3df93268549b5bc..0e9372274d3bb99023ea74bb558fe2dfd0906364 100644 --- a/src/common/micro/mode_ice4_warm.F90 +++ b/src/common/micro/mode_ice4_warm.F90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_WARM IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & +SUBROUTINE ICE4_WARM(CST, ICEP, ICED, KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & &PRHODREF, PLVFACT, PT, PPRES, PTHT, & &PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, & &PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & @@ -32,9 +32,9 @@ SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XALPW, XBETAW, XCL, XCPD, XCPV, XGAMW, XLVTT, XMD, XMV, XRV, XTT, XEPSILO -USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT, XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: X0EVAR, X1EVAR, XCRIAUTC, XEX0EVAR, XEX1EVAR, XEXCACCR, XFCACCR, XTIMAUTC +USE MODD_CST, ONLY: CST_t +USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t ! USE MODE_MSG USE PARKIND1, ONLY : JPRB @@ -44,6 +44,9 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KSIZE LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE @@ -94,7 +97,7 @@ IF (LHOOK) CALL DR_HOOK('ICE4_WARM', 0, ZHOOK_HANDLE) !* 4.2 compute the autoconversion of r_c for r_r production: RCAUTR ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) #ifdef REPRO48 &MAX(0., -SIGN(1., -PHLC_HCF(JL))) * & ! PHLC_HCF(:) .GT. 0. #else @@ -109,7 +112,7 @@ IF(LDSOFT) THEN ELSE PRCAUTR(:) = 0. WHERE(ZMASK(:)==1.) - PRCAUTR(:) = XTIMAUTC*MAX(PHLC_HRC(:)/PHLC_HCF(:) - XCRIAUTC/PRHODREF(:), 0.0) + PRCAUTR(:) = ICEP%XTIMAUTC*MAX(PHLC_HRC(:)/PHLC_HCF(:) - ICEP%XCRIAUTC/PRHODREF(:), 0.0) PRCAUTR(:) = PHLC_HCF(:)*PRCAUTR(:) END WHERE ENDIF @@ -120,8 +123,8 @@ ENDIF IF (HSUBG_RC_RR_ACCR=='NONE') THEN !CLoud water and rain are diluted over the grid box DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) + &MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -131,9 +134,9 @@ IF (HSUBG_RC_RR_ACCR=='NONE') THEN ELSE PRCACCR(:) = 0. WHERE(ZMASK(:)==1.) - PRCACCR(:) = XFCACCR * PRCT(:) & - * PLBDAR(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) + PRCACCR(:) = ICEP%XFCACCR * PRCT(:) & + * PLBDAR(:)**ICEP%XEXCACCR & + * PRHODREF(:)**(-ICED%XCEXVT) END WHERE ENDIF @@ -146,18 +149,18 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN ! if PRF>PCF (rain is falling in cloud and in clear sky): PCF-PHLC_HCF ! => min(PCF, PRF)-PHLC_HCF DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) + &MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) &PCOMPUTE(JL) ZMASK1(JL)=ZMASK(JL) * & - &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) + &MAX(0., -SIGN(1., ICED%XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) #ifdef REPRO48 &MAX(0., -SIGN(1., -PHLC_HCF(JL))) ! PHLC_HCF(:)>0. #else &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) ! PHLC_HCF(:)>1.E-20 #endif ZMASK2(JL)=ZMASK(JL) * & - &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_LRC(JL))) * & ! PHLC_LRC(:)>XRTMIN(2) + &MAX(0., -SIGN(1., ICED%XRTMIN(2)-PHLC_LRC(JL))) * & ! PHLC_LRC(:)>XRTMIN(2) #ifdef REPRO48 &MAX(0., -SIGN(1., -PHLC_LCF(JL))) ! PHLC_LCF(:)>0. #else @@ -172,16 +175,16 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN PRCACCR(:)=0. WHERE(ZMASK1(:)==1.) !Accretion due to rain falling in high cloud content - PRCACCR(:) = XFCACCR * ( PHLC_HRC(:)/PHLC_HCF(:) ) & - * PLBDAR_RF(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) & + PRCACCR(:) = ICEP%XFCACCR * ( PHLC_HRC(:)/PHLC_HCF(:) ) & + * PLBDAR_RF(:)**ICEP%XEXCACCR & + * PRHODREF(:)**(-ICED%XCEXVT) & * PHLC_HCF END WHERE WHERE(ZMASK2(:)==1.) !We add acrretion due to rain falling in low cloud content - PRCACCR(:) = PRCACCR(:) + XFCACCR * ( PHLC_LRC(:)/PHLC_LCF(:) ) & - * PLBDAR_RF(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) & + PRCACCR(:) = PRCACCR(:) + ICEP%XFCACCR * ( PHLC_LRC(:)/PHLC_LCF(:) ) & + * PLBDAR_RF(:)**ICEP%XEXCACCR & + * PRHODREF(:)**(-ICED%XCEXVT) & * (MIN(PCF(:), PRF(:))-PHLC_HCF(:)) END WHERE ENDIF @@ -193,8 +196,8 @@ ENDIF ! IF (HSUBG_RR_EVAP=='NONE') THEN DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &MAX(0., SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)<=XRTMIN(2) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + &MAX(0., SIGN(1., ICED%XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)<=XRTMIN(2) &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -205,13 +208,13 @@ IF (HSUBG_RR_EVAP=='NONE') THEN PRREVAV(:) = 0. !Evaporation only when there's no cloud (RC must be 0) WHERE(ZMASK(:)==1.) - PRREVAV(:) = EXP( XALPW - XBETAW/PT(:) - XGAMW*ALOG(PT(:) ) ) ! es_w - ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) ) + PRREVAV(:) = EXP( CST%XALPW - CST%XBETAW/PT(:) - CST%XGAMW*ALOG(PT(:) ) ) ! es_w + ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( CST%XEPSILO * PRREVAV(:) ) ! Undersaturation over water - PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(PT(:)-XTT) )**2 / ( PKA(:)*XRV*PT(:)**2 ) & - + ( XRV*PT(:) ) / ( PDV(:)*PRREVAV(:) ) + PRREVAV(:) = ( CST%XLVTT+(CST%XCPV-CST%XCL)*(PT(:)-CST%XTT) )**2 / ( PKA(:)*CST%XRV*PT(:)**2 ) & + + ( CST%XRV*PT(:) ) / ( PDV(:)*PRREVAV(:) ) PRREVAV(:) = ( MAX( 0.0,ZUSW(:) )/(PRHODREF(:)*PRREVAV(:)) ) * & - ( X0EVAR*PLBDAR(:)**XEX0EVAR+X1EVAR*PCJ(:)*PLBDAR(:)**XEX1EVAR ) + ( ICEP%X0EVAR*PLBDAR(:)**ICEP%XEX0EVAR+ICEP%X1EVAR*PCJ(:)*PLBDAR(:)**ICEP%XEX1EVAR ) END WHERE ENDIF @@ -234,7 +237,7 @@ ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN !et plusieurs versions (comme actuellement, en ciel clair, en ciel nuageux) de PKA, PDV, PCJ dans rain_ice !On utiliserait la bonne version suivant l'option NONE, CLFR... dans l'évaporation et ailleurs DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + ZMASK(JL)=MAX(0., -SIGN(1., ICED%XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) &MAX(0., -SIGN(1., PCF(JL)-ZZW4(JL))) * & ! ZZW4(:) > PCF(:) &PCOMPUTE(JL) ENDDO @@ -249,22 +252,22 @@ ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN ! Bechtold et al. 1993 ! ! T_l - ZTHLT(:) = PTHT(:) - XLVTT*PTHT(:)/XCPD/PT(:)*PRCT(:) + ZTHLT(:) = PTHT(:) - CST%XLVTT*PTHT(:)/CST%XCPD/PT(:)*PRCT(:) ! ! T^u = T_l = theta_l * (T/theta) ZZW2(:) = ZTHLT(:) * PT(:) / PTHT(:) ! ! es_w with new T^u - PRREVAV(:) = EXP( XALPW - XBETAW/ZZW2(:) - XGAMW*ALOG(ZZW2(:) ) ) + PRREVAV(:) = EXP( CST%XALPW - CST%XBETAW/ZZW2(:) - CST%XGAMW*ALOG(ZZW2(:) ) ) ! ! S, Undersaturation over water (with new theta^u) - ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) ) + ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( CST%XEPSILO * PRREVAV(:) ) ! - PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(ZZW2(:)-XTT) )**2 / ( PKA(:)*XRV*ZZW2(:)**2 ) & - + ( XRV*ZZW2(:) ) / ( PDV(:)*PRREVAV(:) ) + PRREVAV(:) = ( CST%XLVTT+(CST%XCPV-CST%XCL)*(ZZW2(:)-CST%XTT) )**2 / ( PKA(:)*CST%XRV*ZZW2(:)**2 ) & + + ( CST%XRV*ZZW2(:) ) / ( PDV(:)*PRREVAV(:) ) ! PRREVAV(:) = MAX( 0.0,ZUSW(:) )/(PRHODREF(:)*PRREVAV(:)) * & - ( X0EVAR*ZZW3(:)**XEX0EVAR+X1EVAR*PCJ(:)*ZZW3(:)**XEX1EVAR ) + ( ICEP%X0EVAR*ZZW3(:)**ICEP%XEX0EVAR+ICEP%X1EVAR*PCJ(:)*ZZW3(:)**ICEP%XEX1EVAR ) ! PRREVAV(:) = PRREVAV(:)*(ZZW4(:)-PCF(:)) END WHERE diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90 index 24b1bd5a6e297c6971bd7f1b89e92a1bc4a29922..190701ef6519d0260d94a8a19d8af7fa97f883a7 100644 --- a/src/common/micro/rain_ice.F90 +++ b/src/common/micro/rain_ice.F90 @@ -863,7 +863,7 @@ IF (KSIZE > 0) THEN !*** 4.1 Tendencies computation ! ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise - CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, & + CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, & &KPROMA, IMICRO, & &KRR, LSOFT, ZCOMPUTE, & &OWARM, PARAMI%CSUBG_RC_RR_ACCR, PARAMI%CSUBG_RR_EVAP, & @@ -1103,7 +1103,7 @@ DO JK=D%NKTB,D%NKTE IF (.NOT. ODMICRO(JI, JJ, JK)) THEN ZW0D=ZZ_LSFACT(JI, JJ, JK)/PEXN(JI, JJ, JK) ENDIF - CALL ICE4_NUCLEATION_ELEM(.NOT. ODMICRO(JI, JJ, JK), & + 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), &