diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index 78d9e7c1430316ffad866e1830efb81bfc2e5304..22f5b399a6370ed00361e2cf4464976db277ec42 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -102,7 +102,7 @@ use modd_field, only: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_PARAM_LIMA, ONLY: LACTIT, NMOD_CCN, XCTMIN, XKHEN_MULTI, XRTMIN, XLIMIT_FACTOR +USE MODD_PARAM_LIMA, ONLY: LADJ, LACTIT, NMOD_CCN, XCTMIN, XKHEN_MULTI, XRTMIN, XLIMIT_FACTOR USE MODD_PARAM_LIMA_WARM, ONLY: XWMIN, NAHEN, NHYP, XAHENINTP1, XAHENINTP2, XCSTDCRIT, XHYPF12, & XHYPINTP1, XHYPINTP2, XTMIN, XHYPF32, XPSI3, XAHENG, XAHENG2, XPSI1, & XLBC, XLBEXC @@ -215,27 +215,32 @@ ENDDO ! GNUCT(:,:,:) = .FALSE. ! -GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN & - .OR. PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) -IF (LACTIT) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & - .OR. ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN +IF (LADJ) THEN + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN & + .OR. PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) + IF (LACTIT) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .OR. ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN ! -GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & - .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & - .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(2) + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(2) ! -IF (LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & - .AND. PCLDFR(IIB:IIE,IJB:IJE,IKB:IKE)>0.01 -IF (.NOT. LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & - .AND. PRVT(IIB:IIE,IJB:IJE,IKB:IKE).GE.ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) + IF (LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. PCLDFR(IIB:IIE,IJB:IJE,IKB:IKE)>0.01 + IF (.NOT. LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. PRVT(IIB:IIE,IJB:IJE,IKB:IKE).GE.ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) +ELSE + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = PRVT(IIB:IIE,IJB:IJE,IKB:IKE).GE.ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(2) +END IF ! - IF (.NOT. LSUBG_COND) THEN ZCLDFR(:,:,:) = 1. ELSE ZCLDFR(:,:,:) = PCLDFR(:,:,:) END IF - +! INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) ! IF( INUCT >= 1 ) THEN @@ -277,8 +282,10 @@ IF( INUCT >= 1 ) THEN ENDDO ENDDO ! - ZZW1(:) = 1.0/ZEPS + 1.0/ZZW1(:) & - + (((XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZT(:))**2)/(XCPD*XRV) ! Psi2 + ALLOCATE(ZSMAX(INUCT)) + IF (LADJ) THEN + ZZW1(:) = 1.0/ZEPS + 1.0/ZZW1(:) & + + (((XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZT(:))**2)/(XCPD*XRV) ! Psi2 ! ! !------------------------------------------------------------------------------- @@ -290,13 +297,12 @@ IF( INUCT >= 1 ) THEN ! Remark : in LIMA's nucleation parameterization, Smax=0.01 for a supersaturation of 1% ! ! ! - ZVEC1(:) = MAX( 1.0001, MIN( REAL(NAHEN)-0.0001, XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) - IVEC1(:) = INT( ZVEC1(:) ) - ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) - ALLOCATE(ZSMAX(INUCT)) + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NAHEN)-0.0001, XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) ! ! - IF (LACTIT) THEN ! including a cooling rate + IF (LACTIT) THEN ! including a cooling rate ! ! Compute the tabulation of function of ZZW3 : ! @@ -305,20 +311,20 @@ IF( INUCT >= 1 ) THEN ! 2*pi*rho_l*G**(3/2) ! ! - ZZW4(:)=XPSI1( IVEC1(:)+1)*ZZW2(:)+XPSI3(IVEC1(:)+1)*ZZTDT(:) - ZZW5(:)=XPSI1( IVEC1(:) )*ZZW2(:)+XPSI3(IVEC1(:) )*ZZTDT(:) - WHERE (ZZW4(:) < 0. .OR. ZZW5(:) < 0.) - ZZW4(:) = 0. - ZZW5(:) = 0. - END WHERE - ZZW3(:) = XAHENG( IVEC1(:)+1)*(ZZW4(:)**1.5)* ZVEC1(:) & - - XAHENG( IVEC1(:) )*(ZZW5(:)**1.5)*(ZVEC1(:) - 1.0) + ZZW4(:)=XPSI1( IVEC1(:)+1)*ZZW2(:)+XPSI3(IVEC1(:)+1)*ZZTDT(:) + ZZW5(:)=XPSI1( IVEC1(:) )*ZZW2(:)+XPSI3(IVEC1(:) )*ZZTDT(:) + WHERE (ZZW4(:) < 0. .OR. ZZW5(:) < 0.) + ZZW4(:) = 0. + ZZW5(:) = 0. + END WHERE + ZZW3(:) = XAHENG( IVEC1(:)+1)*(ZZW4(:)**1.5)* ZVEC1(:) & + - XAHENG( IVEC1(:) )*(ZZW5(:)**1.5)*(ZVEC1(:) - 1.0) ! Cste*((Psi1*w+Psi3*dT/dt)/(G))**1.5 - ZZW6(:) = XAHENG2( IVEC1(:)+1)*(ZZW4(:)**0.5)* ZVEC1(:) & - - XAHENG2( IVEC1(:) )*(ZZW5(:)**0.5)*(ZVEC1(:) - 1.0) + ZZW6(:) = XAHENG2( IVEC1(:)+1)*(ZZW4(:)**0.5)* ZVEC1(:) & + - XAHENG2( IVEC1(:) )*(ZZW5(:)**0.5)*(ZVEC1(:) - 1.0) ! ! - ELSE ! LACTIT , for clouds + ELSE ! LACTIT , for clouds ! ! ! Compute the tabulation of function of ZZW3 : @@ -328,32 +334,32 @@ IF( INUCT >= 1 ) THEN ! 2 pi rho_l * G**(3/2) ! ! - ZZW2(:)=MAX(ZZW2(:),0.) - ZZW3(:)=XAHENG(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**1.5)* ZVEC1(:) & - -XAHENG(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**1.5)*(ZVEC1(:)-1.0) + ZZW2(:)=MAX(ZZW2(:),0.) + ZZW3(:)=XAHENG(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**1.5)* ZVEC1(:) & + -XAHENG(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**1.5)*(ZVEC1(:)-1.0) ! - ZZW6(:)=XAHENG2(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**0.5)* ZVEC1(:) & - -XAHENG2(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**0.5)*(ZVEC1(:)-1.0) + ZZW6(:)=XAHENG2(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**0.5)* ZVEC1(:) & + -XAHENG2(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**0.5)*(ZVEC1(:)-1.0) ! - END IF ! LACTIT + END IF ! LACTIT ! ! ! (Psi1*w+Psi3*DT/Dt)**1.5 rho_air ! ZZW3 = ------------------------ * ------- ! 2*pi*rho_l*G**(3/2) Psi2 ! - ZZW5(:) = 1. - ZZW3(:) = (ZZW3(:)/ZZW1(:))*ZRHODREF(:) ! R.H.S. of Eq 9 of CPB 98 but - ! for multiple aerosol modes - WHERE (ZRCT(:) > XRTMIN(2) .AND. ZCCT(:) > XCTMIN(2)) - ZZW6(:) = ZZW6(:) * ZRHODREF(:) * ZCCT(:) / (XLBC*ZCCT(:)/ZRCT(:))**XLBEXC - ELSEWHERE - ZZW6(:)=0. - END WHERE + ZZW5(:) = 1. + ZZW3(:) = (ZZW3(:)/ZZW1(:))*ZRHODREF(:) ! R.H.S. of Eq 9 of CPB 98 but + ! for multiple aerosol modes + WHERE (ZRCT(:) > XRTMIN(2) .AND. ZCCT(:) > XCTMIN(2)) + ZZW6(:) = ZZW6(:) * ZRHODREF(:) * ZCCT(:) / (XLBC*ZCCT(:)/ZRCT(:))**XLBEXC + ELSEWHERE + ZZW6(:)=0. + END WHERE - WHERE (ZZW3(:) == 0. .AND. .NOT.(ZSW>0.)) - ZZW5(:) = -1. - END WHERE + WHERE (ZZW3(:) == 0. .AND. .NOT.(ZSW>0.)) + ZZW5(:) = -1. + END WHERE ! !------------------------------------------------------------------------------- ! @@ -367,13 +373,17 @@ IF( INUCT >= 1 ) THEN ! ! Interval bounds to tabulate sursaturation Smax ! Check with values used for tabulation in ini_lima_warm.f90 - ZS1 = 1.0E-5 ! corresponds to 0.001% supersaturation - ZS2 = 5.0E-2 ! corresponds to 5.0% supersaturation - ZXACC = 1.0E-10 ! Accuracy needed for the search in [NO UNITS] -! - ZSMAX(:) = ZRIDDR(ZS1,ZS2,ZXACC,ZZW3(:),ZZW6(:),INUCT) ! ZSMAX(:) is in [NO UNITS] - ZSMAX(:) = MIN(MAX(ZSMAX(:), ZSW(:)),ZS2) + ZS1 = 1.0E-5 ! corresponds to 0.001% supersaturation + ZS2 = 5.0E-2 ! corresponds to 5.0% supersaturation + ZXACC = 1.0E-10 ! Accuracy needed for the search in [NO UNITS] ! + ZSMAX(:) = ZRIDDR(ZS1,ZS2,ZXACC,ZZW3(:),ZZW6(:),INUCT) ! ZSMAX(:) is in [NO UNITS] + ZSMAX(:) = MIN(MAX(ZSMAX(:), ZSW(:)),ZS2) + ! + ELSE + ZSMAX(:) = ZSW(:) + ZZW5(:) = 1. + END IF ! !------------------------------------------------------------------------------- !