diff --git a/src/MNH/lima_hail.f90 b/src/MNH/lima_hail.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9db77ce1fb2fb8a715a265b79732fd2f32b11c8f --- /dev/null +++ b/src/MNH/lima_hail.f90 @@ -0,0 +1,574 @@ +!MNH_LIC Copyright 2018-2019 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_LIMA_HAIL +! ################################# +! +INTERFACE + SUBROUTINE LIMA_HAIL (PTSTEP, LDCOMPUTE, & + PRHODREF, PPRES, PT, PKA, PDV, PCJ, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + PCCT, PCRT, PCIT, PCST, PCGT, PCHT, & + PLBDC, PLBDR, PLBDS, PLBDG, PLBDH, & + PLVFACT, PLSFACT, & + P_TH_WETH, P_RC_WETH, P_CC_WETH, P_RR_WETH, P_CR_WETH, & + P_RI_WETH, P_CI_WETH, P_RS_WETH, P_CS_WETH, P_RG_WETH, P_CG_WETH, P_RH_WETH, & + P_RG_COHG, P_CG_COHG, & + P_TH_HMLT, P_RR_HMLT, P_CR_HMLT, P_CH_HMLT, & + PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PPRES ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PKA ! +REAL, DIMENSION(:), INTENT(IN) :: PDV ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! +REAL, DIMENSION(:), INTENT(IN) :: PRHT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +REAL, DIMENSION(:), INTENT(IN) :: PCST ! +REAL, DIMENSION(:), INTENT(IN) :: PCGT ! +REAL, DIMENSION(:), INTENT(IN) :: PCHT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDH ! +! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETH +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_COHG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_COHG +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CH_HMLT +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CH +! +END SUBROUTINE LIMA_HAIL +END INTERFACE +END MODULE MODI_LIMA_HAIL +! +! ################################################################################# + SUBROUTINE LIMA_HAIL (PTSTEP, LDCOMPUTE, & + PRHODREF, PPRES, PT, PKA, PDV, PCJ, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + PCCT, PCRT, PCIT, PCST, PCGT, PCHT, & + PLBDC, PLBDR, PLBDS, PLBDG, PLBDH, & + PLVFACT, PLSFACT, & + P_TH_WETH, P_RC_WETH, P_CC_WETH, P_RR_WETH, P_CR_WETH, & + P_RI_WETH, P_CI_WETH, P_RS_WETH, P_CS_WETH, P_RG_WETH, P_CG_WETH, P_RH_WETH, & + P_RG_COHG, P_CG_COHG, & + P_TH_HMLT, P_RR_HMLT, P_CR_HMLT, P_CH_HMLT, & + PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH ) +! ################################################################################# +! +!! PURPOSE +!! ------- +!! Compute the wet/dry growth of graupel, associated Hallett-Mossop ice production, +!! and graupel melting rates +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT, XMD, XMV, XRD, XRV, XLVTT, XLMTT, XESTT, XCL, XCI, XCPV +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XCEXVT, LHAIL +USE MODD_PARAM_LIMA_MIXED, ONLY : NWETLBDAG, XWETINTP1G, XWETINTP2G, & + NWETLBDAH, X0DEPH, X1DEPH, XDH, XEX0DEPH, XEX1DEPH, & + XFWETH, XWETINTP1H, XWETINTP2H, & + NWETLBDAS, XWETINTP1S, XWETINTP2S, & + XKER_N_GWETH, XKER_GWETH, XKER_N_SWETH, XKER_SWETH, & + XFSWETH, XLBSWETH1, XLBSWETH2, XLBSWETH3, & + XFNSWETH, XLBNSWETH1, XLBNSWETH2, XLBNSWETH3, & + XFGWETH, XLBGWETH1, XLBGWETH2, XLBGWETH3, & + XFNGWETH, XLBNGWETH1, XLBNGWETH2, XLBNGWETH3 + +USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0, XCXS, XBS +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PPRES ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PKA ! +REAL, DIMENSION(:), INTENT(IN) :: PDV ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! +REAL, DIMENSION(:), INTENT(IN) :: PRHT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +REAL, DIMENSION(:), INTENT(IN) :: PCST ! +REAL, DIMENSION(:), INTENT(IN) :: PCGT ! +REAL, DIMENSION(:), INTENT(IN) :: PCHT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDH ! +! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETH +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_COHG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_COHG +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CH_HMLT +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CH +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRCT)) :: GWET +INTEGER :: JJ +! +REAL, DIMENSION(SIZE(PRCT)) :: Z1, Z2, Z3, Z4 +REAL, DIMENSION(SIZE(PRCT)) :: ZZX, ZZW, ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6 +REAL, DIMENSION(SIZE(PRCT)) :: ZZW3N, ZZW4N, ZZW6N +REAL, DIMENSION(SIZE(PRCT)) :: ZRWETH +! +INTEGER, DIMENSION(SIZE(PRCT)) :: IVEC1,IVEC2 ! Vectors of indices +REAL, DIMENSION(SIZE(PRCT)) :: ZVEC1,ZVEC2, ZVEC3 ! Work vectors +! +INTEGER :: NHAIL +REAL :: ZTHRH, ZTHRC +! +!------------------------------------------------------------------------------- +! +! +P_TH_WETH(:) = 0. +P_RC_WETH(:) = 0. +P_CC_WETH(:) = 0. +P_RR_WETH(:) = 0. +P_CR_WETH(:) = 0. +P_RI_WETH(:) = 0. +P_CI_WETH(:) = 0. +P_RS_WETH(:) = 0. +P_CS_WETH(:) = 0. +P_RG_WETH(:) = 0. +P_CG_WETH(:) = 0. +P_RH_WETH(:) = 0. +! +P_RG_COHG(:) = 0. +P_CG_COHG(:) = 0. +! +P_TH_HMLT(:) = 0. +P_RR_HMLT(:) = 0. +P_CR_HMLT(:) = 0. +P_CH_HMLT(:) = 0. +! +ZZW1(:) = 0. ! RCWETH +ZZW2(:) = 0. ! RIWETH +ZZW3(:) = 0. ! RSWETH +ZZW3N(:) = 0.! NSWETH +ZZW4(:) = 0. ! RGWETH +ZZW4N(:) = 0.! NGWETH +ZZW5(:) = 0. ! RCWETH+RRWETH +ZZW6(:) = 0. ! RSWETH +! +ZRWETH(:) = 0. +! +! +!* 1. Hail growth by collection (wet case only ?) +! ----------------------------------------------- +! +! 1.a Collection of rc and ri +! --------------------------- +! +WHERE( PRHT(:)>XRTMIN(7) .AND. PCHT(:)>XCTMIN(7) .AND. LDCOMPUTE(:) ) + ZZW(:) = PCHT(:) * PLBDH(:)**(-XDH-2.0) * PRHODREF(:)**(1-XCEXVT) + ZZW1(:) = XFWETH * PRCT(:) * ZZW(:) ! RCWETH + ZZW2(:) = XFWETH * PRIT(:) * ZZW(:) ! RIWETH +END WHERE +! +!* 1.b Collection of rs +! -------------------- +! +GWET(:) = PRST(:)>XRTMIN(5) .AND. PRHT(:)>XRTMIN(7) .AND. LDCOMPUTE(:) .AND. & + PCST(:)>XCTMIN(5) .AND. PCHT(:)>XCTMIN(7) +! +WHERE( GWET ) +! +!* Select the (ZLBDAG,ZLBDAS) couplet +! + ZVEC1(:) = PLBDH(:) + ZVEC2(:) = PLBDS(:) +! +!* find the next lower indice for the ZLBDAG and for the ZLBDAS +! in the geometrical set of (Lbda_g,Lbda_s) couplet use to +! tabulate the SDRYG-kernel +! + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NWETLBDAH)-0.0001, & + XWETINTP1H * LOG( ZVEC1(:) ) + XWETINTP2H ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) +! + ZVEC2(:) = MAX( 1.0001, MIN( REAL(NWETLBDAS)-0.0001, & + XWETINTP1S * LOG( ZVEC2(:) ) + XWETINTP2S ) ) + IVEC2(:) = INT( ZVEC2(:) ) + ZVEC2(:) = ZVEC2(:) - REAL( IVEC2(:) ) +! +!* perform the bilinear interpolation of the normalized +! SDRYG-kernel + ! + Z1(:) = GET_XKER_SWETH(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_SWETH(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_SWETH(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_SWETH(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW(:) = ZVEC3(:) + ZZW3(:) = XFSWETH * ZZW(:) & ! RSWETH + * PRST(:) * PCHT(:) & + * PRHODREF(:)**(1-XCEXVT) & + *( XLBSWETH1/( PLBDH(:)**2 ) + & + XLBSWETH2/( PLBDH(:) * PLBDS(:) ) + & + XLBSWETH3/( PLBDS(:)**2) ) +! + Z1(:) = GET_XKER_N_SWETH(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_N_SWETH(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_N_SWETH(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_N_SWETH(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW(:) = ZVEC3(:) + ZZW3N(:) = XFNSWETH * ZZW(:) & ! NSWETH + * PCST(:) * PCHT(:) & + * PRHODREF(:)**(1-XCEXVT) & + *( XLBNSWETH1/( PLBDH(:)**2 ) + & + XLBNSWETH2/( PLBDH(:) * PLBDS(:) ) + & + XLBNSWETH3/( PLBDS(:)**2) ) +END WHERE +! +!* 1.c Collection of rg +! --------------------- +! +GWET(:) = PRGT(:)>XRTMIN(6) .AND. PRHT(:)>XRTMIN(7) .AND. LDCOMPUTE(:) .AND. & + PCGT(:)>XCTMIN(6) .AND. PCHT(:)>XCTMIN(7) +! +WHERE( GWET ) +! +!* Select the (ZLBDAG,ZLBDAR) couplet +! + ZVEC1(:) = PLBDH(:) + ZVEC2(:) = PLBDG(:) +! +!* Find the next lower indice for the ZLBDAG and for the ZLBDAR +! in the geometrical set of (Lbda_g,Lbda_r) couplet use to +! tabulate the RDRYG-kernel +! + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NWETLBDAH)-0.0001, & + XWETINTP1H * LOG( ZVEC1(:) ) + XWETINTP2H ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) +! + ZVEC2(:) = MAX( 1.0001, MIN( REAL(NWETLBDAG)-0.0001, & + XWETINTP1G * LOG( ZVEC2(:) ) + XWETINTP2G ) ) + IVEC2(:) = INT( ZVEC2(:) ) + ZVEC2(:) = ZVEC2(:) - REAL( IVEC2(:) ) +! +!* Perform the bilinear interpolation of the normalized +! RDRYG-kernel +! + Z1(:) = GET_XKER_GWETH(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_GWETH(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_GWETH(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_GWETH(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW(:) = ZVEC3(:) + ZZW4(:) = XFGWETH * ZZW(:) & ! RGWETH + * PRGT(:) * PCHT(:) & + * PRHODREF(:)**(1-XCEXVT) & + *( XLBGWETH1/( PLBDH(:)**2 ) + & + XLBGWETH2/( PLBDH(:) * PLBDG(:) ) + & + XLBGWETH3/( PLBDG(:)**2) ) +! + Z1(:) = GET_XKER_N_GWETH(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_N_GWETH(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_N_GWETH(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_N_GWETH(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW(:) = ZVEC3(:) + ZZW4N(:) = XFNGWETH * ZZW(:) & ! NGWETH + * PCGT(:) * PCHT(:) & + * PRHODREF(:)**(1-XCEXVT) & + *( XLBNGWETH1/( PLBDH(:)**2 ) + & + XLBNGWETH2/( PLBDH(:) * PLBDG(:) ) + & + XLBNGWETH3/( PLBDG(:)**2) ) + +END WHERE +! +! 1.e Wet growth of hail +! ---------------------- +! +ZZW(:) = 0.0 +WHERE( PRGT(:)>XRTMIN(6) .AND. PCGT(:) >XCTMIN(6) .AND. LDCOMPUTE(:) ) + ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure + ZZW(:) = PKA(:)*(XTT-PT(:)) + & + ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*PT(:)) ) +! +! Total mass gained by hail in wet mode + ZRWETH(:) = MAX( 0.0, & + ( ZZW(:) * PCHT(:) * ( X0DEPH* PLBDH(:)**XEX0DEPH + & + X1DEPH*PCJ(:)*PLBDH(:)**XEX1DEPH ) + & + ( ZZW2(:)+ZZW3(:)+ZZW4(:) ) * ( XLMTT + (XCI-XCL)*(XTT-PT(:)) ) ) & + / (XLMTT-XCL*(XTT-PT(:))) ) + ! We must agregate, at least, the cold species + ZRWETH(:)=MAX(ZRWETH(:), ZZW2(:)+ZZW3(:)+ZZW4(:)) + ! Mass of rain and cloud droplets frozen by hail (RCWETH + RRWETH) + ZZW5(:) = ZRWETH(:) - ZZW2(:) - ZZW3(:) - ZZW4(:) +END WHERE +! +ZZW(:) = 0.0 +WHERE( LDCOMPUTE(:) .AND. PT(:)<XTT .AND. ZZW5(:)>0.0 ) + P_RC_WETH(:) = - ZZW1(:) + P_CC_WETH(:) = P_RC_WETH(:) * PCCT(:)/MAX(PRCT(:),XRTMIN(2)) + P_RR_WETH(:) = - ZZW5(:) + ZZW1(:) + P_CR_WETH(:) = P_RR_WETH(:) * PCRT(:)/MAX(PRRT(:),XRTMIN(3)) + P_RI_WETH(:) = - ZZW2(:) + P_CI_WETH(:) = P_RI_WETH(:) * PCIT(:)/MAX(PRIT(:),XRTMIN(4)) + P_RS_WETH(:) = - ZZW3(:) + P_CS_WETH(:) = - ZZW3N(:) + P_RG_WETH(:) = - ZZW4(:) + P_CG_WETH(:) = - ZZW4N(:) + P_RH_WETH(:) = ZRWETH(:) + ! + P_TH_WETH(:) = ZZW5(:) * (PLSFACT(:)-PLVFACT(:)) +END WHERE +! +! +!* 2. Hail -> graupel conversion (COHG) +! ------------------------------------- +! +ZTHRH=0.01E-3 +ZTHRC=0.001E-3 +ZZW(:) = 0.0 +GWET(:) = PRHT(:)<ZTHRH .AND. PRCT(:)<ZTHRC .AND. PT(:)<XTT +WHERE( GWET(:) ) + P_RG_COHG(:) = PRHT * MIN( 1.0,MAX( 0.0,1.0-(PRCT(:)/ZTHRC) ) ) + P_CG_COHG(:) = P_RG_COHG(:) * PCHT(:)/MAX(PRHT(:),XRTMIN(7)) +END WHERE +! +! +!* 3. Hail Melting (HMLT) +! ----------------------- +! +ZZW(:) = 0.0 +WHERE( PRHT(:)>XRTMIN(6) .AND. PCHT(:)>XCTMIN(7) .AND. PT(:)>XTT .AND. LDCOMPUTE(:) ) + ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure + ZZW(:) = PKA(:)*(XTT-PT(:)) + & + ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*PT(:)) ) +! +! compute RHMLTR +! + ZZW(:) = MAX( 0.0,( -ZZW(:) * PCHT(:) * & + ( X0DEPH* PLBDH(:)**XEX0DEPH + & + X1DEPH*PCJ(:)*PLBDH(:)**XEX1DEPH ) - & + ( ZZW5(:) ) * ( XCL*(XTT-PT(:))) ) & + / XLMTT ) + P_RR_HMLT(:) = ZZW(:) + P_CR_HMLT(:) = ZZW(:) * 5.0E6 ! obtained after averaging, Dshed=1mm and 500 microns + P_CH_HMLT(:) = - ZZW(:) * PCHT(:)/PRHT(:) + ! + P_TH_HMLT(:) = - P_RR_HMLT(:) * (PLSFACT(:)-PLVFACT(:)) +END WHERE +! +! +! +! +PA_RC(:) = PA_RC(:) + P_RC_WETH(:) +PA_CC(:) = PA_CC(:) + P_CC_WETH(:) +PA_RR(:) = PA_RR(:) + P_RR_WETH(:) + P_RR_HMLT(:) +PA_CR(:) = PA_CR(:) + P_CR_WETH(:) + P_CR_HMLT(:) +PA_RI(:) = PA_RI(:) + P_RI_WETH(:) +PA_CI(:) = PA_CI(:) + P_CI_WETH(:) +PA_RS(:) = PA_RS(:) + P_RS_WETH(:) +PA_CS(:) = PA_CS(:) + P_CS_WETH(:) +PA_RG(:) = PA_RG(:) + P_RG_WETH(:) + P_RG_COHG(:) +PA_CG(:) = PA_CG(:) + P_CG_WETH(:) + P_CG_COHG(:) +PA_RH(:) = PA_RH(:) + P_RH_WETH(:) - P_RG_COHG(:) - P_RR_HMLT(:) +PA_CH(:) = PA_CH(:) - P_CG_COHG(:) + P_CH_HMLT(:) +PA_TH(:) = PA_TH(:) + P_TH_WETH(:) + P_TH_HMLT(:) +! +!------------------------------------------------------------------------------- +! +CONTAINS + FUNCTION GET_XKER_SWETH(GRAUPEL,SNOW) RESULT(RET) + INTEGER, DIMENSION(:) :: GRAUPEL + INTEGER, DIMENSION(:) :: SNOW + REAL, DIMENSION(SIZE(SNOW)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(GRAUPEL) + RET(I) = XKER_SWETH(MAX(MIN(GRAUPEL(I),SIZE(XKER_SWETH,1)),1),MAX(MIN(SNOW(I),SIZE(XKER_SWETH,2)),1)) + END DO + END FUNCTION GET_XKER_SWETH +! +!------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_N_SWETH(GRAUPEL,SNOW) RESULT(RET) + INTEGER, DIMENSION(:) :: GRAUPEL + INTEGER, DIMENSION(:) :: SNOW + REAL, DIMENSION(SIZE(SNOW)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(GRAUPEL) + RET(I) = XKER_N_SWETH(MAX(MIN(GRAUPEL(I),SIZE(XKER_N_SWETH,1)),1),MAX(MIN(SNOW(I),SIZE(XKER_N_SWETH,2)),1)) + END DO + END FUNCTION GET_XKER_N_SWETH +! +!------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_GWETH(GRAUPEL,SNOW) RESULT(RET) + INTEGER, DIMENSION(:) :: GRAUPEL + INTEGER, DIMENSION(:) :: SNOW + REAL, DIMENSION(SIZE(SNOW)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(GRAUPEL) + RET(I) = XKER_GWETH(MAX(MIN(GRAUPEL(I),SIZE(XKER_GWETH,1)),1),MAX(MIN(SNOW(I),SIZE(XKER_GWETH,2)),1)) + END DO + END FUNCTION GET_XKER_GWETH +! +!------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_N_GWETH(GRAUPEL,SNOW) RESULT(RET) + INTEGER, DIMENSION(:) :: GRAUPEL + INTEGER, DIMENSION(:) :: SNOW + REAL, DIMENSION(SIZE(SNOW)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(GRAUPEL) + RET(I) = XKER_N_GWETH(MAX(MIN(GRAUPEL(I),SIZE(XKER_N_GWETH,1)),1),MAX(MIN(SNOW(I),SIZE(XKER_N_GWETH,2)),1)) + END DO + END FUNCTION GET_XKER_N_GWETH +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_HAIL diff --git a/src/MNH/lima_hail_deposition.f90 b/src/MNH/lima_hail_deposition.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1b411138fdfc344c7ab8cdc4043bc37e737baa2e --- /dev/null +++ b/src/MNH/lima_hail_deposition.f90 @@ -0,0 +1,100 @@ +!MNH_LIC Copyright 2018-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_LIMA_HAIL_DEPOSITION +! ################################# +! +INTERFACE + SUBROUTINE LIMA_HAIL_DEPOSITION (LDCOMPUTE, PRHODREF, & + PRHT, PCHT, PSSI, PLBDH, PAI, PCJ, PLSFACT, & + P_TH_DEPH, P_RH_DEPH ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRHT ! hail mr +REAL, DIMENSION(:), INTENT(IN) :: PCHT ! hail conc +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDH ! +REAL, DIMENSION(:), INTENT(IN) :: PAI ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_DEPH +!! +END SUBROUTINE LIMA_HAIL_DEPOSITION +END INTERFACE +END MODULE MODI_LIMA_HAIL_DEPOSITION +! +! ########################################################################### + SUBROUTINE LIMA_HAIL_DEPOSITION (LDCOMPUTE, PRHODREF, & + PRHT, PCHT, PSSI, PLBDH, PAI, PCJ, PLSFACT, & + P_TH_DEPH, P_RH_DEPH ) +! ########################################################################### +! +!! PURPOSE +!! ------- +!! Deposition of water vapour on graupel +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +! M. Taufour 07/2022 add concentration for snow, graupel, hail +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_MIXED, ONLY : X0DEPH, XEX0DEPH, X1DEPH, XEX1DEPH +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRHT ! hail mr +REAL, DIMENSION(:), INTENT(IN) :: PCHT ! hail conc +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDH ! +REAL, DIMENSION(:), INTENT(IN) :: PAI ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_DEPH +! +! +!------------------------------------------------------------------------------- +! +! +!* 1. Deposition of vapour on graupel +! ------------------------------- +! +P_TH_DEPH(:) = 0.0 +P_RH_DEPH(:) = 0.0 +WHERE ( PRHT(:)>XRTMIN(7) .AND. PCHT(:)>XCTMIN(7) .AND. LDCOMPUTE(:) ) + P_RH_DEPH(:) = PSSI(:) / PAI(:) * PCHT(:) * & + ( X0DEPH*PLBDH(:)**XEX0DEPH + X1DEPH*PCJ(:)*PLBDH(:)**XEX1DEPH ) + P_TH_DEPH(:) = P_RH_DEPH(:)*PLSFACT(:) +END WHERE +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_HAIL_DEPOSITION diff --git a/src/MNH/lima_snow_self_collection.f90 b/src/MNH/lima_snow_self_collection.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9c499d66648bb390997c5918487a4d2d46ed69fc --- /dev/null +++ b/src/MNH/lima_snow_self_collection.f90 @@ -0,0 +1,147 @@ +!MNH_LIC Copyright 2018-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_LIMA_SNOW_SELF_COLLECTION +! ################################# +! +INTERFACE + SUBROUTINE LIMA_SNOW_SELF_COLLECTION (LDCOMPUTE, & + PRHODREF, PT, & + PCST, PLBDS, & + P_CS_SSC ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature +! +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_CS_SSC +! +END SUBROUTINE LIMA_SNOW_SELF_COLLECTION +END INTERFACE +END MODULE MODI_LIMA_SNOW_SELF_COLLECTION +! +! ############################################################# + SUBROUTINE LIMA_SNOW_SELF_COLLECTION (LDCOMPUTE, & + PRHODREF, PT, & + PCST, PLBDS, & + P_CS_SSC ) +! ############################################################# +! +!! PURPOSE +!! ------- +!! Compute the self-collection and physical break-up of snow +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT +USE MODD_PARAM_LIMA, ONLY : XCTMIN, XCEXVT +USE MODD_PARAM_LIMA_COLD, ONLY : NSCLBDAS, XSCINTP1S, XSCINTP2S, XKER_N_SSCS, XFNSSCS, XCOLEXSS, & + XLBNSSCS1, XLBNSSCS2 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature +! +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_CS_SSC +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PCST)) :: & + ZW1, & ! work arrays + ZW2 +LOGICAL, DIMENSION(SIZE(PCST)) :: GSSC +INTEGER :: IGSSC, JJ +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1,IVEC2 ! Vectors of indices +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2, ZVEC3 ! Work vectors +! +!------------------------------------------------------------------------------- +! +! +!* 1. Snow self-collection and break-up +! --------------------------------- +! +! +P_CS_SSC(:)=0. +! +ZW1(:) =0. +ZW2(:) =0. +! +GSSC(:) = PCST(:)>XCTMIN(5) +IGSSC = COUNT(GSSC(:)) +! +IF( IGSSC>0 ) THEN +! +! 1.3N.0 allocations +! + ALLOCATE(ZVEC1(IGSSC)) + ALLOCATE(IVEC1(IGSSC)) +! +! 1.3N.1 select the (ZLBDAS,ZLBDAS) couplet +! + ZVEC1(:) = PACK( PLBDS(:),MASK=GSSC(:) ) +! +! 1.3N.2 find the next lower indice for the ZLBDAS and for the ZLBDAS +! in the geometrical set of (Lbda_s,Lbda_s) couplet use to +! tabulate the SACCS-kernel +! + ZVEC1(1:IGSSC) = MAX( 1.0001, MIN( FLOAT(NSCLBDAS)-0.0001, & + XSCINTP1S * LOG( ZVEC1(1:IGSSC) ) + XSCINTP2S ) ) + IVEC1(1:IGSSC) = INT( ZVEC1(1:IGSSC) ) + ZVEC1(1:IGSSC) = ZVEC1(1:IGSSC) - FLOAT( IVEC1(1:IGSSC) ) +! +! 1.3N.3 perform the bilinear interpolation of the normalized +! SSCS-kernel +! + ALLOCATE(ZVEC3(IGSSC)) + DO JJ = 1,IGSSC + ZVEC3(JJ) = ( XKER_N_SSCS(IVEC1(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_N_SSCS(IVEC1(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_N_SSCS(IVEC1(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_N_SSCS(IVEC1(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZW1(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GSSC(:),FIELD=0.0 ) !! NSACCS + DEALLOCATE(ZVEC3) +! + WHERE( GSSC(:) ) + P_CS_SSC(:) = - XFNSSCS * ZW1(:) * EXP( XCOLEXSS*(PT(:)-XTT) ) * PCST(:)**2 & + * PRHODREF(:)**(-XCEXVT-1.) * (XLBNSSCS1+XLBNSSCS2) / PLBDS(:)**2 + END WHERE + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC1) +END IF +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_SNOW_SELF_COLLECTION diff --git a/src/MNH/nrcolss.f90 b/src/MNH/nrcolss.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d21be2bd3b12000a5c5871c47e9ba5faa22d84f5 --- /dev/null +++ b/src/MNH/nrcolss.f90 @@ -0,0 +1,316 @@ +!MNH_LIC Copyright 1994-2014 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. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/11/23 10:39:56 +!----------------------------------------------------------------- +! ################### + MODULE MODI_NRCOLSS +! ################### +! +INTERFACE +! + SUBROUTINE NRCOLSS( KND, PALPHAS, PNUS, PALPHAR, PNUR, & + PESR, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR,& + PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & + PDINFTY, PNRCOLSS, PAG, PBS, PAS ) +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DS and DR +! +REAL, INTENT(IN) :: PALPHAS ! First shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUS ! Second shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAR ! First shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUR ! Second shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PESR ! Efficiency of aggregates collecting rain +REAL, INTENT(IN) :: PFALLS ! Fall speed constant of aggregates +REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of aggregates +REAL, INTENT(IN) :: PFALLEXPS ! Fall speed exponential of aggregates (Thompson 2008) +REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain +REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain +REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of aggregates +REAL, INTENT(IN) :: PLBDARMAX ! Maximun slope of size distribution of rain +REAL, INTENT(IN) :: PLBDASMIN ! Minimun slope of size distribution of aggregates +REAL, INTENT(IN) :: PLBDARMIN ! Minimun slope of size distribution of rain +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +REAL, INTENT(IN) :: PAG, PBS, PAS +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNRCOLSS! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! + END SUBROUTINE NRCOLSS +! +END INTERFACE +! + END MODULE MODI_NRCOLSS +! ######################################################################## + SUBROUTINE NRCOLSS( KND, PALPHAS, PNUS, PALPHAR, PNUR, & + PESR, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR,& + PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & + PDINFTY, PNRCOLSS, PAG, PBS, PAS ) +! ######################################################################## +! +! +! +!!**** * - Build up a look-up table containing the scaled fall speed +!! difference between size distributed particles of aggregates and Z +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to integrate numerically the scaled fall +!! speed difference between aggregates and rain for use in collection +!! kernels FOR CONCENTRATIONS. A first integral of the form +!! +!! infty Dz_max +!! / / +!! |{| } +!! |{| E_xz (Dx+Dz)^2 |cxDx^dx-czDz^dz| n(Dz) dDz} n(Dx) dDx +!! |{| } +!! / / +!! 0 Dz_min +!! +!! is evaluated and normalised by a second integral of the form +!! +!! infty +!! / / +!! |{| } +!! |{| (Dx+Dz)^2 n(Dz) dDz} n(Dx) dDx +!! |{| } +!! / / +!! 0 +!! +!! The result is stored in a two-dimensional array. +!! +!!** METHOD +!! ------ +!! The free parameters of the size distribution function of aggregates and Z +!! (slope parameter LAMBDA) are discretized with a geometrical rate in a +!! specific range +!! LAMBDA = exp( (Log(LAMBDA_max) - Log(LAMBDA_min))/N_interval ) +!! The two above integrals are performed using the trapezoidal scheme. +!! +!! EXTERNAL +!! -------- +!! MODI_GENERAL_GAMMA: Generalized gamma distribution law +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CST : XPI,XRHOLW +!! MODD_RAIN_ICE_DESCR: XAS,XAS,XBS +!! +!! REFERENCE +!! --------- +!! B.S. Ferrier , 1994 : A Double-Moment Multiple-Phase Four-Class +!! Bulk Ice Scheme,JAS,51,249-280. +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 8/11/95 +!! M. Taufour 03/2022 Adapted from rrcolss for concentration +!! J. Wurtz 03/2022 New snow characteristics +!! +!------------------------------------------------------------------------------- +! +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODI_GENERAL_GAMMA +! +USE MODD_CST +USE MODD_RAIN_ICE_DESCR +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of dummy arguments +! ------------------------------- +! +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DS and DR +! +REAL, INTENT(IN) :: PALPHAS ! First shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUS ! Second shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAR ! First shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUR ! Second shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PESR ! Efficiency of aggregates collecting rain +REAL, INTENT(IN) :: PFALLS ! Fall speed constant of aggregates +REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of aggregates +REAL, INTENT(IN) :: PFALLEXPS ! Fall speed exponential of aggregates (Thompson 2008) +REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain +REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain +REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of aggregates +REAL, INTENT(IN) :: PLBDARMAX ! Maximun slope of size distribution of rain +REAL, INTENT(IN) :: PLBDASMIN ! Minimun slope of size distribution of aggregates +REAL, INTENT(IN) :: PLBDARMIN ! Minimun slope of size distribution of rain +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +REAL, INTENT(IN) :: PAG, PBS, PAS +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNRCOLSS! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! +INTEGER :: JLBDAS ! Slope index of the size distribution of aggregates +INTEGER :: JLBDAR ! Slope index of the size distribution of rain +INTEGER :: JDS ! Diameter index of a particle of aggregates +INTEGER :: JDR ! Diameter index of a particle of rain +! +INTEGER :: INR ! Number of diameter step for the partial integration +! +! +REAL :: ZLBDAS ! Current slope parameter LAMBDA of aggregates +REAL :: ZLBDAR ! Current slope parameter LAMBDA of rain +REAL :: ZDLBDAS ! Growth rate of the slope parameter LAMBDA of aggregates +REAL :: ZDLBDAR ! Growth rate of the slope parameter LAMBDA of rain +REAL :: ZDDS ! Integration step of the diameter of aggregates +REAL :: ZDDSCALR! Integration step of the diameter of rain (scaling integral) +REAL :: ZDDCOLLR! Integration step of the diameter of rain (fallspe integral) +REAL :: ZDS ! Current diameter of the particle aggregates +REAL :: ZDR ! Current diameter of the rain +REAL :: ZDRMAX ! Maximal diameter of the raindrops where the integration ends +REAL :: ZCOLLR ! Single integral of the mass weighted fall speed difference + ! over the spectrum of rain +REAL :: ZCOLLDRMAX ! Maximum ending point for the partial integral +REAL :: ZCOLLSR ! Double integral of the mass weighted fall speed difference + ! over the spectra of aggregates and rain +REAL :: ZSCALR ! Single integral of the scaling factor over + ! the spectrum of rain +REAL :: ZSCALSR ! Double integral of the scaling factor over + ! the spectra of aggregates and rain +REAL :: ZFUNC ! Ancillary function +REAL :: ZCST1 +! +! +!------------------------------------------------------------------------------- +! +! +!* 1 COMPUTE THE SCALED VELOCITY DIFFERENCE IN THE MASS +!* COLLECTION KERNEL, +! ------------------------------------------------- +! +! +! +!* 1.0 Initialization +! +PNRCOLSS(:,:) = 0.0 +ZCST1 = (3.0/XPI)/XRHOLW +! +!* 1.1 Compute the growth rate of the slope factors LAMBDA +! +ZDLBDAS = EXP( LOG(PLBDASMAX/PLBDASMIN)/REAL(SIZE(PNRCOLSS(:,:),1)-1) ) +ZDLBDAR = EXP( LOG(PLBDARMAX/PLBDARMIN)/REAL(SIZE(PNRCOLSS(:,:),2)-1) ) +! +!* 1.2 Scan the slope factors LAMBDAX and LAMBDAZ +! +DO JLBDAS = 1,SIZE(PNRCOLSS(:,:),1) + ZLBDAS = PLBDASMIN * ZDLBDAS ** (JLBDAS-1) +! +!* 1.3 Compute the diameter steps +! + ZDDS = PDINFTY / (REAL(KND) * ZLBDAS) + DO JLBDAR = 1,SIZE(PNRCOLSS(:,:),2) + ZLBDAR = PLBDARMIN * ZDLBDAR ** (JLBDAR-1) +! +!* 1.4 Initialize the collection integrals +! + ZSCALSR = 0.0 + ZCOLLSR = 0.0 +! +!* 1.5 Compute the diameter steps +! + ZDDSCALR = PDINFTY / (REAL(KND) * ZLBDAR) +! +!* 1.6 Scan over the diameters DS and DR +! + DO JDS = 1,KND-1 + ZDS = ZDDS * REAL(JDS) + ZSCALR = 0.0 + ZCOLLR = 0.0 + DO JDR = 1,KND-1 + ZDR = ZDDSCALR * REAL(JDR) +! +!* 1.7 Compute the normalization factor by integration over the +! dimensional spectrum of rain +! + ZSCALR = ZSCALR + (ZDS+ZDR)**2 * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) + END DO +! +!* 1.8 Compute the scaled fall speed difference by partial +! integration over the dimensional spectrum of rain +! + ZFUNC = PAG - PAS*ZDS**(PBS-3.0) ! approximate limit is Ds=240 microns + IF( ZFUNC>0.0 ) THEN + ZDRMAX = ZDS*( ZCST1*ZFUNC )**0.3333333 + ELSE + ZDRMAX = PDINFTY / ZLBDAR + END IF + IF( ZDS>1.0E-4 ) THEN ! allow computation if Ds>100 microns + ! corresponding to a maximal density of the aggregates of XRHOLW + IF( ZDRMAX >= 0.5*ZDDSCALR ) THEN + INR = CEILING( ZDRMAX/ZDDSCALR ) + ZDDCOLLR = ZDRMAX / REAL(INR) + IF (INR>=KND ) THEN + INR = KND + ZDDCOLLR = ZDDSCALR + END IF + DO JDR = 1,INR-1 + ZDR = ZDDCOLLR * REAL(JDR) + ZCOLLR = ZCOLLR + (ZDS+ZDR)**2 & + * PESR * ABS(PFALLS*ZDS**PEXFALLS * EXP(-(PFALLEXPS*ZDS)**PALPHAS)-PFALLR*ZDR**PEXFALLR) & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) + END DO + ZCOLLDRMAX = (ZDS+ZDRMAX)**2 & + * PESR * ABS(PFALLS*ZDS**PEXFALLS* EXP(-(PFALLEXPS*ZDS)**PALPHAS)-PFALLR*ZDRMAX**PEXFALLR) & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMAX) + ZCOLLR = (ZCOLLR + 0.5*ZCOLLDRMAX)*(ZDDCOLLR/ZDDSCALR) +! +!* 1.9 Compute the normalization factor by integration over the +! dimensional spectrum of aggregates +! + ZFUNC = GENERAL_GAMMA(PALPHAS,PNUS,ZLBDAS,ZDS) + ZSCALSR = ZSCALSR + ZSCALR * ZFUNC +! +!* 1.10 Compute the scaled fall speed difference by integration over +! the dimensional spectrum of aggregates +! + ZCOLLSR = ZCOLLSR + ZCOLLR * ZFUNC + END IF +! +! Otherwise ZDRMAX = 0.0 so the density of the graupel cannot be reached +! and so PRRCOLSS(JLBDAS,JLBDAR) = 0.0 ! +! + END IF + END DO +! +!* 1.11 Scale the fall speed difference +! + IF( ZSCALSR>0.0 ) PNRCOLSS(JLBDAS,JLBDAR) = ZCOLLSR / ZSCALSR + END DO +END DO +! +END SUBROUTINE NRCOLSS diff --git a/src/MNH/nscolrg.f90 b/src/MNH/nscolrg.f90 new file mode 100644 index 0000000000000000000000000000000000000000..790a01f76a32fef7603ff99d7ad1339a657fbb80 --- /dev/null +++ b/src/MNH/nscolrg.f90 @@ -0,0 +1,317 @@ +!MNH_LIC Copyright 1994-2014 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. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/11/23 10:43:02 +!----------------------------------------------------------------- +! ################### + MODULE MODI_NSCOLRG +! ################### +! +INTERFACE +! + SUBROUTINE NSCOLRG( KND, PALPHAS, PZNUS, PALPHAR, PNUR, & + PESR, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR,& + PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & + PDINFTY, PNSCOLRG,PAG, PBS, PAS ) +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DS and DR +! +REAL, INTENT(IN) :: PALPHAS ! First shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PZNUS ! Second shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAR ! First shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUR ! Second shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PESR ! Efficiency of the aggregates collecting rain +REAL, INTENT(IN) :: PFALLS ! Fall speed constant of the aggregates +REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of the aggregates +REAL, INTENT(IN) :: PFALLEXPS ! Fall speed exponential constant of the aggregates +REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain +REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain +REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of the aggregates +REAL, INTENT(IN) :: PLBDARMAX ! Maximun slope of size distribution of rain +REAL, INTENT(IN) :: PLBDASMIN ! Minimun slope of size distribution of the aggregates +REAL, INTENT(IN) :: PLBDARMIN ! Minimun slope of size distribution of rain +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +REAL, INTENT(IN) :: PAG, PBS, PAS +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNSCOLRG! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! + END SUBROUTINE NSCOLRG +! +END INTERFACE +! + END MODULE MODI_NSCOLRG +! ######################################################################## + SUBROUTINE NSCOLRG( KND, PALPHAS, PZNUS, PALPHAR, PNUR, & + PESR, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR,& + PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & + PDINFTY, PNSCOLRG,PAG, PBS, PAS ) +! ######################################################################## +! +! +! +!!**** * - Build up a look-up table containing the scaled fall speed +!! difference between size distributed particles of the aggregates and Z +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to integrate numerically the scaled fall +!! speed difference between aggregates and rain for use in collection +!! kernels. A first integral of the form +!! +!! infty Dz_max +!! / / +!! |{| } +!! |{| E_xz (Dx+Dz)^2 |cxDx^dx-czDz^dz| n(Dz) dDz} n(Dx) dDx +!! |{| } +!! / / +!! 0 Dz_min +!! +!! is evaluated and normalised by a second integral of the form +!! +!! infty +!! / / +!! |{| } +!! |{| (Dx+Dz)^2 n(Dz) dDz} n(Dx) dDx +!! |{| } +!! / / +!! 0 +!! +!! The result is stored in a two-dimensional array. +!! +!!** METHOD +!! ------ +!! The free parameters of the size distribution function of the aggregates +!! and Z (slope parameter LAMBDA) are discretized with a geometrical rate +!! in a specific range +!! LAMBDA = exp( (Log(LAMBDA_max) - Log(LAMBDA_min))/N_interval ) +!! The two above integrals are performed using the trapezoidal scheme. +!! +!! EXTERNAL +!! -------- +!! MODI_GENERAL_GAMMA: Generalized gamma distribution law +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CST : XPI,XRHOLW +!! MODD_RAIN_ICE_DESCR: XAS,XAS,XBS +!! +!! REFERENCE +!! --------- +!! B.S. Ferrier , 1994 : A Double-Moment Multiple-Phase Four-Class +!! Bulk Ice Scheme,JAS,51,249-280. +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 8/11/95 +!! M. Taufour 03/2022 Adapted from rscolrg for concentration +!! J. Wurtz 03/2022 New snow characteristics +!! +!------------------------------------------------------------------------------- +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_GENERAL_GAMMA +! +USE MODD_CST +USE MODD_RAIN_ICE_DESCR +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments +! ------------------------------- +! +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DS and DR +! +REAL, INTENT(IN) :: PALPHAS ! First shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PZNUS ! Second shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAR ! First shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUR ! Second shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PESR ! Efficiency of the aggregates collecting rain +REAL, INTENT(IN) :: PFALLS ! Fall speed constant of the aggregates +REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of the aggregates +REAL, INTENT(IN) :: PFALLEXPS ! Fall speed exponential constant of the aggregates +REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain +REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain +REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of the aggregates +REAL, INTENT(IN) :: PLBDARMAX ! Maximun slope of size distribution of rain +REAL, INTENT(IN) :: PLBDASMIN ! Minimun slope of size distribution of the aggregates +REAL, INTENT(IN) :: PLBDARMIN ! Minimun slope of size distribution of rain +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +REAL, INTENT(IN) :: PAG, PBS, PAS +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNSCOLRG! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! +INTEGER :: JLBDAS ! Slope index of the size distribution of the aggregates +INTEGER :: JLBDAR ! Slope index of the size distribution of rain +INTEGER :: JDS ! Diameter index of a particle of the aggregates +INTEGER :: JDR ! Diameter index of a particle of rain +! +INTEGER :: INR ! Number of diameter step for the partial integration +! +REAL :: ZLBDAS ! Current slope parameter LAMBDA of the aggregates +REAL :: ZLBDAR ! Current slope parameter LAMBDA of rain +REAL :: ZDLBDAS ! Growth rate of the slope parameter LAMBDA of the aggregates +REAL :: ZDLBDAR ! Growth rate of the slope parameter LAMBDA of rain +REAL :: ZDDS ! Integration step of the diameter of the aggregates +REAL :: ZDDSCALR! Integration step of the diameter of rain (scaling integral) +REAL :: ZDDCOLLR! Integration step of the diameter of rain (fallspe integral) +REAL :: ZDS ! Current diameter of the particle aggregates +REAL :: ZDR ! Current diameter of the raindrops +REAL :: ZDRMIN ! Minimal diameter of the raindrops where the integration starts +REAL :: ZDRMAX ! Maximal diameter of the raindrops where the integration ends +REAL :: ZCOLLR ! Single integral of the mass weighted fall speed difference + ! over the spectrum of rain +REAL :: ZCOLLDRMIN ! Minimum ending point for the partial integral +REAL :: ZCOLLSR ! Double integral of the mass weighted fall speed difference + ! over the spectra of the aggregates and rain +REAL :: ZSCALR ! Single integral of the scaling factor over + ! the spectrum of rain +REAL :: ZSCALSR ! Double integral of the scaling factor over + ! the spectra of the aggregates and rain +REAL :: ZFUNC ! Ancillary function +REAL :: ZCST1 +! +! +!------------------------------------------------------------------------------- +! +! +!* 1 COMPUTE THE SCALED VELOCITY DIFFERENCE IN THE MASS +!* COLLECTION KERNEL, +! ------------------------------------------------- +! +! +!* 1.0 Initialization +! +PNSCOLRG(:,:) = 0.0 +ZCST1 = (3.0/XPI)/XRHOLW +! +!* 1.1 Compute the growth rate of the slope factors LAMBDA +! +ZDLBDAR = EXP( LOG(PLBDARMAX/PLBDARMIN)/REAL(SIZE(PNSCOLRG(:,:),1)-1) ) +ZDLBDAS = EXP( LOG(PLBDASMAX/PLBDASMIN)/REAL(SIZE(PNSCOLRG(:,:),2)-1) ) +! +!* 1.2 Scan the slope factors LAMBDAX and LAMBDAZ +! +DO JLBDAR = 1,SIZE(PNSCOLRG(:,:),1) + ZLBDAR = PLBDARMIN * ZDLBDAR ** (JLBDAR-1) + ZDRMAX = PDINFTY / ZLBDAR +! +!* 1.3 Compute the diameter steps +! + ZDDSCALR = PDINFTY / (REAL(KND) * ZLBDAR) + DO JLBDAS = 1,SIZE(PNSCOLRG(:,:),2) + ZLBDAS = PLBDASMIN * ZDLBDAS ** (JLBDAS-1) +! +!* 1.4 Initialize the collection integrals +! + ZSCALSR = 0.0 + ZCOLLSR = 0.0 +! +!* 1.5 Compute the diameter steps +! + ZDDS = PDINFTY / (REAL(KND) * ZLBDAS) +! +!* 1.6 Scan over the diameters DS and DR +! + DO JDS = 1,KND-1 + ZDS = ZDDS * REAL(JDS) + ZSCALR = 0.0 + ZCOLLR = 0.0 + DO JDR = 1,KND-1 + ZDR = ZDDSCALR * REAL(JDR) +! +!* 1.7 Compute the normalization factor by integration over the +! dimensional spectrum of rain +! + ZSCALR = ZSCALR + (ZDS+ZDR)**2 * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) + END DO +! +!* 1.8 Compute the scaled fall speed difference by partial +! integration over the dimensional spectrum of rain +! + ZFUNC = PAG - PAS*ZDS**(PBS-3.0) ! approximate limit is Ds=240 microns + IF( ZFUNC>0.0 ) THEN + ZDRMIN = ZDS*( ZCST1*ZFUNC )**0.3333333 + ELSE + ZDRMIN = 0.0 + END IF + IF( ZDS>1.0E-4 ) THEN ! allow computation if Ds>100 microns + ! corresponding to a maximal density of the aggregates of XRHOLW + IF( (ZDRMAX-ZDRMIN) >= 0.5*ZDDSCALR ) THEN + INR = CEILING( (ZDRMAX-ZDRMIN)/ZDDSCALR ) + ZDDCOLLR = (ZDRMAX-ZDRMIN) / REAL(INR) + DO JDR = 1,INR-1 + ZDR = ZDDCOLLR * REAL(JDR) + ZDRMIN + ZCOLLR = ZCOLLR + (ZDS+ZDR)**2 & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) & + * PESR * ABS(PFALLS*ZDS**PEXFALLS*EXP(-(ZDS*PFALLEXPS)**PALPHAS)-PFALLR*ZDR**PEXFALLR) + END DO + IF( ZDRMIN>0.0 ) THEN + ZCOLLDRMIN = (ZDS+ZDRMIN)**2 & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMIN) & + * PESR * ABS(PFALLS*ZDS**PEXFALLS*EXP(-(ZDS*PFALLEXPS)**PALPHAS)-PFALLR*ZDRMIN**PEXFALLR) + ELSE + ZCOLLDRMIN = 0.0 + END IF + ZCOLLR = (ZCOLLR + 0.5*ZCOLLDRMIN)*(ZDDCOLLR/ZDDSCALR) +! +!* 1.9 Compute the normalization factor by integration over the +! dimensional spectrum of the aggregates +! + ZFUNC = GENERAL_GAMMA(PALPHAS,PZNUS,ZLBDAS,ZDS) ! MTaufour : !*(ZDS**PEXMASSS) + ZSCALSR = ZSCALSR + ZSCALR * ZFUNC +! +!* 1.10 Compute the scaled fall speed difference by integration over +! the dimensional spectrum of the aggregates +! + ZCOLLSR = ZCOLLSR + ZCOLLR * ZFUNC +! +! Otherwise ZDRMIN>ZDRMAX so PRRCOLSS(JLBDAS,JLBDAR) = 0.0 ! +! + END IF +! +! Otherwise ZDRMAX = 0.0 so the density of the graupel cannot be reached +! and so PRRCOLSS(JLBDAS,JLBDAR) = 0.0 ! +! + END IF + END DO +! +!* 1.10 Scale the fall speed difference +! + IF( ZSCALSR>0.0 ) PNSCOLRG(JLBDAR,JLBDAS) = ZCOLLSR / ZSCALSR + END DO +END DO +! +END SUBROUTINE NSCOLRG diff --git a/src/MNH/nzcolx.f90 b/src/MNH/nzcolx.f90 new file mode 100644 index 0000000000000000000000000000000000000000..e4493c2e60f617e81998e2466d534e887891feaf --- /dev/null +++ b/src/MNH/nzcolx.f90 @@ -0,0 +1,278 @@ +!MNH_LIC Copyright 1994-2014 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. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################## + MODULE MODI_NZCOLX +! ################## +! +INTERFACE +! + SUBROUTINE NZCOLX( KND, PALPHAX, PNUX, PALPHAZ, PNUZ, & + PEXZ, PFALLX, PEXFALLX, PFALLEXPX, & + PFALLZ, PEXFALLZ, PFALLEXPZ, & + PLBDAXMAX, PLBDAZMAX, PLBDAXMIN, PLBDAZMIN, & + PDINFTY, PNZCOLX ) +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DX and DZ +! +! +REAL, INTENT(IN) :: PALPHAX ! First shape parameter of the specy X + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUX ! Second shape parameter of the specy X + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAZ ! First shape parameter of the specy Z + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUZ ! Second shape parameter of the specy Z +REAL, INTENT(IN) :: PEXZ ! Efficiency of specy X collecting specy Z +REAL, INTENT(IN) :: PFALLX ! Fall speed constant of specy X +REAL, INTENT(IN) :: PEXFALLX ! Fall speed exponent of specy X +REAL, INTENT(IN) :: PFALLEXPX ! Fall speed exponential constant of specy X +REAL, INTENT(IN) :: PFALLZ ! Fall speed constant of specy Z +REAL, INTENT(IN) :: PEXFALLZ ! Fall speed exponent of specy Z +REAL, INTENT(IN) :: PFALLEXPZ ! Fall speed exponential constant of specy Z +REAL, INTENT(IN) :: PLBDAXMAX ! Maximun slope of size distribution of specy X +REAL, INTENT(IN) :: PLBDAZMAX ! Maximun slope of size distribution of specy Z +REAL, INTENT(IN) :: PLBDAXMIN ! Minimun slope of size distribution of specy X +REAL, INTENT(IN) :: PLBDAZMIN ! Minimun slope of size distribution of specy Z +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNZCOLX ! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! + END SUBROUTINE NZCOLX +! +END INTERFACE +! + END MODULE MODI_NZCOLX +! ################################################################ + SUBROUTINE NZCOLX( KND, PALPHAX, PNUX, PALPHAZ, PNUZ, & + PEXZ, PFALLX, PEXFALLX, PFALLEXPX, & + PFALLZ, PEXFALLZ, PFALLEXPZ, & + PLBDAXMAX, PLBDAZMAX, PLBDAXMIN, PLBDAZMIN, & + PDINFTY, PNZCOLX ) +! ################################################################ +! +! +! +!!**** * - Build up a look-up table containing the scaled fall speed +!! difference between size distributed particles of specy X and Z +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to integrate numerically the scaled fall +!! speed difference between specy X and specy Z for use in collection +!! kernels. A first integral of the form +!! +!! infty +!! / / +!! |{| } +!! |{| E_xz (Dx+Dz)^2 |cxDx^dx-czDz^dz| g(Dz) dDz} g(Dx) dDx +!! |{| } +!! / / +!! 0 +!! +!! is evaluated and normalised by a second integral of the form +!! +!! infty +!! / / +!! |{| } +!! |{| (Dx+Dz)^2 g(Dz) dDz} g(Dx) dDx +!! |{| } +!! / / +!! 0 +!! +!! where E_xz is a collection efficiency, g(D) is the generalized Gamma +!! distribution law. The 'infty' diameter is defined according to the +!! current value of the Lbda that is D_x=PDINFTY/Lbda_x or +!! D_z=PINFTY/Lbda_z. +!! The result is stored in a two-dimensional array. +!! +!!** METHOD +!! ------ +!! The free parameters of the size distribution function of specy X and Z +!! (slope parameter LAMBDA) are discretized with a geometrical rate in a +!! specific range +!! LAMBDA = exp( (Log(LAMBDA_max) - Log(LAMBDA_min))/N_interval ) +!! The two above integrals are performed using the trapezoidal scheme and +!! the [0,infty] interval is discretized over KND values of D_x or D_z. +!! +!! EXTERNAL +!! -------- +!! MODI_GENERAL_GAMMA: Generalized gamma distribution law +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! B.S. Ferrier , 1994 : A Double-Moment Multiple-Phase Four-Class +!! Bulk Ice Scheme,JAS,51,249-280. +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 8/11/95 +!! M. Taufour 03/2022: adapted from rzcolx for concentration +!! J. Wurtz 03/2022: new snow characteristics +!! +!------------------------------------------------------------------------------- +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_GENERAL_GAMMA +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of dummy arguments +! ------------------------------- +! +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DX and DZ +! +! +REAL, INTENT(IN) :: PALPHAX ! First shape parameter of the specy X + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUX ! Second shape parameter of the specy X + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAZ ! First shape parameter of the specy Z + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUZ ! Second shape parameter of the specy Z + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PEXZ ! Efficiency of specy X collecting specy Z +REAL, INTENT(IN) :: PFALLX ! Fall speed constant of specy X +REAL, INTENT(IN) :: PEXFALLX ! Fall speed exponent of specy X +REAL, INTENT(IN) :: PFALLEXPX ! Fall speed exponential constant of specy X +REAL, INTENT(IN) :: PFALLZ ! Fall speed constant of specy Z +REAL, INTENT(IN) :: PEXFALLZ ! Fall speed exponent of specy Z +REAL, INTENT(IN) :: PFALLEXPZ ! Fall speed exponential constant of specy Z +REAL, INTENT(IN) :: PLBDAXMAX ! Maximun slope of size distribution of specy X +REAL, INTENT(IN) :: PLBDAZMAX ! Maximun slope of size distribution of specy Z +REAL, INTENT(IN) :: PLBDAXMIN ! Minimun slope of size distribution of specy X +REAL, INTENT(IN) :: PLBDAZMIN ! Minimun slope of size distribution of specy Z +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNZCOLX ! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! +INTEGER :: JLBDAX ! Slope index of the size distribution of specy X +INTEGER :: JLBDAZ ! Slope index of the size distribution of specy Z +INTEGER :: JDX ! Diameter index of a particle of specy X +INTEGER :: JDZ ! Diameter index of a particle of specy Z +! +! +REAL :: ZLBDAX ! Current slope parameter LAMBDA of specy X +REAL :: ZLBDAZ ! Current slope parameter LAMBDA of specy Z +REAL :: ZDLBDAX ! Growth rate of the slope parameter LAMBDA of specy X +REAL :: ZDLBDAZ ! Growth rate of the slope parameter LAMBDA of specy Z +REAL :: ZDDX ! Integration step of the diameter of specy X +REAL :: ZDDZ ! Integration step of the diameter of specy Z +REAL :: ZDX ! Current diameter of the particle specy X +REAL :: ZDZ ! Current diameter of the particle specy Z +REAL :: ZCOLLZ ! Single integral of the mass weighted fall speed difference + ! over the spectrum of specy Z +REAL :: ZCOLLXZ ! Double integral of the mass weighted fall speed difference + ! over the spectra of specy X and specy Z +REAL :: ZSCALZ ! Single integral of the scaling factor over + ! the spectrum of specy Z +REAL :: ZSCALXZ ! Double integral of the scaling factor over + ! the spectra of specy X and specy Z +REAL :: ZFUNC ! Ancillary function +! +! +!------------------------------------------------------------------------------- +! +! +!* 1 COMPUTE THE SCALED VELOCITZ DIFFERENCE IN THE MASS +!* COLLECTION KERNEL, +! ------------------------------------------------- +! +! +! +!* 1.1 Compute the growth rate of the slope factors LAMBDA +! +ZDLBDAX = EXP( LOG(PLBDAXMAX/PLBDAXMIN)/REAL(SIZE(PNZCOLX(:,:),1)-1) ) +ZDLBDAZ = EXP( LOG(PLBDAZMAX/PLBDAZMIN)/REAL(SIZE(PNZCOLX(:,:),2)-1) ) +! +!* 1.2 Scan the slope factors LAMBDAX and LAMBDAZ +! +DO JLBDAX = 1,SIZE(PNZCOLX(:,:),1) + ZLBDAX = PLBDAXMIN * ZDLBDAX ** (JLBDAX-1) + DO JLBDAZ = 1,SIZE(PNZCOLX(:,:),2) + ZLBDAZ = PLBDAZMIN * ZDLBDAZ ** (JLBDAZ-1) +! +!* 1.3 Initialize the collection integrals +! + ZSCALXZ = 0.0 + ZCOLLXZ = 0.0 +! +!* 1.4 Compute the diameter steps +! + ZDDX = PDINFTY / (REAL(KND) * ZLBDAX) + ZDDZ = PDINFTY / (REAL(KND) * ZLBDAZ) +! +!* 1.5 Scan over the diameters DX and DZ +! + DO JDX = 1,KND-1 + ZDX = ZDDX * REAL(JDX) +! + ZSCALZ = 0.0 + ZCOLLZ = 0.0 + DO JDZ = 1,KND-1 + ZDZ = ZDDZ * REAL(JDZ) +! +!* 1.6 Compute the normalization factor by integration over the +! dimensional spectrum of specy Z +! + ZFUNC = (ZDX+ZDZ)**2 * GENERAL_GAMMA(PALPHAZ,PNUZ,ZLBDAZ,ZDZ) + ZSCALZ = ZSCALZ + ZFUNC +! +!* 1.7 Compute the scaled fall speed difference by integration over +! the dimensional spectrum of specy Z +! + ZCOLLZ = ZCOLLZ + ZFUNC * PEXZ * ABS( PFALLX*ZDX**PEXFALLX * EXP(-(ZDX*PFALLEXPX)**PALPHAX) & + - PFALLZ*ZDZ**PEXFALLZ * EXP(-(ZDZ*PFALLEXPZ)**PALPHAZ)) + END DO +! +!* 1.8 Compute the normalization factor by integration over the +! dimensional spectrum of specy X +! + ZFUNC = GENERAL_GAMMA(PALPHAX,PNUX,ZLBDAX,ZDX) + ZSCALXZ = ZSCALXZ + ZSCALZ * ZFUNC +! +!* 1.9 Compute the scaled fall speed difference by integration over +! the dimensional spectrum of specy X +! + ZCOLLXZ = ZCOLLXZ + ZCOLLZ * ZFUNC + END DO +! +!* 1.10 Scale the fall speed difference +! + PNZCOLX(JLBDAX,JLBDAZ) = ZCOLLXZ / ZSCALXZ + END DO +END DO +! +END SUBROUTINE NZCOLX