diff --git a/src/arome/gmkpack_ignored_files b/src/arome/gmkpack_ignored_files index bbf18295df5a8af4e471dcc740d58fafb6729a33..cca761ab08eebf3dd23dba956f58c7c0949c92dd 100644 --- a/src/arome/gmkpack_ignored_files +++ b/src/arome/gmkpack_ignored_files @@ -24,3 +24,13 @@ phyex/micro/ice4_fast_ri.F90 phyex/micro/modi_ice4_fast_ri.F90 phyex/micro/ice4_rsrimcg_old.F90 phyex/micro/modi_ice4_rsrimcg_old.F90 +phyex/micro/ice4_warm.F90 +phyex/micro/modi_ice4_warm.F90 +phyex/micro/ice4_fast_rg.F90 +phyex/micro/ice4_fast_rh.F90 +phyex/micro/ice4_fast_rs.F90 +phyex/micro/ice4_slow.F90 +phyex/micro/modi_ice4_fast_rg.F90 +phyex/micro/modi_ice4_fast_rh.F90 +phyex/micro/modi_ice4_fast_rs.F90 +phyex/micro/modi_ice4_slow.F90 diff --git a/src/arome/micro/ice4_fast_rg.F90 b/src/arome/micro/ice4_fast_rg.F90 deleted file mode 100644 index e6f47e1ad7887845987ca60bc5b86cba1241846b..0000000000000000000000000000000000000000 --- a/src/arome/micro/ice4_fast_rg.F90 +++ /dev/null @@ -1,496 +0,0 @@ -SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, PCIT, & - &PLBDAR, PLBDAS, PLBDAG, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - &PRGSI, PRGSI_MR, & - &PWETG, & - &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & - &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & - &PRG_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, PB_RG, PB_RH) -!! -!!** PURPOSE -!! ------- -!! Computes the fast rg processes -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE MODD_PARAM_ICE, ONLY : LEVLIMIT, LNULLWETG, LWETGPOST, LCRFLIMIT -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI ! Graupel tendency by other processes -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI_MR ! Graupel mr change by other processes -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRWETGH ! Conversion of graupel into hail -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR ! Melting of the graupel -REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH -! -!* 0.2 declaration of local variables -! -LOGICAL, DIMENSION(KSIZE) :: GDRY -REAL, DIMENSION(KSIZE) :: ZDRY, ZDRYG, ZMASK -INTEGER :: IGDRY -REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 -REAL, DIMENSION(KSIZE) :: ZZW, & - ZRDRYG_INIT, & !Initial dry growth rate of the graupeln - ZRWETG_INIT !Initial wet growth rate of the graupeln -INTEGER :: JJ, JL -INTEGER :: IRCDRYG, IRIDRYG, IRIWETG, IRSDRYG, IRSWETG, IRRDRYG, & - & IFREEZ1, IFREEZ2 -REAL(KIND=JPRB) :: ZHOOK_HANDLE -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RG', 0, ZHOOK_HANDLE) -! -IRCDRYG=1 -IRIDRYG=2 -IRIWETG=3 -IRSDRYG=4 -IRSWETG=5 -IRRDRYG=6 -IFREEZ1=7 -IFREEZ2=8 -! -!------------------------------------------------------------------------------- -! -!* 6.1 rain contact freezing -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRICFRRG(JL)=ZMASK(JL) * PRICFRRG(JL) - PRRCFRIG(JL)=ZMASK(JL) * PRRCFRIG(JL) - PRICFRR(JL)=ZMASK(JL) * PRICFRR(JL) - ENDDO -ELSE - PRICFRRG(:)=0. - PRRCFRIG(:)=0. - WHERE(ZMASK(:)==1.) - PRICFRRG(:) = XICFRR*PRIT(:) & ! RICFRRG - *PLBDAR(:)**XEXICFRR & - *PRHODREF(:)**(-XCEXVT) - PRRCFRIG(:) = XRCFRI*PCIT(:) & ! RRCFRIG - * PLBDAR(:)**XEXRCFRI & - * PRHODREF(:)**(-XCEXVT-1.) - END WHERE - - IF(LCRFLIMIT) THEN - DO JL=1, KSIZE - !Comparison between heat to be released (to freeze rain) and heat sink (rain and ice temperature change) - !ZZW is the proportion of process that can take place - ZZW(JL)=(1.-ZMASK(JL)) + & ! 1. outside of mask - ZMASK(JL) * MAX(0., MIN(1., (PRICFRRG(JL)*XCI+PRRCFRIG(JL)*XCL)*(XTT-PT(JL)) / & - MAX(1.E-20, XLVTT*PRRCFRIG(JL)))) - ENDDO - ELSE - ZZW(:)=1. - ENDIF - DO JL=1, KSIZE - PRRCFRIG(JL) = ZZW(JL) * PRRCFRIG(JL) !Part of rain that can be freezed - PRICFRR(JL) = (1.-ZZW(JL)) * PRICFRRG(JL) !Part of collected pristine ice converted to rain - PRICFRRG(JL) = ZZW(JL) * PRICFRRG(JL) !Part of collected pristine ice that lead to graupel - ENDDO -ENDIF -DO JL=1, KSIZE - PA_RI(JL) = PA_RI(JL) - PRICFRRG(JL) - PRICFRR(JL) - PA_RR(JL) = PA_RR(JL) - PRRCFRIG(JL) + PRICFRR(JL) - PA_RG(JL) = PA_RG(JL) + PRICFRRG(JL) + PRRCFRIG(JL) - PA_TH(JL) = PA_TH(JL) + (PRRCFRIG(JL) - PRICFRR(JL))*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -! -!* 6.3 compute the graupel growth -! -! Wet and dry collection of rc and ri on graupel -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*PRG_TEND(JL, IRCDRYG) - ENDDO -ELSE - ZZW(:)=0. - WHERE(ZMASK(:)==1.) - ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) - END WHERE - DO JL=1, KSIZE - PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*XFCDRYG * PRCT(JL) * ZZW(JL) - ENDDO -ENDIF - -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IRIDRYG)=ZMASK(JL) * PRG_TEND(JL, IRIDRYG) - PRG_TEND(JL, IRIWETG)=ZMASK(JL) * PRG_TEND(JL, IRIWETG) - ENDDO -ELSE - PRG_TEND(:, IRIDRYG)=0. - PRG_TEND(:, IRIWETG)=0. - WHERE(ZMASK(:)==1.) - ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) - PRG_TEND(:, IRIDRYG)=XFIDRYG*EXP(XCOLEXIG*(PT(:)-XTT))*PRIT(:)*ZZW(:) - PRG_TEND(:, IRIWETG)=PRG_TEND(:, IRIDRYG) / (XCOLIG*EXP(XCOLEXIG*(PT(:)-XTT))) - END WHERE -ENDIF - -! Wet and dry collection of rs on graupel (6.2.1) -DO JL=1, KSIZE - ZDRY(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IRSDRYG)=ZDRY(JL) * PRG_TEND(JL, IRSDRYG) - PRG_TEND(JL, IRSWETG)=ZDRY(JL) * PRG_TEND(JL, IRSWETG) - ENDDO -ELSE - PRG_TEND(:, IRSDRYG)=0. - PRG_TEND(:, IRSWETG)=0. - GDRY(:)=ZDRY(:)==1. - IGDRY=COUNT(GDRY(:)) - IF(IGDRY>0)THEN - ! - !* 6.2.3 select the (PLBDAG,PLBDAS) couplet - ! - ZVEC1(1:IGDRY)=PACK(PLBDAG(:), MASK=GDRY(:)) - ZVEC2(1:IGDRY)=PACK(PLBDAS(:), MASK=GDRY(:)) - ! - !* 6.2.4 find the next lower indice for the PLBDAG and for the PLBDAS - ! in the geometrical set of (Lbda_g,Lbda_s) couplet use to - ! tabulate the SDRYG-kernel - ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN(FLOAT(NDRYLBDAG)-0.00001, & - XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) - IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY) ) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-FLOAT(IVEC1(1:IGDRY)) - ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( FLOAT(NDRYLBDAS)-0.00001, & - XDRYINTP1S*LOG(ZVEC2(1:IGDRY))+XDRYINTP2S)) - IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-FLOAT(IVEC2(1:IGDRY)) - ! - !* 6.2.5 perform the bilinear interpolation of the normalized - ! SDRYG-kernel - ! - DO JJ=1, IGDRY - ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:)=UNPACK(VECTOR=ZVEC3(1:IGDRY), MASK=GDRY(:), FIELD=0.0) - ! - WHERE(GDRY(:)) - PRG_TEND(:, IRSWETG)=XFSDRYG*ZZW(:) & ! RSDRYG - / XCOLSG & - *(PLBDAS(:)**(XCXS-XBS))*( PLBDAG(:)**XCXG ) & - *(PRHODREF(:)**(-XCEXVT-1.)) & - *( XLBSDRYG1/( PLBDAG(:)**2 ) + & - XLBSDRYG2/( PLBDAG(:) * PLBDAS(:) ) + & - XLBSDRYG3/( PLBDAS(:)**2)) - PRG_TEND(:, IRSDRYG)=PRG_TEND(:, IRSWETG)*XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) - END WHERE - ENDIF -ENDIF -! -!* 6.2.6 accretion of raindrops on the graupeln -! -DO JL=1, KSIZE - ZDRY(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IRRDRYG)=ZDRY(JL) * PRG_TEND(JL, IRRDRYG) - ENDDO -ELSE - GDRY(:)=ZDRY(:)==1. - PRG_TEND(:, IRRDRYG)=0. - IGDRY=COUNT(GDRY(:)) - ! - IF(IGDRY>0) THEN - ! - !* 6.2.8 select the (PLBDAG,PLBDAR) couplet - ! - ZVEC1(1:IGDRY)=PACK(PLBDAG(:), MASK=GDRY(:)) - ZVEC2(1:IGDRY)=PACK(PLBDAR(:), MASK=GDRY(:)) - ! - !* 6.2.9 find the next lower indice for the PLBDAG and for the PLBDAR - ! in the geometrical set of (Lbda_g,Lbda_r) couplet use to - ! tabulate the RDRYG-kernel - ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN( FLOAT(NDRYLBDAG)-0.00001, & - XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) - IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY)) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-FLOAT(IVEC1(1:IGDRY)) - ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( FLOAT(NDRYLBDAR)-0.00001, & - XDRYINTP1R*LOG(ZVEC2(1:IGDRY))+XDRYINTP2R)) - IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-FLOAT(IVEC2(1:IGDRY)) - ! - !* 6.2.10 perform the bilinear interpolation of the normalized - ! RDRYG-kernel - ! - DO JJ=1, IGDRY - ZVEC3(JJ)= ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:)=UNPACK(VECTOR=ZVEC3(1:IGDRY), MASK=GDRY, FIELD=0.) - ! - WHERE(GDRY(:)) - PRG_TEND(:, IRRDRYG) = XFRDRYG*ZZW(:) & ! RRDRYG - *( PLBDAR(:)**(-4) )*( PLBDAG(:)**XCXG ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRDRYG1/( PLBDAG(:)**2 ) + & - XLBRDRYG2/( PLBDAG(:) * PLBDAR(:) ) + & - XLBRDRYG3/( PLBDAR(:)**2) ) - END WHERE - ENDIF -ENDIF - -DO JL=1, KSIZE - ZRDRYG_INIT(JL)=PRG_TEND(JL, IRCDRYG)+PRG_TEND(JL, IRIDRYG)+ & - &PRG_TEND(JL, IRSDRYG)+PRG_TEND(JL, IRRDRYG) -ENDDO - -!Freezing rate -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRG_TEND(JL, IFREEZ1) - PRG_TEND(JL, IFREEZ2)=ZMASK(JL) * PRG_TEND(JL, IFREEZ2) - ENDDO -ELSE - DO JL=1, KSIZE - PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRG_TEND(:, IFREEZ1)=MIN(PRG_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) - END WHERE - ENDIF - PRG_TEND(:, IFREEZ2)=0. - WHERE(ZMASK(:)==1.) - PRG_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & - (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & - *(XESTT-PRG_TEND(:, IFREEZ1))/(XRV*PT(:)) ) - PRG_TEND(:, IFREEZ1)=PRG_TEND(:, IFREEZ1)* ( X0DEPG* PLBDAG(:)**XEX0DEPG + & - X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG )/ & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - PRG_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - END WHERE -ENDIF -DO JL=1, KSIZE - !We must agregate, at least, the cold species - ZRWETG_INIT(JL)=ZMASK(JL) * MAX(PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG), & - &MAX(0., PRG_TEND(JL, IFREEZ1) + & - &PRG_TEND(JL, IFREEZ2) * ( & - &PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG) ))) -ENDDO - -!Growth mode -DO JL=1, KSIZE - PWETG(JL) = ZMASK(JL) * & ! - & MAX(0., SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - & - &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG)))) -ENDDO -IF(LNULLWETG) THEN - DO JL=1, KSIZE - PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRDRYG_INIT(JL))) - ENDDO -ELSE - DO JL=1, KSIZE - PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRWETG_INIT(JL))) - ENDDO -ENDIF -IF(.NOT. LWETGPOST) THEN - DO JL=1, KSIZE - PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) - ENDDO -ENDIF -DO JL=1, KSIZE - ZDRYG(JL) = ZMASK(JL) * & ! - & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) - & MAX(0., -SIGN(1., -ZRDRYG_INIT(JL))) * & ! WHERE(ZRDRYG_INIT(:)>0.) - & MAX(0., -SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - & - &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG)))) -ENDDO - -! Part of ZRWETG to be converted into hail -! Graupel can be produced by other processes instantaneously (inducing a mixing ratio change, PRGSI_MR) or -! as a tendency (PRWETGH) -PRWETGH(:)=0. -PRWETGH_MR(:)=0. -IF(KRR==7) THEN - WHERE(PWETG(:)==1.) - !assume a linear percent of conversion of produced graupel into hail - PRWETGH(:)=(MAX(0., PRGSI(:)+PRICFRRG(:)+PRRCFRIG(:))+ZRWETG_INIT(:))*ZRDRYG_INIT(:)/(ZRWETG_INIT(:)+ZRDRYG_INIT(:)) - PRWETGH_MR(:)=MAX(0., PRGSI_MR(:))*ZRDRYG_INIT(:)/(ZRWETG_INIT(:)+ZRDRYG_INIT(:)) - END WHERE -ENDIF - -DO JL=1, KSIZE - !Aggregated minus collected - PRRWETG(JL)=-PWETG(JL) * (PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG)+& - &PRG_TEND(JL, IRCDRYG)-ZRWETG_INIT(JL)) - PRCWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRCDRYG) - PRIWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRIWETG) - PRSWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRSWETG) - - PRCDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRCDRYG) - PRRDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRRDRYG) - PRIDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRIDRYG) - PRSDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRSDRYG) - - PA_RC(JL) = PA_RC(JL) - PRCWETG(JL) - PA_RI(JL) = PA_RI(JL) - PRIWETG(JL) - PA_RS(JL) = PA_RS(JL) - PRSWETG(JL) - PA_RG(JL) = PA_RG(JL) + PRCWETG(JL) + PRIWETG(JL) + PRSWETG(JL) + PRRWETG(JL) - PA_RR(JL) = PA_RR(JL) - PRRWETG(JL) - PA_TH(JL) = PA_TH(JL) + (PRCWETG(JL) + PRRWETG(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA_RG(JL) = PA_RG(JL) - PRWETGH(JL) - PA_RH(JL) = PA_RH(JL) + PRWETGH(JL) - PB_RG(JL) = PB_RG(JL) - PRWETGH_MR(JL) - PB_RH(JL) = PB_RH(JL) + PRWETGH_MR(JL) - PA_RC(JL) = PA_RC(JL) - PRCDRYG(JL) - PA_RI(JL) = PA_RI(JL) - PRIDRYG(JL) - PA_RS(JL) = PA_RS(JL) - PRSDRYG(JL) - PA_RR(JL) = PA_RR(JL) - PRRDRYG(JL) - PA_RG(JL) = PA_RG(JL) + PRCDRYG(JL) + PRIDRYG(JL) + PRSDRYG(JL) + PRRDRYG(JL) - PA_TH(JL) = PA_TH(JL) + (PRCDRYG(JL)+PRRDRYG(JL))*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -!* 6.5 Melting of the graupeln -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRGMLTR(JL)=ZMASK(JL) * PRGMLTR(JL) - ENDDO -ELSE - DO JL=1, KSIZE - PRGMLTR(JL)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRGMLTR(:)=MIN(PRGMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) - END WHERE - ENDIF - DO JL=1, KSIZE - PRGMLTR(JL)=ZMASK(JL) * (PKA(JL)*(XTT-PT(JL)) + & - ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - *(XESTT-PRGMLTR(JL))/(XRV*PT(JL)) )) - ENDDO - WHERE(ZMASK(:)==1.) - ! - ! compute RGMLTR - ! - PRGMLTR(:) = MAX( 0.0,( -PRGMLTR(:) * & - ( X0DEPG* PLBDAG(:)**XEX0DEPG + & - X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) - & - ( PRG_TEND(:, IRCDRYG)+PRG_TEND(:, IRRDRYG) ) * & - ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & - ( PRHODREF(:)*XLMTT ) ) - END WHERE -ENDIF -DO JL=1, KSIZE - PA_RR(JL) = PA_RR(JL) + PRGMLTR(JL) - PA_RG(JL) = PA_RG(JL) - PRGMLTR(JL) - PA_TH(JL) = PA_TH(JL) - PRGMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO - -IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RG', 1, ZHOOK_HANDLE) -! -END SUBROUTINE ICE4_FAST_RG diff --git a/src/arome/micro/ice4_fast_rh.F90 b/src/arome/micro/ice4_fast_rh.F90 deleted file mode 100644 index 86ac7d99740058dc81e7cfad6910e008a00878c0..0000000000000000000000000000000000000000 --- a/src/arome/micro/ice4_fast_rh.F90 +++ /dev/null @@ -1,502 +0,0 @@ -SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAS, PLBDAG, PLBDAR, PLBDAH, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & - &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & - &PRH_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH) -!! -!!** PURPOSE -!! ------- -!! Computes the fast rh process -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE MODD_PARAM_ICE, ONLY : LEVLIMIT, LNULLWETH, LWETHPOST, LCONVHG -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the rain distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAH ! Slope parameter of the hail distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRDRYHG ! Conversion of hailstone into graupel -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR ! Melting of the hailstones -REAL, DIMENSION(KSIZE, 10), INTENT(INOUT) :: PRH_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -! -!* 0.2 declaration of local variables -! -LOGICAL, DIMENSION(KSIZE) :: GWET -REAL, DIMENSION(KSIZE) :: ZHAIL, ZWET, ZMASK, ZWETH, ZDRYH -INTEGER :: IHAIL, IGWET -REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 -REAL, DIMENSION(KSIZE) :: ZZW, & - ZRDRYH_INIT, ZRWETH_INIT, & - ZRDRYHG -INTEGER :: JJ, JL -INTEGER :: IRCWETH, IRRWETH, IRIDRYH, IRIWETH, IRSDRYH, IRSWETH, IRGDRYH, IRGWETH, & - & IFREEZ1, IFREEZ2 -REAL(KIND=JPRB) :: ZHOOK_HANDLE -! -!------------------------------------------------------------------------------- -IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RH',0,ZHOOK_HANDLE) -! -IRCWETH=1 -IRRWETH=2 -IRIDRYH=3 -IRIWETH=4 -IRSDRYH=5 -IRSWETH=6 -IRGDRYH=7 -IRGWETH=8 -IFREEZ1=9 -IFREEZ2=10 -! -! -! -!* 7.2 compute the Wet and Dry growth of hail -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRCWETH)=ZMASK(JL) * PRH_TEND(JL, IRCWETH) - ENDDO -ELSE - PRH_TEND(:, IRCWETH)=0. - WHERE(ZMASK(:)==1.) - ZZW(:) = PLBDAH(:)**(XCXH-XDH-2.0) * PRHODREF(:)**(-XCEXVT) - PRH_TEND(:, IRCWETH)=XFWETH * PRCT(:) * ZZW(:) ! RCWETH - END WHERE -ENDIF -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRIWETH)=ZMASK(JL) * PRH_TEND(JL, IRIWETH) - PRH_TEND(JL, IRIDRYH)=ZMASK(JL) * PRH_TEND(JL, IRIDRYH) - ENDDO -ELSE - PRH_TEND(:, IRIWETH)=0. - PRH_TEND(:, IRIDRYH)=0. - WHERE(ZMASK(:)==1.) - ZZW(:) = PLBDAH(:)**(XCXH-XDH-2.0) * PRHODREF(:)**(-XCEXVT) - PRH_TEND(:, IRIWETH)=XFWETH * PRIT(:) * ZZW(:) ! RIWETH - PRH_TEND(:, IRIDRYH)=PRH_TEND(:, IRIWETH)*(XCOLIH*EXP(XCOLEXIH*(PT(:)-XTT))) ! RIDRYH - END WHERE -ENDIF - -! -!* 7.2.1 accretion of aggregates on the hailstones -! -DO JL=1, KSIZE - ZWET(JL) = MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRSWETH)=ZWET(JL) * PRH_TEND(JL, IRSWETH) - PRH_TEND(JL, IRSDRYH)=ZWET(JL) * PRH_TEND(JL, IRSDRYH) - ENDDO -ELSE - PRH_TEND(:, IRSWETH)=0. - PRH_TEND(:, IRSDRYH)=0. - GWET(:)=ZWET(:)==1. - IGWET=COUNT(GWET(:)) - IF(IGWET>0)THEN - ! - !* 7.2.3 select the (PLBDAH,PLBDAS) couplet - ! - ZVEC1(1:IGWET) = PACK( PLBDAH(:),MASK=GWET(:) ) - ZVEC2(1:IGWET) = PACK( PLBDAS(:),MASK=GWET(:) ) - ! - !* 7.2.4 find the next lower indice for the PLBDAG and for the PLBDAS - ! in the geometrical set of (Lbda_h,Lbda_s) couplet use to - ! tabulate the SWETH-kernel - ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAH)-0.00001, & - XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) - IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) - ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - FLOAT( IVEC1(1:IGWET) ) - ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAS)-0.00001, & - XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + XWETINTP2S ) ) - IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) - ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - FLOAT( IVEC2(1:IGWET) ) - ! - !* 7.2.5 perform the bilinear interpolation of the normalized - ! SWETH-kernel - ! - DO JJ = 1,IGWET - ZVEC3(JJ) = ( XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGWET),MASK=GWET,FIELD=0.0 ) - ! - WHERE(GWET(:)) - PRH_TEND(:, IRSWETH)=XFSWETH*ZZW(:) & ! RSWETH - *( PLBDAS(:)**(XCXS-XBS) )*( PLBDAH(:)**XCXH ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBSWETH1/( PLBDAH(:)**2 ) + & - XLBSWETH2/( PLBDAH(:) * PLBDAS(:) ) + & - XLBSWETH3/( PLBDAS(:)**2) ) - PRH_TEND(:, IRSDRYH)=PRH_TEND(:, IRSWETH)*(XCOLSH*EXP(XCOLEXSH*(PT(:)-XTT))) - END WHERE - ENDIF -ENDIF -! -!* 7.2.6 accretion of graupeln on the hailstones -! -DO JL=1, KSIZE - ZWET(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRGWETH)=ZWET(JL) * PRH_TEND(JL, IRGWETH) - PRH_TEND(JL, IRGDRYH)=ZWET(JL) * PRH_TEND(JL, IRGDRYH) - ENDDO -ELSE - PRH_TEND(:, IRGWETH)=0. - PRH_TEND(:, IRGDRYH)=0. - GWET(:)=ZWET(:)==1. - IGWET=COUNT(GWET(:)) - IF(IGWET>0)THEN - ! - !* 7.2.8 select the (PLBDAH,PLBDAG) couplet - ! - ZVEC1(1:IGWET) = PACK( PLBDAH(:),MASK=GWET(:) ) - ZVEC2(1:IGWET) = PACK( PLBDAG(:),MASK=GWET(:) ) - ! - !* 7.2.9 find the next lower indice for the PLBDAH and for the PLBDAG - ! in the geometrical set of (Lbda_h,Lbda_g) couplet use to - ! tabulate the GWETH-kernel - ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAG)-0.00001, & - XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) - IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) - ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - FLOAT( IVEC1(1:IGWET) ) - ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAG)-0.00001, & - XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + XWETINTP2G ) ) - IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) - ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - FLOAT( IVEC2(1:IGWET) ) - ! - !* 7.2.10 perform the bilinear interpolation of the normalized - ! GWETH-kernel - ! - DO JJ = 1,IGWET - ZVEC3(JJ) = ( XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGWET),MASK=GWET,FIELD=0.0 ) - ! - WHERE(GWET(:)) - PRH_TEND(:, IRGWETH)=XFGWETH*ZZW(:) & ! RGWETH - *( PLBDAG(:)**(XCXG-XBG) )*( PLBDAH(:)**XCXH ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBGWETH1/( PLBDAH(:)**2 ) + & - XLBGWETH2/( PLBDAH(:) * PLBDAG(:) ) + & - XLBGWETH3/( PLBDAG(:)**2) ) - PRH_TEND(:, IRGDRYH)=PRH_TEND(:, IRGWETH) - END WHERE - !When graupel grows in wet mode, graupel is wet (!) and collection efficiency must remain the same - WHERE(GWET(:) .AND. .NOT. PWETG(:)==1.) - PRH_TEND(:, IRGDRYH)=PRH_TEND(:, IRGDRYH)*(XCOLGH*EXP(XCOLEXGH*(PT(:)-XTT))) - END WHERE - END IF -ENDIF -! -!* 7.2.11 accretion of raindrops on the hailstones -! -DO JL=1, KSIZE - ZWET(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRRWETH)=ZWET(JL) * PRH_TEND(JL, IRRWETH) - ENDDO -ELSE - PRH_TEND(:, IRRWETH)=0. - GWET(:)=ZWET(:)==1. - IGWET=COUNT(GWET(:)) - IF(IGWET>0)THEN - ! - !* 7.2.12 select the (PLBDAH,PLBDAR) couplet - ! - ZVEC1(1:IGWET)=PACK(PLBDAH(:), MASK=GWET(:)) - ZVEC2(1:IGWET)=PACK(PLBDAR(:), MASK=GWET(:)) - ! - !* 7.2.13 find the next lower indice for the PLBDAH and for the PLBDAR - ! in the geometrical set of (Lbda_h,Lbda_r) couplet use to - ! tabulate the RWETH-kernel - ! - ZVEC1(1:IGWET)=MAX(1.00001, MIN( FLOAT(NWETLBDAH)-0.00001, & - XWETINTP1H*LOG(ZVEC1(1:IGWET))+XWETINTP2H)) - IVEC1(1:IGWET)=INT(ZVEC1(1:IGWET)) - ZVEC1(1:IGWET)=ZVEC1(1:IGWET)-FLOAT(IVEC1(1:IGWET)) - ! - ZVEC2(1:IGWET)=MAX(1.00001, MIN( FLOAT(NWETLBDAR)-0.00001, & - XWETINTP1R*LOG(ZVEC2(1:IGWET))+XWETINTP2R)) - IVEC2(1:IGWET)=INT(ZVEC2(1:IGWET)) - ZVEC2(1:IGWET)=ZVEC2(1:IGWET)-FLOAT(IVEC2(1:IGWET)) - ! - !* 7.2.14 perform the bilinear interpolation of the normalized - ! RWETH-kernel - ! - DO JJ=1, IGWET - ZVEC3(JJ)= ( XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:)=UNPACK(VECTOR=ZVEC3(1:IGWET), MASK=GWET, FIELD=0.) - ! - WHERE(GWET(:)) - PRH_TEND(:, IRRWETH) = XFRWETH*ZZW(:) & ! RRWETH - *( PLBDAR(:)**(-4) )*( PLBDAH(:)**XCXH ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRWETH1/( PLBDAH(:)**2 ) + & - XLBRWETH2/( PLBDAH(:) * PLBDAR(:) ) + & - XLBRWETH3/( PLBDAR(:)**2) ) - END WHERE - ENDIF -ENDIF -! -DO JL=1, KSIZE - ZRDRYH_INIT(JL)=PRH_TEND(JL, IRCWETH)+PRH_TEND(JL, IRIDRYH)+ & - &PRH_TEND(JL, IRSDRYH)+PRH_TEND(JL, IRRWETH)+PRH_TEND(JL, IRGDRYH) -ENDDO -! -!* 7.3 compute the Wet growth of hail -! -DO JL=1, KSIZE - ZHAIL(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IFREEZ1)=ZHAIL(JL) * PRH_TEND(JL, IFREEZ1) - PRH_TEND(JL, IFREEZ2)=ZHAIL(JL) * PRH_TEND(JL, IFREEZ2) - ENDDO -ELSE - DO JL=1, KSIZE - PRH_TEND(JL, IFREEZ1)=PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZHAIL(:)==1.) - PRH_TEND(:, IFREEZ1)=MIN(PRH_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) - END WHERE - ENDIF - PRH_TEND(:, IFREEZ2)=0. - WHERE(ZHAIL(:)==1.) - PRH_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & - (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & - *(XESTT-PRH_TEND(:, IFREEZ1))/(XRV*PT(:)) ) - PRH_TEND(:, IFREEZ1)=PRH_TEND(:, IFREEZ1)* ( X0DEPH* PLBDAH(:)**XEX0DEPH + & - X1DEPH*PCJ(:)*PLBDAH(:)**XEX1DEPH )/ & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - PRH_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - END WHERE -ENDIF -DO JL=1, KSIZE - !We must agregate, at least, the cold species - ZRWETH_INIT(JL)=ZHAIL(JL) * MAX(PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH), & - &MAX(0., PRH_TEND(JL, IFREEZ1) + & - &PRH_TEND(JL, IFREEZ2) * ( & - &PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH) ))) -ENDDO -! -!* 7.4 Select Wet or Dry case -! -!Wet case -DO JL=1, KSIZE - ZWETH(JL) = ZHAIL(JL) * & - & MAX(0., SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)-PRH_TEND(JL, IRGDRYH)) - & - &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)-PRH_TEND(JL, IRGWETH)))) -ENDDO -IF(LNULLWETH) THEN - DO JL=1, KSIZE - ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRDRYH_INIT(JL))) ! WHERE(ZRDRYH_INIT(:)>0.) - ENDDO -ELSE - DO JL=1, KSIZE - ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRWETH_INIT(JL))) ! WHERE(ZRWETH_INIT(:)>0.) - ENDDO -ENDIF -IF(.NOT. LWETHPOST) THEN - DO JL=1, KSIZE - ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) - ENDDO -ENDIF -DO JL=1, KSIZE - ZDRYH(JL) = ZHAIL(JL) * & - & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) - & MAX(0., -SIGN(1., -ZRDRYH_INIT(JL))) * & !WHERE(ZRDRYH_INIT(:)>0.) - & MAX(0., -SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)) - & - &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)))) -ENDDO -! -ZRDRYHG(:)=0. -IF(LCONVHG)THEN - WHERE(ZDRYH(:)==1.) - ZRDRYHG(:)=ZRDRYH_INIT(:)*ZRWETH_INIT(:)/(ZRDRYH_INIT(:)+ZRWETH_INIT(:)) - END WHERE -ENDIF -DO JL=1, KSIZE - PRCWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRCWETH) - PRIWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRIWETH) - PRSWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRSWETH) - PRGWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRGWETH) - !Collected minus aggregated - PRRWETH(JL) = ZWETH(JL) * (ZRWETH_INIT(JL) - PRH_TEND(JL, IRIWETH) - & - PRH_TEND(JL, IRSWETH) - PRH_TEND(JL, IRGWETH) - & - PRH_TEND(JL, IRCWETH)) - - PRCDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRCWETH) - PRIDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRIDRYH) - PRSDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRSDRYH) - PRRDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRRWETH) - PRGDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRGDRYH) - PRDRYHG(JL) = ZDRYH(JL) * ZRDRYHG(JL) - - PA_RC(JL) = PA_RC(JL) - PRCWETH(JL) - PA_RI(JL) = PA_RI(JL) - PRIWETH(JL) - PA_RS(JL) = PA_RS(JL) - PRSWETH(JL) - PA_RG(JL) = PA_RG(JL) - PRGWETH(JL) - PA_RH(JL) = PA_RH(JL) + PRCWETH(JL)+PRIWETH(JL)+PRSWETH(JL)+PRGWETH(JL)+PRRWETH(JL) - PA_RR(JL) = PA_RR(JL) - PRRWETH(JL) - PA_TH(JL) = PA_TH(JL) + (PRRWETH(JL)+PRCWETH(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA_RC(JL) = PA_RC(JL) - PRCDRYH(JL) - PA_RI(JL) = PA_RI(JL) - PRIDRYH(JL) - PA_RS(JL) = PA_RS(JL) - PRSDRYH(JL) - PA_RR(JL) = PA_RR(JL) - PRRDRYH(JL) - PA_RG(JL) = PA_RG(JL) - PRGDRYH(JL) + PRDRYHG(JL) - PA_RH(JL) = PA_RH(JL) + PRCDRYH(JL)+PRIDRYH(JL)+PRSDRYH(JL)+& - &PRRDRYH(JL)+PRGDRYH(JL) - PRDRYHG(JL) - PA_TH(JL) = PA_TH(JL) + (PRCDRYH(JL)+PRRDRYH(JL))*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -!* 7.5 Melting of the hailstones -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRHMLTR(JL)=ZMASK(JL)*PRHMLTR(JL) - ENDDO -ELSE - DO JL=1, KSIZE - PRHMLTR(JL) = ZMASK(JL)* PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRHMLTR(:)=MIN(PRHMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) - END WHERE - ENDIF - DO JL=1, KSIZE - PRHMLTR(JL) = ZMASK(JL)* (PKA(JL)*(XTT-PT(JL)) + & - ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - *(XESTT-PRHMLTR(JL))/(XRV*PT(JL)) )) - ENDDO - WHERE(ZMASK(:)==1.) - ! - ! compute RHMLTR - ! - PRHMLTR(:) = MAX( 0.0,( -PRHMLTR(:) * & - ( X0DEPH* PLBDAH(:)**XEX0DEPH + & - X1DEPH*PCJ(:)*PLBDAH(:)**XEX1DEPH ) - & - ( PRH_TEND(:, IRCWETH)+PRH_TEND(:, IRRWETH) )* & - ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & - ( PRHODREF(:)*XLMTT ) ) - END WHERE -END IF -DO JL=1, KSIZE - PA_RR(JL) = PA_RR(JL) + PRHMLTR(JL) - PA_RH(JL) = PA_RH(JL) - PRHMLTR(JL) - PA_TH(JL) = PA_TH(JL) - PRHMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RH', 1, ZHOOK_HANDLE) -! -END SUBROUTINE ICE4_FAST_RH diff --git a/src/arome/micro/ice4_fast_rs.F90 b/src/arome/micro/ice4_fast_rs.F90 deleted file mode 100644 index 90159d294eea80aaa496006634c8b5b7fc95c547..0000000000000000000000000000000000000000 --- a/src/arome/micro/ice4_fast_rs.F90 +++ /dev/null @@ -1,440 +0,0 @@ -SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAR, PLBDAS, & - &PT, PRVT, PRCT, PRRT, PRST, & - &PRIAGGS, & - &PRCRIMSS, PRCRIMSG, PRSRIMCG, & - &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & - &PRCMLTSR, & - &PRS_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RS, PA_RG) -!! -!!** PURPOSE -!! ------- -!! Computes the fast rs processes -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE MODD_PARAM_ICE, ONLY : LEVLIMIT, CSNOWRIMING -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIAGGS ! r_i aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRACCSS ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRACCSG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSACCRG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG ! Conversion-Melting of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature -REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRS_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -! -!* 0.2 declaration of local variables -! -REAL, DIMENSION(KSIZE) :: ZRIM, ZACC, ZMASK -LOGICAL, DIMENSION(KSIZE) :: GRIM, GACC -INTEGER :: IGRIM, IGACC -REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 -REAL, DIMENSION(KSIZE) :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE -INTEGER :: JJ, JL -INTEGER :: IRCRIMS, IRCRIMSS, IRSRIMCG, IRRACCS, IRRACCSS, IRSACCRG, & - IFREEZ1, IFREEZ2 -REAL(KIND=JPRB) :: ZHOOK_HANDLE -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RS', 0, ZHOOK_HANDLE) -! -IRCRIMS=1 -IRCRIMSS=2 -IRSRIMCG=3 -IRRACCS=4 -IRRACCSS=5 -IRSACCRG=6 -IFREEZ1=7 -IFREEZ2=8 -! -!------------------------------------------------------------------------------- -! -! -!* 5.0 maximum freezing rate -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRS_TEND(JL, IFREEZ1) - PRS_TEND(JL, IFREEZ2)=ZMASK(JL) * PRS_TEND(JL, IFREEZ2) - ENDDO -ELSE - DO JL=1, KSIZE - PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRS_TEND(:, IFREEZ1)=MIN(PRS_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) - END WHERE - ENDIF - PRS_TEND(:, IFREEZ2)=0. - WHERE(ZMASK(:)==1.) - PRS_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & - (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & - *(XESTT-PRS_TEND(:, IFREEZ1))/(XRV*PT(:)) ) - PRS_TEND(:, IFREEZ1)=PRS_TEND(:, IFREEZ1)* ( X0DEPS* PLBDAS(:)**XEX0DEPS + & - X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS )/ & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - PRS_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - END WHERE -ENDIF -DO JL=1, KSIZE - !We must agregate, at least, the cold species - !And we are only interested by the freezing rate of liquid species - ZFREEZ_RATE(JL)=ZMASK(JL) * MAX(0., MAX(0., PRS_TEND(JL, IFREEZ1) + & - &PRS_TEND(JL, IFREEZ2) * PRIAGGS(JL)) - & - PRIAGGS(JL)) -ENDDO -! -!* 5.1 cloud droplet riming of the aggregates -! -DO JL=1, KSIZE - ZRIM(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & !WHERE(PRCT(:)>XRTMIN(2)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JL) -ENDDO -! -! Collection of cloud droplets by snow: this rate is used for riming (T<0) and for conversion/melting (T>0) -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRS_TEND(JL, IRCRIMS)=ZRIM(JL) * PRS_TEND(JL, IRCRIMS) - PRS_TEND(JL, IRCRIMSS)=ZRIM(JL) * PRS_TEND(JL, IRCRIMSS) - PRS_TEND(JL, IRSRIMCG)=ZRIM(JL) * PRS_TEND(JL, IRSRIMCG) - ENDDO -ELSE - PRS_TEND(:, IRCRIMS)=0. - PRS_TEND(:, IRCRIMSS)=0. - PRS_TEND(:, IRSRIMCG)=0. - GRIM(:)=ZRIM(:)==1. - IGRIM = COUNT(GRIM(:)) - ! - IF(IGRIM>0) THEN - ! - ! 5.1.1 select the PLBDAS - ! - ZVEC1(1:IGRIM) = PACK( PLBDAS(:),MASK=GRIM(:) ) - ! - ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical - ! set of Lbda_s used to tabulate some moments of the incomplete - ! gamma function - ! - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( FLOAT(NGAMINC)-0.00001, & - XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) - IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) - ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - FLOAT( IVEC2(1:IGRIM) ) - ! - ! 5.1.3 perform the linear interpolation of the normalized - ! "2+XDS"-moment of the incomplete gamma function - ! - ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW(:) = UNPACK( VECTOR=ZVEC1(1:IGRIM),MASK=GRIM,FIELD=0.0 ) - ! - ! 5.1.4 riming of the small sized aggregates - ! - WHERE (GRIM(:)) - PRS_TEND(:, IRCRIMSS) = XCRIMSS * ZZW(:) * PRCT(:) & ! RCRIMSS - * PLBDAS(:)**XEXCRIMSS & - * PRHODREF(:)**(-XCEXVT) - END WHERE - ! - ! 5.1.5 perform the linear interpolation of the normalized - ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) and - ! "XBG"-moment of the incomplete gamma function (XGAMINC_RIM4) - ! - ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW(:) = UNPACK( VECTOR=ZVEC1(1:IGRIM),MASK=GRIM,FIELD=0.0 ) - - ZVEC1(1:IGRIM) = XGAMINC_RIM4( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM4( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW2(:) = UNPACK( VECTOR=ZVEC1(1:IGRIM),MASK=GRIM,FIELD=0.0) - ! - ! 5.1.6 riming-conversion of the large sized aggregates into graupeln - ! - ! - WHERE(GRIM(:)) - PRS_TEND(:, IRCRIMS)=XCRIMSG * PRCT(:) & ! RCRIMS - * PLBDAS(:)**XEXCRIMSG & - * PRHODREF(:)**(-XCEXVT) - ZZW6(:) = PRS_TEND(:, IRCRIMS) - PRS_TEND(:, IRCRIMSS) ! RCRIMSG - END WHERE - - IF(CSNOWRIMING=='M90 ')THEN - !Murakami 1990 - WHERE(GRIM(:)) - PRS_TEND(:, IRSRIMCG)=XSRIMCG * PLBDAS(:)**XEXSRIMCG*(1.0-ZZW(:)) - PRS_TEND(:, IRSRIMCG)=ZZW6(:)*PRS_TEND(:, IRSRIMCG)/ & - MAX(1.E-20, & - XSRIMCG3*XSRIMCG2*PLBDAS(:)**XEXSRIMCG2*(1.-ZZW2(:)) - & - XSRIMCG3*PRS_TEND(:, IRSRIMCG)) - END WHERE - ELSE - PRS_TEND(:, IRSRIMCG)=0. - END IF - ENDIF -ENDIF -! -DO JL=1, KSIZE - ! More restrictive RIM mask to be used for riming by negative temperature only - ZRIM(JL)=ZRIM(JL) * & - &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) - PRCRIMSS(JL)=ZRIM(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRCRIMSS)) - ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSS(JL)) - ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL))) ! proportion we are able to freeze - PRCRIMSG(JL) = ZRIM(JL) * ZZW(JL) * MAX(0., PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL)) ! RCRIMSG - ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSG(JL)) - PRSRIMCG(JL) = ZRIM(JL) * ZZW(JL) * PRS_TEND(JL, IRSRIMCG) - - PRSRIMCG(JL) = PRSRIMCG(JL) * MAX(0., -SIGN(1., -PRCRIMSG(JL))) - PRCRIMSG(JL)=MAX(0., PRCRIMSG(JL)) - - PA_RC(JL) = PA_RC(JL) - PRCRIMSS(JL) - PA_RS(JL) = PA_RS(JL) + PRCRIMSS(JL) - PA_TH(JL) = PA_TH(JL) + PRCRIMSS(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA_RC(JL) = PA_RC(JL) - PRCRIMSG(JL) - PA_RS(JL) = PA_RS(JL) - PRSRIMCG(JL) - PA_RG(JL) = PA_RG(JL) + PRCRIMSG(JL)+PRSRIMCG(JL) - PA_TH(JL) = PA_TH(JL) + PRCRIMSG(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -!* 5.2 rain accretion onto the aggregates -! -DO JL=1, KSIZE - ZACC(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & !WHERE(PRRT(:)>XRTMIN(3)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRS_TEND(JL, IRRACCS)=ZACC(JL) * PRS_TEND(JL, IRRACCS) - PRS_TEND(JL, IRRACCSS)=ZACC(JL) * PRS_TEND(JL, IRRACCSS) - PRS_TEND(JL, IRSACCRG)=ZACC(JL) * PRS_TEND(JL, IRSACCRG) - ENDDO -ELSE - PRS_TEND(:, IRRACCS)=0. - PRS_TEND(:, IRRACCSS)=0. - PRS_TEND(:, IRSACCRG)=0. - GACC(:)=ZACC(:)==1. - IGACC = COUNT(GACC(:)) - IF(IGACC>0)THEN - ! - ! - ! 5.2.1 select the (PLBDAS,PLBDAR) couplet - ! - ZVEC1(1:IGACC) = PACK( PLBDAS(:),MASK=GACC(:) ) - ZVEC2(1:IGACC) = PACK( PLBDAR(:),MASK=GACC(:) ) - ! - ! 5.2.2 find the next lower indice for the PLBDAS and for the PLBDAR - ! in the geometrical set of (Lbda_s,Lbda_r) couplet use to - ! tabulate the RACCSS-kernel - ! - ZVEC1(1:IGACC) = MAX( 1.00001, MIN( FLOAT(NACCLBDAS)-0.00001, & - XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) - IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) - ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - FLOAT( IVEC1(1:IGACC) ) - ! - ZVEC2(1:IGACC) = MAX( 1.00001, MIN( FLOAT(NACCLBDAR)-0.00001, & - XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) - IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) - ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - FLOAT( IVEC2(1:IGACC) ) - ! - ! 5.2.3 perform the bilinear interpolation of the normalized - ! RACCSS-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGACC),MASK=GACC,FIELD=0.0 ) - ! - ! 5.2.4 raindrop accretion on the small sized aggregates - ! - WHERE(GACC(:)) - ZZW6(:) = & !! coef of RRACCS - XFRACCSS*( PLBDAS(:)**XCXS )*( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRACCS1/((PLBDAS(:)**2) ) + & - XLBRACCS2/( PLBDAS(:) * PLBDAR(:) ) + & - XLBRACCS3/( (PLBDAR(:)**2)) )/PLBDAR(:)**4 - PRS_TEND(:, IRRACCSS) =ZZW(:)*ZZW6(:) - END WHERE - ! - ! 5.2.4b perform the bilinear interpolation of the normalized - ! RACCS-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGACC),MASK=GACC(:),FIELD=0.0 ) - WHERE(GACC(:)) - PRS_TEND(:, IRRACCS) = ZZW(:)*ZZW6(:) - END WHERE - ! 5.2.5 perform the bilinear interpolation of the normalized - ! SACCRG-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & - - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & - * ZVEC2(JJ) & - - ( XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & - - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & - * (ZVEC2(JJ) - 1.0) - END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGACC),MASK=GACC,FIELD=0.0 ) - ! - ! 5.2.6 raindrop accretion-conversion of the large sized aggregates - ! into graupeln - ! - WHERE(GACC(:)) - PRS_TEND(:, IRSACCRG) = XFSACCRG*ZZW(:)* & ! RSACCRG - ( PLBDAS(:)**(XCXS-XBS) )*( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBSACCR1/((PLBDAR(:)**2) ) + & - XLBSACCR2/( PLBDAR(:) * PLBDAS(:) ) + & - XLBSACCR3/( (PLBDAS(:)**2)) )/PLBDAR(:) - END WHERE - ENDIF -ENDIF -! -DO JL=1, KSIZE - ! More restrictive ACC mask to be used for accretion by negative temperature only - ZACC(JL) = ZACC(JL) * & - &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) - PRRACCSS(JL)=ZACC(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRRACCSS)) - ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRRACCSS(JL)) - ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRRACCS)-PRRACCSS(JL))) ! proportion we are able to freeze - PRRACCSG(JL)=ZACC(JL)*ZZW(JL) * MAX(0., PRS_TEND(JL, IRRACCS)-PRRACCSS(JL)) - ZFREEZ_RATE(JL) = MAX(0., ZFREEZ_RATE(JL)-PRRACCSG(JL)) - PRSACCRG(JL)=ZACC(JL)*ZZW(JL) * PRS_TEND(JL, IRSACCRG) - - PRSACCRG(JL) = PRSACCRG(JL) * MAX(0., -SIGN(1., -PRRACCSG(JL))) - PRRACCSG(JL)=MAX(0., PRRACCSG(JL)) - - PA_RR(JL) = PA_RR(JL) - PRRACCSS(JL) - PA_RS(JL) = PA_RS(JL) + PRRACCSS(JL) - PA_TH(JL) = PA_TH(JL) + PRRACCSS(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA_RR(JL) = PA_RR(JL) - PRRACCSG(JL) - PA_RS(JL) = PA_RS(JL) - PRSACCRG(JL) - PA_RG(JL) = PA_RG(JL) + PRRACCSG(JL)+PRSACCRG(JL) - PA_TH(JL) = PA_TH(JL) + PRRACCSG(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -! -!* 5.3 Conversion-Melting of the aggregates -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRSMLTG(JL)=ZMASK(JL)*PRSMLTG(JL) - PRCMLTSR(JL)=ZMASK(JL)*PRCMLTSR(JL) - ENDDO -ELSE - DO JL=1, KSIZE - PRSMLTG(JL)=ZMASK(JL)*PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRSMLTG(:)=MIN(PRSMLTG(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) - END WHERE - ENDIF - DO JL=1, KSIZE - PRSMLTG(JL)=ZMASK(JL)*( & - & PKA(JL)*(XTT-PT(JL)) + & - & ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - & *(XESTT-PRSMLTG(JL))/(XRV*PT(JL)) ) & - &) - ENDDO - PRCMLTSR(:) = 0. - WHERE(ZMASK(:)==1.) - ! - ! compute RSMLT - ! - PRSMLTG(:) = XFSCVMG*MAX( 0.0,( -PRSMLTG(:) * & - ( X0DEPS* PLBDAS(:)**XEX0DEPS + & - X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) - & - ( PRS_TEND(:, IRCRIMS) + PRS_TEND(:, IRRACCS) ) * & - ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & - ( PRHODREF(:)*XLMTT ) ) - ! When T < XTT, rc is collected by snow (riming) to produce snow and graupel - ! When T > XTT, if riming was still enabled, rc would produce snow and graupel with snow becomming graupel (conversion/melting) and graupel becomming rain (melting) - ! To insure consistency when crossing T=XTT, rc collected with T>XTT must be transformed in rain. - ! rc cannot produce iced species with a positive temperature but is still collected with a good efficiency by snow - PRCMLTSR(:) = PRS_TEND(:, IRCRIMS) ! both species are liquid, no heat is exchanged - END WHERE -ENDIF -DO JL=1, KSIZE - ! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT) - ! because the graupeln produced by this process are still icy!!! - PA_RS(JL) = PA_RS(JL) - PRSMLTG(JL) - PA_RG(JL) = PA_RG(JL) + PRSMLTG(JL) - PA_RC(JL) = PA_RC(JL) - PRCMLTSR(JL) - PA_RR(JL) = PA_RR(JL) + PRCMLTSR(JL) -ENDDO - -IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RS', 1, ZHOOK_HANDLE) -! -END SUBROUTINE ICE4_FAST_RS diff --git a/src/arome/micro/ice4_tendencies.F90 b/src/arome/micro/ice4_tendencies.F90 index d51e07a908c107535ec7b52ae761a7f57f796310..aac00c1c76c1f7c2a583f459cf2fe69f8a307c1c 100644 --- a/src/arome/micro/ice4_tendencies.F90 +++ b/src/arome/micro/ice4_tendencies.F90 @@ -47,11 +47,11 @@ USE MODI_ICE4_RIMLTC USE MODE_ICE4_RSRIMCG_OLD, ONLY: ICE4_RSRIMCG_OLD USE MODI_ICE4_COMPUTE_PDF USE MODI_ICE4_RAINFR_VERT -USE MODI_ICE4_SLOW -USE MODI_ICE4_WARM -USE MODI_ICE4_FAST_RS -USE MODI_ICE4_FAST_RG -USE MODI_ICE4_FAST_RH +USE MODE_ICE4_SLOW, ONLY: ICE4_SLOW +USE MODE_ICE4_WARM, ONLY: ICE4_WARM +USE MODE_ICE4_FAST_RS, ONLY: ICE4_FAST_RS +USE MODE_ICE4_FAST_RG, ONLY: ICE4_FAST_RG +USE MODE_ICE4_FAST_RH, ONLY: ICE4_FAST_RH USE MODE_ICE4_FAST_RI, ONLY: ICE4_FAST_RI USE PARKIND1, ONLY : JPRB @@ -174,6 +174,7 @@ REAL, DIMENSION(KSIZE) :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & & ZRF, & & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, & & ZRGSI, ZRGSI_MR +REAL, DIMENSION(KSIZE) :: PHLI_HCF REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT3D INTEGER :: JL REAL, DIMENSION(KSIZE) :: ZWETG ! 1. if graupel growths in wet mode, 0. otherwise @@ -343,11 +344,12 @@ IF(KSIZE>0) THEN ENDIF ! ! +PHLI_HCF=1 CALL ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, ZT, & &PSSI, PLVFACT, PLSFACT, & &ZRVT, ZRCT, ZRIT, ZRST, ZRGT, & &ZLBDAS, ZLBDAG, & - &ZAI, ZCJ, & + &ZAI, ZCJ, PHLI_HCF, ZRIT, & !!!!!!! en attendant phasage plus complet &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG) ! @@ -380,7 +382,7 @@ END IF !* 4. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_s ! ---------------------------------------------- ! -CALL ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & +CALL ICE4_FAST_RS(KSIZE, KSIZE, LDSOFT, PCOMPUTE, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &ZDV, ZKA, ZCJ, & &ZLBDAR, ZLBDAS, & @@ -403,7 +405,7 @@ DO JL=1, KSIZE & PRSACCRG(JL) + PRCRIMSG(JL) + PRSRIMCG(JL) ZRGSI_MR(JL) = PRRHONG_MR(JL) + PRSRIMCG_MR(JL) ENDDO -CALL ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & +CALL ICE4_FAST_RG(KSIZE, KSIZE, LDSOFT, PCOMPUTE, KRR, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &ZDV, ZKA, ZCJ, PCIT, & &ZLBDAR, ZLBDAS, ZLBDAG, & @@ -422,7 +424,7 @@ CALL ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & ! ---------------------------------------------- ! IF (KRR==7) THEN - CALL ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, ZWETG, & + CALL ICE4_FAST_RH(KSIZE, KSIZE, LDSOFT, PCOMPUTE, ZWETG, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &ZDV, ZKA, ZCJ, & &ZLBDAS, ZLBDAG, ZLBDAR, ZLBDAH, & diff --git a/src/arome/micro/ice4_warm.F90 b/src/arome/micro/ice4_warm.F90 deleted file mode 100644 index e08ff2a6c4db60fd3b14ba17ad78bb11bfba9e06..0000000000000000000000000000000000000000 --- a/src/arome/micro/ice4_warm.F90 +++ /dev/null @@ -1,274 +0,0 @@ -SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & - &PRHODREF, PLVFACT, PT, PPRES, PTHT, & - &PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, & - &PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & - &PCF, PRF, & - &PRVT, PRCT, PRRT, & - &PRCAUTR, PRCACCR, PRREVAV, & - &PA_TH, PA_RV, PA_RC, PA_RR) -!! -!!** PURPOSE -!! ------- -!! Computes the warm process -!! -!! AUTHOR -!! ------ -!! S. Riette from the plitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -CHARACTER*80, INTENT(IN) :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion -CHARACTER*80, INTENT(IN) :: HSUBG_RR_EVAP ! subgrid rr evaporation -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR_RF!like PLBDAR but for the Rain Fraction part -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRF ! Rain fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCAUTR ! Autoconversion of r_c for r_r production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCACCR ! Accretion of r_c for r_r production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRREVAV ! Evaporation of r_r -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -! -!* 0.2 declaration of local variables -! -REAL, DIMENSION(KSIZE) :: ZZW2, ZZW3, ZZW4 -REAL, DIMENSION(KSIZE) :: ZUSW ! Undersaturation over water -REAL, DIMENSION(KSIZE) :: ZTHLT ! Liquid potential temperature -REAL :: ZTIMAUTIC -REAL(KIND=JPRB) :: ZHOOK_HANDLE -REAL, DIMENSION(KSIZE) :: ZMASK, ZMASK1, ZMASK2 -INTEGER :: JL -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_WARM', 0, ZHOOK_HANDLE) -! -! -!------------------------------------------------------------------------------- -! -!* 4.2 compute the autoconversion of r_c for r_r production: RCAUTR -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) - &MAX(0., -SIGN(1., -PHLC_HCF(JL))) * & ! PHLC_HCF(:) .GT. 0. - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRCAUTR(JL)=PRCAUTR(JL)*ZMASK(JL) - ENDDO -ELSE - PRCAUTR(:) = 0. - WHERE(ZMASK(:)==1.) - PRCAUTR(:) = XTIMAUTC*MAX(PHLC_HRC(:)/PHLC_HCF(:) - XCRIAUTC/PRHODREF(:), 0.0) - PRCAUTR(:) = PHLC_HCF(:)*PRCAUTR(:) - END WHERE -ENDIF -DO JL=1, KSIZE - PA_RC(JL) = PA_RC(JL) - PRCAUTR(JL) - PA_RR(JL) = PA_RR(JL) + PRCAUTR(JL) -ENDDO -! -! -!* 4.3 compute the accretion of r_c for r_r production: RCACCR -! -IF (HSUBG_RC_RR_ACCR=='NONE') THEN - !CLoud water and rain are diluted over the grid box - DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &PCOMPUTE(JL) - ENDDO - IF(LDSOFT) THEN - DO JL=1, KSIZE - PRCACCR(JL)=PRCACCR(JL) * ZMASK(JL) - ENDDO - ELSE - PRCACCR(:) = 0. - WHERE(ZMASK(:)==1.) - PRCACCR(:) = XFCACCR * PRCT(:) & - * PLBDAR(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) - END WHERE - ENDIF - -ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN - !Cloud water is concentrated over its fraction with possibly to parts with high and low content as set for autoconversion - !Rain is concnetrated over its fraction - !Rain in high content area fraction: PHLC_HCF - !Rain in low content area fraction: - ! if PRF<PCF (rain is entirely falling in cloud): PRF-PHLC_HCF - ! if PRF>PCF (rain is falling in cloud and in clear sky): PCF-PHLC_HCF - ! => min(PCF, PRF)-PHLC_HCF - DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &PCOMPUTE(JL) - ZMASK1(JL)=ZMASK(JL) * & - &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) - &MAX(0., -SIGN(1., -PHLC_HCF(JL))) ! PHLC_HCF(:)>0. - ZMASK2(JL)=ZMASK(JL) * & - &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_LRC(JL))) * & ! PHLC_LRC(:)>XRTMIN(2) - &MAX(0., -SIGN(1., -PHLC_LCF(JL))) ! PHLC_LCF(:)>0. - ENDDO - IF(LDSOFT) THEN - DO JL=1, KSIZE - PRCACCR(JL)=PRCACCR(JL) * MIN(1., ZMASK1(JL)+ZMASK2(JL)) - ENDDO - ELSE - PRCACCR(:)=0. - WHERE(ZMASK1(:)==1.) - !Accretion due to rain falling in high cloud content - PRCACCR(:) = XFCACCR * ( PHLC_HRC(:)/PHLC_HCF(:) ) & - * PLBDAR_RF(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) & - * PHLC_HCF - END WHERE - WHERE(ZMASK2(:)==1.) - !We add acrretion due to rain falling in low cloud content - PRCACCR(:) = PRCACCR(:) + XFCACCR * ( PHLC_LRC(:)/PHLC_LCF(:) ) & - * PLBDAR_RF(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) & - * (MIN(PCF(:), PRF(:))-PHLC_HCF(:)) - END WHERE - ENDIF -ELSE - !wrong HSUBG_RC_RR_ACCR case - CALL ABORT - STOP 'wrong HSUBG_RC_RR_ACCR case' -ENDIF -DO JL=1, KSIZE - PA_RC(JL) = PA_RC(JL) - PRCACCR(JL) - PA_RR(JL) = PA_RR(JL) + PRCACCR(JL) -ENDDO -! -!* 4.4 compute the evaporation of r_r: RREVAV -! -IF (HSUBG_RR_EVAP=='NONE') THEN - DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &MAX(0., SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)<=XRTMIN(2) - &PCOMPUTE(JL) - ENDDO - IF(LDSOFT) THEN - DO JL=1, KSIZE - PRREVAV(JL)=PRREVAV(JL)*ZMASK(JL) - ENDDO - ELSE - PRREVAV(:) = 0. - !Evaporation only when there's no cloud (RC must be 0) - WHERE(ZMASK(:)==1.) - PRREVAV(:) = EXP( XALPW - XBETAW/PT(:) - XGAMW*ALOG(PT(:) ) ) ! es_w - ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) ) - ! Undersaturation over water - PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(PT(:)-XTT) )**2 / ( PKA(:)*XRV*PT(:)**2 ) & - + ( XRV*PT(:) ) / ( PDV(:)*PRREVAV(:) ) - PRREVAV(:) = ( MAX( 0.0,ZUSW(:) )/(PRHODREF(:)*PRREVAV(:)) ) * & - ( X0EVAR*PLBDAR(:)**XEX0EVAR+X1EVAR*PCJ(:)*PLBDAR(:)**XEX1EVAR ) - END WHERE - ENDIF - -ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN - !Evaporation in clear sky part - !With CLFR, rain is diluted over the grid box - !With PRFR, rain is concentrated in its fraction - !Use temperature and humidity in clear sky part like Bechtold et al. (1993) - IF (HSUBG_RR_EVAP=='CLFR') THEN - ZZW4(:)=1. !Precipitation fraction - ZZW3(:)=PLBDAR(:) - ELSE - ZZW4(:)=PRF(:) !Precipitation fraction - ZZW3(:)=PLBDAR_RF(:) - ENDIF - - !ATTENTION - !Il faudrait recalculer les variables PKA, PDV, PCJ en tenant compte de la température T^u - !Ces variables devraient être sorties de rain_ice_slow et on mettrait le calcul de T^u, T^s - !et plusieurs versions (comme actuellement, en ciel clair, en ciel nuageux) de PKA, PDV, PCJ dans rain_ice - !On utiliserait la bonne version suivant l'option NONE, CLFR... dans l'évaporation et ailleurs - DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &MAX(0., -SIGN(1., PCF(JL)-ZZW4(JL))) * & ! ZZW4(:) > PCF(:) - &PCOMPUTE(JL) - ENDDO - IF(LDSOFT) THEN - DO JL=1, KSIZE - PRREVAV(JL)=PRREVAV(JL)*ZMASK(JL) - ENDDO - ELSE - PRREVAV(:) = 0. - WHERE(ZMASK(:)==1) - ! outside the cloud (environment) the use of T^u (unsaturated) instead of T - ! Bechtold et al. 1993 - ! - ! T_l - ZTHLT(:) = PTHT(:) - XLVTT*PTHT(:)/XCPD/PT(:)*PRCT(:) - ! - ! T^u = T_l = theta_l * (T/theta) - ZZW2(:) = ZTHLT(:) * PT(:) / PTHT(:) - ! - ! es_w with new T^u - PRREVAV(:) = EXP( XALPW - XBETAW/ZZW2(:) - XGAMW*ALOG(ZZW2(:) ) ) - ! - ! S, Undersaturation over water (with new theta^u) - ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) ) - ! - PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(ZZW2(:)-XTT) )**2 / ( PKA(:)*XRV*ZZW2(:)**2 ) & - + ( XRV*ZZW2(:) ) / ( PDV(:)*PRREVAV(:) ) - ! - PRREVAV(:) = MAX( 0.0,ZUSW(:) )/(PRHODREF(:)*PRREVAV(:)) * & - ( X0EVAR*ZZW3(:)**XEX0EVAR+X1EVAR*PCJ(:)*ZZW3(:)**XEX1EVAR ) - ! - PRREVAV(:) = PRREVAV(:)*(ZZW4(:)-PCF(:)) - END WHERE - ENDIF - -ELSE - !wrong HSUBG_RR_EVAP case - CALL ABORT - STOP 'wrong HSUBG_RR_EVAP case' -END IF -DO JL=1, KSIZE - PA_RR(JL) = PA_RR(JL) - PRREVAV(JL) - PA_RV(JL) = PA_RV(JL) + PRREVAV(JL) - PA_TH(JL) = PA_TH(JL) - PRREVAV(JL)*PLVFACT(JL) -ENDDO -! -IF (LHOOK) CALL DR_HOOK('ICE4_WARM', 1, ZHOOK_HANDLE) -! -END SUBROUTINE ICE4_WARM diff --git a/src/arome/micro/modi_ice4_fast_rg.F90 b/src/arome/micro/modi_ice4_fast_rg.F90 deleted file mode 100644 index 801d8c2d1bb8afcaaa8c064c7d93720b5f5ccbd7..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_fast_rg.F90 +++ /dev/null @@ -1,66 +0,0 @@ -MODULE MODI_ICE4_FAST_RG -INTERFACE -SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, PCIT, & - &PLBDAR, PLBDAS, PLBDAG, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - &PRGSI, PRGSI_MR, & - &PWETG, & - &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & - &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & - &PRG_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, PB_RG, PB_RH) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI ! Graupel tendency by other processes -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI_MR ! Graupel mr change by other processes -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRWETGH ! Conversion of graupel into hail -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR ! Melting of the graupel -REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH -END SUBROUTINE ICE4_FAST_RG -END INTERFACE -END MODULE MODI_ICE4_FAST_RG diff --git a/src/arome/micro/modi_ice4_fast_rh.F90 b/src/arome/micro/modi_ice4_fast_rh.F90 deleted file mode 100644 index 5cd5bc4ded74b0f9851930f69cd80e272bf1987b..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_fast_rh.F90 +++ /dev/null @@ -1,58 +0,0 @@ -MODULE MODI_ICE4_FAST_RH -INTERFACE -SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAS, PLBDAG, PLBDAR, PLBDAH, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & - &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & - &PRH_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the rain distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAH ! Slope parameter of the hail distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRDRYHG ! Conversion of hailstone into graupel -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR ! Melting of the hailstones -REAL, DIMENSION(KSIZE, 10), INTENT(INOUT) :: PRH_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -END SUBROUTINE ICE4_FAST_RH -END INTERFACE -END MODULE MODI_ICE4_FAST_RH diff --git a/src/arome/micro/modi_ice4_fast_rs.F90 b/src/arome/micro/modi_ice4_fast_rs.F90 deleted file mode 100644 index f27c670521e618f2df3b5e3208b8bd3694190c81..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_fast_rs.F90 +++ /dev/null @@ -1,49 +0,0 @@ -MODULE MODI_ICE4_FAST_RS -INTERFACE -SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAR, PLBDAS, & - &PT, PRVT, PRCT, PRRT, PRST, & - &PRIAGGS, & - &PRCRIMSS, PRCRIMSG, PRSRIMCG, & - &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & - &PRCMLTSR, & - &PRS_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RS, PA_RG) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIAGGS ! r_i aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRACCSS ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRACCSG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSACCRG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG ! Conversion-Melting of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature -REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRS_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -END SUBROUTINE ICE4_FAST_RS -END INTERFACE -END MODULE MODI_ICE4_FAST_RS diff --git a/src/arome/micro/modi_ice4_warm.F90 b/src/arome/micro/modi_ice4_warm.F90 deleted file mode 100644 index 4e6e5c4c7db149b654d2d4eac9ea2d59b5647c1d..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_warm.F90 +++ /dev/null @@ -1,45 +0,0 @@ -MODULE MODI_ICE4_WARM -INTERFACE -SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & - &PRHODREF, PLVFACT, PT, PPRES, PTHT, & - &PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, & - &PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & - &PCF, PRF, & - &PRVT, PRCT, PRRT, & - &PRCAUTR, PRCACCR, PRREVAV, & - &PA_TH, PA_RV, PA_RC, PA_RR) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -CHARACTER*80, INTENT(IN) :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion -CHARACTER*80, INTENT(IN) :: HSUBG_RR_EVAP ! subgrid rr evaporation -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR_RF!like PLBDAR but for the Rain Fraction part -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRF ! Rain fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCAUTR ! Autoconversion of r_c for r_r production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCACCR ! Accretion of r_c for r_r production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRREVAV ! Evaporation of r_r -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -END SUBROUTINE ICE4_WARM -END INTERFACE -END MODULE MODI_ICE4_WARM diff --git a/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rg.F90 b/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rg.F90 deleted file mode 100644 index 98fd4c7484036e911ee74001ffde5d78970fcd52..0000000000000000000000000000000000000000 --- a/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rg.F90 +++ /dev/null @@ -1,66 +0,0 @@ -MODULE MODI_ICE4_FAST_RG -INTERFACE -SUBROUTINE ICE4_FAST_RG(KPROMA,KSIZE, LDSOFT, PCOMPUTE, KRR, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, PCIT, & - &PLBDAR, PLBDAS, PLBDAG, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - &PRGSI, PRGSI_MR, & - &PWETG, & - &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & - &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & - &PRG_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, PB_RG, PB_RH) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KPROMA,KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI ! Graupel tendency by other processes -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI_MR ! Graupel mr change by other processes -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRWETGH ! Conversion of graupel into hail -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR ! Melting of the graupel -REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH -END SUBROUTINE ICE4_FAST_RG -END INTERFACE -END MODULE MODI_ICE4_FAST_RG diff --git a/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rh.F90 b/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rh.F90 deleted file mode 100644 index a0d8e04b16271f2cb9f745ffe87badfa2d5bd18c..0000000000000000000000000000000000000000 --- a/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rh.F90 +++ /dev/null @@ -1,58 +0,0 @@ -MODULE MODI_ICE4_FAST_RH -INTERFACE -SUBROUTINE ICE4_FAST_RH(KPROMA,KSIZE, LDSOFT, PCOMPUTE, PWETG, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAS, PLBDAG, PLBDAR, PLBDAH, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & - &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & - &PRH_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KPROMA,KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the rain distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAH ! Slope parameter of the hail distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRDRYHG ! Conversion of hailstone into graupel -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR ! Melting of the hailstones -REAL, DIMENSION(KPROMA, 10), INTENT(INOUT) :: PRH_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -END SUBROUTINE ICE4_FAST_RH -END INTERFACE -END MODULE MODI_ICE4_FAST_RH diff --git a/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rs.F90 b/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rs.F90 deleted file mode 100644 index 4f16b6e1e6083d2807bc7ecd40d5703ee8ed18b0..0000000000000000000000000000000000000000 --- a/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_fast_rs.F90 +++ /dev/null @@ -1,49 +0,0 @@ -MODULE MODI_ICE4_FAST_RS -INTERFACE -SUBROUTINE ICE4_FAST_RS(KPROMA,KSIZE, LDSOFT, PCOMPUTE, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAR, PLBDAS, & - &PT, PRVT, PRCT, PRRT, PRST, & - &PRIAGGS, & - &PRCRIMSS, PRCRIMSG, PRSRIMCG, & - &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & - &PRCMLTSR, & - &PRS_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RS, PA_RG) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KPROMA,KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIAGGS ! r_i aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRACCSS ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRACCSG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSACCRG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG ! Conversion-Melting of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature -REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRS_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -END SUBROUTINE ICE4_FAST_RS -END INTERFACE -END MODULE MODI_ICE4_FAST_RS diff --git a/src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rg.F90 b/src/common/micro/mode_ice4_fast_rg.F90 similarity index 83% rename from src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rg.F90 rename to src/common/micro/mode_ice4_fast_rg.F90 index efe09f5c70b66796b0e4a10f606ae25f480237f8..c55e068823b4dd9599b28bfc0f127434071979da 100644 --- a/src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rg.F90 +++ b/src/common/micro/mode_ice4_fast_rg.F90 @@ -1,3 +1,10 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +MODULE MODE_ICE4_FAST_RG +IMPLICIT NONE +CONTAINS SUBROUTINE ICE4_FAST_RG(KPROMA,KSIZE, LDSOFT, PCOMPUTE, KRR, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &PDV, PKA, PCJ, PCIT, & @@ -21,16 +28,23 @@ SUBROUTINE ICE4_FAST_RG(KPROMA,KSIZE, LDSOFT, PCOMPUTE, KRR, & !! MODIFICATIONS !! ------------- !! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) !! R. El Khatib 24-Aug-2021 Optimizations ! ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE MODD_PARAM_ICE, ONLY : LEVLIMIT, LNULLWETG, LWETGPOST, LCRFLIMIT +USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMW, XCI, XCL, XCPV, XESTT, XGAMI, & + & XLMTT, XLVTT, XMD, XMV, XRV, XTT, XEPSILO +USE MODD_PARAM_ICE, ONLY: LCRFLIMIT, LEVLIMIT, LNULLWETG, LWETGPOST +USE MODD_RAIN_ICE_DESCR, ONLY: XBS, XCEXVT, XCXG, XCXS, XDG, XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: NDRYLBDAG, NDRYLBDAR, NDRYLBDAS, X0DEPG, X1DEPG, XCOLEXIG, XCOLEXSG, XCOLIG, & + & XCOLSG, XDRYINTP1G, XDRYINTP1R, XDRYINTP1S, XDRYINTP2G, XDRYINTP2R, XDRYINTP2S, & + & XEX0DEPG, XEX1DEPG, XEXICFRR, XEXRCFRI, XFCDRYG, XFIDRYG, XFRDRYG, & + & XFSDRYG, XICFRR, XKER_RDRYG, XKER_SDRYG, XLBRDRYG1, XLBRDRYG2, XLBRDRYG3, & + & XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XRCFRI USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! @@ -66,16 +80,16 @@ REAL, DIMENSION(KSIZE), INTENT(OUT) :: PWETG ! 1. where graupel grows REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG ! Rain contact freezing REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRWETGH ! Conversion of graupel into hail -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH ! Conversion of graupel into hail +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR ! Melting of the graupel REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH @@ -90,7 +104,10 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH ! !* 0.2 declaration of local variables ! +INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRRDRYG=6, & + & IFREEZ1=7, IFREEZ2=8 LOGICAL, DIMENSION(KSIZE) :: GDRY +INTEGER, DIMENSION(KSIZE) :: I1 REAL, DIMENSION(KSIZE) :: ZDRY, ZDRYG, ZMASK INTEGER :: IGDRY REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 @@ -99,14 +116,6 @@ REAL, DIMENSION(KSIZE) :: ZZW, & ZRDRYG_INIT, & !Initial dry growth rate of the graupeln ZRWETG_INIT !Initial wet growth rate of the graupeln INTEGER :: JJ, JL -INTEGER, PARAMETER :: IRCDRYG=1 -INTEGER, PARAMETER :: IRIDRYG=2 -INTEGER, PARAMETER :: IRIWETG=3 -INTEGER, PARAMETER :: IRSDRYG=4 -INTEGER, PARAMETER :: IRSWETG=5 -INTEGER, PARAMETER :: IRRDRYG=6 -INTEGER, PARAMETER :: IFREEZ1=7 -INTEGER, PARAMETER :: IFREEZ2=8 REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- @@ -202,10 +211,18 @@ ELSE ENDIF ! Wet and dry collection of rs on graupel (6.2.1) -DO JL=1, KSIZE - ZDRY(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JL) +IGDRY = 0 +DO JJ = 1, KSIZE + ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) + &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &PCOMPUTE(JJ) + IF (ZDRY(JJ)>0) THEN + IGDRY = IGDRY + 1 + I1(IGDRY) = JJ + GDRY(JJ) = .TRUE. + ELSE + GDRY(JJ) = .FALSE. + END IF ENDDO IF(LDSOFT) THEN DO JL=1, KSIZE @@ -215,28 +232,28 @@ IF(LDSOFT) THEN ELSE PRG_TEND(:, IRSDRYG)=0. PRG_TEND(:, IRSWETG)=0. - GDRY(:)=ZDRY(:)==1. - IGDRY=COUNT(GDRY(:)) IF(IGDRY>0)THEN ! !* 6.2.3 select the (PLBDAG,PLBDAS) couplet ! - ZVEC1(1:IGDRY)=PACK(PLBDAG(:), MASK=GDRY(:)) - ZVEC2(1:IGDRY)=PACK(PLBDAS(:), MASK=GDRY(:)) + DO JJ = 1, IGDRY + ZVEC1(JJ) = PLBDAG(I1(JJ)) + ZVEC2(JJ) = PLBDAS(I1(JJ)) + END DO ! !* 6.2.4 find the next lower indice for the PLBDAG and for the PLBDAS ! in the geometrical set of (Lbda_g,Lbda_s) couplet use to ! tabulate the SDRYG-kernel ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN(FLOAT(NDRYLBDAG)-0.00001, & + ZVEC1(1:IGDRY)=MAX(1.00001, MIN(REAL(NDRYLBDAG)-0.00001, & XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY) ) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-FLOAT(IVEC1(1:IGDRY)) + ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( FLOAT(NDRYLBDAS)-0.00001, & + ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAS)-0.00001, & XDRYINTP1S*LOG(ZVEC2(1:IGDRY))+XDRYINTP2S)) IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-FLOAT(IVEC2(1:IGDRY)) + ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) ! !* 6.2.5 perform the bilinear interpolation of the normalized ! SDRYG-kernel @@ -249,7 +266,10 @@ ELSE - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & *(ZVEC1(JJ) - 1.0) END DO - ZZW(:)=UNPACK(VECTOR=ZVEC3(1:IGDRY), MASK=GDRY(:), FIELD=0.0) + ZZW(:) = 0. + DO JJ = 1, IGDRY + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO ! WHERE(GDRY(1:KSIZE)) PRG_TEND(1:KSIZE, IRSWETG)=XFSDRYG*ZZW(1:KSIZE) & ! RSDRYG @@ -266,40 +286,48 @@ ENDIF ! !* 6.2.6 accretion of raindrops on the graupeln ! -DO JL=1, KSIZE - ZDRY(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JL) +IGDRY = 0 +DO JJ = 1, KSIZE + ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) + &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &PCOMPUTE(JJ) + IF (ZDRY(JJ)>0) THEN + IGDRY = IGDRY + 1 + I1(IGDRY) = JJ + GDRY(JJ) = .TRUE. + ELSE + GDRY(JJ) = .FALSE. + ENDIF ENDDO IF(LDSOFT) THEN DO JL=1, KSIZE PRG_TEND(JL, IRRDRYG)=ZDRY(JL) * PRG_TEND(JL, IRRDRYG) ENDDO ELSE - GDRY(:)=ZDRY(:)==1. PRG_TEND(:, IRRDRYG)=0. - IGDRY=COUNT(GDRY(:)) ! IF(IGDRY>0) THEN ! !* 6.2.8 select the (PLBDAG,PLBDAR) couplet ! - ZVEC1(1:IGDRY)=PACK(PLBDAG(:), MASK=GDRY(:)) - ZVEC2(1:IGDRY)=PACK(PLBDAR(:), MASK=GDRY(:)) + DO JJ = 1, IGDRY + ZVEC1(JJ) = PLBDAG(I1(JJ)) + ZVEC2(JJ) = PLBDAR(I1(JJ)) + ENDDO ! !* 6.2.9 find the next lower indice for the PLBDAG and for the PLBDAR ! in the geometrical set of (Lbda_g,Lbda_r) couplet use to ! tabulate the RDRYG-kernel ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN( FLOAT(NDRYLBDAG)-0.00001, & + ZVEC1(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY)) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-FLOAT(IVEC1(1:IGDRY)) + ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( FLOAT(NDRYLBDAR)-0.00001, & + ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAR)-0.00001, & XDRYINTP1R*LOG(ZVEC2(1:IGDRY))+XDRYINTP2R)) IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-FLOAT(IVEC2(1:IGDRY)) + ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) ! !* 6.2.10 perform the bilinear interpolation of the normalized ! RDRYG-kernel @@ -312,7 +340,10 @@ ELSE - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & *(ZVEC1(JJ) - 1.0) END DO - ZZW(:)=UNPACK(VECTOR=ZVEC3(1:IGDRY), MASK=GDRY, FIELD=0.) + ZZW(:) = 0. + DO JJ = 1, IGDRY + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO ! WHERE(GDRY(1:KSIZE)) PRG_TEND(1:KSIZE, IRRDRYG) = XFRDRYG*ZZW(1:KSIZE) & ! RRDRYG @@ -392,7 +423,11 @@ ENDIF DO JL=1, KSIZE ZDRYG(JL) = ZMASK(JL) * & ! & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) +#ifdef REPRO48 & MAX(0., -SIGN(1., -ZRDRYG_INIT(JL))) * & ! WHERE(ZRDRYG_INIT(:)>0.) +#else + & MAX(0., -SIGN(1., 1.E-20-ZRDRYG_INIT(JL))) * & ! WHERE(ZRDRYG_INIT(:)>0.) +#endif & MAX(0., -SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - & &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG)))) ENDDO @@ -496,3 +531,4 @@ ENDDO IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RG', 1, ZHOOK_HANDLE) END SUBROUTINE ICE4_FAST_RG +END MODULE MODE_ICE4_FAST_RG diff --git a/src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rh.F90 b/src/common/micro/mode_ice4_fast_rh.F90 similarity index 79% rename from src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rh.F90 rename to src/common/micro/mode_ice4_fast_rh.F90 index 5bcc5de79ebd88284e880f85aa96f0000975fc3e..dc6ed246c540116021fbf3b0f8431269f924d4ff 100644 --- a/src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rh.F90 +++ b/src/common/micro/mode_ice4_fast_rh.F90 @@ -1,3 +1,10 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +MODULE MODE_ICE4_FAST_RH +IMPLICIT NONE +CONTAINS SUBROUTINE ICE4_FAST_RH(KPROMA,KSIZE, LDSOFT, PCOMPUTE, PWETG, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &PDV, PKA, PCJ, & @@ -19,16 +26,25 @@ SUBROUTINE ICE4_FAST_RH(KPROMA,KSIZE, LDSOFT, PCOMPUTE, PWETG, & !! MODIFICATIONS !! ------------- !! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) !! R. El Khatib 24-Aug-2021 Optimizations ! ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE MODD_PARAM_ICE, ONLY : LEVLIMIT, LNULLWETH, LWETHPOST, LCONVHG +USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMW, XCI, XCL, XCPV, XESTT, XGAMI, XLMTT, & + & XLVTT, XMD, XMV, XRV, XTT, XEPSILO +USE MODD_PARAM_ICE, ONLY: LCONVHG, LEVLIMIT, LNULLWETH, LWETHPOST +USE MODD_RAIN_ICE_DESCR, ONLY: XBG, XBS, XCEXVT, XCXG, XCXH, XCXS, XDH, XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: NWETLBDAG, NWETLBDAH, NWETLBDAR, NWETLBDAS, X0DEPH, X1DEPH, XCOLEXGH, XCOLEXIH, & + & XCOLGH, XCOLIH, XCOLEXSH, XCOLSH, XEX0DEPH, XEX1DEPH, XFGWETH, XFRWETH, & + & XFSWETH, XFWETH, XKER_GWETH, XKER_RWETH, XKER_SWETH, XLBGWETH1, XLBGWETH2, & + & XLBGWETH3, XLBRWETH1, XLBRWETH2, XLBRWETH3, XLBSWETH1, XLBSWETH2, XLBSWETH3, & + & XWETINTP1G, XWETINTP1H, XWETINTP1R, XWETINTP1S, XWETINTP2G, XWETINTP2H, & + & XWETINTP2R, XWETINTP2S +! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! @@ -59,17 +75,17 @@ REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRDRYHG ! Conversion of hailstone into graupel +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRDRYHG ! Conversion of hailstone into graupel REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR ! Melting of the hailstones REAL, DIMENSION(KPROMA, 10), INTENT(INOUT) :: PRH_TEND ! Individual tendencies REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH @@ -82,34 +98,23 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH ! !* 0.2 declaration of local variables ! +INTEGER, PARAMETER :: IRCWETH=1, IRRWETH=2, IRIDRYH=3, IRIWETH=4, IRSDRYH=5, IRSWETH=6, IRGDRYH=7, IRGWETH=8, & + & IFREEZ1=9, IFREEZ2=10 LOGICAL, DIMENSION(KSIZE) :: GWET REAL, DIMENSION(KSIZE) :: ZHAIL, ZWET, ZMASK, ZWETH, ZDRYH INTEGER :: IHAIL, IGWET +INTEGER, DIMENSION(KSIZE) :: I1 REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 REAL, DIMENSION(KSIZE) :: ZZW, & ZRDRYH_INIT, ZRWETH_INIT, & ZRDRYHG INTEGER :: JJ, JL -INTEGER :: IRCWETH, IRRWETH, IRIDRYH, IRIWETH, IRSDRYH, IRSWETH, IRGDRYH, IRGWETH, & - & IFREEZ1, IFREEZ2 REAL(KIND=JPRB) :: ZHOOK_HANDLE ! !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RH',0,ZHOOK_HANDLE) ! -IRCWETH=1 -IRRWETH=2 -IRIDRYH=3 -IRIWETH=4 -IRSDRYH=5 -IRSWETH=6 -IRGDRYH=7 -IRGWETH=8 -IFREEZ1=9 -IFREEZ2=10 -! -! ! !* 7.2 compute the Wet and Dry growth of hail ! @@ -152,10 +157,18 @@ ENDIF ! !* 7.2.1 accretion of aggregates on the hailstones ! -DO JL=1, KSIZE - ZWET(JL) = MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JL) +IGWET = 0 +DO JJ = 1, KSIZE + ZWET(JJ) = MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) + &PCOMPUTE(JJ) + IF (ZWET(JJ)>0) THEN + IGWET = IGWET + 1 + I1(IGWET) = JJ + GWET(JJ) = .TRUE. + ELSE + GWET(JJ) = .FALSE. + ENDIF ENDDO IF(LDSOFT) THEN DO JL=1, KSIZE @@ -165,28 +178,28 @@ IF(LDSOFT) THEN ELSE PRH_TEND(:, IRSWETH)=0. PRH_TEND(:, IRSDRYH)=0. - GWET(:)=ZWET(:)==1. - IGWET=COUNT(GWET(:)) IF(IGWET>0)THEN ! !* 7.2.3 select the (PLBDAH,PLBDAS) couplet ! - ZVEC1(1:IGWET) = PACK( PLBDAH(:),MASK=GWET(:) ) - ZVEC2(1:IGWET) = PACK( PLBDAS(:),MASK=GWET(:) ) + DO JJ = 1, IGWET + ZVEC1(JJ) = PLBDAH(I1(JJ)) + ZVEC2(JJ) = PLBDAS(I1(JJ)) + ENDDO ! !* 7.2.4 find the next lower indice for the PLBDAG and for the PLBDAS ! in the geometrical set of (Lbda_h,Lbda_s) couplet use to ! tabulate the SWETH-kernel ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAH)-0.00001, & + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAH)-0.00001, & XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) - ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - FLOAT( IVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAS)-0.00001, & + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAS)-0.00001, & XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + XWETINTP2S ) ) IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) - ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - FLOAT( IVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) ! !* 7.2.5 perform the bilinear interpolation of the normalized ! SWETH-kernel @@ -199,7 +212,10 @@ ELSE - XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGWET),MASK=GWET,FIELD=0.0 ) + ZZW(:) = 0. + DO JJ = 1, IGWET + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO ! WHERE(GWET(1:KSIZE)) PRH_TEND(1:KSIZE, IRSWETH)=XFSWETH*ZZW(1:KSIZE) & ! RSWETH @@ -215,10 +231,18 @@ ENDIF ! !* 7.2.6 accretion of graupeln on the hailstones ! -DO JL=1, KSIZE - ZWET(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JL) +IGWET = 0 +DO JJ = 1, KSIZE + ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &PCOMPUTE(JJ) + IF (ZWET(JJ)>0) THEN + IGWET = IGWET + 1 + I1(IGWET) = JJ + GWET(JJ) = .TRUE. + ELSE + GWET(JJ) = .FALSE. + END IF ENDDO IF(LDSOFT) THEN DO JL=1, KSIZE @@ -228,28 +252,28 @@ IF(LDSOFT) THEN ELSE PRH_TEND(:, IRGWETH)=0. PRH_TEND(:, IRGDRYH)=0. - GWET(:)=ZWET(:)==1. - IGWET=COUNT(GWET(:)) IF(IGWET>0)THEN ! !* 7.2.8 select the (PLBDAH,PLBDAG) couplet ! - ZVEC1(1:IGWET) = PACK( PLBDAH(:),MASK=GWET(:) ) - ZVEC2(1:IGWET) = PACK( PLBDAG(:),MASK=GWET(:) ) + DO JJ = 1, IGWET + ZVEC1(JJ) = PLBDAH(I1(JJ)) + ZVEC2(JJ) = PLBDAG(I1(JJ)) + END DO ! !* 7.2.9 find the next lower indice for the PLBDAH and for the PLBDAG ! in the geometrical set of (Lbda_h,Lbda_g) couplet use to ! tabulate the GWETH-kernel ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAG)-0.00001, & + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) - ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - FLOAT( IVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( FLOAT(NWETLBDAG)-0.00001, & + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + XWETINTP2G ) ) IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) - ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - FLOAT( IVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) ! !* 7.2.10 perform the bilinear interpolation of the normalized ! GWETH-kernel @@ -262,7 +286,10 @@ ELSE - XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGWET),MASK=GWET,FIELD=0.0 ) + ZZW(:) = 0. + DO JJ = 1, IGWET + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO ! WHERE(GWET(1:KSIZE)) PRH_TEND(1:KSIZE, IRGWETH)=XFGWETH*ZZW(1:KSIZE) & ! RGWETH @@ -282,10 +309,18 @@ ENDIF ! !* 7.2.11 accretion of raindrops on the hailstones ! -DO JL=1, KSIZE - ZWET(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &PCOMPUTE(JL) +IGWET = 0 +DO JJ = 1, KSIZE + ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) + &PCOMPUTE(JJ) + IF (ZWET(JJ)>0) THEN + IGWET = IGWET + 1 + I1(IGWET) = JJ + GWET(JJ) = .TRUE. + ELSE + GWET(JJ) = .FALSE. + ENDIF ENDDO IF(LDSOFT) THEN DO JL=1, KSIZE @@ -293,28 +328,28 @@ IF(LDSOFT) THEN ENDDO ELSE PRH_TEND(:, IRRWETH)=0. - GWET(:)=ZWET(:)==1. - IGWET=COUNT(GWET(:)) IF(IGWET>0)THEN ! !* 7.2.12 select the (PLBDAH,PLBDAR) couplet ! - ZVEC1(1:IGWET)=PACK(PLBDAH(:), MASK=GWET(:)) - ZVEC2(1:IGWET)=PACK(PLBDAR(:), MASK=GWET(:)) + DO JJ = 1, IGWET + ZVEC1(JJ) = PLBDAH(I1(JJ)) + ZVEC2(JJ) = PLBDAR(I1(JJ)) + ENDDO ! !* 7.2.13 find the next lower indice for the PLBDAH and for the PLBDAR ! in the geometrical set of (Lbda_h,Lbda_r) couplet use to ! tabulate the RWETH-kernel ! - ZVEC1(1:IGWET)=MAX(1.00001, MIN( FLOAT(NWETLBDAH)-0.00001, & + ZVEC1(1:IGWET)=MAX(1.00001, MIN( REAL(NWETLBDAH)-0.00001, & XWETINTP1H*LOG(ZVEC1(1:IGWET))+XWETINTP2H)) IVEC1(1:IGWET)=INT(ZVEC1(1:IGWET)) - ZVEC1(1:IGWET)=ZVEC1(1:IGWET)-FLOAT(IVEC1(1:IGWET)) + ZVEC1(1:IGWET)=ZVEC1(1:IGWET)-REAL(IVEC1(1:IGWET)) ! - ZVEC2(1:IGWET)=MAX(1.00001, MIN( FLOAT(NWETLBDAR)-0.00001, & + ZVEC2(1:IGWET)=MAX(1.00001, MIN( REAL(NWETLBDAR)-0.00001, & XWETINTP1R*LOG(ZVEC2(1:IGWET))+XWETINTP2R)) IVEC2(1:IGWET)=INT(ZVEC2(1:IGWET)) - ZVEC2(1:IGWET)=ZVEC2(1:IGWET)-FLOAT(IVEC2(1:IGWET)) + ZVEC2(1:IGWET)=ZVEC2(1:IGWET)-REAL(IVEC2(1:IGWET)) ! !* 7.2.14 perform the bilinear interpolation of the normalized ! RWETH-kernel @@ -327,7 +362,10 @@ ELSE - XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & *(ZVEC1(JJ) - 1.0) END DO - ZZW(:)=UNPACK(VECTOR=ZVEC3(1:IGWET), MASK=GWET, FIELD=0.) + ZZW(:) = 0. + DO JJ = 1, IGWET + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO ! WHERE(GWET(1:KSIZE)) PRH_TEND(1:KSIZE, IRRWETH) = XFRWETH*ZZW(1:KSIZE) & ! RRWETH @@ -410,7 +448,7 @@ ENDIF DO JL=1, KSIZE ZDRYH(JL) = ZHAIL(JL) * & & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) - & MAX(0., -SIGN(1., -ZRDRYH_INIT(JL))) * & !WHERE(ZRDRYH_INIT(:)>0.) + & MAX(0., -SIGN(1., 1.E-20-ZRDRYH_INIT(JL))) * & !WHERE(ZRDRYH_INIT(:)>0.) & MAX(0., -SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)) - & &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)))) ENDDO @@ -501,3 +539,4 @@ ENDDO IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RH', 1, ZHOOK_HANDLE) ! END SUBROUTINE ICE4_FAST_RH +END MODULE MODE_ICE4_FAST_RH diff --git a/src/common/micro/mode_ice4_fast_ri.F90 b/src/common/micro/mode_ice4_fast_ri.F90 index 3315e03df3bc775a08dbd2ccd761a40d3abbba6c..0e1e1e0ff5042d73efa6574eea56b073ed4567db 100644 --- a/src/common/micro/mode_ice4_fast_ri.F90 +++ b/src/common/micro/mode_ice4_fast_ri.F90 @@ -71,7 +71,11 @@ IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RI',0,ZHOOK_HANDLE) ! DO JL=1, KSIZE LMASK = PSSI(JL)>0. .AND. PRCT(JL)>XRTMIN(2) .AND. & +#ifdef REPRO48 & PRIT(JL)>XRTMIN(4) .AND. PCIT(JL)>0. .AND. & +#else + & PRIT(JL)>XRTMIN(4) .AND. PCIT(JL)>1.E-20 .AND. & +#endif & PCOMPUTE(JL)==1 IF(LMASK) THEN IF(.NOT. LDSOFT) THEN diff --git a/src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rs.F90 b/src/common/micro/mode_ice4_fast_rs.F90 similarity index 83% rename from src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rs.F90 rename to src/common/micro/mode_ice4_fast_rs.F90 index bf90be02a2da8983eaf4a543acdd3abe4d5d78ed..9775ff1559937c0570f62c9124247c474aeb2d5b 100644 --- a/src/arome/modset_Ryad/mpa/micro/internals/ice4_fast_rs.F90 +++ b/src/common/micro/mode_ice4_fast_rs.F90 @@ -1,3 +1,10 @@ +!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +MODULE MODE_ICE4_FAST_RS +IMPLICIT NONE +CONTAINS SUBROUTINE ICE4_FAST_RS(KPROMA,KSIZE, LDSOFT, PCOMPUTE, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & &PDV, PKA, PCJ, & @@ -21,16 +28,24 @@ SUBROUTINE ICE4_FAST_RS(KPROMA,KSIZE, LDSOFT, PCOMPUTE, & !! MODIFICATIONS !! ------------- !! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) !! R. El Khatib 24-Aug-2021 Optimizations ! ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE MODD_PARAM_ICE, ONLY : LEVLIMIT, CSNOWRIMING +USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XCI, XCL, XCPV, XESTT, XGAMI, XGAMW, & + & XLMTT, XLVTT, XMD, XMV, XRV, XTT, XEPSILO +USE MODD_PARAM_ICE, ONLY: LEVLIMIT, CSNOWRIMING +USE MODD_RAIN_ICE_DESCR, ONLY: XBS, XCEXVT, XCXS, XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: NACCLBDAR, NACCLBDAS, NGAMINC, X0DEPS, X1DEPS, XACCINTP1R, XACCINTP1S, & + & XACCINTP2R, XACCINTP2S, XCRIMSG, XCRIMSS, XEX0DEPS, XEX1DEPS, XEXCRIMSG, & + & XEXCRIMSS, XEXSRIMCG, XEXSRIMCG2, XFRACCSS, XFSACCRG, XFSCVMG, XGAMINC_RIM1, & + & XGAMINC_RIM1, XGAMINC_RIM2, XGAMINC_RIM4, XKER_RACCS, XKER_RACCSS, & + & XKER_SACCRG, XLBRACCS1, XLBRACCS2, XLBRACCS3, XLBSACCR1, XLBSACCR2, XLBSACCR3, & + & XRIMINTP1, XRIMINTP2, XSRIMCG, XSRIMCG2, XSRIMCG3 USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! @@ -56,12 +71,12 @@ REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIAGGS ! r_i aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRACCSS ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRACCSG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSACCRG ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSS ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSG ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSACCRG ! Rain accretion onto the aggregates REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG ! Conversion-Melting of the aggregates REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRS_TEND ! Individual tendencies @@ -73,28 +88,21 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG ! !* 0.2 declaration of local variables ! +INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5, IRSACCRG=6, & + & IFREEZ1=7, IFREEZ2=8 REAL, DIMENSION(KSIZE) :: ZRIM, ZACC, ZMASK LOGICAL, DIMENSION(KSIZE) :: GRIM, GACC INTEGER :: IGRIM, IGACC +INTEGER, DIMENSION(KSIZE) :: I1 REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 REAL, DIMENSION(KSIZE) :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE INTEGER :: JJ, JL -INTEGER :: IRCRIMS, IRCRIMSS, IRSRIMCG, IRRACCS, IRRACCSS, IRSACCRG, & - IFREEZ1, IFREEZ2 REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RS', 0, ZHOOK_HANDLE) ! -IRCRIMS=1 -IRCRIMSS=2 -IRSRIMCG=3 -IRRACCS=4 -IRRACCSS=5 -IRSACCRG=6 -IFREEZ1=7 -IFREEZ2=8 ! !------------------------------------------------------------------------------- ! @@ -141,10 +149,18 @@ ENDDO ! !* 5.1 cloud droplet riming of the aggregates ! +IGRIM = 0 DO JL=1, KSIZE ZRIM(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & !WHERE(PRCT(:)>XRTMIN(2)) &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !WHERE(PRST(:)>XRTMIN(5)) &PCOMPUTE(JL) + IF (ZRIM(JL)>0) THEN + IGRIM = IGRIM + 1 + I1(IGRIM) = JL + GRIM(JL) = .TRUE. + ELSE + GRIM(JL) = .FALSE. + ENDIF ENDDO ! ! Collection of cloud droplets by snow: this rate is used for riming (T<0) and for conversion/melting (T>0) @@ -158,30 +174,33 @@ ELSE PRS_TEND(:, IRCRIMS)=0. PRS_TEND(:, IRCRIMSS)=0. PRS_TEND(:, IRSRIMCG)=0. - GRIM(:)=ZRIM(:)==1. - IGRIM = COUNT(GRIM(:)) ! IF(IGRIM>0) THEN ! ! 5.1.1 select the PLBDAS ! - ZVEC1(1:IGRIM) = PACK( PLBDAS(:),MASK=GRIM(:) ) + DO JJ = 1, IGRIM + ZVEC1(JJ) = PLBDAS(I1(JJ)) + END DO ! ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical ! set of Lbda_s used to tabulate some moments of the incomplete ! gamma function ! - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( FLOAT(NGAMINC)-0.00001, & + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) - ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - FLOAT( IVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) ! ! 5.1.3 perform the linear interpolation of the normalized ! "2+XDS"-moment of the incomplete gamma function ! ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW(:) = UNPACK( VECTOR=ZVEC1(1:IGRIM),MASK=GRIM,FIELD=0.0 ) + ZZW(:) = 0. + DO JJ = 1, IGRIM + ZZW(I1(JJ)) = ZVEC1(JJ) + END DO ! ! 5.1.4 riming of the small sized aggregates ! @@ -197,11 +216,17 @@ ELSE ! ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW(:) = UNPACK( VECTOR=ZVEC1(1:IGRIM),MASK=GRIM,FIELD=0.0 ) + ZZW(:) = 0. + DO JJ = 1, IGRIM + ZZW(I1(JJ)) = ZVEC1(JJ) + END DO ZVEC1(1:IGRIM) = XGAMINC_RIM4( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - XGAMINC_RIM4( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW2(:) = UNPACK( VECTOR=ZVEC1(1:IGRIM),MASK=GRIM,FIELD=0.0) + ZZW2(:) = 0. + DO JJ = 1, IGRIM + ZZW2(I1(JJ)) = ZVEC1(JJ) + END DO ! ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! @@ -246,10 +271,18 @@ ENDDO ! !* 5.2 rain accretion onto the aggregates ! -DO JL=1, KSIZE - ZACC(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & !WHERE(PRRT(:)>XRTMIN(3)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JL) +IGACC = 0 +DO JJ = 1, KSIZE + ZACC(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & !WHERE(PRRT(:)>XRTMIN(3)) + &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) + &PCOMPUTE(JJ) + IF (ZACC(JJ)>0) THEN + IGACC = IGACC + 1 + I1(IGACC) = JJ + GACC(JJ) = .TRUE. + ELSE + GACC(JJ) = .FALSE. + END IF ENDDO IF(LDSOFT) THEN DO JL=1, KSIZE @@ -261,29 +294,29 @@ ELSE PRS_TEND(:, IRRACCS)=0. PRS_TEND(:, IRRACCSS)=0. PRS_TEND(:, IRSACCRG)=0. - GACC(:)=ZACC(:)==1. - IGACC = COUNT(GACC(:)) IF(IGACC>0)THEN ! ! ! 5.2.1 select the (PLBDAS,PLBDAR) couplet ! - ZVEC1(1:IGACC) = PACK( PLBDAS(:),MASK=GACC(:) ) - ZVEC2(1:IGACC) = PACK( PLBDAR(:),MASK=GACC(:) ) + DO JJ = 1, IGACC + ZVEC1(JJ) = PLBDAS(I1(JJ)) + ZVEC2(JJ) = PLBDAR(I1(JJ)) + ENDDO ! ! 5.2.2 find the next lower indice for the PLBDAS and for the PLBDAR ! in the geometrical set of (Lbda_s,Lbda_r) couplet use to ! tabulate the RACCSS-kernel ! - ZVEC1(1:IGACC) = MAX( 1.00001, MIN( FLOAT(NACCLBDAS)-0.00001, & + ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) - ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - FLOAT( IVEC1(1:IGACC) ) + ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) ! - ZVEC2(1:IGACC) = MAX( 1.00001, MIN( FLOAT(NACCLBDAR)-0.00001, & + ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) - ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - FLOAT( IVEC2(1:IGACC) ) + ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) ! ! 5.2.3 perform the bilinear interpolation of the normalized ! RACCSS-kernel @@ -296,7 +329,10 @@ ELSE - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGACC),MASK=GACC,FIELD=0.0 ) + ZZW(:) = 0. + DO JJ = 1, IGACC + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO ! ! 5.2.4 raindrop accretion on the small sized aggregates ! @@ -320,7 +356,10 @@ ELSE - XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGACC),MASK=GACC(:),FIELD=0.0 ) + ZZW(:) = 0. + DO JJ = 1, IGACC + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO WHERE(GACC(1:KSIZE)) PRS_TEND(1:KSIZE, IRRACCS) = ZZW(1:KSIZE)*ZZW6(1:KSIZE) END WHERE @@ -335,7 +374,10 @@ ELSE - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * (ZVEC2(JJ) - 1.0) END DO - ZZW(:) = UNPACK( VECTOR=ZVEC3(1:IGACC),MASK=GACC,FIELD=0.0 ) + ZZW(:) = 0. + DO JJ = 1, IGACC + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO ! ! 5.2.6 raindrop accretion-conversion of the large sized aggregates ! into graupeln @@ -441,3 +483,4 @@ ENDDO IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RS', 1, ZHOOK_HANDLE) ! END SUBROUTINE ICE4_FAST_RS +END MODULE MODE_ICE4_FAST_RS diff --git a/src/arome/modset_Ryad/mpa/micro/internals/ice4_slow.F90 b/src/common/micro/mode_ice4_slow.F90 similarity index 83% rename from src/arome/modset_Ryad/mpa/micro/internals/ice4_slow.F90 rename to src/common/micro/mode_ice4_slow.F90 index 054e9d9ed4fcbe2ff9a89489f157729792baba0c..813138b9daa905df8fa831b10d4f60d982e0daec 100644 --- a/src/arome/modset_Ryad/mpa/micro/internals/ice4_slow.F90 +++ b/src/common/micro/mode_ice4_slow.F90 @@ -1,8 +1,15 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +MODULE MODE_ICE4_SLOW +IMPLICIT NONE +CONTAINS SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT, & &PSSI, PLVFACT, PLSFACT, & &PRVT, PRCT, PRIT, PRST, PRGT, & &PLBDAS, PLBDAG, & - &PAI, PCJ, & + &PAI, PCJ, PHLI_HCF, PHLI_HRI,& &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG) !! @@ -23,9 +30,11 @@ SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR +USE MODD_CST, ONLY: XTT +USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT, XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: X0DEPG, X0DEPS, X1DEPG, X1DEPS, XACRIAUTI, XALPHA3, XBCRIAUTI, XBETA3, & + & XCOLEXIS, XCRIAUTI, XEX0DEPG, XEX0DEPS, XEX1DEPG, XEX1DEPS, XEXIAGGS, & + & XFIAGGS, XHON, XTEXAUTI, XTIMAUTI USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! @@ -50,6 +59,8 @@ REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution REAL, DIMENSION(KSIZE), INTENT(IN) :: PAI ! Thermodynamical function REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HCF ! +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HRI ! REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCHONI ! Homogeneous nucleation REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPS ! Deposition on r_s REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAGGS ! Aggregation on r_s @@ -64,11 +75,10 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(KSIZE) :: ZCRIAUTI -REAL :: ZTIMAUTIC +REAL, DIMENSION(KSIZE) :: ZCRIAUTI, ZMASK +REAL :: ZTIMAUTIC +INTEGER :: JL REAL(KIND=JPRB) :: ZHOOK_HANDLE -REAL, DIMENSION(KSIZE) :: ZMASK -INTEGER :: JL !------------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('ICE4_SLOW', 0, ZHOOK_HANDLE) @@ -90,8 +100,13 @@ IF(LDSOFT) THEN ELSE PRCHONI(:) = 0. WHERE(ZMASK(:)==1.) +#ifdef REPRO48 PRCHONI(:) = XHON*PRHODREF(:)*PRCT(:) & *EXP( XALPHA3*(PT(:)-XTT)-XBETA3 ) +#else + PRCHONI(:) = MIN(1000.,XHON*PRHODREF(:)*PRCT(:) & + *EXP( XALPHA3*(PT(:)-XTT)-XBETA3 )) +#endif ENDWHERE ENDIF ! @@ -152,7 +167,8 @@ ENDIF !* 3.4.5 compute the autoconversion of r_i for r_s production: RIAUTS ! DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! PRIT(:)>XRTMIN(4) + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PHLI_HRI(JL))) * & ! PHLI_HRI(:)>XRTMIN(4) + &MAX(0., -SIGN(1., 1.E-20-PHLI_HCF(JL))) * & ! PHLI_HCF(:) .GT. 0. &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -165,7 +181,8 @@ ELSE ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) WHERE(ZMASK(:)==1.) PRIAUTS(:) = XTIMAUTI * EXP( XTEXAUTI*(PT(:)-XTT) ) & - * MAX( PRIT(:)-ZCRIAUTI(:),0.0 ) + * MAX( PHLI_HRI(:)/PHLI_HCF(:)-ZCRIAUTI(:),0.0 ) + PRIAUTS(:) = PHLI_HCF(:)*PRIAUTS(:) END WHERE ENDIF ! @@ -207,3 +224,4 @@ ENDDO IF (LHOOK) CALL DR_HOOK('ICE4_SLOW', 1, ZHOOK_HANDLE) ! END SUBROUTINE ICE4_SLOW +END MODULE MODE_ICE4_SLOW diff --git a/src/arome/modset_Ryad/mpa/micro/internals/ice4_warm.F90 b/src/common/micro/mode_ice4_warm.F90 similarity index 89% rename from src/arome/modset_Ryad/mpa/micro/internals/ice4_warm.F90 rename to src/common/micro/mode_ice4_warm.F90 index 05a6f687833cb25448e9ea65e5c027740dbe8c4a..8c844f09292f070d1fa220b6c3df93268549b5bc 100644 --- a/src/arome/modset_Ryad/mpa/micro/internals/ice4_warm.F90 +++ b/src/common/micro/mode_ice4_warm.F90 @@ -1,3 +1,11 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODE_ICE4_WARM +IMPLICIT NONE +CONTAINS SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & &PRHODREF, PLVFACT, PT, PPRES, PTHT, & &PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, & @@ -24,9 +32,11 @@ SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR +USE MODD_CST, ONLY: XALPW, XBETAW, XCL, XCPD, XCPV, XGAMW, XLVTT, XMD, XMV, XRV, XTT, XEPSILO +USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT, XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: X0EVAR, X1EVAR, XCRIAUTC, XEX0EVAR, XEX1EVAR, XEXCACCR, XFCACCR, XTIMAUTC +! +USE MODE_MSG USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! @@ -37,8 +47,8 @@ IMPLICIT NONE INTEGER, INTENT(IN) :: KSIZE LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -CHARACTER*80, INTENT(IN) :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion -CHARACTER*80, INTENT(IN) :: HSUBG_RR_EVAP ! subgrid rr evaporation +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_RR_EVAP ! subgrid rr evaporation REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature @@ -71,7 +81,6 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR REAL, DIMENSION(KSIZE) :: ZZW2, ZZW3, ZZW4 REAL, DIMENSION(KSIZE) :: ZUSW ! Undersaturation over water REAL, DIMENSION(KSIZE) :: ZTHLT ! Liquid potential temperature -REAL :: ZTIMAUTIC REAL(KIND=JPRB) :: ZHOOK_HANDLE REAL, DIMENSION(KSIZE) :: ZMASK, ZMASK1, ZMASK2 INTEGER :: JL @@ -86,7 +95,11 @@ IF (LHOOK) CALL DR_HOOK('ICE4_WARM', 0, ZHOOK_HANDLE) ! DO JL=1, KSIZE ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) +#ifdef REPRO48 &MAX(0., -SIGN(1., -PHLC_HCF(JL))) * & ! PHLC_HCF(:) .GT. 0. +#else + &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) * & ! PHLC_HCF(:) .GT. 1.E-20 +#endif &PCOMPUTE(JL) ENDDO IF(LDSOFT) THEN @@ -138,10 +151,18 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN &PCOMPUTE(JL) ZMASK1(JL)=ZMASK(JL) * & &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) +#ifdef REPRO48 &MAX(0., -SIGN(1., -PHLC_HCF(JL))) ! PHLC_HCF(:)>0. +#else + &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) ! PHLC_HCF(:)>1.E-20 +#endif ZMASK2(JL)=ZMASK(JL) * & &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_LRC(JL))) * & ! PHLC_LRC(:)>XRTMIN(2) +#ifdef REPRO48 &MAX(0., -SIGN(1., -PHLC_LCF(JL))) ! PHLC_LCF(:)>0. +#else + &MAX(0., -SIGN(1., 1.E-20-PHLC_LCF(JL))) ! PHLC_LCF(:)>1.E-20 +#endif ENDDO IF(LDSOFT) THEN DO JL=1, KSIZE @@ -165,9 +186,7 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN END WHERE ENDIF ELSE - !wrong HSUBG_RC_RR_ACCR case - CALL ABORT - STOP 'wrong HSUBG_RC_RR_ACCR case' + CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_WARM','wrong HSUBG_RC_RR_ACCR case') ENDIF ! !* 4.4 compute the evaporation of r_r: RREVAV @@ -252,9 +271,7 @@ ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN ENDIF ELSE - !wrong HSUBG_RR_EVAP case - CALL ABORT - STOP 'wrong HSUBG_RR_EVAP case' + CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_WARM','wrong HSUBG_RR_EVAP case') END IF ! DO JL=1, KSIZE @@ -270,5 +287,6 @@ DO JL=1, KSIZE ENDDO ! IF (LHOOK) CALL DR_HOOK('ICE4_WARM', 1, ZHOOK_HANDLE) - +! END SUBROUTINE ICE4_WARM +END MODULE MODE_ICE4_WARM diff --git a/src/mesonh/micro/ice4_fast_rg.f90 b/src/mesonh/micro/ice4_fast_rg.f90 deleted file mode 100644 index b84dda857e7a679561f062eabbe0570f7fc22408..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/ice4_fast_rg.f90 +++ /dev/null @@ -1,582 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -MODULE MODI_ICE4_FAST_RG -INTERFACE -SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, PCIT, & - &PLBDAR, PLBDAS, PLBDAG, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - &PRGSI, PRGSI_MR, & - &PWETG, & - &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & - &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & - &PRG_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, PB_RG, PB_RH) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI ! Graupel tendency by other processes -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI_MR ! Graupel mr change by other processes -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH ! Conversion of graupel into hail -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR ! Melting of the graupel -REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH -END SUBROUTINE ICE4_FAST_RG -END INTERFACE -END MODULE MODI_ICE4_FAST_RG -SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, PCIT, & - &PLBDAR, PLBDAS, PLBDAG, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - &PRGSI, PRGSI_MR, & - &PWETG, & - &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & - &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & - &PRG_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, PB_RG, PB_RH) -!! -!!** PURPOSE -!! ------- -!! Computes the fast rg processes -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMW,XCI,XCL,XCPV,XESTT,XGAMI,XLMTT,XLVTT,XMD,XMV,XRV,XTT, & - XEPSILO -USE MODD_PARAM_ICE, ONLY: LCRFLIMIT,LEVLIMIT,LNULLWETG,LWETGPOST -USE MODD_RAIN_ICE_DESCR, ONLY: XBS,XCEXVT,XCXG,XCXS,XDG,XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: NDRYLBDAG,NDRYLBDAR,NDRYLBDAS,X0DEPG,X1DEPG,XCOLEXIG,XCOLEXSG,XCOLIG,XCOLSG,XDRYINTP1G, & - XDRYINTP1R,XDRYINTP1S,XDRYINTP2G,XDRYINTP2R,XDRYINTP2S,XEX0DEPG,XEX1DEPG,XEXICFRR, & - XEXRCFRI,XFCDRYG,XFIDRYG,XFRDRYG,XFSDRYG,XICFRR,XKER_RDRYG,XKER_SDRYG,XLBRDRYG1, & - XLBRDRYG2,XLBRDRYG3,XLBSDRYG1,XLBSDRYG2,XLBSDRYG3,XRCFRI -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI ! Graupel tendency by other processes -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI_MR ! Graupel mr change by other processes -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR ! Rain contact freezing -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETG ! Graupel wet growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYG ! Graupel dry growth -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH ! Conversion of graupel into hail -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR ! Melting of the graupel -REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH -! -!* 0.2 declaration of local variables -! -INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRRDRYG=6, & - & IFREEZ1=7, IFREEZ2=8 -! -LOGICAL, DIMENSION(KSIZE) :: GDRY -INTEGER, DIMENSION(KSIZE) :: I1 -REAL, DIMENSION(KSIZE) :: ZDRY, ZDRYG, ZMASK -INTEGER :: IGDRY -REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 -REAL, DIMENSION(KSIZE) :: ZZW, & - ZRDRYG_INIT, & !Initial dry growth rate of the graupeln - ZRWETG_INIT !Initial wet growth rate of the graupeln -INTEGER :: JJ, JL -! -!------------------------------------------------------------------------------- -! -!* 6.1 rain contact freezing -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRICFRRG(JL)=ZMASK(JL) * PRICFRRG(JL) - PRRCFRIG(JL)=ZMASK(JL) * PRRCFRIG(JL) - PRICFRR(JL)=ZMASK(JL) * PRICFRR(JL) - ENDDO -ELSE - PRICFRRG(:)=0. - PRRCFRIG(:)=0. - WHERE(ZMASK(:)==1.) - PRICFRRG(:) = XICFRR*PRIT(:) & ! RICFRRG - *PLBDAR(:)**XEXICFRR & - *PRHODREF(:)**(-XCEXVT) - PRRCFRIG(:) = XRCFRI*PCIT(:) & ! RRCFRIG - * PLBDAR(:)**XEXRCFRI & - * PRHODREF(:)**(-XCEXVT-1.) - END WHERE - - IF(LCRFLIMIT) THEN - DO JL=1, KSIZE - !Comparison between heat to be released (to freeze rain) and heat sink (rain and ice temperature change) - !ZZW is the proportion of process that can take place - ZZW(JL)=(1.-ZMASK(JL)) + & ! 1. outside of mask - ZMASK(JL) * MAX(0., MIN(1., (PRICFRRG(JL)*XCI+PRRCFRIG(JL)*XCL)*(XTT-PT(JL)) / & - MAX(1.E-20, XLVTT*PRRCFRIG(JL)))) - ENDDO - ELSE - ZZW(:)=1. - ENDIF - DO JL=1, KSIZE - PRRCFRIG(JL) = ZZW(JL) * PRRCFRIG(JL) !Part of rain that can be freezed - PRICFRR(JL) = (1.-ZZW(JL)) * PRICFRRG(JL) !Part of collected pristine ice converted to rain - PRICFRRG(JL) = ZZW(JL) * PRICFRRG(JL) !Part of collected pristine ice that lead to graupel - ENDDO -ENDIF -DO JL=1, KSIZE - PA_RI(JL) = PA_RI(JL) - PRICFRRG(JL) - PRICFRR(JL) - PA_RR(JL) = PA_RR(JL) - PRRCFRIG(JL) + PRICFRR(JL) - PA_RG(JL) = PA_RG(JL) + PRICFRRG(JL) + PRRCFRIG(JL) - PA_TH(JL) = PA_TH(JL) + (PRRCFRIG(JL) - PRICFRR(JL))*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -! -!* 6.3 compute the graupel growth -! -! Wet and dry collection of rc and ri on graupel -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*PRG_TEND(JL, IRCDRYG) - ENDDO -ELSE - ZZW(:)=0. - WHERE(ZMASK(:)==1.) - ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) - END WHERE - DO JL=1, KSIZE - PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*XFCDRYG * PRCT(JL) * ZZW(JL) - ENDDO -ENDIF - -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IRIDRYG)=ZMASK(JL) * PRG_TEND(JL, IRIDRYG) - PRG_TEND(JL, IRIWETG)=ZMASK(JL) * PRG_TEND(JL, IRIWETG) - ENDDO -ELSE - PRG_TEND(:, IRIDRYG)=0. - PRG_TEND(:, IRIWETG)=0. - WHERE(ZMASK(:)==1.) - ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) - PRG_TEND(:, IRIDRYG)=XFIDRYG*EXP(XCOLEXIG*(PT(:)-XTT))*PRIT(:)*ZZW(:) - PRG_TEND(:, IRIWETG)=PRG_TEND(:, IRIDRYG) / (XCOLIG*EXP(XCOLEXIG*(PT(:)-XTT))) - END WHERE -ENDIF - -! Wet and dry collection of rs on graupel (6.2.1) -IGDRY = 0 -DO JJ = 1, SIZE(GDRY) - ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JJ) - IF (ZDRY(JJ)>0) THEN - IGDRY = IGDRY + 1 - I1(IGDRY) = JJ - GDRY(JJ) = .TRUE. - ELSE - GDRY(JJ) = .FALSE. - END IF -END DO - -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IRSDRYG)=ZDRY(JL) * PRG_TEND(JL, IRSDRYG) - PRG_TEND(JL, IRSWETG)=ZDRY(JL) * PRG_TEND(JL, IRSWETG) - ENDDO -ELSE - PRG_TEND(:, IRSDRYG)=0. - PRG_TEND(:, IRSWETG)=0. - IF(IGDRY>0)THEN - ! - !* 6.2.3 select the (PLBDAG,PLBDAS) couplet - ! - DO JJ = 1, IGDRY - ZVEC1(JJ) = PLBDAG(I1(JJ)) - ZVEC2(JJ) = PLBDAS(I1(JJ)) - END DO - ! - !* 6.2.4 find the next lower indice for the PLBDAG and for the PLBDAS - ! in the geometrical set of (Lbda_g,Lbda_s) couplet use to - ! tabulate the SDRYG-kernel - ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN(REAL(NDRYLBDAG)-0.00001, & - XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) - IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY) ) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) - ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAS)-0.00001, & - XDRYINTP1S*LOG(ZVEC2(1:IGDRY))+XDRYINTP2S)) - IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) - ! - !* 6.2.5 perform the bilinear interpolation of the normalized - ! SDRYG-kernel - ! - DO JJ=1, IGDRY - ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGDRY - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! - WHERE(GDRY(:)) - PRG_TEND(:, IRSWETG)=XFSDRYG*ZZW(:) & ! RSDRYG - / XCOLSG & - *(PLBDAS(:)**(XCXS-XBS))*( PLBDAG(:)**XCXG ) & - *(PRHODREF(:)**(-XCEXVT-1.)) & - *( XLBSDRYG1/( PLBDAG(:)**2 ) + & - XLBSDRYG2/( PLBDAG(:) * PLBDAS(:) ) + & - XLBSDRYG3/( PLBDAS(:)**2)) - PRG_TEND(:, IRSDRYG)=PRG_TEND(:, IRSWETG)*XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) - END WHERE - ENDIF -ENDIF -! -!* 6.2.6 accretion of raindrops on the graupeln -! -IGDRY = 0 -DO JJ = 1, SIZE(GDRY) - ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JJ) - IF (ZDRY(JJ)>0) THEN - IGDRY = IGDRY + 1 - I1(IGDRY) = JJ - GDRY(JJ) = .TRUE. - ELSE - GDRY(JJ) = .FALSE. - END IF -END DO - -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IRRDRYG)=ZDRY(JL) * PRG_TEND(JL, IRRDRYG) - ENDDO -ELSE - PRG_TEND(:, IRRDRYG)=0. - ! - IF(IGDRY>0) THEN - ! - !* 6.2.8 select the (PLBDAG,PLBDAR) couplet - ! - DO JJ = 1, IGDRY - ZVEC1(JJ) = PLBDAG(I1(JJ)) - ZVEC2(JJ) = PLBDAR(I1(JJ)) - END DO - ! - !* 6.2.9 find the next lower indice for the PLBDAG and for the PLBDAR - ! in the geometrical set of (Lbda_g,Lbda_r) couplet use to - ! tabulate the RDRYG-kernel - ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & - XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) - IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY)) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) - ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAR)-0.00001, & - XDRYINTP1R*LOG(ZVEC2(1:IGDRY))+XDRYINTP2R)) - IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) - ! - !* 6.2.10 perform the bilinear interpolation of the normalized - ! RDRYG-kernel - ! - DO JJ=1, IGDRY - ZVEC3(JJ)= ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGDRY - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! - WHERE(GDRY(:)) - PRG_TEND(:, IRRDRYG) = XFRDRYG*ZZW(:) & ! RRDRYG - *( PLBDAR(:)**(-4) )*( PLBDAG(:)**XCXG ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRDRYG1/( PLBDAG(:)**2 ) + & - XLBRDRYG2/( PLBDAG(:) * PLBDAR(:) ) + & - XLBRDRYG3/( PLBDAR(:)**2) ) - END WHERE - ENDIF -ENDIF - -DO JL=1, KSIZE - ZRDRYG_INIT(JL)=PRG_TEND(JL, IRCDRYG)+PRG_TEND(JL, IRIDRYG)+ & - &PRG_TEND(JL, IRSDRYG)+PRG_TEND(JL, IRRDRYG) -ENDDO - -!Freezing rate -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRG_TEND(JL, IFREEZ1) - PRG_TEND(JL, IFREEZ2)=ZMASK(JL) * PRG_TEND(JL, IFREEZ2) - ENDDO -ELSE - DO JL=1, KSIZE - PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRG_TEND(:, IFREEZ1)=MIN(PRG_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) - END WHERE - ENDIF - PRG_TEND(:, IFREEZ2)=0. - WHERE(ZMASK(:)==1.) - PRG_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & - (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & - *(XESTT-PRG_TEND(:, IFREEZ1))/(XRV*PT(:)) ) - PRG_TEND(:, IFREEZ1)=PRG_TEND(:, IFREEZ1)* ( X0DEPG* PLBDAG(:)**XEX0DEPG + & - X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG )/ & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - PRG_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - END WHERE -ENDIF -DO JL=1, KSIZE - !We must agregate, at least, the cold species - ZRWETG_INIT(JL)=ZMASK(JL) * MAX(PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG), & - &MAX(0., PRG_TEND(JL, IFREEZ1) + & - &PRG_TEND(JL, IFREEZ2) * ( & - &PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG) ))) -ENDDO - -!Growth mode -DO JL=1, KSIZE - PWETG(JL) = ZMASK(JL) * & ! - & MAX(0., SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - & - &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG)))) -ENDDO -IF(LNULLWETG) THEN - DO JL=1, KSIZE - PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRDRYG_INIT(JL))) - ENDDO -ELSE - DO JL=1, KSIZE - PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRWETG_INIT(JL))) - ENDDO -ENDIF -IF(.NOT. LWETGPOST) THEN - DO JL=1, KSIZE - PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) - ENDDO -ENDIF -DO JL=1, KSIZE - ZDRYG(JL) = ZMASK(JL) * & ! - & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) - & MAX(0., -SIGN(1., 1.E-20-ZRDRYG_INIT(JL))) * & ! WHERE(ZRDRYG_INIT(:)>0.) - & MAX(0., -SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - & - &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG)))) -ENDDO - -! Part of ZRWETG to be converted into hail -! Graupel can be produced by other processes instantaneously (inducing a mixing ratio change, PRGSI_MR) or -! as a tendency (PRWETGH) -PRWETGH(:)=0. -PRWETGH_MR(:)=0. -IF(KRR==7) THEN - WHERE(PWETG(:)==1.) - !assume a linear percent of conversion of produced graupel into hail - PRWETGH(:)=(MAX(0., PRGSI(:)+PRICFRRG(:)+PRRCFRIG(:))+ZRWETG_INIT(:))*ZRDRYG_INIT(:)/(ZRWETG_INIT(:)+ZRDRYG_INIT(:)) - PRWETGH_MR(:)=MAX(0., PRGSI_MR(:))*ZRDRYG_INIT(:)/(ZRWETG_INIT(:)+ZRDRYG_INIT(:)) - END WHERE -ENDIF - -DO JL=1, KSIZE - !Aggregated minus collected - PRRWETG(JL)=-PWETG(JL) * (PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG)+& - &PRG_TEND(JL, IRCDRYG)-ZRWETG_INIT(JL)) - PRCWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRCDRYG) - PRIWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRIWETG) - PRSWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRSWETG) - - PRCDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRCDRYG) - PRRDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRRDRYG) - PRIDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRIDRYG) - PRSDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRSDRYG) - - PA_RC(JL) = PA_RC(JL) - PRCWETG(JL) - PA_RI(JL) = PA_RI(JL) - PRIWETG(JL) - PA_RS(JL) = PA_RS(JL) - PRSWETG(JL) - PA_RG(JL) = PA_RG(JL) + PRCWETG(JL) + PRIWETG(JL) + PRSWETG(JL) + PRRWETG(JL) - PA_RR(JL) = PA_RR(JL) - PRRWETG(JL) - PA_TH(JL) = PA_TH(JL) + (PRCWETG(JL) + PRRWETG(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA_RG(JL) = PA_RG(JL) - PRWETGH(JL) - PA_RH(JL) = PA_RH(JL) + PRWETGH(JL) - PB_RG(JL) = PB_RG(JL) - PRWETGH_MR(JL) - PB_RH(JL) = PB_RH(JL) + PRWETGH_MR(JL) - PA_RC(JL) = PA_RC(JL) - PRCDRYG(JL) - PA_RI(JL) = PA_RI(JL) - PRIDRYG(JL) - PA_RS(JL) = PA_RS(JL) - PRSDRYG(JL) - PA_RR(JL) = PA_RR(JL) - PRRDRYG(JL) - PA_RG(JL) = PA_RG(JL) + PRCDRYG(JL) + PRIDRYG(JL) + PRSDRYG(JL) + PRRDRYG(JL) - PA_TH(JL) = PA_TH(JL) + (PRCDRYG(JL)+PRRDRYG(JL))*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -!* 6.5 Melting of the graupeln -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRGMLTR(JL)=ZMASK(JL) * PRGMLTR(JL) - ENDDO -ELSE - DO JL=1, KSIZE - PRGMLTR(JL)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRGMLTR(:)=MIN(PRGMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) - END WHERE - ENDIF - DO JL=1, KSIZE - PRGMLTR(JL)=ZMASK(JL) * (PKA(JL)*(XTT-PT(JL)) + & - ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - *(XESTT-PRGMLTR(JL))/(XRV*PT(JL)) )) - ENDDO - WHERE(ZMASK(:)==1.) - ! - ! compute RGMLTR - ! - PRGMLTR(:) = MAX( 0.0,( -PRGMLTR(:) * & - ( X0DEPG* PLBDAG(:)**XEX0DEPG + & - X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) - & - ( PRG_TEND(:, IRCDRYG)+PRG_TEND(:, IRRDRYG) ) * & - ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & - ( PRHODREF(:)*XLMTT ) ) - END WHERE -ENDIF -DO JL=1, KSIZE - PA_RR(JL) = PA_RR(JL) + PRGMLTR(JL) - PA_RG(JL) = PA_RG(JL) - PRGMLTR(JL) - PA_TH(JL) = PA_TH(JL) - PRGMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -END SUBROUTINE ICE4_FAST_RG diff --git a/src/mesonh/micro/ice4_fast_rh.f90 b/src/mesonh/micro/ice4_fast_rh.f90 deleted file mode 100644 index fcac937485414ba29fd691cb0774a32cb3ea4a3c..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/ice4_fast_rh.f90 +++ /dev/null @@ -1,593 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -MODULE MODI_ICE4_FAST_RH -INTERFACE -SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAS, PLBDAG, PLBDAR, PLBDAH, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & - &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & - &PRH_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the rain distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAH ! Slope parameter of the hail distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRDRYHG ! Conversion of hailstone into graupel -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR ! Melting of the hailstones -REAL, DIMENSION(KSIZE, 10), INTENT(INOUT) :: PRH_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -END SUBROUTINE ICE4_FAST_RH -END INTERFACE -END MODULE MODI_ICE4_FAST_RH -SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAS, PLBDAG, PLBDAR, PLBDAH, & - &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & - &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & - &PRH_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH) -!! -!!** PURPOSE -!! ------- -!! Computes the fast rh process -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMW,XCI,XCL,XCPV,XESTT,XGAMI,XLMTT,XLVTT,XMD,XMV,XRV,XTT,XEPSILO -USE MODD_PARAM_ICE, ONLY: LCONVHG,LEVLIMIT,LNULLWETH,LWETHPOST -USE MODD_RAIN_ICE_DESCR, ONLY: XBG,XBS,XCEXVT,XCXG,XCXH,XCXS,XDH,XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: NWETLBDAG,NWETLBDAH,NWETLBDAR,NWETLBDAS,X0DEPH,X1DEPH,XCOLEXGH,XCOLEXIH,XCOLGH,XCOLIH,XCOLEXSH, & - XCOLSH,XEX0DEPH,XEX1DEPH,XFGWETH,XFRWETH,XFSWETH,XFWETH,XKER_GWETH,XKER_RWETH,XKER_SWETH, & - XLBGWETH1,XLBGWETH2,XLBGWETH3,XLBRWETH1,XLBRWETH2,XLBRWETH3,XLBSWETH1,XLBSWETH2,XLBSWETH3, & - XWETINTP1G,XWETINTP1H,XWETINTP1R,XWETINTP1S,XWETINTP2G,XWETINTP2H,XWETINTP2R,XWETINTP2S -! -USE MODE_MPPDB -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the rain distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAH ! Slope parameter of the hail distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETH ! Dry growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGDRYH ! Wet growth of hailstone -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRDRYHG ! Conversion of hailstone into graupel -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR ! Melting of the hailstones -REAL, DIMENSION(KSIZE, 10), INTENT(INOUT) :: PRH_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH -! -!* 0.2 declaration of local variables -! -INTEGER, PARAMETER :: IRCWETH=1, IRRWETH=2, IRIDRYH=3, IRIWETH=4, IRSDRYH=5, IRSWETH=6, IRGDRYH=7, IRGWETH=8, & - & IFREEZ1=9, IFREEZ2=10 -! -LOGICAL, DIMENSION(KSIZE) :: GWET -REAL, DIMENSION(KSIZE) :: ZHAIL, ZWET, ZMASK, ZWETH, ZDRYH -INTEGER :: IHAIL, IGWET -INTEGER, DIMENSION(KSIZE) :: I1 -REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 -REAL, DIMENSION(KSIZE) :: ZZW, & - ZRDRYH_INIT, ZRWETH_INIT, & - ZRDRYHG -INTEGER :: JJ, JL -! -!------------------------------------------------------------------------------- -! -! -!* 7.2 compute the Wet and Dry growth of hail -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRCWETH)=ZMASK(JL) * PRH_TEND(JL, IRCWETH) - ENDDO -ELSE - PRH_TEND(:, IRCWETH)=0. - WHERE(ZMASK(:)==1.) - ZZW(:) = PLBDAH(:)**(XCXH-XDH-2.0) * PRHODREF(:)**(-XCEXVT) - PRH_TEND(:, IRCWETH)=XFWETH * PRCT(:) * ZZW(:) ! RCWETH - END WHERE -ENDIF -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRIWETH)=ZMASK(JL) * PRH_TEND(JL, IRIWETH) - PRH_TEND(JL, IRIDRYH)=ZMASK(JL) * PRH_TEND(JL, IRIDRYH) - ENDDO -ELSE - PRH_TEND(:, IRIWETH)=0. - PRH_TEND(:, IRIDRYH)=0. - WHERE(ZMASK(:)==1.) - ZZW(:) = PLBDAH(:)**(XCXH-XDH-2.0) * PRHODREF(:)**(-XCEXVT) - PRH_TEND(:, IRIWETH)=XFWETH * PRIT(:) * ZZW(:) ! RIWETH - PRH_TEND(:, IRIDRYH)=PRH_TEND(:, IRIWETH)*(XCOLIH*EXP(XCOLEXIH*(PT(:)-XTT))) ! RIDRYH - END WHERE -ENDIF - -! -!* 7.2.1 accretion of aggregates on the hailstones -! -IGWET = 0 -DO JJ = 1, SIZE(GWET) - ZWET(JJ) = MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JJ) - IF (ZWET(JJ)>0) THEN - IGWET = IGWET + 1 - I1(IGWET) = JJ - GWET(JJ) = .TRUE. - ELSE - GWET(JJ) = .FALSE. - END IF -END DO - -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRSWETH)=ZWET(JL) * PRH_TEND(JL, IRSWETH) - PRH_TEND(JL, IRSDRYH)=ZWET(JL) * PRH_TEND(JL, IRSDRYH) - ENDDO -ELSE - PRH_TEND(:, IRSWETH)=0. - PRH_TEND(:, IRSDRYH)=0. - IF(IGWET>0)THEN - ! - !* 7.2.3 select the (PLBDAH,PLBDAS) couplet - ! - DO JJ = 1, IGWET - ZVEC1(JJ) = PLBDAH(I1(JJ)) - ZVEC2(JJ) = PLBDAS(I1(JJ)) - END DO - ! - !* 7.2.4 find the next lower indice for the PLBDAG and for the PLBDAS - ! in the geometrical set of (Lbda_h,Lbda_s) couplet use to - ! tabulate the SWETH-kernel - ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAH)-0.00001, & - XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) - IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) - ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) - ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAS)-0.00001, & - XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + XWETINTP2S ) ) - IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) - ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) - ! - !* 7.2.5 perform the bilinear interpolation of the normalized - ! SWETH-kernel - ! - DO JJ = 1,IGWET - ZVEC3(JJ) = ( XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGWET - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! - WHERE(GWET(:)) - PRH_TEND(:, IRSWETH)=XFSWETH*ZZW(:) & ! RSWETH - *( PLBDAS(:)**(XCXS-XBS) )*( PLBDAH(:)**XCXH ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBSWETH1/( PLBDAH(:)**2 ) + & - XLBSWETH2/( PLBDAH(:) * PLBDAS(:) ) + & - XLBSWETH3/( PLBDAS(:)**2) ) - PRH_TEND(:, IRSDRYH)=PRH_TEND(:, IRSWETH)*(XCOLSH*EXP(XCOLEXSH*(PT(:)-XTT))) - END WHERE - ENDIF -ENDIF -! -!* 7.2.6 accretion of graupeln on the hailstones -! -IGWET = 0 -DO JJ = 1, SIZE(GWET) - ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) - &PCOMPUTE(JJ) - IF (ZWET(JJ)>0) THEN - IGWET = IGWET + 1 - I1(IGWET) = JJ - GWET(JJ) = .TRUE. - ELSE - GWET(JJ) = .FALSE. - END IF -END DO - -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRGWETH)=ZWET(JL) * PRH_TEND(JL, IRGWETH) - PRH_TEND(JL, IRGDRYH)=ZWET(JL) * PRH_TEND(JL, IRGDRYH) - ENDDO -ELSE - PRH_TEND(:, IRGWETH)=0. - PRH_TEND(:, IRGDRYH)=0. - IF(IGWET>0)THEN - ! - !* 7.2.8 select the (PLBDAH,PLBDAG) couplet - ! - DO JJ = 1, IGWET - ZVEC1(JJ) = PLBDAH(I1(JJ)) - ZVEC2(JJ) = PLBDAG(I1(JJ)) - END DO - ! - !* 7.2.9 find the next lower indice for the PLBDAH and for the PLBDAG - ! in the geometrical set of (Lbda_h,Lbda_g) couplet use to - ! tabulate the GWETH-kernel - ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & - XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) - IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) - ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) - ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & - XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + XWETINTP2G ) ) - IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) - ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) - ! - !* 7.2.10 perform the bilinear interpolation of the normalized - ! GWETH-kernel - ! - DO JJ = 1,IGWET - ZVEC3(JJ) = ( XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGWET - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! - WHERE(GWET(:)) - PRH_TEND(:, IRGWETH)=XFGWETH*ZZW(:) & ! RGWETH - *( PLBDAG(:)**(XCXG-XBG) )*( PLBDAH(:)**XCXH ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBGWETH1/( PLBDAH(:)**2 ) + & - XLBGWETH2/( PLBDAH(:) * PLBDAG(:) ) + & - XLBGWETH3/( PLBDAG(:)**2) ) - PRH_TEND(:, IRGDRYH)=PRH_TEND(:, IRGWETH) - END WHERE - !When graupel grows in wet mode, graupel is wet (!) and collection efficiency must remain the same - WHERE(GWET(:) .AND. .NOT. PWETG(:)==1.) - PRH_TEND(:, IRGDRYH)=PRH_TEND(:, IRGDRYH)*(XCOLGH*EXP(XCOLEXGH*(PT(:)-XTT))) - END WHERE - END IF -ENDIF -! -!* 7.2.11 accretion of raindrops on the hailstones -! -IGWET = 0 -DO JJ = 1, SIZE(GWET) - ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) - &PCOMPUTE(JJ) - IF (ZWET(JJ)>0) THEN - IGWET = IGWET + 1 - I1(IGWET) = JJ - GWET(JJ) = .TRUE. - ELSE - GWET(JJ) = .FALSE. - END IF -END DO - -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IRRWETH)=ZWET(JL) * PRH_TEND(JL, IRRWETH) - ENDDO -ELSE - PRH_TEND(:, IRRWETH)=0. - IF(IGWET>0)THEN - ! - !* 7.2.12 select the (PLBDAH,PLBDAR) couplet - ! - DO JJ = 1, IGWET - ZVEC1(JJ) = PLBDAH(I1(JJ)) - ZVEC2(JJ) = PLBDAR(I1(JJ)) - END DO - ! - !* 7.2.13 find the next lower indice for the PLBDAH and for the PLBDAR - ! in the geometrical set of (Lbda_h,Lbda_r) couplet use to - ! tabulate the RWETH-kernel - ! - ZVEC1(1:IGWET)=MAX(1.00001, MIN( REAL(NWETLBDAH)-0.00001, & - XWETINTP1H*LOG(ZVEC1(1:IGWET))+XWETINTP2H)) - IVEC1(1:IGWET)=INT(ZVEC1(1:IGWET)) - ZVEC1(1:IGWET)=ZVEC1(1:IGWET)-REAL(IVEC1(1:IGWET)) - ! - ZVEC2(1:IGWET)=MAX(1.00001, MIN( REAL(NWETLBDAR)-0.00001, & - XWETINTP1R*LOG(ZVEC2(1:IGWET))+XWETINTP2R)) - IVEC2(1:IGWET)=INT(ZVEC2(1:IGWET)) - ZVEC2(1:IGWET)=ZVEC2(1:IGWET)-REAL(IVEC2(1:IGWET)) - ! - !* 7.2.14 perform the bilinear interpolation of the normalized - ! RWETH-kernel - ! - DO JJ=1, IGWET - ZVEC3(JJ)= ( XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGWET - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! - WHERE(GWET(:)) - PRH_TEND(:, IRRWETH) = XFRWETH*ZZW(:) & ! RRWETH - *( PLBDAR(:)**(-4) )*( PLBDAH(:)**XCXH ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRWETH1/( PLBDAH(:)**2 ) + & - XLBRWETH2/( PLBDAH(:) * PLBDAR(:) ) + & - XLBRWETH3/( PLBDAR(:)**2) ) - END WHERE - ENDIF -ENDIF -! -DO JL=1, KSIZE - ZRDRYH_INIT(JL)=PRH_TEND(JL, IRCWETH)+PRH_TEND(JL, IRIDRYH)+ & - &PRH_TEND(JL, IRSDRYH)+PRH_TEND(JL, IRRWETH)+PRH_TEND(JL, IRGDRYH) -ENDDO -! -!* 7.3 compute the Wet growth of hail -! -DO JL=1, KSIZE - ZHAIL(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRH_TEND(JL, IFREEZ1)=ZHAIL(JL) * PRH_TEND(JL, IFREEZ1) - PRH_TEND(JL, IFREEZ2)=ZHAIL(JL) * PRH_TEND(JL, IFREEZ2) - ENDDO -ELSE - DO JL=1, KSIZE - PRH_TEND(JL, IFREEZ1)=PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZHAIL(:)==1.) - PRH_TEND(:, IFREEZ1)=MIN(PRH_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) - END WHERE - ENDIF - PRH_TEND(:, IFREEZ2)=0. - WHERE(ZHAIL(:)==1.) - PRH_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & - (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & - *(XESTT-PRH_TEND(:, IFREEZ1))/(XRV*PT(:)) ) - PRH_TEND(:, IFREEZ1)=PRH_TEND(:, IFREEZ1)* ( X0DEPH* PLBDAH(:)**XEX0DEPH + & - X1DEPH*PCJ(:)*PLBDAH(:)**XEX1DEPH )/ & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - PRH_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - END WHERE -ENDIF -DO JL=1, KSIZE - !We must agregate, at least, the cold species - ZRWETH_INIT(JL)=ZHAIL(JL) * MAX(PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH), & - &MAX(0., PRH_TEND(JL, IFREEZ1) + & - &PRH_TEND(JL, IFREEZ2) * ( & - &PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH) ))) -ENDDO -! -!* 7.4 Select Wet or Dry case -! -!Wet case -DO JL=1, KSIZE - ZWETH(JL) = ZHAIL(JL) * & - & MAX(0., SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)-PRH_TEND(JL, IRGDRYH)) - & - &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)-PRH_TEND(JL, IRGWETH)))) -ENDDO -IF(LNULLWETH) THEN - DO JL=1, KSIZE - ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRDRYH_INIT(JL))) ! WHERE(ZRDRYH_INIT(:)>0.) - ENDDO -ELSE - DO JL=1, KSIZE - ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRWETH_INIT(JL))) ! WHERE(ZRWETH_INIT(:)>0.) - ENDDO -ENDIF -IF(.NOT. LWETHPOST) THEN - DO JL=1, KSIZE - ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) - ENDDO -ENDIF -DO JL=1, KSIZE - ZDRYH(JL) = ZHAIL(JL) * & - & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) - & MAX(0., -SIGN(1., 1.E-20-ZRDRYH_INIT(JL))) * & !WHERE(ZRDRYH_INIT(:)>0.) - & MAX(0., -SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)) - & - &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)))) -ENDDO -! -ZRDRYHG(:)=0. -IF(LCONVHG)THEN - WHERE(ZDRYH(:)==1.) - ZRDRYHG(:)=ZRDRYH_INIT(:)*ZRWETH_INIT(:)/(ZRDRYH_INIT(:)+ZRWETH_INIT(:)) - END WHERE -ENDIF -DO JL=1, KSIZE - PRCWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRCWETH) - PRIWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRIWETH) - PRSWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRSWETH) - PRGWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRGWETH) - !Collected minus aggregated - PRRWETH(JL) = ZWETH(JL) * (ZRWETH_INIT(JL) - PRH_TEND(JL, IRIWETH) - & - PRH_TEND(JL, IRSWETH) - PRH_TEND(JL, IRGWETH) - & - PRH_TEND(JL, IRCWETH)) - - PRCDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRCWETH) - PRIDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRIDRYH) - PRSDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRSDRYH) - PRRDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRRWETH) - PRGDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRGDRYH) - PRDRYHG(JL) = ZDRYH(JL) * ZRDRYHG(JL) - - PA_RC(JL) = PA_RC(JL) - PRCWETH(JL) - PA_RI(JL) = PA_RI(JL) - PRIWETH(JL) - PA_RS(JL) = PA_RS(JL) - PRSWETH(JL) - PA_RG(JL) = PA_RG(JL) - PRGWETH(JL) - PA_RH(JL) = PA_RH(JL) + PRCWETH(JL)+PRIWETH(JL)+PRSWETH(JL)+PRGWETH(JL)+PRRWETH(JL) - PA_RR(JL) = PA_RR(JL) - PRRWETH(JL) - PA_TH(JL) = PA_TH(JL) + (PRRWETH(JL)+PRCWETH(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA_RC(JL) = PA_RC(JL) - PRCDRYH(JL) - PA_RI(JL) = PA_RI(JL) - PRIDRYH(JL) - PA_RS(JL) = PA_RS(JL) - PRSDRYH(JL) - PA_RR(JL) = PA_RR(JL) - PRRDRYH(JL) - PA_RG(JL) = PA_RG(JL) - PRGDRYH(JL) + PRDRYHG(JL) - PA_RH(JL) = PA_RH(JL) + PRCDRYH(JL)+PRIDRYH(JL)+PRSDRYH(JL)+& - &PRRDRYH(JL)+PRGDRYH(JL) - PRDRYHG(JL) - PA_TH(JL) = PA_TH(JL) + (PRCDRYH(JL)+PRRDRYH(JL))*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -!* 7.5 Melting of the hailstones -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRHMLTR(JL)=ZMASK(JL)*PRHMLTR(JL) - ENDDO -ELSE - DO JL=1, KSIZE - PRHMLTR(JL) = ZMASK(JL)* PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRHMLTR(:)=MIN(PRHMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) - END WHERE - ENDIF - DO JL=1, KSIZE - PRHMLTR(JL) = ZMASK(JL)* (PKA(JL)*(XTT-PT(JL)) + & - ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - *(XESTT-PRHMLTR(JL))/(XRV*PT(JL)) )) - ENDDO - WHERE(ZMASK(:)==1.) - ! - ! compute RHMLTR - ! - PRHMLTR(:) = MAX( 0.0,( -PRHMLTR(:) * & - ( X0DEPH* PLBDAH(:)**XEX0DEPH + & - X1DEPH*PCJ(:)*PLBDAH(:)**XEX1DEPH ) - & - ( PRH_TEND(:, IRCWETH)+PRH_TEND(:, IRRWETH) )* & - ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & - ( PRHODREF(:)*XLMTT ) ) - END WHERE -END IF -DO JL=1, KSIZE - PA_RR(JL) = PA_RR(JL) + PRHMLTR(JL) - PA_RH(JL) = PA_RH(JL) - PRHMLTR(JL) - PA_TH(JL) = PA_TH(JL) - PRHMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -! -END SUBROUTINE ICE4_FAST_RH diff --git a/src/mesonh/micro/ice4_fast_rs.f90 b/src/mesonh/micro/ice4_fast_rs.f90 deleted file mode 100644 index 6d71c7b61b8188969aa488a3b22d65ad15d7cc26..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/ice4_fast_rs.f90 +++ /dev/null @@ -1,521 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -MODULE MODI_ICE4_FAST_RS -INTERFACE -SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAR, PLBDAS, & - &PT, PRVT, PRCT, PRRT, PRST, & - &PRIAGGS, & - &PRCRIMSS, PRCRIMSG, PRSRIMCG, & - &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & - &PRCMLTSR, & - &PRS_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RS, PA_RG) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIAGGS ! r_i aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSS ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSACCRG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG ! Conversion-Melting of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature -REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRS_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -END SUBROUTINE ICE4_FAST_RS -END INTERFACE -END MODULE MODI_ICE4_FAST_RS -SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & - &PRHODREF, PLVFACT, PLSFACT, PPRES, & - &PDV, PKA, PCJ, & - &PLBDAR, PLBDAS, & - &PT, PRVT, PRCT, PRRT, PRST, & - &PRIAGGS, & - &PRCRIMSS, PRCRIMSG, PRSRIMCG, & - &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & - &PRCMLTSR, & - &PRS_TEND, & - &PA_TH, PA_RC, PA_RR, PA_RS, PA_RG) -!! -!!** PURPOSE -!! ------- -!! Computes the fast rs processes -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XALPI,XALPW,XBETAI,XBETAW,XCI,XCL,XCPV,XESTT,XGAMI,XGAMW,XLMTT,XLVTT,XMD,XMV,XRV,XTT, & - XEPSILO -USE MODD_PARAM_ICE, ONLY: LEVLIMIT, CSNOWRIMING -USE MODD_RAIN_ICE_DESCR, ONLY: XBS,XCEXVT,XCXS,XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: NACCLBDAR,NACCLBDAS,NGAMINC,X0DEPS,X1DEPS,XACCINTP1R,XACCINTP1S,XACCINTP2R,XACCINTP2S, & - XCRIMSG,XCRIMSS,XEX0DEPS,XEX1DEPS,XEXCRIMSG,XEXCRIMSS,XEXSRIMCG,XEXSRIMCG2,XFRACCSS, & - XFSACCRG,XFSCVMG,XGAMINC_RIM1,XGAMINC_RIM1,XGAMINC_RIM2,XGAMINC_RIM4,XKER_RACCS, & - XKER_RACCSS,XKER_SACCRG,XLBRACCS1,XLBRACCS2,XLBRACCS3,XLBSACCR1,XLBSACCR2,XLBSACCR3, & - XRIMINTP1,XRIMINTP2,XSRIMCG,XSRIMCG2,XSRIMCG3 -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIAGGS ! r_i aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSS ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSACCRG ! Rain accretion onto the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG ! Conversion-Melting of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature -REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRS_TEND ! Individual tendencies -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -! -!* 0.2 declaration of local variables -! -INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5, IRSACCRG=6, & - & IFREEZ1=7, IFREEZ2=8 -! -REAL, DIMENSION(KSIZE) :: ZRIM, ZACC, ZMASK -LOGICAL, DIMENSION(KSIZE) :: GRIM, GACC -INTEGER :: IGRIM, IGACC -INTEGER, DIMENSION(KSIZE) :: I1 -REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 -REAL, DIMENSION(KSIZE) :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE -INTEGER :: JJ, JL -!------------------------------------------------------------------------------- -! -! -!* 5.0 maximum freezing rate -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRS_TEND(JL, IFREEZ1) - PRS_TEND(JL, IFREEZ2)=ZMASK(JL) * PRS_TEND(JL, IFREEZ2) - ENDDO -ELSE - DO JL=1, KSIZE - PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRS_TEND(:, IFREEZ1)=MIN(PRS_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) - END WHERE - ENDIF - PRS_TEND(:, IFREEZ2)=0. - WHERE(ZMASK(:)==1.) - PRS_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & - (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & - *(XESTT-PRS_TEND(:, IFREEZ1))/(XRV*PT(:)) ) - PRS_TEND(:, IFREEZ1)=PRS_TEND(:, IFREEZ1)* ( X0DEPS* PLBDAS(:)**XEX0DEPS + & - X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS )/ & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - PRS_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) - END WHERE -ENDIF -DO JL=1, KSIZE - !We must agregate, at least, the cold species - !And we are only interested by the freezing rate of liquid species - ZFREEZ_RATE(JL)=ZMASK(JL) * MAX(0., MAX(0., PRS_TEND(JL, IFREEZ1) + & - &PRS_TEND(JL, IFREEZ2) * PRIAGGS(JL)) - & - PRIAGGS(JL)) -ENDDO -! -!* 5.1 cloud droplet riming of the aggregates -! -IGRIM = 0 -DO JJ = 1, SIZE(GRIM) - ZRIM(JJ)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JJ))) * & !WHERE(PRCT(:)>XRTMIN(2)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JJ) - IF (ZRIM(JJ)>0) THEN - IGRIM = IGRIM + 1 - I1(IGRIM) = JJ - GRIM(JJ) = .TRUE. - ELSE - GRIM(JJ) = .FALSE. - END IF -END DO -! -! Collection of cloud droplets by snow: this rate is used for riming (T<0) and for conversion/melting (T>0) -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRS_TEND(JL, IRCRIMS)=ZRIM(JL) * PRS_TEND(JL, IRCRIMS) - PRS_TEND(JL, IRCRIMSS)=ZRIM(JL) * PRS_TEND(JL, IRCRIMSS) - PRS_TEND(JL, IRSRIMCG)=ZRIM(JL) * PRS_TEND(JL, IRSRIMCG) - ENDDO -ELSE - PRS_TEND(:, IRCRIMS)=0. - PRS_TEND(:, IRCRIMSS)=0. - PRS_TEND(:, IRSRIMCG)=0. - ! - IF(IGRIM>0) THEN - ! - ! 5.1.1 select the PLBDAS - ! - DO JJ = 1, IGRIM - ZVEC1(JJ) = PLBDAS(I1(JJ)) - END DO - ! - ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical - ! set of Lbda_s used to tabulate some moments of the incomplete - ! gamma function - ! - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & - XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) - IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) - ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) - ! - ! 5.1.3 perform the linear interpolation of the normalized - ! "2+XDS"-moment of the incomplete gamma function - ! - ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW(:) = 0. - DO JJ = 1, IGRIM - ZZW(I1(JJ)) = ZVEC1(JJ) - END DO - ! - ! 5.1.4 riming of the small sized aggregates - ! - WHERE (GRIM(:)) - PRS_TEND(:, IRCRIMSS) = XCRIMSS * ZZW(:) * PRCT(:) & ! RCRIMSS - * PLBDAS(:)**XEXCRIMSS & - * PRHODREF(:)**(-XCEXVT) - END WHERE - ! - ! 5.1.5 perform the linear interpolation of the normalized - ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) and - ! "XBG"-moment of the incomplete gamma function (XGAMINC_RIM4) - ! - ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW(:) = 0. - DO JJ = 1, IGRIM - ZZW(I1(JJ)) = ZVEC1(JJ) - END DO - - ZVEC1(1:IGRIM) = XGAMINC_RIM4( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM4( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW2(:) = 0. - DO JJ = 1, IGRIM - ZZW2(I1(JJ)) = ZVEC1(JJ) - END DO - ! - ! 5.1.6 riming-conversion of the large sized aggregates into graupeln - ! - ! - WHERE(GRIM(:)) - PRS_TEND(:, IRCRIMS)=XCRIMSG * PRCT(:) & ! RCRIMS - * PLBDAS(:)**XEXCRIMSG & - * PRHODREF(:)**(-XCEXVT) - ZZW6(:) = PRS_TEND(:, IRCRIMS) - PRS_TEND(:, IRCRIMSS) ! RCRIMSG - END WHERE - - IF(CSNOWRIMING=='M90 ')THEN - !Murakami 1990 - WHERE(GRIM(:)) - PRS_TEND(:, IRSRIMCG)=XSRIMCG * PLBDAS(:)**XEXSRIMCG*(1.0-ZZW(:)) - PRS_TEND(:, IRSRIMCG)=ZZW6(:)*PRS_TEND(:, IRSRIMCG)/ & - MAX(1.E-20, & - XSRIMCG3*XSRIMCG2*PLBDAS(:)**XEXSRIMCG2*(1.-ZZW2(:)) - & - XSRIMCG3*PRS_TEND(:, IRSRIMCG)) - END WHERE - ELSE - PRS_TEND(:, IRSRIMCG)=0. - END IF - ENDIF -ENDIF -! -DO JL=1, KSIZE - ! More restrictive RIM mask to be used for riming by negative temperature only - ZRIM(JL)=ZRIM(JL) * & - &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) - PRCRIMSS(JL)=ZRIM(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRCRIMSS)) - ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSS(JL)) - ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL))) ! proportion we are able to freeze - PRCRIMSG(JL) = ZRIM(JL) * ZZW(JL) * MAX(0., PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL)) ! RCRIMSG - ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSG(JL)) - PRSRIMCG(JL) = ZRIM(JL) * ZZW(JL) * PRS_TEND(JL, IRSRIMCG) - - PRSRIMCG(JL) = PRSRIMCG(JL) * MAX(0., -SIGN(1., -PRCRIMSG(JL))) - PRCRIMSG(JL)=MAX(0., PRCRIMSG(JL)) - - PA_RC(JL) = PA_RC(JL) - PRCRIMSS(JL) - PA_RS(JL) = PA_RS(JL) + PRCRIMSS(JL) - PA_TH(JL) = PA_TH(JL) + PRCRIMSS(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA_RC(JL) = PA_RC(JL) - PRCRIMSG(JL) - PA_RS(JL) = PA_RS(JL) - PRSRIMCG(JL) - PA_RG(JL) = PA_RG(JL) + PRCRIMSG(JL)+PRSRIMCG(JL) - PA_TH(JL) = PA_TH(JL) + PRCRIMSG(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -!* 5.2 rain accretion onto the aggregates -! -IGACC = 0 -DO JJ = 1, SIZE(GACC) - ZACC(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & !WHERE(PRRT(:)>XRTMIN(3)) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) - &PCOMPUTE(JJ) - IF (ZACC(JJ)>0) THEN - IGACC = IGACC + 1 - I1(IGACC) = JJ - GACC(JJ) = .TRUE. - ELSE - GACC(JJ) = .FALSE. - END IF -END DO - -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRS_TEND(JL, IRRACCS)=ZACC(JL) * PRS_TEND(JL, IRRACCS) - PRS_TEND(JL, IRRACCSS)=ZACC(JL) * PRS_TEND(JL, IRRACCSS) - PRS_TEND(JL, IRSACCRG)=ZACC(JL) * PRS_TEND(JL, IRSACCRG) - ENDDO -ELSE - PRS_TEND(:, IRRACCS)=0. - PRS_TEND(:, IRRACCSS)=0. - PRS_TEND(:, IRSACCRG)=0. - IF(IGACC>0)THEN - ! - ! - ! 5.2.1 select the (PLBDAS,PLBDAR) couplet - ! - DO JJ = 1, IGACC - ZVEC1(JJ) = PLBDAS(I1(JJ)) - ZVEC2(JJ) = PLBDAR(I1(JJ)) - END DO - ! - ! 5.2.2 find the next lower indice for the PLBDAS and for the PLBDAR - ! in the geometrical set of (Lbda_s,Lbda_r) couplet use to - ! tabulate the RACCSS-kernel - ! - ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & - XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) - IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) - ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) - ! - ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & - XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) - IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) - ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) - ! - ! 5.2.3 perform the bilinear interpolation of the normalized - ! RACCSS-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGACC - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! - ! 5.2.4 raindrop accretion on the small sized aggregates - ! - WHERE(GACC(:)) - ZZW6(:) = & !! coef of RRACCS - XFRACCSS*( PLBDAS(:)**XCXS )*( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRACCS1/((PLBDAS(:)**2) ) + & - XLBRACCS2/( PLBDAS(:) * PLBDAR(:) ) + & - XLBRACCS3/( (PLBDAR(:)**2)) )/PLBDAR(:)**4 - PRS_TEND(:, IRRACCSS) =ZZW(:)*ZZW6(:) - END WHERE - ! - ! 5.2.4b perform the bilinear interpolation of the normalized - ! RACCS-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGACC - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - WHERE(GACC(:)) - PRS_TEND(:, IRRACCS) = ZZW(:)*ZZW6(:) - END WHERE - ! 5.2.5 perform the bilinear interpolation of the normalized - ! SACCRG-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & - - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & - * ZVEC2(JJ) & - - ( XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & - - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & - * (ZVEC2(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGACC - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! - ! 5.2.6 raindrop accretion-conversion of the large sized aggregates - ! into graupeln - ! - WHERE(GACC(:)) - PRS_TEND(:, IRSACCRG) = XFSACCRG*ZZW(:)* & ! RSACCRG - ( PLBDAS(:)**(XCXS-XBS) )*( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBSACCR1/((PLBDAR(:)**2) ) + & - XLBSACCR2/( PLBDAR(:) * PLBDAS(:) ) + & - XLBSACCR3/( (PLBDAS(:)**2)) )/PLBDAR(:) - END WHERE - ENDIF -ENDIF -! -DO JL=1, KSIZE - ! More restrictive ACC mask to be used for accretion by negative temperature only - ZACC(JL) = ZACC(JL) * & - &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) - PRRACCSS(JL)=ZACC(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRRACCSS)) - ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRRACCSS(JL)) - ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRRACCS)-PRRACCSS(JL))) ! proportion we are able to freeze - PRRACCSG(JL)=ZACC(JL)*ZZW(JL) * MAX(0., PRS_TEND(JL, IRRACCS)-PRRACCSS(JL)) - ZFREEZ_RATE(JL) = MAX(0., ZFREEZ_RATE(JL)-PRRACCSG(JL)) - PRSACCRG(JL)=ZACC(JL)*ZZW(JL) * PRS_TEND(JL, IRSACCRG) - - PRSACCRG(JL) = PRSACCRG(JL) * MAX(0., -SIGN(1., -PRRACCSG(JL))) - PRRACCSG(JL)=MAX(0., PRRACCSG(JL)) - - PA_RR(JL) = PA_RR(JL) - PRRACCSS(JL) - PA_RS(JL) = PA_RS(JL) + PRRACCSS(JL) - PA_TH(JL) = PA_TH(JL) + PRRACCSS(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA_RR(JL) = PA_RR(JL) - PRRACCSG(JL) - PA_RS(JL) = PA_RS(JL) - PRSACCRG(JL) - PA_RG(JL) = PA_RG(JL) + PRRACCSG(JL)+PRSACCRG(JL) - PA_TH(JL) = PA_TH(JL) + PRRACCSG(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -! -!* 5.3 Conversion-Melting of the aggregates -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRSMLTG(JL)=ZMASK(JL)*PRSMLTG(JL) - PRCMLTSR(JL)=ZMASK(JL)*PRCMLTSR(JL) - ENDDO -ELSE - DO JL=1, KSIZE - PRSMLTG(JL)=ZMASK(JL)*PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure - ENDDO - IF(LEVLIMIT) THEN - WHERE(ZMASK(:)==1.) - PRSMLTG(:)=MIN(PRSMLTG(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) - END WHERE - ENDIF - DO JL=1, KSIZE - PRSMLTG(JL)=ZMASK(JL)*( & - & PKA(JL)*(XTT-PT(JL)) + & - & ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & - & *(XESTT-PRSMLTG(JL))/(XRV*PT(JL)) ) & - &) - ENDDO - PRCMLTSR(:) = 0. - WHERE(ZMASK(:)==1.) - ! - ! compute RSMLT - ! - PRSMLTG(:) = XFSCVMG*MAX( 0.0,( -PRSMLTG(:) * & - ( X0DEPS* PLBDAS(:)**XEX0DEPS + & - X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) - & - ( PRS_TEND(:, IRCRIMS) + PRS_TEND(:, IRRACCS) ) * & - ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & - ( PRHODREF(:)*XLMTT ) ) - ! When T < XTT, rc is collected by snow (riming) to produce snow and graupel - ! When T > XTT, if riming was still enabled, rc would produce snow and graupel with snow becomming graupel (conversion/melting) and graupel becomming rain (melting) - ! To insure consistency when crossing T=XTT, rc collected with T>XTT must be transformed in rain. - ! rc cannot produce iced species with a positive temperature but is still collected with a good efficiency by snow - PRCMLTSR(:) = PRS_TEND(:, IRCRIMS) ! both species are liquid, no heat is exchanged - END WHERE -ENDIF -DO JL=1, KSIZE - ! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT) - ! because the graupeln produced by this process are still icy!!! - PA_RS(JL) = PA_RS(JL) - PRSMLTG(JL) - PA_RG(JL) = PA_RG(JL) + PRSMLTG(JL) - PA_RC(JL) = PA_RC(JL) - PRCMLTSR(JL) - PA_RR(JL) = PA_RR(JL) + PRCMLTSR(JL) -ENDDO - -! -END SUBROUTINE ICE4_FAST_RS diff --git a/src/mesonh/micro/ice4_slow.f90 b/src/mesonh/micro/ice4_slow.f90 deleted file mode 100644 index 15d0cd78e495cb255015fb6ed29fbfdb5361c748..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/ice4_slow.f90 +++ /dev/null @@ -1,263 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -MODULE MODI_ICE4_SLOW -INTERFACE -SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT,& - &PSSI, PLVFACT, PLSFACT, & - &PRVT, PRCT, PRIT, PRST, PRGT,& - &PLBDAS, PLBDAG,& - &PAI, PCJ, PHLI_HCF, PHLI_HRI,& - &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & - &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PSSI ! Supersaturation over ice -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PAI ! Thermodynamical function -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HCF ! -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HRI ! -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCHONI ! Homogeneous nucleation -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPS ! Deposition on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAGGS ! Aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAUTS ! Autoconversion of r_i for r_s production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPG ! Deposition on r_g -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -END SUBROUTINE ICE4_SLOW -END INTERFACE -END MODULE MODI_ICE4_SLOW -SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT, & - &PSSI, PLVFACT, PLSFACT, & - &PRVT, PRCT, PRIT, PRST, PRGT, & - &PLBDAS, PLBDAG, & - &PAI, PCJ, PHLI_HCF, PHLI_HRI,& - &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & - &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG) -!! -!!** PURPOSE -!! ------- -!! Computes the slow process -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XTT -USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT,XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: X0DEPG,X0DEPS,X1DEPG,X1DEPS,XACRIAUTI,XALPHA3,XBCRIAUTI,XBETA3,XCOLEXIS,XCRIAUTI, & - XEX0DEPG,XEX0DEPS,XEX1DEPG,XEX1DEPS,XEXIAGGS,XFIAGGS,XHON,XTEXAUTI,XTIMAUTI -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PSSI ! Supersaturation over ice -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PAI ! Thermodynamical function -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HCF ! -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HRI ! -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCHONI ! Homogeneous nucleation -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPS ! Deposition on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAGGS ! Aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAUTS ! Autoconversion of r_i for r_s production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPG ! Deposition on r_g -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -! -!* 0.2 declaration of local variables -! -REAL, DIMENSION(KSIZE) :: ZCRIAUTI, ZMASK -REAL :: ZTIMAUTIC -INTEGER :: JL -!------------------------------------------------------------------------------- -! -! -!------------------------------------------------------------------------------- -! -! -!* 3.2 compute the homogeneous nucleation source: RCHONI -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0 - &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRCHONI(JL) = PRCHONI(JL) * ZMASK(JL) - ENDDO -ELSE - PRCHONI(:) = 0. - WHERE(ZMASK(:)==1.) - PRCHONI(:) = MIN(1000.,XHON*PRHODREF(:)*PRCT(:) & - *EXP( XALPHA3*(PT(:)-XTT)-XBETA3 )) - ENDWHERE -ENDIF -DO JL=1, KSIZE - PA_RI(JL) = PA_RI(JL) + PRCHONI(JL) - PA_RC(JL) = PA_RC(JL) - PRCHONI(JL) - PA_TH(JL) = PA_TH(JL) + PRCHONI(JL)*(PLSFACT(JL)-PLVFACT(JL)) -ENDDO -! -!* 3.4 compute the deposition, aggregation and autoconversion sources -! -! -!* 3.4.2 compute the riming-conversion of r_c for r_i production: RCAUTI -! -! ZZW(:) = 0.0 -! ZTIMAUTIC = SQRT( XTIMAUTI*XTIMAUTC ) -! WHERE ( (PRCT(:)>0.0) .AND. (PRIT(:)>0.0) .AND. (PRCS(:)>0.0) ) -! ZZW(:) = MIN( PRCS(:),ZTIMAUTIC * MAX( SQRT( PRIT(:)*PRCT(:) ),0.0 ) ) -! PRIS(:) = PRIS(:) + ZZW(:) -! PRCS(:) = PRCS(:) - ZZW(:) -! PTHS(:) = PTHS(:) + ZZW(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(RCAUTI)) -! END WHERE -! -!* 3.4.3 compute the deposition on r_s: RVDEPS -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(1)-PRVT(JL))) * & !PRVT(:)>XRTMIN(1) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !PRST(:)>XRTMIN(5) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRVDEPS(JL)=PRVDEPS(JL)*ZMASK(JL) - ENDDO -ELSE - PRVDEPS(:) = 0. - WHERE(ZMASK(:)==1.) - PRVDEPS(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & - ( X0DEPS*PLBDAS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) - END WHERE -ENDIF -DO JL=1, KSIZE - PA_RS(JL) = PA_RS(JL) + PRVDEPS(JL) - PA_RV(JL) = PA_RV(JL) - PRVDEPS(JL) - PA_TH(JL) = PA_TH(JL) + PRVDEPS(JL)*PLSFACT(JL) -ENDDO -! -!* 3.4.4 compute the aggregation on r_s: RIAGGS -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! PRIT(:)>XRTMIN(4) - &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! PRST(:)>XRTMIN(5) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRIAGGS(JL)=PRIAGGS(JL) * ZMASK(JL) - ENDDO -ELSE - PRIAGGS(:) = 0. - WHERE(ZMASK(:)==1) - PRIAGGS(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) & - * PRIT(:) & - * PLBDAS(:)**XEXIAGGS & - * PRHODREF(:)**(-XCEXVT) - END WHERE -ENDIF -DO JL=1, KSIZE - PA_RS(JL) = PA_RS(JL) + PRIAGGS(JL) - PA_RI(JL) = PA_RI(JL) - PRIAGGS(JL) -ENDDO -! -!* 3.4.5 compute the autoconversion of r_i for r_s production: RIAUTS -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PHLI_HRI(JL))) * & ! PHLI_HRI(:)>XRTMIN(4) - &MAX(0., -SIGN(1., 1.E-20-PHLI_HCF(JL))) * & ! PHLI_HCF(:) .GT. 0. - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRIAUTS(JL) = PRIAUTS(JL) * ZMASK(JL) - ENDDO -ELSE - PRIAUTS(:) = 0. - !ZCRIAUTI(:)=MIN(XCRIAUTI,10**(0.06*(PT(:)-XTT)-3.5)) - ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) - WHERE(ZMASK(:)==1.) - PRIAUTS(:) = XTIMAUTI * EXP( XTEXAUTI*(PT(:)-XTT) ) & - * MAX( PHLI_HRI(:)/PHLI_HCF(:)-ZCRIAUTI(:),0.0 ) - PRIAUTS(:) = PHLI_HCF(:)*PRIAUTS(:) - END WHERE -ENDIF -DO JL=1, KSIZE - PA_RS(JL) = PA_RS(JL) + PRIAUTS(JL) - PA_RI(JL) = PA_RI(JL) - PRIAUTS(JL) -ENDDO -! -!* 3.4.6 compute the deposition on r_g: RVDEPG -! -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(1)-PRVT(JL))) * & ! PRVT(:)>XRTMIN(1) - &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! PRGT(:)>XRTMIN(6) - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRVDEPG(JL) = PRVDEPG(JL) * ZMASK(JL) - ENDDO -ELSE - PRVDEPG(:) = 0. - WHERE(ZMASK(:)==1.) - PRVDEPG(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & - ( X0DEPG*PLBDAG(:)**XEX0DEPG + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) - END WHERE -ENDIF -DO JL=1, KSIZE - PA_RG(JL) = PA_RG(JL) + PRVDEPG(JL) - PA_RV(JL) = PA_RV(JL) - PRVDEPG(JL) - PA_TH(JL) = PA_TH(JL) + PRVDEPG(JL)*PLSFACT(JL) -ENDDO -! -! -END SUBROUTINE ICE4_SLOW diff --git a/src/mesonh/micro/ice4_warm.f90 b/src/mesonh/micro/ice4_warm.f90 deleted file mode 100644 index aa61b1dac3ee676c3ec2ecca6d2af30c1ec9b8a5..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/ice4_warm.f90 +++ /dev/null @@ -1,316 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -MODULE MODI_ICE4_WARM -INTERFACE -SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & - PRHODREF, PLVFACT, PT, PPRES, PTHT, & - PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, & - PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & - PCF, PRF, & - PRVT, PRCT, PRRT, & - PRCAUTR, PRCACCR, PRREVAV, & - PA_TH, PA_RV, PA_RC, PA_RR) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -CHARACTER(len=80), INTENT(IN) :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion -CHARACTER(len=80), INTENT(IN) :: HSUBG_RR_EVAP ! subgrid rr evaporation -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR_RF!like PLBDAR but for the Rain Fraction part -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRF ! Rain fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCAUTR ! Autoconversion of r_c for r_r production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCACCR ! Accretion of r_c for r_r production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRREVAV ! Evaporation of r_r -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -END SUBROUTINE ICE4_WARM -END INTERFACE -END MODULE MODI_ICE4_WARM -SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & - PRHODREF, PLVFACT, PT, PPRES, PTHT, & - PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, & - PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & - PCF, PRF, & - PRVT, PRCT, PRRT, & - PRCAUTR, PRCACCR, PRREVAV, & - PA_TH, PA_RV, PA_RC, PA_RR) -!! -!!** PURPOSE -!! ------- -!! Computes the warm process -!! -!! AUTHOR -!! ------ -!! S. Riette from the plitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XALPW,XBETAW,XCL,XCPD,XCPV,XGAMW,XLVTT,XMD,XMV,XRV,XTT,XEPSILO -USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT,XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: X0EVAR,X1EVAR,XCRIAUTC,XEX0EVAR,XEX1EVAR,XEXCACCR,XFCACCR,XTIMAUTC -! -USE MODE_MSG -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -CHARACTER(len=80), INTENT(IN) :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion -CHARACTER(len=80), INTENT(IN) :: HSUBG_RR_EVAP ! subgrid rr evaporation -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR_RF!like PLBDAR but for the Rain Fraction part -REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRF ! Rain fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCAUTR ! Autoconversion of r_c for r_r production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCACCR ! Accretion of r_c for r_r production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRREVAV ! Evaporation of r_r -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR -! -!* 0.2 declaration of local variables -! -REAL, DIMENSION(KSIZE) :: ZZW2, ZZW3, ZZW4 -REAL, DIMENSION(KSIZE) :: ZUSW ! Undersaturation over water -REAL, DIMENSION(KSIZE) :: ZTHLT ! Liquid potential temperature -REAL, DIMENSION(KSIZE) :: ZMASK, ZMASK1, ZMASK2 -INTEGER :: JL -!------------------------------------------------------------------------------- -! -! -! -!------------------------------------------------------------------------------- -! -!* 4.2 compute the autoconversion of r_c for r_r production: RCAUTR -! -DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) - &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) * & ! PHLC_HCF(:) .GT. 0. - &PCOMPUTE(JL) -ENDDO -IF(LDSOFT) THEN - DO JL=1, KSIZE - PRCAUTR(JL)=PRCAUTR(JL)*ZMASK(JL) - ENDDO -ELSE - PRCAUTR(:) = 0. - WHERE(ZMASK(:)==1.) - PRCAUTR(:) = XTIMAUTC*MAX(PHLC_HRC(:)/PHLC_HCF(:) - XCRIAUTC/PRHODREF(:), 0.0) - PRCAUTR(:) = PHLC_HCF(:)*PRCAUTR(:) - END WHERE -ENDIF -DO JL=1, KSIZE - PA_RC(JL) = PA_RC(JL) - PRCAUTR(JL) - PA_RR(JL) = PA_RR(JL) + PRCAUTR(JL) -ENDDO -! -! -!* 4.3 compute the accretion of r_c for r_r production: RCACCR -! -IF (HSUBG_RC_RR_ACCR=='NONE') THEN - !CLoud water and rain are diluted over the grid box - DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &PCOMPUTE(JL) - ENDDO - IF(LDSOFT) THEN - DO JL=1, KSIZE - PRCACCR(JL)=PRCACCR(JL) * ZMASK(JL) - ENDDO - ELSE - PRCACCR(:) = 0. - WHERE(ZMASK(:)==1.) - PRCACCR(:) = XFCACCR * PRCT(:) & - * PLBDAR(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) - END WHERE - ENDIF - -ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN - !Cloud water is concentrated over its fraction with possibly to parts with high and low content as set for autoconversion - !Rain is concnetrated over its fraction - !Rain in high content area fraction: PHLC_HCF - !Rain in low content area fraction: - ! if PRF<PCF (rain is entirely falling in cloud): PRF-PHLC_HCF - ! if PRF>PCF (rain is falling in cloud and in clear sky): PCF-PHLC_HCF - ! => min(PCF, PRF)-PHLC_HCF - DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &PCOMPUTE(JL) - ZMASK1(JL)=ZMASK(JL) * & - &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) - &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) ! PHLC_HCF(:)>0. - ZMASK2(JL)=ZMASK(JL) * & - &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_LRC(JL))) * & ! PHLC_LRC(:)>XRTMIN(2) - &MAX(0., -SIGN(1., 1.E-20-PHLC_LCF(JL))) ! PHLC_LCF(:)>0. - ENDDO - IF(LDSOFT) THEN - DO JL=1, KSIZE - PRCACCR(JL)=PRCACCR(JL) * MIN(1., ZMASK1(JL)+ZMASK2(JL)) - ENDDO - ELSE - PRCACCR(:)=0. - WHERE(ZMASK1(:)==1.) - !Accretion due to rain falling in high cloud content - PRCACCR(:) = XFCACCR * ( PHLC_HRC(:)/PHLC_HCF(:) ) & - * PLBDAR_RF(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) & - * PHLC_HCF - END WHERE - WHERE(ZMASK2(:)==1.) - !We add acrretion due to rain falling in low cloud content - PRCACCR(:) = PRCACCR(:) + XFCACCR * ( PHLC_LRC(:)/PHLC_LCF(:) ) & - * PLBDAR_RF(:)**XEXCACCR & - * PRHODREF(:)**(-XCEXVT) & - * (MIN(PCF(:), PRF(:))-PHLC_HCF(:)) - END WHERE - ENDIF -ELSE - CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_WARM','wrong HSUBG_RC_RR_ACCR case') -ENDIF -DO JL=1, KSIZE - PA_RC(JL) = PA_RC(JL) - PRCACCR(JL) - PA_RR(JL) = PA_RR(JL) + PRCACCR(JL) -ENDDO -! -!* 4.4 compute the evaporation of r_r: RREVAV -! -IF (HSUBG_RR_EVAP=='NONE') THEN - DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &MAX(0., SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)<=XRTMIN(2) - &PCOMPUTE(JL) - ENDDO - IF(LDSOFT) THEN - DO JL=1, KSIZE - PRREVAV(JL)=PRREVAV(JL)*ZMASK(JL) - ENDDO - ELSE - PRREVAV(:) = 0. - !Evaporation only when there's no cloud (RC must be 0) - WHERE(ZMASK(:)==1.) - PRREVAV(:) = EXP( XALPW - XBETAW/PT(:) - XGAMW*ALOG(PT(:) ) ) ! es_w - ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) ) - ! Undersaturation over water - PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(PT(:)-XTT) )**2 / ( PKA(:)*XRV*PT(:)**2 ) & - + ( XRV*PT(:) ) / ( PDV(:)*PRREVAV(:) ) - PRREVAV(:) = ( MAX( 0.0,ZUSW(:) )/(PRHODREF(:)*PRREVAV(:)) ) * & - ( X0EVAR*PLBDAR(:)**XEX0EVAR+X1EVAR*PCJ(:)*PLBDAR(:)**XEX1EVAR ) - END WHERE - ENDIF - -ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN - !Evaporation in clear sky part - !With CLFR, rain is diluted over the grid box - !With PRFR, rain is concentrated in its fraction - !Use temperature and humidity in clear sky part like Bechtold et al. (1993) - IF (HSUBG_RR_EVAP=='CLFR') THEN - ZZW4(:)=1. !Precipitation fraction - ZZW3(:)=PLBDAR(:) - ELSE - ZZW4(:)=PRF(:) !Precipitation fraction - ZZW3(:)=PLBDAR_RF(:) - ENDIF - - !ATTENTION - !Il faudrait recalculer les variables PKA, PDV, PCJ en tenant compte de la température T^u - !Ces variables devraient être sorties de rain_ice_slow et on mettrait le calcul de T^u, T^s - !et plusieurs versions (comme actuellement, en ciel clair, en ciel nuageux) de PKA, PDV, PCJ dans rain_ice - !On utiliserait la bonne version suivant l'option NONE, CLFR... dans l'évaporation et ailleurs - DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &MAX(0., -SIGN(1., PCF(JL)-ZZW4(JL))) * & ! ZZW4(:) > PCF(:) - &PCOMPUTE(JL) - ENDDO - IF(LDSOFT) THEN - DO JL=1, KSIZE - PRREVAV(JL)=PRREVAV(JL)*ZMASK(JL) - ENDDO - ELSE - PRREVAV(:) = 0. - WHERE(ZMASK(:)==1) - ! outside the cloud (environment) the use of T^u (unsaturated) instead of T - ! Bechtold et al. 1993 - ! - ! T_l - ZTHLT(:) = PTHT(:) - XLVTT*PTHT(:)/XCPD/PT(:)*PRCT(:) - ! - ! T^u = T_l = theta_l * (T/theta) - ZZW2(:) = ZTHLT(:) * PT(:) / PTHT(:) - ! - ! es_w with new T^u - PRREVAV(:) = EXP( XALPW - XBETAW/ZZW2(:) - XGAMW*ALOG(ZZW2(:) ) ) - ! - ! S, Undersaturation over water (with new theta^u) - ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) ) - ! - PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(ZZW2(:)-XTT) )**2 / ( PKA(:)*XRV*ZZW2(:)**2 ) & - + ( XRV*ZZW2(:) ) / ( PDV(:)*PRREVAV(:) ) - ! - PRREVAV(:) = MAX( 0.0,ZUSW(:) )/(PRHODREF(:)*PRREVAV(:)) * & - ( X0EVAR*ZZW3(:)**XEX0EVAR+X1EVAR*PCJ(:)*ZZW3(:)**XEX1EVAR ) - ! - PRREVAV(:) = PRREVAV(:)*(ZZW4(:)-PCF(:)) - END WHERE - ENDIF - -ELSE - CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_WARM','wrong HSUBG_RR_EVAP case') -END IF -DO JL=1, KSIZE - PA_RR(JL) = PA_RR(JL) - PRREVAV(JL) - PA_RV(JL) = PA_RV(JL) + PRREVAV(JL) - PA_TH(JL) = PA_TH(JL) - PRREVAV(JL)*PLVFACT(JL) -ENDDO -! -! -END SUBROUTINE ICE4_WARM