From f0829b1a717101cf64ead847e179bfaf134066d7 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Tue, 31 Jan 2023 15:53:17 +0100 Subject: [PATCH] P.Tulet 31/01/2023: add aerosols scavenging with LIMA --- src/MNH/aer_effic.f90 | 176 +++--- src/MNH/aer_wet_dep_kmt_warm.f90 | 935 ++++++++++++++++++++----------- src/MNH/aeroopt_get.f90 | 68 ++- src/MNH/ch_aer_depos.f90 | 47 +- 4 files changed, 786 insertions(+), 440 deletions(-) diff --git a/src/MNH/aer_effic.f90 b/src/MNH/aer_effic.f90 index 27064451b..8c7b7af94 100644 --- a/src/MNH/aer_effic.f90 +++ b/src/MNH/aer_effic.f90 @@ -16,7 +16,8 @@ SUBROUTINE AER_EFFIC(PRG,PVGG, & !aerosol radius/fall speed (m/s) PRRS, & ! Rain water m.r. at time KMODE, & ! Number of aerosol modes PTEMP, PCOR, & ! air temp, cunningham corr factor - PDENSITY_AER ) ! aerosol density + PDENSITY_AER, & ! aerosol density + PRR, PNT ) ! radius and number of rain drops ! IMPLICIT NONE REAL, DIMENSION(:,:), INTENT(IN) :: PRG, PVGG @@ -27,6 +28,7 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PEFC REAL, DIMENSION(:), INTENT(IN) :: PRRS REAL, DIMENSION(:), INTENT(IN) :: PTEMP REAL, DIMENSION(:,:), INTENT(IN) :: PCOR +REAL, DIMENSION(:), INTENT(IN) :: PRR, PNT INTEGER, INTENT(IN) :: KMODE REAL, DIMENSION(:,:), INTENT(IN) :: PDENSITY_AER @@ -40,10 +42,11 @@ SUBROUTINE AER_EFFIC(PRG,PVGG, & !aerosol radius/fall speed (m/s) PRHODREF, & !Air density PMUW, PMU, & !mu water/air PDPG, PEFC, & !diffusivity, efficiency - PRRS, & ! Rain water m.r. at time t + PRRT, & ! Rain water m.r. at time t KMODE, & ! Number of aerosol modes PTEMP, PCOR, & ! air temp, cunningham corr factor - PDENSITY_AER ) ! aerosol density + PDENSITY_AER, & ! aerosol density + PRR, PNT ) ! radius and number of rain drops !! ####################################### !!**********AER_EFFIC********** !! PURPOSE @@ -71,19 +74,31 @@ SUBROUTINE AER_EFFIC(PRG,PVGG, & !aerosol radius/fall speed (m/s) !! K. Crahan Kaku / P. Tulet (CNRM/GMEI) !! !! MODIFICATIONS -!! ------------- -!! Philippe Wautelet 28/05/2018: corrected truncated integer division (1/12 -> 1./12.) +!! ------------- +!! T. Hoarau (LACy) 15/05/17 add LIMA +!! Philippe Wautelet 28/05/2018: corrected truncated integer division (1/12 -> 1./12.) +!! P. Tulet and C. Barthe (LAERO) 15/01/22 correction for lima !! !----------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE MODD_CST, ONLY : XPI, XRHOLW, XP00, XRD -USE MODD_PARAMETERS , ONLY : JPVEXT -USE MODD_REF, ONLY : XTHVREFZ +USE MODD_RAIN_ICE_PARAM, ONLY : YFSEDR => XFSEDR, YEXSEDR => XEXSEDR +!++cb++ +!++th++ +USE MODD_RAIN_ICE_DESCR, ONLY : YCCR => XCCR, YLBR => XLBR, YLBEXR => XLBEXR, & + YCEXVT => XCEXVT +USE MODD_PARAM_LIMA_WARM, ONLY : WCCR => XCCR, WLBR => XLBR, WLBEXR => XLBEXR, & + XFSEDRR, XFSEDRC +USE MODD_PARAM_LIMA, ONLY : WCEXVT => XCEXVT, WFSEDR => XFSEDR, WFSEDC=>XFSEDC, & + XRTMIN +!--cb-- +USE MODD_PARAM_n, ONLY: CCLOUD +!--th-- +USE MODD_CST, ONLY : XPI, XRHOLW, XP00, XRD +USE MODD_PARAMETERS , ONLY : JPVEXT +USE MODD_REF, ONLY : XTHVREFZ ! IMPLICIT NONE ! @@ -93,8 +108,9 @@ REAL, DIMENSION(:), INTENT(IN) :: PRHODREF REAL, DIMENSION(:,:), INTENT(IN) :: PDPG REAL, DIMENSION(:), INTENT(IN) :: PMU, PMUW REAL, DIMENSION(:,:), INTENT(INOUT) :: PEFC -REAL, DIMENSION(:), INTENT(IN) :: PRRS +REAL, DIMENSION(:), INTENT(IN) :: PRRT REAL, DIMENSION(:), INTENT(IN) :: PTEMP +REAL, DIMENSION(:), INTENT(IN) :: PRR, PNT REAL, DIMENSION(:,:), INTENT(IN) :: PCOR INTEGER, INTENT(IN) :: KMODE REAL, DIMENSION(:,:), INTENT(IN) :: PDENSITY_AER @@ -110,9 +126,7 @@ REAL, DIMENSION(SIZE(PRG,1)) :: ZOMG, ZREY !rain radius, m, and rain fall speed, m/s; aerosol radius (m), REAL, DIMENSION(SIZE(PRG,1)) :: ZRR, ZVR !lambda, number concentration according to marshall palmer, -REAL, DIMENSION(SIZE(PRG,1)) :: ZNT, ZLBDA -! Rain water m.r. source -REAL, DIMENSION(SIZE(PRG,1)) :: ZRRS +REAL, DIMENSION(SIZE(PRG,1)) :: ZNT, ZLBDA1 !RHO_dref*r_r, Rain LWC REAL, DIMENSION(SIZE(PRG,1)) :: RLWC ! schmidts number @@ -129,83 +143,115 @@ REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZT1, ZT2 REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZT3, ZT4 ! INTEGER :: JI,JK +!++th++ +REAL :: KLBEXR, KLBR, KCEXVT, KCCR, ZFSEDR, ZBR, ZDR, ZEXSEDR +!--th-- ! !----------------------------------------------------------------- -ZRRS(:)=PRRS(:) IKB = 1 + JPVEXT -ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) -ZRG(:,:)=PRG(:,:)*1.E-6 !change units to meters -! +ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) +ZRG(:,:) = PRG(:,:) * 1.E-6 !change units to meters +ZVR(:) = 0. + +SELECT CASE(CCLOUD) +CASE('ICE3') + KLBEXR = YLBEXR + KLBR = YLBR + KCEXVT = YCEXVT + KCCR = YCCR + ZFSEDR = YFSEDR + ZEXSEDR = YEXSEDR + !Fall Speed calculations !similar to rain_ice.f90, chapter 17.3.4, MESONH Handbook -! -ZVR (:)= XFSEDR * ZRRS(:)**(XEXSEDR-1) * & - PRHODREF(:)**(XEXSEDR-XCEXVT-1) -! Drop Radius calculation in m -!lbda = pi*No*rho(lwc)/(rho(dref)*rain rate) p.212 MESONH Handbook -! compute the slope parameter Lbda_r -ZLBDA(:) = XLBR*( PRHODREF(:)* ZRRS(:) )**XLBEXR -!Number concentration NT=No/lbda p. 415 Jacobson -ZNT (:) = XCCR/ZLBDA (:) -!rain lwc (kg/m3) = rain m.r.(kg/kg) * rho_air(kg/m3) -RLWC(:)=ZRRS(:)*PRHODREF(:) -!4/3 *pi *rł*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) -ZRR(:) = (RLWC(:)/(XRHOLW*ZNT(:)*4./3.*XPI))**(1./3.) -! + ZVR(:) = ZFSEDR * PRRT(:)**(ZEXSEDR-1) * & + PRHODREF(:)**(ZEXSEDR-KCEXVT) + +CASE('LIMA') + KLBEXR = WLBEXR + KLBR = WLBR + KCEXVT = WCEXVT + KCCR = WCCR + ZFSEDR = XFSEDRR + ZBR = 3.0 + ZDR = 0.8 + ZEXSEDR = (ZBR + ZDR + 1.0) / (ZBR + 1.0) + WHERE (PRRT(:) > XRTMIN(3) .AND. PNT(:) > 0.) + ZLBDA1(:) = (KLBR * PNT(:) / PRRT(:))**KLBEXR + ZVR(:) = XFSEDRR * PRHODREF(:)**(1.-KCEXVT) * ZLBDA1(:)**(-ZDR) + END WHERE +END SELECT + + !Fall speed cannot be faster than 7 m/s -ZVR (:)=MIN(ZVR (:),7.) +ZVR(:) = MIN(ZVR(:), 7.) + +KCCR = 8.E6 + !Ref SEINFELD AND PANDIS p.1019 ! Viscosity Ratio -ZOMG(:)=PMUW(:)/PMU(:) +ZOMG(:) = PMUW(:) / PMU(:) !!Reynolds number -ZREY(:)=ZRR(:)*ZVR(:)*PRHODREF(:)/PMU(:) -ZREY(:)= MAX(ZREY(:), 1E-2) - +ZREY(:) = PRR(:) * ZVR(:) * PRHODREF(:) / PMU(:) +ZREY(:) = MAX(ZREY(:), 1.E-2) +! !S Star -ZSTA(:)=(1.2+1./12.*LOG(1.+ZREY(:)))/(1.+LOG(1.+ZREY(:))) -PEFC(:,:)=0.0 -DO JI=1,KMODE +ZSTA(:) = (1.2 + 1./12. * LOG(1.+ZREY(:))) / (1. + LOG(1.+ZREY(:))) + +PEFC(:,:) = 0.0 ! +DO JI = 1, KMODE !Scmidts number - ZSCH(:,JI)=PMU(:)/PRHODREF(:)/PDPG(:,JI) + ZSCH(:,JI) = PMU(:) / PRHODREF(:) / PDPG(:,JI) +! ! Rain-Aerosol relative velocity - ZDIFF(:) = MAX(ZVR(:)-PVGG(:,JI),0.) + ZDIFF(:) = MAX(ZVR(:)-PVGG(:,JI), 0.) +! ! Relaxation time - ZTAU(:) = (ZRG(:,JI)*2.)**2. * PDENSITY_AER(:,JI) * PCOR(:,JI) / (18.*PMU(:)) + ZTAU(:) = (ZRG(:,JI)*2.)**2. * PDENSITY_AER(:,JI) * PCOR(:,JI) / (18. * PMU(:)) +! ! Stockes number - ZSTO(:,JI)= ZTAU(:) * ZDIFF(:) / ZRR(:) + ZSTO(:,JI) = ZTAU(:) * ZDIFF(:) / PRR(:) +! !Ratio of diameters - ZPHI(:,JI)=ZRG(:,JI)/ZRR(:) - ZPHI(:,JI)=MIN(ZPHI(:,JI), 1.) + ZPHI(:,JI) = ZRG(:,JI) / PRR(:) + ZPHI(:,JI) = MIN(ZPHI(:,JI), 1.) +! !Term 1 - ZT1(:,JI)=4.0/ZREY(:)/ZSCH(:,JI) + ZT1(:,JI) = 4.0 / ZREY(:) / ZSCH(:,JI) +! !Term 2 - ZT2(:,JI)=1.0+0.4*ZREY(:)**(0.5)*ZSCH(:,JI)**(1./3.)+ & - 0.16*ZREY(:)**(0.5)*ZSCH(:,JI)**(0.5) - + ZT2(:,JI) = 1.0 + 0.4 * ZREY(:)**(0.5) * ZSCH(:,JI)**(1./3.) + & + 0.16 * ZREY(:)**(0.5) * ZSCH(:,JI)**(0.5) +! !Brownian diffusion - ZT1(:,JI)= ZT1(:,JI)*ZT2(:,JI) + ZT1(:,JI) = ZT1(:,JI) * ZT2(:,JI) +! !Term 3 - interception - ZT3(:,JI)=4.*ZPHI(:,JI)*(1./ZOMG(:)+ & - (1.0+2.0*ZREY(:)**0.5)*ZPHI(:,JI)) - - ZT4(:,JI)=0.0 - WHERE(ZSTO(:,JI).GT.ZSTA(:)) + ZT3(:,JI) = 4. * ZPHI(:,JI) * (1. / ZOMG(:) + & + (1.0 + 2.0 * ZREY(:)**0.5) * ZPHI(:,JI)) +! + ZT4(:,JI) = 0.0 +! + WHERE(ZSTO(:,JI) .GT. ZSTA(:)) !Term 4 - impaction - ZT4(:,JI)=((ZSTO(:,JI)-ZSTA(:))/ & - (ZSTO(:,JI)-ZSTA(:)+2./3.))**(3./2.) & - *(XRHOLW/PDENSITY_AER(:,JI))**(1./2.) + ZT4(:,JI) = ((ZSTO(:,JI) - ZSTA(:)) / & + (ZSTO(:,JI) - ZSTA(:) + 2. / 3.))**(3./2.) * & + (XRHOLW / PDENSITY_AER(:,JI))**(1./2.) END WHERE +! !Collision Efficiancy - PEFC(:,JI)=ZT1(:,JI)+ ZT3(:,JI)+ZT4(:,JI) + PEFC(:,JI) = ZT1(:,JI) + ZT3(:,JI) + ZT4(:,JI) +! ! Physical radius of a rain collector droplet up than 20 um -WHERE (ZRR(:) .LE. 20.E-6) - PEFC(:,JI)= 0. -END WHERE + WHERE (PRR(:) .LE. 20.E-6) + PEFC(:,JI) = 0. + END WHERE ENDDO -PEFC(:,:)=MIN(PEFC(:,:),1.0) -PEFC(:,:)=MAX(PEFC(:,:),0.0) +! +PEFC(:,:) = MIN(PEFC(:,:), 1.0) +PEFC(:,:) = MAX(PEFC(:,:), 0.0) END SUBROUTINE AER_EFFIC diff --git a/src/MNH/aer_wet_dep_kmt_warm.f90 b/src/MNH/aer_wet_dep_kmt_warm.f90 index 8d80ec2e9..0b3ce1984 100644 --- a/src/MNH/aer_wet_dep_kmt_warm.f90 +++ b/src/MNH/aer_wet_dep_kmt_warm.f90 @@ -124,11 +124,31 @@ END MODULE MODI_AER_WET_DEP_KMT_WARM ! USE MODD_CST USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR +!++th++ 10/05/17 +USE MODD_RAIN_ICE_DESCR, ONLY : YRTMIN => XRTMIN, YCEXVT => XCEXVT, & + XCONC_LAND, XCONC_SEA, XCONC_URBAN, & + XNUC2, XALPHAC2, XNUC, XALPHAC, & + YLBC => XLBC, XLBEXC, & + XCCR, & + YLBR => XLBR, YLBEXR => XLBEXR +!--th-- USE MODD_PRECIP_n USE MODI_AER_VELGRAV USE MODI_AER_EFFIC USE MODI_GAMMA +!++th++ 10/05/17 +USE MODD_PARAM_LIMA, ONLY : XCTMIN, WRTMIN => XRTMIN, WCEXVT => XCEXVT +USE MODD_PARAM_LIMA_WARM, ONLY : WLBR => XLBR, WLBEXR => XLBEXR, & ! for + XFSEDRR, XDR, XBR, & ! sedim. + XAUTO1, XAUTO2, XCAUTR, XITAUTR, XLAUTR, & ! for + XLAUTR_THRESHOLD, XITAUTR_THRESHOLD, & ! autoconv. + WLBC => XLBC, & + XACCR1, XACCR2, XACCR3, XACCR4, XACCR5, & ! for + XACCR_RLARGE1, XACCR_RLARGE2, & ! accr. + XACCR_RSMALL1, XACCR_RSMALL2 +USE MODD_PARAM_n, ONLY: CCLOUD +!--th-- + ! IMPLICIT NONE ! @@ -179,8 +199,17 @@ INTEGER :: ICLOUD, IRAIN LOGICAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & :: GRAIN, GCLOUD ! Test where to compute all processes ! Test where to compute the SED/EVAP processes +!++cb++ 15/05/17 +!REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & +! :: ZW, ZZW1, ZZW2, ZZW4 ! work array REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & - :: ZW, ZZW1, ZZW2, ZZW4 ! work array + :: ZW, ZZW1, ZZW2, ZZW4, & ! work array + ZZW3, ZZW5 +REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & + :: ZDIM, & + ZLBDC3, ZLBDC, & + ZLBDR3, ZLBDR +!--cb-- REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & :: ZWEVAP ! sedimentation fluxes REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)+1) & @@ -196,12 +225,11 @@ REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) & ZFSEDC REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2)) :: ZCONC_TMP REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZCONC -REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZRRS ! REAL, DIMENSION(:,:), ALLOCATABLE :: ZSVT ! Tracer m.r. concentration ! REAL, DIMENSION(:,:), ALLOCATABLE :: ZVGG, ZDPG !aerosol velocity [m/s], diffusivity [m2/s] -REAL, DIMENSION(:,:), ALLOCATABLE :: ZRG !Dust R[ľm] +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRG !Dust R[\b5m] REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOR !Cunningham correction factor [unitless] REAL, DIMENSION(:,:), ALLOCATABLE :: ZMASSMIN ! Aerosol mass minimum value REAL, DIMENSION(:,:), ALLOCATABLE :: ZDENSITY_AER ! Aerosol density @@ -221,9 +249,9 @@ REAL, DIMENSION(:), ALLOCATABLE & ZFLUX, & ! Effective precipitation flux (kg.m-2.s-1) ZCONC1D, & ! Weighted droplets concentration ZWLBDC, & ! Slope parameter of the droplet distribution - ZGAMMA ! scavenging coefficient -REAL, DIMENSION(:), ALLOCATABLE :: ZW1 ! Work arrays -REAL, DIMENSION(SIZE(XRTMIN)) :: ZRTMIN + ZGAMMA, & ! scavenging coefficient + ZLBDA ! lambda parameter for lima distribution +REAL, DIMENSION(:), ALLOCATABLE :: ZW1 ! Work arrays INTEGER :: JL ! and PACK intrinsics ! @@ -231,40 +259,78 @@ INTEGER :: JKAQ, JSV ! REAL :: A0, A1, A2, A3 ! Constants for computing viscocity INTEGER :: IKE - +! +REAL, DIMENSION(:), ALLOCATABLE :: KRTMIN +REAL :: KCEXVT, KLBR, KLBEXR, KLBC, ZLBEXC +REAL, DIMENSION(2) :: ZXLBC +REAL :: ZEXSEDR, ZDR ! !------------------------------------------------------------------------------- ! !* 0. Initialize work array ! --------------------- ! +!++cb++ 15/05/17 gestion des parametres redondants entre lima et ice3 +! ATTENTION : pour le moment, les autres schemas microphysiques ne sont pas geres +! NOTE : les noms sont changes dans toute la routine X... --> K... +SELECT CASE(CCLOUD) +CASE('ICE3') + ALLOCATE(KRTMIN(SIZE(YRTMIN))) + KRTMIN(:) = YRTMIN(:) + KCEXVT = YCEXVT + KLBR = YLBR + KLBEXR = YLBEXR + ZXLBC(:) = YLBC(:) + ZLBEXC = XLBEXC +CASE('LIMA') + ALLOCATE(KRTMIN(SIZE(WRTMIN))) + KRTMIN = WRTMIN + KCEXVT = WCEXVT + KLBR = WLBR + KLBEXR = WLBEXR + KLBC = WLBC + ZLBEXC = 1.0 / 3.0 + ZDR = 0.8 +END SELECT +!--cb-- +! ! Compute Effective cloud radius -ZRAY(:,:,:) = 0. -ZLBC(:,:,:) = 0. -IF (PRESENT(PCCT)) THEN ! case KHKO, C2R2, C3R5 (two moments schemes) - ZRAY(:,:,:) = 3.* PRCT(:,:,:) / (4.*XPI*XRHOLW*PCCT(:,:,:)) - ZRAY(:,:,:) = ZRAY(:,:,:)**(1./3.) ! Cloud mean radius in m -ELSE IF (PRESENT(PSEA)) THEN ! Case ICE3, RAVE, KESS, .. -ZLBC(:,:,:) = XLBC(1) -ZFSEDC(:,:,:) = XFSEDC(1) -ZCONC(:,:,:) = XCONC_LAND -ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND -DO JK=1,SIZE(PRHODREF,3) - ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) - ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) - ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) - ZCONC(:,:,JK) = (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN - ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & - PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) -END DO -ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) -ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) +ZRAY(:,:,:) = 0. +ZLBC(:,:,:) = 0. +! +!++th++ 05/05/17 test thomas +IF (PRESENT(PCCT)) THEN ! case KHKO, C2R2, C3R5, LIMA (two moments schemes) +! + WHERE (PCCT(:,:,:) .GT. 0. .AND. PRCT(:,:,:) .GT. 0.) + ZRAY(:,:,:) = 3. * PRCT(:,:,:) / (4. * XPI * XRHOLW * PCCT(:,:,:)) + ZRAY(:,:,:) = ZRAY(:,:,:)**(1./3.) ! Cloud mean radius in m + ELSEWHERE + ZRAY(:,:,:) = 30. ! Cloud mean radius in m + ENDWHERE +!--th-- +! +ELSE IF (PRESENT(PSEA)) THEN ! Case ICE3, REVE, KESS, .. + ZLBC(:,:,:) = ZXLBC(1) + ZFSEDC(:,:,:) = XFSEDC(1) + ZCONC(:,:,:) = XCONC_LAND + ZCONC_TMP(:,:) = PSEA(:,:) * XCONC_SEA + (1. - PSEA(:,:)) * XCONC_LAND +! + DO JK = 1, SIZE(PRHODREF,3) + ZLBC(:,:,JK) = PSEA(:,:) * ZXLBC(2) + (1. - PSEA(:,:)) * ZXLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:) * XFSEDC(2) + (1. - PSEA(:,:)) * XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC(:,:,JK) = (1. - PTOWN(:,:)) * ZCONC_TMP(:,:) + PTOWN(:,:) * XCONC_URBAN + ZRAY(:,:,JK) = 0.5 * ((1. - PSEA(:,:)) * GAMMA(XNUC+1.0/XALPHAC) / (GAMMA(XNUC)) + & + PSEA(:,:) * GAMMA(XNUC2+1.0/XALPHAC2) / (GAMMA(XNUC2))) + END DO + ZRAY(:,:,:) = MAX(1., ZRAY(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(ZXLBC(1),ZXLBC(2)), ZLBC(:,:,:)) ELSE -ZRAY(:,:,:) = 30. ! default value for cloud radius + ZRAY(:,:,:) = 30. ! default value for cloud radius END IF ! -ZNRT(:,:,:) = 0. -IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5 +ZNRT(:,:,:) = 0. +IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA ! Transfert Number of rain droplets ZNRT(:,:,:) = PCRT(:,:,:) END IF @@ -272,7 +338,9 @@ END IF ! !* 1. COMPUTE THE AEROSOL/CLOUD-RAIN MASS TRANSFER ! ---------------------------------------------- +! CALL AER_WET_MASS_TRANSFER +! !------------------------------------------------------------------------------- ! !* 2. COMPUTE THE SEDIMENTATION (RS) SOURCE @@ -281,20 +349,22 @@ CALL AER_WET_MASS_TRANSFER CALL AER_WET_DEP_KMT_WARM_SEDIMENT ! !------------------------------------------------------------------------------- -!! -!!* 3. COMPUTES THE SLOW WARM PROCESS SOURCES -!! -------------------------------------- -!! +! +!* 3. COMPUTES THE SLOW WARM PROCESS SOURCES +! -------------------------------------- +! CALL AER_WET_DEP_KMT_ICE_WARM - ! !------------------------------------------------------------------------------- -!!* 4. COMPUTES EVAPORATION PROCESS -!! ---------------------------- -!! +!* 4. COMPUTES EVAPORATION PROCESS +! ---------------------------- +! CALL AER_WET_DEP_KMT_EVAP ! - +!++cb++ +DEALLOCATE(KRTMIN) +!--cb-- +! !------------------------------------------------------------------------------- ! ! @@ -324,208 +394,241 @@ INTEGER :: JKAQ ! counter for chemistry ! 1 Mass transfer Aerosol to cloud (Tost et al., 2006) ! GCLOUD(:,:,:) = .FALSE. -GCLOUD(:,:,:) = PRCS(:,:,:)>XRTMIN(2) +! +IF (PRESENT(PCCT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes) + GCLOUD(:,:,:) = PRCS(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2) +ELSE ! Case ICE3, REVE, KESS, ... (1-moment schemes) + GCLOUD(:,:,:) = PRCS(:,:,:) > KRTMIN(2) +END IF +!--cb-- +!--th-- + ICLOUD = COUNTJV( GCLOUD(:,:,:),I1C(:),I2C(:),I3C(:)) IF( ICLOUD >= 1 ) THEN -ALLOCATE(ZSVT(ICLOUD,KMODE*3)) -ALLOCATE(ZRHODREF(ICLOUD)) -ALLOCATE(ZTHT(ICLOUD)) -ALLOCATE(ZRC(ICLOUD)) -ALLOCATE(ZPABST(ICLOUD)) -ALLOCATE(ZRG(ICLOUD,KMODE)) -ALLOCATE(ZTEMP(ICLOUD)) -ALLOCATE(ZMU(ICLOUD)) -ALLOCATE(ZRCT(ICLOUD)) -ALLOCATE(ZVGG(ICLOUD,KMODE)) -ALLOCATE(ZDPG(ICLOUD,KMODE)) -ALLOCATE(ZGAMMA(ICLOUD)) -ALLOCATE(ZW1(ICLOUD)) -ALLOCATE(ZCOR(ICLOUD,KMODE)) -ALLOCATE(ZMASSMIN(ICLOUD,KMODE)) -ALLOCATE(ZWLBDC(ICLOUD)) -ALLOCATE(ZCONC1D(ICLOUD)) -ALLOCATE(ZDENSITY_AER(ICLOUD,KMODE)) -ZSVT(:,:) = 0. -DO JL=1,ICLOUD - DO JKAQ = 1, KMODE - ZRG(JL,JKAQ) = PRGAER(I1C(JL),I2C(JL),I3C(JL),JKAQ) - ENDDO - DO JKAQ = 1, KMODE*3 - ZSVT(JL,JKAQ) = PSVT(I1C(JL),I2C(JL),I3C(JL),JKAQ) - END DO + ALLOCATE(ZSVT(ICLOUD,KMODE*3)) + ALLOCATE(ZRHODREF(ICLOUD)) + ALLOCATE(ZTHT(ICLOUD)) + ALLOCATE(ZRC(ICLOUD)) + ALLOCATE(ZPABST(ICLOUD)) + ALLOCATE(ZRG(ICLOUD,KMODE)) + ALLOCATE(ZTEMP(ICLOUD)) + ALLOCATE(ZMU(ICLOUD)) + ALLOCATE(ZRCT(ICLOUD)) + ALLOCATE(ZVGG(ICLOUD,KMODE)) + ALLOCATE(ZDPG(ICLOUD,KMODE)) + ALLOCATE(ZGAMMA(ICLOUD)) + ALLOCATE(ZW1(ICLOUD)) + ALLOCATE(ZCOR(ICLOUD,KMODE)) + ALLOCATE(ZMASSMIN(ICLOUD,KMODE)) + ALLOCATE(ZWLBDC(ICLOUD)) + ALLOCATE(ZCONC1D(ICLOUD)) + ALLOCATE(ZDENSITY_AER(ICLOUD,KMODE)) +! + ZSVT(:,:) = 0. +! + DO JL = 1, ICLOUD + DO JKAQ = 1, KMODE + ZRG(JL,JKAQ) = PRGAER(I1C(JL),I2C(JL),I3C(JL),JKAQ) + ENDDO + DO JKAQ = 1, KMODE*3 + ZSVT(JL,JKAQ) = PSVT(I1C(JL),I2C(JL),I3C(JL),JKAQ) + END DO ! - ZTHT(JL) = PTHT(I1C(JL),I2C(JL),I3C(JL)) - ZRC(JL) = ZRAY(I1C(JL),I2C(JL),I3C(JL)) - ZPABST(JL) = PPABST(I1C(JL),I2C(JL),I3C(JL)) - ZRCT(JL) = PRCS(I1C(JL),I2C(JL),I3C(JL)) - ZRHODREF(JL) = PRHODREF(I1C(JL),I2C(JL),I3C(JL)) - ZMASSMIN(JL,:) = PMASSMIN(I1C(JL),I2C(JL),I3C(JL),:) - ZWLBDC(JL) = ZLBC(I1C(JL),I2C(JL),I3C(JL)) - ZCONC1D(JL) = ZCONC(I1C(JL),I2C(JL),I3C(JL)) - ZDENSITY_AER(JL,:) = PDENSITY_AER(I1C(JL),I2C(JL),I3C(JL),:) -END DO -IF (ANY(ZWLBDC(:)/=0.)) THEN ! case one moments + ZTHT(JL) = PTHT(I1C(JL),I2C(JL),I3C(JL)) + ZRC(JL) = ZRAY(I1C(JL),I2C(JL),I3C(JL)) + ZPABST(JL) = PPABST(I1C(JL),I2C(JL),I3C(JL)) + ZRCT(JL) = PRCS(I1C(JL),I2C(JL),I3C(JL)) + ZRHODREF(JL) = PRHODREF(I1C(JL),I2C(JL),I3C(JL)) + ZMASSMIN(JL,:) = PMASSMIN(I1C(JL),I2C(JL),I3C(JL),:) + ZWLBDC(JL) = ZLBC(I1C(JL),I2C(JL),I3C(JL)) + ZCONC1D(JL) = ZCONC(I1C(JL),I2C(JL),I3C(JL)) + ZDENSITY_AER(JL,:) = PDENSITY_AER(I1C(JL),I2C(JL),I3C(JL),:) + END DO +! + IF (ANY(ZWLBDC(:) /= 0.)) THEN ! case one moments ! On calcule Rc a partir de M(3) car c'est le seul moment indt de alpha et nu ! Rho_air * Rc / (Pi/6 * Rho_eau * Nc) = M(3) = 1/ (Lambda**3 * rapport des ! gamma) - ZWLBDC(:) = ZWLBDC(:) * ZCONC1D(:) / (ZRHODREF(:) * ZRCT(:)) - ZWLBDC(:) = ZWLBDC(:)**XLBEXC - ZRC(:) = ZRC(:) / ZWLBDC(:) -END IF - + ZWLBDC(:) = ZWLBDC(:) * ZCONC1D(:) / (ZRHODREF(:) * ZRCT(:)) + ZWLBDC(:) = ZWLBDC(:)**ZLBEXC + ZRC(:) = ZRC(:) / ZWLBDC(:) + END IF ! ! initialize temperature - ZTEMP(:)=ZTHT(:)*(ZPABST(:)/XP00)**(XRD/XCPD) - + ZTEMP(:) = ZTHT(:) * (ZPABST(:) / XP00)**(XRD/XCPD) +! ! compute diffusion and gravitation velocity + CALL AER_VELGRAV(ZRG(:,:), ZPABST(:), & + KMODE, ZMU(:), ZVGG(:,:), & + ZDPG(:,:),ZTEMP(:),ZCOR(:,:), & + ZDENSITY_AER(:,:)) - CALL AER_VELGRAV(ZRG(:,:), ZPABST(:), & - KMODE, ZMU(:), ZVGG(:,:), & - ZDPG(:,:),ZTEMP(:),ZCOR(:,:), & - ZDENSITY_AER(:,:)) - -DO JKAQ = 1, KMODE + DO JKAQ = 1, KMODE ! Browninan nucleation scavenging (Pruppacher and Klett, 2000, p723) - ZGAMMA(:) = 1.35 * ZRCT(:)*ZRHODREF(:)*1.E-3 * ZDPG(:,JKAQ) /& - (ZRC(:)*ZRC(:)) - - ZW1(:) = ZSVT(:,JKAQ) * EXP(-ZGAMMA(:) * PTSTEP) - ZW1(:) = MAX(ZW1(:), ZMASSMIN(:,JKAQ)) - ZW1(:) = MIN(ZW1(:),ZSVT(:,JKAQ)) + ZGAMMA(:) = 1.35 * ZRCT(:) * ZRHODREF(:) * 1.E-3 * ZDPG(:,JKAQ) / & + (ZRC(:) * ZRC(:)) +! + ZW1(:) = ZSVT(:,JKAQ) * EXP(-ZGAMMA(:) * PTSTEP) + ZW1(:) = MAX(ZW1(:), ZMASSMIN(:,JKAQ)) +! ZW1(:) = MIN(ZW1(:), ZSVT(:,JKAQ)) ! Aerosol mass in cloud - ZSVT(:,KMODE+JKAQ) = ZSVT(:,KMODE+JKAQ) + ZSVT(:,JKAQ) - ZW1(:) + ZSVT(:,KMODE+JKAQ) = ZSVT(:,KMODE+JKAQ) + ZSVT(:,JKAQ) - ZW1(:) ! New aerosol mass - ZSVT(:,JKAQ) = ZW1(:) + ZSVT(:,JKAQ) = ZW1(:) ! Return in 3D - PSVT(:,:,:,JKAQ) = & - UNPACK(ZSVT(:,JKAQ),MASK=GCLOUD(:,:,:),FIELD=PSVT(:,:,:,JKAQ)) - PSVT(:,:,:,KMODE+JKAQ) = & - UNPACK(ZSVT(:,KMODE+JKAQ),MASK=GCLOUD(:,:,:),FIELD=PSVT(:,:,:,KMODE+JKAQ)) -ENDDO -DEALLOCATE(ZSVT) -DEALLOCATE(ZRHODREF) -DEALLOCATE(ZTHT) -DEALLOCATE(ZRC) -DEALLOCATE(ZPABST) -DEALLOCATE(ZRG) -DEALLOCATE(ZTEMP) -DEALLOCATE(ZMU) -DEALLOCATE(ZRCT) -DEALLOCATE(ZVGG) -DEALLOCATE(ZDPG) -DEALLOCATE(ZGAMMA) -DEALLOCATE(ZW1) -DEALLOCATE(ZCOR) -DEALLOCATE(ZMASSMIN) -DEALLOCATE(ZWLBDC) -DEALLOCATE(ZCONC1D) -DEALLOCATE(ZDENSITY_AER) + PSVT(:,:,:,JKAQ) = & + UNPACK(ZSVT(:,JKAQ),MASK=GCLOUD(:,:,:),FIELD=PSVT(:,:,:,JKAQ)) + PSVT(:,:,:,KMODE+JKAQ) = & + UNPACK(ZSVT(:,KMODE+JKAQ),MASK=GCLOUD(:,:,:),FIELD=PSVT(:,:,:,KMODE+JKAQ)) + ENDDO +! + DEALLOCATE(ZSVT) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZTHT) + DEALLOCATE(ZRC) + DEALLOCATE(ZPABST) + DEALLOCATE(ZRG) + DEALLOCATE(ZTEMP) + DEALLOCATE(ZMU) + DEALLOCATE(ZRCT) + DEALLOCATE(ZVGG) + DEALLOCATE(ZDPG) + DEALLOCATE(ZGAMMA) + DEALLOCATE(ZW1) + DEALLOCATE(ZCOR) + DEALLOCATE(ZMASSMIN) + DEALLOCATE(ZWLBDC) + DEALLOCATE(ZCONC1D) + DEALLOCATE(ZDENSITY_AER) END IF ! ! 2 Mass transfer Aerosol to Rain (Seinfeld and Pandis, 1998, Tost et al., 2006) ! GRAIN(:,:,:) = .FALSE. -GRAIN(:,:,:) = PRRS(:,:,:)>XRTMIN(3) +! +IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes) + GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) +ELSE ! Case ICE3, REVE, KESS, ... (1-moment schemes) + GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) +END IF + IRAIN = COUNTJV( GRAIN(:,:,:),I1R(:),I2R(:),I3R(:)) IF( IRAIN >= 1 ) THEN ! - ALLOCATE(ZRRT(IRAIN)) - ALLOCATE(ZSVT(IRAIN,3*KMODE)) - ALLOCATE(ZRHODREF(IRAIN)) - ALLOCATE(ZTHT(IRAIN)) - ALLOCATE(ZRR(IRAIN)) - ALLOCATE(ZNT(IRAIN)) - ALLOCATE(ZPABST(IRAIN)) - ALLOCATE(ZRG(IRAIN,KMODE)) - ALLOCATE(ZCOR(IRAIN,KMODE)) - ALLOCATE(ZTEMP(IRAIN)) - ALLOCATE(ZMU(IRAIN)) - ALLOCATE(ZVGG(IRAIN,KMODE)) - ALLOCATE(ZDPG(IRAIN,KMODE)) - ALLOCATE(ZMUW(IRAIN)) - ALLOCATE(ZEFC(IRAIN,KMODE)) - ALLOCATE(ZW1(IRAIN)) - ALLOCATE(ZFLUX(IRAIN)) - ALLOCATE(ZGAMMA(IRAIN)) - ALLOCATE(ZMASSMIN(IRAIN,KMODE)) - ALLOCATE(ZDENSITY_AER(IRAIN,KMODE)) - - ZSVT(:,:) = 0. - DO JL=1,IRAIN - DO JKAQ = 1, KMODE - ZRG(JL,JKAQ) = PRGAER(I1R(JL),I2R(JL),I3R(JL),JKAQ ) - ZSVT(JL,JKAQ) = PSVT(I1R(JL),I2R(JL),I3R(JL),JKAQ) - ZSVT(JL,KMODE*2+JKAQ) = PSVT(I1R(JL),I2R(JL),I3R(JL),KMODE*2+JKAQ) - END DO - ! - ZTHT(JL) = PTHT(I1R(JL),I2R(JL),I3R(JL)) - ZPABST(JL) = PPABST(I1R(JL),I2R(JL),I3R(JL)) - ZRRT(JL) = PRRS(I1R(JL),I2R(JL),I3R(JL)) - ZRHODREF(JL) = PRHODREF(I1R(JL),I2R(JL),I3R(JL)) - ZMASSMIN(JL,:) = PMASSMIN(I1R(JL),I2R(JL),I3R(JL),:) - ZNT(JL) = ZNRT(I1R(JL),I2R(JL),I3R(JL)) - ZDENSITY_AER(JL,:) = PDENSITY_AER(I1R(JL),I2R(JL),I3R(JL),:) - ENDDO -! -CALL AER_WET_DEP_KMT_EFFIC + ALLOCATE(ZRRT(IRAIN)) + ALLOCATE(ZSVT(IRAIN,3*KMODE)) + ALLOCATE(ZRHODREF(IRAIN)) + ALLOCATE(ZTHT(IRAIN)) + ALLOCATE(ZRR(IRAIN)) + ALLOCATE(ZNT(IRAIN)) + ALLOCATE(ZPABST(IRAIN)) + ALLOCATE(ZRG(IRAIN,KMODE)) + ALLOCATE(ZCOR(IRAIN,KMODE)) + ALLOCATE(ZTEMP(IRAIN)) + ALLOCATE(ZMU(IRAIN)) + ALLOCATE(ZVGG(IRAIN,KMODE)) + ALLOCATE(ZDPG(IRAIN,KMODE)) + ALLOCATE(ZMUW(IRAIN)) + ALLOCATE(ZEFC(IRAIN,KMODE)) + ALLOCATE(ZW1(IRAIN)) + ALLOCATE(ZFLUX(IRAIN)) + ALLOCATE(ZGAMMA(IRAIN)) + ALLOCATE(ZMASSMIN(IRAIN,KMODE)) + ALLOCATE(ZDENSITY_AER(IRAIN,KMODE)) + ALLOCATE(ZLBDA(IRAIN)) +! + ZSVT(:,:) = 0. +! + DO JL = 1, IRAIN + DO JKAQ = 1, KMODE + ZRG(JL,JKAQ) = PRGAER(I1R(JL),I2R(JL),I3R(JL),JKAQ ) + ZSVT(JL,JKAQ) = PSVT(I1R(JL),I2R(JL),I3R(JL),JKAQ) + ZSVT(JL,KMODE*2+JKAQ) = PSVT(I1R(JL),I2R(JL),I3R(JL),KMODE*2+JKAQ) + END DO +! + ZTHT(JL) = PTHT(I1R(JL),I2R(JL),I3R(JL)) + ZPABST(JL) = PPABST(I1R(JL),I2R(JL),I3R(JL)) + ZRRT(JL) = PRRT(I1R(JL),I2R(JL),I3R(JL)) + ZRHODREF(JL) = PRHODREF(I1R(JL),I2R(JL),I3R(JL)) + ZMASSMIN(JL,:) = PMASSMIN(I1R(JL),I2R(JL),I3R(JL),:) + ZNT(JL) = ZNRT(I1R(JL),I2R(JL),I3R(JL)) + ZDENSITY_AER(JL,:) = PDENSITY_AER(I1R(JL),I2R(JL),I3R(JL),:) + ENDDO ! Compute scavenging coefficient -ZFLUX(:) = 0. -ZRRT(:) = MAX(ZRRT(:), 0.) + ZFLUX(:) = 0. + ZRRT(:) = MAX(ZRRT(:), 0.) +! ! Effective precipitation flux (kg.m-2.s-1) -ZFLUX(:) = XFSEDR * ZRRT(:)**(XEXSEDR ) & - * ZRHODREF(:)**(XEXSEDR-XCEXVT) -ZFLUX(:) = MAX(ZFLUX(:), 0.) - -IF (ALL(ZNT(:) == 0.)) THEN ! case one moments -!Number concentration NT=No/lbda p. 415 Jacobson -!4/3 *pi *rł*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) -ZNT (:) = XCCR/(XLBR*( ZRHODREF(:)* ZRRT(:) )**XLBEXR) -END IF + IF (PRESENT(PCRT)) THEN ! cf lima_precip_scavenging.f90 (l. 751) + ZEXSEDR = (XBR + XDR + 1.0) / (XBR + 1.0) -ZRR(:) = (ZRRT(:)*ZRHODREF(:)/(XRHOLW*ZNT(:)*4./3.*XPI))**(1./3.) + ZLBDA(:) = (KLBR * ZNT(:) / ZRRT(:))**KLBEXR + ZFLUX(:) = XFSEDRR * ZRRT(:) * ZRHODREF(:)**(1.-KCEXVT) * ZLBDA(:)**(-ZDR) -DO JKAQ = 1, KMODE - ! Tost et al, 2006 - ZGAMMA(:) = 0.75 * ZEFC(:,JKAQ) * ZFLUX(:) / (ZRR(:)*1E3) - ZW1(:) = ZSVT(:,JKAQ) * EXP(-ZGAMMA(:) * PTSTEP) - ZW1(:) = MAX(ZW1(:), ZMASSMIN(:,JKAQ)) - ZW1(:) = MIN(ZW1(:),ZSVT(:,JKAQ)) - - ! Aerosol mass in rain - ZSVT(:,KMODE*2+JKAQ) = ZSVT(:,KMODE*2+JKAQ) + ZSVT(:,JKAQ) - ZW1(:) - ! New aerosol mass - ZSVT(:,JKAQ) = ZW1(:) - - ! Return to 3D - PSVT(:,:,:,JKAQ) = & - UNPACK(ZSVT(:,JKAQ),MASK=GRAIN(:,:,:),FIELD=PSVT(:,:,:,JKAQ)) - PSVT(:,:,:,KMODE*2+JKAQ) = & - UNPACK(ZSVT(:,KMODE*2+JKAQ),MASK=GRAIN(:,:,:),FIELD=PSVT(:,:,:,KMODE*2+JKAQ)) -ENDDO - DEALLOCATE(ZRRT) - DEALLOCATE(ZSVT) - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZTHT) - DEALLOCATE(ZRR) - DEALLOCATE(ZNT) - DEALLOCATE(ZPABST) - DEALLOCATE(ZRG) - DEALLOCATE(ZCOR) - DEALLOCATE(ZTEMP) - DEALLOCATE(ZMU) - DEALLOCATE(ZVGG) - DEALLOCATE(ZDPG) - DEALLOCATE(ZMUW) - DEALLOCATE(ZEFC) - DEALLOCATE(ZW1) - DEALLOCATE(ZFLUX) - DEALLOCATE(ZGAMMA) - DEALLOCATE(ZMASSMIN) - DEALLOCATE(ZDENSITY_AER) - END IF + ELSE ! cf ZWSED dans rain_ice.f90 (l. 1077) + ZFLUX(:) = XFSEDR * ZRRT(:)**(XEXSEDR) * ZRHODREF(:)**(XEXSEDR-KCEXVT) + END IF + ZFLUX(:) = MAX(ZFLUX(:), 0.) + + IF (ALL(ZNT(:) == 0.)) THEN ! case one moments +! Number concentration NT=No/lbda p. 415 Jacobson +! 4/3 *pi *r\b3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg) + ZNT(:) = XCCR / (KLBR * (ZRHODREF(:) * ZRRT(:))**KLBEXR) + END IF +! + ZRR(:) = (ZRRT(:) * ZRHODREF(:) / & + (XRHOLW * ZNT(:) * 4. / 3. * XPI))**(1./3.) + + CALL AER_WET_DEP_KMT_EFFIC + + DO JKAQ = 1, KMODE + ! Tost et al, 2006 + ZGAMMA(:) = 0.75 * ZEFC(:,JKAQ) * ZFLUX(:) / (ZRR(:) * 1.E3) + + ZW1(:) = ZSVT(:,JKAQ) * EXP(-ZGAMMA(:)*PTSTEP) + ZW1(:) = MAX(ZW1(:), ZMASSMIN(:,JKAQ)) + + ! Aerosol mass in rain + ZSVT(:,KMODE*2+JKAQ) = ZSVT(:,KMODE*2+JKAQ) + ZSVT(:,JKAQ) - ZW1(:) + + ! New aerosol mass + ZSVT(:,JKAQ) = ZW1(:) + + ! Return to 3D + PSVT(:,:,:,JKAQ) = & + UNPACK(ZSVT(:,JKAQ),MASK=GRAIN(:,:,:),FIELD=PSVT(:,:,:,JKAQ)) + PSVT(:,:,:,KMODE*2+JKAQ) = & + UNPACK(ZSVT(:,KMODE*2+JKAQ),MASK=GRAIN(:,:,:),FIELD=PSVT(:,:,:,KMODE*2+JKAQ)) + ENDDO +! + DEALLOCATE(ZRRT) + DEALLOCATE(ZSVT) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZTHT) + DEALLOCATE(ZRR) + DEALLOCATE(ZNT) + DEALLOCATE(ZPABST) + DEALLOCATE(ZRG) + DEALLOCATE(ZCOR) + DEALLOCATE(ZTEMP) + DEALLOCATE(ZMU) + DEALLOCATE(ZVGG) + DEALLOCATE(ZDPG) + DEALLOCATE(ZMUW) + DEALLOCATE(ZEFC) + DEALLOCATE(ZW1) + DEALLOCATE(ZFLUX) + DEALLOCATE(ZGAMMA) + DEALLOCATE(ZMASSMIN) + DEALLOCATE(ZDENSITY_AER) + DEALLOCATE(ZLBDA) +END IF +! END SUBROUTINE AER_WET_MASS_TRANSFER ! +!------------------------------------------------------------------------------- +! SUBROUTINE AER_WET_DEP_KMT_WARM_SEDIMENT ! !* Sedimentation of aerosol in rain droplets @@ -533,52 +636,150 @@ SUBROUTINE AER_WET_DEP_KMT_WARM_SEDIMENT !* 0. DECLARATIONS ! ------------ ! +use mode_tools, only: Countjv +! IMPLICIT NONE ! !* declaration of local variables ! -! -INTEGER :: JL ! and PACK intrinsics -INTEGER :: JKAQ ! counter for acquous aerosols +INTEGER :: JL ! and PACK intrinsics +INTEGER :: JKAQ ! counter for acquous aerosols +INTEGER :: IRAIN, ILISTLENR +INTEGER :: ILENALLOCR +INTEGER, SAVE :: IOLDALLOCR = 6000 +INTEGER, DIMENSION(SIZE(PZZ)) :: IR1,IR2,IR3 ! Used to replace the COUNT +INTEGER, DIMENSION(:), ALLOCATABLE :: ILISTR +REAL, DIMENSION(:), ALLOCATABLE :: ZLAMBDA, ZRHODREF, ZCRT, ZRRT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSVT ! !------------------------------------------------------------------------------- ! !* Time splitting initialization +! ZTSPLITR = PTSTEP / REAL(KSPLITR) ! ZW(:,:,:)=0. -ZRRS(:,:,:) = MAX(PRRS(:,:,:), 0.) -IKE = SIZE(PRCS,3) +ZWSED(:,:,:) = 0. +IKE = SIZE(PRCT,3) +ILENALLOCR = 0 DO JK = 1 , SIZE(PZZ,3)-1 - ZW(:,:,JK) =ZTSPLITR/(( PZZ(:,:,JK+1)-PZZ(:,:,JK) )) + ZW(:,:,JK) = ZTSPLITR / ((PZZ(:,:,JK+1) - PZZ(:,:,JK))) END DO -WHERE (ZRRS(:,:,:)<=XRTMIN(3)) - ZW(:,:,:)=0. -END WHERE -! -ZWSED(:,:,IKE+1) = 0. +IF (PRESENT(PCRT)) THEN !two moments + WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3)) + ZW(:,:,:) = 0. + END WHERE +ELSE ! one moment + WHERE (PRRT(:,:,:) <= KRTMIN(3)) + ZW(:,:,:) = 0. + END WHERE +END IF + +GRAIN(:,:,:) = .FALSE. + +IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes) + GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) +ELSE ! Case ICE3, REVE, KESS, ... (1-moment schemes) + GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) +END IF + +IRAIN = COUNTJV( GRAIN(:,:,:),IR1(:),IR2(:),IR3(:)) + +IF( IRAIN >= 1 ) THEN +DO JN = 1 , KSPLITR + IF( JN==1 ) THEN + DO JKAQ = 1,KMODE + DO JK = 1, IKE + PSVT(:,:,JK,KMODE*2+JKAQ) = PSVT(:,:,JK,KMODE*2+JKAQ) / FLOAT(KSPLITR) + END DO + END DO + END IF + IF ( IRAIN .GT. ILENALLOCR ) THEN + IF ( ILENALLOCR .GT. 0 ) THEN + DEALLOCATE (ILISTR,ZSVT,ZRHODREF,ZCRT,ZRRT,ZLAMBDA) + END IF + ILENALLOCR = MAX (IOLDALLOCR, 2*IRAIN ) + IOLDALLOCR = ILENALLOCR + ALLOCATE(ILISTR(ILENALLOCR), ZRHODREF(ILENALLOCR), ZSVT(ILENALLOCR,3*KMODE),& + ZCRT(ILENALLOCR), ZRRT(ILENALLOCR), ZLAMBDA(ILENALLOCR)) + END IF + + DO JL = 1, IRAIN + DO JKAQ = 1, KMODE + ZSVT(JL,KMODE*2+JKAQ) = PSVT(IR1(JL),IR2(JL),IR3(JL),KMODE*2+JKAQ) + END DO +! + IF (PRESENT(PCRT)) ZCRT(JL) = PCRT(IR1(JL),IR2(JL),IR2(JL)) + ZRRT(JL) = PRRT(IR1(JL),IR2(JL),IR3(JL)) + ZRHODREF(JL) = PRHODREF(IR1(JL),IR2(JL),IR3(JL)) + ENDDO + + ILISTLENR = 0 + DO JL=1,IRAIN + IF (PRESENT(PCRT)) THEN !two moments + IF (ZRRT(JL) > KRTMIN(3) .AND. ZCRT(JL) > XCTMIN(3)) THEN + ILISTLENR = ILISTLENR + 1 + ILISTR(ILISTLENR) = JL + END IF + ELSE ! one moment + IF (ZRRT(JL) > KRTMIN(3)) THEN + ILISTLENR = ILISTLENR + 1 + ILISTR(ILISTLENR) = JL + END IF + END IF + END DO + +! ! Flux mass aerosol in rain droplets = ! Flux mass rain water * Mass aerosol in rain / Mass rain water -DO JKAQ = 1,KMODE + DO JKAQ = 1,KMODE + DO JJ = 1, ILISTLENR + JL = ILISTR(JJ) + IF (PRESENT(PCRT)) THEN !two moments + IF (ZRRT(JL) > KRTMIN(3) .AND. ZCRT(JL) > XCTMIN(3)) THEN + ZLAMBDA(JL) = (KLBR * ZCRT(JL) / ZRRT(JL))**KLBEXR - DO JN = 1 , KSPLITR - ZWSED(:,:,1:IKE) = XFSEDR & - * (ZRRS(:,:,:))**(XEXSEDR-1.) & - * PRHODREF(:,:,:)**(XEXSEDR-XCEXVT) & - * PSVT(:,:,:,KMODE*2+JKAQ) - DO JK = 1, IKE - PSVT(:,:,JK,KMODE*2+JKAQ)= PSVT(:,:,JK,KMODE*2+JKAQ) + & - ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) - ! Aerosol mass in rain droplets need to be positive - PSVT(:,:,JK,KMODE*2+JKAQ)= MAX(PSVT(:,:,JK,KMODE*2+JKAQ), 0.) - END DO - END DO + ZWSED(IR1(JL),IR2(JL),IR3(JL)) = XFSEDRR * ZRHODREF(JL)**(1.-KCEXVT) & + * ZLAMBDA(JL)**(-ZDR) & + * ZSVT(JL,KMODE*2+JKAQ) + END IF + ELSE ! one moments +! cf rain_ice.f90 : l. 1077 (zwsed * psvt(kmode+2+jkaq) / zrrs) + IF (ZRRT(JL) > KRTMIN(3)) THEN + + ZWSED(IR1(JL),IR2(JL),IR3(JL)) = XFSEDR & + * ZRRT(JL)**(XEXSEDR-1.) & + * ZRHODREF(JL)**(XEXSEDR-KCEXVT) & + * ZSVT(JL,KMODE*2+JKAQ) + END IF + END IF ! moments + END DO ! JJ + + DO JK = 1, IKE + PSVT(:,:,JK,KMODE*2+JKAQ) = PSVT(:,:,JK,KMODE*2+JKAQ) + & + ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) + END DO + END DO ! JKAQ + +END DO ! JN - time splitting + + DO JKAQ = 1,KMODE +! Aerosol mass in rain droplets need to be positive + PSVT(:,:,:,KMODE*2+JKAQ) = MAX(PSVT(:,:,:,KMODE*2+JKAQ), 0.) + END DO ! KKAQ +END IF !(IRAIN) +! +IF (ALLOCATED(ILISTR)) DEALLOCATE(ILISTR) +IF (ALLOCATED(ZSVT)) DEALLOCATE(ZSVT) +IF (ALLOCATED(ZRHODREF)) DEALLOCATE(ZRHODREF) +IF (ALLOCATED(ZCRT)) DEALLOCATE(ZCRT) +IF (ALLOCATED(ZRRT)) DEALLOCATE(ZRRT) +IF (ALLOCATED(ZLAMBDA)) DEALLOCATE(ZLAMBDA) -END DO ! - END SUBROUTINE AER_WET_DEP_KMT_WARM_SEDIMENT +END SUBROUTINE AER_WET_DEP_KMT_WARM_SEDIMENT ! !------------------------------------------------------------------------------- ! @@ -587,127 +788,206 @@ END DO !* 0. DECLARATIONS ! IMPLICIT NONE +! !------------------------------------------------------------------------------- ! !* 1. compute the autoconversion of r_c for r_r production: RCAUTR ! -ZZW4(:,:,:)=0.0 +ZZW4(:,:,:) = 0.0 ! to be sure no division by zero in case of ZZRCT = 0. ZZRCT(:,:,:) = PRCT(:,:,:) -ZZRCT(:,:,:) = MAX(ZZRCT(:,:,:), XRTMIN(2)/2.) - -WHERE( (ZZRCT(:,:,:)>XRTMIN(2)) .AND. (PRCS(:,:,:)>0.0 ) ) - ZZW4(:,:,:) = MIN( PRCS(:,:,:),XTIMAUTC* & - MAX((ZZRCT(:,:,:)-XCRIAUTC/ PRHODREF(:,:,:)),0.0)) -END WHERE +ZZRCT(:,:,:) = MAX(ZZRCT(:,:,:), KRTMIN(2)/2.) +! +IF (PRESENT(PCRT)) THEN ! 2-moment schemes +! +! from lima_warm_coal.f90 (AUTO) + ZLBDC3(:,:,:) = 1.E45 + ZLBDC(:,:,:) = 1.E15 + WHERE (ZZRCT(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2)) + ZLBDC3(:,:,:) = KLBC * PCCT(:,:,:) / PRCT(:,:,:) + ZLBDC(:,:,:) = ZLBDC3(:,:,:)**ZLBEXC + END WHERE +! + ZZW3(:,:,:) = 0. + WHERE (ZZRCT(:,:,:) > KRTMIN(2)) + ZZW3(:,:,:) = MAX(0.0, XLAUTR*PRHODREF(:,:,:)*ZZRCT(:,:,:)* & + (XAUTO1/ZLBDC3(:,:,:)**4-XLAUTR_THRESHOLD)) ! L + ZZW4(:,:,:) = MIN(PRCS(:,:,:), MAX(0.0, XITAUTR*ZZW3(:,:,:)*ZZRCT(:,:,:)* & + (XAUTO2/ZLBDC3(:,:,:)-XITAUTR_THRESHOLD))) ! L/tau + END WHERE +! +ELSE ! 1-moment scheme +! + WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRCS(:,:,:) > 0.0)) + ZZW4(:,:,:) = MIN(PRCS(:,:,:), XTIMAUTC* & + MAX((ZZRCT(:,:,:)-XCRIAUTC/PRHODREF(:,:,:)), 0.0)) + END WHERE +! +END IF +!--cb-- DO JKAQ = 1,KMODE - ZZW2(:,:,:) =0.0 - ZZW2(:,:,:)=ZZW4(:,:,:) * PSVT(:,:,:,KMODE+JKAQ)/ZZRCT(:,:,:) * PTSTEP - ZZW2(:,:,:) = MAX(MIN( ZZW2(:,:,:), PSVT(:,:,:,KMODE+JKAQ)),0.0) + ZZW2(:,:,:) = 0.0 + ZZW2(:,:,:) = ZZW4(:,:,:) * PSVT(:,:,:,KMODE+JKAQ) / ZZRCT(:,:,:) * PTSTEP + ZZW2(:,:,:) = MAX(MIN(ZZW2(:,:,:), PSVT(:,:,:,KMODE+JKAQ)), 0.0) ! For rain - Increase the aerosol conc in rain - PSVT(:,:,:,KMODE*2+JKAQ) = & - PSVT(:,:,:,KMODE*2+JKAQ) + ZZW2(:,:,:) + PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) + ZZW2(:,:,:) ! For Cloud Decrease the aerosol conc in cloud - PSVT(:,:,:,KMODE+JKAQ) = & - PSVT(:,:,:,KMODE+JKAQ) - ZZW2(:,:,:) + PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW2(:,:,:) ENDDO - - +! ! !* 2. compute the accretion of r_c for r_r production: RCACCR ! -ZZW4(:,:,:)=0.0 -ZLBDAR(:,:,:)=0.0 -WHERE ( (ZZRCT(:,:,:)>XRTMIN(2)) .AND. (PRRT(:,:,:)>XRTMIN(3)) & - .AND. (PRCS(:,:,:)> 0.0 ) ) - ZLBDAR(:,:,:) = XLBR*( PRHODREF(:,:,:)* PRRT(:,:,:) )**XLBEXR - ZZW4(:,:,:) = MIN( PRCS(:,:,:),XFCACCR * ZZRCT(:,:,:) & - * ZLBDAR(:,:,:)**XEXCACCR & - * PRHODREF(:,:,:)**(-XCEXVT) ) -END WHERE -! -DO JKAQ = 1,KMODE - ZZW2(:,:,:)=0.0 - ZZW2(:,:,:)=ZZW4(:,:,:) * PSVT(:,:,:,KMODE+JKAQ)/ZZRCT(:,:,:) * PTSTEP - ZZW2(:,:,:) = MAX(MIN(ZZW2(:,:,:),PSVT(:,:,:,KMODE+JKAQ)), 0.0) +ZZW4(:,:,:) = 0.0 +ZZW5(:,:,:) = 0. +ZDIM(:,:,:) = 0. +ZLBDAR(:,:,:)=0. -!* 3. compute the new acquous aerosol mass +! +IF (PRESENT(PCRT)) THEN ! 2-moment schemes +! +! from lima_warm_coal.f90 (ACCR) + ZLBDR3(:,:,:) = 1.E30 + ZLBDR(:,:,:) = 1.E10 + WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3)) + ZLBDAR(:,:,:) = KLBR * (PRHODREF(:,:,:) * PRRT(:,:,:))**KLBEXR + ZLBDR3(:,:,:) = KLBR * PCRT(:,:,:) / PRRT(:,:,:) + ZLBDR(:,:,:) = ZLBDR3(:,:,:)**KLBEXR + ZZW4(:,:,:) = MIN(PRCS(:,:,:), XFCACCR * ZZRCT(:,:,:) & + * ZLBDAR(:,:,:)**XEXCACCR & + * PRHODREF(:,:,:)**(-KCEXVT) ) + ZDIM(:,:,:) = XACCR1 / ZLBDAR(:,:,:) + END WHERE +! +! Accretion for D > 100 10-6 m + WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) .AND. & + ZZRCT(:,:,:) > KRTMIN(2) .AND. ZZW4(:,:,:) > 1.E-4 .AND. & + (PRRT(:,:,:) > 1.2*ZZW3(:,:,:)/PRHODREF(:,:,:) .OR. & + ZDIM(:,:,:) >= MAX(XACCR2,XACCR3/(XACCR4/ZLBDC(:,:,:)-XACCR5)))) + ZZW5(:,:,:) = ZLBDC3(:,:,:) / ZLBDR3(:,:,:) + ZZW1(:,:,:) = (PCCT(:,:,:) * PCRT(:,:,:) / ZLBDC3(:,:,:)**2) * PRHODREF(:,:,:) + ZZW4(:,:,:) = MIN(ZZW1(:,:,:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW5(:,:,:)), & + PRCS(:,:,:)) + END WHERE +! Accretion for D < 100 10-6 m + WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3) .AND. & + ZZRCT(:,:,:) > KRTMIN(2) .AND. ZZW4(:,:,:) <= 1.E-4 .AND. & + (PRRT(:,:,:) > (1.2*ZZW2(:,:,:)/PRHODREF(:,:,:)) .OR. & + ZDIM(:,:,:) >= MAX(XACCR2,XACCR3/(XACCR4/ZLBDC(:,:,:)-XACCR5)))) + ZZW5(:,:,:) = (ZLBDC3(:,:,:) / ZLBDR3(:,:,:))**2 + ZZW1(:,:,:) = (PCCT(:,:,:) * PCRT(:,:,:) / ZLBDC3(:,:,:)**3) * PRHODREF(:,:,:) + ZZW4(:,:,:) = MIN(ZZW1(:,:,:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW5(:,:,:)), & + PRCS(:,:,:)) + END WHERE +! +ELSE ! 1-moment schemes +! + ZLBDR(:,:,:) = 0.0 + WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRRT(:,:,:) > KRTMIN(3)) & + .AND. (PRCS(:,:,:) > 0.0)) + ZLBDR(:,:,:) = KLBR * (PRHODREF(:,:,:) * PRRT(:,:,:))**KLBEXR + ZZW4(:,:,:) = MIN(PRCS(:,:,:), XFCACCR * ZZRCT(:,:,:) & + * ZLBDR(:,:,:)**XEXCACCR & + * PRHODREF(:,:,:)**(-KCEXVT) ) + END WHERE +END IF +!--cb-- +! +DO JKAQ = 1, KMODE + ZZW2(:,:,:) = 0.0 + ZZW2(:,:,:) = ZZW4(:,:,:) * PSVT(:,:,:,KMODE+JKAQ) / ZZRCT(:,:,:) * PTSTEP + ZZW2(:,:,:) = MAX(MIN(ZZW2(:,:,:), PSVT(:,:,:,KMODE+JKAQ)), 0.0) +! +! +!* 3. compute the new acqueous aerosol mass ! ! For rain - Increase the aerosol conc in rain - PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) + ZZW2(:,:,:) + PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) + ZZW2(:,:,:) ! For Cloud Decrease the aerosol conc in cloud - PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW2(:,:,:) + PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW2(:,:,:) ENDDO - - END SUBROUTINE AER_WET_DEP_KMT_ICE_WARM +! +END SUBROUTINE AER_WET_DEP_KMT_ICE_WARM +! !--------------------------------------------------------------------------------------- +! SUBROUTINE AER_WET_DEP_KMT_EVAP ! !* COMPUTES THE EVAPORATION OF CLOUD-RAIN FOR THE !* RE-RELEASE OF AER INTO THE ENVIRONMENT ! -------------------------------------- ! - ! !* 0. DECLARATIONS ! ------------ ! IMPLICIT NONE +! !* declaration of local variables ! INTEGER :: JKAQ ! counter for aerosols - +! +!------------------------------------------------------------------------------- +! !* 1. compute the evaporation of r_r: RREVAV - +! !When partial reevaporation of precip takes place, the fraction of !tracer precipitating form above is reevaporated is equal to !half of the evaporation rate of water ! ! Rain water evaporated during PTSTEP in kg/kg ZZEVAP(:,:,:) = PEVAP3D(:,:,:) * PTSTEP +! ! Fraction of rain water evaporated ! at this stage (bulk), we consider that the flux of evaporated aerosol ! is a ratio of the evaporated rain water. ! It will interested to calculate with a two moment scheme (C2R2 or C3R5) ! the complete evaporation of rain droplet to use it for the compuation ! of the evaporated aerosol flux. -ZWEVAP(:,:,:)=0.0 -WHERE( PRRT(:,:,:) .GT. XRTMIN(3) ) - ZWEVAP(:,:,:) = ZZEVAP(:,:,:)/(PRRT(:,:,:)) +ZWEVAP(:,:,:) = 0.0 +WHERE(PRRT(:,:,:) .GT. KRTMIN(3)) + ZWEVAP(:,:,:) = ZZEVAP(:,:,:) / (PRRT(:,:,:)) END WHERE -ZWEVAP(:,:,:)=MIN(ZWEVAP(:,:,:),1.0) -ZWEVAP(:,:,:)=MAX(ZWEVAP(:,:,:),0.0) - +ZWEVAP(:,:,:) = MIN(ZWEVAP(:,:,:), 1.0) +ZWEVAP(:,:,:) = MAX(ZWEVAP(:,:,:), 0.0) +! +! !* 2. compute the mask of r_c evaporation : all cloud is evaporated ! no partial cloud evaporation at this stage +! ZMASK(:,:,:) = 0. -WHERE( PRCS(:,:,:) .LT. XRTMIN(2) ) - ZMASK(:,:,:) = 1. +WHERE(PRCS(:,:,:) .LT. KRTMIN(2)) + ZMASK(:,:,:) = 1. END WHERE ! +DO JKAQ = 1, KMODE + ZZW1(:,:,:) = ZMASK(:,:,:) * PSVT(:,:,:,KMODE+JKAQ) + ZZW2(:,:,:) = ZWEVAP(:,:,:) * PSVT(:,:,:,KMODE*2+JKAQ) +! + ZZW1(:,:,:) = MIN(ZZW1(:,:,:),PSVT(:,:,:,KMODE+JKAQ)) + ZZW2(:,:,:) = MIN(ZZW2(:,:,:),PSVT(:,:,:,KMODE*2+JKAQ)) ! -DO JKAQ = 1,KMODE - ZZW1(:,:,:) = ZMASK(:,:,:)*PSVT(:,:,:,KMODE+JKAQ) - - ZZW2(:,:,:) = ZWEVAP(:,:,:)*PSVT(:,:,:,KMODE*2+JKAQ) - ! 3. New dry aerosol mass ! - PSVT(:,:,:,JKAQ) = PSVT(:,:,:,JKAQ) + ZZW2(:,:,:) + ZZW1(:,:,:) + PSVT(:,:,:,JKAQ) = PSVT(:,:,:,JKAQ) + ZZW2(:,:,:) + ZZW1(:,:,:) +! +! ! 4. New cloud aerosol mass ! - PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW1(:,:,:) - + PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW1(:,:,:) +! +! ! 5. New rain aerosol mass ! - PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) - ZZW2(:,:,:) + PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) - ZZW2(:,:,:) END DO ! +END SUBROUTINE AER_WET_DEP_KMT_EVAP ! - END SUBROUTINE AER_WET_DEP_KMT_EVAP !--------------------------------------------------------------------------------------- +! SUBROUTINE AER_WET_DEP_KMT_EFFIC ! !* COMPUTES THE EFFICIENCY FACTOR @@ -719,6 +999,7 @@ END DO ! IMPLICIT NONE ! +!------------------------------------------------------------------------------- ! !* 1. COMPUTES THE EFFICIENCY FACTOR ! -------------------------------------- @@ -726,48 +1007,46 @@ IMPLICIT NONE !* 1.1 compute gravitational velocities ! !initialize - ZTEMP(:)=ZTHT(:)*(ZPABST(:)/XP00)**(XRD/XCPD) - ZTEMP(:)=MAX(ZTEMP(:),1.e-12) - - CALL AER_VELGRAV(ZRG(:,:), ZPABST(:), KMODE, & - ZMU(:), ZVGG(:,:), & - ZDPG(:,:),ZTEMP(:), & - ZCOR(:,:), ZDENSITY_AER(:,:)) +ZTEMP(:) = ZTHT(:) * (ZPABST(:) / XP00)**(XRD/XCPD) +ZTEMP(:) = MAX(ZTEMP(:), 1.e-12) +! +CALL AER_VELGRAV(ZRG(:,:), ZPABST(:), KMODE, & + ZMU(:), ZVGG(:,:), & + ZDPG(:,:),ZTEMP(:), & + ZCOR(:,:), ZDENSITY_AER(:,:)) -! Above gives mu (ZMU), v(aerosol)(PVGG, m/s), diffusion (ZDPG, m2/s) +! Above gives mu (ZMU), v(aerosol)(PVGG, m/s), diffusion (ZDPG, m2/s) ! !* 1.2 Compute Water Viscocity in kg/m/s Prup. & Klett, p.95 ! -! - A0=1.76 - A1=-5.5721e-2 - A2=-1.3943e-3 - A3=-4.3015e-5 - ZMUW(:)=A0*EXP(A1*(ZTEMP(:)-273.15) & - +A2*(ZTEMP(:)-273.15) + A3*(ZTEMP(:)-273.15))*1.e-3 - - A1=-3.5254e-2 - A2=4.7163e-4 - A3=-6.0667e-6 - - WHERE (ZTEMP(:)>273.15) - ZMUW(:)=A0*EXP(A1*(ZTEMP(:)-273.15) & - +A2*(ZTEMP(:)-273.15) + A3*(ZTEMP(:)-273.15))*1.e-3 - END WHERE - ZMUW(:)=MAX(ZMUW(:),1.e-12) - +A0 = 1.76 +A1 = -5.5721e-2 +A2 = -1.3943e-3 +A3 = -4.3015e-5 +ZMUW(:) = A0 * EXP(A1*(ZTEMP(:)-273.15) & + + A2*(ZTEMP(:)-273.15) + A3*(ZTEMP(:)-273.15)) * 1.e-3 +! +A1 = -3.5254e-2 +A2 = 4.7163e-4 +A3 = -6.0667e-6 +WHERE (ZTEMP(:) > 273.15) + ZMUW(:) = A0 * EXP(A1*(ZTEMP(:)-273.15) & + + A2*(ZTEMP(:)-273.15) + A3*(ZTEMP(:)-273.15)) * 1.e-3 +END WHERE +ZMUW(:) = MAX(ZMUW(:), 1.e-12) ! !* 1.3 compute efficiency factor ! ! This gives aerosol collection efficiency by calculating Reynolds number ! schmidt number, stokes number, etc - CALL AER_EFFIC(ZRG(:,:), ZVGG(:,:), & !aerosol radius/velocity - ZRHODREF(:), & !Air density - ZMUW(:), ZMU(:), & !mu water/air - ZDPG(:,:), ZEFC(:,:), & !diffusivity, efficiency - ZRRT(:), KMODE, & !Rain water, nb aerosols modes - ZTEMP(:),ZCOR(:,:), & ! Temperature, Cunnimgham coeff - ZDENSITY_AER(:,:)) ! aerosol density +CALL AER_EFFIC(ZRG(:,:), ZVGG(:,:), & !aerosol radius/velocity + ZRHODREF(:), & !Air density + ZMUW(:), ZMU(:), & !mu water/air + ZDPG(:,:), ZEFC(:,:), & !diffusivity, efficiency + ZRRT(:), KMODE, & !Rain water, nb aerosols modes + ZTEMP(:),ZCOR(:,:), & ! Temperature, Cunnimgham coeff + ZDENSITY_AER(:,:), & ! aerosol density + ZRR, ZNT ) ! radius and number of rain drops ! END SUBROUTINE AER_WET_DEP_KMT_EFFIC ! diff --git a/src/MNH/aeroopt_get.f90 b/src/MNH/aeroopt_get.f90 index 485e87b68..d8ec58193 100644 --- a/src/MNH/aeroopt_get.f90 +++ b/src/MNH/aeroopt_get.f90 @@ -96,10 +96,10 @@ !LOCAL VARIABLES INTEGER :: NMODE_AER REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3),SIZE(PSVTA,4)) :: ZSVT - REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3),16 ,2) :: ZMASS ![kg/m3] mass of aerosol mode - REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3) ,2) :: ZMASSeq ![kg/m3] mass of aerosol mode - REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3), 2) :: ZRADIUS ![um] number median radius ofaerosol mode - REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3), 2) :: ZSIGMA ![-] dispersion coefficientaerosol mode + REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3),NSP+NCARB+NSOA ,JPMODE) :: ZMASS ![kg/m3] mass of aerosol mode + REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3) , JPMODE) :: ZMASSeq ![kg/m3] mass of aerosol mode + REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3), JPMODE) :: ZRADIUS ![um] number median radius ofaerosol mode + REAL, DIMENSION(SIZE(PSVTA,1),SIZE(PSVTA,2),SIZE(PSVTA,3), JPMODE) :: ZSIGMA ![-] dispersion coefficientaerosol mode REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: ZTAU550_MDE ![-] opt.depth 550nm one mode REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ZTAU_WVL_MDE ![-] opt.depth @ wvl, one mode REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ZPIZA_WVL_MDE ![-] single scattering albedo @ wvl, one mode @@ -133,13 +133,13 @@ COMPLEX, DIMENSION(size(ZMASS,1),size(ZMASS,2),size(ZMASS,3),6)::Req ! Equivalent refractive index REAL, PARAMETER :: EPSILON=1.d-8 ![um] a small number used to avoid zero - INTEGER ::JJJ + INTEGER ::JJJ, JI, JSV !------------------------------------------------------------------------- !------------------------------------------------------------------------- !------------------------------------------------------------------------- ! - NMODE_AER=2 +NMODE_AER=JPMODE ! in case of ORILAM !Allocate arrays which size depend on number of modes @@ -148,6 +148,7 @@ ALLOCATE(ZPIZA_WVL_MDE(SIZE(PTAU550,1),SIZE(PTAU550,2),SIZE(PTAU550,3),KSWB,NMODE_AER)) ALLOCATE(ZCGA_WVL_MDE(SIZE(PTAU550,1),SIZE(PTAU550,2),SIZE(PTAU550,3),KSWB,NMODE_AER)) ZSVT(:,:,:,:)=PSVTA(:,:,:,:) + CALL PPP2AERO( & ZSVT & !I [moments/molec_{air}] moments of aerosol for all modes ,PRHODREFA & !I [kg/m3] air density @@ -157,8 +158,8 @@ ) - ZMASS(:,:,:,:,:)=ZMASS(:,:,:,:,:)*1.E-9 - + ZMASS(:,:,:,:,:)=MAX(ZMASS(:,:,:,:,:)*1.E-9, 1E-20) + DO JMDE=1,NMODE_AER Ri(1,1)=CMPLX(1.80,-7.40E-1,kind=kind(Ri(1,1))) @@ -207,30 +208,35 @@ ! Computation of the refractive index for the whole aerosol mode according to ! Maxwell-Garnett mixing rule ! IF (LDUST) THEN -! VDDST(:,:,:)=(ZMASS(:,:,:,JP_AER_DST,JMDE))/XFAC(JP_AER_DST) ! ELSE - VDDST(:,:,:)=0. +! VDDST(:,:,:)=0. ! ENDIF - VOC(:,:,:)=(ZMASS(:,:,:,5,JMDE))/XFAC(5) - VH2O(:,:,:)=(ZMASS(:,:,:,4,JMDE))/XFAC(4) - VAM(:,:,:)=(ZMASS(:,:,:,3,JMDE))/XFAC(3) - VSU(:,:,:)=(ZMASS(:,:,:,1,JMDE))/XFAC(1) - VNI(:,:,:)=(ZMASS(:,:,:,2,JMDE))/XFAC(2) - VBC(:,:,:)=(ZMASS(:,:,:,6,JMDE))/XFAC(6) - VSOA1(:,:,:)=(ZMASS(:,:,:,7,JMDE))/XFAC(7) - VSOA2(:,:,:)=(ZMASS(:,:,:,8,JMDE))/XFAC(8) - VSOA3(:,:,:)=(ZMASS(:,:,:,9,JMDE))/XFAC(9) - VSOA4(:,:,:)=(ZMASS(:,:,:,10,JMDE))/XFAC(10) - VSOA5(:,:,:)=(ZMASS(:,:,:,11,JMDE))/XFAC(11) - VSOA6(:,:,:)=(ZMASS(:,:,:,12,JMDE))/XFAC(12) - VSOA7(:,:,:)=(ZMASS(:,:,:,13,JMDE))/XFAC(13) - VSOA8(:,:,:)=(ZMASS(:,:,:,14,JMDE))/XFAC(14) - VSOA9(:,:,:)=(ZMASS(:,:,:,15,JMDE))/XFAC(15) - VSOA10(:,:,:)=(ZMASS(:,:,:,16,JMDE))/XFAC(16) + + VOC(:,:,:)=(ZMASS(:,:,:,JP_AER_OC,JMDE))/XFAC(JP_AER_OC) + VH2O(:,:,:)=(ZMASS(:,:,:,JP_AER_H2O,JMDE))/XFAC(JP_AER_H2O) + VAM(:,:,:)=(ZMASS(:,:,:,JP_AER_NH3,JMDE))/XFAC(JP_AER_NH3) + VSU(:,:,:)=(ZMASS(:,:,:,JP_AER_SO4,JMDE))/XFAC(JP_AER_SO4) + VNI(:,:,:)=(ZMASS(:,:,:,JP_AER_NO3,JMDE))/XFAC(JP_AER_NO3) + VBC(:,:,:)=(ZMASS(:,:,:,JP_AER_BC,JMDE))/XFAC(JP_AER_BC) + VDDST(:,:,:)=(ZMASS(:,:,:,JP_AER_DST,JMDE))/XFAC(JP_AER_DST) + IF (NSOA .EQ. 10) THEN + VSOA1(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA1,JMDE))/XFAC(JP_AER_SOA1) + VSOA2(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA2,JMDE))/XFAC(JP_AER_SOA2) + VSOA3(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA3,JMDE))/XFAC(JP_AER_SOA3) + VSOA4(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA4,JMDE))/XFAC(JP_AER_SOA4) + VSOA5(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA5,JMDE))/XFAC(JP_AER_SOA5) + VSOA6(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA6,JMDE))/XFAC(JP_AER_SOA6) + VSOA7(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA7,JMDE))/XFAC(JP_AER_SOA7) + VSOA8(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA8,JMDE))/XFAC(JP_AER_SOA8) + VSOA9(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA9,JMDE))/XFAC(JP_AER_SOA9) + VSOA10(:,:,:)=(ZMASS(:,:,:,JP_AER_SOA10,JMDE))/XFAC(JP_AER_SOA10) VSOA(:,:,:)=VSOA1(:,:,:)+VSOA2(:,:,:)+VSOA3(:,:,:)+VSOA4(:,:,:)+& VSOA5(:,:,:)+VSOA6(:,:,:)+VSOA7(:,:,:)+VSOA8(:,:,:)+& VSOA9(:,:,:)+VSOA10(:,:,:) + ELSE + VSOA(:,:,:)=0. + END IF VEXTR(:,:,:)=VSOA(:,:,:)+VH2O(:,:,:)+VAM(:,:,:)+VSU(:,:,:)+VNI(:,:,:) @@ -251,11 +257,11 @@ ENDWHERE ENDDO - ZMASSeq(:,:,:,JMDE)=ZMASS(:,:,:,1,JMDE)+ZMASS(:,:,:,2,JMDE)+ZMASS(:,:,:,3,JMDE)& - +ZMASS(:,:,:,4,JMDE)+ZMASS(:,:,:,5,JMDE)+ZMASS(:,:,:,6,JMDE)+ZMASS(:,:,:,7,JMDE)& - +ZMASS(:,:,:,8,JMDE)+ZMASS(:,:,:,9,JMDE)+ZMASS(:,:,:,10,JMDE)+ZMASS(:,:,:,11,JMDE)& - +ZMASS(:,:,:,12,JMDE)+ZMASS(:,:,:,13,JMDE)+ZMASS(:,:,:,14,JMDE)+ZMASS(:,:,:,15,JMDE)& - +ZMASS(:,:,:,16,JMDE) + ZMASSeq(:,:,:,JMDE)=0. + DO JSV=1,NSP+NCARB+NSOA + ZMASSeq(:,:,:,JMDE)=ZMASSeq(:,:,:,JMDE)+ ZMASS(:,:,:,JSV,JMDE) + END DO + PII(:,:,:,:) = aimag(CMPLX(Req(:,:,:,:),kind=kind(PII(1,1,1,1)))) PIR(:,:,:,:) = real( CMPLX(Req(:,:,:,:),kind=kind(PIR(1,1,1,1)))) !Get aerosol optical properties from look up tables diff --git a/src/MNH/ch_aer_depos.f90 b/src/MNH/ch_aer_depos.f90 index 0e29a73db..cf5659aa3 100644 --- a/src/MNH/ch_aer_depos.f90 +++ b/src/MNH/ch_aer_depos.f90 @@ -63,7 +63,7 @@ USE MODE_AERO_PSD USE MODD_CST, ONLY: XMD, &! Molar mass of dry air XPI USE MODD_NSV, ONLY : NSV_C2R2BEG, NSV_AERBEG,NSV_AEREND,NSV_AER, & - NSV_AERDEP, NSV_AERDEPBEG + NSV_AERDEP, NSV_AERDEPBEG, NSV_LIMA_NC, NSV_LIMA_NR USE MODD_PARAM_n, ONLY: CCLOUD USE MODI_AER_WET_DEP_KMT_WARM @@ -156,7 +156,7 @@ DO JN=1,JPMODE*2 ENDDO DO JN=1,JPMODE - ZSVAER(:,:,:,JN) = ZPM(:,:,:,JN*3-1) * XMD * XPI * & + ZSVAER(:,:,:,JN) = ZPM(:,:,:,NM3(JN)) * XMD * XPI * & 4./3. * ZRHOP(:,:,:,JN) / & (ZMI(:,:,:,JN)*1.d15*PRHODREF(:,:,:)) ENDDO @@ -180,6 +180,15 @@ SELECT CASE (CCLOUD) PSEA=ZSEA, PTOWN=ZTOWN, & PCCT=PSVT(:,:,:,NSV_C2R2BEG+1), & PCRT=PSVT(:,:,:,NSV_C2R2BEG+2) ) + CASE ('LIMA') +! Two moment cloud scheme + CALL AER_WET_DEP_KMT_WARM (NSPLITR, PTSTEP, PZZ, PRHODREF, & + PRT(:,:,:,2), PRT(:,:,:,3), ZRCS, & + ZRRS, ZSVAER, PTHT, PPABST, ZRG, & + PEVAP3D, JPMODE,ZRHOP, ZMASSMIN, & + PSEA=ZSEA, PTOWN=ZTOWN, & + PCCT=PSVT(:,:,:,NSV_LIMA_NC), & + PCRT=PSVT(:,:,:,NSV_LIMA_NR) ) END SELECT @@ -190,32 +199,38 @@ ENDDO DO JN=1,JPMODE ! Return from dry mass on m3 - ZPM(:,:,:,JN*3-1) = ZSVAER(:,:,:,JN) * & + ! Compute m0 and m6 using m3, Rg and sigma + + !ZPM(:,:,:,JN*3-1) = ZSVAER(:,:,:,JN) * & + ZPM(:,:,:,NM3(JN)) = ZSVAER(:,:,:,JN) * & ZMI(:,:,:,JN)*1.d15*PRHODREF(:,:,:) / & (XMD * XPI * 4./3. * ZRHOP(:,:,:,JN) ) - - ! Compute m0 and m6 using m3, Rg and sigma - ZPM(:,:,:,JN*3-2) = ZPM(:,:,:,JN*3-1)/ & + !ZPM(:,:,:,JN*3-2) = ZPM(:,:,:,JN*3-1)/ & + ZPM(:,:,:,NM0(JN)) = ZPM(:,:,:,NM3(JN)) / & ( (ZRG(:,:,:,JN)**3)*EXP(4.5 * LOG(ZSIG(:,:,:,JN))**2) ) - ZPM(:,:,:,JN*3) = ZPM(:,:,:,JN*3-2)*(ZRG(:,:,:,JN)**6) * & + !ZPM(:,:,:,JN*3) = ZPM(:,:,:,JN*3-2)*(ZRG(:,:,:,JN)**6) * & + ZPM(:,:,:,NM6(JN)) = ZPM(:,:,:,NM0(JN))*(ZRG(:,:,:,JN)**6) * & EXP(18 *(LOG(ZSIG(:,:,:,JN)))**2) + ENDDO ! Filter minimum values -!DO JN=1,JPMODE -! WHERE ((ZPM(:,:,:,NM0(JN)) .LE. ZPMIN(NM0(JN))).OR.& -! (ZPM(:,:,:,NM3(JN)) .LE. ZPMIN(NM3(JN))).OR.& -! (ZPM(:,:,:,NM6(JN)) .LE. ZPMIN(NM6(JN)))) -! ZPM(:,:,:,NM0(JN)) = ZPMOLD(:,:,:,NM0(JN)) -! ZPM(:,:,:,NM3(JN)) = ZPMOLD(:,:,:,NM3(JN)) -! ZPM(:,:,:,NM6(JN)) = ZPMOLD(:,:,:,NM6(JN)) -! END WHERE -!ENDDO +DO JN=1,JPMODE + WHERE ((ZPM(:,:,:,NM0(JN)) .LE. ZPMIN(NM0(JN))).OR.& + (ZPM(:,:,:,NM3(JN)) .LE. ZPMIN(NM3(JN))).OR.& + (ZPM(:,:,:,NM6(JN)) .LE. ZPMIN(NM6(JN)))) + ZPM(:,:,:,NM0(JN)) = ZPMOLD(:,:,:,NM0(JN)) + ZPM(:,:,:,NM3(JN)) = ZPMOLD(:,:,:,NM3(JN)) + ZPM(:,:,:,NM6(JN)) = ZPMOLD(:,:,:,NM6(JN)) + END WHERE +ENDDO ! Compute final sedimentation tendency with adding acqueous sedimentation DO JN=1,JPIN PSEDA(:,:,:,JN) = PSEDA(:,:,:,JN) + (ZPM(:,:,:,JN) - ZPMOLD(:,:,:,JN)) / PTSTEP END DO + ! + END SUBROUTINE CH_AER_DEPOS -- GitLab