From 07a881cbc40b3ad3de567d85158c375ebea8262c Mon Sep 17 00:00:00 2001 From: Gaelle DELAUTIER <gaelle.delautier@meteo.fr> Date: Tue, 3 Oct 2017 16:11:51 +0200 Subject: [PATCH] B.Vie 03/10/2017 :correction bug LIMA --- src/MNH/lima_cold_hom_nucl.f90 | 17 +++++---- src/MNH/lima_cold_slow_processes.f90 | 8 ++--- src/MNH/lima_mixed.f90 | 2 +- src/MNH/lima_mixed_fast_processes.f90 | 34 +++++++++--------- src/MNH/lima_mixed_slow_processes.f90 | 12 ++++--- src/MNH/lima_phillips_integ.f90 | 50 ++++++++++++++++++-------- src/MNH/lima_phillips_ref_spectrum.f90 | 14 +++++--- src/MNH/lima_warm.f90 | 34 +++++++++++++++--- src/MNH/lima_warm_evap.f90 | 2 +- src/MNH/lima_warm_nucl.f90 | 9 ++--- src/MNH/modd_param_lima.f90 | 5 +++ src/MNH/modn_param_lima.f90 | 2 +- src/MNH/read_exsegn.f90 | 7 ++-- src/MNH/set_conc_lima.f90 | 8 +++-- 14 files changed, 134 insertions(+), 70 deletions(-) diff --git a/src/MNH/lima_cold_hom_nucl.f90 b/src/MNH/lima_cold_hom_nucl.f90 index fb50b8ace..d89582e17 100644 --- a/src/MNH/lima_cold_hom_nucl.f90 +++ b/src/MNH/lima_cold_hom_nucl.f90 @@ -390,7 +390,7 @@ IF (INEGT.GT.0) THEN ALLOCATE(ZTAU(INEGT)) ALLOCATE(ZBFACT(INEGT)) ! - WHERE( (ZZT(:)<XTT-35.0) .AND. (ZSI(:)>ZZY(:)) .AND. (ZTHS(:)<-1.0E-6) ) + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZSI(:)>ZZY(:)) ) ZLS(:) = XLSTT+(XCPV-XCI)*ZTCELSIUS(:) ! Ls ! ZPSI1(:) = ZZY(:) * (XG/(XRD*ZZT(:)))*(ZEPS*ZLS(:)/(XCPD*ZZT(:))-1.) @@ -430,7 +430,7 @@ IF (INEGT.GT.0) THEN PNFS(:,:,:,JMOD_CCN)=UNPACK( ZNFS(:,JMOD_CCN), MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:)) END DO ZZNHS(:) = ZZNHS(:) + ZZX(:) - ZNHS(:,:,:) = ZNHS(:,:,:) + UNPACK( ZZNHS(:), MASK=GNEGT(:,:,:),FIELD=0.0) + ZNHS(:,:,:) = UNPACK( ZZNHS(:), MASK=GNEGT(:,:,:),FIELD=0.0) PNHS(:,:,:) = ZNHS(:,:,:) ! DEALLOCATE(ZFREECCN) @@ -468,6 +468,9 @@ IF (INEGT.GT.0) THEN CALL BUDGET ( UNPACK(ZNFS(:,JL),MASK=GNEGT(:,:,:),FIELD=PNFS(:,:,:,JL))*PRHODJ(:,:,:),& 12+NSV_LIMA_CCN_FREE+JL-1,'HONH_BU_RSV') END DO + CALL BUDGET ( UNPACK(ZZNHS(:),MASK=GNEGT(:,:,:),FIELD=ZNHS(:,:,:))*PRHODJ(:,:,:),& + 12+NSV_LIMA_HOM_HAZE,'HONH_BU_RSV') + END IF END IF END IF @@ -534,7 +537,7 @@ IF (INEGT.GT.0) THEN ! Compute the drop homogeneous nucleation source: RRHONG ! ZZW(:) = 0.0 - WHERE( (ZZT(:)<XTT-35.0) .AND. (ZRRS(:)>0.) ) + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZRRS(:)>XRTMIN(3)/PTSTEP) ) ZZW(:) = ZRRS(:) ! Instantaneous freezing of the raindrops ZRRS(:) = ZRRS(:) - ZZW(:) ZRGS(:) = ZRGS(:) + ZZW(:) @@ -669,11 +672,13 @@ ELSE ZW(:,:,:) = PCIS(:,:,:)*PRHODJ(:,:,:) IF( OHHONI ) CALL BUDGET (ZW,12+NSV_LIMA_NI,'HONH_BU_RSV') CALL BUDGET (ZW,12+NSV_LIMA_NI,'HONC_BU_RSV') - IF (NMOD_CCN.GE.1) THEN + IF (NMOD_CCN.GE.1 .AND. OHHONI) THEN DO JL=1, NMOD_CCN - CALL BUDGET ( UNPACK(ZNFS(:,JL),MASK=GNEGT(:,:,:),FIELD=PNFS(:,:,:,JL))*PRHODJ(:,:,:),& - 12+NSV_LIMA_CCN_FREE+JL-1,'HONH_BU_RSV') + ZW(:,:,:) = PNFS(:,:,:,JL)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_CCN_FREE+JL-1,'HONH_BU_RSV') END DO + ZW(:,:,:) = ZNHS(:,:,:)*PRHODJ(:,:,:) + CALL BUDGET (ZW,12+NSV_LIMA_HOM_HAZE,'HONH_BU_RSV') END IF END IF END IF diff --git a/src/MNH/lima_cold_slow_processes.f90 b/src/MNH/lima_cold_slow_processes.f90 index bdbb4c64e..20c02872c 100644 --- a/src/MNH/lima_cold_slow_processes.f90 +++ b/src/MNH/lima_cold_slow_processes.f90 @@ -339,7 +339,7 @@ IF( IMICRO >= 1 ) THEN ! ---------------------------------------- ! ! - WHERE ( ZRST(:)>0.0 ) + WHERE ( ZRST(:)>XRTMIN(5) ) ZLBDAS(:) = MIN( XLBDAS_MAX, & XLBS*( ZRHODREF(:)*MAX( ZRST(:),XRTMIN(5) ) )**XLBEXS ) END WHERE @@ -379,7 +379,7 @@ IF( IMICRO >= 1 ) THEN ! ! ZZW(:) = 0.0 - WHERE ( (ZRST(:)>0.0) .AND. (ZRSS(:)>0.0) ) + WHERE ( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>ZRTMIN(5)) ) !Correction BVIE rhodref ! ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & ZZW(:) = ( ZSSI(:)/(ZAI(:)) ) * & @@ -445,8 +445,8 @@ IF( IMICRO >= 1 ) THEN ! --------------------------------------------------- ! ! - WHERE ( (ZRIT(:)>XRTMIN(4)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRIS(:)>0.0) & - .AND. (ZCIS(:)>0.0) ) + WHERE ( (ZRIT(:)>XRTMIN(4)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRIS(:)>ZRTMIN(4)) & + .AND. (ZCIS(:)>ZCTMIN(4)) ) ZZW1(:,3) = (ZLBDAI(:) / ZLBDAS(:))**3 ZZW1(:,1) = (ZCIT(:)*(XCCS*ZLBDAS(:)**XCXS)*EXP( XCOLEXIS*(ZZT(:)-XTT) )) & / (ZLBDAI(:)**3) diff --git a/src/MNH/lima_mixed.f90 b/src/MNH/lima_mixed.f90 index e557a1c3f..81452e86a 100644 --- a/src/MNH/lima_mixed.f90 +++ b/src/MNH/lima_mixed.f90 @@ -527,7 +527,7 @@ IF( IMICRO >= 1 ) THEN !* 2. Compute the slow processes involving cloud water and graupel ! ------------------------------------------------------------ ! - CALL LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, & + CALL LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & ZLSFACT, ZLVFACT, ZAI, ZCJ, & ZRGT, ZCIT, & ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & diff --git a/src/MNH/lima_mixed_fast_processes.f90 b/src/MNH/lima_mixed_fast_processes.f90 index e7b9d55fe..06058f529 100644 --- a/src/MNH/lima_mixed_fast_processes.f90 +++ b/src/MNH/lima_mixed_fast_processes.f90 @@ -241,7 +241,7 @@ IF (LSNOW) THEN ! ZZW1(:,:) = 0.0 ! -GRIM(:) = (ZRCT(:)>0.0) .AND. (ZRST(:)>0.0) .AND. (ZRCS(:)>0.0) .AND. (ZZT(:)<XTT) +GRIM(:) = (ZRCT(:)>XRTMIN(2)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRCS(:)>XRTMIN(2)/PTSTEP) .AND. (ZZT(:)<XTT) IGRIM = COUNT( GRIM(:) ) ! IF( IGRIM>0 ) THEN @@ -297,7 +297,7 @@ IF( IGRIM>0 ) THEN ! 1.1.6 riming-conversion of the large sized aggregates into graupeln ! ! - WHERE ( GRIM(:) .AND. (ZRSS(:)>0.0) ) + WHERE ( GRIM(:) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) ) ZZW1(:,2) = MIN( ZRCS(:), & XCRIMSG * ZRCT(:) & ! RCRIMSG * ZLBDAS(:)**XEXCRIMSG & @@ -395,7 +395,7 @@ END IF ! ! ZZW1(:,2:3) = 0.0 -GACC(:) = (ZRRT(:)>0.0) .AND. (ZRST(:)>0.0) .AND. (ZRRS(:)>0.0) .AND. (ZZT(:)<XTT) +GACC(:) = (ZRRT(:)>XRTMIN(3)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRRS(:)>XRTMIN(3)/PTSTEP) .AND. (ZZT(:)<XTT) IGACC = COUNT( GACC(:) ) ! IF( IGACC>0 ) THEN @@ -485,7 +485,7 @@ IF( IGACC>0 ) THEN ! 1.3.6 raindrop accretion-conversion of the large sized aggregates ! into graupeln ! - WHERE ( GACC(:) .AND. (ZRSS(:)>0.0) ) + WHERE ( GACC(:) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) ) ZZW1(:,2) = MIN( ZRRS(:),ZZW1(:,2)-ZZW1(:,4) ) ! RRACCSG ZZW1(:,3) = MIN( ZRSS(:),XFSACCRG*ZZW(:)* & ! RSACCRG ( ZLBDAS(:)**(XCXS-XBS) )*( ZRHODREF(:)**(-XCEXVT-1.) ) & @@ -531,7 +531,7 @@ END IF ! ! ZZW(:) = 0.0 -WHERE( (ZRST(:)>0.0) .AND. (ZRSS(:)>0.0) .AND. (ZZT(:)>XTT) ) +WHERE( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) .AND. (ZZT(:)>XTT) ) ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & @@ -577,7 +577,7 @@ END IF ! LSNOW ! ! ZZW1(:,3:4) = 0.0 -WHERE( (ZRIT(:)>0.0) .AND. (ZRRT(:)>0.0) .AND. (ZRIS(:)>0.0) .AND. (ZRRS(:)>0.0) ) +WHERE( (ZRIT(:)>XRTMIN(4)) .AND. (ZRRT(:)>XRTMIN(3)) .AND. (ZRIS(:)>XRTMIN(4)/PTSTEP) .AND. (ZRRS(:)>XRTMIN(3)/PTSTEP) ) ZZW1(:,3) = MIN( ZRIS(:),XICFRR * ZRIT(:) * ZCRT(:) & ! RICFRRG * ZLBDAR(:)**XEXICFRR & * ZRHODREF(:)**(-XCEXVT-1.0) ) @@ -621,8 +621,8 @@ END IF ! ! ZZW1(:,:) = 0.0 -WHERE( ((ZRCT(:)>0.0) .AND. (ZRGT(:)>0.0) .AND. (ZRCS(:)>0.0)) .OR. & - ((ZRIT(:)>0.0) .AND. (ZRGT(:)>0.0) .AND. (ZRIS(:)>0.0)) ) +WHERE( ((ZRCT(:)>XRTMIN(2)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRCS(:)>XRTMIN(2)/PTSTEP)) .OR. & + ((ZRIT(:)>XRTMIN(4)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRIS(:)>XRTMIN(4)/PTSTEP)) ) ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHODREF(:)**(-XCEXVT) ZZW1(:,1) = MIN( ZRCS(:),XFCDRYG * ZRCT(:) * ZZW(:) ) ! RCDRYG ZZW1(:,2) = MIN( ZRIS(:),XFIDRYG * EXP( XCOLEXIG*(ZZT(:)-XTT) ) & @@ -632,7 +632,7 @@ END WHERE !* 2.2.1 accretion of aggregates on the graupeln ! ---------------------------------------------- ! -GDRY(:) = (ZRST(:)>0.0) .AND. (ZRGT(:)>0.0) .AND. (ZRSS(:)>0.0) +GDRY(:) = (ZRST(:)>XRTMIN(5)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) IGDRY = COUNT( GDRY(:) ) ! IF( IGDRY>0 ) THEN @@ -696,7 +696,7 @@ END IF !* 2.2.6 accretion of raindrops on the graupeln ! --------------------------------------------- ! -GDRY(:) = (ZRRT(:)>0.0) .AND. (ZRGT(:)>0.0) .AND. (ZRRS(:)>0.0) +GDRY(:) = (ZRRT(:)>XRTMIN(3)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRRS(:)>XRTMIN(3)) IGDRY = COUNT( GDRY(:) ) ! IF( IGDRY>0 ) THEN @@ -765,7 +765,7 @@ ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4) ! ZZW(:) = 0.0 ZRWETG(:) = 0.0 -WHERE( ZRGT(:)>0.0 ) +WHERE( ZRGT(:)>XRTMIN(6) ) ZZW1(:,5) = MIN( ZRIS(:), & ZZW1(:,2) / (XCOLIG*EXP(XCOLEXIG*(ZZT(:)-XTT)) ) ) ! RIWETG ZZW1(:,6) = MIN( ZRSS(:), & @@ -965,7 +965,7 @@ END IF ! ! ZZW(:) = 0.0 -WHERE( (ZRGT(:)>0.0) .AND. (ZRGS(:)>0.0) .AND. (ZZT(:)>XTT) ) +WHERE( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>XRTMIN(6)/PTSTEP) .AND. (ZZT(:)>XTT) ) ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & @@ -1023,8 +1023,8 @@ IF( IHAIL>0 ) THEN ! ---------------------------- ! ZZW1(:,:) = 0.0 - WHERE( GHAIL(:) .AND. ( (ZRCT(:)>XRTMIN(2) .AND. ZRCS(:)>0.0) .OR. & - (ZRIT(:)>XRTMIN(4) .AND. ZRIS(:)>0.0) ) ) + WHERE( GHAIL(:) .AND. ( (ZRCT(:)>XRTMIN(2) .AND. ZRCS(:)>XRTMIN(2)/PTSTEP) .OR. & + (ZRIT(:)>XRTMIN(4) .AND. ZRIS(:)>XRTMIN(4)/PTSTEP) ) ) ZZW(:) = ZLBDAH(:)**(XCXH-XDH-2.0) * ZRHODREF(:)**(-XCEXVT) ZZW1(:,1) = MIN( ZRCS(:),XFWETH * ZRCT(:) * ZZW(:) ) ! RCWETH ZZW1(:,2) = MIN( ZRIS(:),XFWETH * ZRIT(:) * ZZW(:) ) ! RIWETH @@ -1033,7 +1033,7 @@ IF( IHAIL>0 ) THEN !* 3.1.1 accretion of aggregates on the hailstones ! ------------------------------------------------ ! - GWET(:) = GHAIL(:) .AND. (ZRST(:)>XRTMIN(5) .AND. ZRSS(:)>0.0) + GWET(:) = GHAIL(:) .AND. (ZRST(:)>XRTMIN(5) .AND. ZRSS(:)>XRTMIN(5)/PTSTEP) IGWET = COUNT( GWET(:) ) ! IF( IGWET>0 ) THEN @@ -1096,7 +1096,7 @@ IF( IHAIL>0 ) THEN !* 3.1.6 accretion of graupeln on the hailstones ! ---------------------------------------------- ! - GWET(:) = GHAIL(:) .AND. (ZRGT(:)>XRTMIN(6) .AND. ZRGS(:)>0.0) + GWET(:) = GHAIL(:) .AND. (ZRGT(:)>XRTMIN(6) .AND. ZRGS(:)>XRTMIN(6)/PTSTEP) IGWET = COUNT( GWET(:) ) ! IF( IGWET>0 ) THEN @@ -1276,7 +1276,7 @@ END IF ! IF ( IHAIL>0 ) THEN ZZW(:) = 0.0 - WHERE( GHAIL(:) .AND. (ZRHS(:)>0.0) .AND. (ZRHT(:)>0.0) .AND. (ZZT(:)>XTT) ) + WHERE( GHAIL(:) .AND. (ZRHS(:)>XRTMIN(7)/PTSTEP) .AND. (ZRHT(:)>XRTMIN(7)) .AND. (ZZT(:)>XTT) ) ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & diff --git a/src/MNH/lima_mixed_slow_processes.f90 b/src/MNH/lima_mixed_slow_processes.f90 index 85c78adeb..9146da229 100644 --- a/src/MNH/lima_mixed_slow_processes.f90 +++ b/src/MNH/lima_mixed_slow_processes.f90 @@ -3,7 +3,7 @@ ! ##################################### ! INTERFACE - SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, & + SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & ZLSFACT, ZLVFACT, ZAI, ZCJ, & ZRGT, ZCIT, & ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & @@ -16,6 +16,7 @@ INTERFACE REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature REAL, DIMENSION(:), INTENT(IN) :: ZSSI ! Supersaturation over ice +REAL, INTENT(IN) :: PTSTEP ! Time-step ! REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) @@ -57,7 +58,7 @@ END INTERFACE END MODULE MODI_LIMA_MIXED_SLOW_PROCESSES ! ! ####################################################################### - SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, & + SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & ZLSFACT, ZLVFACT, ZAI, ZCJ, & ZRGT, ZCIT, & ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & @@ -128,6 +129,7 @@ IMPLICIT NONE REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature REAL, DIMENSION(:), INTENT(IN) :: ZSSI ! Supersaturation over ice +REAL, INTENT(IN) :: PTSTEP ! Time-step ! REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) @@ -177,7 +179,7 @@ INTEGER :: JMOD_IFN ! ! ZZW(:) = 0.0 - WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>0.0) ) + WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>XRTMIN(6)/PTSTEP) ) !Correction BVIE RHODREF ! ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & ZZW(:) = ( ZSSI(:)/(ZAI(:)) ) * & @@ -208,7 +210,7 @@ INTEGER :: JMOD_IFN ! ! ZMASK(:) = 1.0 - WHERE( (ZRIS(:)>0.0) .AND. (ZZT(:)>XTT) ) + WHERE( (ZRIS(:)>XRTMIN(4)/PTSTEP) .AND. (ZZT(:)>XTT) ) ZRCS(:) = ZRCS(:) + ZRIS(:) ZTHS(:) = ZTHS(:) - ZRIS(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RIMLTC)) ZRIS(:) = 0.0 @@ -248,7 +250,7 @@ INTEGER :: JMOD_IFN ! ! ZZW(:) = 0.0 - WHERE( (ZRCS(:)>0.0) .AND. (ZRIS(:)>0.0) .AND. (ZCIT(:)>XCTMIN(4)) ) + WHERE( (ZRCS(:)>XRTMIN(2)/PTSTEP) .AND. (ZRIS(:)>XRTMIN(4)/PTSTEP) .AND. (ZCIT(:)>XCTMIN(4)) ) ZZW(:) = EXP( (XALPW-XALPI) - (XBETAW-XBETAI)/ZZT(:) & - (XGAMW-XGAMI)*ALOG(ZZT(:)) ) -1.0 ! supersaturation of saturated water over ice diff --git a/src/MNH/lima_phillips_integ.f90 b/src/MNH/lima_phillips_integ.f90 index 26a653b6a..3af3048c6 100644 --- a/src/MNH/lima_phillips_integ.f90 +++ b/src/MNH/lima_phillips_integ.f90 @@ -68,7 +68,7 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: Z_FRAC_ACT ! !* 0.2 Declarations of local variables : ! -INTEGER :: JSPECIE, JL +INTEGER :: JSPECIE, JL, JL2 REAL :: XB ! REAL, DIMENSION(:), ALLOCATABLE :: ZZX, & ! Work array @@ -105,11 +105,20 @@ DO JSPECIE = 1, NSPECIE ! = 4 = {DM1, DM2, BC, O} respectively ! For T warmer than -35°C, the integration is approximated with µ_X << 1 ! Error function : GAMMA_INC(1/2, x**2) = ERF(x) !!! for x>=0 !!! ! - WHERE (ZZT(:)>(XTT-35.) .AND. ZEMBRYO(:)>1.0E-8) - ZZX(:) = ZZX(:) + ZEMBRYO(:) * XPI * (XMDIAM_IFN(JSPECIE))**2 / 2.0 & - * EXP(2*(LOG(XSIGMA_IFN(JSPECIE)))**2) & - * (1.0+GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) - END WHERE +! WHERE (ZZT(:)>(XTT-35.) .AND. ZEMBRYO(:)>1.0E-8) +! ZZX(:) = ZZX(:) + ZEMBRYO(:) * XPI * (XMDIAM_IFN(JSPECIE))**2 / 2.0 & +! * EXP(2*(LOG(XSIGMA_IFN(JSPECIE)))**2) & +! * (1.0+GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) +! END WHERE + + DO JL = 1, SIZE(ZZT) + IF (ZZT(JL)>(XTT-35.) .AND. ZEMBRYO(JL)>1.0E-8) THEN + ZZX(JL) = ZZX(JL) + ZEMBRYO(JL) * XPI * (XMDIAM_IFN(JSPECIE))**2 / 2.0 & + * EXP(2*(LOG(XSIGMA_IFN(JSPECIE)))**2) & + * (1.0+SIGN(1.,SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)*GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) + END IF + ENDDO + ! ! For other T, integration between 0 and infinity is made with a Gauss-Hermite ! quadrature method and integration between 0 and 0.1 uses e(x) ~ 1+x+O(x**2) @@ -118,17 +127,28 @@ DO JSPECIE = 1, NSPECIE ! = 4 = {DM1, DM2, BC, O} respectively GINTEG(:) = ZZT(:)<=(XTT-35.) .AND. ZSI(:)>1.0 .AND. ZEMBRYO(:)>1.0E-8 ! DO JL = 1, NDIAM - WHERE (GINTEG(:)) - ZZX(:) = ZZX(:) - XWEIGHT(JL)*EXP(-ZEMBRYO(:)*XPI*(XMDIAM_IFN(JSPECIE))**2 & - * EXP(2.0*SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE)) * XABSCISS(JL)) ) - END WHERE + DO JL2 = 1, SIZE(GINTEG) + IF (GINTEG(JL2)) THEN + ZZX(JL2) = ZZX(JL2) - XWEIGHT(JL)*EXP(-ZEMBRYO(JL2)*XPI*(XMDIAM_IFN(JSPECIE))**2 & + * EXP(2.0*SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE)) * XABSCISS(JL)) ) + END IF + ENDDO ENDDO ! - WHERE (GINTEG(:)) - ZZX(:) = ZZX(:) + 0.5* XPI*ZEMBRYO(:)*(XMDIAM_IFN(JSPECIE))**2 & - * (1.0-( 1.0-GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) & - * EXP( 2.0*(LOG(XSIGMA_IFN(JSPECIE)))**2) ) - END WHERE +! DO JL2 = 1, SIZE(GINTEG) +! IF (GINTEG(JL2)) THEN +! ZZX(JL2) = ZZX(JL2) + 0.5* XPI*ZEMBRYO(JL2)*(XMDIAM_IFN(JSPECIE))**2 & +! * (1.0-( 1.0-GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) & +! * EXP( 2.0*(LOG(XSIGMA_IFN(JSPECIE)))**2) ) +! END IF +! ENDDO + DO JL2 = 1, SIZE(GINTEG) + IF (GINTEG(JL2)) THEN + ZZX(JL2) = 1 + ZZX(JL2) & + - ( 0.5* XPI*ZEMBRYO(JL2)*(XMDIAM_IFN(JSPECIE))**2 * EXP( 2.0*(LOG(XSIGMA_IFN(JSPECIE)))**2) & + * ( 1.0-SIGN(1.,SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)*GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) ) + END IF + ENDDO ! Z_FRAC_ACT(:,JSPECIE)=ZZX(:) ! diff --git a/src/MNH/lima_phillips_ref_spectrum.f90 b/src/MNH/lima_phillips_ref_spectrum.f90 index c2fcff114..d549d7051 100644 --- a/src/MNH/lima_phillips_ref_spectrum.f90 +++ b/src/MNH/lima_phillips_ref_spectrum.f90 @@ -66,7 +66,8 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZMAX, & ZZY1, & ZZY2, & Z1, & - Z2 + Z2, & + ZSI2 ! REAL :: XPSI ! @@ -78,25 +79,28 @@ ALLOCATE(ZZY1(SIZE(ZZT))) ; ZZY1(:)= 0.0 ALLOCATE(ZZY2(SIZE(ZZT))) ; ZZY2(:)= 0.0 ALLOCATE(Z1(SIZE(ZZT))) ; Z1(:) = 0.0 ALLOCATE(Z2(SIZE(ZZT))) ; Z2(:) = 0.0 +ALLOCATE(ZSI2(SIZE(ZZT))) ; ZSI2(:)= 0.0 ! ZZY(:) = 0.0 ! XPSI = 0.058707*XGAMMA/XRHO_CFDC ! +ZSI2(:)=min(ZSI(:),ZSI_W(:)) +! WHERE( ZSI(:)>1.0 ) ! !* T <= -35 C ! ZZY(:) =1000.*XGAMMA/XRHO_CFDC & - * ( EXP(12.96*(MIN(ZSI(:),7.)-1.1)) )**0.3 & + * ( EXP(12.96*(MIN(ZSI2(:),7.)-1.1)) )**0.3 & * RECT(1.,0.,ZZT(:),(XTT-80.),(XTT-35.)) ! !* -35 C < T <= -25 C (in Appendix A) ! ZZY1(:) =1000.*XGAMMA/XRHO_CFDC & - * ( EXP(12.96*(MIN(ZSI(:),7.)-1.1)) )**0.3 + * ( EXP(12.96*(MIN(ZSI2(:),7.)-1.1)) )**0.3 ZZY2(:) =1000.*XPSI & - * EXP(12.96*(MIN(ZSI(:),7.)-1.0)-0.639) + * EXP(12.96*(MIN(ZSI2(:),7.)-1.0)-0.639) ! !* -35 C < T <= -30 C ! @@ -115,7 +119,7 @@ WHERE( ZSI(:)>1.0 ) !* T > -25 C ! ZZY(:) = ZZY(:) + 1000.*XPSI & - * EXP( 12.96*(MIN(ZSI(:),7.)-1.0)-0.639 ) & + * EXP( 12.96*(MIN(ZSI2(:),7.)-1.0)-0.639 ) & * RECT(1.,0.,ZZT(:),(XTT-25.),(XTT-2.)) END WHERE ! diff --git a/src/MNH/lima_warm.f90 b/src/MNH/lima_warm.f90 index ef46126cc..58098af61 100644 --- a/src/MNH/lima_warm.f90 +++ b/src/MNH/lima_warm.f90 @@ -9,7 +9,7 @@ INTERFACE PTHM, PRCM, & PTHT, PRT, PSVT, & PTHS, PRS, PSVS, & - PINPRC, PINPRR, PINPRR3D, PEVAP3D ) + PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) ! LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the ! activation by radiative @@ -56,6 +56,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source ! REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud droplets deposition REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile ! @@ -69,7 +70,7 @@ END MODULE MODI_LIMA_WARM PTHM, PRCM, & PTHT, PRT, PSVT, & PTHS, PRS, PSVS, & - PINPRC, PINPRR, PINPRR3D, PEVAP3D ) + PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) ! ##################################################################### ! !! @@ -193,6 +194,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source ! REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud droplets deposition REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile ! @@ -227,6 +229,8 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & :: ZWLBDR,ZWLBDR3,ZWLBDC,ZWLBDC3 INTEGER :: JL ! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: GDEP +! !------------------------------------------------------------------------------- ! ! @@ -294,7 +298,11 @@ WHERE (PRRT(:,:,:)>XRTMIN(3) .AND. PCRT(:,:,:)>XCTMIN(3)) ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR END WHERE ZT(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:)/XP00)**(XRD/XCPD) -ZTM(:,:,:) = PTHM(:,:,:) * (PPABSM(:,:,:)/XP00)**(XRD/XCPD) +IF( OACTIT ) THEN + ZTM(:,:,:) = PTHM(:,:,:) * (PPABSM(:,:,:)/XP00)**(XRD/XCPD) +ELSE + ZTM(:,:,:) = ZT(:,:,:) +END IF ! !------------------------------------------------------------------------------- ! @@ -309,7 +317,7 @@ CALL LIMA_WARM_SEDIM (OSEDC, KSPLITR, PTSTEP, KMI, & ZWLBDC, & PRCT, PRRT, PCCT, PCRT, & PRCS, PRRS, PCCS, PCRS, & - PINPRC, PINPRR, & + PINPRC, PINPRR, & PINPRR3D ) ! IF (LBUDGET_RC .AND. OSEDC) & @@ -322,6 +330,22 @@ IF (LBUDGET_SV) THEN &'SEDI_BU_RSV') ! RCR END IF ! +! 2.bis Deposition at 1st level above ground +! +IF (LDEPOC) THEN + PINDEP(:,:)=0. + GDEP(:,:) = .FALSE. + GDEP(:,:) = PRCS(:,:,2) >0 .AND. PCCS(:,:,2) >0 + WHERE (GDEP) + PRCS(:,:,2) = PRCS(:,:,2) - XVDEPOC * PRCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) + PCCS(:,:,2) = PCCS(:,:,2) - XVDEPOC * PCCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) + PINPRC(:,:) = PINPRC(:,:) + XVDEPOC * PRCT(:,:,2) * PRHODREF(:,:,2) /XRHOLW + PINDEP(:,:) = XVDEPOC * PRCT(:,:,2) * PRHODREF(:,:,2) /XRHOLW + END WHERE +! + IF ( LBUDGET_RC ) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'DEPO_BU_RRC') + IF ( LBUDGET_SV ) CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'DEPO_BU_RSV') +END IF ! !------------------------------------------------------------------------------- ! @@ -393,7 +417,7 @@ IF (ORAIN) THEN ! -------------------- ! ZWLBDR(:,:,:) = 1.E10 - WHERE (PRRS(:,:,:)>0.0.AND.PCRS(:,:,:)>0.0 ) + WHERE (PRRS(:,:,:)>XRTMIN(3)/PTSTEP.AND.PCRS(:,:,:)>XCTMIN(3)/PTSTEP ) ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / PRRS(:,:,:) ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR END WHERE diff --git a/src/MNH/lima_warm_evap.f90 b/src/MNH/lima_warm_evap.f90 index 09a90d093..f99805783 100644 --- a/src/MNH/lima_warm_evap.f90 +++ b/src/MNH/lima_warm_evap.f90 @@ -186,7 +186,7 @@ ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & ! GEVAP(:,:,:) = .FALSE. GEVAP(IIB:IIE,IJB:IJE,IKB:IKE) = & - PRRS(IIB:IIE,IJB:IJE,IKB:IKE)> 0.0 .AND. & + PRRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(3) .AND. & PRVT(IIB:IIE,IJB:IJE,IKB:IKE)<ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ! IEVAP = COUNTJV( GEVAP(:,:,:),I1(:),I2(:),I3(:)) diff --git a/src/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90 index 165ac242d..af3de3889 100644 --- a/src/MNH/lima_warm_nucl.f90 +++ b/src/MNH/lima_warm_nucl.f90 @@ -229,8 +229,11 @@ IF (OACTIT) THEN ZDRC(:,:,:) = PRCS(:,:,:)-(PRCT(:,:,:)/PTSTEP) ! drc/dt !!! JPP !!! JPP - ZTDT(:,:,:) = MIN(0.,ZTDT(:,:,:)+(XG*PW_NU(:,:,:))/XCPD- & - (XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))*ZDRC(:,:,:)/XCPD) +!! +!! BV - W and drc/dt effect should not be included in ZTDT (already accounted for in the computations) ? +!! +!! ZTDT(:,:,:) = MIN(0.,ZTDT(:,:,:)+(XG*PW_NU(:,:,:))/XCPD- & +!! (XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))*ZDRC(:,:,:)/XCPD) END IF ! ! find locations where CCN are available @@ -622,7 +625,6 @@ DO JL = 1, NPTS PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),JL) go to 100 - print*, 'PZRIDDR: never get here' STOP end if if (abs(xh-xl) <= PXACC) then @@ -635,7 +637,6 @@ DO JL = 1, NPTS !!$ endif !!SB end do - print*, 'PZRIDDR: exceeded maximum iterations',j STOP else if (fl(JL) == 0.0) then PZRIDDR(JL)=PX1 diff --git a/src/MNH/modd_param_lima.f90 b/src/MNH/modd_param_lima.f90 index cf0a66ff2..6c90b2dfa 100644 --- a/src/MNH/modd_param_lima.f90 +++ b/src/MNH/modd_param_lima.f90 @@ -118,6 +118,7 @@ LOGICAL, SAVE :: LACTIT ! TRUE to enable the usage of dT/dt in CCN activa LOGICAL, SAVE :: LBOUND ! TRUE to enable the continuously replenishing ! aerosol concentrations through the open ! lateral boundaries -> boundaries.f90 +LOGICAL, SAVE :: LDEPOC ! Deposition of rc at 1st level above ground ! ! 2.2 CCN initialisation ! @@ -148,6 +149,10 @@ REAL,SAVE :: XFSOLUB_CCN, & ! Fractionnal solubility of the CC XACTEMP_CCN, & ! Expected temperature of CCN activation XAERDIFF, XAERHEIGHT ! For the vertical gradient of aerosol distribution ! +! Cloud droplet deposition +! +REAL, SAVE :: XVDEPOC +! !------------------------------------------------------------------------------- ! ! diff --git a/src/MNH/modn_param_lima.f90 b/src/MNH/modn_param_lima.f90 index e65579400..f876e45cb 100644 --- a/src/MNH/modn_param_lima.f90 +++ b/src/MNH/modn_param_lima.f90 @@ -24,6 +24,6 @@ NAMELIST/NAM_PARAM_LIMA/LCOLD, LNUCL, LSEDI, LSNOW, LHAIL, LHHONI, LMEYERS,& LCCN_HOM, CCCN_MODES, HINI_CCN, HTYPE_CCN, & XALPHAC, XNUC, XALPHAR, XNUR, & XFSOLUB_CCN, XACTEMP_CCN, XAERDIFF, XAERHEIGHT, & - LSCAV, LAERO_MASS + LSCAV, LAERO_MASS, LDEPOC, XVDEPOC ! END MODULE MODN_PARAM_LIMA diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 123c64376..ce8b4cf90 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -332,7 +332,7 @@ USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3, & CHEVRIMED_ICE_C1R3 USE MODN_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,NAM_PARAM_LIMA,NMOD_CCN,LSCAV, & CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, & - LCOLD, LACTI, LNUCL, XALPHAC, XNUC, LMEYERS + LCOLD, LACTI, LNUCL, XALPHAC, XNUC, LMEYERS, LHAIL USE MODN_ELEC USE MODN_SERIES USE MODN_SERIES_n @@ -891,7 +891,7 @@ SELECT CASE ( CCLOUD ) &"LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG ARE SET TO TRUE")' ) ! LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSECI=.TRUE. + LUSERI=.TRUE. ; LUSECI=.TRUE. LUSERS=.TRUE. ; LUSERG=.TRUE. LUSERH=.FALSE. END IF @@ -979,7 +979,8 @@ SELECT CASE ( CCLOUD ) ! IF (LCOLD) THEN LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE. - LUSERI=.TRUE. ; LUSERS=.TRUE. ; LUSERG=.TRUE. ; LUSERH=.TRUE. + LUSERI=.TRUE. ; LUSERS=.TRUE. ; LUSERG=.TRUE. + LUSERH=LHAIL END IF ! IF (LSUBG_COND .AND. LCOLD) THEN diff --git a/src/MNH/set_conc_lima.f90 b/src/MNH/set_conc_lima.f90 index 0a76b46aa..54f17c858 100644 --- a/src/MNH/set_conc_lima.f90 +++ b/src/MNH/set_conc_lima.f90 @@ -79,7 +79,7 @@ END MODULE MODI_SET_CONC_LIMA !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, LCOLD, LWARM +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, LCOLD, LWARM, LRAIN USE MODD_PARAM_LIMA_COLD, ONLY : XAI, XBI USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_ACTI, NSV_LIMA_NI, NSV_LIMA_IFN_NUCL USE MODD_CST, ONLY : XPI, XRHOLW, XRHOLI @@ -133,6 +133,9 @@ IF (LWARM) THEN WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The droplet concentration has " WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised" END IF +END IF +! +IF (LWARM .AND. LRAIN) THEN ! ! drops ! @@ -153,8 +156,7 @@ IF (LWARM) THEN WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised" END IF END IF -! -ENDIF +END IF ! IF (LCOLD) THEN ! -- GitLab