From 1173e76c32fd473554934e9820b76105a365f4a8 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Mon, 2 Mar 2020 18:09:44 +0100 Subject: [PATCH] Benoit V. 02/03/2020: LIMA negativity checks in budgets for turbulence, advection and microphysics --- src/MNH/advection_metsv.f90 | 151 +++++++++++++++++++++++---- src/MNH/ini_budget.f90 | 202 ++++++++++++++++++++++++++++++++---- src/MNH/modd_budget.f90 | 16 +++ src/MNH/modn_budget.f90 | 16 ++- src/MNH/resolved_cloud.f90 | 177 +++++++++++++++++++++++++++++-- src/MNH/turb.f90 | 157 +++++++++++++++++++++++----- 6 files changed, 638 insertions(+), 81 deletions(-) diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 3ec0b2a5c..0d76a09cf 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -136,6 +136,8 @@ END MODULE MODI_ADVECTION_METSV !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! 07/2017 (V. Vionnet) : add advection of 2D variables at !! the surface for the blowing snow scheme +!! 03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and +!! microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -153,6 +155,9 @@ USE MODD_BLOWSNOW USE MODD_BLOWSNOW_n USE MODD_PARAMETERS ! +USE MODD_NSV +USE MODD_PARAM_LIMA +! USE MODE_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODE_FMWRIT USE MODE_IO_ll @@ -253,7 +258,7 @@ REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),NBLOWSNOW_2D) :: ZRSNWCS_ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOX1,ZRHOX2 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOY1,ZRHOY2 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOZ1,ZRHOZ2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZT,ZEXN,ZLV,ZLS,ZCPH +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR ! Temporary advected rhodj for PPM routines ! INTEGER :: JS,JR,JSV,JSPL, JI, JJ ! Loop index @@ -685,34 +690,136 @@ DO JSV=1,KSV IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADV_BU_RSV') END DO ! -IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN - 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) +SELECT CASE ( HCLOUD ) + 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(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,4) = 0. + END WHERE +! +! cloud + WHERE (PRRS(:,:,:,2) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,2) = 0. + END WHERE +! +! if rc or ri are positive, we can correct negative rv +! cloud + WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) ) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,2) = 0. + END WHERE +! ice + 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 +! + 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) ! CALL GET_HALO(PRRS(:,:,:,2)) ! CALL GET_HALO(PRSVS(:,:,:,2)) ! CALL GET_HALO(PRSVS(:,:,:,3)) - WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) - PRSVS(:,:,:,1) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,JSV) = 0.0 - PRSVS(:,:,:,JSV) = 0.0 - END WHERE - END DO -! + WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) + PRSVS(:,:,:,1) = 0.0 + END WHERE + DO JSV = 2, 3 + WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) + PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,JSV) = 0.0 + PRSVS(:,:,:,JSV) = 0.0 + END WHERE + END DO + ! + 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(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,2) = 0.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(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + 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(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRRS(:,:,:,4) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + END IF +! + PRSVS(:,:,:,:) = MAX( 0.0,PRSVS(:,:,:,:) ) + PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) +! +END SELECT +! +IF ((HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'KHKO') .OR. (HCLOUD /= 'C2R2') .OR. (HCLOUD /= 'LIMA') ) THEN IF (LBUDGET_TH) CALL BUDGET (PRTHS(:,:,:) , 4,'NEADV_BU_RTH') IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NEADV_BU_RRV') IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NEADV_BU_RRC') - + IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3), 8,'NEADV_BU_RRR') + IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), 9,'NEADV_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'NEADV_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'NEADV_BU_RRG') + IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'NEADV_BU_RRH') +END IF +IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN + IF (LWARM) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NC),12+NSV_LIMA_NC,'NEADV_BU_RSV') + IF (LWARM.AND.LRAIN) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NR),12+NSV_LIMA_NR,'NEADV_BU_RSV') + IF (LCOLD) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NI),12+NSV_LIMA_NI,'NEADV_BU_RSV') + IF (NMOD_CCN.GE.1) THEN + DO JI=1, NMOD_CCN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_CCN_FREE+JI-1),12+NSV_LIMA_CCN_FREE+JI-1,'NEADV_BU_RSV') + END DO + END IF + IF (NMOD_IFN.GE.1) THEN + DO JI=1, NMOD_IFN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_IFN_FREE+JI-1),12+NSV_LIMA_IFN_FREE+JI-1,'NEADV_BU_RSV') + END DO + END IF END IF - !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index 5282ebc82..baaa59fb6 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -156,6 +156,7 @@ END MODULE MODI_INI_BUDGET ! P. Wautelet 24/02/2020: bugfix: corrected condition for budget NCDEPITH ! P. Wautelet 26/02/2020: bugfix: rename CEVA->REVA for budget for raindrop evaporation in C2R2 (necessary after commit 4ed805fc) ! P. Wautelet 26/02/2020: bugfix: add missing condition on OCOLD for NSEDIRH budget in LIMA case +! B. Vie 02/03/2020 : LIMA negativity checks after turbulence, advection and microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -779,14 +780,16 @@ IF (LBU_RTH) THEN IPROC=IPROC+1 IF (HTURB /= 'NONE') IPROACTV(4,IPROC) = NDISSHTH IPROC=IPROC+1 - IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2'))) & + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & IPROACTV(4,IPROC) = NNETURTH IPROC=IPROC+1 IF ( HSCONV == 'EDKF' ) IPROACTV(4,IPROC) = NMAFLTH IPROC=IPROC+1 IPROACTV(4,IPROC) = NADVTH IPROC=IPROC+1 - IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) IPROACTV(4,IPROC) = NNEADVTH + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(4,IPROC) = NNEADVTH IPROC=IPROC+1 IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') & IPROACTV(4,IPROC) = NNEGATH @@ -889,9 +892,10 @@ IF (LBU_RTH) THEN IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO' .OR. HCLOUD(1:3) == 'KES' .OR. & HCLOUD == 'REVE') IPROACTV(4,IPROC) = NCONDTH IPROC=IPROC+1 - IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2'))& + END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2').OR. (HCLOUD == 'KESS')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& IPROACTV(4,IPROC) = NNECONTH - END IF ! YWORK2(4,1) = 'INIF_' YWORK2(4,2) = 'ENDF_' @@ -1028,8 +1032,9 @@ IF (LBU_RTH) THEN IPROC=IPROC+1 YWORK2(4,IPROC) = 'COND_' IPROC=IPROC+1 - YWORK2(4,IPROC) = 'NECON_' END IF + YWORK2(4,IPROC) = 'NECON_' + IPROC=IPROC+1 ! YEND_COMMENT(4) = 'BU_RTH' NBUPROCNBR(4) = 3 @@ -1159,14 +1164,16 @@ IF (LBU_RRV) THEN END IF END IF IPROC=IPROC+1 - IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2'))) & + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))) & IPROACTV(6,IPROC) = NNETURRV IPROC=IPROC+1 IF ( HSCONV == 'EDKF' ) IPROACTV(6,IPROC) = NMAFLRV IPROC=IPROC+1 IPROACTV(6,IPROC) = NADVRV IPROC=IPROC+1 - IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) IPROACTV(6,IPROC) = NNEADVRV + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(6,IPROC) = NNEADVRV IPROC=IPROC+1 IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') & IPROACTV(6,IPROC) = NNEGARV @@ -1218,10 +1225,11 @@ IF (LBU_RRV) THEN IF (HCLOUD(1:3) == 'ICE' .AND. (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) )) & IPROACTV(6,IPROC) = NCDEPIRV IPROC=IPROC+1 - IF ( (HCLOUD == 'KHKO' ) .OR. (HCLOUD == 'C2R2')) & +END IF + IF ( (HCLOUD == 'KHKO' ) .OR. (HCLOUD == 'C2R2') .OR. (HCLOUD == 'KESS')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) & IPROACTV(6,IPROC) = NNECONRV IPROC=IPROC+1 -END IF ! YWORK2(6,1) = 'INIF_' @@ -1296,9 +1304,9 @@ ELSE YWORK2(6,IPROC) = 'CORR_' IPROC=IPROC+1 YWORK2(6,IPROC) = 'CDEPI_' +END IF IPROC=IPROC+1 YWORK2(6,IPROC) = 'NECON_' -END IF ! YEND_COMMENT(6) = 'BU_RRV' NBUPROCNBR(6) = 3 @@ -1353,12 +1361,14 @@ IF (LBU_RRC) THEN END IF END IF IPROC=IPROC+1 - IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2'))) & + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))) & IPROACTV(7,IPROC) = NNETURRC IPROC=IPROC+1 IPROACTV(7,IPROC) = NADVRC IPROC=IPROC+1 - IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) & + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) & IPROACTV(7,IPROC) = NNEADVRC IPROC=IPROC+1 IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') & @@ -1465,10 +1475,11 @@ IF (LBU_RRC) THEN IF (HCLOUD == 'C2R2'.OR. HCLOUD == 'KHKO' .OR. & HCLOUD(1:3) == 'KES'.OR. HCLOUD == 'REVE') IPROACTV(7,IPROC) = NCONDRC IPROC=IPROC+1 - IF ( (HCLOUD == 'KHKO' ) .OR. (HCLOUD == 'C2R2')) & +END IF + IF ( (HCLOUD == 'KHKO' ) .OR. (HCLOUD == 'C2R2') .OR. (HCLOUD == 'KESS')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) & IPROACTV(7,IPROC) = NNECONRC IPROC=IPROC+1 - END IF ! YWORK2(7,1) = 'INIF_' @@ -1586,9 +1597,9 @@ IF (LBU_RRC) THEN YWORK2(7,IPROC) = 'CDEPI_' IPROC=IPROC+1 YWORK2(7,IPROC) = 'COND_' - IPROC=IPROC+1 - YWORK2(7,IPROC) = 'NECON_' END IF + IPROC=IPROC+1 + YWORK2(7,IPROC) = 'NECON_' ! YEND_COMMENT(7) = 'BU_RRC' NBUPROCNBR(7) = 3 @@ -1627,8 +1638,14 @@ IF (LBU_RRR) THEN END IF END IF IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(8,IPROC) = NNETURRR + IPROC=IPROC+1 IPROACTV(8,IPROC) = NADVRR IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(8,IPROC) = NNEADVRR + IPROC=IPROC+1 IF ( HCLOUD /= 'NONE' ) IPROACTV(8,IPROC) = NNEGARR IPROC=IPROC+1 @@ -1662,6 +1679,7 @@ IF (LBU_RRR) THEN IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(8,IPROC) = NWETHRR IPROC=IPROC+1 IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(8,IPROC) = NHMLTRR + IPROC=IPROC+1 ELSE IF (HCLOUD(1:3) == 'KES' ) IPROACTV(8,IPROC) = NSEDIRR IPROC=IPROC+1 @@ -1718,6 +1736,9 @@ IF (LBU_RRR) THEN IPROACTV(8,IPROC) = NSEDIRR IPROC=IPROC+1 END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(8,IPROC) = NNECONRR ! YWORK2(8,1) = 'INIF_' YWORK2(8,2) = 'ENDF_' @@ -1733,8 +1754,12 @@ IF (LBU_RRR) THEN IPROC=IPROC+1 YWORK2(8,IPROC) = 'REL_' IPROC=IPROC+1 + YWORK2(8,IPROC) = 'NETUR_' + IPROC=IPROC+1 YWORK2(8,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(8,IPROC) = 'NEADV_' + IPROC=IPROC+1 YWORK2(8,IPROC) = 'NEGA_' IPROC=IPROC+1 @@ -1768,7 +1793,6 @@ IF (HCLOUD == 'LIMA') THEN YWORK2(8,IPROC) = 'WETH_' IPROC=IPROC+1 YWORK2(8,IPROC) = 'HMLT_' - IPROC=IPROC+1 ELSE YWORK2(8,IPROC) = 'SEDI_' IPROC=IPROC+1 @@ -1816,6 +1840,8 @@ ELSE IPROC=IPROC+1 YWORK2(8,IPROC) = 'SEDI_' END IF + IPROC=IPROC+1 + YWORK2(8,IPROC) = 'NECON_' ! YEND_COMMENT(8) = 'BU_RRR' NBUPROCNBR(8) = 3 @@ -1868,8 +1894,15 @@ IF (LBU_RRI) THEN END IF END IF IPROC=IPROC+1 + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & + IPROACTV(9,IPROC) = NNETURRI + IPROC=IPROC+1 IPROACTV(9,IPROC) = NADVRI IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(9,IPROC) = NNEADVRI + IPROC=IPROC+1 IF( HCLOUD /= 'NONE' ) IPROACTV(9,IPROC) = NNEGARI IPROC=IPROC+1 @@ -1908,7 +1941,8 @@ IF (LBU_RRI) THEN IPROC=IPROC+1 IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(9,IPROC) = NWETHRI IPROC=IPROC+1 - IPROACTV(9,IPROC) = NCEDSRI + IPROACTV(9,IPROC) = NCEDSRI + IPROC=IPROC+1 ELSE IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LADJ_BEFORE) IPROACTV(9,IPROC) = NADJURI IPROC=IPROC+1 @@ -1947,6 +1981,9 @@ IF (LBU_RRI) THEN IPROACTV(9,IPROC) = NCDEPIRI IPROC=IPROC+1 END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(9,IPROC) = NNECONRI ! YWORK2(9,1) = 'INIF_' YWORK2(9,2) = 'ENDF_' @@ -1968,8 +2005,12 @@ IF (LBU_RRI) THEN IPROC=IPROC+1 YWORK2(9,IPROC) = 'HTURB_' IPROC= IPROC+1 + YWORK2(9,IPROC) = 'NETUR_' + IPROC= IPROC+1 YWORK2(9,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(9,IPROC) = 'NEADV_' + IPROC= IPROC+1 YWORK2(9,IPROC) = 'NEGA_' IPROC= IPROC+1 IF (HCLOUD=='LIMA') THEN @@ -2041,6 +2082,8 @@ IF (LBU_RRI) THEN IPROC= IPROC+1 YWORK2(9,IPROC) = 'CDEPI_' END IF + IPROC=IPROC+1 + YWORK2(9,IPROC) = 'NECON_' ! YEND_COMMENT(9) = 'BU_RRI' NBUPROCNBR(9) = 3 @@ -2078,8 +2121,15 @@ IF (LBU_RRS) THEN IPROACTV(10,IPROC) = 3 END IF END IF + IPROC=IPROC+1 + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & + IPROACTV(10,IPROC) = NNETURRS IPROC= IPROC+1 IPROACTV(10,IPROC) = NADVRS + IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(10,IPROC) = NNEADVRS IPROC= IPROC+1 IF( HCLOUD /= 'NONE' ) IPROACTV(10,IPROC) = NNEGARS IPROC=IPROC+1 @@ -2142,6 +2192,9 @@ IF (HCLOUD=='LIMA') THEN IPROACTV(10,IPROC) = NSEDIRS IPROC=IPROC+1 END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(10,IPROC) = NNECONRS ! YWORK2(10,1) = 'INIF_' YWORK2(10,2) = 'ENDF_' @@ -2156,9 +2209,13 @@ END IF YWORK2(10,IPROC) = 'DIF_' IPROC= IPROC+1 YWORK2(10,IPROC) = 'REL_' + IPROC=IPROC+1 + YWORK2(10,IPROC) = 'NETUR_' IPROC= IPROC+1 YWORK2(10,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(10,IPROC) = 'NEADV_' + IPROC=IPROC+1 YWORK2(10,IPROC) = 'NEGA_' IPROC= IPROC+1 IF (HCLOUD=='LIMA') THEN @@ -2187,7 +2244,6 @@ IF (HCLOUD=='LIMA') THEN YWORK2(10,IPROC) = 'DRYG_' IPROC= IPROC+1 YWORK2(10,IPROC) = 'WETH_' - IPROC= IPROC+1 ELSE YWORK2(10,IPROC) = 'SEDI_' IPROC= IPROC+1 @@ -2215,6 +2271,8 @@ ELSE IPROC=IPROC+1 YWORK2(10,IPROC) = 'SEDI_' END IF + IPROC=IPROC+1 + YWORK2(10,IPROC) = 'NECON_' ! YEND_COMMENT(10) = 'BU_RRS' NBUPROCNBR(10) = 3 @@ -2253,8 +2311,15 @@ IF (LBU_RRG) THEN END IF END IF IPROC=IPROC+1 + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & + IPROACTV(11,IPROC) = NNETURRG + IPROC=IPROC+1 IPROACTV(11,IPROC) = NADVRG IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(11,IPROC) = NNEADVRG + IPROC=IPROC+1 IF( HCLOUD /= 'NONE' ) IPROACTV(11,IPROC) = NNEGARG IPROC=IPROC+1 IF (HCLOUD=='LIMA') THEN @@ -2321,6 +2386,9 @@ ELSE IPROACTV(11,IPROC) = NSEDIRG IPROC=IPROC+1 END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(11,IPROC) = NNECONRG ! YWORK2(11,1) = 'INIF_' YWORK2(11,2) = 'ENDF_' @@ -2336,8 +2404,12 @@ END IF IPROC=IPROC+1 YWORK2(11,IPROC) = 'REL_' IPROC=IPROC+1 + YWORK2(11,IPROC) = 'NETUR_' + IPROC=IPROC+1 YWORK2(11,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(11,IPROC) = 'NEADV_' + IPROC=IPROC+1 YWORK2(11,IPROC) = 'NEGA_' IPROC=IPROC+1 IF (HCLOUD=='LIMA') THEN @@ -2399,6 +2471,8 @@ ELSE IPROC=IPROC+1 YWORK2(11,IPROC)= 'SEDI_' END IF + IPROC=IPROC+1 + YWORK2(11,IPROC) = 'NECON_' ! YEND_COMMENT(11) = 'BU_RRG' NBUPROCNBR(11) = 3 @@ -2449,8 +2523,15 @@ IF (LBU_RRH) THEN END IF END IF IPROC=IPROC+1 + IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') & + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) & + IPROACTV(12,IPROC) = NNETURRH + IPROC=IPROC+1 IPROACTV(12,IPROC) = NADVRH IPROC=IPROC+1 + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) IPROACTV(12,IPROC) = NNEADVRH + IPROC=IPROC+1 IF( HCLOUD /= 'NONE' ) THEN IPROACTV(12,IPROC) = NNEGARH ELSE @@ -2490,6 +2571,9 @@ IF (LBU_RRH) THEN (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LSEDIM_AFTER)) & IPROACTV(12,IPROC) = NSEDIRH END IF + IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')& + .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))& + IPROACTV(12,IPROC) = NNECONRH ! YWORK2(12,1) = 'INIF_' YWORK2(12,2) = 'ENDF_' @@ -2505,8 +2589,12 @@ IF (LBU_RRH) THEN IPROC=IPROC+1 YWORK2(12,IPROC) = 'REL_' IPROC=IPROC+1 + YWORK2(12,IPROC) = 'NETUR_' + IPROC=IPROC+1 YWORK2(12,IPROC) = 'ADV_' IPROC=IPROC+1 + YWORK2(12,IPROC) = 'NEADV_' + IPROC=IPROC+1 YWORK2(12,IPROC) = 'NEGA_' IPROC=IPROC+1 IF (HCLOUD=='LIMA' .AND. OHAIL) THEN @@ -2539,6 +2627,8 @@ IF (LBU_RRH) THEN IPROC=IPROC+1 YWORK2(12,IPROC) = 'SEDI_' END IF + IPROC=IPROC+1 + YWORK2(12,IPROC) = 'NECON_' ! YEND_COMMENT(12) = 'BU_RRH' NBUPROCNBR(12) = 3 @@ -2600,7 +2690,7 @@ IF (LBU_RSV) THEN IPROC=IPROC+1 IF ( HSCONV == 'EDKF' ) IPROACTV(12+JSV,IPROC)= NMAFLSV IPROC=IPROC+1 - IPROACTV(12+JSV,IPROC)= NADVSV + IF ( HCLOUD /= 'LIMA' ) IPROACTV(12+JSV,IPROC)= NADVSV IPROC=IPROC+1 ! YWORK2(12+JSV,1) = 'INIF_' @@ -2975,6 +3065,15 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN IF (JSV == NSV_LIMA_NC) THEN ! Cloud droplets conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OPTSPLIT .AND. OWARM .AND. ORAIN) THEN @@ -3070,10 +3169,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! ELSE IF (JSV == NSV_LIMA_NR) THEN ! Rain drops conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OPTSPLIT .AND. OWARM .AND. ORAIN) THEN @@ -3156,10 +3267,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN YWORK2(12+JSV,ILAST_PROC_NBR)= 'HMLT_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 END IF + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! ELSE IF (JSV.GE.NSV_LIMA_CCN_FREE .AND. JSV.LT.(NSV_LIMA_CCN_FREE+NMOD_CCN)) THEN ! Free CCN conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OWARM .AND. OACTI .AND. NMOD_CCN.GE.1) THEN @@ -3175,6 +3298,9 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OSCAV) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'SCAV_' @@ -3182,11 +3308,23 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN END IF ! ELSE IF (JSV.GE.NSV_LIMA_CCN_ACTI .AND. JSV.LT.(NSV_LIMA_CCN_ACTI+NMOD_CCN)) THEN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! Activated CCN conc. ELSE IF (JSV == NSV_LIMA_NI) THEN ! Pristine ice crystals conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OPTSPLIT .AND. OCOLD .AND. OSNOW) THEN @@ -3272,10 +3410,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! ELSE IF (JSV.GE.NSV_LIMA_IFN_FREE .AND. JSV.LT.(NSV_LIMA_IFN_FREE+NMOD_IFN)) THEN ! Free IFN conc. ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OCOLD .AND. ONUCL .AND. (.NOT.OMEYERS)) THEN @@ -3286,6 +3436,9 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OSCAV) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'SCAV_' @@ -3293,13 +3446,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN END IF ! ELSE IF (JSV.GE.NSV_LIMA_IFN_NUCL .AND. JSV.LT.(NSV_LIMA_IFN_NUCL+NMOD_IFN)) THEN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! Nucleated IFN conc. ELSE IF (JSV.GE.NSV_LIMA_IMM_NUCL .AND. JSV.LT.(NSV_LIMA_IMM_NUCL+NMOD_IMM)) THEN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 ! Nucleated IMM conc. ELSE IF (JSV == NSV_LIMA_HOM_HAZE) THEN ! Homogeneous freezing of CCN + ILAST_PROC_NBR = ILAST_PROC_NBR + 1 + YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_' + IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 IF (OCOLD .AND. ONUCL .AND. OWARM .AND. OHHONI) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'HONH_' diff --git a/src/MNH/modd_budget.f90 b/src/MNH/modd_budget.f90 index 14387e9f0..ee2b7af9e 100644 --- a/src/MNH/modd_budget.f90 +++ b/src/MNH/modd_budget.f90 @@ -42,6 +42,7 @@ !! C. LAc 10/2016 add droplets deposition !! S. Riette 11/2016 New budgets for ICE3/ICE4 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! B.Vie 03/02/2020 : LIMA negativity checks after turbulence, advection and microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -399,6 +400,9 @@ INTEGER, SAVE :: NFRCRR ! forcing INTEGER, SAVE :: NDIFRR ! numerical diffusion INTEGER, SAVE :: NRELRR ! relaxation INTEGER, SAVE :: NNEGARR ! negative correction +INTEGER, SAVE :: NNETURRR ! negative correction +INTEGER, SAVE :: NNEADVRR ! negative correction +INTEGER, SAVE :: NNECONRR ! negative correction INTEGER, SAVE :: NACCRRR ! accretion INTEGER, SAVE :: NAUTORR ! autoconversion INTEGER, SAVE :: NREVARR ! rain evaporation @@ -434,6 +438,9 @@ INTEGER, SAVE :: NDCONVRI ! Deep CONVection INTEGER, SAVE :: NHTURBRI ! horizontal turbulence INTEGER, SAVE :: NVTURBRI ! vertical turbulence INTEGER, SAVE :: NNEGARI ! negative correction +INTEGER, SAVE :: NNETURRI ! negative correction +INTEGER, SAVE :: NNEADVRI ! negative correction +INTEGER, SAVE :: NNECONRI ! negative correction INTEGER, SAVE :: NSEDIRI ! SEDImentation ICE3 INTEGER, SAVE :: NHENURI ! HEterogenous NUcleation ICE3 INTEGER, SAVE :: NHONRI ! HOmogeneous Nucleation ICE3 @@ -472,6 +479,9 @@ INTEGER, SAVE :: NFRCRS ! forcing INTEGER, SAVE :: NDIFRS ! numerical diffusion INTEGER, SAVE :: NRELRS ! relaxation INTEGER, SAVE :: NNEGARS ! negative correction +INTEGER, SAVE :: NNETURRS ! negative correction +INTEGER, SAVE :: NNEADVRS ! negative correction +INTEGER, SAVE :: NNECONRS ! negative correction INTEGER, SAVE :: NSEDIRS ! SEDImentation ICE3 INTEGER, SAVE :: NDEPSRS ! DEPosition on Snow ICE3 INTEGER, SAVE :: NAGGSRS ! AGGregation of snow ICE3 @@ -501,6 +511,9 @@ INTEGER, SAVE :: NFRCRG ! forcing INTEGER, SAVE :: NDIFRG ! numerical diffusion INTEGER, SAVE :: NRELRG ! relaxation INTEGER, SAVE :: NNEGARG ! negative correction +INTEGER, SAVE :: NNETURRG ! negative correction +INTEGER, SAVE :: NNEADVRG ! negative correction +INTEGER, SAVE :: NNECONRG ! negative correction INTEGER, SAVE :: NSEDIRG ! SEDImentation ICE3 INTEGER, SAVE :: NSFRRG ! Spontaneous FReezing ICE3 INTEGER, SAVE :: NDEPGRG ! DEPosition on Snow ICE3 @@ -533,6 +546,9 @@ INTEGER, SAVE :: NFRCRH ! forcing INTEGER, SAVE :: NDIFRH ! numerical diffusion INTEGER, SAVE :: NRELRH ! relaxation INTEGER, SAVE :: NNEGARH ! negative correction +INTEGER, SAVE :: NNETURRH ! negative correction +INTEGER, SAVE :: NNEADVRH ! negative correction +INTEGER, SAVE :: NNECONRH ! negative correction INTEGER, SAVE :: NSEDIRH ! sedimentation INTEGER, SAVE :: NWETGRH ! wet growth of graupel INTEGER, SAVE :: NWETHRH ! wet growth of hail diff --git a/src/MNH/modn_budget.f90 b/src/MNH/modn_budget.f90 index faf5c1f76..da0053137 100644 --- a/src/MNH/modn_budget.f90 +++ b/src/MNH/modn_budget.f90 @@ -225,6 +225,7 @@ !! C. Barthe /16 add budget terms for LIMA !! C.Lac 10/2016 Add droplet deposition !! S. Riette 11/2016 New budgets for ICE3/ICE4 +!! B.Vie 03/02/2020 LIMA negativity checks after turbulence, advection and microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -274,28 +275,33 @@ NAMELIST/NAM_BU_RRC/LBU_RRC, NASSERC, NNESTRC, NADVRC, NFRCRC, & NAMELIST/NAM_BU_RRR/LBU_RRR, NASSERR, NNESTRR, NADVRR, NFRCRR, & NDIFRR, NRELRR, NNEGARR, NACCRRR, NAUTORR, NREVARR, NSEDIRR, & NSFRRR, NACCRR, NCFRZRR, NWETGRR, NDRYGRR, NGMLTRR, NWETHRR, & - NHMLTRR, NDRYHRR, NCORRRR, NCMELRR,NHONRRR, NCORRRR, NR2C1RR, NCVRCRR + NHMLTRR, NDRYHRR, NCORRRR, NCMELRR,NHONRRR, NCORRRR, NR2C1RR, NCVRCRR, & + NNETURRR, NNEADVRR, NNECONRR ! NAMELIST/NAM_BU_RRI/LBU_RRI, NASSERI, NNESTRI, NADVRI, NFRCRI, & NDIFRI, NRELRI, NDCONVRI, NHTURBRI, NVTURBRI, NNEGARI, NSEDIRI, & NHENURI, NHONRI, NAGGSRI, NAUTSRI, NCFRZRI, NWETGRI, NDRYGRI, & NIMLTRI, NBERFIRI, NCDEPIRI, NWETHRI, NDRYHRI, NADJURI, NCORRRI, & NHINDRI, NHINCRI, NHONHRI, NHONCRI, NCNVIRI, NCNVSRI, & - NHMSRI, NHMGRI, NCEDSRI, NCORRRI + NHMSRI, NHMGRI, NCEDSRI, NCORRRI, & + NNETURRI, NNEADVRI, NNECONRI ! NAMELIST/NAM_BU_RRS/LBU_RRS, NASSERS, NNESTRS, NADVRS, NFRCRS, & NDIFRS, NRELRS, NNEGARS, NSEDIRS, NDEPSRS, NAGGSRS, NAUTSRS, & NRIMRS, NACCRS, NCMELRS, NWETGRS, NDRYGRS, NWETHRS, NDRYHRS, & - NCORRRS, NCNVIRS, NCNVSRS, NHMSRS, NCORRRS + NCORRRS, NCNVIRS, NCNVSRS, NHMSRS, NCORRRS, & + NNETURRS, NNEADVRS, NNECONRS ! NAMELIST/NAM_BU_RRG/LBU_RRG, NASSERG, NNESTRG, NADVRG, NFRCRG, & NDIFRG, NRELRG, NNEGARG, NSEDIRG, NSFRRG, NDEPGRG, NRIMRG, NACCRG, & NCMELRG, NCFRZRG, NWETGRG, NDRYGRG, NGMLTRG, NWETHRG, & - NDRYHRG, NCORRRG, NHGCVRG, NGHCVRG,NHONRRG, NHMGRG, NCOHGRG + NDRYHRG, NCORRRG, NHGCVRG, NGHCVRG,NHONRRG, NHMGRG, NCOHGRG, & + NNETURRG, NNEADVRG, NNECONRG ! NAMELIST/NAM_BU_RRH/LBU_RRH, NASSERH, NNESTRH, NADVRH, NFRCRH, & NDIFRH, NRELRH, NNEGARH, NSEDIRH, NWETGRH, NWETHRH, NDRYHRH, NHMLTRH, & - NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH + NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH, & + NNETURRH, NNEADVRH, NNECONRH ! NAMELIST/NAM_BU_RSV/ LBU_RSV, NASSESV, NNESTSV, NADVSV, NFRCSV, & NDIFSV, NRELSV, NDCONVSV, NVTURBSV, NHTURBSV, NCHEMSV, NMAFLSV, & diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 6be69455e..f3b451997 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -267,7 +267,8 @@ END MODULE MODI_RESOLVED_CLOUD !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! P. Wautelet: 01/02/2019: ZRSMIN is now allocatable (instead of size of XRTMIN which was sometimes not allocated) !! 02/2019 C.Lac add rain fraction as an output field -! P. Wautelet 24/02/2020: bugfix: corrected budget name (DEPI->CDEPI) for ice_adjust +!! P. Wautelet 24/02/2020: bugfix: corrected budget name (DEPI->CDEPI) for ice_adjust +!! 03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and microphysics budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -721,7 +722,7 @@ SELECT CASE ( HCLOUD ) CASE('LIMA') ! Correction where rc<0 or Nc<0 IF (OWARM) THEN - WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,NSV_LIMA_NC) < 0.) + WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP) PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) @@ -1133,10 +1134,73 @@ IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN ENDIF ENDIF ! -IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN -! CALL GET_HALO(PRS(:,:,:,2)) -! CALL GET_HALO(ZSVS(:,:,:,2)) -! CALL GET_HALO(ZSVS(:,:,:,3)) +! +SELECT CASE ( HCLOUD ) + CASE('KESS') + WHERE (PRS(:,:,:,2) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,2) = 0.0 + END WHERE +! +! +! CASE('C2R2','KHKO') +! CALL GET_HALO(PRS(:,:,:,2)) +! CALL GET_HALO(ZSVS(:,:,:,2)) +! WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.) +! ZSVS(:,:,:,1) = 0.0 +! END WHERE +! DO JSV = 2, 3 +! WHERE (PRS(:,:,:,JSV) < 0. .OR. ZSVS(:,:,:,JSV) < 0.) +! PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV) +! PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) / & +! ZCPH(:,:,:) / ZEXN(:,:,:) +! PRS(:,:,:,JSV) = 0.0 +! ZSVS(:,:,:,JSV) = 0.0 +! END WHERE +! ENDDO +! Commented 03/2013 O.Thouron +! (at least necessary to be commented for supersaturation variable) +! ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) ) +! +! + CASE('ICE3','ICE4') + WHERE (PRS(:,:,:,4) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,4) = 0. + END WHERE +! +! cloud + WHERE (PRS(:,:,:,2) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,2) = 0. + END WHERE +! +! if rc or ri are positive, we can correct negative rv +! cloud + WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) ) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,2) = 0. + END WHERE +! ice + 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(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE + END IF +! + CASE('C2R2','KHKO') WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.) ZSVS(:,:,:,1) = 0.0 END WHERE @@ -1149,9 +1213,104 @@ IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN ZSVS(:,:,:,JSV) = 0.0 END WHERE ENDDO - IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:), 4,'NECON_BU_RTH') - IF (LBUDGET_RV) CALL BUDGET (PRS(:,:,:,1) * PRHODJ(:,:,:), 6,'NECON_BU_RRV') - IF (LBUDGET_RC) CALL BUDGET (PRS(:,:,:,2) * PRHODJ(:,:,:), 7,'NECON_BU_RRC') +! + CASE('C3R5') + WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.) + ZSVS(:,:,:,1) = 0.0 + END WHERE + DO JSV = 2, 3 + WHERE (PRS(:,:,:,JSV) < 0. .OR. ZSVS(:,:,:,JSV) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,JSV) = 0.0 + ZSVS(:,:,:,JSV) = 0.0 + END WHERE + ENDDO + ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) ) +! ice + WHERE (PRS(:,:,:,4) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,4) = 0.0 + PSVS(:,:,:,4) = 0.0 + END WHERE +! cloud + WHERE (PRS(:,:,:,2) < 0.) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / PEXNREF(:,:,:) + PRS(:,:,:,2) = 0.0 + PSVS(:,:,:,2) = 0.0 + END WHERE + PSVS(:,:,:,:) = MAX( 0.0,PSVS(:,:,:,:) ) +! + CASE('LIMA') +! Correction where rc<0 or Nc<0 + IF (OWARM) THEN + WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,2) = 0.0 + ZSVS(:,:,:,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. ZSVS(:,:,:,NSV_LIMA_NR) < YCTMIN(3)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,3) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,3) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,3) = 0.0 + ZSVS(:,:,:,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. ZSVS(:,:,:,NSV_LIMA_NI) < YCTMIN(4)/PTSTEP) + PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) + PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXN(:,:,:) + PRS(:,:,:,4) = 0.0 + ZSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + END IF +! + ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) ) + PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) ) +! +END SELECT +! +! +!* 3.3 STORE THE BUDGET TERMS +! ---------------------- +! +IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:), 4,'NECON_BU_RTH') +IF (LBUDGET_RV) CALL BUDGET (PRS(:,:,:,1) * PRHODJ(:,:,:), 6,'NECON_BU_RRV') +IF (LBUDGET_RC) CALL BUDGET (PRS(:,:,:,2) * PRHODJ(:,:,:), 7,'NECON_BU_RRC') +IF (LBUDGET_RR) CALL BUDGET (PRS(:,:,:,3) * PRHODJ(:,:,:), 8,'NECON_BU_RRR') +IF (LBUDGET_RI) CALL BUDGET (PRS(:,:,:,4) * PRHODJ(:,:,:) ,9,'NECON_BU_RRI') +IF (LBUDGET_RS) CALL BUDGET (PRS(:,:,:,5) * PRHODJ(:,:,:),10,'NECON_BU_RRS') +IF (LBUDGET_RG) CALL BUDGET (PRS(:,:,:,6) * PRHODJ(:,:,:),11,'NECON_BU_RRG') +IF (LBUDGET_RH) CALL BUDGET (PRS(:,:,:,7) * PRHODJ(:,:,:),12,'NECON_BU_RRH') +IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN + IF (OWARM) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NC) * PRHODJ(:,:,:),12+NSV_LIMA_NC,'NECON_BU_RSV') + IF (OWARM.AND.ORAIN) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NR) * PRHODJ(:,:,:),12+NSV_LIMA_NR,'NECON_BU_RSV') + IF (LCOLD) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NI) * PRHODJ(:,:,:),12+NSV_LIMA_NI,'NECON_BU_RSV') + IF (NMOD_CCN.GE.1) THEN + DO JL=1, NMOD_CCN + CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_CCN_FREE+JL-1)* & + PRHODJ(:,:,:),12+NSV_LIMA_CCN_FREE+JL-1,'NECON_BU_RSV') + END DO + END IF + IF (NMOD_IFN.GE.1) THEN + DO JL=1, NMOD_IFN + CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_IFN_FREE+JL-1)* & + PRHODJ(:,:,:),12+NSV_LIMA_IFN_FREE+JL-1,'NECON_BU_RSV') + END DO + END IF END IF !------------------------------------------------------------------------------- ! diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index 5e304989b..93500879f 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -340,6 +340,7 @@ END MODULE MODI_TURB !! 04/2016 (C.Lac) correction of negativity for KHKO !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! 01/2018 (Q.Rodier) Introduction of RM17 +!! 03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and microphysics budgets !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -353,6 +354,7 @@ USE MODD_BUDGET USE MODD_IO_ll, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV +USE MODD_PARAM_LIMA ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U @@ -539,7 +541,7 @@ REAL :: ZALPHA ! proportionnality constant between Dz/2 and ! ! BL89 mixing length near the surface ! REAL :: ZTIME1, ZTIME2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH,ZCOR REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ TYPE(TFIELDDATA) :: TZFIELD ! @@ -1116,32 +1118,137 @@ IF ( KRRL >= 1 ) THEN END IF END IF ! -IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN - 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) -! CALL GET_HALO(PRRS(:,:,:,2)) -! CALL GET_HALO(PRSVS(:,:,:,2)) -! CALL GET_HALO(PRSVS(:,:,:,3)) - WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) - PRSVS(:,:,:,1) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) - PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & +SELECT CASE ( HCLOUD ) + 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) + WHERE (PRRS(:,:,:,4) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,4) = 0. + END WHERE +! +! cloud + WHERE (PRRS(:,:,:,2) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,2) = 0. + END WHERE +! +! if rc or ri are positive, we can correct negative rv +! cloud + 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 +! ice + 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(:,:,:,JSV) = 0.0 - PRSVS(:,:,:,JSV) = 0.0 - END WHERE - END DO -! - 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') + PRRS(:,:,:,4) = PRRS(:,:,:,4) -ZCOR(:,:,:) + END WHERE + END IF +! + 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) +! CALL GET_HALO(PRRS(:,:,:,2)) +! CALL GET_HALO(PRSVS(:,:,:,2)) +! CALL GET_HALO(PRSVS(:,:,:,3)) + WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) + PRSVS(:,:,:,1) = 0.0 + END WHERE + DO JSV = 2, 3 + WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,JSV) = 0.0 + PRSVS(:,:,:,JSV) = 0.0 + END WHERE + END DO + ! + 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(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,2) = 0.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(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + 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(:,:,:) / & + ZCPH(:,:,:) / ZEXNE(:,:,:) + PRRS(:,:,:,4) = 0.0 + PRSVS(:,:,:,NSV_LIMA_NI) = 0.0 + END WHERE + END IF +! + PRSVS(:,:,:,:) = MAX( 0.0,PRSVS(:,:,:,:) ) + PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) ) +! +END SELECT +! +IF ((HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'KHKO') .OR. (HCLOUD /= 'C2R2') .OR. (HCLOUD /= 'LIMA') ) THEN + 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') + IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3), 8,'NETUR_BU_RRR') + IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), 9,'NETUR_BU_RRI') + IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'NETUR_BU_RRS') + IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'NETUR_BU_RRG') + IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'NETUR_BU_RRH') END IF +IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN + IF (LWARM) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NC),12+NSV_LIMA_NC,'NETUR_BU_RSV') + IF (LWARM.AND.LRAIN) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NR),12+NSV_LIMA_NR,'NETUR_BU_RSV') + IF (LCOLD) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NI),12+NSV_LIMA_NI,'NETUR_BU_RSV') + IF (NMOD_CCN.GE.1) THEN + DO JI=1, NMOD_CCN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_CCN_FREE+JI-1),12+NSV_LIMA_CCN_FREE+JI-1,'NETUR_BU_RSV') + END DO + END IF + IF (NMOD_IFN.GE.1) THEN + DO JI=1, NMOD_IFN + CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_IFN_FREE+JI-1),12+NSV_LIMA_IFN_FREE+JI-1,'NETUR_BU_RSV') + END DO + END IF +END IF + ! !---------------------------------------------------------------------------- ! -- GitLab