diff --git a/docs/TODO b/docs/TODO index cf5bc57274f710708c0a1fdf457ab2fae2319eb8..f288b16de727ca1fcc86bd2cb444bbe078d5421c 100644 --- a/docs/TODO +++ b/docs/TODO @@ -24,7 +24,6 @@ Merge pb: - compute_updraft_rhcj10: en attente retour de Rachel et/ou Yves pour faire le merge Etape 2: array syntax -> loop -- en profiter pour supprimer args PA/PB des routines appelées depuis ice4_tendencies, comme pour nucleation - regarder si pcompute et llcompute sont toujours tous deux nécessaires dans les mode_ice4* avec le passage en do - si possible, modifier ice4_sedimentation_split* dans le même esprit que stat - transformer sedimentation_split_momentum comme sedimentation_split diff --git a/src/common/micro/mode_ice4_rimltc.F90 b/src/common/micro/mode_ice4_rimltc.F90 index d8957254c79e2b5800c1fe6bd5c0d8e10d25a016..012add3b46b1313eda451dc2b12103694eaf7e63 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(CST, PARAMI, KSIZE, PCOMPUTE, & +SUBROUTINE ICE4_RIMLTC(CST, PARAMI, KPROMA, KSIZE, LDCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &PT, & &PTHT, PRIT, & @@ -40,20 +40,19 @@ IMPLICIT NONE ! 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 -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Cloud ice at t -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIMLTC_MR ! Mixing ratio change due to cloud ice melting +INTEGER, INTENT(IN) :: KPROMA, KSIZE +LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDCOMPUTE +REAL, DIMENSION(KPROMA), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KPROMA), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(KPROMA), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(KPROMA), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KPROMA), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KPROMA), INTENT(IN) :: PRIT ! Cloud ice at t +REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRIMLTC_MR ! Mixing ratio change due to cloud ice melting ! !* 0.2 declaration of local variables ! REAL(KIND=JPRB) :: ZHOOK_HANDLE -REAL, DIMENSION(KSIZE) :: ZMASK INTEGER :: JL ! !------------------------------------------------------------------------------- @@ -61,21 +60,18 @@ IF (LHOOK) CALL DR_HOOK('ICE4_RIMLTC',0,ZHOOK_HANDLE) ! !* 7.1 cloud ice melting ! -PRIMLTC_MR(:)=0. DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., -PRIT(JL))) * & ! PRIT(:)>0. - &MAX(0., -SIGN(1., CST%XTT-PT(JL))) * & ! PT(:)>XTT - &PCOMPUTE(JL) - PRIMLTC_MR(JL)=PRIT(JL) * ZMASK(JL) + IF(PRIT(JL)>0. .AND. PT(JL)>CST%XTT .AND. LDCOMPUTE(JL)) THEN + PRIMLTC_MR(JL)=PRIT(JL) + IF(PARAMI%LFEEDBACKT) THEN + !Limitation due to 0 crossing of temperature + PRIMLTC_MR(JL)=MIN(PRIMLTC_MR(JL), MAX(0., (PTHT(JL)-CST%XTT/PEXN(JL)) / (PLSFACT(JL)-PLVFACT(JL)))) + ENDIF + ELSE + PRIMLTC_MR(JL)=0. + ENDIF ENDDO -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)-CST%XTT/PEXN(JL)) / (PLSFACT(JL)-PLVFACT(JL)))) - ENDDO -ENDIF - IF (LHOOK) CALL DR_HOOK('ICE4_RIMLTC', 1, ZHOOK_HANDLE) ! END SUBROUTINE ICE4_RIMLTC diff --git a/src/common/micro/mode_ice4_rrhong.F90 b/src/common/micro/mode_ice4_rrhong.F90 index bd1fcd413b2b0cd6b99ddb847ca00f135caa49d0..ba318d1d69b7d5f1a11df9afed41818e92d57781 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(CST, PARAMI, ICED, KSIZE, PCOMPUTE, & +SUBROUTINE ICE4_RRHONG(CST, PARAMI, ICED, KPROMA, KSIZE, LDCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &PT, PRRT, & &PTHT, & @@ -41,19 +41,18 @@ IMPLICIT NONE 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 -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRHONG_MR ! Mixing ratio change due to spontaneous freezing +INTEGER, INTENT(IN) :: KPROMA, KSIZE +LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDCOMPUTE +REAL, DIMENSION(KPROMA), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KPROMA), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(KPROMA), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(KPROMA), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KPROMA), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KPROMA), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRRHONG_MR ! Mixing ratio change due to spontaneous freezing ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(KSIZE) :: ZMASK REAL(KIND=JPRB) :: ZHOOK_HANDLE INTEGER :: JL ! @@ -62,19 +61,17 @@ IF (LHOOK) CALL DR_HOOK('ICE4_RRHONG',0,ZHOOK_HANDLE) ! !* 3.3 compute the spontaneous freezing source: RRHONG ! -PRRHONG_MR(:) = 0. DO JL=1, KSIZE - 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) + IF(PT(JL)<CST%XTT-35.0 .AND. PRRT(JL)>ICED%XRTMIN(3) .AND. LDCOMPUTE(JL)) THEN + PRRHONG_MR(JL)=PRRT(JL) + IF(PARAMI%LFEEDBACKT) THEN + !Limitation due to -35 crossing of temperature + PRRHONG_MR(JL)=MIN(PRRHONG_MR(JL), MAX(0., ((CST%XTT-35.)/PEXN(JL)-PTHT(JL))/(PLSFACT(JL)-PLVFACT(JL)))) + ENDIF + ELSE + PRRHONG_MR(JL)=0. + ENDIF ENDDO -IF(PARAMI%LFEEDBACKT) THEN - !Limitation due to -35 crossing of temperature - DO JL=1, KSIZE - PRRHONG_MR(JL)=MIN(PRRHONG_MR(JL), MAX(0., ((CST%XTT-35.)/PEXN(JL)-PTHT(JL))/(PLSFACT(JL)-PLVFACT(JL)))) - ENDDO -ENDIF ! IF (LHOOK) CALL DR_HOOK('ICE4_RRHONG', 1, ZHOOK_HANDLE) ! diff --git a/src/common/micro/mode_ice4_rsrimcg_old.F90 b/src/common/micro/mode_ice4_rsrimcg_old.F90 index c833ca45f53e72380e7d272ec23a48a73c375a77..9ee32f9aecb681751484e6f03d43fa49103778e4 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(CST, ICEP, ICED, KSIZE, LDSOFT, LDCOMPUTE, & +SUBROUTINE ICE4_RSRIMCG_OLD(CST, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, & &PRHODREF, & &PLBDAS, & &PT, PRCT, PRST, & @@ -43,23 +43,23 @@ IMPLICIT NONE 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 -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG_MR ! Mr change due to cloud droplet riming of the aggregates +INTEGER, INTENT(IN) :: KPROMA, KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDCOMPUTE +REAL, DIMENSION(KPROMA), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KPROMA), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KPROMA), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KPROMA), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KPROMA), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSRIMCG_MR ! Mr change due to cloud droplet riming of the aggregates ! !* 0.2 declaration of local variables ! -LOGICAL, DIMENSION(KSIZE) :: GRIM +LOGICAL, DIMENSION(KPROMA) :: GRIM INTEGER :: IGRIM -REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2 -INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 -REAL, DIMENSION(KSIZE) :: ZZW +REAL, DIMENSION(KPROMA) :: ZVEC1, ZVEC2 +INTEGER, DIMENSION(KPROMA) :: IVEC1, IVEC2 +REAL, DIMENSION(KPROMA) :: ZZW INTEGER :: JL REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- @@ -74,12 +74,13 @@ PRSRIMCG_MR(:)=0. ! IF(.NOT. LDSOFT) THEN IGRIM = 0 - GRIM(:) = .FALSE. - DO JL = 1, SIZE(GRIM) + DO JL = 1, KSIZE 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. + ELSE + GRIM(JL) = .FALSE. ENDIF ENDDO ! @@ -115,11 +116,13 @@ IF(.NOT. LDSOFT) THEN ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! ! - WHERE(GRIM(:)) - PRSRIMCG_MR(:) = ICEP%XSRIMCG * PLBDAS(:)**ICEP%XEXSRIMCG & ! RSRIMCG - * (1.0 - ZZW(:) )/PRHODREF(:) - PRSRIMCG_MR(:)=MIN(PRST(:), PRSRIMCG_MR(:)) + !$mnh_expand_where(JL=1:KSIZE) + WHERE(GRIM(1:KSIZE)) + PRSRIMCG_MR(1:KSIZE) = ICEP%XSRIMCG * PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG & ! RSRIMCG + * (1.0 - ZZW(1:KSIZE) )/PRHODREF(1:KSIZE) + PRSRIMCG_MR(1:KSIZE)=MIN(PRST(1:KSIZE), PRSRIMCG_MR(1:KSIZE)) END WHERE + !$mnh_end_expand_where(JL=1:KSIZE) END IF ENDIF ! diff --git a/src/common/micro/mode_ice4_tendencies.F90 b/src/common/micro/mode_ice4_tendencies.F90 index 0a8fac6408d6fda2d2bc625712d4e3a0750cd1d7..fa06bbf4486020401403f72362f9f21bba23e00e 100644 --- a/src/common/micro/mode_ice4_tendencies.F90 +++ b/src/common/micro/mode_ice4_tendencies.F90 @@ -229,7 +229,7 @@ ELSE ! !* 3.3 compute the spontaneous freezing source: RRHONG ! - CALL ICE4_RRHONG(CST, PARAMI, ICED, KSIZE, PCOMPUTE, & + CALL ICE4_RRHONG(CST, PARAMI, ICED, KPROMA, KSIZE, LLCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &ZT, ZVART(:,IRR), & &ZVART(:,ITH), & @@ -243,7 +243,7 @@ ELSE ! !* 7.1 cloud ice melting ! - CALL ICE4_RIMLTC(CST, PARAMI, KSIZE, PCOMPUTE, & + CALL ICE4_RIMLTC(CST, PARAMI, KPROMA, KSIZE, LLCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &ZT, & &ZVART(:,ITH), ZVART(:,IRI), & @@ -262,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(CST, ICEP, ICED, KSIZE, ODSOFT, LLCOMPUTE, & + CALL ICE4_RSRIMCG_OLD(CST, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LLCOMPUTE, & &PRHODREF, & &ZLBDAS, & &ZT, ZVART(:,IRC), ZVART(:,IRS), &