From f3e001fba60ecc500e50c42b4efae91f39d63117 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Wed, 21 Jul 2021 11:26:40 +0200 Subject: [PATCH] Benoit V. 21/07/2021: bugfix LIMA with LSUBG_COND=T (bug found in SOFOG runs) --- src/MNH/lima_adjust_split.f90 | 25 ++++++++++++++----------- src/MNH/lima_ccn_activation.f90 | 10 +++++----- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/MNH/lima_adjust_split.f90 b/src/MNH/lima_adjust_split.f90 index 401048c3d..edaeec820 100644 --- a/src/MNH/lima_adjust_split.f90 +++ b/src/MNH/lima_adjust_split.f90 @@ -261,7 +261,7 @@ REAL :: ZEPS ! Mv/Md REAL :: ZDT ! Time increment (2*Delta t or Delta t if cold start) REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & :: ZEXNS,& ! guess of the Exner function at t+1 - ZT, & ! guess of the temperature at t+1 + ZT, ZT2, & ! guess of the temperature at t+1 ZCPH, & ! guess of the CPh for the mixing ZW, & ZW1, & @@ -269,8 +269,8 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & ZLV, & ! guess of the Lv at t+1 ZLS, & ! guess of the Ls at t+1 ZMASK,& - ZRV, & - ZRC, & + ZRV, ZRV2, & + ZRC, ZRC2, & ZRI, & ZSIGS, & ZW_MF @@ -330,7 +330,7 @@ IKE = SIZE(PRHODJ,3) - JPVEXT ZEPS= XMV / XMD ! IF (OSUBG_COND) THEN - ITERMAX=2 + ITERMAX=1 ELSE ITERMAX=1 END IF @@ -348,7 +348,7 @@ ZCTMIN(:) = XCTMIN(:) / ZDT ! PTHT = PTHS*PTSTEP ! -PRVT(:,:,:) = PRT(:,:,:,1) +PRVT(:,:,:) = PRS(:,:,:,1)*PTSTEP PRVS(:,:,:) = PRS(:,:,:,1) ! PRCT(:,:,:) = 0. @@ -362,7 +362,7 @@ PRSS(:,:,:) = 0. PRGT(:,:,:) = 0. PRGS(:,:,:) = 0. ! -IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRS(:,:,:,2)*PTSTEP IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) @@ -379,7 +379,7 @@ PCIT(:,:,:) = 0. PCCS(:,:,:) = 0. ! PCIS(:,:,:) = 0. ! -IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LWARM ) PCCT(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC)*PTSTEP IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) ! IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) @@ -394,8 +394,8 @@ IF ( LWARM .AND. NMOD_CCN.GE.1 ) THEN ALLOCATE( PNAT(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) - PNFT(:,:,:,:) = PSVT(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) - PNAT(:,:,:,:) = PSVT(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) + PNFT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1)*PTSTEP + PNAT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1)*PTSTEP END IF ! ! IF ( LCOLD .AND. NMOD_IFN .GE. 1 ) THEN @@ -476,6 +476,7 @@ DO JITER =1,ITERMAX !* 2.3 compute the intermediate temperature at t+1, T* ! ZT(:,:,:) = ( PTHS(:,:,:) * ZDT ) * ZEXNS(:,:,:) + ZT2(:,:,:) = ZT(:,:,:) ! !* 2.4 compute the specific heat for moist air (Cph) at t+1 ! @@ -499,6 +500,8 @@ DO JITER =1,ITERMAX ! ZRV=PRVS*PTSTEP ZRC=PRCS*PTSTEP + ZRV2=PRVT + ZRC2=PRCT ZRI=0. ZSIGS=PSIGS CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'S', & @@ -511,8 +514,8 @@ DO JITER =1,ITERMAX ZRC(:,:,:) = ZRC(:,:,:) + MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) ZW_MF=0. CALL LIMA_CCN_ACTIVATION (TPFILE, & - PRHODREF, PEXNREF, PPABST, ZT, PDTHRAD, PW_NU+ZW_MF, & - PTHT, ZRV, ZRC, PCCT, PRRT, PNFT, PNAT, & + PRHODREF, PEXNREF, PPABST, ZT2, PDTHRAD, PW_NU+ZW_MF, & + PTHT, ZRV2, ZRC2, PCCT, PRRT, PNFT, PNAT, & PCLDFR ) ! ELSE diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index d4204f8f5..b7786ea4f 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -219,13 +219,13 @@ GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .OR. PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) IF (LACTIT) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & .OR. ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN -IF (LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & - .OR. PCLDFR(IIB:IIE,IJB:IJE,IKB:IKE)>0.01 ! GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(2) ! +IF (LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. PCLDFR(IIB:IIE,IJB:IJE,IKB:IKE)>0.01 IF (.NOT. LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & .AND. PRVT(IIB:IIE,IJB:IJE,IKB:IKE).GE.ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ! @@ -255,8 +255,8 @@ IF( INUCT >= 1 ) THEN ALLOCATE(ZRHODREF(INUCT)) ALLOCATE(ZEXNREF(INUCT)) DO JL=1,INUCT - ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) - ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))/PCLDFR(I1(JL),I2(JL),I3(JL)) + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL))/PCLDFR(I1(JL),I2(JL),I3(JL)) ZZT(JL) = PT(I1(JL),I2(JL),I3(JL)) ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) @@ -450,7 +450,7 @@ IF( INUCT >= 1 ) THEN END IF ! ZW(:,:,:) = UNPACK( 100.0*ZSMAX(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) - ZW2(:,:,:) = UNPACK( ZZW6(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) + ZW2(:,:,:) = PCLDFR(:,:,:) * UNPACK( ZZW6(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) ! ! !------------------------------------------------------------------------------- -- GitLab