From 6a77f53d7cb3ef94d730cfe983968716693ff4a4 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Thu, 24 Jan 2019 11:58:23 +0100 Subject: [PATCH] Benoit V. 24/01/2019: LIMA minor corrections --- src/MNH/ecmwf_radiation_vers2.f90 | 7 +- src/MNH/ini_budget.f90 | 12 ++-- src/MNH/lima.f90 | 103 +++++++++++++++++------------- src/MNH/lima_adjust.f90 | 3 +- src/MNH/lima_ccn_activation.f90 | 2 +- src/MNH/lima_sedimentation.f90 | 55 ++++++++-------- src/MNH/lima_tendencies.f90 | 2 +- src/MNH/lima_warm_coal.f90 | 4 +- src/MNH/lima_warm_nucl.f90 | 2 +- src/MNH/read_exsegn.f90 | 2 +- src/MNH/resolved_cloud.f90 | 47 ++++++++------ 11 files changed, 127 insertions(+), 112 deletions(-) diff --git a/src/MNH/ecmwf_radiation_vers2.f90 b/src/MNH/ecmwf_radiation_vers2.f90 index c94a2d23a..a0bb11196 100644 --- a/src/MNH/ecmwf_radiation_vers2.f90 +++ b/src/MNH/ecmwf_radiation_vers2.f90 @@ -589,11 +589,11 @@ DO JK = 1 , KLEV ZFLWP(JL)/=0.0) THEN ZNUM = PLWC(JL,IKL)/ XAC ZDEN = XCREC * (PCCT_C2R2(JL,IKL)*(PLWC(JL,IKL))**2)**(XLBEXC) - ZRADLS(JL) = 0.5E6 * sqrt(ZDEN/PCCT_C2R2(JL,IKL)) - ZRADLP(JL) = 0.5E6 * (ZNUM/ZDEN) + ZRADLS(JL) = MIN( 0.5E6 * sqrt(ZDEN/PCCT_C2R2(JL,IKL)) , 100.) + ZRADLP(JL) = MIN( 0.5E6 * (ZNUM/ZDEN) , 100.) ENDIF IF (PCRT_C2R2(JL, IKL)>XCTMIN(3) .AND. PRWC(JL,IKL)>XRTMIN(3).AND.& - ZFRWP(JL)/=0.0) THEN + ZFRWP(JL)/=0.0 ) THEN ZNUM = PRWC(JL,IKL)/ XAR ZDEN = XCRER * (PCRT_C2R2(JL,IKL)*(PRWC(JL,IKL))**2)**(XLBEXR) ZRADRS(JL) = 0.5E6 * sqrt(ZDEN/PCRT_C2R2(JL,IKL)) @@ -1098,6 +1098,7 @@ ENDDO ! NUAER = NUA NTRAER = NTRA + ! ! ------------------------------------------------------------------ !* 2.6 DIFFUSIVITY FACTOR OR SATELLITE VIEWING ANGLE diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index e63802325..4593b1fe7 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -2163,8 +2163,6 @@ END IF IPROC=IPROC+1 YWORK2(10,IPROC) = 'NEGA_' IPROC= IPROC+1 - YWORK2(10,IPROC) = 'SEDI_' - IPROC= IPROC+1 IF (HCLOUD=='LIMA') THEN YWORK2(10,IPROC) = 'CORR_' IPROC= IPROC+1 @@ -2193,6 +2191,8 @@ IF (HCLOUD=='LIMA') THEN YWORK2(10,IPROC) = 'WETH_' IPROC= IPROC+1 ELSE + YWORK2(10,IPROC) = 'SEDI_' + IPROC= IPROC+1 YWORK2(10,IPROC) = 'DEPS_' IPROC= IPROC+1 YWORK2(10,IPROC) = 'AGGS_' @@ -2259,9 +2259,6 @@ IF (LBU_RRG) THEN IPROC=IPROC+1 IF( HCLOUD /= 'NONE' ) IPROACTV(11,IPROC) = NNEGARG IPROC=IPROC+1 - IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. (.NOT. LSEDIM_AFTER)) & - IPROACTV(11,IPROC) = NSEDIRG - IPROC=IPROC+1 IF (HCLOUD=='LIMA') THEN IF (OCOLD .AND. OSNOW) IPROACTV(11,IPROC) = NSEDIRG IPROC=IPROC+1 @@ -2290,6 +2287,9 @@ IF (HCLOUD=='LIMA') THEN IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(11,IPROC) = NCOHGRG IPROC=IPROC+1 ELSE + IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. (.NOT. LSEDIM_AFTER)) & + IPROACTV(11,IPROC) = NSEDIRG + IPROC=IPROC+1 IF( HCLOUD(1:3) == 'ICE') IPROACTV(11,IPROC) = NSFRRG IPROC=IPROC+1 IF( HCLOUD(1:3) == 'ICE') IPROACTV(11,IPROC) = NDEPGRG @@ -3009,7 +3009,7 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN YWORK2(12+JSV,ILAST_PROC_NBR)= 'HINC_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 END IF - IF (OPTSPLIT .OR. OWARM) THEN + IF (OPTSPLIT .OR. (OWARM .AND. ORAIN)) THEN ILAST_PROC_NBR = ILAST_PROC_NBR + 1 YWORK2(12+JSV,ILAST_PROC_NBR)= 'SELF_' IPROACTV(12+JSV,ILAST_PROC_NBR) = 1 diff --git a/src/MNH/lima.f90 b/src/MNH/lima.f90 index 2215459b7..d9149be2a 100644 --- a/src/MNH/lima.f90 +++ b/src/MNH/lima.f90 @@ -8,24 +8,29 @@ MODULE MODI_LIMA ! INTERFACE ! -SUBROUTINE LIMA ( PTSTEP, TPFILE, OCLOSE_OUT, & - PRHODREF, PEXNREF, PZZ, & - PRHODJ, PPABSM, PPABST, & - NCCN, NIFN, NIMM, & - PTHM, PTHT, PRT, PSVT, PW_NU, & - PTHS, PRS, PSVS, & - PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PINPRH, & - PEVAP3D ) + SUBROUTINE LIMA ( KKA, KKU, KKL, & + PTSTEP, TPFILE, OCLOSE_OUT, & + PRHODREF, PEXNREF, PDZZ, & + PRHODJ, PPABSM, PPABST, & + NCCN, NIFN, NIMM, & + PTHM, PTHT, PRT, PSVT, PW_NU, & + PTHS, PRS, PSVS, & + PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PINPRH, & + PEVAP3D ) ! USE MODD_IO_ll, ONLY: TFILEDATA ! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +! REAL, INTENT(IN) :: PTSTEP ! Time step TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of output ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! absolute pressure at t @@ -60,8 +65,9 @@ END MODULE MODI_LIMA ! ! ! ######spl - SUBROUTINE LIMA ( PTSTEP, TPFILE, OCLOSE_OUT, & - PRHODREF, PEXNREF, PZZ, & + SUBROUTINE LIMA ( KKA, KKU, KKL, & + PTSTEP, TPFILE, OCLOSE_OUT, & + PRHODREF, PEXNREF, PDZZ, & PRHODJ, PPABSM, PPABST, & NCCN, NIFN, NIMM, & PTHM, PTHT, PRT, PSVT, PW_NU, & @@ -122,13 +128,17 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +! REAL, INTENT(IN) :: PTSTEP ! Time step TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: OCLOSE_OUT ! Conditional closure of output ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! absolute pressure at t @@ -292,7 +302,6 @@ INTEGER :: INB_ITER_MAX ! domain size and levels (AROME compatibility) INTEGER :: KRR INTEGER :: IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, IKTB, IKTE -INTEGER :: KKA, KKU, KKL ! loops and packing INTEGER :: II, IPACK INTEGER, DIMENSION(:), ALLOCATABLE :: I1, I2, I3 @@ -310,6 +319,22 @@ LOGICAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: GDEP !* 0. Init ! ---- ! +! +IIB=1+JPHEXT ! first physical point in i +IIT=SIZE(PDZZ,1) ! total number of points in i +IIE=IIT - JPHEXT ! last physical point in i +! +IJB=1+JPHEXT ! first physical point in j +IJT=SIZE(PDZZ,2) ! total number of points in j +IJE=IJT - JPHEXT ! last physical point in j +! +IKB=KKA+JPVEXT*KKL ! near ground physical point +IKE=KKU-JPVEXT*KKL ! near TOA physical point +IKT=SIZE(PDZZ,3) ! total number of points in k +! +IKTB=1+JPVEXT ! first index for a physical point in k +IKTE=IKT-JPVEXT ! last index for a physical point in k +! ZTHS(:,:,:) = PTHS(:,:,:) ZTHT(:,:,:) = PTHS(:,:,:) * PTSTEP ZRVT(:,:,:) = 0. @@ -550,22 +575,28 @@ END IF ! ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (LWARM .AND. LSEDC) CALL LIMA_SEDIMENTATION('L', 2, 2, 1, PTSTEP, PZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRCS, ZCCS, PINPRC) +IF (LWARM .AND. LSEDC) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'L', 2, 2, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRCS, ZCCS, PINPRC) ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (LWARM .AND. LRAIN) CALL LIMA_SEDIMENTATION('L', 2, 3, 1, PTSTEP, PZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRRS, ZCRS, PINPRR) +IF (LWARM .AND. LRAIN) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'L', 2, 3, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRRS, ZCRS, PINPRR) ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (LCOLD .AND. LSEDI) CALL LIMA_SEDIMENTATION('I', 2, 4, 1, PTSTEP, PZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRIS, ZCIS, ZW2D) +IF (LCOLD .AND. LSEDI) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'I', 2, 4, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRIS, ZCIS, ZW2D) ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (LCOLD .AND. LSNOW) CALL LIMA_SEDIMENTATION('I', 1, 5, 1, PTSTEP, PZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRSS, ZW3D, PINPRS) +IF (LCOLD .AND. LSNOW) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'I', 1, 5, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRSS, ZW3D, PINPRS) ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (LCOLD .AND. LSNOW) CALL LIMA_SEDIMENTATION('I', 1, 6, 1, PTSTEP, PZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRGS, ZW3D, PINPRG) +IF (LCOLD .AND. LSNOW) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'I', 1, 6, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRGS, ZW3D, PINPRG) ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (LCOLD .AND. LHAIL) CALL LIMA_SEDIMENTATION('I', 1, 7, 1, PTSTEP, PZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRHS, ZW3D, PINPRH) +IF (LCOLD .AND. LHAIL) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'I', 1, 7, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRHS, ZW3D, PINPRH) ! ZTHS(:,:,:) = ZT(:,:,:) / ZEXN(:,:,:) * ZINV_TSTEP ! @@ -591,19 +622,21 @@ END IF IF (LWARM .AND. LDEPOC) THEN PINDEP(:,:)=0. GDEP(:,:) = .FALSE. - GDEP(:,:) = ZRCS(:,:,2) >0 .AND. ZCCS(:,:,2) >0 + GDEP(:,:) = ZRCS(:,:,IKB) >0 .AND. ZCCS(:,:,IKB) >0 WHERE (GDEP) - ZRCS(:,:,2) = ZRCS(:,:,2) - XVDEPOC * ZRCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) - ZCCS(:,:,2) = ZCCS(:,:,2) - XVDEPOC * ZCCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) - PINPRC(:,:) = PINPRC(:,:) + XVDEPOC * ZRCT(:,:,2) * PRHODREF(:,:,2) /XRHOLW - PINDEP(:,:) = XVDEPOC * ZRCT(:,:,2) * PRHODREF(:,:,2) /XRHOLW + ZRCS(:,:,IKB) = ZRCS(:,:,IKB) - XVDEPOC * ZRCT(:,:,IKB) / PDZZ(:,:,IKB) + ZCCS(:,:,IKB) = ZCCS(:,:,IKB) - XVDEPOC * ZCCT(:,:,IKB) / PDZZ(:,:,IKB) + PINPRC(:,:) = PINPRC(:,:) + XVDEPOC * ZRCT(:,:,IKB) * PRHODREF(:,:,IKB) /XRHOLW + PINDEP(:,:) = XVDEPOC * ZRCT(:,:,IKB) * PRHODREF(:,:,IKB) /XRHOLW END WHERE ! IF ( LBUDGET_RC ) CALL BUDGET (ZRCS(:,:,:)*PRHODJ(:,:,:),7 ,'DEPO_BU_RRC') IF ( LBUDGET_SV ) CALL BUDGET (ZCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'DEPO_BU_RSV') END IF ! -! +! +Z_RR_CVRC(:,:,:) = 0. +Z_CR_CVRC(:,:,:) = 0. IF (LWARM .AND. LRAIN) THEN CALL LIMA_DROPS_TO_DROPLETS_CONV(PRHODREF, ZRCS*PTSTEP, ZRRS*PTSTEP, ZCCS*PTSTEP, ZCRS*PTSTEP, & Z_RR_CVRC, Z_CR_CVRC) @@ -676,26 +709,6 @@ ZTHS(:,:,:) = ZTHT(:,:,:) *ZINV_TSTEP ZT(:,:,:) = ZTHT(:,:,:) * ZEXN(:,:,:) ! ! -!* 1. PREPARE COMPUTATIONS -! ----------------------- -! -! -KKA=1 -KKU=SIZE(PZZ,3) -KKL=1 -! -IIB=1+JPHEXT -IIE=SIZE(PZZ,1) - JPHEXT -IIT=SIZE(PZZ,1) -IJB=1+JPHEXT -IJE=SIZE(PZZ,2) - JPHEXT -IJT=SIZE(PZZ,2) -IKB=KKA+JPVEXT*KKL -IKE=KKU-JPVEXT*KKL -IKT=SIZE(PZZ,3) -IKTB=1+JPVEXT -IKTE=IKT-JPVEXT -! !------------------------------------------------------------------------------- ! !* 2. LOOP diff --git a/src/MNH/lima_adjust.f90 b/src/MNH/lima_adjust.f90 index 1135cc8ae..7d20f4f44 100644 --- a/src/MNH/lima_adjust.f90 +++ b/src/MNH/lima_adjust.f90 @@ -1109,7 +1109,8 @@ DEALLOCATE(ZCTMIN) !* 5.2 compute the cloud fraction PCLDFR (binary !!!!!!!) ! IF ( .NOT. OSUBG_COND ) THEN - WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) +! WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) + WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / ZDT) ZW(:,:,:) = 1. ELSEWHERE ZW(:,:,:) = 0. diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index fd2a2282a..884c98379 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -472,7 +472,7 @@ IF ( OCLOSE_OUT ) THEN TZFIELD%CMNHNAME ='NACT' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg-1' + TZFIELD%CUNITS = '/kg' TZFIELD%CDIR = 'XY' TZFIELD%CCOMMENT = 'X_Y_Z_NACT' TZFIELD%NGRID = 1 diff --git a/src/MNH/lima_sedimentation.f90 b/src/MNH/lima_sedimentation.f90 index b90de134a..ab0ebebca 100644 --- a/src/MNH/lima_sedimentation.f90 +++ b/src/MNH/lima_sedimentation.f90 @@ -7,15 +7,17 @@ ! ################################### ! INTERFACE - SUBROUTINE LIMA_SEDIMENTATION (HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, PZZ, PRHODREF, & + SUBROUTINE LIMA_SEDIMENTATION (KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, PDZZ, PRHODREF, & PPABST, PT, PRT_SUM, PCPT, PRS, PCS, PINPR ) ! +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL CHARACTER(1), INTENT(IN) :: HPHASE ! Liquid or solid hydrometeors INTEGER, INTENT(IN) :: KMOMENTS ! Number of moments INTEGER, INTENT(IN) :: KID ! Hydrometeor ID INTEGER, INTENT(IN) :: KSPLITG ! REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Height (z) REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PT ! Temperature @@ -31,7 +33,8 @@ END MODULE MODI_LIMA_SEDIMENTATION ! ! ! ###################################################################### - SUBROUTINE LIMA_SEDIMENTATION (HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, PZZ, PRHODREF, & + SUBROUTINE LIMA_SEDIMENTATION (KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, PDZZ, PRHODREF, & PPABST, PT, PRT_SUM, PCPT, PRS, PCS, PINPR ) ! ###################################################################### ! @@ -78,12 +81,13 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL CHARACTER(1), INTENT(IN) :: HPHASE ! Liquid or solid hydrometeors INTEGER, INTENT(IN) :: KMOMENTS ! Number of moments INTEGER, INTENT(IN) :: KID ! Hydrometeor ID INTEGER, INTENT(IN) :: KSPLITG ! REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Height (z) REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PT ! Temperature @@ -96,7 +100,6 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPR ! Instant precip rate !* 0.2 Declarations of local variables : ! INTEGER :: JK, JL, JN ! Loop index -INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain INTEGER :: ISEDIM ! Case number of sedimentation ! LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & @@ -127,15 +130,6 @@ REAL :: ZC ! Cpl or Cpi ! !------------------------------------------------------------------------------- ! -! Physical domain -! -IIB=1+JPHEXT -IIE=SIZE(PZZ,1) - JPHEXT -IJB=1+JPHEXT -IJE=SIZE(PZZ,2) - JPHEXT -IKB=1+JPVEXT -IKE=SIZE(PZZ,3) - JPVEXT -! ! Time splitting ! ZTSPLITG= PTSTEP / FLOAT(NSPLITSED(KID)) @@ -145,10 +139,9 @@ PINPR(:,:) = 0. ! PRS(:,:,:) = PRS(:,:,:) * PTSTEP IF (KMOMENTS==2) PCS(:,:,:) = PCS(:,:,:) * PTSTEP -DO JK = IKB , IKE - ZW(:,:,JK)=ZTSPLITG/(PZZ(:,:,JK+1)-PZZ(:,:,JK)) +DO JK = KKTB , KKTE + ZW(:,:,JK)=ZTSPLITG/PDZZ(:,:,JK) END DO -ZW(:,:,IKE+1) = ZW(:,:,IKE) ! IF (HPHASE=='L') ZC=XCL IF (HPHASE=='I') ZC=XCI @@ -160,7 +153,7 @@ IF (HPHASE=='I') ZC=XCI DO JN = 1 , NSPLITSED(KID) ! Computation only where enough ice, snow, graupel or hail GSEDIM(:,:,:) = .FALSE. - GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRS(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(KID) + GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = PRS(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(KID) IF (KMOMENTS==2) GSEDIM(:,:,:) = GSEDIM(:,:,:) .AND. PCS(:,:,:)>XCTMIN(KID) ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) ! @@ -200,23 +193,25 @@ DO JN = 1 , NSPLITSED(KID) END IF ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) - IF (KMOMENTS==2) ZWSEDC(:,:,:) = UNPACK( ZZX(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - IF (KMOMENTS==2) ZWSEDC(:,:,IKB:IKE) = MIN( ZWSEDC(:,:,IKB:IKE), PCS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + ZWSEDR(:,:,KKTB:KKTE) = MIN( ZWSEDR(:,:,KKTB:KKTE), PRS(:,:,KKTB:KKTE) * PRHODREF(:,:,KKTB:KKTE) / ZW(:,:,KKTB:KKTE) ) + IF (KMOMENTS==2) THEN + ZWSEDC(:,:,:) = UNPACK( ZZX(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,KKTB:KKTE) = MIN( ZWSEDC(:,:,KKTB:KKTE), PCS(:,:,KKTB:KKTE) * PRHODREF(:,:,KKTB:KKTE) / ZW(:,:,KKTB:KKTE) ) + END IF - DO JK = IKB , IKE + DO JK = KKTB , KKTE PRS(:,:,JK) = PRS(:,:,JK) + ZW(:,:,JK)* & - (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + (ZWSEDR(:,:,JK+KKL)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) IF (KMOMENTS==2) PCS(:,:,JK) = PCS(:,:,JK) + ZW(:,:,JK)* & - (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + (ZWSEDC(:,:,JK+KKL)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) ! Heat transport - PRT_SUM(:,:,JK-1) = PRT_SUM(:,:,JK-1) + ZW(:,:,JK-1)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-1) + PRT_SUM(:,:,JK-KKL) = PRT_SUM(:,:,JK-KKL) + ZW(:,:,JK-KKL)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-KKL) PRT_SUM(:,:,JK) = PRT_SUM(:,:,JK) - ZW(:,:,JK)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK) - PCPT(:,:,JK-1) = PCPT(:,:,JK-1) + ZC * (ZW(:,:,JK-1)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-1)) + PCPT(:,:,JK-KKL) = PCPT(:,:,JK-KKL) + ZC * (ZW(:,:,JK-KKL)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-KKL)) PCPT(:,:,JK) = PCPT(:,:,JK) - ZC * (ZW(:,:,JK)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK)) - ZWDT(:,:,JK) =(PRHODREF(:,:,JK+1)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK)*PT(:,:,JK) + & - ZW(:,:,JK)*ZWSEDR(:,:,JK+1)*ZC*PT(:,:,JK+1)) / & - (PRHODREF(:,:,JK+1)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK) + ZW(:,:,JK)*ZWSEDR(:,:,JK+1)*ZC) + ZWDT(:,:,JK) =(PRHODREF(:,:,JK+KKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK)*PT(:,:,JK) + & + ZW(:,:,JK)*ZWSEDR(:,:,JK+1)*ZC*PT(:,:,JK+KKL)) / & + (PRHODREF(:,:,JK+KKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK) + ZW(:,:,JK)*ZWSEDR(:,:,JK+KKL)*ZC) ZWDT(:,:,JK) = ZWDT(:,:,JK) - PT(:,:,JK) END DO DEALLOCATE(ZRHODREF) @@ -230,7 +225,7 @@ DO JN = 1 , NSPLITSED(KID) DEALLOCATE(ZZX) DEALLOCATE(ZZY) ! - PINPR(:,:) = PINPR(:,:) + ZWSEDR(:,:,IKB)/XRHOLW/NSPLITSED(KID) ! in m/s + PINPR(:,:) = PINPR(:,:) + ZWSEDR(:,:,KKB)/XRHOLW/NSPLITSED(KID) ! in m/s PT(:,:,:) = PT(:,:,:) + ZWDT(:,:,:) END IF diff --git a/src/MNH/lima_tendencies.f90 b/src/MNH/lima_tendencies.f90 index d9b5491ff..cb1cf7d00 100644 --- a/src/MNH/lima_tendencies.f90 +++ b/src/MNH/lima_tendencies.f90 @@ -487,7 +487,7 @@ IF (LCOLD .AND. LWARM) THEN PA_TH, PA_RC, PA_CC, PA_RI, PA_CI ) END IF ! -IF (LWARM) THEN +IF (LWARM .AND. LRAIN) THEN CALL LIMA_DROPLETS_SELF_COLLECTION (LDCOMPUTE, & PRHODREF, & PCCT, ZLBDC3, & diff --git a/src/MNH/lima_warm_coal.f90 b/src/MNH/lima_warm_coal.f90 index 28a624e6b..4623cd61e 100644 --- a/src/MNH/lima_warm_coal.f90 +++ b/src/MNH/lima_warm_coal.f90 @@ -242,6 +242,7 @@ IF( IMICRO >= 1 ) THEN ! !------------------------------------------------------------------------------- ! +IF (LRAIN) THEN ! !* 2. Self-collection of cloud droplets ! ------------------------------------ @@ -270,7 +271,6 @@ IF( IMICRO >= 1 ) THEN ! ---------------------------------------------------------------------- ! ! -IF (LRAIN) THEN ! ZZW2(:) = 0.0 ZZW1(:) = 0.0 @@ -472,7 +472,7 @@ ELSE ! ------------------------ ! ! - IF (LBUDGET_SV) CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'SELF_BU_RSV') + IF (LBUDGET_SV .AND. LRAIN) CALL BUDGET (PCCS(:,:,:)*PRHODJ(:,:,:),12+NSV_LIMA_NC,'SELF_BU_RSV') ! IF (LBUDGET_RC .AND. LRAIN) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'AUTO_BU_RRC') IF (LBUDGET_RR .AND. LRAIN) CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'AUTO_BU_RRR') diff --git a/src/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90 index 046ceeaea..66b235e48 100644 --- a/src/MNH/lima_warm_nucl.f90 +++ b/src/MNH/lima_warm_nucl.f90 @@ -540,7 +540,7 @@ IF ( OCLOSE_OUT ) THEN TZFIELD%CMNHNAME ='NACT' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg-1' + TZFIELD%CUNITS = '/kg' TZFIELD%CDIR = 'XY' TZFIELD%CCOMMENT = 'X_Y_Z_NACT' TZFIELD%NGRID = 1 diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 538189ea0..56df1c2a4 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -704,7 +704,7 @@ CALL TEST_NAM_VAR(ILUOUT,'CLBCY(2)',CLBCY(2),'CYCL','WALL','OPEN') CALL TEST_NAM_VAR(ILUOUT,'CTURBDIM',CTURBDIM,'1DIM','3DIM') CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN',CTURBLEN,'DELT','BL89','RM17','DEAR','BLKR') CALL TEST_NAM_VAR(ILUOUT,'CTOM',CTOM,'NONE','TM06') -CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV',CSUBG_AUCV,'NONE','CLFR','SIGM') +CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV',CSUBG_AUCV,'NONE','CLFR','SIGM','PDF') ! CALL TEST_NAM_VAR(ILUOUT,'CCH_TDISCRETIZATION',CCH_TDISCRETIZATION, & 'SPLIT ','CENTER ','LAGGED ') diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 1cd5eb370..20c640164 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -715,7 +715,7 @@ SELECT CASE ( HCLOUD ) 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) + WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,NSV_LIMA_NC) < 0.) PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & ZCPH(:,:,:) / ZEXN(:,:,:) @@ -1052,24 +1052,29 @@ SELECT CASE ( HCLOUD ) ! CASE ('LIMA') ! + DO JK=IKB,IKE + ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) + ENDDO + ZZZ = MZF(1,IKU,1, PZZ ) IF (LPTSPLIT) THEN - CALL LIMA (PTSTEP, TPFILE, OCLOSE_OUT, & - PRHODREF, PEXNREF, PZZ, & - PRHODJ, PPABSM, PPABST, & - NMOD_CCN, NMOD_IFN, NMOD_IMM, & - PTHM, PTHT, PRT, ZSVT, PW_ACT, & - PTHS, PRS, ZSVS, & - PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & - PEVAP3D ) + CALL LIMA (1, IKU, 1, & + PTSTEP, TPFILE, OCLOSE_OUT, & + PRHODREF, PEXNREF, ZDZZ, & + PRHODJ, PPABSM, PPABST, & + NMOD_CCN, NMOD_IFN, NMOD_IMM, & + PTHM, PTHT, PRT, ZSVT, PW_ACT, & + PTHS, PRS, ZSVS, & + PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & + PEVAP3D ) ELSE IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & - TPFILE, OCLOSE_OUT, KRR, PZZ, PRHODJ,& + TPFILE, OCLOSE_OUT, KRR, PZZ, PRHODJ, & PRHODREF, PEXNREF, PW_ACT, PPABSM, PPABST, & PTHM, PRCM, & PTHT, PRT, ZSVT, & PTHS, PRS, ZSVS, & - PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) + PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) ! IF (LCOLD) CALL LIMA_COLD(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & KRR, PZZ, PRHODJ, & @@ -1080,20 +1085,20 @@ SELECT CASE ( HCLOUD ) PINPRS, PINPRG, PINPRH) ! IF (OWARM .AND. LCOLD) CALL LIMA_MIXED(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PW_ACT, & - PTHM, PPABSM, & - PTHT, PRT, ZSVT, & - PTHS, PRS, ZSVS ) + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_ACT, & + PTHM, PPABSM, & + PTHT, PRT, ZSVT, & + PTHS, PRS, ZSVS ) ENDIF ! !* 12.2 Perform the saturation adjustment ! - CALL LIMA_ADJUST(KRR, KMI, TPFILE, HRAD, & - HTURBDIM, OCLOSE_OUT, OSUBG_COND, PTSTEP, & - PRHODREF, PRHODJ, PEXNREF, PPABST, PSIGS, PPABST, & - PRT, PRS, ZSVT, ZSVS, & - PTHS, PSRCS, PCLDFR ) + CALL LIMA_ADJUST(KRR, KMI, TPFILE, HRAD, & + HTURBDIM, OCLOSE_OUT, OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABST, PSIGS, PPABST, & + PRT, PRS, ZSVT, ZSVS, & + PTHS, PSRCS, PCLDFR ) ! END SELECT ! -- GitLab