-
WAUTELET Philippe authoredWAUTELET Philippe authored
compute_lambda_3d.f90 7.59 KiB
!MNH_LIC Copyright 2023-2023 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_COMPUTE_LAMBDA_3D
! #############################
!
INTERFACE
SUBROUTINE COMPUTE_LAMBDA_3D (KID, KMOMENT, &
PRHO, PRTMIN, PRX, PCX, PLBDX)
!
INTEGER, INTENT(IN) :: KID ! nb of the hydrometeor category
INTEGER, INTENT(IN) :: KMOMENT ! nb of moments of the microphysics scheme
REAL, INTENT(IN) :: PRTMIN
REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! reference density
REAL, DIMENSION(:,:,:), INTENT(IN) :: PRX ! Mixing ratio
REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCX ! Nb concentration
REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBDX ! Slope parameter of the distribution
!
END SUBROUTINE COMPUTE_LAMBDA_3D
END INTERFACE
END MODULE MODI_COMPUTE_LAMBDA_3D
!
!
! #########################################################
SUBROUTINE COMPUTE_LAMBDA_3D (KID, KMOMENT, &
PRHO, PRTMIN, PRX, PCX, PLBDX)
! #########################################################
!
! Purpose : compute lambda, the slope parameter of the distribution
! - for 1-moment species: lbda_x = [(rho r_x) / (a_x C_x G(b/alpha))]^(1/(x-b))
! - for 2-moment species: lbda_x = [(rho r_x) / (a_x N_x G(b/alpha))]^(-1/b)
!
! AUTHOR
! ------
! C. Barthe * LAERO *
!
! MODIFICATIONS
! -------------
! Original September 2023
!
!------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_PARAM_n, ONLY: CCLOUD
USE MODD_RAIN_ICE_DESCR_n, ONLY: XLBC_I=>XLBC, XLBR_I=>XLBR, XLBI_I=>XLBI, XLBS_I=>XLBS, XLBG_I=>XLBG, XLBH_I=>XLBH, &
XLBEXC_I=>XLBEXC, XLBEXR_I=>XLBEXR, XLBEXI_I=>XLBEXI, XLBEXS_I=>XLBEXS, &
XLBEXG_I=>XLBEXG, XLBEXH_I=>XLBEXH, &
XLBDAS_MAX_I=>XLBDAS_MAX, &
XCCR_I=>XCCR, XCCS_I=>XCCS, XCCG_I=>XCCG, XCCH_I=>XCCH, &
XCXS_I=>XCXS, XCXG_I=>XCXG, XCXH_I=>XCXH
USE MODD_ELEC_DESCR, ONLY: XCXR_I=>XCXR
USE MODD_PARAM_LIMA_WARM, ONLY: XLBC_L=>XLBC, XLBR_L=>XLBR, XLBEXC_L=>XLBEXC, XLBEXR_L=>XLBEXR, &
XCXR_L=>XCXR, XCCR_L=>XCCR
USE MODD_PARAM_LIMA_COLD, ONLY: XLBI_L=>XLBI, XLBS_L=>XLBS, XLBEXI_L=>XLBEXI, XLBEXS_L=>XLBEXS, &
XLBDAS_MAX_L=>XLBDAS_MAX, &
XCXS_L=>XCXS, XCCS_L=>XCCS
USE MODD_PARAM_LIMA_MIXED, ONLY: XLBG_L=>XLBG, XLBH_L=>XLBH, XLBEXG_L=>XLBEXG, XLBEXH_L=>XLBEXH, &
XCXG_L=>XCXG, XCCG_L=>XCCG, XCXH_L=>XCXH, XCCH_L=>XCCH
!
USE MODI_MOMG
!
IMPLICIT NONE
!
!* 0.1 Declaration of dummy arguments
!
INTEGER, INTENT(IN) :: KID ! nb of the hydrometeor category
INTEGER, INTENT(IN) :: KMOMENT ! nb of moments of the microphysics scheme
REAL, INTENT(IN) :: PRTMIN
REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! reference density
REAL, DIMENSION(:,:,:), INTENT(IN) :: PRX ! Mixing ratio
REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCX ! Nb concentration
REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLBDX ! Slope parameter of the distribution
!
!* 0.2 Declaration of local variables
!
REAL :: ZRTMIN, ZLBX, ZLBEX, ZLBDAX_MAX, ZCCX, ZCXX
!
!---------------------------------------------------------------------------------
!
!* 1. PRELIMINARIES
! -------------
!
ZRTMIN = PRTMIN
!
IF (KID == 2) THEN
IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
ZLBX = XLBC_L
ZLBEX = XLBEXC_L
! ELSE
! print*, 'ERROR: the computation of lambda_c is not available if c is 1-moment species'
END IF
ELSE IF (KID == 3) THEN
IF (CCLOUD == 'LIMA') THEN
ZLBX = XLBR_L
ZLBEX = XLBEXR_L
IF (KMOMENT == 1) THEN
ZCCX = XCCR_L
ZCXX = XCXR_L
END IF
ELSE IF (CCLOUD(1:3) == 'ICE') THEN
ZLBX = XLBR_I
ZLBEX = XLBEXR_I
ZCCX = XCCR_I
ZCXX = XCXR_I
ELSE
PRINT*, 'ERROR: something wrong with the computation of lambda_r'
END IF
ELSE IF (KID == 4) THEN
IF (CCLOUD == 'LIMA') THEN
ZLBX = XLBI_L
ZLBEX = XLBEXI_L
ELSE IF (CCLOUD(1:3) == 'ICE') THEN
ZLBX = XLBI_I
ZLBEX = XLBEXI_I
ELSE
PRINT*, 'ERROR: something wrong with the computation of lambda_i'
END IF
ELSE IF (KID == 5) THEN
IF (CCLOUD == 'LIMA') THEN
ZLBX = XLBS_L
ZLBEX = XLBEXS_L
ZLBDAX_MAX = XLBDAS_MAX_L
IF (KMOMENT == 1) THEN
ZCCX = XCCS_L
ZCXX = XCXS_L
END IF
ELSE IF (CCLOUD(1:3) == 'ICE') THEN
ZLBX = XLBS_I
ZLBEX = XLBEXS_I
ZLBDAX_MAX = XLBDAS_MAX_I
ZCCX = XCCS_I
ZCXX = XCXS_I
ELSE
PRINT*, 'ERROR: something wrong with the computation of lambda_s'
END IF
ELSE IF (KID == 6) THEN
IF (CCLOUD == 'LIMA') THEN ! .AND. KMOMENT == 1) THEN
ZLBX = XLBG_L
ZLBEX = XLBEXG_L
IF (KMOMENT == 1) THEN
ZCCX = XCCG_L
ZCXX = XCXG_L
END IF
ELSE IF (CCLOUD(1:3) == 'ICE') THEN
ZLBX = XLBG_I
ZLBEX = XLBEXG_I
ZCCX = XCCG_I
ZCXX = XCXG_I
ELSE
PRINT*, 'ERROR: something wrong with the computation of lambda_g'
END IF
ELSE IF (KID == 7) THEN
IF (CCLOUD == 'LIMA') THEN ! .AND. KMOMENT == 1) THEN
ZLBX = XLBH_L
ZLBEX = XLBEXH_L
IF (KMOMENT == 1) THEN
ZCCX = XCCH_L
ZCXX = XCXH_L
END IF
ELSE IF (CCLOUD(1:3) == 'ICE') THEN
ZLBX = XLBH_I
ZLBEX = XLBEXH_I
ZCCX = XCCH_I
ZCXX = XCXH_I
ELSE
PRINT*, 'ERROR: something wrong with the computation of lambda_h'
END IF
END IF
!
PLBDX(:,:,:) = 0. !1.E10
!
!
!* 2. COMPUTE LBDA_x FOR 2-MOMENT SPECIES
! -----------------------------------
!
IF (KMOMENT == 2) THEN
WHERE (PRX(:,:,:) > ZRTMIN .AND. PCX(:,:,:) > 0.)
PLBDX(:,:,:) = (ZLBX * PCX(:,:,:) / PRX(:,:,:))**ZLBEX
END WHERE
IF (KID == 5) PLBDX(:,:,:) = MIN(ZLBDAX_MAX, PLBDX(:,:,:))
!
!
!* 3. COMPUTE LBDA_x and N_x FOR 1-MOMENT SPECIES
! -------------------------------------------
!
ELSE IF (KMOMENT == 1) THEN
!
!* 3.1 Special case of cloud droplets
!
IF (KID == 2) THEN
! print*, 'computation of lambda_c in 1-moment configuration not treated'
!
!* 3.2 Special case of ice crystals
!
ELSE IF (KID == 4) THEN
! formulation utilisee dans rain_ice_fast_ri
WHERE (PRX(:,:,:) > ZRTMIN .AND. PCX(:,:,:) > 0.0)
PLBDX(:,:,:) = ZLBX * (PRHO(:,:,:) * PRX(:,:,:) / PCX(:,:,:))**ZLBEX
ENDWHERE
!
!* 3.3 Special case of snow
!
ELSE IF (KID == 5) THEN
! limitation of lbdas
WHERE (PRX(:,:,:) > ZRTMIN)
! PLBDX(:,:,:) = MIN(ZLBDAX_MAX, ZLBX * (PRHO(:,:,:) * PRX(:,:,:))**ZLBEX)
PLBDX(:,:,:) = MIN(200000., ZLBX * (PRHO(:,:,:) * PRX(:,:,:))**ZLBEX)
PCX(:,:,:) = ZCCX * PLBDX(:,:,:)**ZCXX / PRHO(:,:,:)
ENDWHERE
!
!* 3.4 Computation for all other hydrometeors
!
ELSE
WHERE (PRX(:,:,:) > ZRTMIN)
PLBDX(:,:,:) = ZLBX * (PRHO(:,:,:) * PRX(:,:,:))**ZLBEX
PCX(:,:,:) = ZCCX * PLBDX(:,:,:)**ZCXX / PRHO(:,:,:)
ENDWHERE
END IF
END IF
!
END SUBROUTINE COMPUTE_LAMBDA_3D