From b4983148019eddd3ea106cd61e54960ef4a0ed85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vi=C3=A9?= <benoit.vie@meteo.fr> Date: Wed, 18 May 2022 13:34:37 +0200 Subject: [PATCH] bugfix aer2lima (call only if ORILAM or DUST or SALT) & rain_accr_snow (rhodref) --- src/MNH/aer2lima.f90 | 73 ++++++++++--------- src/MNH/ini_lima_cold_mixed.f90 | 2 +- src/MNH/lima_ccn_activation.f90 | 4 +- src/MNH/lima_init_ccn_activation_spectrum.f90 | 4 +- src/MNH/lima_mixed_fast_processes.f90 | 8 +- src/MNH/lima_rain_accr_snow.f90 | 19 +++-- src/MNH/lima_warm_nucl.f90 | 4 +- src/MNH/resolved_cloud.f90 | 4 +- 8 files changed, 60 insertions(+), 58 deletions(-) diff --git a/src/MNH/aer2lima.f90 b/src/MNH/aer2lima.f90 index 885dc0dc0..eaf03fa5b 100644 --- a/src/MNH/aer2lima.f90 +++ b/src/MNH/aer2lima.f90 @@ -278,29 +278,31 @@ END DO ELSE ! keep lima class intiatialization IF (CACTCCN=="ABRK") THEN ! only one CCN_FREE mode (activation is not performed upon aerosol class but by physical paramters) - IF (NMOD_CCN .GE. 2) & - ZCCN_SUM(:,:,:,1) = ZCCN_SUM(:,:,:,1) + & - PSVT(:,:,:,NSV_LIMA_CCN_FREE+1) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI+1) - IF (NMOD_CCN .GE. 3) & - ZCCN_SUM(:,:,:,1) = ZCCN_SUM(:,:,:,1) + & - PSVT(:,:,:,NSV_LIMA_CCN_FREE+2) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI+2) - + IF (NMOD_CCN .GE. 2) THEN + DO JI = 2, NMOD_CCN + ZCCN_SUM(:,:,:,1) = ZCCN_SUM(:,:,:,1) + & + PSVT(:,:,:,NSV_LIMA_CCN_FREE+JI-1) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI+JI-1) + END DO + END IF ELSE - IF (NMOD_CCN .GE. 2) & - ZCCN_SUM(:,:,:,2) = PSVT(:,:,:,NSV_LIMA_CCN_FREE+1) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI+1) - - IF (NMOD_CCN .GE. 3) & - ZCCN_SUM(:,:,:,3) = PSVT(:,:,:,NSV_LIMA_CCN_FREE+2) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI+2) + IF (NMOD_CCN .GE. 2) THEN + DO JI = 2, NMOD_CCN + ZCCN_SUM(:,:,:,JI) = PSVT(:,:,:,NSV_LIMA_CCN_FREE+JI-1) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI+JI-1) + END DO + END IF END IF - IF (.NOT.(LDUST)) & - ZIFN_SUM(:,:,:,1) = PSVT(:,:,:,NSV_LIMA_IFN_FREE) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL) - - IF (NMOD_IFN .GE. 2) & - ZIFN_SUM(:,:,:,2) = PSVT(:,:,:,NSV_LIMA_IFN_FREE+1) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL+1) + IF (.NOT.(LDUST) .AND. NMOD_IFN.GE.1) & + ZIFN_SUM(:,:,:,1) = PSVT(:,:,:,NSV_LIMA_IFN_FREE) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL) + IF (NMOD_IFN .GE. 2) THEN + DO JI = 2, NMOD_IFN + ZIFN_SUM(:,:,:,JI) = PSVT(:,:,:,NSV_LIMA_IFN_FREE+JI-1) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL+JI-1) + END DO + END IF END IF ! end if sur LORILAM - +! +! ! Sea Salt part IF (LSALT) THEN ! @@ -329,7 +331,8 @@ ELSE ! keep lima class intiatialization for sea salt + ccn from orilam ZCCN_SUM(:,:,:,1) = PSVT(:,:,:,NSV_LIMA_CCN_FREE) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI) END IF ! end if sur LSALT - +! +! ! Dust part IF (LDUST) THEN ! initatialization of dust if not macc @@ -352,24 +355,24 @@ IF (LDUST) THEN END DO ELSE ! keep lima class intiatialization - - ZIFN_SUM(:,:,:,1) = PSVT(:,:,:,NSV_LIMA_IFN_FREE) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL) + IF (NMOD_IFN.GE.1) & + ZIFN_SUM(:,:,:,1) = PSVT(:,:,:,NSV_LIMA_IFN_FREE) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL) END IF ! endif sur LDUST - -PSVT(:,:,:,NSV_LIMA_CCN_FREE) = MAX(ZCCN_SUM(:,:,:,1) - PSVT(:,:,:,NSV_LIMA_CCN_ACTI), 0.) - -IF (NMOD_CCN .GE. 2) & -PSVT(:,:,:,NSV_LIMA_CCN_FREE+1) = MAX(ZCCN_SUM(:,:,:,2) - PSVT(:,:,:,NSV_LIMA_CCN_ACTI+1), 0.) - - -IF (NMOD_CCN .GE. 3) & -PSVT(:,:,:,NSV_LIMA_CCN_FREE+2) = MAX(ZCCN_SUM(:,:,:,3) - PSVT(:,:,:,NSV_LIMA_CCN_ACTI+2), 0.) - -PSVT(:,:,:,NSV_LIMA_IFN_FREE) = MAX(ZIFN_SUM(:,:,:,1) - PSVT(:,:,:,NSV_LIMA_IFN_NUCL), 0.) -IF (NMOD_IFN .GE. 2) & -PSVT(:,:,:,NSV_LIMA_IFN_FREE+1) = MAX(ZIFN_SUM(:,:,:,2) - PSVT(:,:,:,NSV_LIMA_IFN_NUCL+1), 0.) - +! +! +! +IF (NMOD_CCN .GE. 1) THEN + DO JI=1,NMOD_CCN + PSVT(:,:,:,NSV_LIMA_CCN_FREE+JI-1) = MAX(ZCCN_SUM(:,:,:,JI) - PSVT(:,:,:,NSV_LIMA_CCN_ACTI+JI-1), 0.) + END DO +END IF +! +IF (NMOD_IFN .GE. 1) THEN + DO JI=1,NMOD_IFN + PSVT(:,:,:,NSV_LIMA_IFN_FREE+JI-1) = MAX(ZIFN_SUM(:,:,:,JI) - PSVT(:,:,:,NSV_LIMA_IFN_NUCL+JI-1), 0.) + END DO +END IF ! ! END SUBROUTINE AER2LIMA diff --git a/src/MNH/ini_lima_cold_mixed.f90 b/src/MNH/ini_lima_cold_mixed.f90 index e5cc933aa..2a59420e0 100644 --- a/src/MNH/ini_lima_cold_mixed.f90 +++ b/src/MNH/ini_lima_cold_mixed.f90 @@ -800,7 +800,7 @@ XHMLINTP2 = 1.0 + XHMLINTP1*LOG( 25.E-6/(XGAMINC_HMC_BOUND_MIN)**(1.0/XALPHAC) ) ! !* 7.2 Constants for the accretion of raindrops onto aggregates ! -XFRACCSS = XNS*((XPI**2)/24.0)*XRHOLW*(ZRHO00**XCEXVT) +XFRACCSS = XNS*XPI/4.0*XAR*(ZRHO00**XCEXVT) ! XLBRACCS1 = MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.) XLBRACCS2 = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,4.) diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index 22f5b399a..fa0a276eb 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -652,7 +652,7 @@ DO JL = 1, NPTS fl(JL)=fnew(JL) else if (PX2 .lt. 0.05) then PX2 = PX2 + 1.0E-2 - PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 +! PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),PZZW6(JL),JL) go to 100 end if @@ -673,7 +673,7 @@ DO JL = 1, NPTS PZRIDDR(JL)=PX2 else if (PX2 .lt. 0.05) then PX2 = PX2 + 1.0E-2 - PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 +! PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),PZZW6(JL),JL) go to 100 else diff --git a/src/MNH/lima_init_ccn_activation_spectrum.f90 b/src/MNH/lima_init_ccn_activation_spectrum.f90 index 16a561740..4403f9702 100644 --- a/src/MNH/lima_init_ccn_activation_spectrum.f90 +++ b/src/MNH/lima_init_ccn_activation_spectrum.f90 @@ -287,7 +287,7 @@ fh = DSDD(PX2,XDDRY,XKAPPA,XT) fl=fnew else if (PX2 .lt. 0.05) then PX2 = PX2 + 1.0E-2 - PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 +! PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 fh = DSDD(PX2,XDDRY,XKAPPA,XT) go to 100 STOP @@ -303,7 +303,7 @@ fh = DSDD(PX2,XDDRY,XKAPPA,XT) PZRIDDR=PX2 else if (PX2 .lt. 0.05) then PX2 = PX2 + 1.0E-2 - PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 +! PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 fh = DSDD(PX2,XDDRY,XKAPPA,XT) go to 100 else diff --git a/src/MNH/lima_mixed_fast_processes.f90 b/src/MNH/lima_mixed_fast_processes.f90 index b8a9fcc32..4ce1a8093 100644 --- a/src/MNH/lima_mixed_fast_processes.f90 +++ b/src/MNH/lima_mixed_fast_processes.f90 @@ -160,7 +160,7 @@ USE MODD_NSV USE MODD_PARAM_LIMA USE MODD_PARAM_LIMA_COLD USE MODD_PARAM_LIMA_MIXED -USE MODD_PARAM_LIMA_WARM, ONLY : XDR +USE MODD_PARAM_LIMA_WARM, ONLY : XBR, XDR use mode_budget, only: Budget_store_init, Budget_store_end @@ -826,10 +826,10 @@ IF( IGACC>0 .AND. LRAIN) THEN ! WHERE ( GACC(:) ) ZZW1(:,2) = PCRT1D(:) * & !! coef of RRACCS - XFRACCSS*( PRST1D(:)*PLBDAS(:)**XBS )*( PRHODREF(:)**(-XCEXVT) ) & + XFRACCSS*( PRST1D(:)*PLBDAS(:)**XBS )*( PRHODREF(:)**(1-XCEXVT) ) & *( XLBRACCS1/((PLBDAS(:)**2) ) + & XLBRACCS2/( PLBDAS(:) * PLBDAR(:) ) + & - XLBRACCS3/( (PLBDAR(:)**2)) )/PLBDAR(:)**3 + XLBRACCS3/( (PLBDAR(:)**2)) )/PLBDAR(:)**XBR ZZW1(:,4) = MIN( PRRS1D(:),ZZW1(:,2)*ZZW(:) ) ! RRACCSS PRRS1D(:) = PRRS1D(:) - ZZW1(:,4) PRSS1D(:) = PRSS1D(:) + ZZW1(:,4) @@ -870,7 +870,7 @@ IF( IGACC>0 .AND. LRAIN) THEN WHERE ( GACC(:) .AND. (PRSS1D(:)>XRTMIN(5)/PTSTEP) ) ZZW1(:,2) = MAX( MIN( PRRS1D(:),ZZW1(:,2)-ZZW1(:,4) ) , 0. ) ! RRACCSG ZZW1(:,3) = MIN( PRSS1D(:),XFSACCRG*ZZW(:)* & ! RSACCRG - ( PRST1D(:) )*( PRHODREF(:)**(-XCEXVT) ) & + ( PRST1D(:) )*( PRHODREF(:)**(1-XCEXVT) ) & *( XLBSACCR1/((PLBDAR(:)**2) ) + & XLBSACCR2/( PLBDAR(:) * PLBDAS(:) ) + & XLBSACCR3/( (PLBDAS(:)**2)) ) ) diff --git a/src/MNH/lima_rain_accr_snow.f90 b/src/MNH/lima_rain_accr_snow.f90 index 264c98bb9..5ece49ac9 100644 --- a/src/MNH/lima_rain_accr_snow.f90 +++ b/src/MNH/lima_rain_accr_snow.f90 @@ -69,6 +69,7 @@ END MODULE MODI_LIMA_RAIN_ACCR_SNOW ! USE MODD_CST, ONLY : XTT USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT +USE MODD_PARAM_LIMA_WARM, ONLY : XBR USE MODD_PARAM_LIMA_COLD, ONLY : XBS, XTRANS_MP_GAMMAS USE MODD_PARAM_LIMA_MIXED, ONLY : NACCLBDAS, XACCINTP1S, XACCINTP2S, & NACCLBDAR, XACCINTP1R, XACCINTP2R, & @@ -211,21 +212,19 @@ WHERE( GACC ) ! ! 1.3.4 raindrop accretion on the small sized aggregates ! -! BVIE manque PCRT ??????????????????????????????????? -! ZZW4(:) = & !! coef of RRACCS and RRACCS - ZZW4(:) = PCRT(:) & !! coef of RRACCS and RRACCS - * XFRACCSS *( PRST(:)*PLBDS(:)**XBS )*( PRHODREF(:)**(-XCEXVT) ) & - *( XLBRACCS1/( PLBDS(:)**2 ) + & - XLBRACCS2/( PLBDS(:) * PLBDR(:) ) + & - XLBRACCS3/( PLBDR(:)**2 ) ) / PLBDR(:)**3 + ZZW4(:) = PCRT(:) * & !! coef of RRACCS and RRACCS + XFRACCSS *( PRST(:)*PLBDS(:)**XBS )*( PRHODREF(:)**(1-XCEXVT) ) & + *( XLBRACCS1/( PLBDS(:)**2 ) + & + XLBRACCS2/( PLBDS(:) * PLBDR(:) ) + & + XLBRACCS3/( PLBDR(:)**2 ) ) / PLBDR(:)**XBR ! ! 1.3.6 raindrop accretion-conversion of the large sized aggregates ! into graupeln ! - ZZW5(:) = XFSACCRG*ZZW3(:) * & ! RSACCRG - ( PRST(:) )*( PRHODREF(:)**(-XCEXVT) ) & - *( XLBSACCR1/( PLBDR(:)**2 ) + & + ZZW5(:) = XFSACCRG * ZZW3(:) * PCRT(:) * & ! RSACCRG + ( PRST(:) )*( PRHODREF(:)**(1-XCEXVT) ) * & + ( XLBSACCR1/( PLBDR(:)**2 ) + & XLBSACCR2/( PLBDR(:) * PLBDS(:) ) + & XLBSACCR3/( PLBDS(:)**2 ) ) ! diff --git a/src/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90 index 549a5fc84..d62e4f790 100644 --- a/src/MNH/lima_warm_nucl.f90 +++ b/src/MNH/lima_warm_nucl.f90 @@ -662,7 +662,7 @@ DO JL = 1, NPTS fl(JL)=fnew(JL) else if (PX2 .lt. 0.05) then PX2 = PX2 + 1.0E-2 - PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 +! PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),PZZW6(JL),JL) go to 100 end if @@ -683,7 +683,7 @@ DO JL = 1, NPTS PZRIDDR(JL)=PX2 else if (PX2 .lt. 0.05) then PX2 = PX2 + 1.0E-2 - PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 +! PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),PZZW6(JL),JL) go to 100 else diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 937990ac6..de986a0cd 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -534,8 +534,8 @@ END IF ! !* 1. From ORILAM to LIMA: ! -IF (HCLOUD == 'LIMA') THEN -!IF (HCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN +!IF (HCLOUD == 'LIMA') THEN +IF (HCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN ! ORILAM : tendance s --> variable instant t ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV)) DO II = 1, NSV -- GitLab