From 2feca84b3e96ca9da8b057ca707abf5a2f1a9729 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 23 Jun 2020 16:30:16 +0200 Subject: [PATCH] =?UTF-8?q?Philippe=20+=20Beno=C3=AEt=20Vi=C3=A9=2023/06/2?= =?UTF-8?q?020:=20improve=20removal=20of=20negative=20scalar=20variables?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MNH/advection_metsv.f90 | 187 +++++++++++++++---------- src/MNH/resolved_cloud.f90 | 269 ++++++++++++++++++------------------ src/MNH/turb.f90 | 141 +++++++++++-------- 3 files changed, 332 insertions(+), 265 deletions(-) diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 119491566..6362da54e 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -139,7 +139,8 @@ END MODULE MODI_ADVECTION_METSV !! 03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and !! microphysics budgets ! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices -! P. Wautelet + Benoit Vié 11/06/2020: improve removal of negative scalar variables + adapt the corresponding budgets +! P. Wautelet + Benoît Vié 11/06/2020: improve removal of negative scalar variables + adapt the corresponding budgets +! P. Wautelet + Benoît Vié 23/06/2020: improve removal of negative scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -694,39 +695,47 @@ END DO ! SELECT CASE ( HCLOUD ) CASE('KESS') - WHERE (PRRS(:,:,:,2) < 0.) + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + DO JR=2,SIZE(PRRS,4) + WHERE (PRRS(:,:,:,JR) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JR) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JR) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,JR) = 0.0 + END WHERE + END DO + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,2) = 0.0 + PRRS(:,:,:,2) = 0. END WHERE -! - PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) ! CASE('ICE3','ICE4') - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) - WHERE (PRRS(:,:,:,4) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + DO JR=4,SIZE(PRRS,4) + WHERE (PRRS(:,:,:,JR) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JR) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JR) * ZLS(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,4) = 0. - END WHERE -! -! cloud - WHERE (PRRS(:,:,:,2) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + PRRS(:,:,:,JR) = 0. + END WHERE + END DO + DO JR=2,3 + WHERE (PRRS(:,:,:,JR) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JR) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JR) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,2) = 0. - END WHERE + PRRS(:,:,:,JR) = 0. + END WHERE + END DO ! ! if rc or ri are positive, we can correct negative rv ! cloud @@ -747,68 +756,96 @@ SELECT CASE ( HCLOUD ) END WHERE END IF ! - PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) ! CASE('C2R2','KHKO') - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) - WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG+1) < 0.) - PRSVS(:,:,:,NSV_C2R2BEG) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG+1) < 0.) + PRSVS(:,:,:,NSV_C2R2BEG) = 0.0 + END WHERE + DO JSV = 2, 3 + WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,JSV) = 0.0 - PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0 - END WHERE - END DO + PRRS(:,:,:,JSV) = 0.0 + PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0 + END WHERE + END DO + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,2) = 0. + PRSVS(:,:,:,NSV_C2R2BEG+1) = 0. + END WHERE ! - PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) ! - CASE('LIMA') - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + CASE('LIMA') + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) ! Correction where rc<0 or Nc<0 - IF (LWARM) THEN - WHERE (PRRS(:,:,:,2) < XRTMIN(2)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NC) < XCTMIN(2)/PTSTEP) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + IF (LWARM) THEN + WHERE (PRRS(:,:,:,2) < XRTMIN(2)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NC) < XCTMIN(2)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,2) = 0.0 - PRSVS(:,:,:,NSV_LIMA_NC) = 0.0 - END WHERE - END IF + PRRS(:,:,:,2) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,2) = 0. + PRSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + END IF ! Correction where rr<0 or Nr<0 - IF (LWARM .AND. LRAIN) THEN - WHERE (PRRS(:,:,:,3) < XRTMIN(3)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NR) < XCTMIN(3)/PTSTEP) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,3) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,3) * ZLV(:,:,:) / & + IF (LWARM .AND. LRAIN) THEN + WHERE (PRRS(:,:,:,3) < XRTMIN(3)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NR) < XCTMIN(3)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,3) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,3) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,3) = 0.0 - PRSVS(:,:,:,NSV_LIMA_NR) = 0.0 - END WHERE - END IF + PRRS(:,:,:,3) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NR) = 0.0 + END WHERE + END IF ! Correction where ri<0 or Ni<0 - IF (LCOLD) THEN - WHERE (PRRS(:,:,:,4) < XRTMIN(4)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NI) < XCTMIN(4)/PTSTEP) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & + IF (LCOLD) THEN + WHERE (PRRS(:,:,:,4) < XRTMIN(4)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NI) < XCTMIN(4)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,4) = 0.0 - PRSVS(:,:,:,NSV_LIMA_NI) = 0.0 - END WHERE + PRRS(:,:,:,4) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + DO JR=5,SIZE(PRRS,4) + WHERE (PRRS(:,:,:,JR) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JR) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JR) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,JR) = 0. + END WHERE + END DO + IF(KRR > 3) THEN + WHERE ((PRRS(:,:,:,1) < 0.).AND.(PRRS(:,:,:,4) > 0.)) + ZCOR(:,:,:)=MIN(-PRRS(:,:,:,1),PRRS(:,:,:,4)) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + ZCOR(:,:,:) + PRTHS(:,:,:) = PRTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,4) = PRRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE END IF + END IF ! - PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0, PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) ) - PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) + PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0, PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) ) ! END SELECT ! diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 34e7b5c6b..8ae441ee0 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -275,6 +275,7 @@ END MODULE MODI_RESOLVED_CLOUD ! P. Wautelet + Benoit Vié 11/06/2020: improve removal of negative scalar variables + adapt the corresponding budgets ! P. Wautelet + Benoit Vié 18/06/2020: improve removal of negative scalar variables: use ZEXN instead of PEXNREF ! P. Wautelet 23/06/2020: remove ZSVS and ZSVT to improve code readability +! P. Wautelet + Benoît Vié 23/06/2020: improve removal of negative scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -629,13 +630,18 @@ SELECT CASE ( HCLOUD ) ZCPH(:,:,:) / ZEXN(:,:,:) PRS(:,:,:,2) = 0.0 END WHERE + WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) ) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,2) = 0. + END WHERE ! - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) ! ! CASE('C2R2','KHKO') WHERE (PRS(:,:,:,2) < 0. .OR. PSVS(:,:,:,NSV_C2R2BEG+1) < 0.) - PSVS(:,:,:,NSV_C2R2BEG) = 0.0 + PSVS(:,:,:,NSV_C2R2BEG+1) = 0.0 END WHERE DO JSV = 2, 3 WHERE (PRS(:,:,:,JSV) < 0. .OR. PSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.) @@ -646,8 +652,14 @@ SELECT CASE ( HCLOUD ) PSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0 END WHERE ENDDO + WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) ) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,2) = 0. + PSVS(:,:,:,NSV_C2R2BEG+1) = 0. + END WHERE ! - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) ! ! CASE('ICE3','ICE4') @@ -684,76 +696,59 @@ SELECT CASE ( HCLOUD ) PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:) END WHERE END IF -! - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) -! - CASE('C3R5') - WHERE (PRS(:,:,:,2) < 0. .OR. PSVS(:,:,:,NSV_C2R2BEG+1) < 0.) - PSVS(:,:,:,NSV_C2R2BEG) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRS(:,:,:,JSV) < 0. .OR. PSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,JSV) = 0.0 - PSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0 - END WHERE - ENDDO -! ice - WHERE (PRS(:,:,:,4) < 0.) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,4) = 0.0 - PSVS(:,:,:,NSV_C2R2BEG+3) = 0.0 - END WHERE -! cloud - WHERE (PRS(:,:,:,2) < 0.) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,2) = 0.0 - PSVS(:,:,:,NSV_C2R2BEG+1) = 0.0 - END WHERE -! - PSVS(:,:,:,ISVBEG:ISVEND) = MAX( 0.0,PSVS(:,:,:,ISVBEG:ISVEND) ) - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) ! CASE('LIMA') ! Correction where rc<0 or Nc<0 - IF (OWARM) THEN - WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + IF (OWARM) THEN + WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,2) = 0.0 - PSVS(:,:,:,NSV_LIMA_NC) = 0.0 - END WHERE - END IF + PRS(:,:,:,2) = 0.0 + PSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) ) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,2) = 0. + PSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + END IF ! Correction where rr<0 or Nr<0 - IF (OWARM .AND. ORAIN) THEN - WHERE (PRS(:,:,:,3) < YRTMIN(3)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NR) < YCTMIN(3)/PTSTEP) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,3) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,3) * ZLV(:,:,:) / & + IF (OWARM .AND. ORAIN) THEN + WHERE (PRS(:,:,:,3) < YRTMIN(3)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NR) < YCTMIN(3)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,3) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,3) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,3) = 0.0 - PSVS(:,:,:,NSV_LIMA_NR) = 0.0 - END WHERE - END IF + PRS(:,:,:,3) = 0.0 + PSVS(:,:,:,NSV_LIMA_NR) = 0.0 + END WHERE + END IF ! Correction where ri<0 or Ni<0 - IF (LCOLD) THEN - WHERE (PRS(:,:,:,4) < YRTMIN(4)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NI) < YCTMIN(4)/PTSTEP) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & + IF (LCOLD) THEN + WHERE (PRS(:,:,:,4) < YRTMIN(4)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NI) < YCTMIN(4)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,4) = 0.0 - PSVS(:,:,:,NSV_LIMA_NI) = 0.0 - END WHERE + PRS(:,:,:,4) = 0.0 + PSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + IF(KRR > 3) THEN + WHERE ((PRS(:,:,:,1) < 0.).AND.(PRS(:,:,:,4) > 0.)) + ZCOR(:,:,:)=MIN(-PRS(:,:,:,1),PRS(:,:,:,4)) + PRS(:,:,:,1) = PRS(:,:,:,1) + ZCOR(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE END IF + END IF +! if rc or ri are positive, we can correct negative rv +! cloud +! ice ! - PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0,PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) + PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0,PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) ! END SELECT ! @@ -1138,30 +1133,41 @@ ENDIF ! SELECT CASE ( HCLOUD ) CASE('KESS') - WHERE (PRS(:,:,:,2) < 0.) + DO JRR=2,SIZE(PRS,4) + WHERE (PRS(:,:,:,JRR) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JRR) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JRR) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,JRR) = 0.0 + END WHERE + END DO + WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) ) PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,2) = 0.0 + PRS(:,:,:,2) = 0. END WHERE ! - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) ! CASE('ICE3','ICE4') - WHERE (PRS(:,:,:,4) < 0.) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & + DO JRR=4,SIZE(PRS,4) + WHERE (PRS(:,:,:,JRR) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JRR) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JRR) * ZLS(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,4) = 0. - END WHERE + PRS(:,:,:,JRR) = 0. + END WHERE + END DO ! ! cloud - WHERE (PRS(:,:,:,2) < 0.) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + DO JRR=2,3 + WHERE (PRS(:,:,:,JRR) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JRR) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JRR) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,2) = 0. - END WHERE + PRS(:,:,:,JRR) = 0. + END WHERE + END DO ! ! if rc or ri are positive, we can correct negative rv ! cloud @@ -1182,25 +1188,8 @@ SELECT CASE ( HCLOUD ) END WHERE END IF ! - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) -! - CASE('C2R2','KHKO') - WHERE (PRS(:,:,:,2) < 0. .OR. PSVS(:,:,:,NSV_C2R2BEG+1) < 0.) - PSVS(:,:,:,NSV_C2R2BEG) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRS(:,:,:,JSV) < 0. .OR. PSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,JSV) = 0.0 - PSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0 - END WHERE - ENDDO -! - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) ! - CASE('C3R5') + CASE('C2R2','KHKO') WHERE (PRS(:,:,:,2) < 0. .OR. PSVS(:,:,:,NSV_C2R2BEG+1) < 0.) PSVS(:,:,:,NSV_C2R2BEG) = 0.0 END WHERE @@ -1213,59 +1202,71 @@ SELECT CASE ( HCLOUD ) PSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0 END WHERE ENDDO -! ice - WHERE (PRS(:,:,:,4) < 0.) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,4) = 0.0 - PSVS(:,:,:,NSV_C2R2BEG+3) = 0.0 - END WHERE -! cloud - WHERE (PRS(:,:,:,2) < 0.) + WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) ) PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,2) = 0.0 - PSVS(:,:,:,NSV_C2R2BEG+1) = 0.0 + PRS(:,:,:,2) = 0. + PSVS(:,:,:,NSV_C2R2BEG+1) = 0. END WHERE ! - PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) -! - CASE('LIMA') + CASE('LIMA') ! Correction where rc<0 or Nc<0 - IF (OWARM) THEN - WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + IF (OWARM) THEN + WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,2) = 0.0 - PSVS(:,:,:,NSV_LIMA_NC) = 0.0 - END WHERE - END IF + PRS(:,:,:,2) = 0.0 + PSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) ) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,2) = 0. + PSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + END IF ! Correction where rr<0 or Nr<0 - IF (OWARM .AND. ORAIN) THEN - WHERE (PRS(:,:,:,3) < YRTMIN(3)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NR) < YCTMIN(3)/PTSTEP) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,3) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,3) * ZLV(:,:,:) / & + IF (OWARM .AND. ORAIN) THEN + WHERE (PRS(:,:,:,3) < YRTMIN(3)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NR) < YCTMIN(3)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,3) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,3) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,3) = 0.0 - PSVS(:,:,:,NSV_LIMA_NR) = 0.0 - END WHERE - END IF + PRS(:,:,:,3) = 0.0 + PSVS(:,:,:,NSV_LIMA_NR) = 0.0 + END WHERE + END IF ! Correction where ri<0 or Ni<0 - IF (LCOLD) THEN - WHERE (PRS(:,:,:,4) < YRTMIN(4)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NI) < YCTMIN(4)/PTSTEP) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & + IF (LCOLD) THEN + WHERE (PRS(:,:,:,4) < YRTMIN(4)/PTSTEP .OR. PSVS(:,:,:,NSV_LIMA_NI) < YCTMIN(4)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,4) = 0.0 - PSVS(:,:,:,NSV_LIMA_NI) = 0.0 - END WHERE + PRS(:,:,:,4) = 0.0 + PSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + DO JRR=5,SIZE(PRS,4) + WHERE (PRS(:,:,:,JRR) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JRR) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JRR) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,JRR) = 0. + END WHERE + END DO + IF(KRR > 3) THEN + WHERE ((PRS(:,:,:,1) < 0.).AND.(PRS(:,:,:,4) > 0.)) + ZCOR(:,:,:)=MIN(-PRS(:,:,:,1),PRS(:,:,:,4)) + PRS(:,:,:,1) = PRS(:,:,:,1) + ZCOR(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE END IF + END IF ! - PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0,PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) - PRS(:,:,:,:) = MAX( 0.0,PRS (:,:,:,:) ) + PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0,PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) ! END SELECT ! diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index b249ece89..500878f86 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -343,6 +343,7 @@ END MODULE MODI_TURB !! 03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and microphysics budgets ! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices ! P. Wautelet + Benoit Vié 11/06/2020: improve removal of negative scalar variables + adapt the corresponding budgets +! P. Wautelet + Benoît Vié 23/06/2020: improve removal of negative scalar variables !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1122,27 +1123,33 @@ END IF ! SELECT CASE ( HCLOUD ) CASE('KESS') + ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) WHERE (PRRS(:,:,:,2) < 0.) - ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) - ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXNE(:,:,:) PRRS(:,:,:,2) = 0.0 END WHERE + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,2) = 0. + END WHERE ! IF (LBUDGET_TH) CALL BUDGET (PRTHLS(:,:,:), 4,'NETUR_BU_RTH') IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NETUR_BU_RRV') IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NETUR_BU_RRC') CASE('ICE3','ICE4') - ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) WHERE (PRRS(:,:,:,4) < 0.) PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & @@ -1183,23 +1190,30 @@ SELECT CASE ( HCLOUD ) IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), 9,'NETUR_BU_RRI') ! CASE('C2R2','KHKO') - ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) - WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG+1) < 0.) - PRSVS(:,:,:,NSV_C2R2BEG) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) - PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & + ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG+1) < 0.) + PRSVS(:,:,:,NSV_C2R2BEG) = 0.0 + END WHERE + DO JSV = 2, 3 + WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXNE(:,:,:) - PRRS(:,:,:,JSV) = 0.0 - PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0 - END WHERE - END DO + PRRS(:,:,:,JSV) = 0.0 + PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0 + END WHERE + END DO + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,2) = 0. + PRSVS(:,:,:,NSV_C2R2BEG+1) = 0. + END WHERE ! IF (LBUDGET_TH) CALL BUDGET (PRTHLS(:,:,:), 4,'NETUR_BU_RTH') IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NETUR_BU_RRV') @@ -1211,45 +1225,60 @@ SELECT CASE ( HCLOUD ) END DO END IF ! - CASE('LIMA') - ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + CASE('LIMA') + ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT) + ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) ! Correction where rc<0 or Nc<0 - IF (LWARM) THEN - WHERE (PRRS(:,:,:,2) < XRTMIN(2)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NC) < XCTMIN(2)/PTSTEP) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) - PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + IF (LWARM) THEN + WHERE (PRRS(:,:,:,2) < XRTMIN(2)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NC) < XCTMIN(2)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXNE(:,:,:) - PRRS(:,:,:,2) = 0.0 - PRSVS(:,:,:,NSV_LIMA_NC) = 0.0 - END WHERE - END IF + PRRS(:,:,:,2) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,2) = 0. + PRSVS(:,:,:,NSV_LIMA_NC) = 0.0 + END WHERE + END IF ! Correction where rr<0 or Nr<0 - IF (LWARM .AND. LRAIN) THEN - WHERE (PRRS(:,:,:,3) < XRTMIN(3)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NR) < XCTMIN(3)/PTSTEP) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,3) - PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,3) * ZLV(:,:,:) / & + IF (LWARM .AND. LRAIN) THEN + WHERE (PRRS(:,:,:,3) < XRTMIN(3)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NR) < XCTMIN(3)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,3) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,3) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXNE(:,:,:) - PRRS(:,:,:,3) = 0.0 - PRSVS(:,:,:,NSV_LIMA_NR) = 0.0 - END WHERE - END IF + PRRS(:,:,:,3) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NR) = 0.0 + END WHERE + END IF ! Correction where ri<0 or Ni<0 - IF (LCOLD) THEN - WHERE (PRRS(:,:,:,4) < XRTMIN(4)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NI) < XCTMIN(4)/PTSTEP) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) - PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & + IF (LCOLD) THEN + WHERE (PRRS(:,:,:,4) < XRTMIN(4)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NI) < XCTMIN(4)/PTSTEP) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & ZCPH(:,:,:) / ZEXNE(:,:,:) - PRRS(:,:,:,4) = 0.0 - PRSVS(:,:,:,NSV_LIMA_NI) = 0.0 - END WHERE + PRRS(:,:,:,4) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + IF(KRR > 3) THEN + WHERE ((PRRS(:,:,:,1) < 0.).AND.(PRRS(:,:,:,4) > 0.)) + ZCOR(:,:,:)=MIN(-PRRS(:,:,:,1),PRRS(:,:,:,4)) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + ZCOR(:,:,:) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,4) = PRRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE END IF + END IF ! - PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0, PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) ) - !Commented out for B. Vie 15/05/2020 PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) + PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0, PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) ) ! IF (LBUDGET_TH) CALL BUDGET (PRTHLS(:,:,:), 4,'NETUR_BU_RTH') IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NETUR_BU_RRV') -- GitLab