diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 8473c5a3b9f58609ef24a788a49f2153056a0380..9b5ae514068e386a8fd592e8a7549774048ab10d 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -9,8 +9,8 @@ ! INTERFACE SUBROUTINE ADVECTION_METSV (TPFILE, HUVW_ADV_SCHEME, & - HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, KSPLIT, & - OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT, & + HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, HELEC, & + KSPLIT, OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT, & HLBCX, HLBCY, KRR, KSV, TPDTCUR, PTSTEP, & PUT, PVT, PWT, PTHT, PRT, PTKET, PSVT, PPABST, & PTHVREF, PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY, & @@ -25,6 +25,7 @@ CHARACTER(LEN=6), INTENT(IN) :: HMET_ADV_SCHEME, & ! Control of the HSV_ADV_SCHEME, & ! scheme applied HUVW_ADV_SCHEME CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of cloud parameterization +CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of cloud electricity parameterization ! INTEGER, INTENT(INOUT):: KSPLIT ! Number of time splitting ! for PPM advection @@ -64,8 +65,8 @@ END INTERFACE END MODULE MODI_ADVECTION_METSV ! ########################################################################## SUBROUTINE ADVECTION_METSV (TPFILE, HUVW_ADV_SCHEME, & - HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, KSPLIT, & - OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT, & + HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, HELEC, & + KSPLIT, OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT, & HLBCX, HLBCY, KRR, KSV, TPDTCUR, PTSTEP, & PUT, PVT, PWT, PTHT, PRT, PTKET, PSVT, PPABST, & PTHVREF, PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY, & @@ -140,6 +141,7 @@ END MODULE MODI_ADVECTION_METSV ! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices ! P. Wautelet + Benoît Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets ! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct +! C. Barthe 08/02/2022: add HELEC in arguments of Sources_neg_correct !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -191,6 +193,7 @@ CHARACTER(LEN=6), INTENT(IN) :: HMET_ADV_SCHEME, & ! Control of the HSV_ADV_SCHEME, & ! scheme applied HUVW_ADV_SCHEME CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of cloud parameterization +CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of cloud electricity parameterization ! INTEGER, INTENT(INOUT):: KSPLIT ! Number of time splitting ! for PPM advection @@ -712,7 +715,7 @@ if ( lbudget_sv) then end if ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NEADV', krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs ) +call Sources_neg_correct( hcloud, helec, 'NEADV', krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs ) !------------------------------------------------------------------------------- ! diff --git a/src/MNH/boundaries.f90 b/src/MNH/boundaries.f90 index 04860f27e0b15748eb3c9d075427d97f3dc803b9..91597d8be0029568c74e22c0888d87487b33b386 100644 --- a/src/MNH/boundaries.f90 +++ b/src/MNH/boundaries.f90 @@ -186,8 +186,7 @@ USE MODD_CONF USE MODD_TURB_n, ONLY : XTKEMIN USE MODD_DUST USE MODD_GRID_n, ONLY : XZZ -USE MODD_ELEC_DESCR -USE MODD_ELEC_n +USE MODD_ELEC_n, ONLY : XCION_POS_FW, XCION_NEG_FW #ifdef MNH_FOREFIRE USE MODD_FOREFIRE, ONLY : LFOREFIRE #endif diff --git a/src/MNH/compute_lambda.f90 b/src/MNH/compute_lambda.f90 new file mode 100644 index 0000000000000000000000000000000000000000..3d0ecce76a3ea1b9ef88bb639f64d51da0e8fb5d --- /dev/null +++ b/src/MNH/compute_lambda.f90 @@ -0,0 +1,224 @@ +! +! ########################## + MODULE MODI_COMPUTE_LAMBDA +! ########################## +! +INTERFACE + SUBROUTINE COMPUTE_LAMBDA (KID, KMOMENT, KSIZE, & + 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 +INTEGER, INTENT(IN) :: KSIZE +REAL, INTENT(IN) :: PRTMIN +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHO ! reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRX ! Mixing ratio +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCX ! Nb concentration +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PLBDX ! Slope parameter of the distribution +! +END SUBROUTINE COMPUTE_LAMBDA +END INTERFACE +END MODULE MODI_COMPUTE_LAMBDA +! +! +! ######################################################### + SUBROUTINE COMPUTE_LAMBDA (KID, KMOMENT, KSIZE, & + 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 June 2022 +! C. Barthe 12/07/23 adapt the code for LIMA2 +! +!------------------------------------------------------------------ +! +!* 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 +INTEGER, INTENT(IN) :: KSIZE +REAL, INTENT(IN) :: PRTMIN +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHO ! reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRX ! Mixing ratio +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCX ! Nb concentration +REAL, DIMENSION(KSIZE), 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(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 diff --git a/src/MNH/compute_lambda_3d.f90 b/src/MNH/compute_lambda_3d.f90 new file mode 100644 index 0000000000000000000000000000000000000000..93457a2d3537e0532dfb8d5d23724c70c1aedece --- /dev/null +++ b/src/MNH/compute_lambda_3d.f90 @@ -0,0 +1,222 @@ +! +! ############################# + 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 diff --git a/src/MNH/elec_adjust.f90 b/src/MNH/elec_adjust.f90 new file mode 100644 index 0000000000000000000000000000000000000000..6c3de9ab315e937f7fe8b466a5d53971cb2f61bb --- /dev/null +++ b/src/MNH/elec_adjust.f90 @@ -0,0 +1,185 @@ + +!----------------------------------------------------------------- +! ####################### + MODULE MODI_ELEC_ADJUST +! ####################### +! +INTERFACE +! + SUBROUTINE ELEC_ADJUST (KRR, PRHODJ, HCLOUD, HBUNAME, & + PRC, PRI, PQC, PQI, & + PQCS, PQIS, PQPIS, PQNIS, PCND, PDEP) +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme +CHARACTER(len=*), INTENT(IN) :: HBUNAME ! Name of the budget +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQC ! Cloud water charge density to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQI ! Cloud ice charge density to adjust +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQCS ! Cloud water charge density source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQIS ! Cloud ice charge density source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIS ! Positive ion charge density source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIS ! Negative ion charge density source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCND ! Rate of condensation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDEP ! Rate of sublimation +! +END SUBROUTINE ELEC_ADJUST +! +END INTERFACE +! +END MODULE MODI_ELEC_ADJUST + +! ############################################################# + SUBROUTINE ELEC_ADJUST (KRR, PRHODJ, HCLOUD, HBUNAME, & + PRC, PRI, PQC, PQI, & + PQCS, PQIS, PQPIS, PQNIS, PCND, PDEP) +! ############################################################# +! +!!**** *ELEC_ADJUST* - compute the exchange of electric charges associated with +!! condensation and sublimation of ice crystals. +!! The capture of ions by cloud droplets and ice crystals is done +!! in the ion_attach_elec routine. +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fast microphysical sources +!! through a saturation ajustement procedure in case of mixed-phase clouds. +!! +!! +!!** METHOD +!! ------ +!! The rate of charge exchanged is computed proportionnaly to the rate of mass +!! exchanged during sublimation and condensation. The sublimation and condensation rates +!! are computed in ICE3/4 or LIMA. +!! +!! +!! AUTHOR +!! ------ +!! C. Barthe * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/09/2022 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_sv, NBUDGET_SV1, tbudgets +! +USE MODD_ELEC_DESCR, ONLY: XRTMIN_ELEC, XQTMIN, XFC, XFI, XECHARGE +USE MODD_PARAM_LIMA_COLD, ONLY: XBI_L=>XBI +USE MODD_RAIN_ICE_DESCR_n,ONLY: XRTMIN_I=>XRTMIN, XBI_I=>XBI +USE MODD_PARAM_LIMA, ONLY: XRTMIN_L=>XRTMIN +USE MODD_NSV, ONLY: NSV_ELECBEG +! +use mode_budget, only: Budget_store_init, Budget_store_end +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of dummy arguments +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme +CHARACTER(len=*), INTENT(IN) :: HBUNAME ! Name of the budget +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQC ! Cloud water charge density to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQI ! Cloud ice charge density to adjust +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQCS ! Cloud water charge density source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQIS ! Cloud ice charge density source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIS ! Positive ion charge density source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIS ! Negative ion charge density source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCND ! Rate of condensation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDEP ! Rate of sublimation +! +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) :: ZWELEC ! Work array +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) :: ZION_NUMBER ! Nb of elementary charge in hydrometeor charge +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) :: ZADD ! Ratio (0/1) of ZION_NUMBER to add to positive + ! or negative ion nb +REAL :: ZBI +REAL, DIMENSION(KRR) :: ZRTMIN +! +!------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +! choose the right parameters between ice3 and lima +IF (HCLOUD(1:3) == 'ICE') THEN + ZRTMIN(1:KRR) = XRTMIN_I(1:KRR) + ZBI = XBI_I +ELSE IF (HCLOUD == 'LIMA') THEN + ZRTMIN(1:KRR) = XRTMIN_L(1:KRR) + ZBI = XBI_L +END IF +! +if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), trim( hbuname ), pqpis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1), trim( hbuname ), pqcs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3), trim( hbuname ), pqis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + krr), trim( hbuname ), pqnis(:, :, :) * prhodj(:, :, :) ) +end if +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE SOURCES FOR ELECTRIC CHARGES +! ---------------------------------------- +! +ZWELEC(:,:,:) = 0. +! +!* 2.1 Evaporation of cloud droplets +! +WHERE (ABS(PRC(:,:,:)) > XRTMIN_ELEC(2) .AND. & + ABS(PQC(:,:,:)) > XQTMIN(2) .AND. & + PCND(:,:,:) < -ZRTMIN(1)) + ZWELEC(:,:,:) = (XFC / 3.) * (PQC(:,:,:) / PRC(:,:,:)) * (-PCND(:,:,:)) + ! nb of elementary charges in hydrometeor charge + ZION_NUMBER(:,:,:) = ABS(ZWELEC(:,:,:)) / XECHARGE + ! ratio (0 or 1) of the number of ions to add to positive or negative ion number + ZADD(:,:,:) = 0.5 + SIGN(0.5, ZWELEC(:,:,:)) + ! + PQPIS(:,:,:) = PQPIS(:,:,:) + ZADD(:,:,:) * ZION_NUMBER(:,:,:) + PQNIS(:,:,:) = PQNIS(:,:,:) + (1. - ZADD(:,:,:)) * ZION_NUMBER(:,:,:) + PQCS(:,:,:) = PQCS(:,:,:) - ZWELEC(:,:,:) +END WHERE +! +! +!* 2.2 Sublimation of ice crystals +! +WHERE (ABS(PRI(:,:,:)) > XRTMIN_ELEC(4) .AND. & + ABS(PQI(:,:,:)) > XQTMIN(4) .AND. & + PDEP(:,:,:) < -ZRTMIN(1)) + ZWELEC(:,:,:) = (XFI / ZBI) * (PQI(:,:,:) / PRI(:,:,:)) * (-PDEP(:,:,:)) + ZION_NUMBER(:,:,:) = ABS(ZWELEC(:,:,:)) / XECHARGE + ZADD(:,:,:) = 0.5 + SIGN(0.5, ZWELEC(:,:,:)) + ! + PQPIS(:,:,:) = PQPIS(:,:,:) + ZADD(:,:,:) * ZION_NUMBER(:,:,:) + PQNIS(:,:,:) = PQNIS(:,:,:) + (1. - ZADD(:,:,:)) * ZION_NUMBER(:,:,:) + PQIS(:,:,:) = PQIS(:,:,:) - ZWELEC(:,:,:) +END WHERE +! +!------------------------------------------------------------------------------- +! +!* 3. STORE THE BUDGET TERMS +! ---------------------- + +if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), trim( hbuname ), pqpis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1), trim( hbuname ), pqcs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3), trim( hbuname ), pqis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + krr), trim( hbuname ), pqnis(:, :, :) * prhodj(:, :, :) ) +end if +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE ELEC_ADJUST diff --git a/src/MNH/elec_compute_ex.f90 b/src/MNH/elec_compute_ex.f90 new file mode 100644 index 0000000000000000000000000000000000000000..7d73be9d7692c577b592f72b83b8edc804115c44 --- /dev/null +++ b/src/MNH/elec_compute_ex.f90 @@ -0,0 +1,221 @@ +! +! ########################### + MODULE MODI_ELEC_COMPUTE_EX +! ########################### +! +INTERFACE + SUBROUTINE ELEC_COMPUTE_EX (KID, KMOMENT, KSIZE, & + PDUM, PRHO, PRTMIN, & + PRX, PQX, PEX, PLBDX, PCX) +! +INTEGER, INTENT(IN) :: KID ! nb of the hydrometeor category +INTEGER, INTENT(IN) :: KMOMENT ! nb of moments of the microphysics scheme +INTEGER, INTENT(IN) :: KSIZE +REAL, INTENT(IN) :: PDUM ! =1. if mixing ratio + ! =timestep if source +REAL, INTENT(IN) :: PRTMIN +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHO ! reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PQX ! Electric charge +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRX ! Mixing ratio +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PEX ! e coef of the q-D relation +REAL, DIMENSION(KSIZE), OPTIONAL, INTENT(IN) :: PLBDX ! Slope parameter of the distribution +REAL, DIMENSION(KSIZE), OPTIONAL, INTENT(IN) :: PCX ! Nb concentration +! +END SUBROUTINE ELEC_COMPUTE_EX +END INTERFACE +END MODULE MODI_ELEC_COMPUTE_EX +! +! +! ####################################################### + SUBROUTINE ELEC_COMPUTE_EX (KID, KMOMENT, KSIZE, & + PDUM, PRHO, PRTMIN, & + PRX, PQX, PEX, PLBDX, PCX ) +! ####################################################### +! +! Purpose : update the parameter e_x in the relation q_x = e_x d**f_x +! e_x = q_x/(N_x * M(f_x)) +! +! AUTHOR +! ------ +! C. Barthe * LAERO * +! +! MODIFICATIONS +! ------------- +! Original June 2022 +! +!------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_n, ONLY : CCLOUD +USE MODD_ELEC_PARAM, ONLY : XECMAX, XERMAX, XEIMAX, XESMAX, XEGMAX, XEHMAX, & + XFQUPDC, XFQUPDR, XFQUPDI, XEXFQUPDI, XFQUPDS, XFQUPDG, XFQUPDH +USE MODD_ELEC_DESCR, ONLY : XCXR, XFC, XFR, XFI, XFS, XFG, XFH +USE MODD_RAIN_ICE_DESCR_n, ONLY : XCXS_I=>XCXS, XCXG_I=>XCXG, XCXH_I=>XCXH +USE MODD_PARAM_LIMA_COLD, ONLY : XCXS_L=>XCXS +USE MODD_PARAM_LIMA_MIXED, ONLY : XCXG_L=>XCXG, XCXH_L=>XCXH, XALPHAH, XNUH +USE MODD_PARAM_LIMA, ONLY : XALPHAC, XALPHAR, XALPHAI, XALPHAS, XALPHAG, & + XNUC, XNUR, XNUI, XNUS, XNUG +! +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 +INTEGER, INTENT(IN) :: KSIZE +REAL, INTENT(IN) :: PDUM ! =1. if mixing ratio + ! =timestep if source +REAL, INTENT(IN) :: PRTMIN +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHO ! reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PQX ! Electric charge +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRX ! Mixing ratio +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PEX ! e coef of the q-D relation +REAL, DIMENSION(KSIZE), OPTIONAL, INTENT(IN) :: PLBDX ! Slope parameter of the distribution +REAL, DIMENSION(KSIZE), OPTIONAL, INTENT(IN) :: PCX ! Nb concentration +! +!* 0.2 Declaration of local variables +! +REAL :: ZRTMIN, ZFX, ZCX, ZEXMAX, ZFQUPDX, ZALPHAX, ZNUX +! +!--------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +ZRTMIN = PRTMIN / PDUM +PEX(:) = 0. +! +IF (KID == 2) THEN ! parameters for cloud droplets + ZFX = XFC + ZEXMAX = XECMAX + IF (CCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDC + IF (CCLOUD == 'LIMA') THEN + ZALPHAX = XALPHAC + ZNUX = XNUC + END IF +ELSE IF (KID == 3) THEN ! parameters for raindrops + ZFX = XFR + ZCX = XCXR + ZEXMAX = XERMAX + IF (CCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDR + IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN + ZALPHAX = XALPHAR + ZNUX = XNUR + END IF +ELSE IF (KID == 4) THEN ! parameters for ice crystals + ZFX = XFI + ZEXMAX = XEIMAX + IF (CCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDI + IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN + ZALPHAX = XALPHAI + ZNUX = XNUI + END IF +ELSE IF (KID == 5) THEN ! parameters for snow/aggregates + ZFX = XFS + ZEXMAX = XESMAX + ZFQUPDX = XFQUPDS + IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN + ZALPHAX = XALPHAS + ZNUX = XNUS + ELSE IF (CCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN + ZCX = XCXS_L + ELSE IF (CCLOUD(1:3) == 'ICE') THEN + ZCX = XCXS_I + END IF +ELSE IF (KID == 6) THEN ! parameters for graupel + ZFX = XFG + ZEXMAX = XEGMAX + ZFQUPDX = XFQUPDG + IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN + ZALPHAX = XALPHAG + ZNUX = XNUG + ELSE IF (CCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN + ZCX = XCXG_L + ELSE IF (CCLOUD(1:3) == 'ICE') THEN + ZCX = XCXG_I + END IF +ELSE IF (KID == 7) THEN ! parameters for hail + ZFX = XFH + ZEXMAX = XEHMAX + ZFQUPDX = XFQUPDH + IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN + ZALPHAX = XALPHAH + ZNUX = XNUH + ELSE IF (CCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN + ZCX = XCXH_L + ELSE IF (CCLOUD(1:3) == 'ICE') THEN + ZCX = XCXH_I + END IF +END IF +! +IF (CCLOUD == 'LIMA') THEN + IF (KID == 2) THEN + ZALPHAX = XALPHAC + ZNUX = XNUC + ELSE IF (KID == 3) THEN + ZALPHAX = XALPHAR + ZNUX = XNUR + ELSE IF (KID == 4) THEN + ZALPHAX = XALPHAI + ZNUX = XNUI + ELSE IF (KID == 5) THEN + ZALPHAX = XALPHAS + ZNUX = XNUS + ELSE IF (KID == 6) THEN + ZALPHAX = XALPHAG + ZNUX = XNUG + ELSE IF (KID == 7) THEN + ZALPHAX = XALPHAH + ZNUX = XNUH + END IF +END IF +! +! +!* 2. UPDATE E_x FOR 2-MOMENT SPECIES +! ------------------------------- +! +IF (KMOMENT == 2) THEN + WHERE (PRX(:) > ZRTMIN .AND. PCX(:) > 0.0) + PEX(:) = PDUM * PRHO(:) * PQX(:) * PLBDX(:)**ZFX / (PCX(:) * MOMG(ZALPHAX,ZNUX,ZFX)) + ENDWHERE +! +! +!* 3. UPDATE E_x FOR 1-MOMENT SPECIES +! ------------------------------- +! +ELSE IF (KMOMENT == 1) THEN +! +!* 3.1 Special case of cloud droplets +! + IF (KID == 2) THEN + WHERE (PRX(:) > ZRTMIN) + PEX(:) = PDUM * PRHO(:) * PQX(:) / ZFQUPDX + PEX(:) = SIGN( MIN(ABS(PEX(:)), ZEXMAX), PEX(:)) + ENDWHERE +! +!* 3.2 Special case of ice crystals +! + ELSE IF (KID == 4) THEN + WHERE (PRX(:) > ZRTMIN .AND. PCX(:) > 0.0) + PEX(:) = PDUM * PRHO(:) * PQX(:) / & + ((PCX**(1 - XEXFQUPDI)) * ZFQUPDX * (PRHO(:) * & + PDUM * PRX(:))**XEXFQUPDI) + PEX(:) = SIGN( MIN(ABS(PEX(:)), ZEXMAX), PEX(:)) + ENDWHERE +! +!* 3.3 Computation for all other hydrometeors +! + ELSE + WHERE (PRX(:) > ZRTMIN .AND. PLBDX(:) > 0.) + PEX(:) = PDUM * PRHO(:) * PQX(:) / (ZFQUPDX * PLBDX(:)**(ZCX - ZFX)) + PEX(:) = SIGN( MIN(ABS(PEX(:)), ZEXMAX), PEX(:)) + ENDWHERE + END IF +END IF +! +END SUBROUTINE ELEC_COMPUTE_EX + diff --git a/src/MNH/elec_tendencies.f90 b/src/MNH/elec_tendencies.f90 new file mode 100644 index 0000000000000000000000000000000000000000..10d01eb588659ead2f0687c558c85134a0fa0913 --- /dev/null +++ b/src/MNH/elec_tendencies.f90 @@ -0,0 +1,3570 @@ +!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_ELEC_TENDENCIES +! ########################### +! +INTERFACE + SUBROUTINE ELEC_TENDENCIES (D, KRR, KMICRO, PTSTEP, ODMICRO, & + PRHODREF, PRHODJ, PZT, PCIT, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT, & + PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & + PRVHENI, PRRHONG, PRIMLTC, & + PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & + PRCAUTR, PRCACCR, PRREVAV, & + PRCRIMSS, PRCRIMSG, PRSRIMCG, PRRACCSS, PRRACCSG, PRSACCRG, & + PRSMLTG, PRICFRRG, PRRCFRIG, & + PRCWETG, PRIWETG, PRRWETG, PRSWETG, & + PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, & + PRGMLTR, PRCBERI, & + PRCMLTSR, PRICFRR, & !- opt. param. for ICE3 + PCCT, PCRT, PCST, PCGT, & !-- optional + PRVHENC, PRCHINC, PRVHONH, & !| parameters + PRRCVRC, PRICNVI, PRVDEPI, PRSHMSI, PRGHMGI, & !| for + PRICIBU, PRIRDSF, & !| LIMA + PRCCORR2, PRRCORR2, PRICORR2, & !-- + PRWETGH, PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & !-- optional + PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, & !| parameters + PRHMLTR, PRDRYHG, & !| for + PRHT, PRHS, PCHT, PQHT, PQHS) !-- hail +! +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D +! +INTEGER, INTENT(IN) :: KMICRO +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +! +LOGICAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: ODMICRO ! mask to limit computation +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PZT ! Temperature (K) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PCIT ! Pristine ice n.c. at t +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQPIT ! Positive ion (Nb/kg) at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQNIT ! Negative ion (Nb/kg) at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQCT ! Cloud water charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQRT ! Raindrops charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQIT ! Pristine ice charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQST ! Snow/aggregates charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQGT ! Graupel charge at t +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQPIS ! Positive ion (Nb/kg) source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQNIS ! Negative ion (Nb/kg) source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQCS ! Cloud water charge source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQRS ! Raindrops charge source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQIS ! Pristine ice charge source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQSS ! Snow/aggregates charge source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQGS ! Graupel charge source +! +! microphysics rates common to ICE3 and LIMA +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRVHENI, & ! heterogeneous nucleation mixing ratio change (HIND for LIMA) + PRCHONI, & ! Homogeneous nucleation + PRRHONG, & ! Spontaneous freezing mixing ratio change + PRVDEPS, & ! Deposition on r_s, + PRIAGGS, & ! Aggregation on r_s + PRIAUTS, & ! Autoconversion of r_i for r_s production (CNVS for LIMA) + PRVDEPG, & ! Deposition on r_g + PRCAUTR, & ! Autoconversion of r_c for r_r production + PRCACCR, & ! Accretion of r_c for r_r production + PRREVAV, & ! Evaporation of r_r + PRIMLTC, & ! Cloud ice melting mixing ratio change + PRCBERI, & ! Bergeron-Findeisen effect + PRSMLTG, & ! Conversion-Melting of the aggregates + PRRACCSS, PRRACCSG, PRSACCRG, & ! Rain accretion onto the aggregates + PRCRIMSS, PRCRIMSG, PRSRIMCG, & ! Cloud droplet riming of the aggregates + PRICFRRG, PRRCFRIG, & ! Rain contact freezing + PRCWETG, PRIWETG, PRRWETG, PRSWETG, & ! Graupel wet growth + PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, & ! Graupel dry growth + PRGMLTR ! Melting of the graupel +! microphysics rates specific to ICE3 (knmoments==1) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRCMLTSR,& ! Cld droplet collection onto aggregates by pos. temp. + PRICFRR ! Rain contact freezing (part of ice crystals converted to rain) +! microphysics rates specific to LIMA (knmoments==2) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRVHENC, & ! Cld droplet formation + PRCHINC, & ! Heterogeneous nucleation of coated IFN + PRVHONH, & ! Nucleation of haze + PRRCVRC, & ! Conversion of small drops into droplets + PRICNVI, & ! Conversion snow --> ice + PRVDEPI, & ! Deposition on r_i + PRSHMSI, PRGHMGI, & ! Hallett Mossop for snow and graupel + PRICIBU, & ! Collisional ice breakup + PRIRDSF, & ! Raindrop shattering by freezing + PRCCORR2, PRRCORR2, PRICORR2 ! Correction inside LIMA splitting +! microphysics rates related to hail (krr == 7, lhail = .t.) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRWETGH, & ! Conversion of graupel into hail + PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & ! Dry growth of hail + PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, & ! Wet growth of hail + PRHMLTR, & ! Melting of hail + PRDRYHG ! Conversion of hail into graupel +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCCT ! Cloud droplets conc. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCRT ! Raindrops conc. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCST ! Snow conc. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCGT ! Graupel conc. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCHT ! Hail conc. at t +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PQHT ! Hail charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PQHS ! Hail charge source +! +END SUBROUTINE ELEC_TENDENCIES +END INTERFACE +END MODULE MODI_ELEC_TENDENCIES +! +! +! ######################################################################################### + SUBROUTINE ELEC_TENDENCIES (D, KRR, KMICRO, PTSTEP, ODMICRO, & + PRHODREF, PRHODJ, PZT, PCIT, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT, & + PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & + PRVHENI, PRRHONG, PRIMLTC, & + PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & + PRCAUTR, PRCACCR, PRREVAV, & + PRCRIMSS, PRCRIMSG, PRSRIMCG, PRRACCSS, PRRACCSG, PRSACCRG, & + PRSMLTG, PRICFRRG, PRRCFRIG, & + PRCWETG, PRIWETG, PRRWETG, PRSWETG, & + PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, & + PRGMLTR, PRCBERI, & + PRCMLTSR, PRICFRR, & !- opt. param. for ICE3 + PCCT, PCRT, PCST, PCGT, & !-- optional + PRVHENC, PRCHINC, PRVHONH, & !| parameters + PRRCVRC, PRICNVI, PRVDEPI, PRSHMSI, PRGHMGI, & !| for + PRICIBU, PRIRDSF, & !| LIMA + PRCCORR2, PRRCORR2, PRICORR2, & !-- + PRWETGH, PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & !-- optional + PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, & !| parameters + PRHMLTR, PRDRYHG, & !| for + PRHT, PRHS, PCHT, PQHT, PQHS) !-- hail +! ########################################################################################## +! +!!**** * - compute the explicit cloud electrification sources +!! +!! This routine is adapted from rain_ice_elec.f90. +!! To avoid duplicated routines, the cloud electrification routine is now called +!! at the end of the microphysics scheme but needs the microphysical tendencies as arguments. +!! The sedimentation source for electric charges is treated separately. +!! +!! AUTHOR +!! ------ +!! C. Barthe * LAERO * +!! +!! MODIFICATIONS +!! ------------- +!! Original February 2022 +!! +!! Modifications +!! C. Barthe 12/04/2022 include electrification from LIMA +!! C. Barthe 22/03/2023 5-6: take into account news from LIMA (Ns, Ng, Nh, CIBU and RDSF) and PHYEX +!! C. Barthe 13/07/2023 5-6: Ns, Ng and Nh can be pronostic variables (LIMA2) +!! +!------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, & + lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, & + NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + tbudgets +! +USE MODD_CONF +USE MODD_CST +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_ELEC_DESCR +USE MODD_ELEC_n +USE MODD_ELEC_PARAM +USE MODD_LES +USE MODE_ll +USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND ! Scalar variables for budgets +USE MODD_PARAMETERS +USE MODD_PARAM_ICE_n +USE MODD_PARAM_LIMA, ONLY: XALPHAI_L=>XALPHAI, XNUI_L=>XNUI, & + XCEXVT_L=>XCEXVT, XRTMIN_L=>XRTMIN, & + LCIBU, LRDSF, & + NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H +USE MODD_PARAM_LIMA_COLD, ONLY: XAI_L=>XAI, XBI_L=>XBI, & + XDS_L=>XDS, XCXS_L=>XCXS, & + XCOLEXIS_L=>XCOLEXIS +USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG, XCXG_L=>XCXG, & + XCOLIG_L=>XCOLIG, XCOLEXIG_L=>XCOLEXIG, & + XCOLSG_L=>XCOLSG, XCOLEXSG_L=>XCOLEXSG, & + NGAMINC_L=>NGAMINC, & + NACCLBDAR_L=>NACCLBDAR, NACCLBDAS_L=>NACCLBDAS, & + XACCINTP1S_L=>XACCINTP1S, XACCINTP2S_L=>XACCINTP2S, & + XACCINTP1R_L=>XACCINTP1R, XACCINTP2R_L=>XACCINTP2R, & + NDRYLBDAR_L=>NDRYLBDAR, NDRYLBDAS_L=>NDRYLBDAS, & + NDRYLBDAG_L=>NDRYLBDAG, & + XDRYINTP1R_L=>XDRYINTP1R, XDRYINTP2R_L=>XDRYINTP2R, & + XDRYINTP1S_L=>XDRYINTP1S, XDRYINTP2S_L=>XDRYINTP2S, & + XDRYINTP1G_L=>XDRYINTP1G, XDRYINTP2G_L=>XDRYINTP2G, & + XRIMINTP1_L=>XRIMINTP1, XRIMINTP2_L=>XRIMINTP2 + +USE MODD_PARAM_n, ONLY: CCLOUD +USE MODD_RAIN_ICE_DESCR_n,ONLY: XCEXVT_I=>XCEXVT, XRTMIN_I=>XRTMIN, & + XALPHAI_I=>XALPHAI, XNUI_I=>XNUI, XAI_I=>XAI, XBI_I=>XBI, & + XDS_I=>XDS, XDG_I=>XDG, & + XCXS_I=>XCXS, XCXG_I=>XCXG +USE MODD_RAIN_ICE_PARAM_n,ONLY: XCOLIS_I=>XCOLIS, XCOLEXIS_I=>XCOLEXIS, & + XCOLIG_I=>XCOLIG, XCOLEXIG_I=>XCOLEXIG, & + XCOLSG_I=>XCOLSG, XCOLEXSG_I=>XCOLEXSG, & + NGAMINC_I=>NGAMINC, & + NACCLBDAR_I=>NACCLBDAR, NACCLBDAS_I=>NACCLBDAS, & + XACCINTP1S_I=>XACCINTP1S, XACCINTP2S_I=>XACCINTP2S, & + XACCINTP1R_I=>XACCINTP1R, XACCINTP2R_I=>XACCINTP2R, & + NDRYLBDAR_I=>NDRYLBDAR, NDRYLBDAS_I=>NDRYLBDAS, & + NDRYLBDAG_I=>NDRYLBDAG, & + XDRYINTP1R_I=>XDRYINTP1R, XDRYINTP2R_I=>XDRYINTP2R, & + XDRYINTP1S_I=>XDRYINTP1S, XDRYINTP2S_I=>XDRYINTP2S, & + XDRYINTP1G_I=>XDRYINTP1G, XDRYINTP2G_I=>XDRYINTP2G, & + XRIMINTP1_I=>XRIMINTP1, XRIMINTP2_I=>XRIMINTP2 +USE MODD_REF, ONLY: XTHVREFZ +! +#ifdef MNH_PGI +USE MODE_PACK_PGI +#endif +use mode_tools, only: Countjv +use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end +! +USE MODI_COMPUTE_LAMBDA +USE MODI_ELEC_COMPUTE_EX +USE MODI_MOMG +! +IMPLICIT NONE +! +! +!* 0.1 Declaration of dummy arguments +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D +! +INTEGER, INTENT(IN) :: KMICRO +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +! +LOGICAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: ODMICRO ! mask to limit computation +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PZT ! Temperature (K) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PCIT ! Pristine ice n.c. at t +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQPIT ! Positive ion (Nb/kg) at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQNIT ! Negative ion (Nb/kg) at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQCT ! Cloud water charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQRT ! Raindrops charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQIT ! Pristine ice charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQST ! Snow/aggregates charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PQGT ! Graupel charge at t +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQPIS ! Positive ion (Nb/kg) source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQNIS ! Negative ion (Nb/kg) source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQCS ! Cloud water charge source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQRS ! Raindrops charge source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQIS ! Pristine ice charge source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQSS ! Snow/aggregates charge source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PQGS ! Graupel charge source +! +! microphysics rates common to ICE3 and LIMA +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRVHENI, & ! heterogeneous nucleation mixing ratio change (HIND for LIMA) + PRCHONI, & ! Homogeneous nucleation + PRRHONG, & ! Spontaneous freezing mixing ratio change + PRVDEPS, & ! Deposition on r_s, + PRIAGGS, & ! Aggregation on r_s + PRIAUTS, & ! Autoconversion of r_i for r_s production (CNVS for LIMA) + PRVDEPG, & ! Deposition on r_g + PRCAUTR, & ! Autoconversion of r_c for r_r production + PRCACCR, & ! Accretion of r_c for r_r production + PRREVAV, & ! Evaporation of r_r + PRIMLTC, & ! Cloud ice melting mixing ratio change + PRCBERI, & ! Bergeron-Findeisen effect + PRSMLTG, & ! Conversion-Melting of the aggregates + PRRACCSS, PRRACCSG, PRSACCRG, & ! Rain accretion onto the aggregates + PRCRIMSS, PRCRIMSG, PRSRIMCG, & ! Cloud droplet riming of the aggregates + PRICFRRG, PRRCFRIG, & ! Rain contact freezing + PRCWETG, PRIWETG, PRRWETG, PRSWETG, & ! Graupel wet growth + PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, & ! Graupel dry growth + PRGMLTR ! Melting of the graupel +! microphysics rates specific to ICE3 (knmoments==1) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRCMLTSR,& ! Cld droplet collection onto aggregates by pos. temp. + PRICFRR ! Rain contact freezing (part of ice crystals converted to rain) +! microphysics rates specific to LIMA (knmoments==2) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRVHENC, & ! Cld droplet formation + PRCHINC, & ! Heterogeneous nucleation of coated IFN + PRVHONH, & ! Nucleation of haze + PRRCVRC, & ! Conversion of small drops into droplets + PRICNVI, & ! Conversion snow --> ice + PRVDEPI, & ! Deposition on r_i + PRSHMSI, PRGHMGI, & ! Hallett Mossop for snow and graupel + PRICIBU, & ! Collisional ice breakup + PRIRDSF, & ! Raindrop shattering by freezing + PRCCORR2, PRRCORR2, PRICORR2 ! Correction inside LIMA splitting +! microphysics rates related to hail (krr == 7, lhail = .t.) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRWETGH, & ! Conversion of graupel into hail + PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & ! Dry growth of hail + PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, & ! Wet growth of hail + PRHMLTR, & ! Melting of hail + PRDRYHG ! Conversion of hail into graupel +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCCT ! Cloud droplets conc. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCRT ! Raindrops conc. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCST ! Snow conc. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCGT ! Graupel conc. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCHT ! Hail conc. at t +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PQHT ! Hail charge at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PQHS ! Hail charge source +! +! +!* 0.2 Declaration of local variables +! +INTEGER :: II, JJ, JL ! Loop indexes +INTEGER :: IIB, IIE, & ! Define the domain + IJB, IJE, & ! where the microphysical sources + IKB, IKE ! must be computed +INTEGER :: IMICRO ! nb of pts where r_x > 0 +INTEGER, DIMENSION(KMICRO) :: I1 +INTEGER, DIMENSION(KMICRO) :: II1, II2, II3 +! +LOGICAL, DIMENSION(KMICRO) :: GMASK ! Mask +!REAL, DIMENSION(KMICRO) :: ZMASK ! to reduce +INTEGER :: IGMASK ! the computation domain +! +REAL, DIMENSION(KMICRO) :: ZRHODREF ! Reference density +REAL, DIMENSION(KMICRO) :: ZRHODJ ! RHO times Jacobian +REAL, DIMENSION(KMICRO) :: ZZT ! Temperature +! +REAL, DIMENSION(KMICRO) :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(KMICRO) :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(KMICRO) :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(KMICRO) :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KMICRO) :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KMICRO) :: ZRGT ! Graupel m.r. at t +REAL, DIMENSION(KMICRO) :: ZRHT ! Hail m.r. at t +REAL, DIMENSION(KMICRO) :: ZCCT ! Cloud water conc. at t +REAL, DIMENSION(KMICRO) :: ZCRT ! Raindrops conc. at t +REAL, DIMENSION(KMICRO) :: ZCIT ! Pristine ice conc. at t +REAL, DIMENSION(KMICRO) :: ZCST ! Snow/aggregate conc. at t +REAL, DIMENSION(KMICRO) :: ZCGT ! Graupel conc. at t +REAL, DIMENSION(KMICRO) :: ZCHT ! Hail conc. at t +! +REAL, DIMENSION(KMICRO) :: ZQPIT ! Positive ion (/kg) at t +REAL, DIMENSION(KMICRO) :: ZQNIT ! Negative ion (/kg) at t +REAL, DIMENSION(KMICRO) :: ZQCT ! Cloud water charge at t +REAL, DIMENSION(KMICRO) :: ZQRT ! Raindrops charge at t +REAL, DIMENSION(KMICRO) :: ZQIT ! Pristine ice charge at t +REAL, DIMENSION(KMICRO) :: ZQST ! Snow/aggregate charge at t +REAL, DIMENSION(KMICRO) :: ZQGT ! Graupel charge at t +REAL, DIMENSION(KMICRO) :: ZQHT ! Hail charge at t +! +REAL, DIMENSION(KMICRO) :: ZQPIS ! Positive ion (/kg) source +REAL, DIMENSION(KMICRO) :: ZQNIS ! Negative ion (/kg) source +REAL, DIMENSION(KMICRO) :: ZQCS ! Cloud water charge source +REAL, DIMENSION(KMICRO) :: ZQRS ! Raindrops charge source +REAL, DIMENSION(KMICRO) :: ZQIS ! Pristine ice charge source +REAL, DIMENSION(KMICRO) :: ZQSS ! Snow/aggregate charge source +REAL, DIMENSION(KMICRO) :: ZQGS ! Graupel charge source +REAL, DIMENSION(KMICRO) :: ZQHS ! Hail charge source +! +REAL, DIMENSION(KMICRO) :: ZLBDAC ! Slope parameter of the droplets distribution +REAL, DIMENSION(KMICRO) :: ZLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(KMICRO) :: ZLBDAI ! Slope parameter of the pristine ice distribution +REAL, DIMENSION(KMICRO) :: ZLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KMICRO) :: ZLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(KMICRO) :: ZLBDAH ! Slope parameter of the hail distribution +! +REAL, DIMENSION(KMICRO) :: ZECT ! +REAL, DIMENSION(KMICRO) :: ZERT ! e_x coef +REAL, DIMENSION(KMICRO) :: ZEIT ! in the +REAL, DIMENSION(KMICRO) :: ZEST ! q_x - D_x relation +REAL, DIMENSION(KMICRO) :: ZEGT ! +REAL, DIMENSION(KMICRO) :: ZEHT ! +! +LOGICAL, DIMENSION(KMICRO,4) :: GELEC ! Mask for non-inductive charging +! +REAL, DIMENSION(:), ALLOCATABLE :: ZDQ, ZDQ_IS, ZDQ_IG, ZDQ_SG +! +! Non-inductive charging process following Gardiner et al. (1995) +REAL, DIMENSION(:), ALLOCATABLE :: ZDELTALWC ! Gap between LWC and a critical LWC +REAL, DIMENSION(:), ALLOCATABLE :: ZFT ! Fct depending on temperature +! +! Non-inductive charging process following Saunders et al. (1991) / EW +REAL, DIMENSION(:), ALLOCATABLE :: ZEW ! Effective liquid water content +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSK ! constant B +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM ! d_i exponent +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN ! v_g/s-v_i +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSM ! d_s exponent +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSN ! v_g-v_s +REAL, DIMENSION(:), ALLOCATABLE :: ZFQIAGGS, ZFQIDRYGBS +REAL, DIMENSION(:), ALLOCATABLE :: ZLBQSDRYGB1S, ZLBQSDRYGB2S, ZLBQSDRYGB3S +! +! Non-inductive charging process following Saunders and Peck (1998) / RAR +REAL, DIMENSION(:), ALLOCATABLE :: ZRAR ! Rime accretion rate +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM_IS ! d_i exponent +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN_IS ! v_g/s-v_i +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM_IG ! d_i exponent +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN_IG ! v_g/s-v_i +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSK_SG ! constant B +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSM_SG ! d_s exponent +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSN_SG ! v_g-v_s +! +! Inductive charging process (Ziegler et al., 1991) +REAL, DIMENSION(:), ALLOCATABLE :: ZEFIELDW ! Vertical component of the electric field +! +REAL, DIMENSION(KMICRO) :: ZLIMIT ! Used to limit the charge separated during NI process +REAL, DIMENSION(KMICRO) :: ZQCOLIS ! Collection efficiency between ice and snow +REAL, DIMENSION(KMICRO) :: ZQCOLIG ! Collection efficiency between ice and graupeln +REAL, DIMENSION(KMICRO) :: ZQCOLSG ! Collection efficiency between snow and graupeln +! +REAL :: ZRHO00, ZCOR00 ! Surface reference air density +REAL, DIMENSION(KMICRO) :: ZRHOCOR ! Density correction for fallspeed +! +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1, IVEC2 ! Vectors of indices for interpolation +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1, ZVEC2, ZVEC3 ! Work vectors for interpolation +REAL, DIMENSION(:), ALLOCATABLE :: ZVECQ1, ZVECQ2, ZVECQ3, ZVECQ4 ! Work vectors for interpolation +! +REAL, DIMENSION(KMICRO) :: ZWQ, ZWQ_NI ! Work arrays +REAL, DIMENSION(KMICRO) :: ZWQ1, ZWQ2, ZWQ3, ZWQ4 ! for +REAL, DIMENSION(KMICRO,9) :: ZWQ5 ! charge transfer +! +! variables used to select between common parameters between ICEx and LIMA +INTEGER :: IMOM_C, IMOM_R, IMOM_I, IMOM_S, IMOM_G, IMOM_H ! number of moments for each hydrometeor +INTEGER :: IGAMINC, & + IACCLBDAR, IACCLBDAS, & + IDRYLBDAR, IDRYLBDAS, IDRYLBDAG +! +REAL :: ZCEXVT, & + ZALPHAI, ZNUI, ZAI, ZBI, ZDS, ZDG, ZCXS, ZCXG, & + ZCOLIS, ZCOLEXIS, ZCOLIG, ZCOLEXIG, ZCOLSG, ZCOLEXSG, & + ZACCINTP1S, ZACCINTP2S, ZACCINTP1R, ZACCINTP2R, & + ZDRYINTP1R, ZDRYINTP2R, ZDRYINTP1S, ZDRYINTP2S, & + ZDRYINTP1G, ZDRYINTP2G, & + ZRIMINTP1, ZRIMINTP2 +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN +! +! microphysical tendencies have to be transformed in 1D arrays +REAL, DIMENSION(KMICRO) :: ZRVHENI, ZRCHONI, ZRRHONG, ZRVDEPS, ZRIAGGS, & + ZRIAUTS, ZRVDEPG, ZRCAUTR, ZRCACCR, ZRREVAV, & + ZRIMLTC, ZRCBERI, ZRSMLTG, ZRRACCSS, ZRRACCSG, & + ZRSACCRG, ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRICFRRG, & + ZRRCFRIG, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, & + ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, ZRGMLTR +! optional microphysical tendencies +REAL, DIMENSION(:), ALLOCATABLE :: ZRCMLTSR, ZRICFRR, ZRVHENC, ZRCHINC, ZRVHONH, & + ZRRCVRC, ZRICNVI, ZRVDEPI, ZRSHMSI, ZRGHMGI, & + ZRICIBU, ZRIRDSF, ZRCCORR2, ZRRCORR2, ZRICORR2, & + ZRWETGH, ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, & + ZRRWETH, ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, & + ZRGDRYH, ZRHMLTR, ZRDRYHG +! +!------------------------------------------------------------------ +! +!* 1. INITIALIZATIONS +! --------------- +! +!* 1.1 compute the loop bounds +! +IIB = D%NIB +IIE = D%NIE +IJB = D%NJB +IJE = D%NJE +IKB = D%NKB +IKE = D%NKE +! +! +!* 1.2 select parameters between ICEx and LIMA +! +IF (CCLOUD(1:3) == 'ICE') THEN + ZCEXVT = XCEXVT_I + IMOM_C = 1 + IMOM_R = 1 + IMOM_I = 2 ! Ni is diagnostic and always available + IMOM_S = 1 + IMOM_G = 1 + IF (KRR == 7) THEN + IMOM_H = 1 + ELSE + IMOM_H = 0 + END IF +ELSE IF (CCLOUD == 'LIMA') THEN + ZCEXVT = XCEXVT_L + IMOM_C = NMOM_C + IMOM_R = NMOM_R + IMOM_I = 2 ! Ni is diagnostic and always available + IMOM_S = NMOM_S + IMOM_G = NMOM_G + IMOM_H = NMOM_H +END IF +! +ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) +ZCOR00 = ZRHO00**ZCEXVT +! +IF (LINDUCTIVE) ALLOCATE (ZEFIELDW(KMICRO)) +! +! +!* 1.3 packing +! +! optimization by looking for locations where +! the microphysical fields are larger than a minimal value only !!! +! +IF (KMICRO >= 0) THEN + IMICRO = COUNTJV(ODMICRO(:,:,:), II1(:), II2(:), II3(:)) + ! + ! some microphysical tendencies are optional: the corresponding 1D arrays must be allocated + IF (CCLOUD(1:3) == 'ICE') THEN ! ICE3 scheme + ALLOCATE(ZRCMLTSR(IMICRO)) + ALLOCATE(ZRICFRR(IMICRO)) + END IF + IF (CCLOUD == 'LIMA') THEN ! LIMA scheme + ALLOCATE(ZRVHENC(IMICRO)) + ALLOCATE(ZRCHINC(IMICRO)) + ALLOCATE(ZRVHONH(IMICRO)) + ALLOCATE(ZRRCVRC(IMICRO)) + ALLOCATE(ZRICNVI(IMICRO)) + ALLOCATE(ZRVDEPI(IMICRO)) + ALLOCATE(ZRSHMSI(IMICRO)) + ALLOCATE(ZRGHMGI(IMICRO)) + ALLOCATE(ZRICIBU(IMICRO)) + ALLOCATE(ZRIRDSF(IMICRO)) + ALLOCATE(ZRCCORR2(IMICRO)) + ALLOCATE(ZRRCORR2(IMICRO)) + ALLOCATE(ZRICORR2(IMICRO)) + END IF + IF (KRR == 7) THEN ! hail activated + ALLOCATE(ZRWETGH(IMICRO)) + ALLOCATE(ZRCWETH(IMICRO)) + ALLOCATE(ZRIWETH(IMICRO)) + ALLOCATE(ZRSWETH(IMICRO)) + ALLOCATE(ZRGWETH(IMICRO)) + ALLOCATE(ZRRWETH(IMICRO)) + ALLOCATE(ZRCDRYH(IMICRO)) + ALLOCATE(ZRRDRYH(IMICRO)) + ALLOCATE(ZRIDRYH(IMICRO)) + ALLOCATE(ZRSDRYH(IMICRO)) + ALLOCATE(ZRGDRYH(IMICRO)) + ALLOCATE(ZRHMLTR(IMICRO)) + ALLOCATE(ZRDRYHG(IMICRO)) + END IF + ! + DO JL = 1, IMICRO + ZZT(JL) = PZT(II1(JL),II2(JL),II3(JL)) + ZRHODREF(JL) = PRHODREF(II1(JL),II2(JL),II3(JL)) + ZRHOCOR(JL) = (ZRHO00 / ZRHODREF(JL))**ZCEXVT + ZRHODJ(JL) = PRHODJ(II1(JL),II2(JL),II3(JL)) + ! + ZCIT(JL) = PCIT(II1(JL),II2(JL),II3(JL)) + IF (IMOM_C == 2) ZCCT(JL) = PCCT(II1(JL),II2(JL),II3(JL)) + IF (IMOM_R == 2) ZCRT(JL) = PCRT(II1(JL),II2(JL),II3(JL)) + IF (IMOM_S == 2) ZCST(JL) = PCST(II1(JL),II2(JL),II3(JL)) + IF (IMOM_G == 2) ZCGT(JL) = PCGT(II1(JL),II2(JL),II3(JL)) + IF (IMOM_H == 2) ZCHT(JL) = PCHT(II1(JL),II2(JL),II3(JL)) + ! + ZRVT(JL) = PRVT(II1(JL),II2(JL),II3(JL)) + ZRCT(JL) = PRCT(II1(JL),II2(JL),II3(JL)) + ZRRT(JL) = PRRT(II1(JL),II2(JL),II3(JL)) + ZRIT(JL) = PRIT(II1(JL),II2(JL),II3(JL)) + ZRST(JL) = PRST(II1(JL),II2(JL),II3(JL)) + ZRGT(JL) = PRGT(II1(JL),II2(JL),II3(JL)) + IF (KRR == 7) ZRHT(JL) = PRHT(II1(JL),II2(JL),II3(JL)) + ! + ZQPIT(JL) = PQPIT(II1(JL),II2(JL),II3(JL)) + ZQNIT(JL) = PQNIT(II1(JL),II2(JL),II3(JL)) + ZQCT(JL) = PQCT(II1(JL),II2(JL),II3(JL)) + ZQRT(JL) = PQRT(II1(JL),II2(JL),II3(JL)) + ZQIT(JL) = PQIT(II1(JL),II2(JL),II3(JL)) + ZQST(JL) = PQST(II1(JL),II2(JL),II3(JL)) + ZQGT(JL) = PQGT(II1(JL),II2(JL),II3(JL)) + IF (KRR == 7) ZQHT(JL) = PQHT(II1(JL),II2(JL),II3(JL)) + ! + ZQPIS(JL) = PQPIS(II1(JL), II2(JL), II3(JL)) + ZQNIS(JL) = PQNIS(II1(JL), II2(JL), II3(JL)) + ZQCS(JL) = PQCS(II1(JL), II2(JL), II3(JL)) + ZQRS(JL) = PQRS(II1(JL), II2(JL), II3(JL)) + ZQIS(JL) = PQIS(II1(JL), II2(JL), II3(JL)) + ZQSS(JL) = PQSS(II1(JL), II2(JL), II3(JL)) + ZQGS(JL) = PQGS(II1(JL), II2(JL), II3(JL)) + IF (KRR == 7) ZQHS(JL) = PQHS(II1(JL), II2(JL), II3(JL)) + ! + IF (LINDUCTIVE) ZEFIELDW(JL) = XEFIELDW(II1(JL), II2(JL), II3(JL)) + ! + ! microphysical tendencies + ZRVHENI(JL) = PRVHENI(II1(JL), II2(JL), II3(JL)) + ZRRHONG(JL) = PRRHONG(II1(JL), II2(JL), II3(JL)) + ZRIMLTC(JL) = PRIMLTC(II1(JL), II2(JL), II3(JL)) + ZRCHONI(JL) = PRCHONI(II1(JL), II2(JL), II3(JL)) + ZRVDEPS(JL) = PRVDEPS(II1(JL), II2(JL), II3(JL)) + ZRIAGGS(JL) = PRIAGGS(II1(JL), II2(JL), II3(JL)) + ZRIAUTS(JL) = PRIAUTS(II1(JL), II2(JL), II3(JL)) + ZRVDEPG(JL) = PRVDEPG(II1(JL), II2(JL), II3(JL)) + ZRCAUTR(JL) = PRCAUTR(II1(JL), II2(JL), II3(JL)) + ZRCACCR(JL) = PRCACCR(II1(JL), II2(JL), II3(JL)) + ZRREVAV(JL) = PRREVAV(II1(JL), II2(JL), II3(JL)) + ZRCRIMSS(JL) = PRCRIMSS(II1(JL), II2(JL), II3(JL)) + ZRCRIMSG(JL) = PRCRIMSG(II1(JL), II2(JL), II3(JL)) + ZRSRIMCG(JL) = PRSRIMCG(II1(JL), II2(JL), II3(JL)) + ZRRACCSS(JL) = PRRACCSS(II1(JL), II2(JL), II3(JL)) + ZRRACCSG(JL) = PRRACCSG(II1(JL), II2(JL), II3(JL)) + ZRSACCRG(JL) = PRSACCRG(II1(JL), II2(JL), II3(JL)) + ZRSMLTG(JL) = PRSMLTG(II1(JL), II2(JL), II3(JL)) + ZRICFRRG(JL) = PRICFRRG(II1(JL), II2(JL), II3(JL)) + ZRRCFRIG(JL) = PRRCFRIG(II1(JL), II2(JL), II3(JL)) + ZRCWETG(JL) = PRCWETG(II1(JL), II2(JL), II3(JL)) + ZRIWETG(JL) = PRIWETG(II1(JL), II2(JL), II3(JL)) + ZRRWETG(JL) = PRRWETG(II1(JL), II2(JL), II3(JL)) + ZRSWETG(JL) = PRSWETG(II1(JL), II2(JL), II3(JL)) + ZRCDRYG(JL) = PRCDRYG(II1(JL), II2(JL), II3(JL)) + ZRIDRYG(JL) = PRIDRYG(II1(JL), II2(JL), II3(JL)) + ZRRDRYG(JL) = PRRDRYG(II1(JL), II2(JL), II3(JL)) + ZRSDRYG(JL) = PRSDRYG(II1(JL), II2(JL), II3(JL)) + ZRGMLTR(JL) = PRGMLTR(II1(JL), II2(JL), II3(JL)) + ZRCBERI(JL) = PRCBERI(II1(JL), II2(JL), II3(JL)) + IF (CCLOUD(1:3) == 'ICE') THEN + ZRCMLTSR(JL) = PRCMLTSR(II1(JL), II2(JL), II3(JL)) + ZRICFRR(JL) = PRICFRR(II1(JL), II2(JL), II3(JL)) + END IF + IF (CCLOUD == 'LIMA') THEN + ZCST(JL) = PCST(II1(JL), II2(JL), II3(JL)) + ZCGT(JL) = PCGT(II1(JL), II2(JL), II3(JL)) + ZRVHENC(JL) = PRVHENC(II1(JL), II2(JL), II3(JL)) + ZRCHINC(JL) = PRCHINC(II1(JL), II2(JL), II3(JL)) + ZRVHONH(JL) = PRVHONH(II1(JL), II2(JL), II3(JL)) + ZRRCVRC(JL) = PRRCVRC(II1(JL), II2(JL), II3(JL)) + ZRICNVI(JL) = PRICNVI(II1(JL), II2(JL), II3(JL)) + ZRVDEPI(JL) = PRVDEPI(II1(JL), II2(JL), II3(JL)) + ZRSHMSI(JL) = PRSHMSI(II1(JL), II2(JL), II3(JL)) + ZRGHMGI(JL) = PRGHMGI(II1(JL), II2(JL), II3(JL)) + ZRICIBU(JL) = PRICIBU(II1(JL), II2(JL), II3(JL)) + ZRIRDSF(JL) = PRIRDSF(II1(JL), II2(JL), II3(JL)) + ZRCCORR2(JL) = PRCCORR2(II1(JL), II2(JL), II3(JL)) + ZRRCORR2(JL) = PRRCORR2(II1(JL), II2(JL), II3(JL)) + ZRICORR2(JL) = PRICORR2(II1(JL), II2(JL), II3(JL)) + END IF + IF (KRR == 7) THEN + ZCHT(JL) = PCHT(II1(JL), II2(JL), II3(JL)) + ZRWETGH(JL) = PRWETGH(II1(JL), II2(JL), II3(JL)) + ZRCWETH(JL) = PRCWETH(II1(JL), II2(JL), II3(JL)) + ZRIWETH(JL) = PRIWETH(II1(JL), II2(JL), II3(JL)) + ZRSWETH(JL) = PRSWETH(II1(JL), II2(JL), II3(JL)) + ZRGWETH(JL) = PRGWETH(II1(JL), II2(JL), II3(JL)) + ZRRWETH(JL) = PRRWETH(II1(JL), II2(JL), II3(JL)) + ZRCDRYH(JL) = PRCDRYH(II1(JL), II2(JL), II3(JL)) + ZRRDRYH(JL) = PRRDRYH(II1(JL), II2(JL), II3(JL)) + ZRIDRYH(JL) = PRIDRYH(II1(JL), II2(JL), II3(JL)) + ZRSDRYH(JL) = PRSDRYH(II1(JL), II2(JL), II3(JL)) + ZRGDRYH(JL) = PRGDRYH(II1(JL), II2(JL), II3(JL)) + ZRHMLTR(JL) = PRHMLTR(II1(JL), II2(JL), II3(JL)) + ZRDRYHG(JL) = PRDRYHG(II1(JL), II2(JL), II3(JL)) + END IF + END DO + ! + ZRHOCOR(:) = (ZRHO00 / ZRHODREF(:))**ZCEXVT +! +! +!* 1.4 allocations for the non-inductive parameterizations +! + IF (CNI_CHARGING == 'GARDI') THEN + ALLOCATE( ZDELTALWC(KMICRO) ) + ALLOCATE( ZFT(KMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TAKAH' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN + ALLOCATE( ZEW(KMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'TEEWC') THEN + ALLOCATE( ZDQ(KMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TEEWC' ) THEN + ALLOCATE( ZSAUNSK(KMICRO) ) + ALLOCATE( ZSAUNIM(KMICRO) ) + ALLOCATE( ZSAUNIN(KMICRO) ) + ALLOCATE( ZSAUNSM(KMICRO) ) + ALLOCATE( ZSAUNSN(KMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN + ALLOCATE( ZFQIAGGS(KMICRO) ) + ALLOCATE( ZFQIDRYGBS(KMICRO) ) + ALLOCATE( ZLBQSDRYGB1S(KMICRO) ) + ALLOCATE( ZLBQSDRYGB2S(KMICRO) ) + ALLOCATE( ZLBQSDRYGB3S(KMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'TERAR' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN + ALLOCATE( ZRAR(KMICRO) ) + ALLOCATE( ZDQ_IS(KMICRO) ) + ALLOCATE( ZDQ_IG(KMICRO) ) + ALLOCATE( ZDQ_SG(KMICRO) ) + ALLOCATE( ZSAUNIM_IS(KMICRO) ) + ALLOCATE( ZSAUNIN_IS(KMICRO) ) + ALLOCATE( ZSAUNIM_IG(KMICRO) ) + ALLOCATE( ZSAUNIN_IG(KMICRO) ) + ALLOCATE( ZSAUNSK_SG(KMICRO) ) + ALLOCATE( ZSAUNSM_SG(KMICRO) ) + ALLOCATE( ZSAUNSN_SG(KMICRO) ) + END IF +! +! +!* 1.5 select parameters between ICEx and LIMA +! + ALLOCATE(ZRTMIN(KRR)) + IF (CCLOUD(1:3) == 'ICE') THEN +! in ini_rain_ice, xrtmin is initialized with dimension 6 (hail not activated) or 7 (hail activated) + ZRTMIN(1:KRR) = XRTMIN_I(1:KRR) + ! + ZALPHAI = XALPHAI_I + ZNUI = XNUI_I + ZAI = XAI_I + ZBI = XBI_I + ZDS = XDS_I + ZDG = XDG_I + ZCXS = XCXS_I + ZCXG = XCXG_I + ! + ZCOLIS = XCOLIS_I + ZCOLEXIS = XCOLEXIS_I + ZCOLIG = XCOLIG_I + ZCOLEXIG = XCOLEXIG_I + ZCOLSG = XCOLSG_I + ZCOLEXSG = XCOLEXSG_I + ! + IGAMINC = NGAMINC_I + ! + IACCLBDAR = NACCLBDAR_I + IACCLBDAS = NACCLBDAS_I + ZACCINTP1S = XACCINTP1S_I + ZACCINTP2S = XACCINTP2S_I + ZACCINTP1R = XACCINTP1R_I + ZACCINTP2R = XACCINTP2R_I + ! + IDRYLBDAR = NDRYLBDAR_I + IDRYLBDAS = NDRYLBDAS_I + IDRYLBDAG = NDRYLBDAG_I + ZDRYINTP1R = XDRYINTP1R_I + ZDRYINTP2R = XDRYINTP2R_I + ZDRYINTP1S = XDRYINTP1S_I + ZDRYINTP2S = XDRYINTP2S_I + ZDRYINTP1G = XDRYINTP1G_I + ZDRYINTP2G = XDRYINTP2G_I + ! + ZRIMINTP1 = XRIMINTP1_I + ZRIMINTP2 = XRIMINTP2_I + ! + ELSE IF (CCLOUD == 'LIMA') THEN +! in ini_lima, xrtmin is initialized with dimension 7 + ZRTMIN(1:KRR) = XRTMIN_L(1:KRR) + ! + ZALPHAI = XALPHAI_L + ZNUI = XNUI_L + ZAI = XAI_L + ZBI = XBI_L + ZDS = XDS_L + ZDG = XDG_L + ZCXS = XCXS_L + ZCXG = XCXG_L + ! + ZCOLIS = 0.25 ! variable not defined in LIMA, the value of ICEx is used + ZCOLEXIS = XCOLEXIS_L + ZCOLIG = XCOLIG_L + ZCOLEXIG = XCOLEXIG_L + ZCOLSG = XCOLSG_L + ZCOLEXSG = XCOLEXSG_L + ! + IGAMINC = NGAMINC_L + ! + IACCLBDAR = NACCLBDAR_L + IACCLBDAS = NACCLBDAS_L + ZACCINTP1S = XACCINTP1S_L + ZACCINTP2S = XACCINTP2S_L + ZACCINTP1R = XACCINTP1R_L + ZACCINTP2R = XACCINTP2R_L + ! + IDRYLBDAR = NDRYLBDAR_L + IDRYLBDAS = NDRYLBDAS_L + IDRYLBDAG = NDRYLBDAG_L + ZDRYINTP1R = XDRYINTP1R_L + ZDRYINTP2R = XDRYINTP2R_L + ZDRYINTP1S = XDRYINTP1S_L + ZDRYINTP2S = XDRYINTP2S_L + ZDRYINTP1G = XDRYINTP1G_L + ZDRYINTP2G = XDRYINTP2G_L + ! + ZRIMINTP1 = XRIMINTP1_L + ZRIMINTP2 = XRIMINTP2_L + END IF +! +! +!* 1.6 update the slope parameter of the distribution +!* and compute N_x if necessary +! + IF (CCLOUD(1:3) == 'ICE') ZCCT(:) = 0. + CALL COMPUTE_LAMBDA(2, IMOM_C, KMICRO, ZRHODREF, ZRTMIN(2), ZRCT, ZCCT, ZLBDAC) + CALL COMPUTE_LAMBDA(3, IMOM_R, KMICRO, ZRHODREF, ZRTMIN(3), ZRRT, ZCRT, ZLBDAR) + CALL COMPUTE_LAMBDA(4, IMOM_I, KMICRO, ZRHODREF, ZRTMIN(4), ZRIT, ZCIT, ZLBDAI) + CALL COMPUTE_LAMBDA(5, IMOM_S, KMICRO, ZRHODREF, ZRTMIN(5), ZRST, ZCST, ZLBDAS) + CALL COMPUTE_LAMBDA(6, IMOM_G, KMICRO, ZRHODREF, ZRTMIN(6), ZRGT, ZCGT, ZLBDAG) + IF (KRR == 7) CALL COMPUTE_LAMBDA(7, IMOM_H, KMICRO, ZRHODREF, ZRTMIN(7), ZRHT, ZCHT, ZLBDAH) +! +! +!* 1.7 update the parameter e in the charge-diameter relationship +! +! Compute e_x at time t + IF (CCLOUD == 'LIMA') THEN + CALL ELEC_COMPUTE_EX(2, IMOM_C, KMICRO, 1., ZRHODREF, ZRTMIN(2), ZRCT, ZQCT, ZECT, PLBDX=ZLBDAC, PCX=ZCCT) + CALL ELEC_COMPUTE_EX(3, IMOM_R, KMICRO, 1., ZRHODREF, ZRTMIN(3), ZRRT, ZQRT, ZERT, PLBDX=ZLBDAR, PCX=ZCRT) + CALL ELEC_COMPUTE_EX(4, IMOM_I, KMICRO, 1., ZRHODREF, ZRTMIN(4), ZRIT, ZQIT, ZEIT, PLBDX=ZLBDAI, PCX=ZCIT) + CALL ELEC_COMPUTE_EX(5, IMOM_S, KMICRO, 1., ZRHODREF, ZRTMIN(5), ZRST, ZQST, ZEST, PLBDX=ZLBDAS, PCX=ZCST) + CALL ELEC_COMPUTE_EX(6, IMOM_G, KMICRO, 1., ZRHODREF, ZRTMIN(6), ZRGT, ZQGT, ZEGT, PLBDX=ZLBDAG, PCX=ZCGT) + IF (KRR == 7) CALL ELEC_COMPUTE_EX(7, IMOM_H, KMICRO, 1., ZRHODREF, ZRTMIN(7), ZRHT, ZQHT, ZEHT, PLBDX=ZLBDAH, PCX=ZCHT) + ELSE IF (CCLOUD(1:3) == 'ICE') THEN + CALL ELEC_COMPUTE_EX(2, 1, KMICRO, 1., ZRHODREF, ZRTMIN(2), ZRCT, ZQCT, ZECT) + CALL ELEC_COMPUTE_EX(3, 1, KMICRO, 1., ZRHODREF, ZRTMIN(3), ZRRT, ZQRT, ZERT, PLBDX=ZLBDAR) + CALL ELEC_COMPUTE_EX(4, 1, KMICRO, 1., ZRHODREF, ZRTMIN(4), ZRIT, ZQIT, ZEIT, PCX=ZCIT) + CALL ELEC_COMPUTE_EX(5, 1, KMICRO, 1., ZRHODREF, ZRTMIN(5), ZRST, ZQST, ZEST, PLBDX=ZLBDAS) + CALL ELEC_COMPUTE_EX(6, 1, KMICRO, 1., ZRHODREF, ZRTMIN(6), ZRGT, ZQGT, ZEGT, PLBDX=ZLBDAG) + IF (KRR == 7) CALL ELEC_COMPUTE_EX(7, 1, KMICRO, 1., ZRHODREF, ZRTMIN(7), ZRHT, ZQHT, ZEHT, PLBDX=ZLBDAH) + END IF +! +! +!* 1.8 initialization for the non-inductive charging process +! + SELECT CASE (CNI_CHARGING) + ! Initialization for the parameterization of Gardiner et al. (1995) + CASE ('GARDI') + CALL ELEC_INIT_NOIND_GARDI() + ! Save the effective water content + DO JL = 1, KMICRO + XEW(II1(JL),II2(JL),II3(JL)) = ZDELTALWC(JL) ! + END DO + ! + ! Initialization for the parameterizations of Saunders et al. (1991) + ! with and without anomalies, and Tsenova and Mitzeva (2009) + CASE ('SAUN1', 'SAUN2', 'TEEWC') + CALL ELEC_INIT_NOIND_EWC() + ! Save the effective water content + DO JL = 1, KMICRO + XEW(II1(JL),II2(JL),II3(JL)) = ZEW(JL) ! g/m3 + END DO + ! + ! Initialization for the parameterizations of Saunders and Peck (1998), + ! Brooks et al. (1997) and Tsenova and Mitzeva (2011) + CASE ('SAP98', 'BSMP1', 'BSMP2', 'TERAR') + CALL ELEC_INIT_NOIND_RAR() + ! Save the rime accretion rate (not recorded properly: 3 different RAR are computed !!!) + DO JL = 1, KMICRO + XEW(II1(JL),II2(JL),II3(JL)) = ZRAR(JL) ! g/m3 + END DO + ! + ! Initialization for the parameterization of Takahashi (1978) + CASE ('TAKAH') + CALL ELEC_INIT_NOIND_TAKAH() + ! Save the effective water content + DO JL = 1, KMICRO + XEW(II1(JL),II2(JL),II3(JL)) = ZEW(JL) ! g/m3 + END DO + END SELECT +! +! +!------------------------------------------------------------------ +! +!* 2. COMPUTE THE SLOW COLD PROCESS SOURCES +! ------------------------------------- +! +!* 2.1 heterogeneous nucleation +! +! --> rien n'est fait pour l'elec pour le moment +! ICE3/4 : rvheni/rvhind +! LIMA : rvhenc, rchinc, rvhonh +! +! +!* 2.2 spontaneous freezing (rhong) +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SFR', & + Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SFR', & + Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + ZWQ(:) = 0. + WHERE (ZRRHONG(:) > 0. .AND. & + ZRRT(:) > XRTMIN_ELEC(3) .AND. ABS(ZQRT(:)) > XQTMIN(3)) + ZWQ(:) = ZQRS(:) + ! + ZQGS(:) = ZQGS(:) + ZQRS(:) + ZQRS(:) = 0. + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SFR', & + Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SFR', & + Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 2.3 cloud ice melting (rimltc) +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'IMLT', & + Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'IMLT', & + Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + WHERE (ZRIMLTC(:) > 0.) + ZQCS(:) = ZQCS(:) + ZQIS(:) + ZQIS(:) = 0. + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'IMLT', & + Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'IMLT', & + Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 2.4 riming-conversion of the large sized aggregates into graupel ??? +! ancienne param => on calcule plutot cette tendance un peu plus loin ? +! +! +!* 2.5 homogeneous nucleation (rchoni) +! +! CB : traitement different entre ice3 et lima --> a modifier eventuellement +! + ZWQ(:) = 0. + WHERE (ZRCHONI(:) > 0. .AND. & + ZRCT(:) > XRTMIN_ELEC(2) .AND. & + ABS(ZQCT(:)) > XQTMIN(2) .AND. ABS(ZECT(:)) > XECMIN) + ZWQ(:) = XQHON * ZECT(:) * ZRCHONI(:) + ZWQ(:) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQCS(:) ) + ! + ZQIS(:) = ZQIS(:) + ZWQ(:) + ZQCS(:) = ZQCS(:) - ZWQ(:) + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'HON', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'HON', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 2.6 deposition on snow/aggregates (rvdeps) +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPS', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPS', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + ZWQ(:) = 0. + ! + ! Only the sublimation of snow/aggregates is considered (negative part of PRVDEPS) + WHERE (ZRVDEPS(:) < 0. .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ABS(ZQST(:)) > XQTMIN(5)) + ZWQ(:) = XCOEF_RQ_S * ZQST(:) * ZRVDEPS(:) / ZRST(:) + ZWQ(:) = SIGN( MIN( ABS(ZQST(:)/PTSTEP),ABS(ZWQ(:)) ),ZQSS(:) ) + ! + ZQSS(:) = ZQSS(:) - ZWQ(:) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/XECHARGE ) + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPS', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPS', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DEPS', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 2.7 aggregation on snow/aggregates (riaggs) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRIAGGS, ZRIT, ZQIT, PTSTEP, & + XRTMIN_ELEC(4), XQTMIN(4), XCOEF_RQ_I, & + ZWQ, ZQIS, ZQSS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'AGGS', & + Unpack( -zwq(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'AGGS', & + Unpack( zwq(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 2.8 non-inductive charging during ice - snow collisions +! + CALL ELEC_IAGGS_B() +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'NIIS', & + Unpack( -zwq_ni(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'NIIS', & + Unpack( zwq_ni(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! Save the NI charging rate + DO JL = 1, KMICRO + XNI_IAGGS(II1(JL),II2(JL),II3(JL)) = ZWQ_NI(JL) * ZRHODREF(JL) ! C/m3/s + END DO +! +! +!* 2.9 autoconversion of r_i for r_s production (riauts/ricnvs) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRIAUTS, ZRIT, ZQIT, PTSTEP, & + XRTMIN_ELEC(4), XQTMIN(4), XCOEF_RQ_I, & + ZWQ, ZQIS, ZQSS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'AUTS', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'AUTS', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 2.10 snow --> ice conversion (rscnvi) +! + IF (CCLOUD == 'LIMA') THEN + CALL COMPUTE_CHARGE_TRANSFER (ZRICNVI, ZRST, ZQST, PTSTEP, & + XRTMIN_ELEC(5), XQTMIN(5), XCOEF_RQ_S, & + ZWQ, ZQSS, ZQIS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CNVI', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'CNVI', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +!* 2.11 water vapor deposition on ice crystals (rvdepi) +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'SUBI', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'SUBI', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + ! + ZWQ(:) = 0. + ! + ! Only the sublimation of ice crystals is considered (negative part of PRVDEPI) + WHERE (ZRVDEPI(:) < 0. .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ABS(ZQIT(:)) > XQTMIN(4)) + ZWQ(:) = XCOEF_RQ_I * ZQIT(:) * ZRVDEPI(:) / ZRIT(:) + ZWQ(:) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQIS(:) ) + ! + ZQIS(:) = ZQIS(:) - ZWQ(:) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/XECHARGE ) + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'SUBI', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'SUBI', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'SUBI', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + END IF +! +! +!* 2.12 water vapor deposition on graupel (rvdepg) +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPG', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPG', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + ZWQ(:) = 0. + ! + ! Only the sublimation of graupel is considered (negative part of PRVDEPG) + WHERE (ZRVDEPG(:) < 0. .AND. & + ZRGT(:) > XRTMIN_ELEC(6) .AND. ABS(ZQGT(:)) > XQTMIN(6)) + ZWQ(:) = XCOEF_RQ_G * ZQGT(:) * ZRVDEPG(:) / ZRGT(:) + ZWQ(:) = SIGN( MIN( ABS(ZQGT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQGS(:) ) + ! + ZQGS(:) = ZQGS(:) - ZWQ(:) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/XECHARGE ) + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPG', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPG', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DEPG', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!------------------------------------------------------------------ +! +!* 3. COMPUTE THE WARM PROCESS SOURCES +! -------------------------------- +! +!* 3.1 autoconversion of r_c for r_r production (rcautr) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRCAUTR, ZRCT, ZQCT, PTSTEP, & + XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, & + ZWQ, ZQCS, ZQRS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'AUTO', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'AUTO', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 3.2 accretion of r_c for r_r production (rcaccr) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRCACCR, ZRCT, ZQCT, PTSTEP, & + XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, & + ZWQ, ZQCS, ZQRS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'ACCR', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'ACCR', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 3.3 evaporation of raindrops (rrevav) +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'REVA', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'REVA', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + ZWQ(:) = 0. + WHERE (ZRREVAV(:) > 0. .AND. & + ZRRT(:) > XRTMIN_ELEC(3) .AND. ABS(ZQRT(:)) > XQTMIN(3)) + ZWQ(:) = XCOEF_RQ_R * ZQRT(:) * ZRREVAV(:) / ZRRT(:) + ZWQ(:) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQRS(:) ) + ! + ZQRS(:) = ZQRS(:) - ZWQ(:) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/XECHARGE ) + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'REVA', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'REVA', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'REVA', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 3.4 conversion of drops to droplets (rrcvrc) +! + IF (CCLOUD == 'LIMA') THEN + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'R2C1', & + Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'R2C1', & + Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + CALL COMPUTE_CHARGE_TRANSFER (ZRRCVRC, ZRRT, ZQRT, PTSTEP, & + XRTMIN_ELEC(3), XQTMIN(3), XCOEF_RQ_R, & + ZWQ, ZQRS, ZQCS) +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'R2C1', & + Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'R2C1', & + Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + END IF +! +!------------------------------------------------------------------ +! +!* 4. COMPUTE THE FAST COLD PROCESS SOURCES FOR r_s +! --------------------------------------------- +! +!* 4.1 cloud droplet riming of the aggregates +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'RIM', & + Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'RIM', & + Unpack( zqss(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'RIM', & + Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +!* 4.1.1 riming of the small sized aggregates (rcrimss) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRCRIMSS, ZRCT, ZQCT, PTSTEP, & + XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, & + ZWQ, ZQCS, ZQSS) +! +! +!* 4.1.2 riming conversion of the large sized aggregates into graupel (rcrimsg) +! + ZWQ(:) = 0. + WHERE (ZRCRIMSG(:) > 0. .AND. & + ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ABS(ZQCT(:)) > XQTMIN(2)) + ZWQ(:) = XCOEF_RQ_C * ZQCT(:) * ZRCRIMSG(:) / ZRCT(:) ! QCRIMSG + ZWQ(:) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQCS(:) ) + ! + ZQGS(:) = ZQGS(:) + ZWQ(:) + ZQCS(:) = ZQCS(:) - ZWQ(:) + END WHERE +! +! +!* 4.1.3 riming conversion of the large sized aggregates into graupel (rsrimcg) +! + GMASK(:) = .FALSE. + IGMASK = 0 + DO JJ = 1, SIZE(GMASK) + IF (ZRSRIMCG(JJ) > 0. .AND. ZZT(JJ) < XTT .AND. & + ZRCT(JJ) > XRTMIN_ELEC(2) .AND. ZRST(JJ) > XRTMIN_ELEC(5) .AND. & + ZLBDAS(JJ) > 0.) THEN !++cb-- 12/07/23 condition ajoutee pour eviter log(0) + IGMASK = IGMASK + 1 + I1(IGMASK) = JJ + GMASK(JJ) = .TRUE. + ELSE + GMASK(JJ) = .FALSE. + END IF + END DO + ! + ALLOCATE(ZVEC1(IGMASK)) + ALLOCATE(ZVEC2(IGMASK)) + ALLOCATE(IVEC2(IGMASK)) + ! + ! select the ZLBDAS + DO JJ = 1, IGMASK + ZVEC1(JJ) = ZLBDAS(I1(JJ)) + END DO + ! find the next lower indice for the ZLBDAS in the geometrical set of Lbda_s + ! used to tabulate some moments of the incomplete gamma function + ZVEC2(1:IGMASK) = MAX( 1.00001, MIN( REAL(IGAMINC)-0.00001, & + ZRIMINTP1 * LOG( ZVEC1(1:IGMASK) ) + ZRIMINTP2 ) ) + IVEC2(1:IGMASK) = INT( ZVEC2(1:IGMASK) ) + ZVEC2(1:IGMASK) = ZVEC2(1:IGMASK) - REAL( IVEC2(1:IGMASK) ) + ! + ! perform the linear interpolation of the normalized "XFS"-moment of + ! the incomplete gamma function + ZVEC1(1:IGMASK) = XGAMINC_RIM3( IVEC2(1:IGMASK)+1 ) * ZVEC2(1:IGMASK) & + - XGAMINC_RIM3( IVEC2(1:IGMASK) ) * (ZVEC2(1:IGMASK) - 1.0) + ! + ZWQ(:) = 0. + DO JJ = 1, IGMASK + ZWQ(I1(JJ)) = ZVEC1(JJ) + END DO + ! + DEALLOCATE(ZVEC1) + DEALLOCATE(ZVEC2) + DEALLOCATE(IVEC2) + ! + ! riming-conversion of the large sized aggregates into graupeln (rsrimcg) + WHERE (ZRSRIMCG(:) > 0. .AND. & + ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ABS(ZQCT(:)) > XQTMIN(2) .AND. ABS(ZEST(:)) > XESMIN) + ZWQ(:) = XQSRIMCG * ZEST(:) * ZCST(:) * & ! QSRIMCG + ZLBDAS(:)**XEXQSRIMCG * (1. - ZWQ(:)) / & + (PTSTEP * ZRHODREF(:)) + ZWQ(:) = SIGN( MIN( ABS(ZQST(:)/PTSTEP),ABS(ZWQ(:)) ),ZQSS(:) ) + ! + ZQGS(:) = ZQGS(:) + ZWQ(:) + ZQSS(:) = ZQSS(:) - ZWQ(:) + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'RIM', & + Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'RIM', & + Unpack( zqss(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'RIM', & + Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 4.2 Hallett-Mossop ice multiplication process due to snow riming (rhmsi) +! + IF (CCLOUD == 'LIMA') THEN + CALL COMPUTE_CHARGE_TRANSFER (ZRSHMSI, ZRST, ZQST, PTSTEP, & + XRTMIN_ELEC(4), XQTMIN(4), XCOEF_RQ_S, & + ZWQ, ZQSS, ZQIS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'HMS', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'HMS', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + END IF +! +! +!* 4.3 Raindrop accretion onto the aggregates +! + IGMASK = 0 + DO JJ = 1, SIZE(GMASK) + IF (ZRRT(JJ) > ZRTMIN(3) .AND. ZLBDAR(JJ) > 0. .AND. & + ZRST(JJ) > ZRTMIN(5) .AND. ZLBDAS(JJ) > 0.) THEN + IGMASK = IGMASK + 1 + I1(IGMASK) = JJ + GMASK(JJ) = .TRUE. + ELSE + GMASK(JJ) = .FALSE. + END IF + END DO + ! + IF (IGMASK > 0) THEN + ALLOCATE(ZVEC1(IGMASK)) + ALLOCATE(ZVEC2(IGMASK)) + ALLOCATE(IVEC1(IGMASK)) + ALLOCATE(IVEC2(IGMASK)) + ALLOCATE(ZVECQ1(IGMASK)) + ALLOCATE(ZVECQ2(IGMASK)) + ALLOCATE(ZVECQ3(IGMASK)) + ! + ! select the (ZLBDAS,ZLBDAR) couplet + DO JJ = 1, IGMASK + ZVEC1(JJ) = ZLBDAS(I1(JJ)) + ZVEC2(JJ) = ZLBDAR(I1(JJ)) + END DO + ! + ! find the next lower indice for the ZLBDAS and for the ZLBDAR in the geometrical + ! set of (Lbda_s,Lbda_r) couplet use to tabulate the kernels + ZVEC1(1:IGMASK) = MAX( 1.00001, MIN( REAL(IACCLBDAS)-0.00001, & + ZACCINTP1S * LOG( ZVEC1(1:IGMASK) ) + ZACCINTP2S ) ) + IVEC1(1:IGMASK) = INT( ZVEC1(1:IGMASK) ) + ZVEC1(1:IGMASK) = ZVEC1(1:IGMASK) - REAL( IVEC1(1:IGMASK) ) + ! + ZVEC2(1:IGMASK) = MAX( 1.00001, MIN( REAL(IACCLBDAR)-0.00001, & + ZACCINTP1R * LOG( ZVEC2(1:IGMASK) ) + ZACCINTP2R ) ) + IVEC2(1:IGMASK) = INT( ZVEC2(1:IGMASK) ) + ZVEC2(1:IGMASK) = ZVEC2(1:IGMASK) - REAL( IVEC2(1:IGMASK) ) + ! + ! perform the bilinear interpolation of the normalized kernels + ZVECQ1(:) = BI_LIN_INTP_V(XKER_Q_RACCSS, IVEC1, IVEC2, ZVEC1, ZVEC2, IGMASK) + ZVECQ2(:) = BI_LIN_INTP_V(XKER_Q_RACCS, IVEC1, IVEC2, ZVEC1, ZVEC2, IGMASK) + ZVECQ3(:) = BI_LIN_INTP_V(XKER_Q_SACCRG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGMASK) + ZWQ1(:) = 0. + ZWQ2(:) = 0. + ZWQ3(:) = 0. + DO JJ = 1, IGMASK + ZWQ1(I1(JJ)) = ZVECQ1(JJ) + ZWQ2(I1(JJ)) = ZVECQ2(JJ) + ZWQ3(I1(JJ)) = ZVECQ3(JJ) + END DO +! + DEALLOCATE(ZVEC1) + DEALLOCATE(ZVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(IVEC2) + DEALLOCATE(ZVECQ1) + DEALLOCATE(ZVECQ2) + DEALLOCATE(ZVECQ3) +! +! +!* 4.3.1 raindrop accretion onto the small sized aggregates (rraccss) +! + ZWQ4(:) = 0. + ZWQ5(:,:) = 0. + WHERE (ZRRACCSS(:) > 0. .AND. & + ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCRT(:) > 0. .AND. ZCST(:) > 0. .AND. & + ZLBDAR(:) > 0. .AND. ZLBDAS(:) > 0. .AND. & + ABS(ZERT(:)) > XERMIN) ! and zzt(:) < xtt ? + ZWQ4(:) = XFQRACCS * ZERT(:) * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) * & + ZCRT(:) * ZCST(:) * & + (XLBQRACCS1 * ZLBDAR(:)**(-2.0 - XFR) + & + XLBQRACCS2 * ZLBDAR(:)**(-1.0 - XFR) * ZLBDAS(:)**(-1.0) + & + XLBQRACCS3 * ZLBDAR(:)**(-XFR) * ZLBDAS(:)**(-2.0)) + ZWQ5(:,1) = ZWQ4(:) * ZWQ1(:) ! QRACCSS + ZWQ5(:,1) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ5(:,1)) ),ZQRS(:) ) + ! + ZQRS(:) = ZQRS(:) - ZWQ5(:,1) + ZQSS(:) = ZQSS(:) + ZWQ5(:,1) + END WHERE +! +! +!* 4.3.2 raindrop accretion-conversion of the large sized aggregates into graupel +!* (rsaccrg & rraccsg) +! + ZWQ5(:,2) = ZWQ2(:) * ZWQ4(:) ! QRACCS + WHERE (ZRRACCSG(:) > 0. .AND. & + ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZLBDAR(:) > 0. .AND. ZLBDAS(:) > 0.) + ZWQ5(:,3) = ZWQ5(:,2) - ZWQ5(:,1) ! QRACCSG + ZWQ5(:,3) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ5(:,3)) ),ZQRS(:) ) + ! + ZQRS(:) = ZQRS(:) - ZWQ5(:,3) + ZQGS(:) = ZQGS(:) + ZWQ5(:,3) + END WHERE +! + WHERE (ZRSACCRG(:) > 0. .AND. & + ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCRT(:) > 0. .AND. ZCST(:) > 0. .AND. & + ZLBDAR(:) > 0. .AND. ZLBDAS(:) > 0. .AND. & + ABS(ZEST) > XESMIN) + ZWQ5(:,4) = ZWQ3(:) * XFQRACCS * ZEST(:) * & + ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) * & + ZCRT(:) * ZCST(:) * & + (XLBQSACCRG1 * ZLBDAS(:)**(-2.0 - XFS) + & + XLBQSACCRG2 * ZLBDAS(:)**(-1.0 - XFS) * ZLBDAR(:)**(-1.0) + & + XLBQSACCRG3 * ZLBDAS(:)**(-XFS) * ZLBDAR(:)**(-2.0)) ! QSACCR + ZWQ5(:,4) = SIGN( MIN( ABS(ZQST(:)/PTSTEP),ABS(ZWQ5(:,4)) ),ZQSS(:) ) + ! + ZQSS(:) = ZQSS(:) - ZWQ5(:,4) + ZQGS(:) = ZQGS(:) + ZWQ5(:,4) + END WHERE + ! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'ACC', & + Unpack( (-zwq5(:,1) - zwq5(:,3)) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'ACC', & + Unpack( ( zwq5(:,1) - zwq5(:,4)) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'ACC', & + Unpack( ( zwq5(:,3) + zwq5(:,4)) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + ! + END IF ! end if igmask>0 +! +! +!* 4.4 conversion-melting of the aggregates (rsmltg) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRSMLTG, ZRST, ZQST, PTSTEP, & + XRTMIN_ELEC(5), XQTMIN(5), XCOEF_RQ_S, & + ZWQ, ZQSS, ZQGS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'CMEL', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CMEL', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 4.5 cloud droplet collection onto aggregates by positive temperature (rcmltsr) +! + IF (CCLOUD(1:3) == 'ICE') THEN + CALL COMPUTE_CHARGE_TRANSFER (ZRCMLTSR, ZRCT, ZQCT, PTSTEP, & + XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, & + ZWQ, ZQCS, ZQRS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'CMEL', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CMEL', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + END IF +! +! +!------------------------------------------------------------------ +! +!* 5. COMPUTE THE FAST COLD PROCESS SOURCES FOR r_g +! --------------------------------------------- +! +!* 5.1 rain contact freezing (ricfrrg, rrcfrig, ricfrr) +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CFRZ', & + Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CFRZ', & + Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CFRZ', & + Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + ! + ZWQ(:) = 0. + WHERE (ZRRCFRIG(:) > 0. .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRRT(:) > XRTMIN_ELEC(3) .AND. & + ZCRT(:) > 0. .AND. & + ABS(ZERT(:)) > XERMIN .AND. ABS(ZQRT(:)) > XQTMIN(3)) + ZWQ(:) = XQRCFRIG * ZLBDAR(:)**XEXQRCFRIG * ZCIT(:) * ZCRT(:) * & + ZERT(:) * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) ! QRCFRIG + ZWQ(:) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQRS(:) ) + ! + ZQGS(:) = ZQGS(:) + ZWQ(:) + ZQRS(:) = ZQRS(:) - ZWQ(:) + END WHERE + ! + ZWQ(:) = 0. + WHERE (ZRICFRRG(:) > 0. .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRRT(:) > XRTMIN_ELEC(3) .AND. & + ABS(ZQIT(:)) > XQTMIN(4)) + ZWQ(:) = XCOEF_RQ_I * ZQIT(:) * ZRICFRRG(:) / ZRIT(:) ! QICFRRG + ZWQ(:) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQIS(:) ) + ! + ZQGS(:) = ZQGS(:) + ZWQ(:) + ZQIS(:) = ZQIS(:) - ZWQ(:) + ENDWHERE +! +!++CB-- 16/06/2022 il manque le traitement de qricfrr +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CFRZ', & + Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CFRZ', & + Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CFRZ', & + Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 5.2 graupel dry growth (qcdryg, qrdryg, qidryg & qsdryg) +! + ZWQ5(:,:) = 0. +! +!* 5.2.1 compute qcdryg +! + WHERE (ZRCDRYG(:) > 0. .AND. & + ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ABS(ZQCT(:)) > XQTMIN(2)) + ZWQ5(:,1) = XCOEF_RQ_C * ZQCT(:) * ZRCDRYG(:) / ZRCT(:) + ZWQ5(:,1) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ5(:,1)) ),ZQCS(:) ) + ! + ZQCS(:) = ZQCS(:) - ZWQ5(:,1) + ZQGS(:) = ZQGS(:) + ZWQ5(:,1) + ENDWHERE +! +! +!* 5.2.2 compute qidryg = qidryg_coal + qidryg_boun +! + WHERE (ZRIDRYG(:) > 0. .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ABS(ZQIT(:)) > XQTMIN(4)) + ZWQ5(:,2) = XCOEF_RQ_I * ZQIT(:) * ZRIDRYG(:) / ZRIT(:) ! QIDRYG_coal + ZWQ5(:,2) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ5(:,2)) ),ZQIS(:) ) + ! + ZQIS(:) = ZQIS(:) - ZWQ5(:,2) + ZQGS(:) = ZQGS(:) + ZWQ5(:,2) + END WHERE +! +! +!* 5.2.3 compute non-inductive charging durig ice - graupel collisions +! + ! charge separation during collision between ice and graupel + CALL ELEC_IDRYG_B() ! QIDRYG_boun + ! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'NIIG', & + Unpack( -zwq_ni(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'NIIG', & + Unpack( zwq_ni(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + ! + ! Save the NI charging rate + DO JL = 1, KMICRO + XNI_IDRYG(II1(JL),II2(JL),II3(JL)) = ZWQ_NI(JL) * ZRHODREF(JL) ! C/m3/s + END DO +! +! +!* 5.2.4 compute qsdryg +! + IGMASK = 0 + DO JJ = 1, SIZE(GMASK) + IF (ZRST(JJ) > ZRTMIN(5) .AND. ZLBDAS(JJ) > 0. .AND. & + ZRGT(JJ) > ZRTMIN(6) .AND. ZLBDAG(JJ) > 0.) THEN + IGMASK = IGMASK + 1 + I1(IGMASK) = JJ + GMASK(JJ) = .TRUE. + ELSE + GMASK(JJ) = .FALSE. + END IF + END DO + ! + IF (IGMASK > 0) THEN + ! + ALLOCATE(ZVEC1(IGMASK)) + ALLOCATE(ZVEC2(IGMASK)) + ALLOCATE(IVEC1(IGMASK)) + ALLOCATE(IVEC2(IGMASK)) + ALLOCATE(ZVECQ1(IGMASK)) + ALLOCATE(ZVECQ2(IGMASK)) + ALLOCATE(ZVECQ3(IGMASK)) + ALLOCATE(ZVECQ4(IGMASK)) + ! + ! select the (ZLBDAG,ZLBDAS) couplet + DO JJ = 1, IGMASK + ZVEC1(JJ) = ZLBDAG(I1(JJ)) + ZVEC2(JJ) = ZLBDAS(I1(JJ)) + END DO + ! + ! 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(1:IGMASK) = MAX(1.00001, MIN(REAL(IDRYLBDAG)-0.00001, & + ZDRYINTP1G*LOG(ZVEC1(1:IGMASK))+ZDRYINTP2G)) + IVEC1(1:IGMASK) = INT(ZVEC1(1:IGMASK) ) + ZVEC1(1:IGMASK) = ZVEC1(1:IGMASK) - REAL(IVEC1(1:IGMASK)) + ! + ZVEC2(1:IGMASK) = MAX(1.00001, MIN( REAL(IDRYLBDAS)-0.00001, & + ZDRYINTP1S*LOG(ZVEC2(1:IGMASK))+ZDRYINTP2S)) + IVEC2(1:IGMASK) = INT(ZVEC2(1:IGMASK)) + ZVEC2(1:IGMASK) = ZVEC2(1:IGMASK) - REAL(IVEC2(1:IGMASK)) + ! + ! perform the bilinear interpolation of the normalized QSDRYG-kernels + ! normalized Q-SDRYG-kernel + ZVECQ1(:) = BI_LIN_INTP_V(XKER_Q_SDRYG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGMASK) + ZWQ5(:,3) = 0. ! normalement pas utile + DO JJ = 1, IGMASK + ZWQ5(I1(JJ),3) = ZVECQ1(JJ) + END DO + ! + ! normalized Q-???-kernel + IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'SAUN1' .OR. & + CNI_CHARGING == 'SAUN2' .OR. CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'GARDI' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN + ZVECQ2(:) = BI_LIN_INTP_V(XKER_Q_LIMSG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGMASK) + ZWQ5(:,4) = 0. ! normalement pas utile + DO JJ = 1, IGMASK + ZWQ5(I1(JJ),4) = ZVECQ2(JJ) + END DO + END IF + ! + ! normalized Q-SDRYG-bouncing kernel + IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'HELFA' .OR. & + CNI_CHARGING == 'GARDI') THEN + ZVECQ3(:) = BI_LIN_INTP_V(XKER_Q_SDRYGB,IVEC1,IVEC2,ZVEC1,ZVEC2,IGMASK) + ZWQ5(:,5) = 0. ! normalement pas utile + DO JJ = 1, IGMASK + ZWQ5(I1(JJ),5) = ZVECQ3(JJ) + END DO + ELSE + ZVECQ3(:) = BI_LIN_INTP_V(XKER_Q_SDRYGB1,IVEC1,IVEC2,ZVEC1,ZVEC2,IGMASK) + ZVECQ4(:) = BI_LIN_INTP_V(XKER_Q_SDRYGB2,IVEC1,IVEC2,ZVEC1,ZVEC2,IGMASK) + ZWQ5(:,6:7) = 0. ! normalement pas utile + DO JJ = 1, IGMASK + ZWQ5(I1(JJ),6) = ZVECQ3(JJ) ! Dvqsgmn if charge>0 + ZWQ5(I1(JJ),7) = ZVECQ4(JJ) ! Dvqsgmn if charge<0 + END DO + ENDIF + ! + DEALLOCATE(ZVEC1) + DEALLOCATE(ZVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(IVEC2) + DEALLOCATE(ZVECQ1) + DEALLOCATE(ZVECQ2) + DEALLOCATE(ZVECQ3) + DEALLOCATE(ZVECQ4) +! +!++CB-- CALCULER E_SG ICI POUR EVITER DES CALCULS REDONDANTS + ! + ! compute QSDRYG_coal + WHERE (ZRSDRYG(:) > 0 .AND. & !GDRY(:) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAG(:) > 0. .AND. & + ABS(ZQST(:)) > XQTMIN(5) .AND. ABS(ZEST(:)) > XESMIN) + ZWQ5(:,3) = ZWQ5(:,3) * XFQSDRYG * & + ZCOLSG * EXP(ZCOLEXSG * (ZZT(:) - XTT)) * & + ZEST(:) * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) * & + ZCGT(:) * ZCST(:) * & + (XLBQSDRYG1 * ZLBDAS(:)**(-2.0-XFS) + & + XLBQSDRYG2 * ZLBDAS(:)**(-1.0-XFS) * ZLBDAG(:)**(-1.0) + & + XLBQSDRYG3 * ZLBDAS(:)**(-XFS) * ZLBDAG(:)**(-2.0)) ! QSDRYG_coal + ZWQ5(:,3) = SIGN( MIN( ABS(ZQST(:)/PTSTEP),ABS(ZWQ5(:,3)) ),ZQSS(:) ) + ! + ZQSS(:) = ZQSS(:) - ZWQ5(:,3) + ZQGS(:) = ZQGS(:) + ZWQ5(:,3) + ELSEWHERE + ZWQ5(:,3) = 0. + END WHERE +! +! +!* 5.2.5 compute non-inductive charging during snow - graupel collisions +! + ! compute QSDRYG_boun + CALL ELEC_SDRYG_B() + ! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'NISG', & + Unpack( -zwq_ni(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'NISG', & + Unpack( zwq_ni(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + ! + ! Save the NI charging rate + DO JL = 1, KMICRO + XNI_SDRYG(II1(JL),II2(JL),II3(JL)) = ZWQ_NI(JL) * ZRHODREF(JL) ! C/m3/s + END DO + END IF ! end if igmask>0 +! +! +!* 5.2.6 compute qrdryg +! + IGMASK = 0 + GMASK(:) = .FALSE. + DO JJ = 1, SIZE(GMASK) + IF (ZRRT(JJ) > ZRTMIN(3) .AND. ZLBDAR(JJ) > 0. .AND. & + ZRGT(JJ) > ZRTMIN(6) .AND. ZLBDAG(JJ) > 0.) THEN + IGMASK = IGMASK + 1 + I1(IGMASK) = JJ + GMASK(JJ) = .TRUE. + ELSE + GMASK(JJ) = .FALSE. + END IF + END DO + ! + IF (IGMASK > 0) THEN + ! + ALLOCATE(ZVEC1(IGMASK)) + ALLOCATE(ZVEC2(IGMASK)) + ALLOCATE(IVEC1(IGMASK)) + ALLOCATE(IVEC2(IGMASK)) + ALLOCATE(ZVECQ1(IGMASK)) + ! + ! select the (ZLBDAG,ZLBDAR) couplet + DO JJ = 1, IGMASK + ZVEC1(JJ) = ZLBDAG(I1(JJ)) + ZVEC2(JJ) = ZLBDAR(I1(JJ)) + END DO + ! + ! 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 QDRYG-kernel + ZVEC1(1:IGMASK) = MAX(1.00001, MIN( REAL(IDRYLBDAG)-0.00001, & + ZDRYINTP1G*LOG(ZVEC1(1:IGMASK))+ZDRYINTP2G)) + IVEC1(1:IGMASK) = INT(ZVEC1(1:IGMASK)) + ZVEC1(1:IGMASK) = ZVEC1(1:IGMASK) - REAL(IVEC1(1:IGMASK)) + ! + ZVEC2(1:IGMASK) = MAX(1.00001, MIN( REAL(IDRYLBDAR)-0.00001, & + ZDRYINTP1R*LOG(ZVEC2(1:IGMASK))+ZDRYINTP2R)) + IVEC2(1:IGMASK) = INT(ZVEC2(1:IGMASK)) + ZVEC2(1:IGMASK) = ZVEC2(1:IGMASK) - REAL(IVEC2(1:IGMASK)) + ! + ! perform the bilinear interpolation of the normalized RDRYG-kernel + ZVECQ1(:) = BI_LIN_INTP_V(XKER_Q_RDRYG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGMASK) + ZWQ5(:,4) = 0. + DO JJ = 1, IGMASK + ZWQ5(I1(JJ),4) = ZVECQ1(JJ) + END DO + ! + DEALLOCATE(ZVEC1) + DEALLOCATE(ZVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(IVEC2) + DEALLOCATE(ZVECQ1) + ! + ! compute QRDRYG + WHERE (ZRRDRYG(:) > 0. .AND. & + ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCRT(:) > 0. .AND. ZCGT(:) > 0. .AND. & + ZLBDAR(:) > 0. .AND. ZLBDAG(:) > 0. .AND. & + ABS(ZERT(:)) > XERMIN .AND. ABS(ZQRT(:)) > XQTMIN(3)) + ZWQ5(:,4) = ZWQ5(:,4) * XFQRDRYG * & + ZRHODREF(:)**(-ZCEXVT) * & + ZERT(:) * ZCGT(:) * ZCRT(:) * & + (XLBQRDRYG1 * ZLBDAR(:)**(-2.0 - XFR) + & + XLBQRDRYG2 * ZLBDAR(:)**(-1.0 - XFR) * ZLBDAG(:)**(-1.0) + & + XLBQRDRYG3 * ZLBDAR(:)**(-XFR) * ZLBDAG(:)**(-2.0)) + ZWQ5(:,4) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ5(:,4)) ),ZQRS(:) ) + ! + ZQRS(:) = ZQRS(:) - ZWQ5(:,4) + ZQGS(:) = ZQGS(:) + ZWQ5(:,4) + ELSEWHERE + ZWQ5(:,4) = 0. + ENDWHERE +! ZRDRYG(:) = ZWQ5(:,1) + ZWQ5(:,2) + ZWQ5(:,3) + ZWQ5(:,4) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DRYG', & + Unpack( -zwq5(:,1) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'DRYG', & + Unpack( -zwq5(:,4) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DRYG', & + Unpack( -zwq5(:,2) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DRYG', & + Unpack( -zwq5(:,3) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DRYG', & + Unpack( (zwq5(:,1) + zwq5(:,2) + zwq5(:,3) + zwq5(:,4)) * zrhodj(:), & + mask = odmicro(:, :, :), field = 0. ) ) + end if +! + END IF ! end if igmask>0 +! +! +!* 5.3 Hallett-Mossop ice multiplication process due to graupel riming (rhmgi) +! + IF (CCLOUD == 'LIMA') THEN + CALL COMPUTE_CHARGE_TRANSFER (ZRGHMGI, ZRGT, ZQGT, PTSTEP, & + XRTMIN_ELEC(6), XQTMIN(6), XCOEF_RQ_G, & + ZWQ, ZQGS, ZQIS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'HMG', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'HMG', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + END IF +! +! +!* 5.4 graupel wet growth (rcwetg, rrwetg, riwetg & rswetg) +! +!* 5.4.1 compute qcwetg +! + ZWQ5(:,5) = 0. + WHERE (ZRCWETG(:) > 0. .AND. ZRCT(:) > XRTMIN_ELEC(2) .AND. ABS(ZQCT(:)) > XQTMIN(2) .AND. & + ZRGT(:) > XRTMIN_ELEC(6)) + ZWQ5(:,5) = XCOEF_RQ_C * ZRCWETG(:) * ZQCT(:) / ZRCT(:) + ZWQ5(:,5) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ5(:,5)) ),ZQCS(:) ) + END WHERE +! +! +!* 5.4.1 compute qiwetg +! + ZWQ5(:,6) = 0. + WHERE (ZRIWETG(:) > 0. .AND. ZRIT(:) > XRTMIN_ELEC(4) .AND. ABS(ZQIT(:)) > XQTMIN(4) .AND. & + ZRGT(:) > XRTMIN_ELEC(6)) + ZWQ5(:,6) = XCOEF_RQ_I * ZRIWETG(:) * ZQIT(:) / ZRIT(:) + ZWQ5(:,6) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ5(:,6)) ),ZQIS(:) ) + END WHERE +! +! +!* 5.4.2 compute qswetg +! + ZWQ5(:,7) = 0. + WHERE (ZRSWETG(:) > 0. .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. ABS(ZQST(:)) > XQTMIN(5) .AND. & + ZRGT(:) > XRTMIN_ELEC(6)) + ZWQ5(:,7) = XCOEF_RQ_S * ZRSWETG(:) * ZQST(:) / ZRST(:) + ZWQ5(:,7) = SIGN( MIN( ABS(ZQST(:)/PTSTEP),ABS(ZWQ5(:,7)) ),ZQSS(:) ) + END WHERE +! +! +!* 5.4.3 compute qrwetg +! + ZWQ5(:,8) = 0. + WHERE (ZRRWETG(:) > 0. .AND. ZRRT(:) > XRTMIN_ELEC(3) .AND. ABS(ZQRT(:)) > XQTMIN(3) .AND. & + ZRGT(:) > XRTMIN_ELEC(6)) + ZWQ5(:,8) = XCOEF_RQ_R * ZQRT(:) * ZRRWETG(:) / ZRRT(:) + ZWQ5(:,8) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ5(:,8)) ),ZQRS(:) ) + ENDWHERE +! +! +!* 5.4.4 conversion of graupel into hail (rwetgh) +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETG', & + Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + IF (KRR == 7) THEN + ZWQ5(:,9) = 0. + WHERE (ZRWETGH(:) > 0. .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. ABS(ZQGT(:)) > XQTMIN(6)) + ZWQ5(:,9) = XCOEF_RQ_G * ZQGT(:) * ZRWETGH(:) / ZRGT(:) + ZWQ5(:,9) = SIGN( MIN( ABS(ZQGT(:)/PTSTEP),ABS(ZWQ5(:,9)) ),ZQGS(:) ) + END WHERE + ! + WHERE (ZRCWETG(:) > 0. .OR. ZRRWETG(:) > 0. .OR. ZRIWETG(:) > 0. .OR. & + ZRSWETG(:) > 0. .OR. ZRWETGH(:) > 0.) + ZQCS(:) = ZQCS(:) - ZWQ5(:,5) + ZQRS(:) = ZQRS(:) - ZWQ5(:,8) + ZQIS(:) = ZQIS(:) - ZWQ5(:,6) + ZQSS(:) = ZQSS(:) - ZWQ5(:,7) + ZQGS(:) = ZQGS(:) + ZWQ5(:,5) + ZWQ5(:,8) + ZWQ5(:,6) + ZWQ5(:,7) - ZWQ5(:,9) + ZQHS(:) = ZQHS(:) + ZWQ5(:,9) + END WHERE + ELSE IF (KRR == 6) THEN + WHERE (ZRCWETG(:) > 0. .OR. ZRRWETG(:) > 0. .OR. ZRIWETG(:) > 0. .OR. & + ZRSWETG(:) > 0.) + ZQCS(:) = ZQCS(:) - ZWQ5(:,5) + ZQRS(:) = ZQRS(:) - ZWQ5(:,8) + ZQIS(:) = ZQIS(:) - ZWQ5(:,6) + ZQSS(:) = ZQSS(:) - ZWQ5(:,7) + ZQGS(:) = ZQGS(:) + ZWQ5(:,5) + ZWQ5(:,8) + ZWQ5(:,6) + ZWQ5(:,7) + END WHERE + END IF +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'WETG', & + Unpack( -zwq5(:,5) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'WETG', & + Unpack( -zwq5(:,8) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'WETG', & + Unpack( -zwq5(:,6) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'WETG', & + Unpack( -zwq5(:,7) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETG', & + Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + if ( krr == 7 ) & + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'WETG', & + Unpack( zwq5(:,9) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 5.5 compute charge separation by the inductive mechanism +! +! Computation of the charge transfer rate during inductive mechanism +! Only the bouncing droplet-graupel collision when the graupel is in the dry +! growth mode is considered +! The electric field is limited to 100 kV/m +! + IF (LINDUCTIVE) THEN + ZWQ(:) = 0. + GMASK(:) = ZRCDRYG(:) > 0. + IGMASK = COUNT(GMASK(:)) + ! + IF (IGMASK > 0) THEN + ZWQ(:) = 0. + ! + WHERE (GMASK(:) .AND. & + ZEFIELDW(:) /= 0. .AND. ABS(ZEGT(:)) > XEGMIN .AND. & + ZLBDAG(:) > 0. .AND. ZCGT(:) > 0. .AND. & + ZRGT(:) > XRTMIN_ELEC(6) .AND. ZRCT(:) > XRTMIN_ELEC(2)) + ZWQ(:) = XIND1 * ZCGT(:) * ZRHOCOR(:) * & + (XIND2 * SIGN(MIN(100.E3, ABS(ZEFIELDW(:))), ZEFIELDW(:)) * & + ZLBDAG(:) **(-2.-ZDG) - & + XIND3 * ZEGT(:) * ZLBDAG(:)**(-XFG-ZDG)) + ZWQ(:) = ZWQ(:) / ZRHODREF(:) + ! + ZQGS(:) = ZQGS(:) + ZWQ(:) + ZQCS(:) = ZQCS(:) - ZWQ(:) + END WHERE + ! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'INCG', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'INCG', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + ! + ! Save the inductive charging rate + DO JL = 1, KMICRO + XIND_RATE(II1(JL),II2(JL),II3(JL)) = ZWQ(JL) * ZRHODREF(JL) ! C/m3/s + END DO + END IF + ! + ! Save the inductive charging rate + DO JL = 1, KMICRO + XIND_RATE(II1(JL),II2(JL),II3(JL)) = ZWQ(JL) * ZRHODREF(JL) ! C/m3/s + END DO + END IF +! +! +!* 5.6 melting of the graupel (rgmltr) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRGMLTR, ZRGT, ZQGT, PTSTEP, & + XRTMIN_ELEC(6), XQTMIN(6), XCOEF_RQ_G, & + ZWQ, ZQGS, ZQRS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'GMLT', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'GMLT', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!------------------------------------------------------------------ +! +!* 6. COMPUTE THE OPTIONAL SECONDARY ICE PRODUCTION +! --------------------------------------------- +! +! dans un premier temps, on considere que la charge echangee est proportionnelle +! a la masse echangee +! +!* 6.1 collisional ice breakup (cibu) +! + IF (CCLOUD == 'LIMA' .AND. LCIBU) & + CALL COMPUTE_CHARGE_TRANSFER (ZRICIBU, ZRST, ZQST, PTSTEP, & + XRTMIN_ELEC(5), XQTMIN(5), XCOEF_RQ_S, & + ZWQ, ZQSS, ZQIS) +! +!* 6.2 raindrop shattering freezing (rdsf) +! + IF (CCLOUD == 'LIMA' .AND. LRDSF) & + CALL COMPUTE_CHARGE_TRANSFER (ZRIRDSF, ZRRT, ZQRT, PTSTEP, & + XRTMIN_ELEC(3), XQTMIN(3), XCOEF_RQ_R, & + ZWQ, ZQRS, ZQIS) +! +! +!------------------------------------------------------------------ +! +!* 7. COMPUTE THE FAST COLD PROCESS SOURCES FOR r_h +! --------------------------------------------- +! + IF (KRR == 7) THEN +! +!* 7.1 wet growth of hail (qcweth, qrweth, qiweth, qsweth, qgweth) +! + ZWQ5(:,:) = 0. + ! + WHERE (ZRCWETH(:) > 0. .AND. ZRCT(:) > XRTMIN_ELEC(2)) + ZWQ5(:,1) = XCOEF_RQ_C * ZQCT(:) * ZRCWETH(:) / ZRCT(:) ! QCWETH + ZWQ5(:,1) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ5(:,1)) ),ZQCS(:) ) + ! + ZQCS(:) = ZQCS(:) - ZWQ5(:,1) + ZQHS(:) = ZQHS(:) + ZWQ5(:,1) + END WHERE + ! + WHERE (ZRIWETH(:) > 0. .AND. ZRIT(:) > XRTMIN_ELEC(4)) + ZWQ5(:,2) = XCOEF_RQ_I * ZQIT(:) * ZRIWETH(:) / ZRIT(:) ! QIWETH + ZWQ5(:,2) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ5(:,2)) ),ZQIS(:) ) + ! + ZQIS(:) = ZQIS(:) - ZWQ5(:,2) + ZQHS(:) = ZQHS(:) + ZWQ5(:,2) + END WHERE + ! + WHERE (ZRSWETH(:) > 0. .AND. ZRST(:) > XRTMIN_ELEC(5)) + ZWQ5(:,3) = XCOEF_RQ_S * ZQST(:) * ZRSWETH(:) / ZRST(:) ! QSWETH + ZWQ5(:,3) = SIGN( MIN( ABS(ZQST(:)/PTSTEP),ABS(ZWQ5(:,3)) ),ZQSS(:) ) + ! + ZQSS(:) = ZQSS(:) - ZWQ5(:,3) + ZQHS(:) = ZQHS(:) + ZWQ5(:,3) + END WHERE + ! + WHERE (ZRGWETH(:) > 0. .AND. ZRGT(:) > XRTMIN_ELEC(6)) + ZWQ5(:,5) = XCOEF_RQ_G * ZQGT(:) * ZRGWETH(:) / ZRGT(:) ! QGWETH + ZWQ5(:,5) = SIGN( MIN( ABS(ZQGT(:)/PTSTEP),ABS(ZWQ5(:,5)) ),ZQGS(:) ) + ! + ZQGS(:) = ZQGS(:) - ZWQ5(:,5) + ZQHS(:) = ZQHS(:) + ZWQ5(:,5) + END WHERE + ! + WHERE (ZRRWETH(:) > 0. .AND. ZRRT(:) > XRTMIN_ELEC(3)) + ZWQ5(:,4) = XCOEF_RQ_R * ZQRT(:) * ZRRWETH(:) / ZRRT(:) ! QRWETH + ZWQ5(:,4) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ5(:,4)) ),ZQRS(:) ) + ! + ZQRS(:) = ZQRS(:) - ZWQ5(:,4) + ZQHS(:) = ZQHS(:) + ZWQ5(:,4) + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'WETH', & + Unpack( -zwq5(:, 1) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'WETH', & + Unpack( -zwq5(:, 4) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'WETH', & + Unpack( -zwq5(:, 2) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'WETH', & + Unpack( -zwq5(:, 3) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETH', & + Unpack( -zwq5(:, 5) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'WETH', & + Unpack( ( zwq5(:, 1) + zwq5(:, 2) + zwq5(:, 3) + zwq5(:, 4) + zwq5(:, 5) ) & + * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 7.2 dry growth of hail (qcdryh, qrdryh, qidryh, qsdryh, qgdryh) +! + ZWQ5(:,:) = 0. + ! + WHERE (ZRCDRYH(:) > 0. .AND. ZRCT(:) > XRTMIN_ELEC(2)) + ZWQ5(:,1) = XCOEF_RQ_C * ZQCT(:) * ZRCDRYH(:) / ZRCT(:) ! QCDRYH + ZWQ5(:,1) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ5(:,1)) ),ZQCS(:) ) + ! + ZQCS(:) = ZQCS(:) - ZWQ5(:,1) + ZQHS(:) = ZQHS(:) + ZWQ5(:,1) + END WHERE + ! + WHERE (ZRIDRYH(:) > 0. .AND. ZRIT(:) > XRTMIN_ELEC(4)) + ZWQ5(:,2) = XCOEF_RQ_I * ZQIT(:) * ZRIDRYH(:) / ZRIT(:) ! QIDRYH + ZWQ5(:,2) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ5(:,2)) ),ZQIS(:) ) + ! + ZQIS(:) = ZQIS(:) - ZWQ5(:,2) + ZQHS(:) = ZQHS(:) + ZWQ5(:,2) + END WHERE + ! + WHERE (ZRSDRYH(:) > 0. .AND. ZRST(:) > XRTMIN_ELEC(5)) + ZWQ5(:,3) = XCOEF_RQ_S * ZQST(:) * ZRSDRYH(:) / ZRST(:) ! QSDRYH + ZWQ5(:,3) = SIGN( MIN( ABS(ZQST(:)/PTSTEP),ABS(ZWQ5(:,3)) ),ZQSS(:) ) + ! + ZQSS(:) = ZQSS(:) - ZWQ5(:,3) + ZQHS(:) = ZQHS(:) + ZWQ5(:,3) + END WHERE + ! + WHERE (ZRGDRYH(:) > 0. .AND. ZRGT(:) > XRTMIN_ELEC(6)) + ZWQ5(:,5) = XCOEF_RQ_G * ZQGT(:) * ZRGDRYH(:) / ZRGT(:) ! QGDRYH + ZWQ5(:,5) = SIGN( MIN( ABS(ZQGT(:)/PTSTEP),ABS(ZWQ5(:,5)) ),ZQGS(:) ) + ! + ZQGS(:) = ZQGS(:) - ZWQ5(:,5) + ZQHS(:) = ZQHS(:) + ZWQ5(:,5) + END WHERE + ! + WHERE (ZRRDRYH(:) > 0. .AND. ZRRT(:) > XRTMIN_ELEC(3)) + ZWQ5(:,4) = XCOEF_RQ_R * ZQRT(:) * ZRRDRYH(:) / ZRRT(:) ! QRDRYH + ZWQ5(:,4) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ5(:,4)) ),ZQRS(:) ) + ! + ZQRS(:) = ZQRS(:) - ZWQ5(:,4) + ZQHS(:) = ZQHS(:) + ZWQ5(:,4) + END WHERE +! +! +!* 7.3 conversion of hail into graupel (qdryhg) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRDRYHG, ZRHT, ZQHT, PTSTEP, & + XRTMIN_ELEC(7), XQTMIN(7), XCOEF_RQ_H, & + ZWQ, ZQHS, ZQGS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DRYH', & + Unpack( -zwq5(:, 1) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'DRYH', & + Unpack( -zwq5(:, 4) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DRYH', & + Unpack( -zwq5(:, 2) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DRYH', & + Unpack( -zwq5(:, 3) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DRYH', & + Unpack( (-zwq5(:, 5) - zwq(:)) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'DRYH', & + Unpack( ( zwq5(:, 1) + zwq5(:, 2) + zwq5(:, 3) + zwq5(:, 4) + zwq5(:, 5) + zwq(:) ) & + * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 7.4 melting of hail (qhmltr) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRHMLTR, ZRHT, ZQHT, PTSTEP, & + XRTMIN_ELEC(7), XQTMIN(7), XCOEF_RQ_H, & + ZWQ, ZQHS, ZQRS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'HMLT', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'HMLT', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + END IF ! end if krr==7 +! +! +!------------------------------------------------------------------ +! +!* 8. COMPUTE THE FAST COLD PROCESS SOURCES FOR r_i +! --------------------------------------------- +! +!* 8.1 Bergeron-Findeisen effect (qcberi) +! + CALL COMPUTE_CHARGE_TRANSFER (ZRCBERI, ZRCT, ZQCT, PTSTEP, & + XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, & + ZWQ, ZQCS, ZQIS) +! + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'BERFI', & + Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'BERFI', & + Unpack( zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! +! +!------------------------------------------------------------------ +! +!* 9. COMPUTE THE CHARGE TRANSFER ASSOCIATED WITH THE CORRECTION TERM +! --------------------------------------------------------------- +! + IF (CCLOUD == 'LIMA') THEN +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'CORR2', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'CORR2', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if +! + ZWQ1(:) = 0. + WHERE (ZRCCORR2(:) .NE. 0. .AND. ZRCT(:) .GT. XRTMIN_ELEC(2)) + ZWQ1(:) = XCOEF_RQ_C * ZQCT(:) * ZRCCORR2(:) / ZRCT(:) + ZWQ(:) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ1(:)) ),ZQCS(:) ) + ! + ZQCS(:) = ZQCS(:) - ZWQ1(:) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ1(:)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ1(:)/XECHARGE ) + END WHERE + ! + ! + ZWQ2(:) = 0. + WHERE (ZRRCORR2(:) .NE. 0. .AND. ZRRT(:) .GT. XRTMIN_ELEC(3)) + ZWQ2(:) = XCOEF_RQ_R * ZQRT(:) * ZRRCORR2(:) / ZRRT(:) + ZWQ2(:) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ2(:)) ),ZQRS(:) ) + ! + ZQRS(:) = ZQRS(:) - ZWQ2(:) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ2(:)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ2(:)/XECHARGE ) + END WHERE + ! + ZWQ3(:) = 0. + WHERE (ZRICORR2(:) .NE. 0. .AND. ZRIT(:) .GT. XRTMIN_ELEC(4)) + ZWQ3(:) = XCOEF_RQ_I * ZQIT(:) * ZRICORR2(:) / ZRIT(:) + ZWQ3(:) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ3(:)) ),ZQIS(:) ) + ! + ZQIS(:) = ZQIS(:) - ZWQ3(:) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ3(:)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ3(:)/XECHARGE ) + END WHERE +! + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'CORR2', & + Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'CORR2', & + Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'CORR2', & + Unpack( zwq1(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CORR2', & + Unpack( zwq2(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CORR2', & + Unpack( zwq3(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) ) + end if + END IF +! +! +!------------------------------------------------------------------ +! +!* X. COMPUTE THE SEDIMENTATION SOURCE FOR Q_x +! ---------------------------------------- +! +! The sedimentation for electric charges is computed directly +! in the microphysics scheme +! +! +!------------------------------------------------------------------ +! +!* 10. UPDATE VOLUMETRIC CHARGE CONCENTRATIONS +! --------------------------------------- +! + DO JL = 1, KMICRO + PQPIS(II1(JL),II2(JL),II3(JL)) = ZQPIS(JL) + PQNIS(II1(JL),II2(JL),II3(JL)) = ZQNIS(JL) + PQCS (II1(JL),II2(JL),II3(JL)) = ZQCS(JL) + PQRS (II1(JL),II2(JL),II3(JL)) = ZQRS(JL) + PQIS (II1(JL),II2(JL),II3(JL)) = ZQIS(JL) + PQSS (II1(JL),II2(JL),II3(JL)) = ZQSS(JL) + PQGS (II1(JL),II2(JL),II3(JL)) = ZQGS(JL) + END DO + IF ( KRR == 7 ) THEN + DO JL = 1, KMICRO + PQHS(II1(JL),II2(JL),II3(JL)) = ZQHS(JL) + END DO + END IF +END IF ! end if kmicro>0 +! +! +!------------------------------------------------------------------ +! +!* 11. DEALLOCATE +! ---------- +! +IF (ALLOCATED( ZDELTALWC )) DEALLOCATE( ZDELTALWC ) +IF (ALLOCATED( ZFT )) DEALLOCATE( ZFT ) +! +IF (ALLOCATED( ZEW )) DEALLOCATE( ZEW ) +IF (ALLOCATED( ZSAUNSK )) DEALLOCATE( ZSAUNSK ) +IF (ALLOCATED( ZSAUNIM )) DEALLOCATE( ZSAUNIM ) +IF (ALLOCATED( ZSAUNIN )) DEALLOCATE( ZSAUNIN ) +IF (ALLOCATED( ZSAUNSM )) DEALLOCATE( ZSAUNSM ) +IF (ALLOCATED( ZSAUNSN )) DEALLOCATE( ZSAUNSN ) +IF (ALLOCATED( ZFQIAGGS )) DEALLOCATE( ZFQIAGGS ) +IF (ALLOCATED( ZFQIDRYGBS )) DEALLOCATE( ZFQIDRYGBS ) +IF (ALLOCATED( ZLBQSDRYGB1S )) DEALLOCATE( ZLBQSDRYGB1S ) +IF (ALLOCATED( ZLBQSDRYGB2S )) DEALLOCATE( ZLBQSDRYGB2S ) +IF (ALLOCATED( ZLBQSDRYGB3S )) DEALLOCATE( ZLBQSDRYGB3S ) +! +IF (ALLOCATED( ZDQ )) DEALLOCATE( ZDQ ) +IF (ALLOCATED( ZRAR )) DEALLOCATE( ZRAR ) +IF (ALLOCATED( ZDQ_IS )) DEALLOCATE( ZDQ_IS ) +IF (ALLOCATED( ZSAUNIM_IS )) DEALLOCATE( ZSAUNIM_IS ) +IF (ALLOCATED( ZSAUNIN_IS )) DEALLOCATE( ZSAUNIN_IS ) +IF (ALLOCATED( ZDQ_IG )) DEALLOCATE( ZDQ_IG ) +IF (ALLOCATED( ZSAUNIM_IG )) DEALLOCATE( ZSAUNIM_IG ) +IF (ALLOCATED( ZSAUNIN_IG )) DEALLOCATE( ZSAUNIN_IG ) +IF (ALLOCATED( ZDQ_SG )) DEALLOCATE( ZDQ_SG ) +IF (ALLOCATED( ZSAUNSK_SG )) DEALLOCATE( ZSAUNSK_SG ) +IF (ALLOCATED( ZSAUNSM_SG )) DEALLOCATE( ZSAUNSM_SG ) +IF (ALLOCATED( ZSAUNSN_SG )) DEALLOCATE( ZSAUNSN_SG ) +! +IF (ALLOCATED( ZEFIELDW )) DEALLOCATE( ZEFIELDW ) +! +IF (ALLOCATED(ZRCMLTSR)) DEALLOCATE(ZRCMLTSR) +IF (ALLOCATED(ZRICFRR)) DEALLOCATE(ZRICFRR) +IF (ALLOCATED(ZRVHENC)) DEALLOCATE(ZRVHENC) +IF (ALLOCATED(ZRCHINC)) DEALLOCATE(ZRCHINC) +IF (ALLOCATED(ZRVHONH)) DEALLOCATE(ZRVHONH) +IF (ALLOCATED(ZRRCVRC)) DEALLOCATE(ZRRCVRC) +IF (ALLOCATED(ZRICNVI)) DEALLOCATE(ZRICNVI) +IF (ALLOCATED(ZRVDEPI)) DEALLOCATE(ZRVDEPI) +IF (ALLOCATED(ZRSHMSI)) DEALLOCATE(ZRSHMSI) +IF (ALLOCATED(ZRGHMGI)) DEALLOCATE(ZRGHMGI) +IF (ALLOCATED(ZRICIBU)) DEALLOCATE(ZRICIBU) +IF (ALLOCATED(ZRIRDSF)) DEALLOCATE(ZRIRDSF) +IF (ALLOCATED(ZRCCORR2)) DEALLOCATE(ZRCCORR2) +IF (ALLOCATED(ZRRCORR2)) DEALLOCATE(ZRRCORR2) +IF (ALLOCATED(ZRICORR2)) DEALLOCATE(ZRICORR2) +IF (ALLOCATED(ZRWETGH)) DEALLOCATE(ZRWETGH) +IF (ALLOCATED(ZRCWETH)) DEALLOCATE(ZRCWETH) +IF (ALLOCATED(ZRIWETH)) DEALLOCATE(ZRIWETH) +IF (ALLOCATED(ZRSWETH)) DEALLOCATE(ZRSWETH) +IF (ALLOCATED(ZRGWETH)) DEALLOCATE(ZRGWETH) +IF (ALLOCATED(ZRRWETH)) DEALLOCATE(ZRRWETH) +IF (ALLOCATED(ZRCDRYH)) DEALLOCATE(ZRCDRYH) +IF (ALLOCATED(ZRRDRYH)) DEALLOCATE(ZRRDRYH) +IF (ALLOCATED(ZRIDRYH)) DEALLOCATE(ZRIDRYH) +IF (ALLOCATED(ZRSDRYH)) DEALLOCATE(ZRSDRYH) +IF (ALLOCATED(ZRGDRYH)) DEALLOCATE(ZRGDRYH) +IF (ALLOCATED(ZRHMLTR)) DEALLOCATE(ZRHMLTR) +IF (ALLOCATED(ZRDRYHG)) DEALLOCATE(ZRDRYHG) +! +!------------------------------------------------------------------ +! +CONTAINS +! +! - routines to initialize the non-inductive charging +! - routines to compute the non-inductive charging +! - various useful routines +! +!------------------------------------------------------------------ +! +! ################################## + SUBROUTINE ELEC_INIT_NOIND_GARDI() +! ################################## +! +! +! Purpose : initialization for the non-inductive charging process +! following Gardiner et al. (1985) +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. COMPUTE f(DeltaT) AND (LWC - LWC_crit) +! -------------------------------------- +! +GELEC(:,:) = .FALSE. +! +ZDELTALWC(:) = 0. +ZFT(:) = 0. +! +GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) < XTT +GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE +GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +GELEC(:,4) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3) +! +WHERE (GELEC(:,4)) + ! f(DeltaT) + ZFT(:) = - 1.7E-5 * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT))**3 & + - 0.003 * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT))**2 & + - 0.05 * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT)) & + + 0.13 + ! + ! LWC - LWC_crit + ZDELTALWC(:) = (ZRCT(:) * ZRHODREF(:) * 1.E3) - XLWCC ! (g m^-3) +ENDWHERE +! +END SUBROUTINE ELEC_INIT_NOIND_GARDI +! +!----------------------------------------------------------------- +! +! ################################ + SUBROUTINE ELEC_INIT_NOIND_EWC() +! ################################ +! +! +! Purpose : initialization for the non-inductive charging process +! following Saunders et al. (1991) +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. PARAMETERS FOR POSITIVE NI CHARGING +! ----------------------------------- +! +GELEC(:,:) = .FALSE. +ZDQ(:) = 0. +ZEW(:) = 0. +! +! positive case is the default value +IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2') THEN + ZFQIAGGS(:) = XFQIAGGSP + ZFQIDRYGBS(:) = XFQIDRYGBSP +ELSE IF (CNI_CHARGING == 'TEEWC') THEN + ZFQIAGGS(:) = XFQIAGGSP_TAK + ZFQIDRYGBS(:) = XFQIDRYGBSP_TAK +END IF +ZLBQSDRYGB1S(:) = XLBQSDRYGB1SP +ZLBQSDRYGB2S(:) = XLBQSDRYGB2SP +ZLBQSDRYGB3S(:) = XLBQSDRYGB3SP +ZSAUNIM(:) = XIMP !3.76 +ZSAUNIN(:) = XINP !2.5 +ZSAUNSK(:) = XSKP !52.8 +ZSAUNSM(:) = XSMP !0.44 +ZSAUNSN(:) = XSNP !2.5 +! +! +!* 2. PARAMETERS FOR NEGATIVE NI CHARGING +! ----------------------------------- +! +! Mansell et al. (2005, JGR): droplet collection efficiency of the graupel ~ 0.6-1.0 +WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.) + ZEW(:) = 0.8 * ZRCT(:) * ZRHODREF(:) * 1.E3 ! (g m^-3) +END WHERE +! +GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. & + ZEW(:) >= 0.01 .AND. ZEW(:) <= 10. +GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE +GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! +GELEC(:,4) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3) +! +IF (COUNT(GELEC(:,4)) > 0) THEN + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2') THEN + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZEW, ZZT, XSAUNDER, ZDQ) + ! + WHERE (ZDQ(:) < 0.) + ZFQIAGGS(:) = XFQIAGGSN + ZFQIDRYGBS(:) = XFQIDRYGBSN + END WHERE + ELSE IF (CNI_CHARGING == 'TEEWC') THEN + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZEW, ZZT, XTAKA_TM, ZDQ) + ! + WHERE (ZDQ(:) < 0.) + ZFQIAGGS(:) = XFQIAGGSN_TAK + ZFQIDRYGBS(:) = XFQIDRYGBSN_TAK + END WHERE + END IF +! +! value of the parameters for the negative case + WHERE (ZDQ(:) < 0.) + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SN + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SN + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SN + ZSAUNIM(:) = XIMN !2.54 + ZSAUNIN(:) = XINN !2.8 + ZSAUNSK(:) = XSKN !24. + ZSAUNSM(:) = XSMN !0.5 + ZSAUNSN(:) = XSNN !2.8 + ENDWHERE +ENDIF +! +END SUBROUTINE ELEC_INIT_NOIND_EWC +! +!------------------------------------------------------------------ +! +! ################################ + SUBROUTINE ELEC_INIT_NOIND_RAR() +! ################################ +! +! +! Purpose : initialization for the non-inductive charging process +! following Saunders and Peck (1998) +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! local variables +REAL, DIMENSION(KMICRO) :: ZRAR_CRIT ! critical rime accretion rate +REAL, DIMENSION(KMICRO) :: ZVGMEAN, & ! mean velocity of graupel + ZVSMEAN ! mean velocity of snow +! +! +!* 1. COMPUTE THE CRITICAL RIME ACCRETION RATE +! ---------------------------------------- +! +ZRAR_CRIT(:) = 0. +! +IF (CNI_CHARGING == 'SAP98') THEN +! + WHERE (ZZT(:) <= XTT .AND. ZZT(:) >= (XTT - 23.7)) ! Original from SAP98 + ZRAR_CRIT(:) = 1.0 + 7.93E-2 * (ZZT(:) - XTT) + & + 4.48E-2 * (ZZT(:) - XTT)**2 + & + 7.48E-3 * (ZZT(:) - XTT)**3 + & + 5.47E-4 * (ZZT(:) - XTT)**4 + & + 1.67E-5 * (ZZT(:) - XTT)**5 + & + 1.76E-7 * (ZZT(:) - XTT)**6 + END WHERE + ! + WHERE (ZZT(:) < (XTT - 23.7) .AND. ZZT(:) > (XTT - 40.)) ! Added by Mansell + ZRAR_CRIT(:) = 3.4 * (1.0 - (ABS(ZZT(:) - XTT + 23.7) / & ! et al. (2005) + (-23.7 + 40.))**3.) + END WHERE + ! + GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT +! +ELSE IF (CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN +! + WHERE (ZZT(:) > (XTT - 10.7)) + ZRAR_CRIT(:) = 0.66 + END WHERE + WHERE (ZZT(:) <= (XTT - 10.7) .AND. ZZT(:) >= (XTT - 23.7)) + ZRAR_CRIT(:) = -1.47 - 0.2 * (ZZT(:) - XTT) + END WHERE + WHERE (ZZT(:) < (XTT - 23.7) .AND. ZZT(:) > (XTT - 40.)) + ZRAR_CRIT(:) = 3.3 + END WHERE + ! + GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. & + ZEW(:) >= 0.01 .AND. ZEW(:) <= 10. +! +ELSE IF (CNI_CHARGING == 'TERAR') THEN +! + GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT +END IF +! +GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE +GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! +! +!* 2. INITIALIZATION FOR ICE CRYSTAL - GRAUPEL COLLISIONS +! --------------------------------------------------- +! +ZDQ_IG(:) = 0. +! +! positive case is the default value +ZSAUNIM_IG(:) = XIMP +ZSAUNIN_IG(:) = XINP +! +! Compute the Rime Accretion Rate +ZRAR(:) = 0. +ZVGMEAN(:) = 0. +WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.) + ZVGMEAN(:) = XVGCOEF * ZRHOCOR(:) * ZLBDAG(:)**(-ZDG) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ZVGMEAN(:) * 1.E3 +END WHERE +! +IF (CNI_CHARGING == 'TERAR') THEN + GELEC(:,2) = GELEC(:,2) .AND. ZRAR(:) > 0.01 .AND. ZRAR(:) <= 80. +ELSE + GELEC(:,2) = GELEC(:,2) .AND. ZRAR(:) > 0.1 +END IF +GELEC(:,4) = GELEC(:,2) +! +IF (COUNT(GELEC(:,4)) .GT. 0) THEN +! compute the coefficients for I-G collisions + IF (CNI_CHARGING == 'SAP98') THEN + CALL ELEC_INI_NI_SAP98 (KMICRO, GELEC(:,4), ZRAR, ZRAR_CRIT, ZDQ_IG) + ! + ELSE IF (CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN + ZRAR(:) = ZRAR(:) / 3 + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZRAR, ZZT, XSAUNDER, ZDQ_IG) + ! + ELSE IF (CNI_CHARGING == 'TERAR') THEN + ZRAR(:) = ZRAR(:) / 8. + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZRAR, ZZT, XTAKA_TM, ZDQ_IG) + ! + END IF + ! + WHERE (ZDQ_IG(:) < 0.) + ZSAUNIM_IG(:) = XIMN + ZSAUNIN_IG(:) = XINN + ENDWHERE +ENDIF +! +! +!* 3. INITIALIZATION FOR ICE CRYSTAL - SNOW COLLISIONS +! ------------------------------------------------ +! +ZDQ_IS(:) = 0. +! +! positive case is the default value +ZSAUNIM_IS(:) = XIMP +ZSAUNIN_IS(:) = XINP +! +! Compute the Rime Accretion Rate +ZRAR(:) = 0. +ZVSMEAN(:) = 0. +WHERE (ZLBDAS(:) > 0. .AND. ZRCT(:) > 0.) + ZVSMEAN(:) = XVSCOEF * ZRHOCOR(:) * ZLBDAS(:)**(-ZDS) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ZVSMEAN(:) * 1.E3 +END WHERE +! +IF (CNI_CHARGING == 'TERAR') THEN + GELEC(:,1) = GELEC(:,1) .AND. ZRAR(:) > 0.01 .AND. ZRAR(:) <= 80. +ELSE + GELEC(:,1) = GELEC(:,1) .AND. ZRAR(:) > 0.1 +END IF +GELEC(:,4) = GELEC(:,1) +! +IF (COUNT(GELEC(:,4)) .GT. 0) THEN +! compute the coefficients for I-S collisions + IF (CNI_CHARGING == 'SAP98') THEN + CALL ELEC_INI_NI_SAP98 (KMICRO, GELEC(:,4), ZRAR, ZRAR_CRIT, ZDQ_IS) + ! + ELSE IF (CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN + ZRAR(:) = ZRAR(:) / 3 + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZRAR, ZZT, XSAUNDER, ZDQ_IS) + ! + ELSE IF (CNI_CHARGING == 'TERAR') THEN + ZRAR(:) = ZRAR(:) / 8. + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZRAR, ZZT, XTAKA_TM, ZDQ_IS) + ! + END IF + ! + WHERE (ZDQ_IS(:) < 0.) + ZSAUNIM_IS(:) = XIMN + ZSAUNIN_IS(:) = XINN + ENDWHERE +ENDIF +! +! +!* 4. INITIALIZATION FOR GRAUPEL - SNOW COLLISIONS +! -------------------------------------------- +! +ZDQ_SG(:) = 0. +! +! positive case is the default value +ZSAUNSK_SG(:) = XSKP +ZSAUNSM_SG(:) = XSMP +ZSAUNSN_SG(:) = XSNP +! +! Compute the Rime Accretion Rate +ZRAR(:) = 0. +WHERE (ZVSMEAN(:) > 0. .AND. ZVGMEAN(:) > 0.) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ABS(ZVGMEAN(:) - ZVSMEAN(:)) * 1.E3 +END WHERE +! +IF (CNI_CHARGING == 'TERAR') THEN + GELEC(:,3) = GELEC(:,3) .AND. ZRAR(:) > 0.01 .AND. ZRAR(:) <= 80. +ELSE + GELEC(:,3) = GELEC(:,3) .AND. ZRAR(:) > 0.1 +END IF +GELEC(:,4) = GELEC(:,3) +! +IF( COUNT(GELEC(:,4)) .GT. 0) THEN +! compute the coefficients for S-G collisions + IF (CNI_CHARGING == 'SAP98') THEN + CALL ELEC_INI_NI_SAP98 (KMICRO, GELEC(:,4), ZRAR, ZRAR_CRIT, ZDQ_SG) + ! + ELSE IF (CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN + ZRAR(:) = ZRAR(:) / 3 + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZRAR, ZZT, XSAUNDER, ZDQ_SG) + ! + ELSE IF (CNI_CHARGING == 'TERAR') THEN + ZRAR(:) = ZRAR(:) / 8. + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZRAR, ZZT, XTAKA_TM, ZDQ_SG) + ! + END IF + ! + WHERE (ZDQ_SG(:) < 0.) + ZSAUNSK_SG(:) = XSKN + ZSAUNSM_SG(:) = XSMN + ZSAUNSN_SG(:) = XSNN + ENDWHERE +ENDIF +! +END SUBROUTINE ELEC_INIT_NOIND_RAR +! +!------------------------------------------------------------------ +! +! ################################## + SUBROUTINE ELEC_INIT_NOIND_TAKAH() +! ################################## +! +! Purpose : initialization for the non-inductive charging process +! following Takahashi (1978) +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. COMPUTE f(T, LWC) +! ----------------- +! +ZDQ(:) = 0. +! +ZEW(:) = ZRCT(:) * ZRHODREF(:) * 1.E3 ! (g m^-3) +! +GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. & + ZEW(:) >= 0.01 .AND. ZEW(:) <= 10. +GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE +GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +GELEC(:,4) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3) +! +IF (COUNT(GELEC(:,4)) > 0) THEN + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZEW, ZZT, XMANSELL, ZDQ) +ENDIF +! +END SUBROUTINE ELEC_INIT_NOIND_TAKAH +! +!------------------------------------------------------------------ +! +! ################################## + SUBROUTINE ELEC_INIT_NOIND_TEEWC() +! ################################## +! +! +! Purpose : initialization for the non-inductive charging process +! following Tsenova and Mitzeva (2009) +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. PARAMETERS FOR POSITIVE NI CHARGING +! ----------------------------------- +! +GELEC(:,:) = .FALSE. +ZDQ(:) = 0. +! +! positive case is the default value +ZFQIAGGS(:) = XFQIAGGSP_TAK +ZFQIDRYGBS(:) = XFQIDRYGBSP_TAK +ZLBQSDRYGB1S(:) = XLBQSDRYGB1SP +ZLBQSDRYGB2S(:) = XLBQSDRYGB2SP +ZLBQSDRYGB3S(:) = XLBQSDRYGB3SP +ZSAUNIM(:) = XIMP !3.76 +ZSAUNIN(:) = XINP !2.5 +ZSAUNSK(:) = XSKP_TAK !6.5 +ZSAUNSM(:) = XSMP !0.44 +ZSAUNSN(:) = XSNP !2.5 +! +! +!* 2. PARAMETERS FOR NEGATIVE NI CHARGING +! ----------------------------------- +! +! Compute the effective water content +ZEW(:) = 0. +! +WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.) + ZEW(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * 1.E3 +END WHERE +! +GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT .AND. & + ZEW(:) >= 0.01 .AND. ZEW(:) <= 10. +GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE +GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! +GELEC(:,4) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3) +! +IF (COUNT(GELEC(:,4)) > 0) THEN + CALL INTERP_DQ_TABLE (KMICRO, NIND_TEMP, NIND_LWC, GELEC(:,4), & + ZEW, ZZT, XTAKA_TM, ZDQ) +! + WHERE (ZDQ(:) < 0.) + ZFQIAGGS(:) = XFQIAGGSN_TAK + ZFQIDRYGBS(:) = XFQIDRYGBSN_TAK + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SN + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SN + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SN + ZSAUNIM(:) = XIMN !2.54 + ZSAUNIN(:) = XINN !2.8 + ZSAUNSK(:) = XSKN_TAK !2.0 + ZSAUNSM(:) = XSMN !0.5 + ZSAUNSN(:) = XSNN !2.8 + ENDWHERE +ENDIF +! +END SUBROUTINE ELEC_INIT_NOIND_TEEWC +! +!------------------------------------------------------------------ +! +! ################################################################# + SUBROUTINE ELEC_INI_NI_SAP98(KMICRO, OMASK, PRAR, PRAR_CRIT, PDQ) +! ################################################################# +! +! +! Purpose : compute dQ(RAR,T) in the parameterization of Saunders and Peck (1998) +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KMICRO +LOGICAL, DIMENSION(KMICRO), INTENT(IN) :: OMASK +REAL, DIMENSION(KMICRO), INTENT(IN) :: PRAR ! Rime accretion rate +REAL, DIMENSION(KMICRO), INTENT(IN) :: PRAR_CRIT ! Critical rime accretion rate +REAL, DIMENSION(KMICRO), INTENT(INOUT) :: PDQ ! interpolated dQ +! +! +!* 1. COMPUTE dQ(RAR, T) +! ------------------ +! +PDQ(:) = 0. +! +! positive region : Mansell et al., 2005 +WHERE (OMASK(:) .AND. PRAR(:) > PRAR_CRIT(:)) + PDQ(:) = MAX(0., 6.74 * (PRAR(:) - PRAR_CRIT(:)) * 1.E-15) +ENDWHERE +! +! negative region : Mansell et al. 2005 +WHERE (OMASK(:) .AND. PRAR(:) < PRAR_CRIT(:)) + PDQ(:) = MIN(0., 3.9 * (PRAR_CRIT(:) - 0.1) * & + (4.0 * ((PRAR(:) - (PRAR_CRIT(:) + 0.1) / 2.) / & + (PRAR_CRIT(:) - 0.1))**2 - 1.) * 1.E-15) +ENDWHERE +! +END SUBROUTINE ELEC_INI_NI_SAP98 +! +!------------------------------------------------------------------ +! +! ################################################################# + SUBROUTINE INTERP_DQ_TABLE (KMICRO, KIND_TEMP, KIND_LWC, OMASK, & + PLIQ, PTEMP, PTABLE, PDQ) +! ################################################################# +! +! +! Purpose : interpolate dQ from a lookup table at each gridpoint +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KMICRO +INTEGER, INTENT(IN) :: KIND_TEMP, KIND_LWC +LOGICAL, DIMENSION(KMICRO), INTENT(IN) :: OMASK +REAL, DIMENSION(KMICRO), INTENT(IN) :: PLIQ ! effective water content or rime accretion rate +REAL, DIMENSION(KMICRO), INTENT(IN) :: PTEMP ! temperature +REAL, DIMENSION(KIND_LWC+1,KIND_TEMP+1), INTENT(IN) :: PTABLE ! lookup table +REAL, DIMENSION(KMICRO), INTENT(INOUT) :: PDQ ! interpolated dQ +! +! declaration of local variables +INTEGER :: IGAUX +REAL, DIMENSION(:), ALLOCATABLE :: ZDQ_INTERP +REAL, DIMENSION(:), ALLOCATABLE :: ZVECT1, ZVECT2 +INTEGER, DIMENSION(:), ALLOCATABLE :: IVECT1, IVECT2 +! +! +!* 1. FIND THE INDEXES FOR RAR/EW AND T +! --------------------------------- +! +PDQ(:) = 0. +! +IGAUX = 0 +DO II = 1, KMICRO + IF (OMASK(II)) THEN + IGAUX = IGAUX + 1 + I1(IGAUX) = II + END IF +END DO +! +IF (IGAUX > 0) THEN + ALLOCATE(ZDQ_INTERP(IGAUX)) + ALLOCATE(ZVECT1(IGAUX)) + ALLOCATE(ZVECT2(IGAUX)) + ALLOCATE(IVECT1(IGAUX)) + ALLOCATE(IVECT2(IGAUX)) + ZDQ_INTERP(:) = 0. + IVECT1(:) = 0 + IVECT2(:) = 0 +! + DO II = 1, IGAUX + ZVECT1(II) = PTEMP(I1(II)) + ZVECT2(II) = PLIQ(I1(II)) + ZDQ_INTERP(II) = PDQ(I1(II)) + END DO +! +! Temperature index (0C --> -40C) + ZVECT1(1:IGAUX) = MAX( 1.00001, MIN( REAL(KIND_TEMP)-0.00001, & + (ZVECT1(1:IGAUX) - XTT - 1.)/(-1.) ) ) + IVECT1(1:IGAUX) = INT( ZVECT1(1:IGAUX) ) + ZVECT1(1:IGAUX) = ZVECT1(1:IGAUX) - REAL(IVECT1(1:IGAUX)) +! +! LWC index (0.01 g.m^-3 --> 10 g.m^-3) + WHERE (ZVECT2(:) >= 0.01 .AND. ZVECT2(:) < 0.1) + ZVECT2(:) = MAX( 1.00001, MIN( REAL(10)-0.00001, & + ZVECT2(:) * 100. )) + IVECT2(:) = INT(ZVECT2(:)) + ZVECT2(:) = ZVECT2(:) - REAL(IVECT2(:)) + ENDWHERE +! + WHERE (ZVECT2(:) >= 0.1 .AND. ZVECT2(:) < 1. .AND. IVECT2(:) == 0) + ZVECT2(:) = MAX( 10.00001, MIN( REAL(19)-0.00001, & + ZVECT2(:) * 10. + 9. ) ) + IVECT2(:) = INT(ZVECT2(:)) + ZVECT2(:) = ZVECT2(:) - REAL(IVECT2(:)) + ENDWHERE +! + WHERE ((ZVECT2(:) >= 1.) .AND. ZVECT2(:) <= 10.) + ZVECT2(:) = MAX( 19.00001, MIN( REAL(KIND_LWC)-0.00001, & + ZVECT2(:) + 18. ) ) + IVECT2(:) = INT(ZVECT2(:)) + ZVECT2(:) = ZVECT2(:) - REAL(IVECT2(:)) + ENDWHERE +! +! +!* 2. INTERPOLATE dQ(RAR or EW,T) +! --------------------------- +! + ZDQ_INTERP(:) = BI_LIN_INTP_V( PTABLE, IVECT2, IVECT1, ZVECT2, ZVECT1, & + IGAUX ) +! + DO II = 1, IGAUX + PDQ(I1(II)) = ZDQ_INTERP(II) + END DO +END IF +! +DEALLOCATE(ZDQ_INTERP) +DEALLOCATE(ZVECT1) +DEALLOCATE(ZVECT2) +DEALLOCATE(IVECT1) +DEALLOCATE(IVECT2) +! +END SUBROUTINE INTERP_DQ_TABLE +! +!------------------------------------------------------------------ +! +! ######################### + SUBROUTINE ELEC_IAGGS_B() +! ######################### +! +! +! Purpose : compute charge separation process during the collision +! between ice and snow +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. COMPUTE THE COLLISION EFFICIENCY +! -------------------------------- +! +ZQCOLIS(:) = ZCOLIS * EXP(ZCOLEXIS * (ZZT(:) - XTT)) +! +ZWQ_NI(:) = 0. +ZLIMIT(:) = 0. +! +!* 2. COMPUTE THE RATE OF SEPARATED CHARGE +! ------------------------------------ +! +!* 2.1 Charging process following Helsdon and Farley (1987) +! +IF (CNI_CHARGING == 'HELFA') THEN + ! + WHERE (ZCIT(:) > 0.0 .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5)) + ZWQ_NI(:) = XFQIAGGSBH * ZRIAGGS(:) * ZCIT(:) / ZRIT(:) + ZWQ_NI(:) = ZWQ_NI(:) * (1. - ZQCOLIS(:)) / ZQCOLIS(:) +! +! Temperature dependance of the charge transferred + ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XQTC) / ABS(ZZT(:) - XQTC) + ZWQ_NI(:) = ZWQ_NI(:) / ZRHODREF(:) + END WHERE +! +ELSE +! +! +!* 2.2 Charging process following Gardiner et al. (1985) +! + IF (CNI_CHARGING == 'GARDI') THEN + WHERE (GELEC(:,1) .AND. ZDELTALWC(:) > 0.) + ZWQ_NI(:) = XFQIAGGSBG * (1 - ZQCOLIS(:)) * & + ZRHODREF(:)**(-4. * ZCEXVT + 4. / ZBI) * & + ZCIT(:)**(1 - 4. / ZBI) * & + ZDELTALWC(:) * ZFT(:) * & + ZCST(:) * ZLBDAS(:)**(-2. - 4. * ZDS) * & + (ZAI * MOMG(ZALPHAI, ZNUI, ZBI) / & + ZRIT(:))**(-4 / ZBI) + ENDWHERE + END IF +! +! +!* 2.3 Charging process based on EW: SAUN1/SAUN2, TEEWC +!* following Saunders et al. (1991), Takahashi via Tsenova and Mitzeva (2009) +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TEEWC') THEN + WHERE (GELEC(:,1) .AND. ZDQ(:) /= 0.) + ZWQ_NI(:) = XFQIAGGSBS * (1 - ZQCOLIS(:)) * & + ZRHOCOR(:)**(1 + ZSAUNIN(:)) * & + ZFQIAGGS(:) * ZDQ(:) * & + ZCIT(:)**(1 - ZSAUNIM(:) / ZBI) * & + ZCST(:) * ZLBDAS(:)**(-2.- ZDS * (1. + ZSAUNIN(:))) * & + (ZRHODREF(:) * ZRIT(:) / XAIGAMMABI)**(ZSAUNIM(:) / ZBI) + ENDWHERE + END IF +! +! +!* 2.4 Charging process based on RAR (=EW*V): SAP98, BSMP1/BSMP2, TERAR +!* following Saunders and Peck (1998) or Brooks et al., 1997 (with/out anomalies) +!* or Takahashi via Tsenova and Mitzeva (2011) +! + IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'BSMP1' .OR. & + CNI_CHARGING == 'BSMP2' .OR. CNI_CHARGING == 'TERAR') THEN + IF (CNI_CHARGING /= 'TERAR') THEN + ZFQIAGGS(:) = XFQIAGGSP + WHERE (ZDQ_IS(:) < 0.) + ZFQIAGGS(:) = XFQIAGGSN + ENDWHERE + ELSE + ZFQIAGGS(:) = XFQIAGGSP_TAK + WHERE (ZDQ_IS(:) < 0.) + ZFQIAGGS(:) = XFQIAGGSN_TAK + ENDWHERE + ENDIF +! + WHERE (GELEC(:,1) .AND. ZDQ_IS(:) /= 0.) + ZWQ_NI(:) = XFQIAGGSBS * (1 - ZQCOLIS(:)) * & + ZRHOCOR(:)**(1 + ZSAUNIN_IS(:)) * & + ZFQIAGGS(:) * ZDQ_IS(:) * & + ZCIT(:)**(1 - ZSAUNIM_IS(:) / ZBI) * & + ZCST(:) * ZLBDAS(:)**(-2.- ZDS * (1. + ZSAUNIN_IS(:))) * & + (ZRHODREF(:) * ZRIT(:) / XAIGAMMABI)**(ZSAUNIM_IS(:) / ZBI) + ENDWHERE + END IF +! +! +!* 2.5 Charging process following Takahashi (1978) +! + IF (CNI_CHARGING == 'TAKAH') THEN + WHERE (GELEC(:,1) .AND. ZDQ(:) /= 0.) + ZWQ_NI(:) = XFQIAGGSBT1 * (1.0 - ZQCOLIS(:)) * ZRHOCOR(:) * & + ZCIT(:) * ZCST(:) * ZDQ(:) * & + MIN( XFQIAGGSBT2 / (ZLBDAS(:)**(2. + ZDS)) , & + XFQIAGGSBT3 * ZRHOCOR(:) * ZRHODREF(:)**(2./ZBI) * & + ZRIT(:)**(2. / ZBI) / & + (ZCIT(:)**(2. / ZBI) * ZLBDAS(:)**(2. + 2. * ZDS))) + ENDWHERE + END IF +! +! +!* 3. LIMITATION OF THE SEPARATED CHARGE +! ---------------------------------- +! +! Dq is limited to XLIM_NI_IS + WHERE (ZWQ_NI(:) .NE. 0.) + ZLIMIT(:) = XLIM_NI_IS * ZRIAGGS(:) * ZCIT(:) * & + (1 - ZQCOLIS(:)) / (ZRIT(:) * ZQCOLIS(:)) + ZWQ_NI(:) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ_NI(:) ) ), ZWQ_NI(:) ) + ZWQ_NI(:) = ZWQ_NI(:) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! +END IF +! +ZQSS(:) = ZQSS(:) + ZWQ_NI(:) +ZQIS(:) = ZQIS(:) - ZWQ_NI(:) +! +END SUBROUTINE ELEC_IAGGS_B +! +!------------------------------------------------------------------ +! +! ######################### + SUBROUTINE ELEC_IDRYG_B() +! ######################### +! +! +! Purpose : compute charge separation process during the dry collision +! between ice and graupeln +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. COMPUTE THE COLLISION EFFICIENCY +! -------------------------------- +! +ZQCOLIG(:) = ZCOLIG * EXP(ZCOLEXIG * (ZZT(:) - XTT)) +! +ZWQ_NI(:) = 0. +ZLIMIT(:) = 0. +! +!* 2. COMPUTE THE RATE OF SEPARATED CHARGE +! ------------------------------------ +! +!* 2.1 Charging process following Helsdon and Farley (1987) +! +IF (CNI_CHARGING == 'HELFA') THEN + ! + WHERE (ZRIT(:) > XRTMIN_ELEC(4) .AND. ZCIT(:) > 0. .AND. & + ZRGT(:) > XRTMIN_ELEC(6)) + ZWQ_NI(:) = XHIDRYG * ZRIDRYG(:) * ZCIT(:) / ZRIT(:) + ZWQ_NI(:) = ZWQ_NI(:) * (1. - ZQCOLIG(:)) / ZQCOLIG(:) ! QIDRYG_boun +! +! Temperature dependance of the charge transfered + ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XQTC) / ABS(ZZT(:) - XQTC) + ZWQ_NI(:) = ZWQ_NI(:) / ZRHODREF(:) + END WHERE +! +ELSE +! +! +!* 2.2 Charging process following Gardiner et al. (1985) +! + IF (CNI_CHARGING == 'GARDI') THEN + WHERE (GELEC(:,2) .AND. ZDELTALWC(:) > 0.) + ZWQ_NI(:) = XFQIDRYGBG * XLBQIDRYGBG * (1 - ZQCOLIG) * & + ZRHODREF(:)**(-4. * ZCEXVT + 4. / ZBI) * & + ZCIT(:)**(1 - 4. / ZBI) * & + ZDELTALWC(:) * ZFT(:) * & + ZCGT(:) * ZLBDAG(:)**(-2. - 4. * ZDG) * & + (ZAI * MOMG(ZALPHAI, ZNUI, ZBI) / & + ZRIT(:))**(-4 / ZBI) + ENDWHERE + END IF +! +! +!* 2.3 Charging process based on EW: SAUN1/SAUN2, TEEWC following +!* Saunders et al. (1991), Takahashi via Tsenova and Mitzeva(2009) +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TEEWC') THEN + WHERE (GELEC(:,2) .AND. ZDQ(:) /= 0.) + ZWQ_NI(:) = XFQIDRYGBS * (1. - ZQCOLIG(:)) * & + ZRHOCOR(:)**(1. + ZSAUNIN(:)) * & + ZFQIDRYGBS(:) * ZDQ(:) * & + ZCIT(:)**(1. - ZSAUNIM(:) / ZBI) * & + ZCGT(:) * ZLBDAG(:)**(-2. - ZDG * (1. + ZSAUNIN(:))) * & + (ZRHODREF(:) * ZRIT(:) / XAIGAMMABI)**(ZSAUNIM(:) / ZBI) + ENDWHERE + END IF +! +! +!* 2.4 Charging process based on RAR (=EW*V): SAP98, BSMP1/BSMP2, TERAR +!* following Saunders and Peck (1998) or Brooks et al., 1997 (with/out anomalies) +!* or Takahashi via Tsenova and Mitzeva (2011) +! + IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'BSMP1' .OR. & + CNI_CHARGING == 'BSMP2' .OR. CNI_CHARGING == 'TERAR') THEN + IF (CNI_CHARGING /= 'TERAR') THEN + ZFQIDRYGBS(:) = XFQIDRYGBSP + WHERE (ZDQ_IG(:) < 0.) + ZFQIDRYGBS(:) = XFQIDRYGBSN + ENDWHERE + ELSE + ZFQIDRYGBS(:) = XFQIDRYGBSP_TAK + WHERE (ZDQ_IG(:) <0.) + ZFQIDRYGBS(:) = XFQIDRYGBSN_TAK + ENDWHERE + END IF +! + WHERE (GELEC(:,2) .AND. ZDQ_IG(:) /= 0.) + ZWQ_NI(:) = XFQIDRYGBS * (1. - ZQCOLIG(:)) * & + ZRHOCOR(:)**(1 + ZSAUNIN_IG(:)) * & + ZFQIDRYGBS(:) * ZDQ_IG(:) * & + ZCIT(:)**(1 - ZSAUNIM_IG(:) / ZBI) * & + ZCGT(:) * ZLBDAG(:)**(-2. - ZDG * (1. + ZSAUNIN_IG(:))) * & + (ZRHODREF(:) * ZRIT(:) / XAIGAMMABI)**(ZSAUNIM_IG(:) / ZBI) + ENDWHERE + END IF +! +! +!* 2.5 Charging process following Takahashi (1978) +! + IF (CNI_CHARGING == 'TAKAH') THEN + WHERE (GELEC(:,2) .AND. ZDQ(:) /= 0.) + ZWQ_NI(:) = XFQIDRYGBT1 * (1. - ZQCOLIG(:)) * ZRHOCOR(:) * & + ZCIT(:) * ZCGT(:) * ZDQ(:) * & + MIN( XFQIDRYGBT2 / (ZLBDAG(:)**(2. + ZDG)), & + XFQIDRYGBT3 * ZRHOCOR(:) * ZRHODREF(:)**(2./ZBI) * & + ZRIT(:)**(2. / ZBI) / (ZCIT(:)**(2. / ZBI) * & + ZLBDAG(:)**(2. + 2. * ZDG)) ) + ENDWHERE + END IF +! +! +!* 3. LIMITATION OF THE SEPARATED CHARGE +! ---------------------------------- +! +! Dq is limited to XLIM_NI_IG + WHERE (ZWQ_NI(:) .NE. 0. .AND. ZRIT(:) > 0.) + ZLIMIT(:) = XLIM_NI_IG * ZRIDRYG(:) * ZCIT(:) * (1 - ZQCOLIG(:)) / & + (ZRIT(:) * ZQCOLIG(:)) + ZWQ_NI(:) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ_NI(:) ) ), ZWQ_NI(:) ) + ZWQ_NI(:) = ZWQ_NI(:) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! +END IF +! +WHERE (ZRIDRYG(:) > 0.) + ZQGS(:) = ZQGS(:) + ZWQ_NI(:) + ZQIS(:) = ZQIS(:) - ZWQ_NI(:) +END WHERE +! +END SUBROUTINE ELEC_IDRYG_B +! +!------------------------------------------------------------------ +! +! ######################### + SUBROUTINE ELEC_SDRYG_B() +! ######################### +! +! +! Purpose : compute the charge separation during the dry collision +! between snow and graupel +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. COMPUTE THE COLLECTION EFFICIENCY +! --------------------------------- +! +ZQCOLSG(:) = ZCOLSG * EXP (ZCOLEXSG * (ZZT(:) - XTT)) +! +ZWQ_NI(:) = 0. +ZLIMIT(:) = 0. +! +!* 2. COMPUTE THE RATE OF SEPARATED CHARGE +! ------------------------------------ +! +!* 2.1 Charge separation following Helsdon and Farley (1987) +! +IF (CNI_CHARGING == 'HELFA') THEN +! + WHERE (ZRGT(:) > XRTMIN_ELEC(6) .AND. ZLBDAG(:) > 0. .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZLBDAS(:) > 0.) + ZWQ_NI(:) = ZWQ5(:,5) * XFQSDRYGBH * ZRHODREF(:)**(-ZCEXVT) * & + (1. - ZQCOLSG(:)) * & + ZCST(:) * ZCGT(:) * & + (XLBQSDRYGB4H * ZLBDAS(:)**(-2.) + & + XLBQSDRYGB5H * ZLBDAS(:)**(-1.) * ZLBDAG(:)**(-1.) + & + XLBQSDRYGB6H * ZLBDAG(:)**(-2.)) +! +! Temperature dependance of the charge transfered + ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XQTC) / ABS(ZZT(:) - XQTC) + ZWQ_NI(:) = ZWQ_NI(:) / ZRHODREF(:) + ENDWHERE +! +ELSE +! +! +!* 2.2 Charge separation following Gardiner et al. (1985) +! + IF (CNI_CHARGING == 'GARDI') THEN + WHERE (GELEC(:,3) .AND. ZDELTALWC(:) > 0.) + ZWQ_NI(:) = XFQSDRYGBG * (1. - ZQCOLSG(:)) * & + ZRHODREF(:)**(-4. * ZCEXVT) * & + ZFT(:) * ZDELTALWC(:) * & + ZCST(:) * ZCGT(:) * & + (XLBQSDRYGB4G * ZLBDAS(:)**(-4.) * ZLBDAG(:)**(-2.) + & + XLBQSDRYGB5G * ZLBDAS(:)**(-5.) * ZLBDAG(:)**(-1.) + & + XLBQSDRYGB6G * ZLBDAS(:)**(-6.)) * & + ZWQ5(:,5) + ENDWHERE + END IF +! +! +!* 2.3 Charging process based on EW: SAUN1/SAUN2, TEEWC following +!* Saunders et al. (1991), Takahashi via Tsenova and Mitzeva(2009) +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TEEWC') THEN + WHERE (GELEC(:,3) .AND. ZDQ(:) /= 0.) +! ZWQ_NI(:) = ZWQ5(:,6) If graupel gains positive charge ZDQ(:) > 0. +! ZWQ_NI(:) = ZWQ5(:,7) If graupel gains negative charge ZDQ(:) < 0. + ZWQ_NI(:) = ZWQ5(:,6) * (0.5 + SIGN(0.5,ZDQ(:))) + & + ZWQ5(:,7) * (0.5 - SIGN(0.5,ZDQ(:))) +! + ZWQ_NI(:) = ZWQ_NI(:) * XFQSDRYGBS * (1. - ZQCOLSG(:)) * & + ZRHOCOR(:)**(1. + ZSAUNSN(:)) * ZSAUNSK(:) * ZDQ(:) * & + ZCST(:) * ZCGT(:) * & + ( ZLBQSDRYGB1S(:) / (ZLBDAS(:)**ZSAUNSM(:) * ZLBDAG(:)**2) + & + ZLBQSDRYGB2S(:) / (ZLBDAS(:)**( 1.+ZSAUNSM(:)) * ZLBDAG(:)) + & + ZLBQSDRYGB3S(:) / ZLBDAS(:)**(2.+ZSAUNSM(:)) ) + ENDWHERE + END IF +! +! +!* 2.4 Charging process based on RAR (=EW*V): SAP98, BSMP1/BSMP2, TERAR +!* following Saunders and Peck (1998) or Brooks et al., 1997 (with/out anomalies) +!* or Takahashi via Tsenova and Mitzeva (2011) +! + IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'BSMP1' .OR. & + CNI_CHARGING == 'BSMP2' .OR. CNI_CHARGING == 'TERAR') THEN + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SP + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SP + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SP + WHERE (ZDQ_SG(:) < 0.) + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SN + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SN + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SN + ENDWHERE +! + WHERE (GELEC(:,3) .AND. ZDQ_SG(:) /= 0.) + ZWQ_NI(:) = ZWQ5(:,6) * (0.5+SIGN(0.5,ZDQ_SG(:))) + & + ZWQ5(:,7) * (0.5-SIGN(0.5,ZDQ_SG(:))) +! + ZWQ_NI(:) = ZWQ_NI(:) * XFQSDRYGBS * (1. - ZQCOLSG(:)) * & + ZRHOCOR(:)**(1. + ZSAUNSN_SG(:)) * ZSAUNSK_SG(:) * ZDQ_SG(:) * & + ZCST(:) * ZCGT(:) * & + (ZLBQSDRYGB1S(:) / (ZLBDAS(:)**ZSAUNSM_SG(:) * ZLBDAG(:)**2) + & + ZLBQSDRYGB2S(:) / (ZLBDAS(:)**(1.+ZSAUNSM_SG(:)) * ZLBDAG(:)) + & + ZLBQSDRYGB3S(:) / ZLBDAS(:)**(2.+ZSAUNSM_SG(:)) ) + ENDWHERE + END IF +! +! +!* 2.5 Charging process following Takahashi (1978) +! + IF (CNI_CHARGING == 'TAKAH') THEN + WHERE (GELEC(:,3) .AND. ZDQ(:) /= 0.) + ZWQ_NI(:) = XFQSDRYGBT1 * (1. - ZQCOLSG(:)) * ZRHOCOR(:) * & + ZCGT(:) * ZCST(:) * ZDQ(:) * & + MIN(10. * ( & + ABS(XFQSDRYGBT2 / (ZLBDAG(:)**ZDG * ZLBDAS(:)**2.) - & + XFQSDRYGBT3 / (ZLBDAS(:)**(2. + ZDS))) + & + ABS(XFQSDRYGBT4 / (ZLBDAG(:)**(2. + ZDG)) - & + XFQSDRYGBT5 / (ZLBDAS(:)**ZDS * ZLBDAG(:)**2.)) + & + ABS(XFQSDRYGBT6 / (ZLBDAG(:)**(1. + ZDG) * ZLBDAS(:)) - & + XFQSDRYGBT7 / (ZLBDAS(:)**(1. + ZDS) * ZLBDAG(:)))), & + XFQSDRYGBT8 * ZRHOCOR(:) * ZWQ5(:,5) * & + (XFQSDRYGBT9 / (ZLBDAS(:)**2. * ZLBDAG(:)**2.) + & + XFQSDRYGBT10 / (ZLBDAS(:)**4.) + & + XFQSDRYGBT11 / (ZLBDAS(:)**3. * ZLBDAG(:)))) + ENDWHERE + END IF +! +! +!* 3. LIMITATION OF THE SEPARATED CHARGE +! ---------------------------------- +! +! Dq is limited to XLIM_NI_SG + WHERE (ZWQ_NI(:) .NE. 0.) + ZLIMIT(:) = XLIM_NI_SG * ZWQ5(:,4) * XAUX_LIM * & + ZRHOCOR(:) * (1. - ZQCOLSG(:)) * & + ZCST(:) * ZCGT(:) * & + ( XAUX_LIM1 / ZLBDAS(:)**2 + & + XAUX_LIM2 /(ZLBDAS(:) * ZLBDAG(:)) + & + XAUX_LIM3 / ZLBDAG(:)**2 ) +! + ZWQ_NI(:) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ_NI(:) ) ), ZWQ_NI(:) ) + ZWQ_NI(:) = ZWQ_NI(:) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! +END IF +! +WHERE (ZRSDRYG(:) > 0.) + ZQGS(:) = ZQGS(:) + ZWQ_NI(:) + ZQSS(:) = ZQSS(:) - ZWQ_NI(:) +END WHERE +! +END SUBROUTINE ELEC_SDRYG_B +! +!------------------------------------------------------------------ +! +! ######################################################################### + SUBROUTINE COMPUTE_CHARGE_TRANSFER (PR_RATE, PRXT, PQXT, PTSTEP, & + PRX_THRESH, PQX_THRESH, PCOEF_RQ_X, & + PQ_RATE, PQXS, PQYS ) +! ######################################################################### +! +! Purpose : compute the charge transfer rate in proportion of the mass transfer rate +! x --> y +! q_rate_xy = r_rate_xy * coef_rq_x * qx_t / rx_t +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declaration of dummy arguments +! +REAL, INTENT(IN), DIMENSION(:) :: PR_RATE ! Mass exchange rate from x to y +REAL, INTENT(IN), DIMENSION(:) :: PRXT ! Mixing ratio of x at t +REAL, INTENT(IN), DIMENSION(:) :: PQXT ! Electric charge of x at t +REAL, INTENT(IN) :: PRX_THRESH ! Threshold on mixing ratio +REAL, INTENT(IN) :: PQX_THRESH ! Threshold on electric charge +REAL, INTENT(IN) :: PCOEF_RQ_X ! Coefficient for charge exchange +REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, INTENT(INOUT), DIMENSION(:) :: PQ_RATE ! Charge exchange rate from x to y +REAL, INTENT(INOUT), DIMENSION(:) :: PQXS ! Electric charge of x - source term +REAL, INTENT(INOUT), DIMENSION(:) :: PQYS ! Electric charge of y - source term +! +! +!* 0.2 Declaration of local variables +! +! +PQ_RATE(:) = 0. +! +WHERE (PR_RATE(:) > 0. .AND. & + PRXT(:) > PRX_THRESH .AND. ABS(PQXT(:)) > PQX_THRESH) +! Compute the charge exchanged during the mass tranfer from species x to y + PQ_RATE(:) = PCOEF_RQ_X * PR_RATE(:) * PQXT(:) / PRXT(:) +! Limit the charge exchanged to the charge available on x at t + PQ_RATE(:) = SIGN( MIN( ABS(PQXT(:)/PTSTEP),ABS(PQ_RATE(:)) ), PQXT(:)/PTSTEP ) + ! +! Update the source terms of x and y + PQXS(:) = PQXS(:) - PQ_RATE(:) + PQYS(:) = PQYS(:) + PQ_RATE(:) +END WHERE +! +END SUBROUTINE COMPUTE_CHARGE_TRANSFER +! +!------------------------------------------------------------------ +! +! ########################################################### + FUNCTION BI_LIN_INTP_V(ZT, KI, KJ, PDX, PDY, KN) RESULT(PY) +! ########################################################### +! +! Purpose : +! +! | | +! ZT(KI(1),KJ(2))-|-------------------|-ZT(KI(2),KJ(2)) +! | | +! | | +! x2-|-------|y(x1,x2) | +! | | | +! PDY| | | +! | | | +! | | | +!ZT( KI(1),KJ(1))-|-------------------|-ZT(KI(2),KJ(1)) +! | PDX |x1 | +! | | +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declaration of dummy arguments +! +INTEGER, INTENT(IN) :: KN ! Size of the result vector +INTEGER, INTENT(IN), DIMENSION(KN) :: KI ! Tabulated coordinate +INTEGER, INTENT(IN), DIMENSION(KN) :: KJ ! Tabulated coordinate +REAL, INTENT(IN), DIMENSION(:,:) :: ZT ! Tabulated data +REAL, INTENT(IN), DIMENSION(KN) :: PDX, PDY ! +! +REAL, DIMENSION(KN) :: PY ! Interpolated value +! +!* 0.2 Declaration of local variables +! +INTEGER :: JJ ! Loop index +! +! +!* 1. INTERPOLATION +! ------------- +! +DO JJ = 1, KN + PY(JJ) = (1.0 - PDX(JJ)) * (1.0 - PDY(JJ)) * ZT(KI(JJ), KJ(JJ)) + & + PDX(JJ) * (1.0 - PDY(JJ)) * ZT(KI(JJ)+1,KJ(JJ)) + & + PDX(JJ) * PDY(JJ) * ZT(KI(JJ)+1,KJ(JJ)+1) + & + (1.0 - PDX(JJ)) * PDY(JJ) * ZT(KI(JJ) ,KJ(JJ)+1) +ENDDO +! +END FUNCTION BI_LIN_INTP_V +! +!------------------------------------------------------------------ +! +END SUBROUTINE ELEC_TENDENCIES diff --git a/src/MNH/endstep.f90 b/src/MNH/endstep.f90 index 97734d72bd8ecad1aa8e4163c203fbfe7ab5fe57..cbb2080b592fcb7ad1f1492a165fd2df660e53f5 100644 --- a/src/MNH/endstep.f90 +++ b/src/MNH/endstep.f90 @@ -193,6 +193,7 @@ END MODULE MODI_ENDSTEP !! 02/2019 (S. Bielli) Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets ! P. Wautelet 02/2022: add sea salt +! C. Barthe 03/2023: add correction for electric charges !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -217,7 +218,8 @@ USE MODD_NSV, ONLY: XSVMIN, NSV_CHEMBEG, NSV_CHEMEND, & NSV_AERBEG, NSV_AEREND,& NSV_DSTBEG, NSV_DSTEND,& NSV_SLTBEG, NSV_SLTEND,& - NSV_SNWBEG, NSV_SNWEND + NSV_SNWBEG, NSV_SNWEND,& + NSV_ELECBEG, NSV_ELECEND USE MODD_PARAM_C2R2, ONLY: LACTIT USE MODD_PARAM_LIMA, ONLY: LACTIT_LIMA=>LACTIT @@ -470,6 +472,18 @@ END IF ! !------------------------------------------------------------------------------ ! +!* 6b. ELECTRIC CHARGES ONLY EXIST WHERE HYDROMETEORS ARE PRESENT +! +IF (SIZE(PRT,4) > 1 .AND. NSV_ELECEND > NSV_ELECBEG) THEN + DO JSV = 2, KRR + WHERE (PRT(:,:,:,JSV) == 0.) + PSVT(:,:,:,NSV_ELECBEG+JSV-1) = 0. + END WHERE + END DO +END IF +! +!------------------------------------------------------------------------------ +! !* 7. MINIMUM VALUE FOR CHEMISTRY ! IF ((SIZE(PLBXSVM,4) > NSV_CHEMEND-1).AND.(SIZE(PLBXSVM,1) /= 0)) THEN diff --git a/src/MNH/flash_geom_elec.f90 b/src/MNH/flash_geom_elec.f90 index e6eea2d03c113ae02451da51869d6ce8c6da983f..8c2c0a149c8e15eb83a19bc064a36a57c27c9a20 100644 --- a/src/MNH/flash_geom_elec.f90 +++ b/src/MNH/flash_geom_elec.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-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. @@ -8,24 +8,25 @@ ! ############################# ! INTERFACE - SUBROUTINE FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, PTSTEP, OEXIT, & + SUBROUTINE FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & PRHODJ, PRHODREF, PRT, PCIT, PRSVS, PRS, PTHT, PPABST, & - PEFIELDU, PEFIELDV, PEFIELDW, PZZ, PSVS_LINOX, & + PEFIELDU, PEFIELDV, PEFIELDW, PZZ, & TPFILE_FGEOM_DIAG, TPFILE_FGEOM_COORD, TPFILE_LMA, & - PTOWN, PSEA ) + PTOWN, PSEA, PSVS_LNOX, PCCS, PCRS, PCSS, PCGS, PCHS ) ! USE MODD_IO, ONLY: TFILEDATA ! INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter INTEGER, INTENT(IN) :: KMI ! current model index INTEGER, INTENT(IN) :: KRR ! number of moist variables +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization REAL, INTENT(IN) :: PTSTEP ! Double time step except for ! cold start LOGICAL, INTENT(IN) :: OEXIT ! switch for the end of the temporal loop REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice n.c. at t REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar variables source term REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDU ! x-component of the electric field REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDV ! y-component of the electric field @@ -34,12 +35,18 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variables vol. sourc REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSVS_LINOX ! NOx source term TYPE(TFILEDATA), INTENT(IN) :: TPFILE_FGEOM_DIAG TYPE(TFILEDATA), INTENT(IN) :: TPFILE_FGEOM_COORD TYPE(TFILEDATA), INTENT(IN) :: TPFILE_LMA -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PSVS_LNOX ! NOx source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCCS ! Nc source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCRS ! Nr source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCSS ! Ns source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCGS ! Ng source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCHS ! Nh source term ! END SUBROUTINE FLASH_GEOM_ELEC_n END INTERFACE @@ -47,11 +54,11 @@ END MODULE MODI_FLASH_GEOM_ELEC_n ! ! ! ###################################################################################### - SUBROUTINE FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, PTSTEP, OEXIT, & + SUBROUTINE FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & PRHODJ, PRHODREF, PRT, PCIT, PRSVS, PRS, PTHT, PPABST, & - PEFIELDU, PEFIELDV, PEFIELDW, PZZ, PSVS_LINOX, & + PEFIELDU, PEFIELDV, PEFIELDW, PZZ, & TPFILE_FGEOM_DIAG, TPFILE_FGEOM_COORD, TPFILE_LMA, & - PTOWN, PSEA ) + PTOWN, PSEA, PSVS_LNOX, PCCS, PCRS, PCSS, PCGS, PCHS ) ! ###################################################################################### ! !!**** * - @@ -102,6 +109,8 @@ END MODULE MODI_FLASH_GEOM_ELEC_n ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) ! P. Wautelet 31/08/2022: remove ZXMASS and ZYMASS (use XXHATM and XYHATM instead) +! C. Barthe 07/09/2022: enable using CELLS with LIMA +! C. Barthe 11/09/2023: enable using CELLS with LIMA2 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -125,11 +134,15 @@ USE MODD_IO, ONLY: TFILEDATA USE MODD_LMA_SIMULATOR USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZZ ! in linox_production USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND, NSV_ELEC -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -use MODD_PRECISION, only: MNHINT_MPI, MNHLOG_MPI, MNHREAL_MPI -USE MODD_RAIN_ICE_DESCR_n, ONLY: XLBR, XLBEXR, XLBS, XLBEXS, & - XLBG, XLBEXG, XLBH, XLBEXH, & - XRTMIN +USE MODD_PARAM_LIMA, ONLY: XRTMIN_L=>XRTMIN +USE MODD_PARAM_LIMA_COLD, ONLY: XLBS_L=>XLBS, XLBEXS_L=>XLBEXS +USE MODD_PARAM_LIMA_MIXED, ONLY: XLBG_L=>XLBG, XLBEXG_L=>XLBEXG, XLBH_L=>XLBH, XLBEXH_L=>XLBEXH +USE MODD_PARAM_LIMA_WARM, ONLY: XLBC, XLBEXC, XLBR_L=>XLBR, XLBEXR_L=>XLBEXR +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +use MODD_PRECISION, ONLY: MNHINT_MPI, MNHLOG_MPI, MNHREAL_MPI +USE MODD_RAIN_ICE_DESCR_n, ONLY: XLBR_I=>XLBR, XLBEXR_I=>XLBEXR, XLBS_I=>XLBS, XLBEXS_I=>XLBEXS, & + XLBG_I=>XLBG, XLBEXG_I=>XLBEXG, XLBH_I=>XLBH, XLBEXH_I=>XLBEXH, & + XRTMIN_I=>XRTMIN USE MODD_SUB_ELEC_n USE MODD_TIME_n USE MODD_VAR_ll, ONLY: NPROC,NMNH_COMM_WORLD @@ -142,6 +155,7 @@ USE MODE_MPPDB USE MODE_PACK_PGI #endif ! +USE MODI_COMPUTE_LAMBDA_3D USE MODI_ION_ATTACH_ELEC USE MODI_SHUMAN USE MODI_TO_ELEC_FIELD_n @@ -154,13 +168,14 @@ IMPLICIT NONE INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter INTEGER, INTENT(IN) :: KMI ! current model index INTEGER, INTENT(IN) :: KRR ! number of moist variables +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization REAL, INTENT(IN) :: PTSTEP ! Double time step except for ! cold start LOGICAL, INTENT(IN) :: OEXIT ! switch for the end of the temporal loop REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice n.c. at t REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar variables source term REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDU ! x-component of the electric field REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEFIELDV ! y-component of the electric field @@ -169,12 +184,18 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variables vol. sourc REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSVS_LINOX ! NOx source term TYPE(TFILEDATA), INTENT(IN) :: TPFILE_FGEOM_DIAG TYPE(TFILEDATA), INTENT(IN) :: TPFILE_FGEOM_COORD TYPE(TFILEDATA), INTENT(IN) :: TPFILE_LMA -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PSVS_LNOX ! NOx source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCCS ! Nc source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCRS ! Nr source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCSS ! Ns source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCGS ! Ng source term +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCHS ! Nh source term ! ! ! 0.2 Declaration of local variables @@ -276,7 +297,9 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIGMA ! efficient cross section of hyd REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZDQDT ! charge to neutralize at each pt (C/kg) REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZFLASH ! = 1 if the flash leader reaches this pt ! = 2 if the flash branch is concerned +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAC ! Lambda for cloud droplets REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAR ! Lambda for rain +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAI ! Lambda for ice crystals REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAS ! Lambda for snow REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAG ! Lambda for graupel REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAH ! Lambda for hail @@ -324,6 +347,13 @@ REAL,DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: ZCELL_NEW INTEGER :: ILJ INTEGER :: NIMAX_ll, NJMAX_ll,IIU_ll,IJU_ll ! dimensions of global domain ! +! variables used to select between common parameters between ICEx and LIMA +REAL :: ZLBR, ZLBEXR, ZLBS, ZLBEXS, & + ZLBG, ZLBEXG, ZLBH, ZLBEXH +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN +INTEGER :: IMOMC, IMOMR, IMOMI, IMOMS, IMOMG, IMOMH ! nb of moments for hydrometeors +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCCT, ZCRT, ZCIT, ZCST, ZCGT, ZCHT ! Nb conc. at t +! !------------------------------------------------------------------------------- ! !* 1. INITIALIZATION @@ -391,7 +421,6 @@ ALLOCATE (ZCLOUD(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) ALLOCATE (GPOSS(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) ALLOCATE (ZEMODULE(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) ALLOCATE (ZCELL(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NMAX_CELL)) - ! ZQMT(:,:,:,:) = 0. ZQMTOT(:,:,:) = 0. @@ -401,6 +430,30 @@ GPOSS(IIB:IIE,IJB:IJE,IKB:IKE) = .TRUE. ZEMODULE(:,:,:) = 0. ZCELL(:,:,:,:) = 0. ! +! select parameters between ICEx and LIMA +ALLOCATE(ZRTMIN(KRR)) +IF (HCLOUD(1:3) == 'ICE') THEN + ZRTMIN(1:KRR) = XRTMIN_I(1:KRR) + ZLBR = XLBR_I + ZLBEXR = XLBEXR_I + ZLBS = XLBS_I + ZLBEXS = XLBEXS_I + ZLBG = XLBG_I + ZLBEXG = XLBEXG_I + ZLBH = XLBH_I + ZLBEXH = XLBEXH_I +ELSE IF (HCLOUD == 'LIMA') THEN + ZRTMIN(1:KRR) = XRTMIN_L(1:KRR) + ZLBR = XLBR_L + ZLBEXR = XLBEXR_L + ZLBS = XLBS_L + ZLBEXS = XLBEXS_L + ZLBG = XLBG_L + ZLBEXG = XLBEXG_L + ZLBH = XLBH_L + ZLBEXH = XLBEXH_L +END IF +! ! !* 1.3 point discharge (Corona) ! @@ -432,6 +485,36 @@ ZCLOUDLIM = 1.E-5 ZSIGMIN = 1.E-12 ! ! +!* 1.6 moments of the microphysics scheme +! +IMOMI = 2 +IF (HCLOUD(1:3) == 'ICE') THEN + IMOMC = 1 + IMOMR = 1 + IMOMS = 1 + IMOMG = 1 + IF (KRR == 7) IMOMH = 1 +ELSE IF (HCLOUD == 'LIMA') THEN + IMOMC = 2 + IMOMR = 2 + IF (PRESENT(PCSS)) THEN + IMOMS = 2 + ELSE + IMOMS = 1 + END IF + IF (PRESENT(PCGS)) THEN + IMOMG = 2 + ELSE + IMOMG = 1 + END IF + IF (PRESENT(PCHS)) THEN + IMOMH = 2 + ELSE + IMOMH = 1 + END IF +END IF +! +! !------------------------------------------------------------------------------- ! !* 2. FIND AND COUNT THE ELECTRIFIED CELLS @@ -627,7 +710,9 @@ IF (INB_CELL .GE. 1) THEN ALLOCATE (INBSEG_LEADER(INB_CELL)) ALLOCATE (ZDQDT(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)+1)) ALLOCATE (ZSIGMA(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)-1)) + ALLOCATE (ZLBDAC(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) ALLOCATE (ZLBDAR(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) + ALLOCATE (ZLBDAI(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) ALLOCATE (ZLBDAS(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) ALLOCATE (ZLBDAG(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) IF (KRR == 7) ALLOCATE (ZLBDAH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) @@ -642,7 +727,9 @@ IF (INB_CELL .GE. 1) THEN ZCOORD_SEG(:,:) = 0. ZDQDT(:,:,:,:) = 0. ZSIGMA(:,:,:,:) = 0. + ZLBDAC(:,:,:) = 0. ZLBDAR(:,:,:) = 0. + ZLBDAI(:,:,:) = 0. ZLBDAS(:,:,:) = 0. ZLBDAG(:,:,:) = 0. ZSIGLOB(:,:,:) = 0. @@ -663,74 +750,128 @@ IF (INB_CELL .GE. 1) THEN ! !* 3. COMPUTE THE EFFICIENT CROSS SECTIONS OF HYDROMETEORS ! ---------------------------------------------------- +! + ALLOCATE(ZCCT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3))) + ALLOCATE(ZCRT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3))) + ALLOCATE(ZCIT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3))) + ALLOCATE(ZCST(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3))) + ALLOCATE(ZCGT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3))) + ALLOCATE(ZCHT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3))) ! !* 3.1 for cloud droplets ! - WHERE (PRT(:,:,:,2) > ZCLOUDLIM) - ZSIGMA(:,:,:,1) = XFQLIGHTC * PRHODREF(:,:,:) * PRT(:,:,:,2) - ENDWHERE + IF (HCLOUD == 'LIMA') THEN + ZCCT(:,:,:) = PCCS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + CALL COMPUTE_LAMBDA_3D(2, IMOMC, PRHODREF, ZRTMIN(2), PRT(:,:,:,2), ZCCT, ZLBDAC) + WHERE (PRT(:,:,:,2) > ZCLOUDLIM .AND. ZCCT(:,:,:) > 0. .AND. & + ZLBDAC(:,:,:) > 0.) + ZSIGMA(:,:,:,1) = XFQLIGHTC * ZLBDAC(:,:,:)**(-2.) * ZCCT(:,:,:) + END WHERE + ELSE IF (HCLOUD(1:3) == 'ICE') THEN + WHERE (PRT(:,:,:,2) > ZCLOUDLIM) + ZSIGMA(:,:,:,1) = XFQLIGHTC * PRHODREF(:,:,:) * PRT(:,:,:,2) + END WHERE + END IF ! ! !* 3.2 for raindrops ! - WHERE (PRT(:,:,:,3) > 0.0) - ZLBDAR(:,:,:) = XLBR * (PRHODREF(:,:,:) * & - MAX(PRT(:,:,:,3),XRTMIN(3)))**XLBEXR - END WHERE -! - WHERE (PRT(:,:,:,3) > ZCLOUDLIM .AND. ZLBDAR(:,:,:) < XLBDAR_MAXE .AND. & - ZLBDAR(:,:,:) > 0.) - ZSIGMA(:,:,:,2) = XFQLIGHTR * ZLBDAR(:,:,:)**XEXQLIGHTR - END WHERE + IF (HCLOUD == 'LIMA') THEN ! 2-moment: N is pronostic + ZCRT(:,:,:) = PCRS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + CALL COMPUTE_LAMBDA_3D(3, IMOMR, PRHODREF, ZRTMIN(3), PRT(:,:,:,3), ZCRT, ZLBDAR) + WHERE (PRT(:,:,:,3) > ZCLOUDLIM .AND. ZLBDAR(:,:,:) < XLBDAR_MAXE .AND. & + ZLBDAR(:,:,:) > 0.) + ZSIGMA(:,:,:,2) = XFQLIGHTR * ZLBDAR(:,:,:)**XEXQLIGHTR * ZCRT(:,:,:) + END WHERE + ELSE IF (HCLOUD(1:3) == 'ICE') THEN ! 1-moment: N=C*lambda^x + CALL COMPUTE_LAMBDA_3D(3, IMOMR, PRHODREF, ZRTMIN(3), PRT(:,:,:,3), ZCRT, ZLBDAR) + ! + WHERE (PRT(:,:,:,3) > ZCLOUDLIM .AND. ZLBDAR(:,:,:) < XLBDAR_MAXE .AND. & + ZLBDAR(:,:,:) > 0.) + ZSIGMA(:,:,:,2) = XFQLIGHTR * ZLBDAR(:,:,:)**XEXQLIGHTR + END WHERE + END IF ! ! !* 3.3 for ice crystals ! - WHERE (PRT(:,:,:,4) > ZCLOUDLIM .AND. PCIT(:,:,:) > 1.E4) - ZSIGMA(:,:,:,3) = XFQLIGHTI * PCIT(:,:,:)**(1.-XEXQLIGHTI) * & + IF (HCLOUD == 'LIMA') THEN + ! with LIMA, pcit is pcis + ZCIT(:,:,:) = PCIT(:,:,:) * PTSTEP / PRHODJ(:,:,:) + ELSE IF (HCLOUD(1:3) == 'ICE') THEN + ! with ICEx, pcit is really pcit + ZCIT(:,:,:) = PCIT(:,:,:) + END IF + CALL COMPUTE_LAMBDA_3D(4, IMOMI, PRHODREF, ZRTMIN(4), PRT(:,:,:,4), ZCIT, ZLBDAI) + WHERE (PRT(:,:,:,4) > ZCLOUDLIM .AND. ZCIT(:,:,:) > 1.E4) + ZSIGMA(:,:,:,3) = XFQLIGHTI * ZCIT(:,:,:)**(1.-XEXQLIGHTI) * & ((PRHODREF(:,:,:) * PRT(:,:,:,4))**XEXQLIGHTI) ENDWHERE ! ! !* 3.4 for snow ! - WHERE (PRT(:,:,:,5) > 0.0) - ZLBDAS(:,:,:) = MIN(XLBDAS_MAXE, & - XLBS * (PRHODREF(:,:,:) * & - MAX(PRT(:,:,:,5),XRTMIN(5)))**XLBEXS) - END WHERE -! - WHERE (PRT(:,:,:,5) > ZCLOUDLIM .AND. ZLBDAS(:,:,:) < XLBDAS_MAXE .AND. & - ZLBDAS(:,:,:) > 0.) - ZSIGMA(:,:,:,4) = XFQLIGHTS * ZLBDAS(:,:,:)**XEXQLIGHTS - ENDWHERE + IF (IMOMS == 2) THEN + ZCST(:,:,:) = PCSS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + CALL COMPUTE_LAMBDA_3D(5, IMOMS, PRHODREF, ZRTMIN(5), PRT(:,:,:,5), ZCST, ZLBDAS) + WHERE (PRT(:,:,:,5) > ZCLOUDLIM .AND. ZLBDAS(:,:,:) < XLBDAS_MAXE .AND. & + ZLBDAS(:,:,:) > 0.) + ZSIGMA(:,:,:,4) = XFQLIGHTS * ZLBDAS(:,:,:)**XEXQLIGHTS * ZCST(:,:,:) + END WHERE + ELSE IF (IMOMS == 1) THEN + CALL COMPUTE_LAMBDA_3D(5, IMOMS, PRHODREF, ZRTMIN(5), PRT(:,:,:,5), ZCST, ZLBDAS) + WHERE (PRT(:,:,:,5) > ZCLOUDLIM .AND. ZLBDAS(:,:,:) < XLBDAS_MAXE .AND. & + ZLBDAS(:,:,:) > 0.) + ZSIGMA(:,:,:,4) = XFQLIGHTS * ZLBDAS(:,:,:)**XEXQLIGHTS + END WHERE + END IF ! ! !* 3.5 for graupel ! - WHERE (PRT(:,:,:,6) > 0.0) - ZLBDAG(:,:,:) = XLBG * (PRHODREF(:,:,:) * MAX(PRT(:,:,:,6),XRTMIN(6)))**XLBEXG - END WHERE -! - WHERE (PRT(:,:,:,6) > ZCLOUDLIM .AND. ZLBDAG(:,:,:) < XLBDAG_MAXE .AND. & - ZLBDAG(:,:,:) > 0.) - ZSIGMA(:,:,:,5) = XFQLIGHTG * ZLBDAG(:,:,:)**XEXQLIGHTG - ENDWHERE + IF (IMOMG == 2) THEN + ZCGT(:,:,:) = PCGS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + CALL COMPUTE_LAMBDA_3D(6, IMOMG, PRHODREF, ZRTMIN(6), PRT(:,:,:,6), ZCGT, ZLBDAG) + WHERE (PRT(:,:,:,6) > ZCLOUDLIM .AND. ZLBDAG(:,:,:) < XLBDAG_MAXE .AND. & + ZLBDAG(:,:,:) > 0.) + ZSIGMA(:,:,:,5) = XFQLIGHTG * ZLBDAG(:,:,:)**XEXQLIGHTG * ZCGT(:,:,:) + END WHERE + ELSE IF (IMOMG == 1) THEN + CALL COMPUTE_LAMBDA_3D(6, IMOMG, PRHODREF, ZRTMIN(6), PRT(:,:,:,6), ZCGT, ZLBDAG) + ! + WHERE (PRT(:,:,:,6) > ZCLOUDLIM .AND. ZLBDAG(:,:,:) < XLBDAG_MAXE .AND. & + ZLBDAG(:,:,:) > 0.) + ZSIGMA(:,:,:,5) = XFQLIGHTG * ZLBDAG(:,:,:)**XEXQLIGHTG + END WHERE + END IF ! ! !* 3.6 for hail ! IF (KRR == 7) THEN - WHERE (PRT(:,:,:,7) > 0.0) - ZLBDAH(:,:,:) = XLBH * (PRHODREF(:,:,:) * & - MAX(PRT(:,:,:,7), XRTMIN(7)))**XLBEXH - END WHERE -! - WHERE (PRT(:,:,:,7) > ZCLOUDLIM .AND. ZLBDAH(:,:,:) < XLBDAH_MAXE .AND. & - ZLBDAH(:,:,:) > 0.) - ZSIGMA(:,:,:,6) = XFQLIGHTH * ZLBDAH(:,:,:)**XEXQLIGHTH - ENDWHERE + IF (IMOMH == 2) THEN + ZCHT(:,:,:) = PCHS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + CALL COMPUTE_LAMBDA_3D(7, IMOMH, PRHODREF, ZRTMIN(7), PRT(:,:,:,7), ZCHT, ZLBDAH) + WHERE (PRT(:,:,:,7) > ZCLOUDLIM .AND. ZLBDAH(:,:,:) < XLBDAH_MAXE .AND. & + ZLBDAH(:,:,:) > 0.) + ZSIGMA(:,:,:,6) = XFQLIGHTH * ZLBDAH(:,:,:)**XEXQLIGHTH * ZCHT(:,:,:) + END WHERE + ELSE IF (IMOMH == 1) THEN + CALL COMPUTE_LAMBDA_3D(7, IMOMH, PRHODREF, ZRTMIN(7), PRT(:,:,:,7), ZCHT, ZLBDAH) + ! + WHERE (PRT(:,:,:,7) > ZCLOUDLIM .AND. ZLBDAH(:,:,:) < XLBDAH_MAXE .AND. & + ZLBDAH(:,:,:) > 0.) + ZSIGMA(:,:,:,6) = XFQLIGHTH * ZLBDAH(:,:,:)**XEXQLIGHTH + END WHERE + END IF END IF +! + DEALLOCATE(ZCCT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZCST) + DEALLOCATE(ZCGT) + IF (ALLOCATED(ZCHT)) DEALLOCATE(ZCHT) ! ! !* 3.7 sum of the efficient cross sections @@ -1045,7 +1186,6 @@ ENDIF INB_NEUT = COUNT(ZSIGLOB(IIB:IIE,IJB:IJE,IKB:IKE) .GE. ZSIGMIN .AND. & ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) .NE. 0.) CALL SUM_ELEC_ll(INB_NEUT) - ! ! !* 9.3 ensure total charge conservation for IC @@ -1378,16 +1518,42 @@ ENDIF ! IF (INB_NEUT_OK .NE. 0) THEN - CALL MPPDB_CHECK3DM("flash:: PRSVS",PRECISION,& - PRSVS(:,:,:,1),PRSVS(:,:,:,2),PRSVS(:,:,:,3),PRSVS(:,:,:,4),& - PRSVS(:,:,:,5),PRSVS(:,:,:,6),PRSVS(:,:,:,7)) + CALL MPPDB_CHECK3DM("flash:: PRSVS",PRECISION,& + PRSVS(:,:,:,1),PRSVS(:,:,:,2),PRSVS(:,:,:,3),PRSVS(:,:,:,4),& + PRSVS(:,:,:,5),PRSVS(:,:,:,6),PRSVS(:,:,:,7)) PRSVS(:,:,:,1) = PRSVS(:,:,:,1) / XECHARGE PRSVS(:,:,:,NSV_ELEC) = - PRSVS(:,:,:,NSV_ELEC) / XECHARGE ! - CALL ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF, & - PRHODJ, PRSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & - PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA ) + IF (HCLOUD(1:3) == 'ICE') THEN + IF (PRESENT(PTOWN) .AND. PRESENT(PSEA)) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PRSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & + PEFIELDV, PEFIELDW, GATTACH, & + PTOWN=PTOWN, PSEA=PSEA ) + ELSE + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PRSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & + PEFIELDV, PEFIELDW, GATTACH ) + END IF + ELSE IF (HCLOUD == 'LIMA') THEN + IF (IMOMS == 1 .AND. IMOMG == 1) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PRSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & + PEFIELDV, PEFIELDW, GATTACH, & + PCCS=PCCS, PCRS=PCRS ) + ELSE IF (KRR == 6 .AND. IMOMS == 2 .AND. IMOMG == 2) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PRSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & + PEFIELDV, PEFIELDW, GATTACH, & + PCCS=PCCS, PCRS=PCRS, PCSS=PCSS, PCGS=PCGS ) + ELSE IF (KRR == 7 .AND. IMOMS == 2 .AND. IMOMG == 2 .AND. IMOMH == 2) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PRSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & + PEFIELDV, PEFIELDW, GATTACH, & + PCCS=PCCS, PCRS=PCRS, PCSS=PCSS, PCGS=PCGS, PCHS=PCHS ) + END IF + END IF ! PRSVS(:,:,:,1) = PRSVS(:,:,:,1) * XECHARGE PRSVS(:,:,:,NSV_ELEC) = - PRSVS(:,:,:,NSV_ELEC) * XECHARGE @@ -1467,8 +1633,8 @@ ENDIF XLNOX_ECLAIR = 0. IF (IFLASH_COUNT .NE. 0) THEN XLNOX_ECLAIR = SUM(ZLNOX(:,:,:)) - PSVS_LINOX(:,:,:) = PSVS_LINOX(:,:,:) + ZLNOX(:,:,:) * ZCOEF ! PRHODJ is - ! implicit + PSVS_LNOX(:,:,:) = PSVS_LNOX(:,:,:) + ZLNOX(:,:,:) * ZCOEF ! PRHODJ is + ! implicit END IF CALL SUM_ELEC_ll (XLNOX_ECLAIR) XLNOX_ECLAIR = XLNOX_ECLAIR / (XAVOGADRO * REAL(IFLASH_COUNT_GLOB)) @@ -1479,7 +1645,9 @@ ENDIF DEALLOCATE (ZNEUT_POS) DEALLOCATE (ZNEUT_NEG) DEALLOCATE (ZSIGMA) + DEALLOCATE (ZLBDAC) DEALLOCATE (ZLBDAR) + DEALLOCATE (ZLBDAI) DEALLOCATE (ZLBDAS) DEALLOCATE (ZLBDAG) IF (KRR == 7) DEALLOCATE (ZLBDAH) @@ -2164,7 +2332,6 @@ DO WHILE (IM .LE. IDELTA_IND .AND. ISTOP .NE. 1) IF (IMASKQ_DIST(JI,JJ,JK) .EQ. IM) THEN JIL = JIL + 1 I8VECT(JIL) = IJU_ll*IIU_ll*(JK-1) + IIU_ll*(JJ-1 +IYOR-1) + (JI +IXOR-1) - !print*,"IN => I8VECT(JIL )=",I8VECT(JIL),JI,JJ,JK,JIL END IF END DO END DO @@ -2196,7 +2363,6 @@ DO WHILE (IM .LE. IDELTA_IND .AND. ISTOP .NE. 1) JK = 1 + (I8VECT_LL(ICHOICE)-1) / ( IJU_ll*IIU_ll ) JJ = 1 + ( (I8VECT_LL(ICHOICE)-1) - IJU_ll*IIU_ll*(JK-1) ) / IIU_ll - IYOR +1 JI = 1 + MOD((I8VECT_LL(ICHOICE)-1) , int(IIU_ll,kind(I8VECT_LL(1)))) - IXOR +1 - !print*,"OUT => I8VECT_LL(ICHOICE)=",I8VECT_ll(ICHOICE),JI,JJ,JK,ICHOICE ZFLASH(JI,JJ,JK,IL) = 2. END IF I8VECT_LL(ICHOICE) = 0 diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index 6e8895afca14422904c7d7c6af66ad6a8063dd10..79608c1252a2f756f26d1d47f9309b1fcbbfe2cd 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -211,6 +211,7 @@ end subroutine Budget_preallocate ! R. Schoetter 12/2021 multi-level coupling between MesoNH and SURFEX ! C. Barthe 14/03/2022: budgets: add terms for CIBU and RDSF in LIMA ! M. Taufour 01/07/2022: budgets: add concentration for snow, graupel, hail +! C. Barthe 14/03/2023: budgets: add terms for electricity with LIMA !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1253,7 +1254,7 @@ if ( lbu_rth ) then tzsource%cmnhname = 'CORR' tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) tzsource%cmnhname = 'CEDS' @@ -1263,7 +1264,7 @@ if ( lbu_rth ) then tzsource%cmnhname = 'ADJU' tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) tzsource%cmnhname = 'DEPI' @@ -1280,8 +1281,8 @@ if ( lbu_rth ) then tzsource%cmnhname = 'NECON' tzsource%clongname = 'negativity correction induced by condensation' tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) !& +! .and. celec /= 'ELE3' !++cb-- 26/04/23 call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) @@ -1586,7 +1587,7 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then tzsource%cmnhname = 'ADJU' tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) tzsource%cmnhname = 'COND' @@ -1596,7 +1597,7 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then tzsource%cmnhname = 'CORR' tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) tzsource%cmnhname = 'DEPI' @@ -1613,8 +1614,8 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then tzsource%cmnhname = 'NECON' tzsource%clongname = 'negativity correction induced by condensation' tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) !& +! .and. celec /= 'ELE3' !++cb-- 26/04/23 call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) @@ -1741,7 +1742,7 @@ if ( tbudgets(NBUDGET_RC)%lenabled ) then tzsource%clongname = 'correction' ! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & ! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) tzsource%cmnhname = 'SEDI' @@ -1781,7 +1782,7 @@ if ( tbudgets(NBUDGET_RC)%lenabled ) then tzsource%cmnhname = 'ADJU' tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) tzsource%cmnhname = 'HON' @@ -1835,7 +1836,7 @@ if ( tbudgets(NBUDGET_RC)%lenabled ) then tzsource%cmnhname = 'CMEL' tzsource%clongname = 'collection by snow and conversion into rain with T>XTT on ice' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) tzsource%cmnhname = 'WETG' @@ -1891,8 +1892,8 @@ if ( tbudgets(NBUDGET_RC)%lenabled ) then tzsource%cmnhname = 'NECON' tzsource%clongname = 'negativity correction induced by condensation' tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) !& +! .and. celec /= 'ELE3' !++cb-- 26/04/23 call Budget_source_add( tbudgets(NBUDGET_RC), tzsource ) @@ -1994,7 +1995,7 @@ if ( tbudgets(NBUDGET_RR)%lenabled ) then tzsource%clongname = 'correction' ! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) & ! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) tzsource%cmnhname = 'SEDI' @@ -2053,7 +2054,7 @@ if ( tbudgets(NBUDGET_RR)%lenabled ) then tzsource%cmnhname = 'CMEL' tzsource%clongname = 'collection of droplets by snow and conversion into rain' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) tzsource%cmnhname = 'CFRZ' @@ -2120,8 +2121,8 @@ if ( tbudgets(NBUDGET_RR)%lenabled ) then tzsource%cmnhname = 'NECON' tzsource%clongname = 'negativity correction induced by condensation' tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) !& +! .and. celec /= 'ELE3' !++cb-- 26/04/23 call Budget_source_add( tbudgets(NBUDGET_RR), tzsource ) @@ -2236,12 +2237,12 @@ if ( tbudgets(NBUDGET_RI)%lenabled ) then tzsource%clongname = 'correction' ! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & ! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) tzsource%cmnhname = 'ADJU' tzsource%clongname = 'adjustment to saturation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) tzsource%cmnhname = 'SEDI' @@ -2379,7 +2380,7 @@ if ( tbudgets(NBUDGET_RI)%lenabled ) then tzsource%cmnhname = 'NECON' tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' + tzsource%lavailable = .true. !celec /= 'ELE3' !++cb-- 26/04/23 call Budget_source_add( tbudgets(NBUDGET_RI), tzsource ) @@ -2480,7 +2481,7 @@ if ( tbudgets(NBUDGET_RS)%lenabled ) then tzsource%clongname = 'correction' ! tzsource%lavailable = ( hcloud == 'LIMA' .and. lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) & ! .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' ) - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) tzsource%cmnhname = 'SEDI' @@ -2570,7 +2571,7 @@ if ( tbudgets(NBUDGET_RS)%lenabled ) then tzsource%cmnhname = 'NECON' tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' + tzsource%lavailable = .true. !celec /= 'ELE3' !++cb-- 26/04/23 call Budget_source_add( tbudgets(NBUDGET_RS), tzsource ) @@ -2669,7 +2670,7 @@ if ( tbudgets(NBUDGET_RG)%lenabled ) then tzsource%cmnhname = 'CORR' tzsource%clongname = 'correction' - tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec /= 'ELE3' call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) tzsource%cmnhname = 'SEDI' @@ -2778,8 +2779,8 @@ if ( tbudgets(NBUDGET_RG)%lenabled ) then tzsource%cmnhname = 'NECON' tzsource%clongname = 'negativity correction induced by condensation' tzsource%lavailable = ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' & - .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) & - .and. celec == 'NONE' + .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) !& +! .and. celec /= 'ELE3' !++cb-- 24/04/23 call Budget_source_add( tbudgets(NBUDGET_RG), tzsource ) @@ -2939,7 +2940,7 @@ if ( tbudgets(NBUDGET_RH)%lenabled ) then tzsource%cmnhname = 'NECON' tzsource%clongname = 'negativity correction induced by condensation' - tzsource%lavailable = celec == 'NONE' + tzsource%lavailable = .true. !celec == 'NONE' !++cb-- 26/04/23 call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) @@ -3761,14 +3762,29 @@ SV_BUDGETS: do jsv = 1, ksv else if ( jsv >= nsv_elecbeg .and. jsv <= nsv_elecend ) then SV_VAR ! Electricity case + tzsource%cmnhname = 'NETUR' + tzsource%clongname = 'negativity correction induced by turbulence' + tzsource%lavailable = hturb == 'TKEL' + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'NEADV' + tzsource%clongname = 'negativity correction induced by advection' + tzsource%lavailable = .true. + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'NEGA' tzsource%clongname = 'negativity correction' tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'NECON' + tzsource%clongname = 'negativity correction induced by condensation' + tzsource%lavailable = .true. + call Budget_source_add( tbudgets(ibudget), tzsource ) + SV_ELEC: select case( jsv - nsv_elecbeg + 1 ) case ( 1 ) SV_ELEC - ! volumetric charge of water vapor + ! positive ions tzsource%cmnhname = 'DRIFT' tzsource%clongname = 'ion drift motion' tzsource%lavailable = .true. @@ -3779,6 +3795,11 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'ADJU' + tzsource%clongname = 'adjustement to saturation' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'DEPS' tzsource%clongname = 'deposition on snow' tzsource%lavailable = .true. @@ -3796,7 +3817,12 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%cmnhname = 'DEPI' tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. (.not. lred .or. (lred .and. ladj_after)) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CEDS' + tzsource%clongname = 'adjustement to saturation' + tzsource%lavailable = hcloud == 'LIMA' call Budget_source_add( tbudgets(ibudget), tzsource ) tzsource%cmnhname = 'NEUT' @@ -3804,9 +3830,23 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'SUBI' + tzsource%clongname = 'sublimation of ice crystals' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CORR2' + tzsource%clongname = 'supplementary correction inside LIMA splitting' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) case ( 2 ) SV_ELEC ! volumetric charge of cloud droplets + tzsource%cmnhname = 'ADJU' + tzsource%clongname = 'adjustement to saturation' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'HON' tzsource%clongname = 'homogeneous nucleation' tzsource%lavailable = .true. @@ -3864,7 +3904,12 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%cmnhname = 'DEPI' tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. (.not. lred .or. (lred .and. ladj_after)) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CEDS' + tzsource%clongname = 'adjustement to saturation' + tzsource%lavailable = hcloud == 'LIMA' call Budget_source_add( tbudgets(ibudget), tzsource ) tzsource%cmnhname = 'NEUT' @@ -3872,6 +3917,20 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'R2C1' + tzsource%clongname = 'rain to cloud change after sedimentation' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CORR2' + tzsource%clongname = 'supplementary correction inside LIMA splitting' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CMEL' + tzsource%clongname = 'collection by snow and conversion into rain with T>XTT on ice' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred + call Budget_source_add( tbudgets(ibudget), tzsource ) case ( 3 ) SV_ELEC ! volumetric charge of rain drops @@ -3940,8 +3999,33 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'R2C1' + tzsource%clongname = 'rain to cloud change after sedimentation' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CORR2' + tzsource%clongname = 'supplementary correction inside LIMA splitting' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CMEL' + tzsource%clongname = 'collection by snow and conversion into rain with T>XTT on ice' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'RDSF' + tzsource%clongname = 'raindrop shattering by freezing' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. lrdsf + call Budget_source_add( tbudgets(ibudget), tzsource ) + case ( 4 ) SV_ELEC ! volumetric charge of ice crystals + tzsource%cmnhname = 'ADJU' + tzsource%clongname = 'adjustement to saturation' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'HON' tzsource%clongname = 'homogeneous nucleation' tzsource%lavailable = .true. @@ -3992,6 +4076,11 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'NIIG' + tzsource%clongname = 'non-inductive charge separation due to ice-graupel collisions' + tzsource%lavailable = .true. + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'SEDI' tzsource%clongname = 'sedimentation' tzsource%lavailable = .true. @@ -3999,7 +4088,12 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%cmnhname = 'DEPI' tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. (.not. lred .or. (lred .and. ladj_after)) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CEDS' + tzsource%clongname = 'adjustement to saturation' + tzsource%lavailable = hcloud == 'LIMA' call Budget_source_add( tbudgets(ibudget), tzsource ) tzsource%cmnhname = 'NEUT' @@ -4007,6 +4101,40 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'CNVI' + tzsource%clongname = 'conversion of snow to cloud ice' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'SUBI' + tzsource%clongname = 'sublimation of ice crystals' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'HMS' + tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'HMG' + tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CIBU' + tzsource%clongname = 'collisional ice breakup' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. lcibu + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'RDSF' + tzsource%clongname = 'raindrop shattering by freezing' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. lrdsf + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CORR2' + tzsource%clongname = 'supplementary correction inside LIMA splitting' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) case ( 5 ) SV_ELEC ! volumetric charge of snow @@ -4055,6 +4183,11 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'NISG' + tzsource%clongname = 'non-inductive charge separation due to snow-graupel collisions' + tzsource%lavailable = .true. + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'WETH' tzsource%clongname = 'wet growth of hail' tzsource%lavailable = hcloud == 'ICE4' @@ -4065,6 +4198,21 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'CNVI' + tzsource%clongname = 'conversion of snow to cloud ice' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'HMS' + tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CIBU' + tzsource%clongname = 'collisional ice breakup' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. lcibu + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'NEUT' tzsource%clongname = 'neutralization' tzsource%lavailable = .true. @@ -4118,6 +4266,16 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = linductive call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'NIIG' + tzsource%clongname = 'non-inductive charge separation due to ice-graupel collisions' + tzsource%lavailable = .true. + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'NISG' + tzsource%clongname = 'non-inductive charge separation due to snow-graupel collisions' + tzsource%lavailable = .true. + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'GMLT' tzsource%clongname = 'graupel melting' tzsource%lavailable = .true. @@ -4133,6 +4291,11 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'HMG' + tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'NEUT' tzsource%clongname = 'neutralization' tzsource%lavailable = .true. @@ -4140,7 +4303,8 @@ SV_BUDGETS: do jsv = 1, ksv case ( 7: ) SV_ELEC - if ( ( hcloud == 'ICE4' .and. ( jsv - nsv_elecbeg + 1 ) == 7 ) ) then + if ( ( ( hcloud == 'ICE4' .or. (hcloud == 'LIMA' .and. nmom_h.ge.1) ) .and. & + ( jsv - nsv_elecbeg + 1 ) == 7 ) ) then ! volumetric charge of hail tzsource%cmnhname = 'WETG' tzsource%clongname = 'wet growth of graupel' @@ -4167,8 +4331,10 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) - else if ( ( hcloud == 'ICE3' .and. ( jsv - nsv_elecbeg + 1 ) == 7 ) & - .or. ( hcloud == 'ICE4' .and. ( jsv - nsv_elecbeg + 1 ) == 8 ) ) then + else if ( ( ( hcloud == 'ICE3' .or. ( hcloud == 'LIMA' .and. nmom_h.eq.0 ) ) .and. & + ( jsv - nsv_elecbeg + 1 ) == 7 ) .or. & + ( ( hcloud == 'ICE4' .or. ( hcloud == 'LIMA' .and. nmom_h.ge.1 ) ) .and. & + ( jsv - nsv_elecbeg + 1 ) == 8 ) ) then ! Negative ions (NSV_ELECEND case) tzsource%cmnhname = 'DRIFT' tzsource%clongname = 'ion drift motion' @@ -4180,6 +4346,11 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'ADJU' + tzsource%clongname = 'adjustement to saturation' + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'DEPS' tzsource%clongname = 'deposition on snow' tzsource%lavailable = .true. @@ -4197,7 +4368,12 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%cmnhname = 'DEPI' tzsource%clongname = 'condensation/deposition on ice' - tzsource%lavailable = .true. + tzsource%lavailable = hcloud(1:3) == 'ICE' .and. (.not. lred .or. (lred .and. ladj_after)) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CEDS' + tzsource%clongname = 'adjustement to saturation' + tzsource%lavailable = hcloud == 'LIMA' call Budget_source_add( tbudgets(ibudget), tzsource ) tzsource%cmnhname = 'NEUT' @@ -4205,6 +4381,16 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = .true. call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'SUBI' + tzsource%clongname = 'sublimation of ice crystals' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CORR2' + tzsource%clongname = 'supplementary correction inside LIMA splitting' + tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit + call Budget_source_add( tbudgets(ibudget), tzsource ) + else call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'unknown electricity budget' ) end if diff --git a/src/MNH/ini_elecn.f90 b/src/MNH/ini_elecn.f90 index e00ea14d3a6f0eff266625c09fc945a1c7805d80..25a77068dee77613a87024b79cee6c2ee848cb91 100644 --- a/src/MNH/ini_elecn.f90 +++ b/src/MNH/ini_elecn.f90 @@ -74,40 +74,44 @@ END MODULE MODI_INI_ELEC_n !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +!! C. Barthe 04/02/22 Remove call to ini_rain_ice_elec +!! Initialization of cloud microphysics and cloud electricity +!! is now done separately +!! C. Barthe 07/07/23 New data structures for some variables !! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CLOUDPAR_n, ONLY : NSPLITR -USE MODD_CONF, ONLY : CEQNSYS,CCONF,CPROGRAM -USE MODD_CONF_n, ONLY : NRR +USE MODD_CLOUDPAR_n, ONLY: NSPLITR +USE MODD_CONF, ONLY: CEQNSYS, CCONF, CPROGRAM +USE MODD_CONF_n, ONLY: NRR USE MODD_CST -USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll +USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll USE MODD_DYN -USE MODD_DYN_n, ONLY : XRHOM, XTRIGSX, XTRIGSY, XAF, XCF, XBFY, XBFB, XDXHATM, & - XDYHATM, NIFAXX, NIFAXY, XBF_SXP2_YP1_Z +USE MODD_DYN_n, ONLY: XRHOM, XTRIGSX, XTRIGSY, XAF, XCF, XBFY, XBFB, XDXHATM, & + XDYHATM, NIFAXX, NIFAXY, XBF_SXP2_YP1_Z USE MODD_ELEC_DESCR +USE MODD_ELEC_PARAM USE MODD_ELEC_FLASH -USE MODD_ELEC_n, ONLY : XRHOM_E, XAF_E, XCF_E, XBFY_E, XBFB_E, XBF_SXP2_YP1_Z_E -USE MODD_GET_n, ONLY : CGETINPRC, CGETINPRR, CGETINPRS, CGETINPRG, CGETINPRH, & - CGETCLOUD, CGETSVT -USE MODD_GRID_n, ONLY : XMAP, XDXHAT, XDYHAT -USE MODD_IO, ONLY : TFILEDATA -USE MODD_LBC_n, ONLY : CLBCX, CLBCY -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAM_C2R2, ONLY : LDEPOC -USE MODD_PARAMETERS, ONLY : JPVEXT, JPHEXT -USE MODD_PARAM_ICE_n, ONLY : LDEPOSC -USE MODD_PRECIP_n, ONLY : XINPRR, XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, & - XINPRH, XACPRH, XINPRC, XACPRC, XINPRR3D, XEVAP3D,& - XINDEP,XACDEP +USE MODD_ELEC_n, ONLY: XRHOM_E, XAF_E, XCF_E, XBFY_E, XBFB_E, XBF_SXP2_YP1_Z_E +USE MODD_GET_n, ONLY: CGETSVT, CGETINPRC, CGETINPRR, CGETINPRS, CGETINPRG, CGETINPRH, & + CGETCLOUD +USE MODD_GRID_n, ONLY: XMAP, XDXHAT, XDYHAT +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LBC_n, ONLY: CLBCX, CLBCY +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_PARAMETERS, ONLY: JPVEXT, JPHEXT +USE MODD_PARAM_ICE_n,ONLY : LDEPOSC, LRED +USE MODD_PRECIP_n, ONLY : XINPRR, XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, & + XINPRH, XACPRH, XINPRC, XACPRC, XINPRR3D, XEVAP3D,& + XINDEP,XACDEP USE MODD_REF -USE MODD_REF_n, ONLY : XRHODJ, XTHVREF +USE MODD_REF_n, ONLY: XRHODJ, XTHVREF USE MODD_TIME ! -USE MODD_ARGSLIST_ll, ONLY : LIST_ll +USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODE_ll use mode_msg ! @@ -149,137 +153,121 @@ INTEGER :: JK ! Loop vertical index INTEGER :: IINFO_ll ! Return code of // routines INTEGER :: IINTVL ! Number of intervals to integrate the kernels REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter -! -REAL :: ZRHO00 ! Surface reference air density -REAL :: ZDZMIN +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZDZMIN REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDZ ! mesh size CHARACTER (LEN=3) :: YEQNSYS ! ! !------------------------------------------------------------------------------- ! -!* 0. PROLOGUE +!* 1. PROLOGUE ! -------- ! ILUOUT = TLUOUT%NLU ! CALL GET_DIM_EXT_ll('B',IIU,IJU) IKU = SIZE(PZZ,3) +IKB = 1 + JPVEXT +IKE = SIZE(PZZ,3) - JPVEXT ! -!------------------------------------------------------------------------------- -! -!* 1. ALLOCATE Module MODD_PRECIP_n -! ----------------------------- -! -IF (HCLOUD(1:3) == 'ICE') THEN - ALLOCATE( XINPRR(IIU,IJU) ) - ALLOCATE( XINPRR3D(IIU,IJU,IKU) ) - ALLOCATE( XEVAP3D(IIU,IJU,IKU) ) - ALLOCATE( XACPRR(IIU,IJU) ) - XINPRR(:,:) = 0.0 - XACPRR(:,:) = 0.0 - XINPRR3D(:,:,:) = 0.0 - XEVAP3D(:,:,:) = 0.0 - ALLOCATE( XINPRC(IIU,IJU) ) - ALLOCATE( XACPRC(IIU,IJU) ) - XINPRC(:,:) = 0.0 - XACPRC(:,:) = 0.0 - ALLOCATE( XINPRS(IIU,IJU) ) - ALLOCATE( XACPRS(IIU,IJU) ) - XINPRS(:,:) = 0.0 - XACPRS(:,:) = 0.0 - ALLOCATE( XINPRG(IIU,IJU) ) - ALLOCATE( XACPRG(IIU,IJU) ) - XINPRG(:,:) = 0.0 - XACPRG(:,:) = 0.0 -END IF -! -IF (HCLOUD == 'ICE4') THEN - ALLOCATE( XINPRH(IIU,IJU) ) - ALLOCATE( XACPRH(IIU,IJU) ) - XINPRH(:,:) = 0.0 - XACPRH(:,:) = 0.0 -ELSE - ALLOCATE( XINPRH(0,0) ) - ALLOCATE( XACPRH(0,0) ) -END IF -! -IF ( LDEPOSC) THEN - ALLOCATE(XINDEP(IIU,IJU)) - ALLOCATE(XACDEP(IIU,IJU)) - XINDEP(:,:)=0.0 - XACDEP(:,:)=0.0 -ELSE - ALLOCATE(XINDEP(0,0)) - ALLOCATE(XACDEP(0,0)) -END IF -! -IF(SIZE(XINPRR) == 0) RETURN -! +IF (.NOT.ASSOCIATED(XFCI)) CALL ELEC_PARAM_ASSOCIATE() +IF (.NOT.ASSOCIATED(XFC)) CALL ELEC_DESCR_ASSOCIATE() ! !------------------------------------------------------------------------------- +!++cb++ 26/04/2023 this part is needed to run the old version of the electrical scheme +! --> use of rain_ice_elec +! --> should be removed when the new scheme is fully validated +! +!* 2. INITIALIZE THE PARAMETERS FOR THE MICROPHYSICS AND THE ELECTRICITY +!* IN THE "OLD" ELECTRICAL SCHEME +! ------------------------------------------------------------------ +! +!* 2.1 Allocate module modd_precip_n +! +IF (HELEC == 'ELE3' .AND. (HCLOUD(1:3) == 'ICE' .AND. .NOT.(LRED))) THEN + ALLOCATE( XINPRR(IIU,IJU) ) ; XINPRR(:,:) = 0.0 + ALLOCATE( XINPRR3D(IIU,IJU,IKU) ) ; XACPRR(:,:) = 0.0 + ALLOCATE( XEVAP3D(IIU,IJU,IKU) ) ; XINPRR3D(:,:,:) = 0.0 + ALLOCATE( XACPRR(IIU,IJU) ) ; XEVAP3D(:,:,:) = 0.0 + ALLOCATE( XINPRC(IIU,IJU) ) ; XINPRC(:,:) = 0.0 + ALLOCATE( XACPRC(IIU,IJU) ) ; XACPRC(:,:) = 0.0 + ALLOCATE( XINPRS(IIU,IJU) ) ; XINPRS(:,:) = 0.0 + ALLOCATE( XACPRS(IIU,IJU) ) ; XACPRS(:,:) = 0.0 + ALLOCATE( XINPRG(IIU,IJU) ) ; XINPRG(:,:) = 0.0 + ALLOCATE( XACPRG(IIU,IJU) ) ; XACPRG(:,:) = 0.0 +! + IF (HCLOUD == 'ICE4') THEN + ALLOCATE( XINPRH(IIU,IJU) ) ; XINPRH(:,:) = 0.0 + ALLOCATE( XACPRH(IIU,IJU) ) ; XACPRH(:,:) = 0.0 + ELSE + ALLOCATE( XINPRH(0,0) ) + ALLOCATE( XACPRH(0,0) ) + END IF ! -!* 2. Initialize MODD_PRECIP_n variables -! ----------------------------------- + IF ( LDEPOSC) THEN + ALLOCATE(XINDEP(IIU,IJU)) ; XINDEP(:,:) = 0.0 + ALLOCATE(XACDEP(IIU,IJU)) ; XACDEP(:,:) = 0.0 + ELSE + ALLOCATE(XINDEP(0,0)) + ALLOCATE(XACDEP(0,0)) + END IF ! -CALL READ_PRECIP_FIELD (TPINIFILE, CPROGRAM, CCONF, & - CGETINPRC,CGETINPRR,CGETINPRS,CGETINPRG,CGETINPRH, & - XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D, & - XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, XINPRH, XACPRH) + IF(SIZE(XINPRR) == 0) RETURN ! +!* 2.2 Initialize modd_precip_n variables ! -!------------------------------------------------------------------------------- + CALL READ_PRECIP_FIELD (TPINIFILE, CPROGRAM, CCONF, & + CGETINPRC,CGETINPRR,CGETINPRS,CGETINPRG,CGETINPRH, & + XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D, & + XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, XINPRH, XACPRH) ! -!* 3. INITIALIZE THE PARAMETERS -!* FOR THE MICROPHYSICS AND THE ELECTRICITY -! ---------------------------------------- +!* 2.3 Initialize the parameters for the microphysics and the electrification ! -!* 3.1 Compute the minimun vertical mesh size +! Compute the minimun vertical mesh size + ALLOCATE( ZDZ(IIU,IJU,IKU) ) + ZDZ(:,:,:) = 0. ! -ALLOCATE( ZDZ(IIU,IJU,IKU) ) -ZDZ(:,:,:) = 0. + DO JK = IKB, IKE + ZDZ(:,:,JK) = PZZ(:,:,JK+1) - PZZ(:,:,JK) + END DO + ZDZMIN = MIN_ll (ZDZ,IINFO_ll,1,1,IKB,NIMAX_ll+2*JPHEXT,NJMAX_ll+2*JPHEXT,IKE ) ! -IKB = 1 + JPVEXT -IKE = SIZE(PZZ,3) - JPVEXT + DEALLOCATE(ZDZ) ! -DO JK = IKB, IKE - ZDZ(:,:,JK) = PZZ(:,:,JK+1) - PZZ(:,:,JK) -END DO -ZDZMIN = MIN_ll (ZDZ,IINFO_ll,1,1,IKB,NIMAX_ll+2*JPHEXT,NJMAX_ll+2*JPHEXT,IKE ) +! initialize the parameters for the mixed-phase microphysics and the electrification + CALL INI_RAIN_ICE_ELEC (KLUOUT, PTSTEP, ZDZMIN, NSPLITR, HCLOUD, & + IINTVL, ZFDINFTY) +END IF ! -DEALLOCATE(ZDZ) +!--cb-- +!------------------------------------------------------------------------------- ! +!* 2. INITIALIZE THE PARAMETERS FOR THE ELECTRICITY +! --------------------------------------------- ! IF (HELEC(1:3) == 'ELE') THEN ! -! -!* 3.2 initialize the parameters for the mixed-phase microphysics -!* and the electrification -! - CALL INI_RAIN_ICE_ELEC (KLUOUT, PTSTEP, ZDZMIN, NSPLITR, HCLOUD, & - IINTVL, ZFDINFTY) -! -! -!* 3.3 initialize the electrical parameters +!* 2.1 Initialize the electrical parameters for cloud electrification ! ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) ! - CALL INI_PARAM_ELEC (TPINIFILE, CGETSVT, ZRHO00, NRR, IINTVL, & - ZFDINFTY, IIU, IJU, IKU) + CALL INI_PARAM_ELEC (TPINIFILE, CGETSVT, HCLOUD, HELEC, & + ZRHO00, NRR, IIU, IJU, IKU) ! ! -!* 3.4 initialize the parameters for the electric field +!* 2.2 Initialize the parameters for the electric field ! IF (LINDUCTIVE .OR. ((.NOT. LOCG) .AND. LELEC_FIELD)) THEN CALL INI_FIELD_ELEC (PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ) END IF ! ! -!* 3.5 initialize the parameters for the lightning flashes +!* 2.3 Initialize the parameters for the lightning flashes ! IF (.NOT. LOCG) THEN IF (LFLASH_GEOM) THEN - CALL INI_FLASH_GEOM_ELEC + CALL INI_FLASH_GEOM_ELEC (HCLOUD) ELSE call Print_msg( NVERB_FATAL, 'GEN', 'INI_ELEC_n', 'INI_LIGHTNING_ELEC not yet developed' ) END IF @@ -289,13 +277,14 @@ ELSE IF (HELEC /= 'NONE') THEN call Print_msg( NVERB_FATAL, 'GEN', 'INI_ELEC_n', 'not yet developed for CELEC='//trim(HELEC) ) END IF ! -!* 3.6 initialize the parameters for the resolution of the electric field +! +!* 2.4 Initialize the parameters for the resolution of the electric field ! YEQNSYS = CEQNSYS CEQNSYS = 'LHE' ! Force any CEQNSYS (DUR, MAE, LHE) to LHE to obtain a unique set of coefficients ! for the flat laplacian operator and Return to the original CEQNSYS - +! ALLOCATE (XRHOM_E(SIZE(XRHOM))) ALLOCATE (XAF_E(SIZE(XAF))) ALLOCATE (XCF_E(SIZE(XCF))) @@ -304,15 +293,16 @@ ALLOCATE (XBFB_E(SIZE(XBFB,1),SIZE(XBFB,2),SIZE(XBFB,3))) ALLOCATE (XBF_SXP2_YP1_Z_E(SIZE(XBF_SXP2_YP1_Z,1),SIZE(XBF_SXP2_YP1_Z,2),& SIZE(XBF_SXP2_YP1_Z,3))) ! -CALL ELEC_TRIDZ (CLBCX,CLBCY, & - XMAP,XDXHAT,XDYHAT,XDXHATM,XDYHATM,XRHOM_E,XAF_E, & - XCF_E,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY, & - XRHODJ,XTHVREF,PZZ,XBFY_E,XEPOTFW_TOP, & - XBFB_E,XBF_SXP2_YP1_Z_E) +CALL ELEC_TRIDZ (CLBCX, CLBCY, & + XMAP, XDXHAT, XDYHAT, XDXHATM, XDYHATM, XRHOM_E, XAF_E, & + XCF_E, XTRIGSX, XTRIGSY, NIFAXX, NIFAXY, & + XRHODJ, XTHVREF, PZZ, XBFY_E, XEPOTFW_TOP, & + XBFB_E, XBF_SXP2_YP1_Z_E) ! -CEQNSYS=YEQNSYS +CEQNSYS = YEQNSYS ! -!* 3.7 initialize the flash maps +! +!* 2.5 Initialize the flash maps ! ALLOCATE( NMAP_TRIG_IC(IIU,IJU) ); NMAP_TRIG_IC(:,:) = 0 ALLOCATE( NMAP_IMPACT_CG(IIU,IJU) ); NMAP_IMPACT_CG(:,:) = 0 @@ -322,6 +312,5 @@ ALLOCATE( NMAP_3DIC(IIU,IJU,IKU) ); NMAP_3DIC(:,:,:) = 0 ALLOCATE( NMAP_3DCG(IIU,IJU,IKU) ); NMAP_3DCG(:,:,:) = 0 ! !------------------------------------------------------------------------------- -! ! END SUBROUTINE INI_ELEC_n diff --git a/src/MNH/ini_flash_geom_elec.f90 b/src/MNH/ini_flash_geom_elec.f90 index 3c5faece3492d78a958b5bfe54b815164611abde..e543b5ca95a9e6419e3f8278622c7ce3a331b107 100644 --- a/src/MNH/ini_flash_geom_elec.f90 +++ b/src/MNH/ini_flash_geom_elec.f90 @@ -8,15 +8,17 @@ ! INTERFACE ! - SUBROUTINE INI_FLASH_GEOM_ELEC + SUBROUTINE INI_FLASH_GEOM_ELEC (HCLOUD) +! +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! microphysics scheme ! END SUBROUTINE INI_FLASH_GEOM_ELEC END INTERFACE END MODULE MODI_INI_FLASH_GEOM_ELEC ! -! ############################## - SUBROUTINE INI_FLASH_GEOM_ELEC -! ############################## +! ####################################### + SUBROUTINE INI_FLASH_GEOM_ELEC (HCLOUD) +! ####################################### ! !!**** *INI_FLASH_GEOM_ELEC* - routine to initialize the lightning flashes !! @@ -48,6 +50,8 @@ END MODULE MODI_INI_FLASH_GEOM_ELEC !! Modifications !! J.-P. Pinty jan 2015 : add LMA simulator !! J.Escobar 20/06/2018 : truly set NBRANCH_MAX = 5000 ! +!! C. Barthe 30/11/2022 : add parameters for LIMA +!! C. Barthe 11/09/2023 : modify some parameters to use with LIMA2 !! !------------------------------------------------------------------------------- ! @@ -55,7 +59,18 @@ END MODULE MODI_INI_FLASH_GEOM_ELEC ! ------------ ! USE MODD_CST, ONLY : XPI -USE MODD_RAIN_ICE_DESCR_n +USE MODD_RAIN_ICE_DESCR_n,ONLY : XALPHAR_I=>XALPHAR, XNUR_I=>XNUR, XCCR, & + XALPHAI_I=>XALPHAI, XNUI_I=>XNUI, XAI_I=>XAI, XBI_I=>XBI, & + XALPHAS_I=>XALPHAS, XNUS_I=>XNUS, XCCS_I=>XCCS, XCXS_I=>XCXS, & + XALPHAG_I=>XALPHAG, XNUG_I=>XNUG, XCCG_I=>XCCG, XCXG_I=>XCXG, & + XALPHAH_I=>XALPHAH, XNUH_I=>XNUH, XCCH_I=>XCCH, XCXH_I=>XCXH +USE MODD_PARAM_LIMA, ONLY : XALPHAC, XNUC, & + XALPHAR_L=>XALPHAR, XNUR_L=>XNUR, XALPHAI_L=>XALPHAI, XNUI_L=>XNUI, & + XALPHAS_L=>XALPHAS, XNUS_L=>XNUS, XALPHAG_L=>XALPHAG, XNUG_L=>XNUG, & + NMOM_S, NMOM_G, NMOM_H +USE MODD_PARAM_LIMA_COLD, ONLY : XAI_L=>XAI, XBI_L=>XBI, XCCS_L=>XCCS, XCXS_L=>XCXS +USE MODD_PARAM_LIMA_MIXED,ONLY : XCCG_L=>XCCG, XCXG_L=>XCXG, & + XCCH_L=>XCCH, XCXH_L=>XCXH, XALPHAH_L=>XALPHAH, XNUH_L=>XNUH USE MODD_ELEC_DESCR USE MODD_ELEC_PARAM USE MODD_DIM_n, ONLY : NKMAX @@ -68,34 +83,132 @@ IMPLICIT NONE ! !* 0.1 Declaration of dummy arguments ! +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! microphysics scheme ! -!* 0.2 Declaration of local variables -! -! -!---------------------------------------------------------------------------- ! -!* 1. SOME CONSTANTS FOR NEUTRALIZATION -! --------------------------------- +!* 0.2 Declaration of local variables ! -XFQLIGHTC = 660. * MOMG(3.,3.,2.) / MOMG(3.,3.,3.) ! PI/A*lbda^(b-2) = 660. +! variables used to cope with the module variables common to icex and lima +REAL :: ZALPHAR, ZNUR, & + ZAI, ZBI, ZALPHAI, ZNUI, & + ZCCS, ZCXS, ZALPHAS, ZNUS, & + ZCCG, ZCXG, ZALPHAG, ZNUG, & + ZCCH, ZCXH, ZALPHAH, ZNUH ! -XFQLIGHTR = XPI * XCCR * MOMG(XALPHAR,XNUR,2.) -XEXQLIGHTR = XCXR - 2. +!------------------------------------------------------------------------------- ! -XEXQLIGHTI = 2. / XBI -XFQLIGHTI = XPI / 4. * MOMG(XALPHAI,XNUI,2.) * & - (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQLIGHTI) +!* 1. PRELIMINARIES +! ------------- +! +!* 1.1 Address module variables common to ICEx and LIMA +! +IF (HCLOUD(1:3) == 'ICE') THEN + ZALPHAR = XALPHAR_I + ZNUR = XNUR_I + ! + ZAI = XAI_I + ZBI = XBI_I + ZALPHAI = XALPHAI_I + ZNUI = XNUI_I + ! + ZCCS = XCCS_I + ZCXS = XCXS_I + ZALPHAS = XALPHAS_I + ZNUS = XNUS_I + ! + ZCCG = XCCG_I + ZCXG = XCXG_I + ZALPHAG = XALPHAG_I + ZNUG = XNUG_I + ! + ZCCH = XCCH_I + ZCXH = XCXH_I + ZALPHAH = XALPHAH_I + ZNUH = XNUH_I + ! +ELSE IF (HCLOUD == 'LIMA') THEN + ZALPHAR = XALPHAR_L + ZNUR = XNUR_L + ! + ZAI = XAI_L + ZBI = XBI_L + ZALPHAI = XALPHAI_L + ZNUI = XNUI_L + ! + ZCCS = XCCS_L + ZCXS = XCXS_L + ZALPHAS = XALPHAS_L + ZNUS = XNUS_L + ! + ZCCG = XCCG_L + ZCXG = XCXG_L + ZALPHAG = XALPHAG_L + ZNUG = XNUG_L + ! + ZCCH = XCCH_L + ZCXH = XCXH_L + ZALPHAH = XALPHAH_L + ZNUH = XNUH_L +END IF ! -XFQLIGHTS = XPI * XCCS * MOMG(XALPHAS,XNUS,2.) -XEXQLIGHTS = XCXS - 2. +!------------------------------------------------------------------------------- ! -XFQLIGHTG = XPI * XCCG * MOMG(XALPHAG,XNUG,2.) -XEXQLIGHTG = XCXG - 2. +!* 2. SOME CONSTANTS FOR NEUTRALIZATION +! --------------------------------- ! +IF (HCLOUD(1:3) == 'ICE') THEN + XFQLIGHTC = 660. * MOMG(3.,3.,2.) / MOMG(3.,3.,3.) ! PI/A*lbda^(b-2) = 660. +ELSE IF (HCLOUD == 'LIMA') THEN + XFQLIGHTC = XPI * MOMG(XALPHAC,XNUC,2.) +END IF +! +IF (HCLOUD(1:3) == 'ICE') THEN + XFQLIGHTR = XPI * XCCR * MOMG(ZALPHAR,ZNUR,2.) + XEXQLIGHTR = XCXR - 2. +ELSE IF (HCLOUD == 'LIMA') THEN + XFQLIGHTR = XPI * MOMG(ZALPHAR,ZNUR,2.) + XEXQLIGHTR = -2. +END IF +! +XEXQLIGHTI = 2. / ZBI +XFQLIGHTI = XPI / 4. * MOMG(ZALPHAI,ZNUI,2.) * & + (ZAI * MOMG(ZALPHAI,ZNUI,ZBI))**(-XEXQLIGHTI) +! +IF (HCLOUD(1:3) == 'ICE' .OR. & + (HCLOUD == 'LIMA' .AND. NMOM_S == 1)) THEN + XFQLIGHTS = XPI * ZCCS * MOMG(ZALPHAS,ZNUS,2.) + XEXQLIGHTS = ZCXS - 2. +ELSE IF (HCLOUD == 'LIMA' .AND. NMOM_S == 2) THEN + XFQLIGHTS = XPI * MOMG(ZALPHAS,ZNUS,2.) + XEXQLIGHTS = -2. +END IF +! +IF (HCLOUD(1:3) == 'ICE' .OR. & + (HCLOUD == 'LIMA' .AND. NMOM_G == 1)) THEN + XFQLIGHTG = XPI * ZCCG * MOMG(ZALPHAG,ZNUG,2.) + XEXQLIGHTG = ZCXG - 2. +ELSE IF (HCLOUD == 'LIMA' .AND. NMOM_G == 2) THEN + XFQLIGHTG = XPI * MOMG(ZALPHAG,ZNUG,2.) + XEXQLIGHTG = -2. +END IF +! +IF (HCLOUD(1:3) == 'ICE' .OR. & + (HCLOUD == 'LIMA' .AND. NMOM_H == 1)) THEN + XFQLIGHTH = XPI * ZCCH * MOMG(ZALPHAH,ZNUH,2.) + XEXQLIGHTH = ZCXH - 2. +ELSE IF (HCLOUD == 'LIMA' .AND. NMOM_H == 2) THEN + XFQLIGHTH = XPI * MOMG(ZALPHAH,ZNUH,2.) + XEXQLIGHTH = -2. +END IF +! +IF( .NOT.ALLOCATED(XNEUT_POS)) ALLOCATE( XNEUT_POS(NLGHTMAX) ) +IF( .NOT.ALLOCATED(XNEUT_NEG)) ALLOCATE( XNEUT_NEG(NLGHTMAX) ) +XNEUT_POS(:) = 0. +XNEUT_NEG(:) = 0. ! !---------------------------------------------------------------------------- ! -!* 2. INITIALIZE SOME THRESHOLDS +!* 3. INITIALIZE SOME THRESHOLDS ! -------------------------- ! ! electric field threshold for cell detection diff --git a/src/MNH/ini_micron.f90 b/src/MNH/ini_micron.f90 index a4934ed55d020c7cdee8d443fa663083e790f54d..091b69f685fdca492605011e460cab3b1a783a07 100644 --- a/src/MNH/ini_micron.f90 +++ b/src/MNH/ini_micron.f90 @@ -314,14 +314,4 @@ IF (CCLOUD == 'LIMA') THEN END IF ! ! -!* 5. INITIALIZE ATMOSPHERIC ELECTRICITY -! ---------------------------------- -! -! -!IF (CELEC /= 'NONE') THEN -! CALL INI_ELEC(IMI,TPINIFILE,XTSTEP,ZDZMIN,NSPLITR, & -! XDXX,XDYY,XDZZ,XDZX,XDZY ) -!END IF -! -! END SUBROUTINE INI_MICRO_n diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index f1b7d80691b9cfcba7d1951f2fd54abace79fd96..1ac91c3c2b8247c3fc48d6a176358570238f22db 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -295,7 +295,8 @@ END MODULE MODI_INI_MODEL_n ! J.L.Redelsperger 06/2011: OCEAN case ! R. Schoetter 12/2021 multi-level coupling between MesoNH and SURFEX ! R. Schoetter 12/2021 adds humidity and other mean diagnostics -! A. Costes 12/2021: Blaze fire model +! A. Costes 12/2021: Blaze fire model +! C. Barthe 03/2023: if cloud electricity is activated, both ini_micron and ini_elecn are called !--------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -2220,15 +2221,14 @@ END IF !* 12. INITIALIZE THE MICROPHYSICS ! ---------------------------- ! -IF (CELEC == 'NONE') THEN - CALL INI_MICRO_n(TPINIFILE,ILUOUT) +CALL INI_MICRO_n(TPINIFILE,ILUOUT) ! !------------------------------------------------------------------------------- ! !* 13. INITIALIZE THE ATMOSPHERIC ELECTRICITY ! -------------------------------------- ! -ELSE +IF (CELEC /= 'NONE') THEN CALL INI_ELEC_n(ILUOUT, CELEC, CCLOUD, TPINIFILE, & XTSTEP, XZZ, & XDXX, XDYY, XDZZ, XDZX, XDZY ) @@ -2237,16 +2237,16 @@ ELSE FMT='(/,"ELECTRIC VARIABLES ARE BETWEEN INDEX",I2," AND ",I2)')& NSV_ELECBEG, NSV_ELECEND ! - IF( CGETSVT(NSV_ELECBEG)=='INIT' ) THEN - XSVT(:,:,:,NSV_ELECBEG) = XCION_POS_FW(:,:,:) ! Nb/kg - XSVT(:,:,:,NSV_ELECEND) = XCION_NEG_FW(:,:,:) + IF( CGETSVT(NSV_ELECBEG)=='INIT' ) THEN + XSVT(:,:,:,NSV_ELECBEG) = XCION_POS_FW(:,:,:) ! Nb/kg + XSVT(:,:,:,NSV_ELECEND) = XCION_NEG_FW(:,:,:) ! - XSVT(:,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 - ELSE ! Convert elec_variables per m3 into elec_variables per kg of air - DO JSV = NSV_ELECBEG, NSV_ELECEND - XSVT(:,:,:,JSV) = XSVT(:,:,:,JSV) / XRHODREF(:,:,:) - ENDDO - END IF + XSVT(:,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + ELSE ! Convert elec_variables per m3 into elec_variables per kg of air + DO JSV = NSV_ELECBEG, NSV_ELECEND + XSVT(:,:,:,JSV) = XSVT(:,:,:,JSV) / XRHODREF(:,:,:) + ENDDO + END IF END IF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index 0d7358737ad6b6fbc37b3254fb5867691b27b86d..9c0ad2bd3bb4322ca79f32bb78447c6ba673c50a 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -73,6 +73,9 @@ END MODULE MODI_INI_NSV ! A. Costes 12/2021: smoke tracer for fire model ! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables ! + NSV_CHEM_LIST(_A) the size of the list +! C. Barthe 09/2022: enable CELLS to be used with LIMA +! C. Barthe 09/2023: move CELLS variables initialization after aerosols initialization to avoid +! problems when using LIMA+ORILAM+CELLS in resolved_cloud !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -112,7 +115,8 @@ USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV USE MODD_PARAM_C2R2, ONLY: LSUPSAT USE MODD_PARAMETERS, ONLY: NCOMMENTLGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX -USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, NMOD_IFN, NMOD_IMM, PARAM_LIMA_ALLOCATE, PARAM_LIMA_DEALLOCATE +USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, NMOD_IFN, NMOD_IMM, PARAM_LIMA_ALLOCATE, & + PARAM_LIMA_DEALLOCATE, NMOM_H USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES USE MODD_PARAM_LIMA_WARM, ONLY: CAERO_MASS, CLIMA_WARM_NAMES USE MODD_PARAM_n, ONLY: CCLOUD, CELEC @@ -230,39 +234,6 @@ IF (CCLOUD == 'LIMA' ) THEN END IF END IF ! CCLOUD = LIMA ! -! -! Add one scalar for negative ion -! First variable: positive ion (NSV_ELECBEG_A index number) -! Last --------: negative ion (NSV_ELECEND_A index number) -! Correspondence for ICE3: -! Relative index 1 2 3 4 5 6 7 -! Charge for ion+ cloud rain ice snow graupel ion- -! -! Correspondence for ICE4: -! Relative index 1 2 3 4 5 6 7 8 -! Charge for ion+ cloud rain ice snow graupel hail ion- -! -IF (CELEC /= 'NONE') THEN - IF (CCLOUD == 'ICE3') THEN - NSV_ELEC_A(KMI) = 7 - NSV_ELECBEG_A(KMI)= ISV+1 - NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI) - ISV = NSV_ELECEND_A(KMI) - CELECNAMES(7) = CELECNAMES(8) - ELSE IF (CCLOUD == 'ICE4') THEN - NSV_ELEC_A(KMI) = 8 - NSV_ELECBEG_A(KMI)= ISV+1 - NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI) - ISV = NSV_ELECEND_A(KMI) - END IF -ELSE - NSV_ELEC_A(KMI) = 0 -! force First index to be superior to last index -! in order to create a null section - NSV_ELECBEG_A(KMI) = 1 - NSV_ELECEND_A(KMI) = 0 -END IF -! ! scalar variables used as lagragian variables ! IF (LLG) THEN @@ -527,6 +498,40 @@ ELSE ! in order to create a null section END IF ! +! scalar variables used in the electrical scheme +! +! Add one scalar for negative ion +! First variable: positive ion (NSV_ELECBEG_A index number) +! Last --------: negative ion (NSV_ELECEND_A index number) +! Correspondence for ICE3: +! Relative index 1 2 3 4 5 6 7 +! Charge for ion+ cloud rain ice snow graupel ion- +! +! Correspondence for ICE4: +! Relative index 1 2 3 4 5 6 7 8 +! Charge for ion+ cloud rain ice snow graupel hail ion- +! +IF (CELEC /= 'NONE') THEN + IF (CCLOUD == 'ICE3' .OR. (CCLOUD == 'LIMA' .AND. (NMOM_H .LT. 1))) THEN + NSV_ELEC_A(KMI) = 7 + NSV_ELECBEG_A(KMI)= ISV+1 + NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI) + ISV = NSV_ELECEND_A(KMI) + CELECNAMES(7) = CELECNAMES(8) + ELSE IF (CCLOUD == 'ICE4' .OR. (CCLOUD == 'LIMA' .AND. (NMOM_H .GE. 1))) THEN + NSV_ELEC_A(KMI) = 8 + NSV_ELECBEG_A(KMI)= ISV+1 + NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI) + ISV = NSV_ELECEND_A(KMI) + END IF +ELSE + NSV_ELEC_A(KMI) = 0 +! force First index to be superior to last index +! in order to create a null section + NSV_ELECBEG_A(KMI) = 1 + NSV_ELECEND_A(KMI) = 0 +END IF +! ! scalar variables used in blowing snow model ! IF (LBLOWSNOW) THEN diff --git a/src/MNH/ion_attach_elec.f90 b/src/MNH/ion_attach_elec.f90 index cd0fcf1c3eb268b93d7eeceef9161bc5157122aa..cd99d72d40e24fd2b0fffa6ee0602e191888e8f2 100644 --- a/src/MNH/ion_attach_elec.f90 +++ b/src/MNH/ion_attach_elec.f90 @@ -3,49 +3,56 @@ !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_ION_ATTACH_ELEC -! ############################ +! ########################### ! INTERFACE - SUBROUTINE ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF, & - PRHODJ,PSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & - PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA ) - - -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry air density* Jacobian -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable vol. source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable vol. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU, PEFIELDV, PEFIELDW - ! Electric field components -LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GATTACH !Recombination and - !Attachment if true -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask - - END SUBROUTINE ION_ATTACH_ELEC + SUBROUTINE ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PSVS, PRS, PTHT, PCIT, PPABST, & + PEFIELDU, PEFIELDV, PEFIELDW, GATTACH, & + PTOWN, PSEA, & + PCCS, PCRS, PCSS, PCGS, PCHS ) +! +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry air density* Jacobian +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable vol. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable vol. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice n.c. + ! - at time t (for ICE schemes) + ! - source (for LIMA) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU, PEFIELDV, PEFIELDW + ! Electric field components +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GATTACH ! Recombination and + ! Attachment if true +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask +! +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCCS ! Cld droplets nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCRS ! Rain nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCSS ! Snow nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCGS ! Graupel nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCHS ! Hail nb conc source +! +END SUBROUTINE ION_ATTACH_ELEC END INTERFACE END MODULE MODI_ION_ATTACH_ELEC - - - -! ###################################################################### - SUBROUTINE ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF, & - PRHODJ,PSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, & - PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA ) -! ###################################################################### - - ! -!!**** * - +! +! #################################################################### + SUBROUTINE ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PSVS, PRS, PTHT, PCIT, PPABST, & + PEFIELDU, PEFIELDV, PEFIELDW, GATTACH, & + PTOWN, PSEA, & + PCCS, PCRS, PCSS, PCGS, PCHS ) +! #################################################################### !! !! PURPOSE !! ------- @@ -77,25 +84,57 @@ END MODULE MODI_ION_ATTACH_ELEC !! Modifications: !! J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 ! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! C. Barthe 09/2022: enable the use of LIMA for cloud electrification +! C. Barthe 09/2023: enable the use of LIMA2 for cloud electrification +! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! use modd_budget, only : lbudget_sv, NBUDGET_SV1, tbudgets -USE MODD_CONF, ONLY: CCONF +USE MODD_CONF, ONLY : CCONF USE MODD_CST USE MODD_ELEC_DESCR USE MODD_ELEC_n USE MODD_ELEC_PARAM -USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELEC -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_RAIN_ICE_DESCR_n -USE MODD_RAIN_ICE_PARAM_n -USE MODD_REF, ONLY: XTHVREFZ +USE MODD_NSV, ONLY : NSV_ELECBEG, NSV_ELEC +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY : XALPHAC_L=>XALPHAC, XNUC_L=>XNUC, & + XALPHAI_L=>XALPHAI, XNUI_L=>XNUI, & + XCEXVT_L=>XCEXVT, & + NMOM_S, NMOM_G, NMOM_H +USE MODD_PARAM_LIMA_COLD, ONLY : XDI, XLBI, XLBEXI, XFSEDRI, & + XDS, XCCS_L=>XCCS, XCXS_L=>XCXS, XLBS_L=>XLBS, & + XEXSEDS_L=>XEXSEDS, XLBEXS_L=>XLBEXS, XFSEDS_L=>XFSEDS +USE MODD_PARAM_LIMA_MIXED,ONLY : XDG, XCCG_L=>XCCG, XCXG_L=>XCXG, XLBG_L=>XLBG, & + XEXSEDG_L=>XEXSEDG, XLBEXG_L=>XLBEXG, XFSEDG_L=>XFSEDG, & + XDH, XALPHAH_L=>XALPHAH, XNUH_L=>XNUH, & + XCCH_L=>XCCH, XCXH_L=>XCXH, XLBH_L=>XLBH, & + XEXSEDH_L=>XEXSEDH, XLBEXH_L=>XLBEXH, XFSEDH_L=>XFSEDH +USE MODD_PARAM_LIMA_WARM, ONLY : XCC_L=>XCC, XDC_L=>XDC, XLBC_L=>XLBC, XLBEXC_L=>XLBEXC, & + XFSEDC_L=>XFSEDRC, & + XLBR_L=>XLBR, XLBEXR_L=>XLBEXR, & + XFSEDR_L=>XFSEDRR, XBR, XDR +USE MODD_RAIN_ICE_DESCR_n,ONLY : XALPHAC_I=>XALPHAC, XNUC_I=>XNUC, & + XALPHAI_I=>XALPHAI, XNUI_I=>XNUI, & + XALPHAH_I=>XALPHAH, XNUH_I=>XNUH, & + XCC_I=>XCC, XDC_I=>XDC, XLBC_I=>XLBC, XLBEXC_I=>XLBEXC, & + XCONC_SEA, XCONC_LAND, XCONC_URBAN, XALPHAC2, XNUC2, & + XCCR, XLBR_I=>XLBR, XLBEXR_I=>XLBEXR, & + XCCS_I=>XCCS, XCXS_I=>XCXS, XLBS_I=>XLBS, XLBEXS_I=>XLBEXS, & + XCCG_I=>XCCG, XCXG_I=>XCXG, XLBG_I=>XLBG, XLBEXG_I=>XLBEXG, & + XCCH_I=>XCCH, XCXH_I=>XCXH, XLBH_I=>XLBH, XLBEXH_I=>XLBEXH, & + XCEXVT_I=>XCEXVT +USE MODD_RAIN_ICE_PARAM_n,ONLY : XFSEDC_I=>XFSEDC, & + XFSEDR_I=>XFSEDR, XEXSEDR, & + XFSEDS_I=>XFSEDS, XEXSEDS_I=>XEXSEDS, & + XFSEDG_I=>XFSEDG, XEXSEDG_I=>XEXSEDG, & + XFSEDH_I=>XFSEDH, XEXSEDH_I=>XEXSEDH +USE MODD_REF, ONLY : XTHVREFZ -use mode_budget, only: Budget_store_init, Budget_store_end -use mode_tools_ll, only: GET_INDICE_ll +use mode_budget, only : Budget_store_init, Budget_store_end +use mode_tools_ll, only : GET_INDICE_ll USE MODI_MOMG @@ -103,32 +142,41 @@ IMPLICIT NONE ! ! 0.1 Declaration of arguments ! -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry air density* Jacobian -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable vol. source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable vol. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU, PEFIELDV, PEFIELDW - ! Electric field components -LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GATTACH !Recombination and - !Attachment if true -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask - +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry air density* Jacobian +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable vol. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable vol. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta (K) at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice n.c. + ! - at time t (for ICE schemes) + ! - source (for LIMA) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU, PEFIELDV, PEFIELDW + ! Electric field components +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GATTACH ! Recombination and + ! Attachment if true +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask +! +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCCS ! Cld droplets nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCRS ! Rain nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCSS ! Snow nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCGS ! Graupel nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCHS ! Hail nb conc source ! ! ! 0.2 Declaration of local variables ! -REAL, DIMENSION(:), ALLOCATABLE :: ZT ! Temperature (K) -REAL, DIMENSION(:), ALLOCATABLE :: ZCONC, ZVIT, ZRADIUS ! Number concentration - !fallspeed, radius -REAL :: ZCQD, ZCDIF ! computed coefficients +REAL, DIMENSION(:), ALLOCATABLE :: ZT ! Temperature (K) +REAL, DIMENSION(:), ALLOCATABLE :: ZCONC, & ! Number concentration + ZVIT, & ! Fallspeed + ZRADIUS ! Radius +REAL :: ZCQD, ZCDIF ! Computed coefficients INTEGER, DIMENSION(SIZE(PTHT)) :: IGI, IGJ, IGK ! Valid grid index INTEGER :: IVALID ! Nb of valid grid INTEGER :: IIB ! Beginning (B) and end (E) grid points @@ -143,26 +191,138 @@ INTEGER :: ITYPE ! Hydrometeor category (2: cloud, 3: rain, ! 4: ice crystal, 5: snow, 6: graupel, 7: hail) REAL :: ZCOMB ! Recombination ! +! variables used to select between common parameters between ICEx and LIMA +REAL :: ZALPHAC, ZNUC, ZCC, ZDC, & + ZFSEDC1, ZFSEDC2, ZLBC1, ZLBC2, ZLBEXC, & + ZALPHAI, ZNUI, & + ZLBR, ZLBEXR, ZFSEDR, & + ZCCS, ZCXS, ZLBS, ZLBEXS, ZFSEDS, ZEXSEDS, & + ZCCG, ZCXG, ZLBG, ZLBEXG, ZFSEDG, ZEXSEDG, & + ZCCH, ZCXH, ZLBH, ZLBEXH, ZFSEDH, ZEXSEDH, & + ZALPHAH, ZNUH, & + ZCEXVT +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCCT, & ! nb conc at t for cld droplets + ZCRT, & ! rain + ZCIT, & ! ice crystal + ZCST, & ! snow + ZCGT, & ! graupel + ZCHT ! hail ! !------------------------------------------------------------------------------- +! if ( lbudget_sv ) then do jrr = 1, nsv_elec call Budget_store_init( tbudgets( NBUDGET_SV1 - 1 + nsv_elecbeg - 1 + jrr), 'NEUT', psvs(:, :, :, jrr) ) end do end if ! -!* 1. COMPUTE THE ION RECOMBINATION and TEMPERATURE -! --------------------------------------------- +!* 1. PRELIMINARIES +! ------------- +! +! select parameters between ICEx and LIMA +! +IF (HCLOUD(1:3) == 'ICE') THEN + ! + ZALPHAC = XALPHAC_I + ZNUC = XNUC_I + ZCC = XCC_I + ZDC = XDC_I + ZFSEDC1 = XFSEDC_I(1) + ZFSEDC2 = XFSEDC_I(2) + ZLBC1 = XLBC_I(1) + ZLBC2 = XLBC_I(2) + ZLBEXC = XLBEXC_I + ! + ZALPHAI = XALPHAI_I + ZNUI = XNUI_I + ! + ZLBR = XLBR_I + ZLBEXR = XLBEXR_I + ZFSEDR = XFSEDR_I + ! + ZCCS = XCCS_I + ZCXS = XCXS_I + ZLBS = XLBS_I + ZLBEXS = XLBEXS_I + ZFSEDS = XFSEDS_I + ZEXSEDS = XEXSEDS_I + ! + ZCCG = XCCG_I + ZCXG = XCXG_I + ZLBG = XLBG_I + ZLBEXG = XLBEXG_I + ZFSEDG = XFSEDG_I + ZEXSEDG = XEXSEDG_I + ! + ZALPHAH = XALPHAH_I + ZNUH = XNUH_I + ZCCH = XCCH_I + ZCXH = XCXH_I + ZLBH = XLBH_I + ZLBEXH = XLBEXH_I + ZFSEDH = XFSEDH_I + ZEXSEDH = XEXSEDH_I + ! + ZCEXVT = XCEXVT_I + ! +ELSE IF (HCLOUD == 'LIMA') THEN + ! + ZALPHAC = XALPHAC_L + ZNUC = XNUC_L + ZCC = XCC_L + ZDC = XDC_L + ZFSEDC1 = XFSEDC_L + ZLBC1 = XLBC_L + ZLBEXC = XLBEXC_L + ! + ZALPHAI = XALPHAI_L + ZNUI = XNUI_L + ! + ZLBR = XLBR_L + ZLBEXR = XLBEXR_L + ZFSEDR = XFSEDR_L + ! + ZCCS = XCCS_L + ZCXS = XCXS_L + ZLBS = XLBS_L + ZLBEXS = XLBEXS_L + ZFSEDS = XFSEDS_L + ZEXSEDS = XEXSEDS_L + ! + ZCCG = XCCG_L + ZCXG = XCXG_L + ZLBG = XLBG_L + ZLBEXG = XLBEXG_L + ZFSEDG = XFSEDG_L + ZEXSEDG = XEXSEDG_L + ! + ZALPHAH = XALPHAH_L + ZNUH = XNUH_L + ZCCH = XCCH_L + ZCXH = XCXH_L + ZLBH = XLBH_L + ZLBEXH = XLBEXH_L + ZFSEDH = XFSEDH_L + ZEXSEDH = XEXSEDH_L + ! + ZCEXVT = XCEXVT_L +END IF ! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE ION RECOMBINATION and TEMPERATURE +! --------------------------------------------- ! ZCQD = 4 * XPI * XEPSILON * XBOLTZ / XECHARGE -ZCDIF = XBOLTZ /XECHARGE +ZCDIF = XBOLTZ / XECHARGE ! CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT IKE = SIZE(PTHT,3) - JPVEXT ! -!* 1.1 Add Ion Recombination source (PSVS in 1/(m3.s)) +! +!* 2.1 Add Ion Recombination source (PSVS in 1/(m3.s)) ! and count and localize valid grid points for ion source terms ! IVALID = 0 @@ -170,13 +330,16 @@ DO IK = IKB, IKE DO IJ = IJB, IJE DO II = IIB, IIE IF (GATTACH(II,IJ,IK)) THEN -! Recombination - ZCOMB = XIONCOMB * (PSVS(II,IJ,IK,1)*PTSTEP) * & - (PSVS(II,IJ,IK,NSV_ELEC)*PTSTEP) * & +! Recombination rate + ZCOMB = XIONCOMB * (PSVS(II,IJ,IK,1) * PTSTEP) * & + (PSVS(II,IJ,IK,NSV_ELEC) * PTSTEP) * & PRHODREF(II,IJ,IK) / PRHODJ(II,IJ,IK) ZCOMB = MIN(ZCOMB, PSVS(II,IJ,IK,1), PSVS(II,IJ,IK,NSV_ELEC)) - PSVS(II,IJ,IK,1) = PSVS(II,IJ,IK,1) - ZCOMB + ! +! Update the sources + PSVS(II,IJ,IK,1) = PSVS(II,IJ,IK,1) - ZCOMB PSVS(II,IJ,IK,NSV_ELEC) = PSVS(II,IJ,IK,NSV_ELEC) - ZCOMB + ! ! Counting IVALID = IVALID + 1 IGI(IVALID) = II @@ -187,7 +350,8 @@ DO IK = IKB, IKE ENDDO ENDDO ! -!* 1.2 Compute the temperature +! +!* 2.2 Compute the temperature ! IF( IVALID /= 0 ) THEN ALLOCATE (ZT(IVALID)) @@ -197,21 +361,50 @@ IF( IVALID /= 0 ) THEN ENDDO END IF ! +!------------------------------------------------------------------------------- ! -!* 2. TRANSFORM VOLUM. SOURCE TERMS INTO MIXING RATIO +!* 3. TRANSFORM VOLUM. SOURCE TERMS INTO MIXING RATIO ! FOR WATER SPECIES, AND VOLUMIC CONTENT FOR ELECTRIC VARIABLES ! ------------------------------------------------------------- ! DO JRR = 1, KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) *PTSTEP / PRHODJ(:,:,:) + PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PTSTEP / PRHODJ(:,:,:) ENDDO ! +ALLOCATE(ZCIT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) +! ICEx : pcit is really pcit +IF (HCLOUD(1:3) == 'ICE') ZCIT(:,:,:) = PCIT(:,:,:) +! +IF (HCLOUD == 'LIMA') THEN + ALLOCATE(ZCCT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZCRT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ! + ZCCT(:,:,:) = PCCS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + ZCRT(:,:,:) = PCRS(:,:,:) * PTSTEP / PRHODJ(:,:,:) +! LIMA : pcit is pcis ! + ZCIT(:,:,:) = PCIT(:,:,:) * PTSTEP / PRHODJ(:,:,:) + ! + IF (PRESENT(PCSS)) THEN + ALLOCATE(ZCST(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ZCST(:,:,:) = PCSS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + END IF + IF (PRESENT(PCGS)) THEN + ALLOCATE(ZCGT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ZCGT(:,:,:) = PCGS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + END IF + IF (PRESENT(PCHS)) THEN + ALLOCATE(ZCHT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ZCHT(:,:,:) = PCHS(:,:,:) * PTSTEP / PRHODJ(:,:,:) + END IF +END IF +! DO JSV = 1, NSV_ELEC - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) *PTSTEP *PRHODREF(:,:,:) / PRHODJ(:,:,:) + PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PTSTEP * PRHODREF(:,:,:) / PRHODJ(:,:,:) ENDDO ! +!------------------------------------------------------------------------------- ! -!* 3. COMPUTE ATTACHMENT DUE TO ION DIFFUSION AND CONDUCTION +!* 4. COMPUTE ATTACHMENT DUE TO ION DIFFUSION AND CONDUCTION ! ------------------------------------------------------ ! ! Attachment to cloud droplets, rain, cloud ice, snow, graupel, @@ -220,7 +413,8 @@ ENDDO ! IF( IVALID /= 0 ) THEN ! -!* 3.1 Attachment to cloud droplets +! +!* 4.1 Attachment to cloud droplets ! ALLOCATE (ZCONC(IVALID)) ALLOCATE (ZVIT (IVALID)) @@ -232,16 +426,17 @@ IF( IVALID /= 0 ) THEN ELSE CALL HYDROPARAM (IGI, IGJ, IGK, ZCONC, ZVIT, ZRADIUS, ITYPE) ENDIF -! +! CALL DIFF_COND (IGI, IGJ, IGK, PSVS(:,:,:,1), PSVS(:,:,:,NSV_ELEC), & PSVS(:,:,:,ITYPE)) ! -!* 3.2 Attachment to raindrops, ice crystals, snow, graupel, +! +!* 4.2 Attachment to raindrops, ice crystals, snow, graupel, ! and hail (if activated) ! DO ITYPE = 3, KRR CALL HYDROPARAM (IGI, IGJ, IGK, ZCONC, ZVIT, ZRADIUS, ITYPE) -! +! CALL DIFF_COND (IGI, IGJ, IGK, PSVS(:,:,:,1), PSVS(:,:,:,NSV_ELEC), & PSVS(:,:,:,ITYPE)) END DO @@ -250,8 +445,16 @@ IF( IVALID /= 0 ) THEN DEALLOCATE (ZT) ENDIF ! +IF (ALLOCATED(ZCCT)) DEALLOCATE(ZCCT) +IF (ALLOCATED(ZCRT)) DEALLOCATE(ZCRT) +IF (ALLOCATED(ZCIT)) DEALLOCATE(ZCIT) +IF (ALLOCATED(ZCST)) DEALLOCATE(ZCST) +IF (ALLOCATED(ZCGT)) DEALLOCATE(ZCGT) +IF (ALLOCATED(ZCHT)) DEALLOCATE(ZCHT) +! +!------------------------------------------------------------------------------- ! -!* 4. RETURN TO VOLUMETRIC SOURCE (Prognostic units) +!* 5. RETURN TO VOLUMETRIC SOURCE (Prognostic units) ! --------------------------- ! DO JRR = 1, KRR @@ -262,8 +465,9 @@ DO JSV = 1, NSV_ELEC PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) / (PTSTEP * PRHODREF(:,:,:)) ENDDO ! +!------------------------------------------------------------------------------- ! -!* 5. BUDGET +!* 6. BUDGET ! ------ ! if ( lbudget_sv ) then @@ -278,7 +482,7 @@ CONTAINS ! !------------------------------------------------------------------------------ ! - SUBROUTINE HYDROPARAM (IGRIDX, IGRIDY, IGRIDZ, ZCONC, & + SUBROUTINE HYDROPARAM (IGRIDX, IGRIDY, IGRIDZ, ZCONC, & ZVIT, ZRADIUS, ITYPE, PSEA, PTOWN) ! ! Purpose : Compute in regions of valid grid points (IGRIDX, IGRIDY, IGRIDZ) @@ -294,25 +498,28 @@ IMPLICIT NONE ! !* 0.1 declaration of dummy arguments ! -INTEGER, DIMENSION(:), INTENT(IN) :: IGRIDX, IGRIDY, IGRIDZ ! Index of - ! valid gridpoints -INTEGER, INTENT(IN) :: ITYPE ! Hydrometeor category +INTEGER, DIMENSION(:), INTENT(IN) :: IGRIDX, & ! Index of + IGRIDY, & ! valid + IGRIDZ ! gridpoints +INTEGER, INTENT(IN) :: ITYPE ! Hydrometeor category ! ITYPE= 2: cloud, 3: rain, 4: ice, 5: snow, 6: graupel, 7: hail -REAL, DIMENSION(:), INTENT(INOUT) :: ZCONC, ZVIT, ZRADIUS -! Number concentration, fallspeed, radius -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask +REAL, DIMENSION(:), INTENT(INOUT) :: ZCONC, & ! Number concentration + ZVIT, & ! Fallspeed + ZRADIUS ! Radius +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land-sea mask ! !* 0.2 declaration of local variables ! -REAL :: ZCONC1, ZCONC2 ! for cloud -REAL :: ZLBC -REAL :: ZFSEDC -REAL :: ZRAY -REAL :: ZEXP1, ZEXP2, ZMOM1, ZMOM2 -REAL :: ZVCOEF, ZRHO00, ZLBI -REAL :: ZLAMBDA -INTEGER :: JI, JJ, JK, IV +REAL :: ZCONC1, ZCONC2 ! for cloud +REAL :: ZLBC +REAL :: ZFSEDC +REAL :: ZRAY +REAL :: ZEXP1, ZEXP2, ZMOM1, ZMOM2 +REAL :: ZVCOEF, ZRHO00, ZLBI +REAL :: ZLAMBDA +REAL :: ZCOR ! correction factor for cloud droplet terminal fall speed +INTEGER :: JI, JJ, JK, IV ! ! ZCONC(:) = 0. @@ -325,99 +532,148 @@ SELECT CASE (ITYPE) ! -------------------- CASE (2) ! - IF (PRESENT(PSEA)) THEN - - ZMOM1 = 0.5*MOMG(XALPHAC,XNUC,1.) - ZMOM2 = 0.5*MOMG(XALPHAC2,XNUC2,1.) + IF (HCLOUD(1:3) == 'ICE') THEN + IF (PRESENT(PSEA)) THEN + ZMOM1 = 0.5 * MOMG(ZALPHAC,ZNUC,1.) + ZMOM2 = 0.5 * MOMG(XALPHAC2,XNUC2,1.) + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,2)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(2) .AND. & + PSVS(JI,JJ,JK,2) /= 0. ) THEN + ZCONC1 = PSEA(JI,JJ) * XCONC_SEA + (1. - PSEA(JI,JJ)) * XCONC_LAND + ZLBC = PSEA(JI,JJ) * ZLBC2 + (1. - PSEA(JI,JJ)) * ZLBC1 + ZFSEDC = PSEA(JI,JJ) * ZFSEDC2 + (1. - PSEA(JI,JJ)) * ZFSEDC1 + ZFSEDC = MAX(MIN(ZFSEDC1,ZFSEDC2), ZFSEDC) + ZCONC2 = (1. - PTOWN(JI,JJ)) * ZCONC1 + PTOWN(JI,JJ) * XCONC_URBAN + ZRAY = (1. - PSEA(JI,JJ)) * ZMOM1 + PSEA(JI,JJ) * ZMOM2 + ZCONC(IV) = ZCONC2 ! Number concentration + ZLAMBDA = (ZLBC * ZCONC2 / (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,2)))**ZLBEXC + ZRADIUS(IV) = ZRAY / ZLAMBDA + ZVIT(IV) = ZCC * ZFSEDC * ZLAMBDA**(-ZDC) * PRHODREF(JI,JJ,JK)**(-ZCEXVT) + END IF + ENDDO + ELSE + ZRAY = 0.5 * MOMG(ZALPHAC,ZNUC,1.) + ZLBC = ZLBC1 * XCONC_LAND + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,2)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(2) .AND. & + PSVS(JI,JJ,JK,2) /= 0. ) THEN + ZCONC(IV) = XCONC_LAND ! Number concentration + ZLAMBDA = (ZLBC / (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,2)))**ZLBEXC + ZRADIUS(IV) = ZRAY / ZLAMBDA + ZVIT(IV) = ZCC * ZFSEDC1 * ZLAMBDA**(-ZDC) * PRHODREF(JI,JJ,JK)**(-ZCEXVT) + END IF + ENDDO + END IF + ELSE IF (HCLOUD == 'LIMA') THEN + ZRAY = 0.5 * MOMG(ZALPHAC,ZNUC,1.) + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,2)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(2) .AND. & + ZCCT(JI,JJ,JK) > 0. .AND. PSVS(JI,JJ,JK,2) /= 0. ) THEN + ZCONC(IV) = ZCCT(JI,JJ,JK) * PRHODREF(JI,JJ,JK) ! Number concentration (m-3) + ZLAMBDA = (ZLBC1 * ZCCT(JI,JJ,JK) / PRS(JI,JJ,JK,2))**ZLBEXC + ZRADIUS(IV) = ZRAY / ZLAMBDA +! correction factor for cloud droplet terminal fall speed + ZCOR = 1. + 1.26 * 6.6E-8 * (101325. / PPABST(JI,JJ,JK)) * (ZT(IV) / 293.15) / ZRADIUS(IV) + ZVIT(IV) = ZCOR * ZFSEDC1 * ZLAMBDA**(-ZDC) * PRHODREF(JI,JJ,JK)**(-ZCEXVT) + END IF + ENDDO + END IF +! +! +!* 2. PARAMETERS FOR RAIN +! ------------------- + CASE (3) +! + IF (HCLOUD(1:3) == 'ICE') THEN + ZEXP1 = XEXSEDR - 1. + ZEXP2 = ZEXP1 - ZCEXVT +! DO IV = 1, IVALID JI = IGRIDX(IV) JJ = IGRIDY(IV) JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 2)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(2) .AND. & - PSVS(JI, JJ, JK, 2) /=0. ) THEN - ZCONC1 = PSEA(JI,JJ) * XCONC_SEA + (1. - PSEA(JI,JJ)) * XCONC_LAND - ZLBC = PSEA(JI,JJ) * XLBC(2) + (1. - PSEA(JI,JJ)) * XLBC(1) - ZFSEDC = PSEA(JI,JJ) * XFSEDC(2) + (1. - PSEA(JI,JJ)) * XFSEDC(1) - ZFSEDC = MAX(MIN(XFSEDC(1),XFSEDC(2)), ZFSEDC) - ZCONC2 = (1. - PTOWN(JI,JJ)) * ZCONC1 + PTOWN(JI,JJ) * XCONC_URBAN - ZRAY = (1. - PSEA(JI,JJ)) * ZMOM1 + PSEA(JI,JJ) * ZMOM2 - ZCONC (IV) = ZCONC2 ! Number concentration - ZLAMBDA = (ZLBC *ZCONC2 / (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,2)))**XLBEXC - ZRADIUS (IV) = ZRAY / ZLAMBDA - ZVIT (IV) = XCC * ZFSEDC * ZLAMBDA**(-XDC) * & - PRHODREF(JI,JJ,JK)**(-XCEXVT) + IF( PRS(JI,JJ,JK,3)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(3) .AND. & + PSVS(JI,JJ,JK,3) /= 0. ) THEN + ZLAMBDA = ZLBR * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,3))**ZLBEXR +! dans ice3, alpha_r = 1 et nu_r = 1 + ZRADIUS(IV) = 0.5 / ZLAMBDA + ZCONC(IV) = XCCR / ZLAMBDA + ZVIT(IV) = ZFSEDR * PRHODREF(JI,JJ,JK)**ZEXP2 & + * PRS(JI,JJ,JK,3)**ZEXP1 END IF ENDDO - ELSE - ZRAY = 0.5*MOMG(XALPHAC,XNUC,1.) - ZLBC = XLBC(1) * XCONC_LAND + ELSE IF (HCLOUD == 'LIMA') THEN DO IV = 1, IVALID JI = IGRIDX(IV) JJ = IGRIDY(IV) JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 2)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(2) .AND. & - PSVS(JI, JJ, JK, 2) /=0. ) THEN - ZCONC (IV) = XCONC_LAND ! Number concentration - ZLAMBDA = (ZLBC / (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,2)))**XLBEXC - ZRADIUS (IV) = ZRAY / ZLAMBDA - ZVIT (IV) = XCC * XFSEDC(1) * ZLAMBDA**(-XDC) * & - PRHODREF(JI,JJ,JK)**(-XCEXVT) + IF( PRS(JI,JJ,JK,3)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(3) .AND. & + ZCRT(JI,JJ,JK) > 0. .AND. PSVS(JI,JJ,JK,3) /= 0. ) THEN + ZLAMBDA = (ZLBR * ZCRT(JI,JJ,JK) / PRS(JI,JJ,JK,3))**ZLBEXR +! dans lima, alpha_r = 1 et nu_r = 2 + ZRADIUS(IV) = 1. / ZLAMBDA + ZCONC(IV) = ZCRT(JI,JJ,JK) * PRHODREF(JI,JJ,JK) ! Number concentration (m-3) + ! zvit = zwsedr / (r * rho_dref) + ZVIT(IV) = ZFSEDR * ZLAMBDA**(-XDR) * PRHODREF(JI,JJ,JK)**(-ZCEXVT) END IF ENDDO END IF ! ! -!* 2. PARAMETERS FOR RAIN -! ------------------- - CASE (3) - ZEXP1 = XEXSEDR - 1. - ZEXP2 = ZEXP1 - XCEXVT -! - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 3)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(3) .AND. & - PSVS(JI, JJ, JK, 3) /=0. ) THEN - ZLAMBDA = XLBR * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,3))**XLBEXR - ZRADIUS (IV) = 0.5 / ZLAMBDA - ZCONC (IV) = XCCR / ZLAMBDA - ZVIT (IV) = XFSEDR * PRHODREF(JI,JJ,JK)**ZEXP2 & - * PRS(JI,JJ,JK,3)**ZEXP1 - END IF - ENDDO -! -! !* 3. PARAMETERS FOR ICE ! ------------------ ! CASE (4) ! - ZRAY = 0.5*MOMG(XALPHAI,XNUI,1.) - ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) -! ZVCOEF= XC_I * (GAMMA(XNUI+(XBI+XDI)/XALPHAI) / GAMMA(XNUI+XBI/XALPHAI)) & -! * ZRHO00**XCEXVT + ZRAY = 0.5 * MOMG(ZALPHAI,ZNUI,1.) + ! + IF (HCLOUD(1:3) == 'ICE') THEN + ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) ! Computations for Columns (see ini_rain_ice_elec.f90) - ZVCOEF = 2.1E5 * MOMG(XALPHAI,XNUI, 3.285) / MOMG(XALPHAI,XNUI, 1.7) & - * ZRHO00**XCEXVT - ZLBI = (2.14E-3 * MOMG(XALPHAI,XNUI,1.7)) **0.588235 - - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 4)/PRHODREF(JI, JJ, JK) > XRTMIN_ELEC(4) .AND. & - PSVS(JI, JJ, JK, 4) /=0.) THEN - ZCONC (IV) = XFCI * PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,4) * & - MAX(0.05E6, -0.15319E6 - 0.021454E6 * & - ALOG(PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,4)))**3 - ZLAMBDA = ZLBI * (ZCONC(IV) / (PRHODREF(JI,JJ,JK) * & - PRS(JI,JJ,JK,4)))**0.588235 - ZRADIUS (IV) = ZRAY / ZLAMBDA - ZVIT (IV) = ZVCOEF * ZLAMBDA**(-1.585) * & !(-XDI) * & - PRHODREF(JI,JJ,JK)**(-XCEXVT) - END IF - ENDDO + ZVCOEF = 2.1E5 * MOMG(ZALPHAI,ZNUI, 3.285) / MOMG(ZALPHAI,ZNUI, 1.7) & + * ZRHO00**ZCEXVT + ZLBI = (2.14E-3 * MOMG(ZALPHAI,ZNUI,1.7)) **0.588235 + ! + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI, JJ, JK, 4)/PRHODREF(JI, JJ, JK) > XRTMIN_ELEC(4) .AND. & + PSVS(JI, JJ, JK, 4) /=0.) THEN + ZCONC(IV) = XFCI * PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,4) * & + MAX(0.05E6, -0.15319E6 - 0.021454E6 * & + ALOG(PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,4)))**3 + ZLAMBDA = ZLBI * (ZCONC(IV) / (PRHODREF(JI,JJ,JK) * & + PRS(JI,JJ,JK,4)))**0.588235 + ZRADIUS(IV) = ZRAY / ZLAMBDA + ZVIT(IV) = ZVCOEF * ZLAMBDA**(-1.585) * & !(-XDI) * & + PRHODREF(JI,JJ,JK)**(-ZCEXVT) + END IF + ENDDO + ELSE IF (HCLOUD == 'LIMA') THEN + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,4)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(4) .AND. & + ZCIT(JI,JJ,JK) > 0. .AND. PSVS(JI,JJ,JK,4) /= 0.) THEN + ZCONC(IV) = ZCIT(JI,JJ,JK) * PRHODREF(JI,JJ,JK) ! Number concentration (m-3) + ZLAMBDA = (XLBI * ZCIT(JI,JJ,JK) / PRS(JI,JJ,JK,4))**XLBEXI + ZRADIUS(IV) = ZRAY / ZLAMBDA + ! zvit = zwsedr / (r * rho_dref) + ZVIT(IV) = XFSEDRI * ZLAMBDA**(-XDI) * PRHODREF(JI,JJ,JK)**(-ZCEXVT) + END IF + ENDDO + END IF ! ! !* 4. PARAMETERS FOR SNOW @@ -425,22 +681,37 @@ SELECT CASE (ITYPE) ! CASE (5) ! - ZEXP1 = XEXSEDS - 1. - ZEXP2 = ZEXP1 - XCEXVT -! - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 5)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(5) .AND. & - PSVS(JI, JJ, JK, 5) /=0. ) THEN - ZLAMBDA = XLBS * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,5))**XLBEXS - ZRADIUS (IV) = 0.5 / ZLAMBDA - ZCONC (IV) = XCCS * ZLAMBDA**XCXS - ZVIT (IV) = XFSEDS * PRHODREF(JI,JJ,JK)**ZEXP2 & - * PRS(JI,JJ,JK,5)**ZEXP1 - END IF - ENDDO + IF ((HCLOUD(1:3) == 'ICE') .OR. (HCLOUD == 'LIMA' .AND. NMOM_S == 1)) THEN + ZEXP1 = ZEXSEDS - 1. + ZEXP2 = ZEXP1 - ZCEXVT +! + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,5)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(5) .AND. & + PSVS(JI,JJ,JK,5) /= 0. ) THEN + ZLAMBDA = ZLBS * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,5))**ZLBEXS + ZRADIUS(IV) = 0.5 / ZLAMBDA + ZCONC(IV) = ZCCS * ZLAMBDA**ZCXS + ZVIT(IV) = ZFSEDS * PRHODREF(JI,JJ,JK)**ZEXP2 & + * PRS(JI,JJ,JK,5)**ZEXP1 + END IF + ENDDO + ELSE IF (HCLOUD == 'LIMA' .AND. NMOM_S == 2) THEN + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,5)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(5) .AND. & + ZCST(JI,JJ,JK) > 0. .AND. PSVS(JI,JJ,JK,5) /= 0. ) THEN + ZLAMBDA = (ZLBS * ZCST(JI,JJ,JK) / PRS(JI,JJ,JK,5))**ZLBEXS + ZRADIUS(IV) = 1. / ZLAMBDA + ZCONC(IV) = ZCST(JI,JJ,JK) * PRHODREF(JI,JJ,JK) ! Number concentration (m-3) + ZVIT(IV) = ZFSEDS * ZLAMBDA**(-XDS) * PRHODREF(JI,JJ,JK)**(-ZCEXVT) + END IF + ENDDO + END IF ! ! !* 5. PARAMETERS FOR GRAUPEL @@ -448,22 +719,37 @@ SELECT CASE (ITYPE) ! CASE (6) ! - ZEXP1 = XEXSEDG - 1. - ZEXP2 = ZEXP1 - XCEXVT -! - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 6)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(6) .AND. & - PSVS(JI, JJ, JK, 6) /=0. ) THEN - ZLAMBDA = XLBG * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,6))**XLBEXG - ZRADIUS (IV) = 0.5 / ZLAMBDA - ZCONC (IV) = XCCG * ZLAMBDA**XCXG - ZVIT (IV) = XFSEDG * PRHODREF(JI,JJ,JK)**ZEXP2 & - * PRS(JI,JJ,JK,6)**ZEXP1 - END IF - ENDDO + IF ((HCLOUD(1:3) == 'ICE') .OR. (HCLOUD == 'LIMA' .AND. NMOM_G == 1)) THEN + ZEXP1 = ZEXSEDG - 1. + ZEXP2 = ZEXP1 - ZCEXVT +! + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,6)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(6) .AND. & + PSVS(JI,JJ,JK,6) /= 0. ) THEN + ZLAMBDA = ZLBG * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,6))**ZLBEXG + ZRADIUS(IV) = 0.5 / ZLAMBDA + ZCONC(IV) = ZCCG * ZLAMBDA**ZCXG + ZVIT(IV) = ZFSEDG * PRHODREF(JI,JJ,JK)**ZEXP2 & + * PRS(JI,JJ,JK,6)**ZEXP1 + END IF + ENDDO + ELSE IF (HCLOUD == 'LIMA' .AND. NMOM_G == 2) THEN + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,6)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(6) .AND. & + ZCGT(JI,JJ,JK) > 0. .AND. PSVS(JI,JJ,JK,6) /= 0. ) THEN + ZLAMBDA = (ZLBG * ZCGT(JI,JJ,JK) / PRS(JI,JJ,JK,6))**ZLBEXG + ZRADIUS(IV) = 1. / ZLAMBDA + ZCONC(IV) = ZCGT(JI,JJ,JK) * PRHODREF(JI,JJ,JK) ! Number concentration (m-3) + ZVIT(IV) = ZFSEDG * ZLAMBDA**(-XDG) * PRHODREF(JI,JJ,JK)**(-ZCEXVT) + END IF + ENDDO + END IF ! ! !* 6. PARAMETERS FOR HAIL @@ -471,23 +757,37 @@ SELECT CASE (ITYPE) ! CASE (7) ! - ZEXP1 = XEXSEDH - 1. - ZEXP2 = ZEXP1-XCEXVT - ZRAY = 0.5*MOMG(XALPHAH, XNUH, 1.) -! - DO IV = 1, IVALID - JI = IGRIDX(IV) - JJ = IGRIDY(IV) - JK = IGRIDZ(IV) - IF( PRS(JI, JJ, JK, 7)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(7) .AND. & - PSVS(JI, JJ, JK, 7) /=0. ) THEN - ZLAMBDA = XLBH * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,7))**XLBEXH - ZRADIUS (IV) = ZRAY / ZLAMBDA - ZCONC (IV) = XCCG * ZLAMBDA**XCXG - ZVIT (IV) = XFSEDH * PRHODREF(JI,JJ,JK)**ZEXP2 & - * PRS(JI,JJ,JK,7)**ZEXP1 - END IF - ENDDO + IF ((HCLOUD(1:3) == 'ICE') .OR. (HCLOUD == 'LIMA' .AND. NMOM_H == 1)) THEN + ZEXP1 = ZEXSEDH - 1. + ZEXP2 = ZEXP1 - ZCEXVT +! + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,7)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(7) .AND. & + PSVS(JI,JJ,JK,7) /= 0. ) THEN + ZLAMBDA = ZLBH * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,7))**ZLBEXH + ZRADIUS(IV) = 0.5 / ZLAMBDA + ZCONC(IV) = ZCCH * ZLAMBDA**ZCXH + ZVIT(IV) = ZFSEDH * PRHODREF(JI,JJ,JK)**ZEXP2 & + * PRS(JI,JJ,JK,7)**ZEXP1 + END IF + ENDDO + ELSE IF (HCLOUD == 'LIMA' .AND. NMOM_H == 2) THEN + DO IV = 1, IVALID + JI = IGRIDX(IV) + JJ = IGRIDY(IV) + JK = IGRIDZ(IV) + IF( PRS(JI,JJ,JK,7)/PRHODREF(JI,JJ,JK) > XRTMIN_ELEC(7) .AND. & + ZCHT(JI,JJ,JK) > 0. .AND. PSVS(JI,JJ,JK,7) /= 0. ) THEN + ZLAMBDA = (ZLBH * ZCHT(JI,JJ,JK) / PRS(JI,JJ,JK,7))**ZLBEXH + ZRADIUS(IV) = 1. / ZLAMBDA + ZCONC(IV) = ZCHT(JI,JJ,JK) * PRHODREF(JI,JJ,JK) ! Number concentration (m-3) + ZVIT(IV) = ZFSEDH * ZLAMBDA**(-XDH) * PRHODREF(JI,JJ,JK)**(-ZCEXVT) + END IF + ENDDO + END IF ! END SELECT ! @@ -552,8 +852,8 @@ DO IV = 1, IVALID ZQ = PQVS(JI,JJ,JK) / ZNC ZX = ZQ / (ZCQD * ZRADI * ZT(IV)) ! - IF(ZX /= 0. .AND. ABS(ZX) <= 20.0) THEN - IF( ABS(ZX) < 1.0E-15) THEN + IF (ZX /= 0. .AND. ABS(ZX) <= 20.0) THEN + IF (ABS(ZX) < 1.0E-15) THEN ZFXP = 1. ZFXN = 1. ELSE @@ -574,7 +874,7 @@ DO IV = 1, IVALID ! PQPIS(JI,JJ,JK) = PQPIS(JI,JJ,JK) - ZDELPI PQNIS(JI,JJ,JK) = PQNIS(JI,JJ,JK) - ZDELNI - PQVS(JI,JJ,JK) = PQVS(JI,JJ,JK) + XECHARGE * (ZDELPI - ZDELNI) + PQVS(JI,JJ,JK) = PQVS(JI,JJ,JK) + XECHARGE * (ZDELPI - ZDELNI) ENDIF ! ! @@ -620,7 +920,7 @@ DO IV = 1, IVALID ! PQPIS(JI,JJ,JK) = PQPIS(JI,JJ,JK) - ZDELPI PQNIS(JI,JJ,JK) = PQNIS(JI,JJ,JK) - ZDELNI - PQVS(JI,JJ,JK) = PQVS(JI,JJ,JK) + XECHARGE *(ZDELPI - ZDELNI) + PQVS(JI,JJ,JK) = PQVS(JI,JJ,JK) + XECHARGE * (ZDELPI - ZDELNI) END IF ENDDO ! diff --git a/src/MNH/ion_bound4drift.f90 b/src/MNH/ion_bound4drift.f90 index 0c2454557b2d446eddfcf6610549afcd8d3c904a..6dfe884eedc1c07e2be1e1dee0f17a6e4f003fb0 100644 --- a/src/MNH/ion_bound4drift.f90 +++ b/src/MNH/ion_bound4drift.f90 @@ -8,11 +8,12 @@ MODULE MODI_ION_BOUND4DRIFT ! INTERFACE ! - SUBROUTINE ION_BOUND4DRIFT (HLBCX,HLBCY,PEFIELDU,PEFIELDV,PSVT) + SUBROUTINE ION_BOUND4DRIFT (KRR, HLBCX,HLBCY,PEFIELDU,PEFIELDV,PSVT) -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU,PEFIELDV +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU,PEFIELDV ! END SUBROUTINE ION_BOUND4DRIFT ! @@ -22,7 +23,7 @@ END MODULE MODI_ION_BOUND4DRIFT ! ! ! #################################################################### - SUBROUTINE ION_BOUND4DRIFT (HLBCX,HLBCY,PEFIELDU,PEFIELDV,PSVT) + SUBROUTINE ION_BOUND4DRIFT (KRR, HLBCX,HLBCY,PEFIELDU,PEFIELDV,PSVT) ! #################################################################### ! !!**** *ION_BOUND4DRIFT* - routine to force the Lateral Boundary Conditions for @@ -73,9 +74,10 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU,PEFIELDV +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEFIELDU,PEFIELDV ! ! !* 0.2 declarations of local variables @@ -100,13 +102,13 @@ CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IF (LWEST_ll( ) .AND. HLBCX(1)=='OPEN') THEN ! WHERE ( PEFIELDU(IIB,:,:) <= 0. ) ! OUT(IN)FLOW for POS(NEG) IONS - PSVT(IIB-1,:,:,NSV_ELECBEG) = MAX( 2.*PSVT(IIB,:,:,NSV_ELECBEG) - & - PSVT(IIB+1,:,:,NSV_ELECBEG), XSVMIN(NSV_ELECBEG) ) - PSVT(IIB-1,:,:,NSV_ELECEND) = XCION_NEG_FW(IIB,:,:) ! Nb/kg + PSVT(IIB-1,:,:,1) = MAX( 2.*PSVT(IIB,:,:,1) - & + PSVT(IIB+1,:,:,1), XSVMIN(NSV_ELECBEG) ) + PSVT(IIB-1,:,:,KRR+1) = XCION_NEG_FW(IIB,:,:) ! Nb/kg ELSEWHERE ! IN(OUT)FLOW for NEG(POS) IONS - PSVT(IIB-1,:,:,NSV_ELECBEG) = XCION_POS_FW(IIB,:,:) ! Nb/kg - PSVT(IIB-1,:,:,NSV_ELECEND) = MAX( 2.*PSVT(IIB,:,:,NSV_ELECEND) - & - PSVT(IIB+1,:,:,NSV_ELECEND), XSVMIN(NSV_ELECEND) ) + PSVT(IIB-1,:,:,1) = XCION_POS_FW(IIB,:,:) ! Nb/kg + PSVT(IIB-1,:,:,KRR+1) = MAX( 2.*PSVT(IIB,:,:,KRR+1) - & + PSVT(IIB+1,:,:,KRR+1), XSVMIN(NSV_ELECEND) ) ENDWHERE END IF ! @@ -119,13 +121,13 @@ END IF IF (LEAST_ll( ) .AND. HLBCX(2)=='OPEN') THEN ! WHERE ( PEFIELDU(IIE+1,:,:) >= 0. ) ! OUT(IN)FLOW for POS(NEG) IONS - PSVT(IIE+1,:,:,NSV_ELECBEG) = MAX( 2.*PSVT(IIE,:,:,NSV_ELECBEG) - & - PSVT(IIE-1,:,:,NSV_ELECBEG), XSVMIN(NSV_ELECBEG) ) - PSVT(IIE+1,:,:,NSV_ELECEND) = XCION_NEG_FW(IIE,:,:) ! Nb/kg + PSVT(IIE+1,:,:,1) = MAX( 2.*PSVT(IIE,:,:,1) - & + PSVT(IIE-1,:,:,1), XSVMIN(NSV_ELECBEG) ) + PSVT(IIE+1,:,:,KRR+1) = XCION_NEG_FW(IIE,:,:) ! Nb/kg ELSEWHERE ! IN(OUT)FLOW for NEG(POS) IONS - PSVT(IIE+1,:,:,NSV_ELECBEG) = XCION_POS_FW(IIE,:,:) ! Nb/kg - PSVT(IIE+1,:,:,NSV_ELECEND) = MAX( 2.*PSVT(IIE,:,:,NSV_ELECEND) - & - PSVT(IIE-1,:,:,NSV_ELECEND), XSVMIN(NSV_ELECEND) ) + PSVT(IIE+1,:,:,1) = XCION_POS_FW(IIE,:,:) ! Nb/kg + PSVT(IIE+1,:,:,KRR+1) = MAX( 2.*PSVT(IIE,:,:,KRR+1) - & + PSVT(IIE-1,:,:,KRR+1), XSVMIN(NSV_ELECEND) ) ENDWHERE END IF ! @@ -138,13 +140,13 @@ END IF IF (LSOUTH_ll( ) .AND. HLBCY(1)=='OPEN') THEN ! WHERE ( PEFIELDV(:,IJB,:) <= 0. ) ! OUT(IN)FLOW for POS(NEG) IONS - PSVT(:,IJB-1,:,NSV_ELECBEG) = MAX( 2.*PSVT(:,IJB,:,NSV_ELECBEG) - & - PSVT(:,IJB+1,:,NSV_ELECBEG), XSVMIN(NSV_ELECBEG) ) - PSVT(:,IJB-1,:,NSV_ELECEND) = XCION_NEG_FW(:,IJB,:) ! Nb/kg + PSVT(:,IJB-1,:,1) = MAX( 2.*PSVT(:,IJB,:,1) - & + PSVT(:,IJB+1,:,1), XSVMIN(NSV_ELECBEG) ) + PSVT(:,IJB-1,:,KRR+1) = XCION_NEG_FW(:,IJB,:) ! Nb/kg ELSEWHERE ! IN(OUT)FLOW for NEG(POS) IONS - PSVT(:,IJB-1,:,NSV_ELECBEG) = XCION_POS_FW(:,IJB,:) ! Nb/kg - PSVT(:,IJB-1,:,NSV_ELECEND) = MAX( 2.*PSVT(:,IJB,:,NSV_ELECEND) - & - PSVT(:,IJB+1,:,NSV_ELECEND), XSVMIN(NSV_ELECEND) ) + PSVT(:,IJB-1,:,1) = XCION_POS_FW(:,IJB,:) ! Nb/kg + PSVT(:,IJB-1,:,KRR+1) = MAX( 2.*PSVT(:,IJB,:,KRR+1) - & + PSVT(:,IJB+1,:,KRR+1), XSVMIN(NSV_ELECEND) ) ENDWHERE END IF ! @@ -157,13 +159,13 @@ END IF IF (LNORTH_ll( ) .AND. HLBCY(2)=='OPEN') THEN ! WHERE ( PEFIELDV(:,IJE+1,:) >= 0. ) ! OUT(IN)FLOW for POS(NEG) IONS - PSVT(:,IJE+1,:,NSV_ELECBEG) = MAX( 2.*PSVT(:,IJE,:,NSV_ELECBEG) - & - PSVT(:,IJE-1,:,NSV_ELECBEG), XSVMIN(NSV_ELECBEG) ) - PSVT(:,IJE+1,:,NSV_ELECEND) = XCION_NEG_FW(:,IJE,:) ! Nb/kg + PSVT(:,IJE+1,:,1) = MAX( 2.*PSVT(:,IJE,:,1) - & + PSVT(:,IJE-1,:,1), XSVMIN(NSV_ELECBEG) ) + PSVT(:,IJE+1,:,KRR+1) = XCION_NEG_FW(:,IJE,:) ! Nb/kg ELSEWHERE ! IN(OUT)FLOW for NEG(POS) IONS - PSVT(:,IJE+1,:,NSV_ELECBEG) = XCION_POS_FW(:,IJE,:) ! Nb/kg - PSVT(:,IJE+1,:,NSV_ELECEND) = MAX( 2.*PSVT(:,IJE,:,NSV_ELECEND) - & - PSVT(:,IJE-1,:,NSV_ELECEND), XSVMIN(NSV_ELECEND) ) + PSVT(:,IJE+1,:,1) = XCION_POS_FW(:,IJE,:) ! Nb/kg + PSVT(:,IJE+1,:,KRR+1) = MAX( 2.*PSVT(:,IJE,:,KRR+1) - & + PSVT(:,IJE-1,:,KRR+1), XSVMIN(NSV_ELECEND) ) ENDWHERE END IF ! diff --git a/src/MNH/ion_drift.f90 b/src/MNH/ion_drift.f90 index 7d863c9182faea2b9a54f8ecbf6c2186e74c0578..338b34ea11e40c151585b0009ea41ccf135da4a2 100644 --- a/src/MNH/ion_drift.f90 +++ b/src/MNH/ion_drift.f90 @@ -9,8 +9,9 @@ INTERFACE ! - SUBROUTINE ION_DRIFT(PDRIFTP, PDRIFTM, PSVT, HLBCX, HLBCY) + SUBROUTINE ION_DRIFT(KRR, PDRIFTP, PDRIFTM, PSVT, HLBCX, HLBCY) ! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRIFTP, PDRIFTM REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT @@ -19,9 +20,9 @@ END SUBROUTINE ION_DRIFT END INTERFACE END MODULE MODI_ION_DRIFT ! -! ########################################################## - SUBROUTINE ION_DRIFT(PDRIFTP, PDRIFTM, PSVT, HLBCX, HLBCY) -! ########################################################## +! ############################################################### + SUBROUTINE ION_DRIFT(KRR, PDRIFTP, PDRIFTM, PSVT, HLBCX, HLBCY) +! ############################################################### ! !! PURPOSE !! ------- @@ -37,6 +38,7 @@ END MODULE MODI_ION_DRIFT !! M. Chong 01/2010 !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! C. Barthe 30/11/2022: change the indexes from nsv_elecbeg/nsv_elecend to 1-krr+1 ! !------------------------------------------------------------------------------- ! @@ -64,6 +66,7 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments ! +INTEGER, INTENT(IN) :: KRR ! Number of moist variableS CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRIFTP, PDRIFTM REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT @@ -123,22 +126,22 @@ CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) CALL CLEANLIST_ll(TZFIELDS_ll) ! ! specify lateral boundary ion mixing ratio -CALL ION_BOUND4DRIFT (HLBCX,HLBCY,XEFIELDU,XEFIELDV,PSVT) +CALL ION_BOUND4DRIFT (KRR,HLBCX,HLBCY,XEFIELDU,XEFIELDV,PSVT) ! -CALL ADD3DFIELD_ll( TZFIELDS_ll, PSVT(:,:,:,NSV_ELECBEG), 'ION_DRIFT::PSVT(:,:,:,NSV_ELECBEG)' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, PSVT(:,:,:,NSV_ELECEND), 'ION_DRIFT::PSVT(:,:,:,NSV_ELECEND)' ) +CALL ADD3DFIELD_ll( TZFIELDS_ll, PSVT(:,:,:,1), 'ION_DRIFT::PSVT(:,:,:,1)' ) +CALL ADD3DFIELD_ll( TZFIELDS_ll, PSVT(:,:,:,KRR+1), 'ION_DRIFT::PSVT(:,:,:,KRR+1)' ) CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) CALL CLEANLIST_ll(TZFIELDS_ll) ! ! specify upper boundary ion mixing ratio WHERE (XEFIELDW(:,:,IKE+1) .GE. 0.) ! Out(In)flow for positive (negative) ions - PSVT (:,:,IKE+1,NSV_ELECBEG) = MAX(2. * PSVT (:,:,IKE,NSV_ELECBEG) - & - PSVT (:,:,IKE-1,NSV_ELECBEG),XSVMIN(NSV_ELECBEG)) - PSVT (:,:,IKE+1,NSV_ELECEND) = XCION_NEG_FW(:,:,IKE+1) + PSVT (:,:,IKE+1,1) = MAX(2. * PSVT (:,:,IKE,1) - & + PSVT (:,:,IKE-1,1),XSVMIN(NSV_ELECBEG)) + PSVT (:,:,IKE+1,KRR+1) = XCION_NEG_FW(:,:,IKE+1) ELSE WHERE ! In(Out)flow for positive (negative) ions - PSVT (:,:,IKE+1,NSV_ELECBEG) = XCION_POS_FW(:,:,IKE+1) - PSVT (:,:,IKE+1,NSV_ELECEND) = MAX(2.* PSVT (:,:,IKE,NSV_ELECEND) - & - PSVT (:,:,IKE-1,NSV_ELECEND),XSVMIN(NSV_ELECEND)) + PSVT (:,:,IKE+1,1) = XCION_POS_FW(:,:,IKE+1) + PSVT (:,:,IKE+1,KRR+1) = MAX(2.* PSVT (:,:,IKE,KRR+1) - & + PSVT (:,:,IKE-1,KRR+1),XSVMIN(NSV_ELECEND)) END WHERE ! XEFIELDW(:,:,IKB-1) = XEFIELDW(:,:,IKB) @@ -152,17 +155,17 @@ XEFIELDW(:,:,IKE+1) = XEFIELDW(:,:,IKE) !* 3.1 positive ion source (drifting along E) ! ! x-component of div term -ZDRIFTX(:,:,:) = PSVT(:,:,:,NSV_ELECBEG) * XMOBIL_POS(:,:,:) +ZDRIFTX(:,:,:) = PSVT(:,:,:,1) * XMOBIL_POS(:,:,:) ZDRIFTX(:,:,:) = ZDRIFTX(:,:,:) * XEFIELDU(:,:,:) ZDRIFTX(:,:,:) = -MXM(ZDRIFTX(:,:,:)) ! Put components at flux sides ! ! y-component of div term -ZDRIFTY(:,:,:) = PSVT(:,:,:,NSV_ELECBEG) * XMOBIL_POS(:,:,:) +ZDRIFTY(:,:,:) = PSVT(:,:,:,1) * XMOBIL_POS(:,:,:) ZDRIFTY(:,:,:) = ZDRIFTY(:,:,:) * XEFIELDV(:,:,:) ZDRIFTY(:,:,:) = -MYM(ZDRIFTY(:,:,:)) ! Put components at flux sides ! ! z-component of div term -ZDRIFTZ(:,:,:) = PSVT(:,:,:,NSV_ELECBEG) * XMOBIL_POS(:,:,:) +ZDRIFTZ(:,:,:) = PSVT(:,:,:,1) * XMOBIL_POS(:,:,:) ZDRIFTZ(:,:,:) = ZDRIFTZ(:,:,:) * XEFIELDW(:,:,:) ZDRIFTZ(:,:,:) = -MZM(ZDRIFTZ(:,:,:)) ! Put components at flux sides ! @@ -178,17 +181,17 @@ CALL GDIV(HLBCX,HLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ,ZDRIFTX,ZDRIFTY,ZDRIFTZ,PDRIFTP) !* 3.2 negative ion source (drifting counter E) ! ! x-component of div term -ZDRIFTX(:,:,:) = PSVT(:,:,:,NSV_ELECEND) * XMOBIL_NEG(:,:,:) +ZDRIFTX(:,:,:) = PSVT(:,:,:,KRR+1) * XMOBIL_NEG(:,:,:) ZDRIFTX(:,:,:) = ZDRIFTX(:,:,:) * XEFIELDU(:,:,:) ZDRIFTX(:,:,:) = +MXM(ZDRIFTX(:,:,:)) ! Put components at flux sides ! ! y-component of div term -ZDRIFTY(:,:,:) = PSVT(:,:,:,NSV_ELECEND) * XMOBIL_NEG(:,:,:) +ZDRIFTY(:,:,:) = PSVT(:,:,:,KRR+1) * XMOBIL_NEG(:,:,:) ZDRIFTY(:,:,:) = ZDRIFTY(:,:,:) * XEFIELDV(:,:,:) ZDRIFTY(:,:,:) = +MYM(ZDRIFTY(:,:,:)) ! Put components at flux sides ! ! z-component of div term -ZDRIFTZ(:,:,:) = PSVT(:,:,:,NSV_ELECEND) * XMOBIL_NEG(:,:,:) +ZDRIFTZ(:,:,:) = PSVT(:,:,:,KRR+1) * XMOBIL_NEG(:,:,:) ZDRIFTZ(:,:,:) = ZDRIFTZ(:,:,:) * XEFIELDW(:,:,:) ZDRIFTZ(:,:,:) = +MZM(ZDRIFTZ(:,:,:)) ! Put components at flux sides diff --git a/src/MNH/ion_source_elec.f90 b/src/MNH/ion_source_elec.f90 new file mode 100644 index 0000000000000000000000000000000000000000..867fa29b1b05a54156333f17dc9c14dc7698084b --- /dev/null +++ b/src/MNH/ion_source_elec.f90 @@ -0,0 +1,136 @@ +! ########################### + MODULE MODI_ION_SOURCE_ELEC +! ########################### +! +INTERFACE + SUBROUTINE ION_SOURCE_ELEC (KTCOUNT, KRR, HLBCX, HLBCY, & + PRHODREF, PRHODJ, PRT, & + PSVT, PSVS, & + PEFIELDU, PEFIELDV, PEFIELDW) +! +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources +! +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PEFIELDU ! Electric field +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PEFIELDV ! components +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PEFIELDW ! along x, y and z +! +END SUBROUTINE ION_SOURCE_ELEC +END INTERFACE +END MODULE MODI_ION_SOURCE_ELEC +! +! ######################################################### + SUBROUTINE ION_SOURCE_ELEC (KTCOUNT, KRR, HLBCX, HLBCY, & + PRHODREF, PRHODJ, PRT, & + PSVT, PSVS, & + PEFIELDU, PEFIELDV, PEFIELDW) +! ######################################################### +!! +!!**** * - compute the ion source from drift motion and cosmic rays +!! +!! AUTHOR +!! ------ +!! Christelle Barthe * LAERO * +!! extracted from resolved_elecn in MNH versions < 5-5-0 +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/02/2022 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use mode_budget, only: Budget_store_add +USE MODE_ELEC_ll +! +use modd_budget, only: lbudget_sv, NBUDGET_SV1, tbudgets +USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND ! Scalar variables for budgets +USE MODD_ELEC_DESCR, ONLY: XECHARGE +USE MODD_ELEC_n, ONLY: XIONSOURCEFW +! +USE MODI_ION_DRIFT +USE MODI_TO_ELEC_FIELD_n +! +IMPLICIT NONE +! +!* 0.1 Declaration of dummy arguments +! +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources +! +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PEFIELDU ! Electric field +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PEFIELDV ! components +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PEFIELDW ! along x, y and z +! +! +!* 0.2 Declaration of local variables +! +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) :: ZDRIFTP ! positive ion drift +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) :: ZDRIFTN ! negative ion drift +! +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE ELECTRIC FIELD AT MASS POINTS +! ----------------------------------------- +! +PSVT(:,:,:,1) = XECHARGE * PSVT(:,:,:,1) ! 1/kg --> C/kg +PSVT(:,:,:,KRR+1) = -XECHARGE * PSVT(:,:,:,KRR+1) +! +CALL TO_ELEC_FIELD_n (PRT, PSVT(:,:,:,1:KRR+1), PRHODJ, & + KTCOUNT, KRR, & + PEFIELDU, PEFIELDV, PEFIELDW ) +! +PSVT(:,:,:,1) = PSVT(:,:,:,1) / XECHARGE ! back to 1/kg +PSVT(:,:,:,KRR+1) = -PSVT(:,:,:,KRR+1) / XECHARGE +! +!------------------------------------------------------------------------------- +! +!* 2. ION SOURCE FROM DRIFT MOTION AND COSMIC RAYS +! -------------------------------------------- +! +!* 2.1 Compute source term from -/+(Div (N.mu E)) at mass points, +! N positive or negative ion number per kg of air (= PSVT) +! This is a contribution of drift motion to Source PSVS for ions +! in 1/(kg.s) +! +!CALL MYPROC_ELEC_ll (IPROC) ! CB : utile ? +! +CALL ION_DRIFT(KRR, ZDRIFTP, ZDRIFTN, PSVT, HLBCX, HLBCY) +! +PSVS(:,:,:,1) = PSVS(:,:,:,1) + ZDRIFTP(:,:,:) +PSVS(:,:,:,KRR+1) = PSVS(:,:,:,KRR+1) + ZDRIFTN(:,:,:) +! +if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg), 'DRIFT', zdriftp(:, :, :) * prhodj(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend), 'DRIFT', zdriftn(:, :, :) * prhodj(:, :, :) ) +end if +! +! +!* 2.2 Add Cosmic Ray source +! +PSVS(:,:,:,1) = PSVS(:,:,:,1) + XIONSOURCEFW(:,:,:) / PRHODREF(:,:,:) +PSVS(:,:,:,KRR+1) = PSVS(:,:,:,KRR+1) + XIONSOURCEFW(:,:,:) / PRHODREF(:,:,:) +! +if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg), 'CORAY', xionsourcefw(:,:,:)/prhodref(:,:,:) * prhodj(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend), 'CORAY', xionsourcefw(:,:,:)/prhodref(:,:,:) * prhodj(:, :, :) ) +end if +! +END SUBROUTINE ION_SOURCE_ELEC diff --git a/src/MNH/modd_elec_param.f90 b/src/MNH/modd_elec_param.f90 index d05c1fac6cab10b75e14a3d3722dec7894712f37..c28725b3b8c40eebf2a1e8dc9b9dc4d6cb0afbab 100644 --- a/src/MNH/modd_elec_param.f90 +++ b/src/MNH/modd_elec_param.f90 @@ -18,7 +18,7 @@ !! PURPOSE !! ------- ! The purpose of this declarative module is to declare some precomputed -! electrical parameters directly used in routine RAIN_ICE_ELEC. +! electrical parameters directly used in routines related to cloud electricity !! !!** IMPLICIT ARGUMENTS !! ------------------ @@ -35,131 +35,132 @@ !! MODIFICATIONS !! ------------- !! Original 14/11/02 +!! C. Barthe 31/01/2022 add XFQUPDNCI +!! C. Barthe 07/06/2022 add parameters for charge sedimentation in LIMA +!! C. Barthe 28/03/2023 add parameters for sedimentation of cloud droplets charge +!! C. Barthe 05/07/2023 new data structures for PHYEX - for sedimentation in ICE3 !! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -REAL, SAVE :: XCOEF_RQ_V, XCOEF_RQ_C, & ! Constants for proportionality - XCOEF_RQ_R, XCOEF_RQ_I, & ! between mass transfer and - XCOEF_RQ_S, XCOEF_RQ_G, & ! charge transfer - XCOEF_RQ_H -! -REAL :: XEGMIN, XEGMAX, XESMIN, XESMAX, & ! Max and min values for - XEIMIN, XEIMAX, XECMIN, XECMAX, & ! e_x in q=e_x D^f_x - XERMIN, XERMAX, XEHMIN, XEHMAX -! -REAL, SAVE :: XQHON ! Constant for spontaneous freezing of droplets if T<-35° -! -REAL, SAVE :: XFQSEDR, XEXQSEDR, & ! Constant for sedimentation of rain - XFQSEDI, XEXQSEDI, & ! ice - XFQSEDS, XEXQSEDS, & ! snow - XFQSEDG, XEXQSEDG, & ! graupel - XFQSEDH, XEXQSEDH ! hail -REAL, SAVE :: XFCI ! Constant for sedimentation of the mixing ratio of ice - ! which the computation is modified in regard of rain_ice.f90 -! -REAL, SAVE :: XQSRIMCG, XEXQSRIMCG ! Constant for riming of cloud droplets - ! on snow -REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XGAMINC_RIM3 -! -REAL, SAVE :: XQRCFRIG, XEXQRCFRIG ! Constant for contact freezing between - ! raindrops and pristine ice -REAL, SAVE :: XFQRACCS ! Constant in RACCS -! -REAL, SAVE :: XFQIAGGSBH, & ! Constant for IAGGS charging - XFQIAGGSBG, XEXFQIAGGSBG, & ! process for HELFA, GARDI, - XFQIAGGSBS, & ! SAUND and TAKAH - XFQIAGGSBT1, XFQIAGGSBT2, XFQIAGGSBT3 -! -REAL, SAVE :: XLBQRACCS1, XLBQRACCS2, XLBQRACCS3 ! Integral of normalization -REAL, SAVE :: XLBQSACCRG1, XLBQSACCRG2, XLBQSACCRG3 ! in accretion of raindrops - ! on snow process +USE MODD_PARAMETERS, ONLY: JPMODELMAX +! +IMPLICIT NONE +! +SAVE +! +REAL :: XCOEF_RQ_V, XCOEF_RQ_C, & ! Constants for proportionality + XCOEF_RQ_R, XCOEF_RQ_I, & ! between mass transfer and + XCOEF_RQ_S, XCOEF_RQ_G, & ! charge transfer + XCOEF_RQ_H +! +REAL :: XQHON ! Constant for spontaneous freezing of droplets if T<-35° +! +REAL, DIMENSION(:), ALLOCATABLE :: XFQSED ! Constant for sedimentation of + ! electric charge in LIMA +REAL, DIMENSION(:), ALLOCATABLE :: XDQ ! Exponent for sedimentation of + ! electric charge in LIMA +REAL :: XFQUPDNCI ! constant used to update e_i for sedimentation where + ! N_i follows McFarquhar and Heysmfield (1997) +! +REAL :: XQSRIMCG, XEXQSRIMCG ! Constant for riming of cloud droplets + ! on snow +REAL, DIMENSION(:), ALLOCATABLE :: XGAMINC_RIM3 +! +REAL :: XQRCFRIG, XEXQRCFRIG ! Constant for contact freezing between + ! raindrops and pristine ice +REAL :: XFQRACCS ! Constant in RACCS +! +REAL :: XFQIAGGSBH, & ! Constant for IAGGS charging + XFQIAGGSBG, XEXFQIAGGSBG, & ! process for HELFA, GARDI, + XFQIAGGSBS, & ! SAUND and TAKAH + XFQIAGGSBT1, XFQIAGGSBT2, XFQIAGGSBT3 +! +REAL :: XLBQRACCS1, XLBQRACCS2, XLBQRACCS3 ! Integral of normalization +REAL :: XLBQSACCRG1, XLBQSACCRG2, XLBQSACCRG3 ! in accretion of raindrops + ! on snow process ! -REAL, DIMENSION(:,:), SAVE, ALLOCATABLE & ! Normalized kernel for - :: XKER_Q_RACCS, XKER_Q_RACCSS, XKER_Q_SACCRG ! RACCS, RACCSS, SACCRG +REAL, DIMENSION(:,:), ALLOCATABLE & ! Normalized kernel for + :: XKER_Q_RACCS, XKER_Q_RACCSS, XKER_Q_SACCRG ! RACCS, RACCSS, SACCRG ! -REAL, SAVE :: XFQSDRYG, XFQSDRYGB, XFQRDRYG ! Constant in SDRYG and RDRYG +REAL :: XFQSDRYG, XFQSDRYGB, XFQRDRYG ! Constant in SDRYG and RDRYG ! ! charge separation ! -REAL, DIMENSION(:,:), SAVE, ALLOCATABLE :: XKER_Q_LIMSG -REAL, DIMENSION(:,:), SAVE, ALLOCATABLE & - :: XKER_Q_SDRYGB, XKER_Q_SDRYGB1, XKER_Q_SDRYGB2 +REAL, DIMENSION(:,:), ALLOCATABLE :: XKER_Q_LIMSG +REAL, DIMENSION(:,:), ALLOCATABLE :: XKER_Q_SDRYGB, XKER_Q_SDRYGB1, XKER_Q_SDRYGB2 ! ! Helsdon-Farley ! -REAL :: XHIDRYG ! Constant charge separated -REAL :: XHSDRYG ! Constant charge separated -REAL, SAVE :: XLBQSDRYGB4H, XLBQSDRYGB5H, XLBQSDRYGB6H ! Constants in QIDRYGB -REAL, SAVE :: XFQSDRYGBH ! +REAL :: XHIDRYG ! Constant charge separated +REAL :: XHSDRYG ! Constant charge separated +REAL :: XLBQSDRYGB4H, XLBQSDRYGB5H, XLBQSDRYGB6H ! Constants in QIDRYGB +REAL :: XFQSDRYGBH ! ! ! Gardiner ! -REAL, SAVE :: XLWCC ! LWC critic in Gardiner NI charging -REAL, SAVE :: XFQIDRYGBG, XLBQIDRYGBG ! Constants in QIDRYGB -REAL, SAVE :: XFQSDRYGBG ! Constants in QSDRYGB -REAL, SAVE :: XLBQSDRYGB4G, XLBQSDRYGB5G, XLBQSDRYGB6G ! +REAL :: XLWCC ! LWC critic in Gardiner NI charging +REAL :: XFQIDRYGBG, XLBQIDRYGBG ! Constants in QIDRYGB +REAL :: XFQSDRYGBG ! Constants in QSDRYGB +REAL :: XLBQSDRYGB4G, XLBQSDRYGB5G, XLBQSDRYGB6G ! ! ! Saunders ! -REAL, SAVE :: XIMP, XINP, XIKP, & ! Parameters m, n and k - XIMN, XINN, XIKN, & ! for the NI processes - XSMP, XSNP, XSKP, & ! following - XSMN, XSNN, XSKN ! Saunders et al. (1991) -REAL, SAVE :: XFQIAGGSP, XFQIAGGSN, & ! Auxiliary parameters - XFQIDRYGBSP, XFQIDRYGBSN, & ! containing MOMG function - XLBQSDRYGB1SP, XLBQSDRYGB1SN, & - XLBQSDRYGB2SP, XLBQSDRYGB2SN, & - XLBQSDRYGB3SP, XLBQSDRYGB3SN, & - XAIGAMMABI -REAL, SAVE :: XIKP_TAK, XIKN_TAK, XSKP_TAK, XSKN_TAK ! Using Takahashi charge -REAL, SAVE :: XFQIAGGSP_TAK, XFQIAGGSN_TAK, XFQIDRYGBSP_TAK, XFQIDRYGBSN_TAK -REAL, SAVE :: XVSCOEF, XVGCOEF -REAL, SAVE :: XFQIDRYGBS, XLBQIDRYGBS ! Constants in QIDRYGB -REAL, SAVE :: XFQSDRYGBS ! Constants in QSDRYGB -REAL, SAVE :: XLBQSDRYGB1S, XLBQSDRYGB2S ! +REAL :: XIMP, XINP, XIKP, & ! Parameters m, n and k + XIMN, XINN, XIKN, & ! for the NI processes + XSMP, XSNP, XSKP, & ! following + XSMN, XSNN, XSKN ! Saunders et al. (1991) +REAL :: XFQIAGGSP, XFQIAGGSN, & ! Auxiliary parameters + XFQIDRYGBSP, XFQIDRYGBSN, & ! containing MOMG function + XLBQSDRYGB1SP, XLBQSDRYGB1SN, & + XLBQSDRYGB2SP, XLBQSDRYGB2SN, & + XLBQSDRYGB3SP, XLBQSDRYGB3SN, & + XAIGAMMABI +REAL :: XIKP_TAK, XIKN_TAK, XSKP_TAK, XSKN_TAK ! Using Takahashi charge +REAL :: XFQIAGGSP_TAK, XFQIAGGSN_TAK, XFQIDRYGBSP_TAK, XFQIDRYGBSN_TAK +REAL :: XVSCOEF, XVGCOEF +REAL :: XFQIDRYGBS, XLBQIDRYGBS ! Constants in QIDRYGB +REAL :: XFQSDRYGBS ! Constants in QSDRYGB +REAL :: XLBQSDRYGB1S, XLBQSDRYGB2S ! ! ! Takahashi ! -INTEGER, SAVE :: NIND_TEMP ! number of indexes for temperature -INTEGER, SAVE :: NIND_LWC ! number of indexes for liquid water content -REAL, DIMENSION(:,:), SAVE, ALLOCATABLE :: XMANSELL ! F(LWC, T) for Takahashi(1978) /Mansell -REAL, DIMENSION(:,:), SAVE, ALLOCATABLE :: XSAUNDER ! F(LWC, T) for SAUN1/SAUN2, BSMP1/BSMP2 -REAL, DIMENSION(:,:), SAVE, ALLOCATABLE :: XTAKA_TM ! F(LWC, T) for Takahashi/Tsenova and Mitzeva +INTEGER :: NIND_TEMP ! number of indexes for temperature +INTEGER :: NIND_LWC ! number of indexes for liquid water content +REAL, DIMENSION(:,:), ALLOCATABLE :: XMANSELL ! F(LWC, T) for Takahashi(1978) /Mansell +REAL, DIMENSION(:,:), ALLOCATABLE :: XSAUNDER ! F(LWC, T) for SAUN1/SAUN2, BSMP1/BSMP2 +REAL, DIMENSION(:,:), ALLOCATABLE :: XTAKA_TM ! F(LWC, T) for Takahashi/Tsenova and Mitzeva ! -REAL, SAVE :: XFQIDRYGBT1, XFQIDRYGBT2, XFQIDRYGBT3, & ! IDRYGB - XFQSDRYGBT1, XFQSDRYGBT2, XFQSDRYGBT3, & ! SDRYGB - XFQSDRYGBT4, XFQSDRYGBT5, XFQSDRYGBT6, & ! SDRYGB - XFQSDRYGBT7, XFQSDRYGBT8, XFQSDRYGBT9, & ! SDRYGB - XFQSDRYGBT10, XFQSDRYGBT11, XFQSDRYGBT12 ! SDRYGB +REAL :: XFQIDRYGBT1, XFQIDRYGBT2, XFQIDRYGBT3, & ! IDRYGB + XFQSDRYGBT1, XFQSDRYGBT2, XFQSDRYGBT3, & ! SDRYGB + XFQSDRYGBT4, XFQSDRYGBT5, XFQSDRYGBT6, & ! SDRYGB + XFQSDRYGBT7, XFQSDRYGBT8, XFQSDRYGBT9, & ! SDRYGB + XFQSDRYGBT10, XFQSDRYGBT11, XFQSDRYGBT12 ! SDRYGB ! -REAL, SAVE :: XLBQRDRYG1, XLBQRDRYG2, XLBQRDRYG3 ! Integral of normalization in -REAL, SAVE :: XLBQSDRYG1, XLBQSDRYG2, XLBQSDRYG3 ! the accretion of graupel on +REAL :: XLBQRDRYG1, XLBQRDRYG2, XLBQRDRYG3 ! Integral of normalization in +REAL :: XLBQSDRYG1, XLBQSDRYG2, XLBQSDRYG3 ! the accretion of graupel on ! raindrop and snow process ! -REAL, DIMENSION(:,:), SAVE, ALLOCATABLE & +REAL, DIMENSION(:,:), ALLOCATABLE & :: XKER_Q_SDRYG, XKER_Q_RDRYG ! Normalized kernel for SDRYG and RDRYG ! -REAL, SAVE :: XFQUPDC, XFQUPDR, XFQUPDI,& ! Update Q=f(D) - XEXFQUPDI, XFQUPDS, XFQUPDG, XFQUPDH -! -REAL, SAVE :: XQREVAV1, XQREVAV2 ! Raindrops evaporation +REAL :: XQREVAV1, XQREVAV2 ! Raindrops evaporation ! ! Add variables to limit the exchanged charge ! -REAL, SAVE :: XAUX_LIM -REAL, SAVE :: XAUX_LIM1, XAUX_LIM2, XAUX_LIM3 +REAL :: XAUX_LIM +REAL :: XAUX_LIM1, XAUX_LIM2, XAUX_LIM3 ! ! ! Inductive charging process ! -REAL, SAVE :: XCOLCG_IND ! collision effiency -REAL, SAVE :: XEBOUND ! rebound efficiency -REAL, SAVE :: XALPHA_IND ! fraction of droplets with grazing trajectories -REAL, SAVE :: XCOS_THETA ! average cosine of the angle of rebounding collision -REAL, SAVE :: XIND1, XIND2, XIND3 +REAL :: XCOLCG_IND ! collision effiency +REAL :: XEBOUND ! rebound efficiency +REAL :: XALPHA_IND ! fraction of droplets with grazing trajectories +REAL :: XCOS_THETA ! average cosine of the angle of rebounding collision +REAL :: XIND1, XIND2, XIND3 ! ! lightning ! @@ -168,4 +169,98 @@ REAL :: XFQLIGHTC, XFQLIGHTR, XFQLIGHTI, & REAL :: XEXQLIGHTR, XEXQLIGHTI, & XEXQLIGHTS, XEXQLIGHTG, XEXQLIGHTH ! Exponent for charge redistribution ! -END MODULE MODD_ELEC_PARAM +! The following variables must be declared with a derived type to match with PHYEX requirements +TYPE ELEC_PARAM_t + REAL :: XFCI ! Constant for sedimentation of the mixing ratio of ice + ! which the computation is modified in regard of rain_ice.f90 + ! + REAL :: XFQSEDC, XEXQSEDC, & ! Constant for sedimentation of cloud droplets + XFQSEDR, XEXQSEDR, & ! rain + XFQSEDI, XEXQSEDI, & ! ice + XFQSEDS, XEXQSEDS, & ! snow + XFQSEDG, XEXQSEDG, & ! graupel + XFQSEDH, XEXQSEDH ! hail + ! + REAL :: XEGMIN, XEGMAX, XESMIN, XESMAX, & ! Max and min values for + XEIMIN, XEIMAX, XECMIN, XECMAX, & ! e_x in q=e_x D^f_x + XERMIN, XERMAX, XEHMIN, XEHMAX + ! + REAL :: XFQUPDC, XFQUPDR, XFQUPDI,& ! Update Q=f(D) + XEXFQUPDI, XFQUPDS, XFQUPDG, XFQUPDH +END TYPE ELEC_PARAM_t +! +TYPE(ELEC_PARAM_t), SAVE, TARGET :: ELEC_PARAM +! +REAL, POINTER :: XFCI => NULL(), & + XFQSEDC => NULL(), & + XEXQSEDC => NULL(), & + XFQSEDR => NULL(), & + XEXQSEDR => NULL(), & + XFQSEDI => NULL(), & + XEXQSEDI => NULL(), & + XFQSEDS => NULL(), & + XEXQSEDS => NULL(), & + XFQSEDG => NULL(), & + XEXQSEDG => NULL(), & + XFQSEDH => NULL(), & + XEXQSEDH => NULL(), & + XEGMIN => NULL(), & + XEGMAX => NULL(), & + XESMIN => NULL(), & + XESMAX => NULL(), & + XEIMIN => NULL(), & + XEIMAX => NULL(), & + XECMIN => NULL(), & + XECMAX => NULL(), & + XERMIN => NULL(), & + XERMAX => NULL(), & + XEHMIN => NULL(), & + XEHMAX => NULL(), & + XFQUPDC => NULL(), & + XFQUPDR => NULL(), & + XFQUPDI => NULL(), & + XEXFQUPDI => NULL(),& + XFQUPDS => NULL(), & + XFQUPDG => NULL(), & + XFQUPDH => NULL() +! +CONTAINS +! +SUBROUTINE ELEC_PARAM_ASSOCIATE() + IMPLICIT NONE + ! + XFCI => ELEC_PARAM%XFCI + XFQSEDC => ELEC_PARAM%XFQSEDC + XEXQSEDC => ELEC_PARAM%XEXQSEDC + XFQSEDR => ELEC_PARAM%XFQSEDR + XEXQSEDR => ELEC_PARAM%XEXQSEDR + XFQSEDI => ELEC_PARAM%XFQSEDI + XEXQSEDI => ELEC_PARAM%XEXQSEDI + XFQSEDS => ELEC_PARAM%XFQSEDS + XEXQSEDS => ELEC_PARAM%XEXQSEDS + XFQSEDG => ELEC_PARAM%XFQSEDG + XEXQSEDG => ELEC_PARAM%XEXQSEDG + XFQSEDH => ELEC_PARAM%XFQSEDH + XEXQSEDH => ELEC_PARAM%XEXQSEDH + XEGMIN => ELEC_PARAM%XEGMIN + XEGMAX => ELEC_PARAM%XEGMAX + XESMIN => ELEC_PARAM%XESMIN + XESMAX => ELEC_PARAM%XESMAX + XEIMIN => ELEC_PARAM%XEIMIN + XEIMAX => ELEC_PARAM%XEIMAX + XECMIN => ELEC_PARAM%XECMIN + XECMAX => ELEC_PARAM%XECMAX + XERMIN => ELEC_PARAM%XERMIN + XERMAX => ELEC_PARAM%XERMAX + XEHMIN => ELEC_PARAM%XEHMIN + XEHMAX => ELEC_PARAM%XEHMAX + XFQUPDC => ELEC_PARAM%XFQUPDC + XFQUPDR => ELEC_PARAM%XFQUPDR + XFQUPDI => ELEC_PARAM%XFQUPDI + XEXFQUPDI => ELEC_PARAM%XEXFQUPDI + XFQUPDS => ELEC_PARAM%XFQUPDS + XFQUPDG => ELEC_PARAM%XFQUPDG + XFQUPDH => ELEC_PARAM%XFQUPDH +END SUBROUTINE ELEC_PARAM_ASSOCIATE +! +END MODULE MODD_ELEC_PARAM diff --git a/src/MNH/mode_elec_beard_effect.f90 b/src/MNH/mode_elec_beard_effect.f90 new file mode 100644 index 0000000000000000000000000000000000000000..b9330bee7720637952c580797a424852cca46ceb --- /dev/null +++ b/src/MNH/mode_elec_beard_effect.f90 @@ -0,0 +1,271 @@ +! +MODULE MODE_ELEC_BEARD_EFFECT +! +IMPLICIT NONE +CONTAINS +! +! ################################################################### + SUBROUTINE ELEC_BEARD_EFFECT(D, KID, OSEDIM, PT, PRHODREF, & + PRX, PQX, PEFIELDW, PLBDA, PBEARDCOEF) +! #################################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the effect of the electric field +!! on the terminal velocity of hydrometeors. +!! +!! METHOD +!! ------ +!! From Beard, K. V., 1980: The Effects of Altitude and Electrical Force on +!! the Terminal Velocity of Hydrometeors. J. Atmos. Sci., 37, 1363–1374, +!! https://doi.org/10.1175/1520-0469(1980)037<1363:TEOAAE>2.0.CO;2. +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * LAERO * +!! C. Barthe * LAERO * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/08/2013 first coded in rain_ice_elec +!! C. Barthe 01/06/2023 : externalize the code to use it with ICE3 and LIMA +!! C. Barthe 08/06/2023 : correction by 10-5 of the dynamic viscosity of air +!! (unecessary for eta0/eta but necessary for Re0) +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XG, XRD, XP00, XTT +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_ELEC_DESCR, ONLY: XRTMIN_ELEC +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_PARAM_LIMA, ONLY: XALPHAC_L=>XALPHAC, XNUC_L=>XNUC, XALPHAR_L=>XALPHAR, XNUR_L=>XNUR, & + XALPHAI_L=>XALPHAI, XNUI_L=>XNUI, XALPHAS_L=>XALPHAS, XNUS_L=>XNUS, & + XALPHAG_L=>XALPHAG, XNUG_L=>XNUG, & + XCEXVT_L=>XCEXVT +USE MODD_PARAM_LIMA_COLD, ONLY: XBI_L=>XBI, XC_I_L=>XC_I, XDI_L=>XDI, & + XBS_L=>XBS, XCS_L=>XCS, XDS_L=>XDS +USE MODD_PARAM_LIMA_MIXED,ONLY: XBG_L=>XBG, XCG_L=>XCG, XDG_L=>XDG, & + XBH_L=>XBH, XCH_L=>XCH, XDH_L=>XDH, & + XALPHAH_L=>XALPHAH, XNUH_L=>XNUH +USE MODD_PARAM_LIMA_WARM, ONLY: XBR_L=>XBR, XCR_L=>XCR, XDR_L=>XDR, & + XBC_L=>XBC, XCC_L=>XCC, XDC_L=>XDC +USE MODD_PARAM_n, ONLY: CCLOUD +USE MODD_RAIN_ICE_DESCR_n,ONLY: XALPHAC_I=>XALPHAC, XNUC_I=>XNUC, XALPHAR_I=>XALPHAR, XNUR_I=>XNUR, & + XALPHAI_I=>XALPHAI, XNUI_I=>XNUI, XALPHAS_I=>XALPHAS, XNUS_I=>XNUS, & + XALPHAG_I=>XALPHAG, XNUG_I=>XNUG, XALPHAH_I=>XALPHAH, XNUH_I=>XNUH, & + XBC_I=>XBC, XCC_I=>XCC, XDC_I=>XDC, & + XBR_I=>XBR, XCR_I=>XCR, XDR_I=>XDR, & + XBI_I=>XBI, XC_I_I=>XC_I, XDI_I=>XDI, & + XBS_I=>XBS, XCS_I=>XCS, XDS_I=>XDS, & + XBG_I=>XBG, XCG_I=>XCG, XDG_I=>XDG, & + XBH_I=>XBH, XCH_I=>XCH, XDH_I=>XDH, & + XCEXVT_I=>XCEXVT +USE MODD_REF, ONLY: XTHVREFZ +! +USE MODI_MOMG +! +USE MODE_TOOLS_ll, ONLY: GET_INDICE_ll +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D +INTEGER, INTENT(IN) :: KID ! Hydrometeor ID +LOGICAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: OSEDIM ! if T, compute the sedim. proc. +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRX ! m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PQX ! Elec. charge density source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEFIELDW ! Vertical component of the electric field +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLBDA ! Slope param. of the distribution +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PBEARDCOEF ! Beard coefficient +! +!* 0.2 Declarations of local variables +! +INTEGER :: JIJ, JK ! loop indexes +INTEGER :: IIJB, IIJE, IKTB, IKTE +REAL :: ZCEXVT, ZBX, ZCX, ZDX, ZALPHAX, ZNUX +REAL :: ZRE0 +REAL :: ZETA0 +REAL :: ZVX +REAL :: ZK +REAL :: ZCOR00, ZRHO00 +REAL :: ZT ! Temperature (C) +REAL :: ZCOR ! To remove the Foote-duToit correction +REAL :: ZF0, ZF1 ! Coef. in Beard's equation +real, dimension(D%NIJT,D%NKT) :: zreynolds +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE USEFULL PARAMETERS +! -------------------------- +! +IKTB = D%NKTB +IKTE = D%NKTE +IIJB = D%NIJB +IIJE = D%NIJE +! +!* 1.1 Select the right parameters +! --> depend on the microphysics scheme and the hydrometeor species +! +IF (CCLOUD(1:3) == 'ICE') THEN + ZCEXVT = XCEXVT_I + ! + IF (KID == 2) THEN + ZBX = XBC_I + ZCX = XCC_I + ZDX = XDC_I + ZALPHAX = XALPHAC_I + ZNUX = XNUC_I + ELSE IF (KID == 3) THEN + ZBX = XBR_I + ZCX = XCR_I + ZDX = XDR_I + ZALPHAX = XALPHAR_I + ZNUX = XNUR_I + ELSE IF (KID == 4) THEN + ! values for columns are used to be consistent with the McF&H formula + ZBX = 1.7 + ZCX = 2.1E5 + ZDX = 1.585 + ZALPHAX = XALPHAI_I + ZNUX = XNUI_I + ELSE IF (KID == 5) THEN + ZBX = XBS_I + ZCX = XCS_I + ZDX = XDS_I + ZALPHAX = XALPHAS_I + ZNUX = XNUS_I + ELSE IF (KID == 6) THEN + ZBX = XBG_I + ZCX = XCG_I + ZDX = XDG_I + ZALPHAX = XALPHAG_I + ZNUX = XNUG_I + ELSE IF (KID == 7) THEN + ZBX = XBH_I + ZCX = XCH_I + ZDX = XDH_I + ZALPHAX = XALPHAH_I + ZNUX = XNUH_I + END IF +ELSE IF (CCLOUD == 'LIMA') THEN + ZCEXVT = XCEXVT_L + ! + IF (KID == 2) THEN + ZBX = XBC_L + ZCX = XCC_L + ZDX = XDC_L + ZALPHAX = XALPHAC_L + ZNUX = XNUC_L + ELSE IF (KID == 3) THEN + ZBX = XBR_L + ZCX = XCR_L + ZDX = XDR_L + ZALPHAX = XALPHAR_L + ZNUX = XNUR_L + ELSE IF (KID == 4) THEN + ZBX = 1.7 + ZCX = 2.1E5 + ZDX = 1.585 + ZALPHAX = XALPHAI_L + ZNUX = XNUI_L + ELSE IF (KID == 5) THEN + ZBX = XBS_L + ZCX = XCS_L + ZDX = XDS_L + ZALPHAX = XALPHAS_L + ZNUX = XNUS_L + ELSE IF (KID == 6) THEN + ZBX = XBG_L + ZCX = XCG_L + ZDX = XDG_L + ZALPHAX = XALPHAG_L + ZNUX = XNUG_L + ELSE IF (KID == 7) THEN + ZBX = XBH_L + ZCX = XCH_L + ZDX = XDH_L + ZALPHAX = XALPHAH_L + ZNUX = XNUH_L + END IF + ! +END IF +! +!* 1.2 Parameters from Table 1 in Beard (1980) +! +! Reference value of the dynamic viscosity of air +ZETA0 = (1.718E-5 + 0.0049E-5 * (XTHVREFZ(IKTB) - XTT)) +! +ZRHO00 = XP00 / (XRD * XTHVREFZ(IKTB)) +ZCOR00 = ZRHO00**ZCEXVT +! +! (rho_0 / eta_0) * (v * lambda^d) +ZVX = (ZRHO00 / ZETA0) * ZCX * MOMG(ZALPHAX,ZNUX,ZBX+ZDX) / MOMG(ZALPHAX,ZNUX,ZBX) +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE VELOCITY ADJUSTMENT FACTOR +! -------------------------------------- +! +zreynolds(:,:) = 0. +PBEARDCOEF(:,:) = 1.0 +! +DO JK = IKTB, IKTE + DO JIJ = IIJB, IIJE +!++cb++ 09/06/23 on n'applique l'effet Beard que pour les points ou le rapport de melange est +! suffisamment eleve pour eviter que qE >> mg => coef de Beard tres eleve ! +! Ce pb intervient avec ICE3 pour lequel xrtmin est tres bas par rapport a LIMA. + IF (OSEDIM(JIJ,JK) .AND. PRX(JIJ,JK) .GT. XRTMIN_ELEC(KID) .AND. PLBDA(JIJ,JK) .GT. 0.) THEN +!--cb-- + ! Temperature K --> C + ZT = PT(JIJ,JK) - XTT + ! + ! Pre-factor of f_0 + IF (ZT >= 0.0) THEN + ZF0 = ZETA0 / (1.718E-5 + 0.0049E-5 * ZT) + ELSE + ZF0 = ZETA0 / (1.718E-5 + 0.0049E-5 * ZT - 1.2E-10 * ZT * ZT) + END IF + ! + ! Pre-factor of f_infty + ZF1 = SQRT(ZRHO00/PRHODREF(JIJ,JK)) + ! + ! compute (1 - K) = 1 - qE/mg + ZK = 1. - PQX(JIJ,JK) * PEFIELDW(JIJ,JK) / (PRX(JIJ,JK) * XG) + ! + ! Hyp : K_0 ~ 0 + ! Hyp : si qE > mg, K > 1 + IF (ZK <= 0.0) THEN + PBEARDCOEF(JIJ,JK) = 0. ! levitation + ELSE + ! Reynolds number + ZRE0 = ZVX / PLBDA(JIJ,JK)**(1.+ZDX) + zreynolds(jij,jk) = zre0 + IF (ZRE0 <= 0.2) THEN + PBEARDCOEF(JIJ,JK) = ZF0 * ZK + ELSE IF (ZRE0 >= 1000.) THEN + PBEARDCOEF(JIJ,JK) = ZF1 * SQRT(ZK) + ELSE + PBEARDCOEF(JIJ,JK) = ZF0 * ZK + & + (ZF1 * SQRT(ZK) - ZF0 * ZK) * & + (1.61 + LOG(ZRE0)) / 8.52 + END IF + ! remove the Foote-duToit correction + ZCOR = (PRHODREF(JIJ,JK) / ZRHO00)**ZCEXVT + PBEARDCOEF(JIJ,JK) = PBEARDCOEF(JIJ,JK) * ZCOR + END IF + ELSE + PBEARDCOEF(JIJ,JK) = 1.0 ! No "Beard" effect + END IF + END DO +END DO +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE ELEC_BEARD_EFFECT +END MODULE MODE_ELEC_BEARD_EFFECT diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 8079f0d349befbd4bfe24c02d47f30d77d1f9ce2..77b062bf3cfd8eb836dee6e2d87523dedc2049ae 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -284,6 +284,7 @@ END MODULE MODI_MODEL_n ! P. Wautelet 13/01/2023: manage close of backup files outside of MODEL_n ! (useful to close them in reverse model order (child before parent, needed by WRITE_BALLOON_n) ! J. Wurtz 01/2023 : correction for mean in SURFEX outputs +! C. Barthe 03/02/2022: cloud electrification is now called from resolved_cloud to avoid duplicated routines !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -351,10 +352,10 @@ USE MODD_PARAM_C1R3, ONLY: NSEDI => LSEDI, NHHONI => LHHONI USE MODD_PARAM_C2R2, ONLY: NSEDC => LSEDC, NRAIN => LRAIN, NACTIT => LACTIT,LACTTKE,LDEPOC USE MODD_PARAMETERS USE MODD_PARAM_ICE_n, ONLY: LWARM,LSEDIC,LCONVHG,LDEPOSC, CSUBG_AUCV_RC -USE MODD_PARAM_LIMA, ONLY: MSEDC => LSEDC, NMOM_C, NMOM_R, & - MACTIT => LACTIT, LSCAV, NMOM_I, & - MSEDI => LSEDI, MHHONI => LHHONI, NMOM_H, & - XRTMIN_LIMA=>XRTMIN, MACTTKE=>LACTTKE +USE MODD_PARAM_LIMA, ONLY: MSEDC => LSEDC, NMOM_C, NMOM_R, & + MACTIT => LACTIT, LSCAV, NMOM_I, & + MSEDI => LSEDI, MHHONI => LHHONI, NMOM_S, NMOM_G, NMOM_H, & + XRTMIN_LIMA=>XRTMIN, MACTTKE=>LACTTKE, LPTSPLIT USE MODD_PARAM_MFSHALL_n USE MODD_PARAM_n USE MODD_PAST_FIELD_n @@ -1469,7 +1470,7 @@ END IF IF (CELEC.NE.'NONE' .AND. LRELAX2FW_ION) THEN CALL RELAX2FW_ION (KTCOUNT, IMI, XTSTEP, XRHODJ, XSVT, NALBOT, & XALK, LMASK_RELAX, XKWRELAX, XRSVS ) -END IF +END IF ! CALL SECOND_MNH2(ZTIME2) ! @@ -1664,8 +1665,8 @@ XTIME_LES_BU_PROCESS = 0. CALL MPPDB_CHECK3DM("before ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ",PRECISION,& & XUT, XVT, XWT, XTHT, XTKET,XRHODJ) CALL ADVECTION_METSV ( TPBAKFILE, CUVW_ADV_SCHEME, & - CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT, & - LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT, & + CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, CELEC, & + NSPLIT, LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT, & CLBCX, CLBCY, NRR, NSV, TDTCUR, XTSTEP, & XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT, XPABST, & XTHVREF, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & @@ -1921,7 +1922,7 @@ ZTIME1 = ZTIME2 XTIME_BU_PROCESS = 0. XTIME_LES_BU_PROCESS = 0. ! -IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN +IF (CCLOUD /= 'NONE') THEN ! IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' .OR. CCLOUD == 'C3R5' & .OR. CCLOUD == "LIMA" ) THEN @@ -1950,42 +1951,42 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN ZSEA(:,:) = 0. ZTOWN(:,:)= 0. CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) - CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & - NSPLITG, IMI, KTCOUNT, & - CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & - LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC,XTSTEP, & - XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & - XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & - XSVT, XRSVS, & - XSRCT, XCLDFR,XICEFR, XCIT, & - LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & - LCONVHG, XCF_MF,XRC_MF, XRI_MF, & - XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & - XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & + CALL RESOLVED_CLOUD ( CCLOUD, CELEC, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & + NSPLITG, IMI, KTCOUNT, & + CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & + LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC,XTSTEP, & + XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & + XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & + XSVT, XRSVS, & + XSRCT, XCLDFR,XICEFR, XCIT, & + LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & + LCONVHG, XCF_MF,XRC_MF, XRI_MF, & + XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & + XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, & - XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & - XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF, & - ZSEA, ZTOWN ) - DEALLOCATE(ZTOWN) - DEALLOCATE(ZSEA) + XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & + XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF, & + ZSEA, ZTOWN ) + IF (CELEC == 'NONE') DEALLOCATE(ZTOWN) + IF (CELEC == 'NONE') DEALLOCATE(ZSEA) ELSE - CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & - NSPLITG, IMI, KTCOUNT, & - CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & - LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC, & - XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & - XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & - XSVT, XRSVS, & - XSRCT, XCLDFR, XICEFR, XCIT, & - LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & - LCONVHG, XCF_MF,XRC_MF, XRI_MF, & - XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & - XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & + CALL RESOLVED_CLOUD ( CCLOUD, CELEC, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & + NSPLITG, IMI, KTCOUNT, & + CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & + LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC, & + XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & + XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & + XSVT, XRSVS, & + XSRCT, XCLDFR, XICEFR, XCIT, & + LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & + LCONVHG, XCF_MF,XRC_MF, XRI_MF, & + XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & + XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D, & XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, & - XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & - XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF ) + XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR, & + XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF ) END IF XRTHS_CLD = XRTHS - XRTHS_CLD XRRS_CLD = XRRS - XRRS_CLD @@ -2033,60 +2034,131 @@ XT_CLOUD = XT_CLOUD + ZTIME2 - ZTIME1 & !* 21. CLOUD ELECTRIFICATION AND LIGHTNING FLASHES ! ------------------------------------------- ! +! Cloud electrification is now called directly from resolved_cloud +! It avoids duplicating microphysics routines. +! Resolved_elec solves the ion recombination and attachement, and +! lightning flash triggering and propagation +! ZTIME1 = ZTIME2 XTIME_BU_PROCESS = 0. XTIME_LES_BU_PROCESS = 0. ! -IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN - XWT_ACT_NUC(:,:,:) = 0. -! - XRTHS_CLD = XRTHS - XRRS_CLD = XRRS - XRSVS_CLD = XRSVS - IF (CSURF=='EXTE') THEN - ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ZSEA(:,:) = 0. - ZTOWN(:,:)= 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) - CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD, & - NRR, NSPLITR, IMI, KTCOUNT, OEXIT, & - CLBCX, CLBCY, CRAD, CTURBDIM, & - LSUBG_COND, LSIGMAS,VSIGQSAT,CSUBG_AUCV_RC, & - XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT, XRTHS, XWT, XRT, XRRS, & - XSVT, XRSVS, XCIT, & - XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, & - XRI_MF, LSEDIC, LWARM, & - XINPRC, XINPRR, XINPRR3D, XEVAP3D, & - XINPRS, XINPRG, XINPRH, & - ZSEA, ZTOWN ) - DEALLOCATE(ZTOWN) - DEALLOCATE(ZSEA) - ELSE - CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD, & - NRR, NSPLITR, IMI, KTCOUNT, OEXIT, & - CLBCX, CLBCY, CRAD, CTURBDIM, & - LSUBG_COND, LSIGMAS,VSIGQSAT, CSUBG_AUCV_RC, & - XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & - ZPABST, XTHT, XRTHS, XWT, & - XRT, XRRS, XSVT, XRSVS, XCIT, & - XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, & - XRI_MF, LSEDIC, LWARM, & - XINPRC, XINPRR, XINPRR3D, XEVAP3D, & - XINPRS, XINPRG, XINPRH ) - END IF - XRTHS_CLD = XRTHS - XRTHS_CLD - XRRS_CLD = XRRS - XRRS_CLD - XRSVS_CLD = XRSVS - XRSVS_CLD -! - XACPRR = XACPRR + XINPRR * XTSTEP - IF ((CCLOUD(1:3) == 'ICE' .AND. LSEDIC)) & - XACPRC = XACPRC + XINPRC * XTSTEP +IF (CELEC /= 'NONE') THEN !++cb-- ATTENTION : le cas rain_ice_elec n'est pas traite !!! IF (CCLOUD(1:3) == 'ICE') THEN - XACPRS = XACPRS + XINPRS * XTSTEP - XACPRG = XACPRG + XINPRG * XTSTEP - IF (CCLOUD == 'ICE4') XACPRH = XACPRH + XINPRH * XTSTEP + IF (CSURF == 'EXTE') THEN + IF (LLNOX_EXPLICIT) THEN + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XCIT, XINPRR, & + PSEA=ZSEA, PTOWN=ZTOWN, & + PSVS_LNOX=XRSVS(:,:,:,NSV_LNOXBEG) ) + ELSE + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XCIT, XINPRR, & + PSEA=ZSEA, PTOWN=ZTOWN ) + END IF + DEALLOCATE(ZSEA) + DEALLOCATE(ZTOWN) + ELSE + IF (LLNOX_EXPLICIT) THEN + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XCIT, XINPRR, & + PSVS_LNOX=XRSVS(:,:,:,NSV_LNOXBEG) ) + ELSE + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XCIT, XINPRR ) + END IF + END IF + ELSE IF (CCLOUD == 'LIMA' .AND. LPTSPLIT) THEN + IF (LLNOX_EXPLICIT) THEN + IF ((NRR == 6 .AND. NMOM_S == 1 .AND. NMOM_G == 1) .OR. & + (NRR == 7 .AND. NMOM_S == 1 .AND. NMOM_G == 1 .AND. NMOM_H == 1)) THEN + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_LIMA_NI), XINPRR, & + PCCS=XRSVS(:,:,:,NSV_LIMA_NC), & + PCRS=XRSVS(:,:,:,NSV_LIMA_NR), & + PSVS_LNOX=XRSVS(:,:,:,NSV_LNOXBEG) ) + ELSE IF (NRR == 6 .AND. NMOM_S == 2 .AND. NMOM_G == 2) THEN + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_LIMA_NI), XINPRR, & + PCCS=XRSVS(:,:,:,NSV_LIMA_NC), & + PCRS=XRSVS(:,:,:,NSV_LIMA_NR), & + PCSS=XRSVS(:,:,:,NSV_LIMA_NS), & + PCGS=XRSVS(:,:,:,NSV_LIMA_NG), & + PSVS_LNOX=XRSVS(:,:,:,NSV_LNOXBEG) ) + ELSE IF (NRR == 7 .AND. NMOM_S == 2 .AND. NMOM_G == 2 .AND. NMOM_H == 2) THEN + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_LIMA_NI), XINPRR, & + PCCS=XRSVS(:,:,:,NSV_LIMA_NC), & + PCRS=XRSVS(:,:,:,NSV_LIMA_NR), & + PCSS=XRSVS(:,:,:,NSV_LIMA_NS), & + PCGS=XRSVS(:,:,:,NSV_LIMA_NG), & + PCHS=XRSVS(:,:,:,NSV_LIMA_NH), & + PSVS_LNOX=XRSVS(:,:,:,NSV_LNOXBEG) ) + END IF + ELSE + IF ((NRR == 6 .AND. NMOM_S == 1 .AND. NMOM_G == 1) .OR. & + (NRR == 7 .AND. NMOM_S == 1 .AND. NMOM_G == 1 .AND. NMOM_H == 1)) THEN + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_LIMA_NI), XINPRR, & + PCCS=XRSVS(:,:,:,NSV_LIMA_NC), & + PCRS=XRSVS(:,:,:,NSV_LIMA_NR)) + ELSE IF (NRR == 6 .AND. NMOM_S == 2 .AND. NMOM_G == 2) THEN + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_LIMA_NI), XINPRR, & + PCCS=XRSVS(:,:,:,NSV_LIMA_NC), & + PCRS=XRSVS(:,:,:,NSV_LIMA_NR), & + PCSS=XRSVS(:,:,:,NSV_LIMA_NS), & + PCGS=XRSVS(:,:,:,NSV_LIMA_NG)) + ELSE IF (NRR == 7 .AND. NMOM_S == 2 .AND. NMOM_G == 2 .AND. NMOM_H == 2) THEN + CALL RESOLVED_ELEC_n (CCLOUD, NRR, IMI, KTCOUNT, OEXIT, & + XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF, & + ZPABST, XTHT, XWT, XRT, XRRS, & + XSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XRSVS(:,:,:,NSV_LIMA_NI), XINPRR, & + PCCS=XRSVS(:,:,:,NSV_LIMA_NC), & + PCRS=XRSVS(:,:,:,NSV_LIMA_NR), & + PCSS=XRSVS(:,:,:,NSV_LIMA_NS), & + PCGS=XRSVS(:,:,:,NSV_LIMA_NG), & + PCHS=XRSVS(:,:,:,NSV_LIMA_NH)) + END IF + END IF END IF END IF ! diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index 6ac206daab1f8e77961e803fa395103266fe0737..bd98dacf0a9addaee29c37663fe6150767c04d8c 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -241,6 +241,7 @@ END MODULE MODI_PHYS_PARAM_n ! P. Wautelet 30/11/2022: compute XTHW_FLUX, XRCW_FLUX and XSVW_FLUX only when needed ! A. Costes 12/2021: add Blaze fire model ! Q. Rodier 2022 : integration with PHYEX +! C. Barthe 03/2023: add CELEC in call to turbulence !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1638,7 +1639,7 @@ END IF LCOUPLES, LBLOWSNOW, LIBM,LFLYER, & GCOMPUTE_SRC, XRSNOW, & LOCEAN, LDEEPOC, LDIAG_IN_RUN, & - CTURBLEN_CLOUD, CCLOUD, & + CTURBLEN_CLOUD, CCLOUD, CELEC, & XTSTEP, TPFILE, & XDXX, XDYY, XDZZ, XDZX, XDZY, XZZ, & XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, XCOSSLOPE, XSINSLOPE, & diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 1aa20763f3e5f7718a35250692619d1555dc8b76..c7c48d839fdc5de1b662de0ce34333b460264884 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -309,6 +309,7 @@ END MODULE MODI_READ_EXSEG_n ! P. Wautelet 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables ! P. Wautelet 13/07/2022: add namelist for flyers and balloons ! P. Wautelet 19/08/2022: add namelist for aircrafts +! C. Barthe 11/07/2023: ELEC: only some combinations of microphysical options are allowed !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -393,7 +394,7 @@ USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3, & USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, & WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2 USE MODN_PARAM_ECRAD_n -USE MODD_PARAM_ICE_n, ONLY : PARAM_ICEN_INIT, PARAM_ICEN, CSUBG_AUCV_RC, CSUBG_AUCV_RI +USE MODD_PARAM_ICE_n, ONLY : PARAM_ICEN_INIT, PARAM_ICEN, CSUBG_AUCV_RC, CSUBG_AUCV_RI, LRED, LSNOW_T USE MODN_PARAM_KAFR_n USE MODD_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,PARAM_LIMA_INIT,NMOD_CCN,LSCAV, & CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, NMOD_IMM, & @@ -1787,6 +1788,59 @@ IF (CELEC /= 'NONE') THEN & "THE ELECTRICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') CGETSVT(NSV_ELECBEG:NSV_ELECEND)='INIT' END IF + ! + IF (CCLOUD(1:3) == 'ICE') THEN + IF (.NOT. LRED .AND. CELEC == 'ELE3') THEN + WRITE(UNIT=ILUOUT,FMT='("THIS IS THE OLD VERSION OF THE ELECTRICAL SCHEME",/,& + & "BE AWARE ANOTHER VERSION IS AVAILABLE !")') + ELSE IF (LRED .AND. CELEC == 'ELE4') THEN + WRITE(UNIT=ILUOUT,FMT='("THIS IS THE NEW VERSION OF THE ELECTRICAL SCHEME",/,& + & "BUT WITH THE 1 MOMENT VERSION OF THE MICROPHYSICS SCHEME")') + ELSE + WRITE(UNIT=ILUOUT,FMT='("THIS VERSION OF THE ELECTRICAL SCHEME IS NOT COMPATIBLE",/,& + & "WITH THE ICE3 MICROPHYSICS SCHEME")') + CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') ! error + END IF + IF (LSNOW_T) THEN + WRITE(UNIT=ILUOUT,FMT='("THE ELECTRICAL SCHEME CANNOT BE USED WITH LSNOW_T")') + CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') ! error + END IF + ELSE IF (CCLOUD == 'LIMA' .AND. LPTSPLIT) THEN + IF (CELEC == 'ELE4' .AND. NMOM_C == 2 .AND. NMOM_R == 2 .AND. NMOM_I == 2 .AND. & + NMOM_S == 1 .AND. NMOM_G == 1 .AND. NMOM_H == 0) THEN + WRITE(UNIT=ILUOUT,FMT='("THE ELECTRICAL SCHEME IS USED WITH",/,& + & "THE PARTIAL 2-MOMENT MICROPHYSICS SCHEME LIMA")') + ELSE IF (CELEC == 'ELE4' .AND. NMOM_C == 2 .AND. NMOM_R == 2 .AND. NMOM_I == 2 .AND. & + NMOM_S == 2 .AND. NMOM_G == 2 .AND. NMOM_H == 0) THEN + WRITE(UNIT=ILUOUT,FMT='("THE ELECTRICAL SCHEME IS USED WITH",/,& + & "THE FULL 2-MOMENT MICROPHYSICS SCHEME LIMA",/,& + & "BE CAREFUL: NOT FULLY VALIDATED !!!")') + ELSE IF (CELEC == 'ELE4' .AND. NMOM_C == 2 .AND. NMOM_R == 2 .AND. NMOM_I == 2 .AND. & + NMOM_S == 1 .AND. NMOM_G == 1 .AND. NMOM_H == 1) THEN + WRITE(UNIT=ILUOUT,FMT='("THE ELECTRICAL SCHEME IS USED WITH",/,& + & "THE PARTIAL 2-MOMENT MICROPHYSICS SCHEME LIMA",/,& + & "WITH HAIL ACTIVATED",/,& + & "BE CAREFUL: NOT TESTED NOR VALIDATED !!!")') + ELSE IF (CELEC == 'ELE4' .AND. NMOM_C == 2 .AND. NMOM_R == 2 .AND. NMOM_I == 2 .AND. & + NMOM_S == 2 .AND. NMOM_G == 2 .AND. NMOM_H == 2) THEN + WRITE(UNIT=ILUOUT,FMT='("THE ELECTRICAL SCHEME IS USED WITH",/,& + & "THE FULL 2-MOMENT MICROPHYSICS SCHEME LIMA",/,& + & "WITH HAIL ACTIVATED",/,& + & "BE CAREFUL: NOT TESTED NOR VALIDATED !!!")') + ELSE + WRITE(UNIT=ILUOUT,FMT='("THE USE OF THE ELECTRICAL SCHEME IS NOT COMPATIBLE",/,& + & "WITH THE OPTIONS OF THE LIMA MICROPHYSICS SCHEME")') + CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') ! error + END IF + IF (LSNOW_T) THEN + WRITE(UNIT=ILUOUT,FMT='("THE ELECTRICAL SCHEME CANNOT BE USED WITH LSNOW_T")') + CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') ! error + END IF + ELSE + WRITE(UNIT=ILUOUT,FMT='("THE ELECTRICAL SCHEME IS NOT COMPATIBLE",/,& + & "WITH THE CHOSEN MICROPHYSICS SCHEME")') + CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','') ! error + END IF END IF ! ! (explicit) LINOx SV case diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index aec42c0535e375182860e9e1ff46049510d13234..03b6d3493db5d41d37ff9f3e0e17c2853d470565 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -7,7 +7,7 @@ MODULE MODI_RESOLVED_CLOUD ! ########################## INTERFACE - SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD, & + SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HELEC, HACTCCN, HSCONV, HMF_CLOUD, & KRR, KSPLITR, KSPLITG, KMI, KTCOUNT, & HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM, & OSUBG_COND, OSIGMAS, HSUBG_AUCV, & @@ -30,6 +30,7 @@ INTERFACE USE MODD_IO, ONLY: TFILEDATA ! CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud +CHARACTER(LEN=4), INTENT(IN) :: HELEC ! kind of electrical scheme CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme ! paramerization CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme @@ -146,8 +147,8 @@ END SUBROUTINE RESOLVED_CLOUD END INTERFACE END MODULE MODI_RESOLVED_CLOUD ! -! ########################################################################## - SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD, & +! ################################################################################## + SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HELEC, HACTCCN, HSCONV, HMF_CLOUD, & KRR, KSPLITR, KSPLITG, KMI, KTCOUNT, & HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM, & OSUBG_COND, OSIGMAS, HSUBG_AUCV, & @@ -166,7 +167,7 @@ END MODULE MODI_RESOLVED_CLOUD PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & PSEA,PTOWN ) -! ########################################################################## +! ################################################################################## ! !!**** * - compute the resolved clouds and precipitation !! @@ -284,6 +285,9 @@ END MODULE MODI_RESOLVED_CLOUD ! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct ! P. Wautelet 30/06/2020: remove non-local corrections ! B. Vie 06/2020: add prognostic supersaturation for LIMA +! C. Barthe 20/03/2023: to avoid duplicating sources, cloud electrification is integrated in the microphysics +! CELLS can be used with rain_ice with LRED=T and with LIMA with LPTSPLIT=T +! the adjustement for cloud electricity is also externalized !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -294,11 +298,16 @@ USE MODD_DUST, ONLY: LDUST USE MODD_CST, ONLY: CST USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_DUST , ONLY: LDUST +USE MODD_ELEC_n, ONLY: XEFIELDU, XEFIELDV, XEFIELDW +USE MODD_ELEC_DESCR, ONLY: ELEC_DESCR, LSEDIM_BEARD, LIAGGS_LATHAM +USE MODD_ELEC_PARAM, ONLY: ELEC_PARAM USE MODD_IO, ONLY: TFILEDATA USE MODD_NEB_n, ONLY: NEBN, CCONDENS, CLAMBDA3 USE MODD_NSV, ONLY: NSV, NSV_C1R3END, NSV_C2R2BEG, NSV_C2R2END, & NSV_LIMA_BEG, NSV_LIMA_END, NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, & - NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR, NSV_AEREND,NSV_DSTEND,NSV_SLTEND + NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR, & + NSV_AEREND, NSV_DSTEND, NSV_SLTEND, & + NSV_ELECBEG, NSV_ELECEND USE MODD_PARAM_C2R2, ONLY: LSUPSAT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PARAM_ICE_n, ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, LRED, PARAM_ICEN @@ -316,6 +325,7 @@ USE MODI_C2R2_ADJUST USE MODI_FAST_TERMS USE MODI_GET_HALO USE MODI_ICE_ADJUST +USE MODI_ICE_ADJUST_ELEC USE MODI_KHKO_NOTADJUST USE MODI_LIMA USE MODI_LIMA_ADJUST @@ -327,9 +337,12 @@ USE MODI_LIMA_WARM USE MODI_RAIN_C2R2_KHKO USE MODI_RAIN_ICE USE MODI_RAIN_ICE_OLD +USE MODI_RAIN_ICE_ELEC USE MODI_SHUMAN USE MODI_SLOW_TERMS USE MODI_AER2LIMA +USE MODI_ION_SOURCE_ELEC +USE MODI_ELEC_ADJUST ! IMPLICIT NONE ! @@ -338,6 +351,7 @@ IMPLICIT NONE ! ! CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization +CHARACTER(LEN=4), INTENT(IN) :: HELEC ! kind of electrical scheme CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud @@ -493,6 +507,17 @@ REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZTM REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSIGQSAT2D TYPE(DIMPHYEX_t) :: YLDIMPHYEX REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDUM +! +! variables for cloud electricity +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZCND, ZDEP +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZRCS_BEF, ZRIS_BEF +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQHT, ZQPIT, ZQNIT +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQCS, ZQRS, ZQIS, ZQSS, ZQGS, ZQHS, ZQPIS, ZQNIS +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLATHAM_IAGGS ! E Function to simulate + ! enhancement of IAGGS +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEFIELDW +LOGICAL :: GELEC ! if true, cloud electrification is activated +! ZSIGQSAT2D(:,:) = PSIGQSAT ! !------------------------------------------------------------------------------ @@ -546,17 +571,17 @@ END IF ! IF (HCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN ! ORILAM : tendance s --> variable instant t -ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV)) + ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV)) DO JSV = 1, NSV ZSVT(:,:,:,JSV) = PSVS(:,:,:,JSV) * PTSTEP / PRHODJ(:,:,:) END DO -CALL AER2LIMA(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,1),& - PPABST(IIB:IIE,IJB:IJE,IKB:IKE),& - PTHT(IIB:IIE,IJB:IJE,IKB:IKE), & - PZZ(IIB:IIE,IJB:IJE,IKB:IKE)) + CALL AER2LIMA(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& + PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & + PRT(IIB:IIE,IJB:IJE,IKB:IKE,1),& + PPABST(IIB:IIE,IJB:IJE,IKB:IKE),& + PTHT(IIB:IIE,IJB:IJE,IKB:IKE), & + PZZ(IIB:IIE,IJB:IJE,IKB:IKE)) ! LIMA : variable instant t --> tendance s PSVS(:,:,:,NSV_LIMA_CCN_FREE) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE) * & @@ -570,8 +595,8 @@ CALL AER2LIMA(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),& PRHODJ(:,:,:) / PTSTEP PSVS(:,:,:,NSV_LIMA_IFN_FREE+1) = ZSVT(:,:,:,NSV_LIMA_IFN_FREE+1) * & PRHODJ(:,:,:) / PTSTEP - -DEALLOCATE(ZSVT) + ! + DEALLOCATE(ZSVT) END IF !UPG*PT @@ -594,15 +619,15 @@ ENDIF ! complete the lateral boundaries to avoid possible problems ! DO JI=1,JPHEXT - PTHS(JI,:,:) = PTHS(IIB,:,:) - PTHS(IIE+JI,:,:) = PTHS(IIE,:,:) - PTHS(:,JI,:) = PTHS(:,IJB,:) - PTHS(:,IJE+JI,:) = PTHS(:,IJE,:) -! - PRS(JI,:,:,:) = PRS(IIB,:,:,:) - PRS(IIE+JI,:,:,:) = PRS(IIE,:,:,:) - PRS(:,JI,:,:) = PRS(:,IJB,:,:) - PRS(:,IJE+JI,:,:) = PRS(:,IJE,:,:) + PTHS(JI,:,:) = PTHS(IIB,:,:) + PTHS(IIE+JI,:,:) = PTHS(IIE,:,:) + PTHS(:,JI,:) = PTHS(:,IJB,:) + PTHS(:,IJE+JI,:) = PTHS(:,IJE,:) +! + PRS(JI,:,:,:) = PRS(IIB,:,:,:) + PRS(IIE+JI,:,:,:) = PRS(IIE,:,:,:) + PRS(:,JI,:,:) = PRS(:,IJB,:,:) + PRS(:,IJE+JI,:,:) = PRS(:,IJE,:,:) END DO ! ! complete the physical boundaries to avoid some computations @@ -647,62 +672,89 @@ IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO' & PSVT(:,:,IKE+1,ISVBEG:ISVEND) = PSVT(:,:,IKE,ISVBEG:ISVEND) ENDIF ! +! Same thing for cloud electricity +IF (HELEC(1:3) == 'ELE') THEN + ! Transformation into physical tendencies + DO JSV = NSV_ELECBEG, NSV_ELECEND + PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) / PRHODJ(:,:,:) + ENDDO + ! + ! complete the lateral boundaries to avoid possible problems + DO JI = 1, JPHEXT + ! positive ion source + PSVS(JI,:,:,NSV_ELECBEG) = PSVS(IIB,:,:,NSV_ELECBEG) + PSVS(IIE+JI,:,:,NSV_ELECBEG) = PSVS(IIE,:,:,NSV_ELECBEG) + PSVS(:,JI,:,NSV_ELECBEG) = PSVS(:,IJB,:,NSV_ELECBEG) + PSVS(:,IJE+JI,:,NSV_ELECBEG) = PSVS(:,IJE,:,NSV_ELECBEG) + ! source of hydrometeor charge + PSVS(JI,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + PSVS(IIE+JI,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + PSVS(:,JI,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + PSVS(:,IJE+JI,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + ! negative ion source + PSVS(JI,:,:,NSV_ELECEND) = PSVS(IIB,:,:,NSV_ELECEND) + PSVS(IIE+JI,:,:,NSV_ELECEND) = PSVS(IIE,:,:,NSV_ELECEND) + PSVS(:,JI,:,NSV_ELECEND) = PSVS(:,IJB,:,NSV_ELECEND) + PSVS(:,IJE+JI,:,NSV_ELECEND) = PSVS(:,IJE,:,NSV_ELECEND) + END DO + ! + ! complete the physical boundaries to avoid some computations + IF(GWEST .AND. HLBCX(1) /= 'CYCL') PSVT(IIB-1,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + IF(GEAST .AND. HLBCX(2) /= 'CYCL') PSVT(IIE+1,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PSVT(:,IJB-1,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PSVT(:,IJE+1,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + ! + ! complete the vertical boundaries + PSVS(:,:,IKB-1,NSV_ELECBEG) = PSVS(:,:,IKB,NSV_ELECBEG) ! Positive ion + PSVT(:,:,IKB-1,NSV_ELECBEG) = PSVT(:,:,IKB,NSV_ELECBEG) + PSVS(:,:,IKB-1,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 ! Hydrometeor charge + PSVS(:,:,IKE+1,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + PSVT(:,:,IKB-1,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + PSVT(:,:,IKE+1,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 + PSVS(:,:,IKB-1,NSV_ELECEND) = PSVS(:,:,IKB,NSV_ELECEND) ! Negative ion + PSVT(:,:,IKB-1,NSV_ELECEND) = PSVT(:,:,IKB,NSV_ELECEND) +END IF +! +! +!------------------------------------------------------------------------------- ! !* 3. REMOVE NEGATIVE VALUES ! ---------------------- ! -!* 3.1 Non local correction for precipitating species (Rood 87) -! -! IF ( HCLOUD == 'KESS' & -! .OR. HCLOUD == 'ICE3' .OR. HCLOUD == 'ICE4' & -! .OR. HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' & -! .OR. HCLOUD == 'KHKO' .OR. HCLOUD == 'LIMA' ) THEN -! ! -! DO JRR = 3,KRR -! SELECT CASE (JRR) -! CASE(3,5,6,7) ! rain, snow, graupel and hail -! -! IF ( MIN_ll( PRS(:,:,:,JRR), IINFO_ll) < 0.0 ) THEN -! ! -! ! compute the total water mass computation -! ! -! ZMASSTOT = MAX( 0. , SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) -! ! -! ! remove the negative values -! ! -! PRS(:,:,:,JRR) = MAX( 0., PRS(:,:,:,JRR) ) -! ! -! ! compute the new total mass -! ! -! ZMASSPOS = MAX(XMNH_TINY,SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) -! ! -! ! correct again in such a way to conserve the total mass -! ! -! ZRATIO = ZMASSTOT / ZMASSPOS -! PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * ZRATIO -! ! -! END IF -! END SELECT -! END DO -! END IF -! -!* 3.2 Adjustement for liquid and solid cloud -! ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NEGA', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) +call Sources_neg_correct( hcloud, helec, 'NEGA', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) +! ! -!* 3.4 Limitations of Na and Nc to the CCN max number concentration +!------------------------------------------------------------------------------- +! +!* 4. CLOUD ELECTRICITY +! ----------------- +! +!++cb++ 01/06/23 +!IF (HELEC == 'ELE4') & +IF (HELEC(1:3) == 'ELE') THEN +!--cb-- +! +!* 4.1 Ion source from drift motion and cosmic rays +! + CALL ION_SOURCE_ELEC (KTCOUNT, KRR, HLBCX, HLBCY, & + PRHODREF, PRHODJ, PRT, & + PSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + PSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + XEFIELDU, XEFIELDV, XEFIELDW ) +! +!* 4.2 Compute the coefficient that modifies the efficiency of IAGGS ! -! Commented by O.Thouron 03/2013 -!IF ((HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO') & -! .AND.(XCONC_CCN > 0)) THEN -! IF ((HACTCCN /= 'ABRK')) THEN -! ZSVT(:,:,:,1) = MIN( ZSVT(:,:,:,1),XCONC_CCN ) -! ZSVT(:,:,:,2) = MIN( ZSVT(:,:,:,2),XCONC_CCN ) -! ZSVS(:,:,:,1) = MIN( ZSVS(:,:,:,1),XCONC_CCN ) -! ZSVS(:,:,:,2) = MIN( ZSVS(:,:,:,2),XCONC_CCN ) -! END IF -!END IF + ALLOCATE(ZLATHAM_IAGGS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + IF (LIAGGS_LATHAM) THEN + ZLATHAM_IAGGS(:,:,:) = 1.0 + 0.4E-10 * MIN( 2.25E10, & + XEFIELDU(:,:,:)**2+XEFIELDV(:,:,:)**2+XEFIELDW(:,:,:)**2 ) + ELSE + ZLATHAM_IAGGS(:,:,:) = 1.0 + END IF +ELSE + ALLOCATE(ZLATHAM_IAGGS(0,0,0)) +END IF ! ! !------------------------------------------------------------------------------- @@ -805,6 +857,13 @@ SELECT CASE ( HCLOUD ) ENDDO ZZZ = MZF( PZZ ) IF(LRED .AND. LADJ_BEFORE) THEN + IF (HELEC == 'ELE4') THEN + ! save the cloud droplets and ice crystals m.r. source before adjustement + ZRCS_BEF(:,:,:) = PRS(:,:,:,2) + ZRIS_BEF(:,:,:) = PRS(:,:,:,4) + END IF + ! + ! Performe the saturation ajdustment CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & PARAM_ICEN, TBUCONF, KRR, & 'ADJU', & @@ -823,34 +882,171 @@ SELECT CASE ( HCLOUD ) TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + ! + IF (HELEC == 'ELE4') THEN + ! Compute the condensation and sublimation rates + ZCND(:,:,:) = PRS(:,:,:,2) - ZRCS_BEF(:,:,:) + ZDEP(:,:,:) = PRS(:,:,:,4) - ZRIS_BEF(:,:,:) + ! + ! Compute the charge exchanged during evaporation of cloud droplets (negative ZCND) and + ! during sublimation of ice crystals (negative ZDEP) + CALL ELEC_ADJUST (KRR, PRHODJ, HCLOUD, 'ADJU', & + PRC=ZRCS_BEF(:,:,:)*PTSTEP, PRI=ZRIS_BEF(:,:,:)*PTSTEP, & + PQC=PSVS(:,:,:,NSV_ELECBEG+1)*PTSTEP, & + PQI=PSVS(:,:,:,NSV_ELECBEG+3)*PTSTEP, & + PQCS=PSVS(:,:,:,NSV_ELECBEG+1), PQIS=PSVS(:,:,:,NSV_ELECBEG+3),& + PQPIS=PSVS(:,:,:,NSV_ELECBEG), PQNIS=PSVS(:,:,:,NSV_ELECEND), & + PCND=ZCND, PDEP=ZDEP) + END IF ENDIF IF (LRED) THEN - CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, & - RAIN_ICE_DESCRN, TBUCONF, & - PTSTEP, KRR, ZEXN, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PEVAP3D, & - PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & - TBUDGETS,SIZE(TBUDGETS), & - PSEA,PTOWN, PFPR=ZFPR ) + IF (HELEC == 'ELE4') THEN + ! to match with PHYEX, electric charge variables are no more optional, but their size + ! depends on the activation (or not) of the electrification scheme + GELEC = .TRUE. + ALLOCATE(ZQPIT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQNIT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQCT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQRT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQIT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQST(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQGT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQPIS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQNIS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQCS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQRS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQIS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQSS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQGS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ZQPIT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG) + ZQCT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+1) + ZQRT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+2) + ZQIT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+3) + ZQST(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+4) + ZQGT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+5) + ZQNIT(:,:,:) = PSVT(:,:,:,NSV_ELECEND) + ZQPIS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG) + ZQCS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+1) + ZQRS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+2) + ZQIS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+3) + ZQSS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+4) + ZQGS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+5) + ZQNIS(:,:,:) = PSVS(:,:,:,NSV_ELECEND) + IF (LSEDIM_BEARD) THEN + ALLOCATE(ZEFIELDW(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ZEFIELDW(:,:,:) = XEFIELDW(:,:,:) + ELSE + ALLOCATE(ZEFIELDW(0,0,0)) + END IF + ELSE + GELEC = .FALSE. + ALLOCATE(ZQPIT(0,0,0)) + ALLOCATE(ZQNIT(0,0,0)) + ALLOCATE(ZQCT(0,0,0)) + ALLOCATE(ZQRT(0,0,0)) + ALLOCATE(ZQIT(0,0,0)) + ALLOCATE(ZQST(0,0,0)) + ALLOCATE(ZQGT(0,0,0)) + ALLOCATE(ZQPIS(0,0,0)) + ALLOCATE(ZQNIS(0,0,0)) + ALLOCATE(ZQCS(0,0,0)) + ALLOCATE(ZQRS(0,0,0)) + ALLOCATE(ZQIS(0,0,0)) + ALLOCATE(ZQSS(0,0,0)) + ALLOCATE(ZQGS(0,0,0)) + ALLOCATE(ZEFIELDW(0,0,0)) + END IF + ALLOCATE(ZQHT(0,0,0)) + ALLOCATE(ZQHS(0,0,0)) + ! + CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, RAIN_ICE_DESCRN, & + ELEC_PARAM, ELEC_DESCR, TBUCONF, 0, .FALSE., & + GELEC, LSEDIM_BEARD, & + PTSTEP, KRR, ZEXN, & + ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & + PRT(:,:,:,4), PRT(:,:,:,5), PRT(:,:,:,6), & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & + PINPRC,PINPRR, PEVAP3D, & + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & + TBUDGETS,SIZE(TBUDGETS), & + ZQPIT, ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQNIT, & + ZQPIS, ZQCS, ZQRS, ZQIS, ZQSS, ZQGS, ZQNIS, & + ZEFIELDW, ZLATHAM_IAGGS, & + PSEA,PTOWN, PFPR=ZFPR ) + ! + IF (HELEC == 'ELE4') THEN + PSVT(:,:,:,NSV_ELECBEG) = ZQPIT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+1) = ZQCT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+2) = ZQRT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+3) = ZQIT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+4) = ZQST(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+5) = ZQGT(:,:,:) + PSVT(:,:,:,NSV_ELECEND) = ZQNIT(:,:,:) + PSVS(:,:,:,NSV_ELECBEG) = ZQPIS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+1) = ZQCS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+2) = ZQRS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+3) = ZQIS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+4) = ZQSS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+5) = ZQGS(:,:,:) + PSVS(:,:,:,NSV_ELECEND) = ZQNIS(:,:,:) + END IF + DEALLOCATE(ZQPIT) + DEALLOCATE(ZQNIT) + DEALLOCATE(ZQCT) + DEALLOCATE(ZQRT) + DEALLOCATE(ZQIT) + DEALLOCATE(ZQST) + DEALLOCATE(ZQGT) + DEALLOCATE(ZQHT) + DEALLOCATE(ZQPIS) + DEALLOCATE(ZQNIS) + DEALLOCATE(ZQCS) + DEALLOCATE(ZQRS) + DEALLOCATE(ZQIS) + DEALLOCATE(ZQSS) + DEALLOCATE(ZQGS) + DEALLOCATE(ZQHS) + DEALLOCATE(ZEFIELDW) + ! ELSE - CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1, & - KSPLITR, PTSTEP, KRR, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & - PSEA, PTOWN, PFPR=ZFPR) + IF (HELEC == 'ELE3') THEN + ! --> old version of the electrification scheme + ! Should be removed in a future version of MNH once the new electrification scheme is fully validated + ! Compute the explicit microphysical sources and the explicit charging rates + CALL RAIN_ICE_ELEC (OSEDIC, HSUBG_AUCV, OWARM, & + KSPLITR, PTSTEP, KMI, KRR, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & + PRT(:,:,:,4), PRT(:,:,:,5), PRT(:,:,:,6), & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & + PINPRC, PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, & + PSVT(:,:,:,NSV_ELECBEG), PSVT(:,:,:,NSV_ELECBEG+1), & + PSVT(:,:,:,NSV_ELECBEG+2), PSVT(:,:,:,NSV_ELECBEG+3), & + PSVT(:,:,:,NSV_ELECBEG+4), PSVT(:,:,:,NSV_ELECBEG+5), & + PSVT(:,:,:,NSV_ELECEND), & + PSVS(:,:,:,NSV_ELECBEG), PSVS(:,:,:,NSV_ELECBEG+1), & + PSVS(:,:,:,NSV_ELECBEG+2), PSVS(:,:,:,NSV_ELECBEG+3), & + PSVS(:,:,:,NSV_ELECBEG+4), PSVS(:,:,:,NSV_ELECBEG+5), & + PSVS(:,:,:,NSV_ELECEND), & + PSEA, PTOWN ) + ELSE + CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1,& + KSPLITR, PTSTEP, KRR, & + ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & + PRT(:,:,:,3), PRT(:,:,:,4), & + PRT(:,:,:,5), PRT(:,:,:,6), & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & + PINPRC,PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & + PSEA, PTOWN, PFPR=ZFPR ) + END IF END IF ! @@ -858,26 +1054,68 @@ SELECT CASE ( HCLOUD ) ! ! IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & - PARAM_ICEN, TBUCONF, KRR, & - 'DEPI', & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + IF (HELEC == 'ELE4') THEN + ! save the cloud droplets and ice crystals m.r. source before adjustement + ZRCS_BEF(:,:,:) = PRS(:,:,:,2) + ZRIS_BEF(:,:,:) = PRS(:,:,:,4) + END IF + ! + ! Perform the saturation ajdustment + IF (HELEC == 'ELE3') THEN + ! --> old version of the electrification scheme + CALL ICE_ADJUST_ELEC (KRR, KMI, HRAD, HTURBDIM, & + HSCONV, HMF_CLOUD, & + OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & + PRHODJ, PEXNREF, PSIGS, PPABST, ZZZ, & + PMFCONV, PCF_MF, PRC_MF, PRI_MF, & + PRT(:,:,:,1), PRT(:,:,:,2), PRS(:,:,:,1), PRS(:,:,:,2), & + PTHS, PSRCS, PCLDFR, & + PRT(:,:,:,3), PRS(:,:,:,3), PRT(:,:,:,4), PRS(:,:,:,4), & + PRT(:,:,:,5), PRS(:,:,:,5), PRT(:,:,:,6), PRS(:,:,:,6), & + PSVT(:,:,:,NSV_ELECBEG), PSVS(:,:,:,NSV_ELECBEG), & + PSVT(:,:,:,NSV_ELECBEG+1), PSVS(:,:,:,NSV_ELECBEG+1), & + PSVT(:,:,:,NSV_ELECBEG+2), PSVS(:,:,:,NSV_ELECBEG+2), & + PSVT(:,:,:,NSV_ELECBEG+3), PSVS(:,:,:,NSV_ELECBEG+3), & + PSVT(:,:,:,NSV_ELECBEG+4), PSVS(:,:,:,NSV_ELECBEG+4), & + PSVT(:,:,:,NSV_ELECBEG+5), PSVS(:,:,:,NSV_ELECBEG+5), & + PSVT(:,:,:,NSV_ELECEND), PSVS(:,:,:,NSV_ELECEND) ) + ELSE + CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & + PARAM_ICEN, TBUCONF, KRR, 'DEPI', & + PTSTEP, ZSIGQSAT2D, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & + ZEXN, PCF_MF, PRC_MF, PRI_MF, & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & + PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & + PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & + PTH=PTHS*PTSTEP, PTHS=PTHS, & + OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & + PRR=PRS(:,:,:,3)*PTSTEP, & + PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & + PRS=PRS(:,:,:,5)*PTSTEP, & + PRG=PRS(:,:,:,6)*PTSTEP, & + TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & + PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & + PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + ! + IF (HELEC == 'ELE4') THEN + ! Compute the condensation and sublimation rates + ZCND(:,:,:) = PRS(:,:,:,2) - ZRCS_BEF(:,:,:) + ZDEP(:,:,:) = PRS(:,:,:,4) - ZRIS_BEF(:,:,:) + ! + ! Compute the charge exchanged during evaporation of cloud droplets (negative ZCND) and + ! during sublimation of ice crystals (negative ZDEP) + CALL ELEC_ADJUST (KRR, PRHODJ, HCLOUD, 'DEPI', & + PRC=ZRCS_BEF(:,:,:)*PTSTEP, PRI=ZRIS_BEF(:,:,:)*PTSTEP, & + PQC=PSVS(:,:,:,NSV_ELECBEG+1)*PTSTEP, & + PQI=PSVS(:,:,:,NSV_ELECBEG+3)*PTSTEP, & + PQCS=PSVS(:,:,:,NSV_ELECBEG+1), PQIS=PSVS(:,:,:,NSV_ELECBEG+3),& + PQPIS=PSVS(:,:,:,NSV_ELECBEG), PQNIS=PSVS(:,:,:,NSV_ELECEND), & + PCND=ZCND, PDEP=ZDEP) + END IF + END IF END IF - +! deallocate( zexn ) ! CASE ('ICE4') @@ -896,6 +1134,13 @@ SELECT CASE ( HCLOUD ) ENDDO ZZZ = MZF( PZZ ) IF(LRED .AND. LADJ_BEFORE) THEN + IF (HELEC == 'ELE4') THEN + ! save the cloud droplets and ice crystals m.r. source before adjustement + ZRCS_BEF(:,:,:) = PRS(:,:,:,2) + ZRIS_BEF(:,:,:) = PRS(:,:,:,4) + END IF + ! + ! Performe the saturation ajdustment CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & PARAM_ICEN, TBUCONF, KRR, & 'ADJU', & @@ -915,23 +1160,143 @@ SELECT CASE ( HCLOUD ) PRH=PRS(:,:,:,7)*PTSTEP, & PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + ! + IF (HELEC == 'ELE4') THEN + ! Compute the condensation and sublimation rates + ZCND(:,:,:) = PRS(:,:,:,2) - ZRCS_BEF(:,:,:) + ZDEP(:,:,:) = PRS(:,:,:,4) - ZRIS_BEF(:,:,:) + ! + ! Compute the charge exchanged during evaporation of cloud droplets (negative ZCND) and + ! during sublimation of ice crystals (negative ZDEP) + CALL ELEC_ADJUST (KRR, PRHODJ, HCLOUD, 'ADJU', & + PRC=ZRCS_BEF(:,:,:)*PTSTEP, PRI=ZRIS_BEF(:,:,:)*PTSTEP, & + PQC=PSVS(:,:,:,NSV_ELECBEG+1)*PTSTEP, & + PQI=PSVS(:,:,:,NSV_ELECBEG+3)*PTSTEP, & + PQCS=PSVS(:,:,:,NSV_ELECBEG+1), PQIS=PSVS(:,:,:,NSV_ELECBEG+3),& + PQPIS=PSVS(:,:,:,NSV_ELECBEG), PQNIS=PSVS(:,:,:,NSV_ELECEND), & + PCND=ZCND, PDEP=ZDEP ) + END IF ENDIF IF (LRED) THEN - CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, & - RAIN_ICE_DESCRN, TBUCONF, & - PTSTEP, KRR, ZEXN, & - ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & - PRT(:,:,:,3), PRT(:,:,:,4), & - PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC, PINPRR, PEVAP3D, & - PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & - TBUDGETS,SIZE(TBUDGETS), & - PSEA, PTOWN, & - PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR ) + IF (HELEC == 'ELE4') THEN + ! to match with PHYEX, electric charge variables are no more optional, but their size + ! depends on the activation (or not) of the electrification scheme + GELEC = .TRUE. + ALLOCATE(ZQPIT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQNIT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQCT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQRT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQIT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQST(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQGT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQHT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQPIS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQNIS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQCS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQRS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQIS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQSS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQGS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ALLOCATE(ZQHS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ZQPIT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG) + ZQCT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+1) + ZQRT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+2) + ZQIT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+3) + ZQST(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+4) + ZQGT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+5) + ZQHT(:,:,:) = PSVT(:,:,:,NSV_ELECBEG+6) + ZQNIT(:,:,:) = PSVT(:,:,:,NSV_ELECEND) + ZQPIS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG) + ZQCS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+1) + ZQRS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+2) + ZQIS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+3) + ZQSS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+4) + ZQGS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+5) + ZQHS(:,:,:) = PSVS(:,:,:,NSV_ELECBEG+6) + ZQNIS(:,:,:) = PSVS(:,:,:,NSV_ELECEND) + IF (LSEDIM_BEARD) THEN + ALLOCATE(ZEFIELDW(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))) + ZEFIELDW(:,:,:) = XEFIELDW(:,:,:) + ELSE + ALLOCATE(ZEFIELDW(0,0,0)) + END IF + ELSE + GELEC = .FALSE. + ALLOCATE(ZQPIT(0,0,0)) + ALLOCATE(ZQNIT(0,0,0)) + ALLOCATE(ZQCT(0,0,0)) + ALLOCATE(ZQRT(0,0,0)) + ALLOCATE(ZQIT(0,0,0)) + ALLOCATE(ZQST(0,0,0)) + ALLOCATE(ZQGT(0,0,0)) + ALLOCATE(ZQHT(0,0,0)) + ALLOCATE(ZQPIS(0,0,0)) + ALLOCATE(ZQNIS(0,0,0)) + ALLOCATE(ZQCS(0,0,0)) + ALLOCATE(ZQRS(0,0,0)) + ALLOCATE(ZQIS(0,0,0)) + ALLOCATE(ZQSS(0,0,0)) + ALLOCATE(ZQGS(0,0,0)) + ALLOCATE(ZQHS(0,0,0)) + ALLOCATE(ZEFIELDW(0,0,0)) + END IF + ! + CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, RAIN_ICE_DESCRN, & + ELEC_PARAM, ELEC_DESCR, TBUCONF, 0, .FALSE., & + GELEC, LSEDIM_BEARD, & + PTSTEP, KRR, ZEXN, & + ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & + PRT(:,:,:,4), PRT(:,:,:,5), PRT(:,:,:,6), & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & + PINPRC, PINPRR, PEVAP3D, & + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & + TBUDGETS,SIZE(TBUDGETS), & + ZQPIT, ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQNIT, & + ZQPIS, ZQCS, ZQRS, ZQIS, ZQSS, ZQGS, ZQNIS, & + ZEFIELDW, ZLATHAM_IAGGS, & + PSEA, PTOWN, & + PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR, & + PQHT=ZQHT, PQHS=ZQHS ) + ! + IF (HELEC == 'ELE4') THEN + PSVT(:,:,:,NSV_ELECBEG) = ZQPIT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+1) = ZQCT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+2) = ZQRT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+3) = ZQIT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+4) = ZQST(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+5) = ZQGT(:,:,:) + PSVT(:,:,:,NSV_ELECBEG+6) = ZQHT(:,:,:) + PSVT(:,:,:,NSV_ELECEND) = ZQNIT(:,:,:) + PSVS(:,:,:,NSV_ELECBEG) = ZQPIS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+1) = ZQCS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+2) = ZQRS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+3) = ZQIS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+4) = ZQSS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+5) = ZQGS(:,:,:) + PSVS(:,:,:,NSV_ELECBEG+6) = ZQHS(:,:,:) + PSVS(:,:,:,NSV_ELECEND) = ZQNIS(:,:,:) + END IF + DEALLOCATE(ZQPIT) + DEALLOCATE(ZQNIT) + DEALLOCATE(ZQCT) + DEALLOCATE(ZQRT) + DEALLOCATE(ZQIT) + DEALLOCATE(ZQST) + DEALLOCATE(ZQGT) + DEALLOCATE(ZQHT) + DEALLOCATE(ZQPIS) + DEALLOCATE(ZQNIS) + DEALLOCATE(ZQCS) + DEALLOCATE(ZQRS) + DEALLOCATE(ZQIS) + DEALLOCATE(ZQSS) + DEALLOCATE(ZQGS) + DEALLOCATE(ZQHS) + DEALLOCATE(ZEFIELDW) + ! ELSE CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1, & KSPLITR, PTSTEP, KRR, & @@ -941,36 +1306,57 @@ SELECT CASE ( HCLOUD ) PRT(:,:,:,5), PRT(:,:,:,6), & PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D, & PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR, & PSEA, PTOWN, & - PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR) + PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR ) END IF - - +! ! !* 10.2 Perform the saturation adjustment over cloud ice and cloud water ! IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN - CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & - PARAM_ICEN, TBUCONF, KRR, & - 'DEPI', & - PTSTEP, ZSIGQSAT2D, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & - ZEXN, PCF_MF, PRC_MF, PRI_MF, & - ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & - PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTH=PTHS*PTSTEP, PTHS=PTHS, & - OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRR=PRS(:,:,:,3)*PTSTEP, & - PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & - PRS=PRS(:,:,:,5)*PTSTEP, & - PRG=PRS(:,:,:,6)*PTSTEP, & - TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & - PRH=PRS(:,:,:,7)*PTSTEP, & - PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + IF (HELEC == 'ELE4') THEN + ! save the cloud droplets and ice crystals m.r. source before adjustement + ZRCS_BEF(:,:,:) = PRS(:,:,:,2) + ZRIS_BEF(:,:,:) = PRS(:,:,:,4) + END IF + ! + ! Performe the saturation ajdustment + CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN, & + PARAM_ICEN, TBUCONF, KRR, 'DEPI', & + PTSTEP, ZSIGQSAT2D, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, & + ZEXN, PCF_MF, PRC_MF, PRI_MF, & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & + PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & + PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & + PTH=PTHS*PTSTEP, PTHS=PTHS, & + OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, & + PRR=PRS(:,:,:,3)*PTSTEP, & + PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & + PRS=PRS(:,:,:,5)*PTSTEP, & + PRG=PRS(:,:,:,6)*PTSTEP, & + TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & + PRH=PRS(:,:,:,7)*PTSTEP, & + PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & + PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + ! + IF (HELEC == 'ELE4') THEN + ! Compute the condensation and sublimation rates + ZCND(:,:,:) = PRS(:,:,:,2) - ZRCS_BEF(:,:,:) + ZDEP(:,:,:) = PRS(:,:,:,4) - ZRIS_BEF(:,:,:) + ! + ! Compute the charge exchanged during evaporation of cloud droplets (negative ZCND) and + ! during sublimation of ice crystals (negative ZDEP) + CALL ELEC_ADJUST (KRR, PRHODJ, HCLOUD, 'ADJU', & + PRC=ZRCS_BEF(:,:,:)*PTSTEP, PRI=ZRIS_BEF(:,:,:)*PTSTEP, & + PQC=PSVS(:,:,:,NSV_ELECBEG+1)*PTSTEP, & + PQI=PSVS(:,:,:,NSV_ELECBEG+3)*PTSTEP, & + PQCS=PSVS(:,:,:,NSV_ELECBEG+1), PQIS=PSVS(:,:,:,NSV_ELECBEG+3),& + PQPIS=PSVS(:,:,:,NSV_ELECBEG), PQNIS=PSVS(:,:,:,NSV_ELECEND), & + PCND=ZCND, PDEP=ZDEP ) + END IF END IF deallocate( zexn ) @@ -983,14 +1369,21 @@ SELECT CASE ( HCLOUD ) !* 12.1 Compute the explicit microphysical sources ! CASE ('LIMA') - ! + ! + IF (HELEC == 'ELE4') THEN + GELEC = .TRUE. + ELSE + GELEC = .FALSE. + END IF + ! DO JK=IKB,IKE ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) ENDDO ZZZ = MZF( PZZ ) - IF (LPTSPLIT) THEN + IF (LPTSPLIT) THEN + IF (GELEC) THEN CALL LIMA (YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - PTSTEP, & + PTSTEP, GELEC, & PRHODREF, PEXNREF, ZDZZ, & PRHODJ, PPABST, & NMOD_CCN, NMOD_IFN, NMOD_IMM, & @@ -998,59 +1391,97 @@ SELECT CASE ( HCLOUD ) PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), PW_ACT, & PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & - PEVAP3D, PCLDFR, PICEFR, PRAINFR, ZFPR ) - ELSE - - IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & - TPFILE, KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PW_ACT, PPABST, & - PDTHRAD, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) -! - IF (NMOM_I.GE.1) CALL LIMA_COLD(CST, OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PW_ACT, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PINPRS, PINPRG, PINPRH ) -! - IF (OWARM .AND. NMOM_I.GE.1) CALL LIMA_MIXED(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & - KRR, PZZ, PRHODJ, & - PRHODREF, PEXNREF, PPABST, PW_ACT, & - PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) - ENDIF + PEVAP3D, PCLDFR, PICEFR, PRAINFR, ZFPR, & + ZLATHAM_IAGGS, XEFIELDW, & + PSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), & + PSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND) ) + ELSE + CALL LIMA (YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & + PTSTEP, GELEC, & + PRHODREF, PEXNREF, ZDZZ, & + PRHODJ, PPABST, & + NMOD_CCN, NMOD_IFN, NMOD_IMM, & + PDTHRAD, PTHT, PRT, & + PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), PW_ACT, & + PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & + PEVAP3D, PCLDFR, PICEFR, PRAINFR, ZFPR, & + ZLATHAM_IAGGS ) + END IF + ELSE + IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & + TPFILE, KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PW_ACT, PPABST, & + PDTHRAD, & + PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) +! + IF (NMOM_I.GE.1) CALL LIMA_COLD(CST, OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_ACT, & + PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PINPRS, PINPRG, PINPRH ) +! + IF (OWARM .AND. NMOM_I.GE.1) CALL LIMA_MIXED(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_ACT, & + PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) + ENDIF ! !* 12.2 Perform the saturation adjustment ! - IF (LSPRO) THEN - CALL LIMA_NOTADJUST (KMI, TPFILE, HRAD, & - PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PEXNREF, PZZ, & - PTHT,PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS,PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PCLDFR, PICEFR, PRAINFR, PSRCS ) - ELSE IF (LPTSPLIT) THEN - CALL LIMA_ADJUST_SPLIT(YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), & - KRR, KMI, CCONDENS, CLAMBDA3, & - OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT, & - PRHODREF, PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, PPABSTT, ZZZ,& - PDTHRAD, PW_ACT, & - PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF ) - ELSE - CALL LIMA_ADJUST(KRR, KMI, TPFILE, & - OSUBG_COND, PTSTEP, & - PRHODREF, PRHODJ, PEXNREF, PPABST, PPABSTT, & - PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR ) - ENDIF + IF (HELEC == 'ELE4') THEN + ! save the cloud droplets and ice crystals m.r. source before adjustement + ZRCS_BEF(:,:,:) = PRS(:,:,:,2) + ZRIS_BEF(:,:,:) = PRS(:,:,:,4) + END IF + ! + IF (LSPRO) THEN + CALL LIMA_NOTADJUST (KMI, TPFILE, HRAD, & + PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PEXNREF, PZZ, & + PTHT,PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS,PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PCLDFR, PICEFR, PRAINFR, PSRCS ) + ELSE IF (LPTSPLIT) THEN + CALL LIMA_ADJUST_SPLIT(YLDIMPHYEX, CST, TBUCONF,TBUDGETS,SIZE(TBUDGETS), & + KRR, KMI, CCONDENS, CLAMBDA3, & + OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT, & + PRHODREF, PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, PPABSTT, ZZZ,& + PDTHRAD, PW_ACT, & + PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF ) + ELSE + CALL LIMA_ADJUST(KRR, KMI, TPFILE, & + OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABST, PPABSTT, & + PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR ) + ENDIF + ! + IF (HELEC == 'ELE4') THEN + ! Compute the condensation and sublimation rates + ZCND(:,:,:) = PRS(:,:,:,2) - ZRCS_BEF(:,:,:) + ZDEP(:,:,:) = PRS(:,:,:,4) - ZRIS_BEF(:,:,:) + ! Compute the charge exchanged during evaporation of cloud droplets (negative ZCND) and + ! during sublimation of ice crystals (negative ZDEP) + CALL ELEC_ADJUST (KRR, PRHODJ, HCLOUD, 'CEDS', & + PRC=ZRCS_BEF(:,:,:)*PTSTEP, PRI=ZRIS_BEF(:,:,:)*PTSTEP, & + PQC=PSVS(:,:,:,NSV_ELECBEG+1)*PTSTEP, & + PQI=PSVS(:,:,:,NSV_ELECBEG+3)*PTSTEP, & + PQCS=PSVS(:,:,:,NSV_ELECBEG+1), PQIS=PSVS(:,:,:,NSV_ELECBEG+3),& + PQPIS=PSVS(:,:,:,NSV_ELECBEG), PQNIS=PSVS(:,:,:,NSV_ELECEND), & + PCND=ZCND, PDEP=ZDEP ) + END IF ! END SELECT ! +IF (ALLOCATED(ZLATHAM_IAGGS)) DEALLOCATE(ZLATHAM_IAGGS) +! IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN ! TODO: code a generic routine to update vertical lower and upper levels to 0, a ! specific value or to IKB or IKE and apply it to every output prognostic variable of physics @@ -1080,12 +1511,11 @@ IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN ENDWHERE ENDIF ENDIF - +! ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NECON', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) - -!------------------------------------------------------------------------------- +call Sources_neg_correct( hcloud, helec, 'NECON', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) ! +!------------------------------------------------------------------------------- ! !* 13. SWITCH BACK TO THE PROGNOSTIC VARIABLES ! --------------------------------------- @@ -1101,7 +1531,22 @@ IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) ENDDO ENDIF - +! +IF (HELEC /= 'NONE') THEN + DO JSV = NSV_ELECBEG, NSV_ELECEND + PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) + END DO +! +!++cb-- ce qui suit n'est plus present en version standard en 5-6 : pourquoi ? +! Note that the LiNOx Conc. (in mol/mol) is PSVS (:,::,NSV_LNOXBEG) +! but there is no need to *PRHODJ(:,:,:) as it is done implicitly +! during unit conversion in flash_geom. +! + PSVS(:,:,:,NSV_ELECBEG) = MAX(0., PSVS(:,:,:,NSV_ELECBEG)) + PSVS(:,:,:,NSV_ELECEND) = MAX(0., PSVS(:,:,:,NSV_ELECEND)) +END IF +! +! !------------------------------------------------------------------------------- ! END SUBROUTINE RESOLVED_CLOUD diff --git a/src/MNH/resolved_elecn.f90 b/src/MNH/resolved_elecn.f90 index 38ca1080bd0cf2ef039f71591c867eca8b7f6b41..1874d5e7e4f7019e625615ca7eb56071c2b3460c 100644 --- a/src/MNH/resolved_elecn.f90 +++ b/src/MNH/resolved_elecn.f90 @@ -8,106 +8,68 @@ ! ########################### ! INTERFACE - SUBROUTINE RESOLVED_ELEC_n (HCLOUD, HSCONV, HMF_CLOUD, & - KRR, KSPLITR, KMI, KTCOUNT, OEXIT, & - HLBCX, HLBCY, HRAD, HTURBDIM, & - OSUBG_COND, OSIGMAS,PSIGQSAT, HSUBG_AUCV, & - PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & - PPABST, PTHT, PTHS, PWT, & - PRT, PRS, PSVT, PSVS, PCIT, & - PSIGS, PSRCS, PCLDFR, PMFCONV, PCF_MF, PRC_MF, & - PRI_MF, OSEDIC, OWARM, & - PINPRC, PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PINPRH, & - PSEA, PTOWN ) -! -CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud -CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme -CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integrations for rain sedimendation -INTEGER, INTENT(IN) :: KMI ! Model index -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -LOGICAL, INTENT(IN) :: OEXIT ! switch for the end of the temporal loop -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the - ! turbulence scheme -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. -LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: - ! use values computed in CONDENSATION - ! or that from turbulence scheme -REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV - ! Kind of Subgrid autoconversion method -REAL, INTENT(IN) :: PTSTEP ! Double Time step - ! (single if cold start) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source + SUBROUTINE RESOLVED_ELEC_n (HCLOUD, KRR, KMI, KTCOUNT, OEXIT, & + PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & + PPABST, PTHT, PWT, & + PRT, PRS, PSVT, PSVS, PCIT, & + PINPRR, & + PSEA, PTOWN, & + PCCS, PCRS, PCSS, PCGS, PCHS, & + PSVS_LNOX ) +! +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter +LOGICAL, INTENT(IN) :: OEXIT ! switch for the end of the temporal loop +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWT ! vertical velocity at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t +! REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Scalar variable at time t REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources ! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux - ! s'rc'/2Sigma_s2 at time t+1 - ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number - ! concentration at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice nb conc. + ! - at time t (for ICE schemes) + ! - source (for LIMA) ! -LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the - ! cloud droplet sedimentation -LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation - ! by slow warm microphysical - ! processes +REAL, DIMENSION(:,:), INTENT(IN) :: PINPRR ! Rain instant precip ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCCS ! Cld droplets nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCRS ! Rain nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCSS ! Snow nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCGS ! Graupel nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCHS ! Hail nb conc source ! -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PSVS_LNOX ! Scalar variable source for LNOX ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWT ! vertical velocity at time t-dt ! END SUBROUTINE RESOLVED_ELEC_n END INTERFACE END MODULE MODI_RESOLVED_ELEC_n ! -! ##################################################################################### - SUBROUTINE RESOLVED_ELEC_n (HCLOUD, HSCONV, HMF_CLOUD, & - KRR, KSPLITR, KMI, KTCOUNT, OEXIT, & - HLBCX, HLBCY, HRAD, HTURBDIM, & - OSUBG_COND, OSIGMAS,PSIGQSAT, HSUBG_AUCV, & - PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & - PPABST, PTHT, PTHS, PWT, & - PRT, PRS, PSVT, PSVS, PCIT, & - PSIGS, PSRCS, PCLDFR, PMFCONV, PCF_MF, PRC_MF, & - PRI_MF, OSEDIC, OWARM, & - PINPRC, PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PINPRH, & - PSEA, PTOWN ) -! ##################################################################################### +! ##################################################################### + SUBROUTINE RESOLVED_ELEC_n (HCLOUD, KRR, KMI, KTCOUNT, OEXIT, & + PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & + PPABST, PTHT, PWT, & + PRT, PRS, PSVT, PSVS, PCIT, & + PINPRR, & + PSEA, PTOWN, & + PCCS, PCRS, PCSS, PCGS, PCHS, & + PSVS_LNOX ) +! ##################################################################### ! !! PURPOSE !! ------- @@ -173,127 +135,78 @@ END MODULE MODI_RESOLVED_ELEC_n ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 12/02/2021: bugfix: change STATUS for opening files containing flash information (NEW->UNKNOWN) ! P. Wautelet 17/02/2021: budgets: add DRIFT and CORAY terms for electricity +!! C. Barthe 07/02/2022: remove cloud electrification from resolved_elec +!! C. Barthe 08/09/2022: enable using CELLS with LIMA +!! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end USE MODE_ELEC_ll USE MODE_IO_FILE, ONLY: IO_File_close, IO_File_open USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list, IO_File_find_byname USE MODE_ll ! -use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, & - lbudget_sv, & - NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, & - NBUDGET_SV1, & - tbudgets -USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZX, XDZY, XDZZ -USE MODD_FIELD_n, ONLY : XRSVS -USE MODD_CONF, ONLY : L1D, L2D, CEXP +USE MODD_CONF, ONLY : CEXP, CSEG USE MODD_CST -USE MODD_IO, ONLY: TFILEDATA, TFILE_DUMMY -USE MODD_PARAMETERS, ONLY : JPVEXT +USE MODD_IO, ONLY : TFILEDATA, TFILE_DUMMY +USE MODD_PARAMETERS, ONLY : JPVEXT +USE MODD_PARAM_LIMA, ONLY : NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H USE MODD_ELEC_DESCR USE MODD_ELEC_n -USE MODD_NSV -USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LCH_CONV_LINOX -USE MODD_DYN_n, ONLY: NSTOP, XTSTEP USE MODD_ARGSLIST_ll, ONLY : LIST_ll - USE MODD_TIME_n USE MODD_LMA_SIMULATOR ! -USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD -USE MODI_RAIN_ICE_ELEC -USE MODI_ICE_ADJUST_ELEC -USE MODI_TO_ELEC_FIELD_n +USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD USE MODI_FLASH_GEOM_ELEC_n -USE MODI_SHUMAN USE MODI_ION_ATTACH_ELEC -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -! -USE MODI_ION_DRIFT USE MODI_SERIES_CLOUD_ELEC ! IMPLICIT NONE ! +! !* 0.1 Declarations of dummy arguments : ! -CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud - ! paramerization -CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme -CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud -INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integrations for rain sedimendation - ! integrations for ice sedimendation -INTEGER, INTENT(IN) :: KMI ! Model index -INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter -LOGICAL, INTENT(IN) :: OEXIT ! switch for the end of the temporal loop -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type -CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the - ! turbulence scheme -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. -LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: - ! use values computed in CONDENSATION - ! or that from turbulence scheme -REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV - ! Kind of Subgrid autoconversion method -REAL, INTENT(IN) :: PTSTEP ! Double Time step - ! (single if cold start) -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT ! Moist variables at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter +LOGICAL, INTENT(IN) :: OEXIT ! switch for the end of the temporal loop +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference dry air density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWT ! vertical velocity at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at time t +! REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Scalar variable at time t REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources ! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux - ! s'rc'/2Sigma_s2 at time t+1 - ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number - ! concentration at time t -LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the - ! cloud droplet sedimentation - ! for ICE3 -LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation - ! by slow warm microphysical - ! processes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip -! -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWT ! vertical velocity at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice nb conc. + ! - at time t (for ICE schemes) + ! - source (for LIMA) +! +REAL, DIMENSION(:,:), INTENT(IN) :: PINPRR ! Rain instant precip +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +! +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCCS ! Cld droplets nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCRS ! Rain nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCSS ! Snow nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCGS ! Graupel nb conc source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PCHS ! Hail nb conc source +! +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PSVS_LNOX ! Scalar variable source for LNOX +! ! !* 0.2 Declarations of local variables : ! @@ -309,46 +222,18 @@ INTEGER :: IPROC ! my proc number INTEGER :: IERR ! error status INTEGER :: ILU ! unit number for IO ! -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZT, & - ZEXN, & - ZLV, & - ZLS, & - ZCPH -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZCOR - ! for the correction of negative rv -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZZ - ! model layer height REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZQTOT ! total charge source term -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZION_NUMBER !nearly Nb - ! of elementary charge in hydrometeor charge -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZADD ! ratio (0 - ! or 1) of ZION_NUMBER to add to positive - ! or negative ion number -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZIONTOT -! -REAL :: ZMASSTOT ! total mass for one water category - ! including the negative values -REAL :: ZMASSPOS ! total mass for one water category - ! after removing the negative values -REAL :: ZRATIO ! ZMASSTOT / ZMASSCOR ! INTEGER, DIMENSION(3) :: IMINLOC, IMAXLOC ! -LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: GMASSCOR ! mask for - ! mass correction LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: GATTACH ! mask for !ion recombination and attachment ! TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -INTEGER, DIMENSION(3) :: IM_LOC -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZDRIFT -INTEGER :: IPROCMIN, IK -INTEGER :: IXOR, IYOR ! origin of the extended subdomain CHARACTER (LEN=32) :: YASCFILE ! -REAL :: ZTEMP_DIST CHARACTER (LEN=18) :: YNAME LOGICAL :: GLMA_FILE LOGICAL, SAVE :: GFIRST_CALL = .TRUE. @@ -376,507 +261,70 @@ CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT IKE = SIZE(PZZ,3) - JPVEXT ! -if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'NEGA', pths(:, :, :) ) -if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'NEGA', prs (:, :, :, 1) ) -if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'NEGA', prs (:, :, :, 2) ) -if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'NEGA', prs (:, :, :, 3) ) -if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'NEGA', prs (:, :, :, 4) ) -if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'NEGA', prs (:, :, :, 5) ) -if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'NEGA', prs (:, :, :, 6) ) -if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'NEGA', prs (:, :, :, 7) ) -if ( lbudget_sv ) then - do jsv = nsv_elecbeg, nsv_elecend - call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'NEGA', psvs(:, :, :, jsv) ) - end do -end if -! -!------------------------------------------------------------------------------ -! -!* 2. MICROPHYSICS AND CLOUD ELECTRIFICATION -! -------------------------------------- -! -!* 2.1 Transformation into physical tendencies -! -! X-Component per m3.s into X-Component per kg.s -PTHS(:,:,:) = PTHS(:,:,:) / PRHODJ(:,:,:) -DO JRR = 1, KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) / PRHODJ(:,:,:) -END DO -! -DO JSV = NSV_ELECBEG, NSV_ELECEND - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) / PRHODJ(:,:,:) -ENDDO -! -! complete the lateral boundaries to avoid possible problems -! -PTHS(IIB-1,:,:) = PTHS(IIB,:,:) -PTHS(IIE+1,:,:) = PTHS(IIE,:,:) -PTHS(:,IJB-1,:) = PTHS(:,IJB,:) -PTHS(:,IJE+1,:) = PTHS(:,IJE,:) -! -PRS(IIB-1,:,:,1) = PRS(IIB,:,:,1) -PRS(IIE+1,:,:,1) = PRS(IIE,:,:,1) -PRS(:,IJB-1,:,1) = PRS(:,IJB,:,1) -PRS(:,IJE+1,:,1) = PRS(:,IJE,:,1) -! -PRS(IIB-1,:,:,2:) = 0.0 -PRS(IIE+1,:,:,2:) = 0.0 -PRS(:,IJB-1,:,2:) = 0.0 -PRS(:,IJE+1,:,2:) = 0.0 -! -! positive ion source -PSVS(IIB-1,:,:,NSV_ELECBEG) = PSVS(IIB,:,:,NSV_ELECBEG) -PSVS(IIE+1,:,:,NSV_ELECBEG) = PSVS(IIE,:,:,NSV_ELECBEG) -PSVS(:,IJB-1,:,NSV_ELECBEG) = PSVS(:,IJB,:,NSV_ELECBEG) -PSVS(:,IJE+1,:,NSV_ELECBEG) = PSVS(:,IJE,:,NSV_ELECBEG) -! source of hydrometeor charge -PSVS(IIB-1,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -PSVS(IIE+1,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -PSVS(:,IJB-1,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -PSVS(:,IJE+1,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -! negative ion source -PSVS(IIB-1,:,:,NSV_ELECEND) = PSVS(IIB,:,:,NSV_ELECEND) -PSVS(IIE+1,:,:,NSV_ELECEND) = PSVS(IIE,:,:,NSV_ELECEND) -PSVS(:,IJB-1,:,NSV_ELECEND) = PSVS(:,IJB,:,NSV_ELECEND) -PSVS(:,IJE+1,:,NSV_ELECEND) = PSVS(:,IJE,:,NSV_ELECEND) -! -! complete the physical boundaries to avoid some computations -! -IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') PRT(IIB-1,:,:,2:) = 0.0 -IF(LEAST_ll() .AND. HLBCX(2) /= 'CYCL') PRT(IIE+1,:,:,2:) = 0.0 -IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') PRT(:,IJB-1,:,2:) = 0.0 -IF(LNORTH_ll() .AND. HLBCY(2) /= 'CYCL') PRT(:,IJE+1,:,2:) = 0.0 -! -IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') & - PSVT(IIB-1,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -IF(LEAST_ll() .AND. HLBCX(2) /= 'CYCL') & - PSVT(IIE+1,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') & - PSVT(:,IJB-1,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -IF(LNORTH_ll() .AND. HLBCY(2) /= 'CYCL') & - PSVT(:,IJE+1,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -! -! complete the vertical boundaries -! -PTHS(:,:,IKB-1) = PTHS(:,:,IKB) -PTHS(:,:,IKE+1) = PTHS(:,:,IKE) -! -PRS(:,:,IKB-1,1) = PRS(:,:,IKB,1) -PRS(:,:,IKE+1,1) = PRS(:,:,IKE,1) -PRS(:,:,IKB-1,2:) = 0.0 -PRS(:,:,IKE+1,2:) = 0.0 -! -PRT(:,:,IKB-1,1) = PRT(:,:,IKB,1) -PRT(:,:,IKE+1,1) = PRT(:,:,IKE,1) -PRT(:,:,IKB-1,2:) = 0.0 -PRT(:,:,IKE+1,2:) = 0.0 -! -PSVS(:,:,IKB-1,NSV_ELECBEG) = PSVS(:,:,IKB,NSV_ELECBEG) ! Positive ion -PSVT(:,:,IKB-1,NSV_ELECBEG) = PSVT(:,:,IKB,NSV_ELECBEG) -PSVS(:,:,IKB-1,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 ! Hydrometeor charge -PSVS(:,:,IKE+1,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -PSVT(:,:,IKB-1,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -PSVT(:,:,IKE+1,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0 -PSVS(:,:,IKB-1,NSV_ELECEND) = PSVS(:,:,IKB,NSV_ELECEND) ! Negative ion -PSVT(:,:,IKB-1,NSV_ELECEND) = PSVT(:,:,IKB,NSV_ELECEND) -! -! personal comment: tranfering these variables to the -! microphysical routines would save -! computing time -! -ZEXN(:,:,:) = (PPABST(:,:,:) / XP00)**(XRD / XCPD) -ZT(:,:,:) = PTHT(:,:,:) * ZEXN(:,:,:) -ZLV(:,:,:) = XLVTT + (XCPV - XCL) * (ZT(:,:,:) - XTT) -ZLS(:,:,:) = XLSTT + (XCPV - XCI) * (ZT(:,:,:) - XTT) -ZCPH(:,:,:) = XCPD + XCPV * PTSTEP * PRS(:,:,:,1) -! -! -!------------------------------------------------------------------------------ -! -!* 3. REMOVE NEGATIVE VALUES -! ---------------------- -! -!* 3.1 Non local correction for precipitating species (Rood 87) -! -DO JRR = 3, KRR - SELECT CASE (JRR) - CASE(3,5,6,7) ! rain, snow, graupel and hail -! - IF (MIN_ll(PRS(:,:,:,JRR), IINFO_ll) < 0.0) THEN - GMASSCOR = PRS(:,:,:,JRR) < 0. -! -! compute the total water mass computation - ZMASSTOT = MAX( 0. , SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) -! -! remove the negative values - PRS(:,:,:,JRR) = MAX( 0., PRS(:,:,:,JRR) ) -! -! compute the new total mass - ZMASSPOS = MAX(XMNH_TINY,SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) -! -! correct again in such a way to conserve the total mass - ZRATIO = ZMASSTOT / ZMASSPOS - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * ZRATIO -! -! No electric charge without hydrometeors - WHERE( GMASSCOR ) - PSVS(:,:,:,NSV_ELECBEG-1+JRR) = 0. - ENDWHERE - END IF - END SELECT -END DO -! -! -!* 3.2 Adjustement for liquid and solid cloud -! -WHERE (PRS(:,:,:,4) < 0.) ! ice particles - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,4) = 0. -! - ZION_NUMBER(:,:,:) = ABS(PSVS(:,:,:,NSV_ELECBEG+3)) / XECHARGE - ZADD(:,:,:) = 0.5 + SIGN(0.5, PSVS(:,:,:,NSV_ELECBEG+3)) - PSVS(:,:,:,NSV_ELECBEG) = PSVS(:,:,:,NSV_ELECBEG) + & - ZADD(:,:,:) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECEND) = PSVS(:,:,:,NSV_ELECEND) + & - (1. - ZADD(:,:,:)) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECBEG+3) = 0.0 -END WHERE -! -! cloud -WHERE (PRS(:,:,:,2) < 0.) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,2) = 0. -! - ZION_NUMBER(:,:,:) = ABS(PSVS(:,:,:,NSV_ELECBEG+1)) / XECHARGE - ZADD(:,:,:) = 0.5 + SIGN(0.5, PSVS(:,:,:,NSV_ELECBEG+1)) - PSVS(:,:,:,NSV_ELECBEG) = PSVS(:,:,:,NSV_ELECBEG) + & - ZADD(:,:,:) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECEND) = PSVS(:,:,:,NSV_ELECEND) + & - (1. - ZADD(:,:,:)) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECBEG+1) = 0.0 -END WHERE -! -! if rc or ri are positive, we can correct negative rv -! cloud -WHERE ((PRS(:,:,:,1) < 0.) .AND. (PRS(:,:,:,2) > 0.) ) - PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) - PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,2) = 0. -! - ZION_NUMBER(:,:,:) = ABS(PSVS(:,:,:,NSV_ELECBEG+1)) / XECHARGE - ZADD(:,:,:) = 0.5 + SIGN(0.5, PSVS(:,:,:,NSV_ELECBEG+1)) - PSVS(:,:,:,NSV_ELECBEG) = PSVS(:,:,:,NSV_ELECBEG) + & - ZADD(:,:,:) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECEND) = PSVS(:,:,:,NSV_ELECEND) + & - (1.-ZADD(:,:,:)) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECBEG+1) = 0.0 -END WHERE -! -! ice -IF(KRR > 3) THEN - WHERE ((PRS(:,:,:,1) < 0.).AND.(PRS(:,:,:,4) > 0.)) - ZCOR(:,:,:) = MIN(-PRS(:,:,:,1),PRS(:,:,:,4)) - PRS(:,:,:,1) = PRS(:,:,:,1) + ZCOR(:,:,:) - PTHS(:,:,:) = PTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:) -! - ZION_NUMBER(:,:,:) = ABS(PSVS(:,:,:,NSV_ELECBEG+3)) / XECHARGE - ZADD(:,:,:) = 0.5 + SIGN(0.5, PSVS(:,:,:,NSV_ELECBEG+3)) - PSVS(:,:,:,NSV_ELECBEG) = PSVS(:,:,:,NSV_ELECBEG) + & - ZADD(:,:,:) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECEND) = PSVS(:,:,:,NSV_ELECEND) + & - (1. - ZADD(:,:,:)) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECBEG+3) = 0.0 - END WHERE -END IF -! -! -!* 3.3 cascade the electric charges in absence of hydrometeor -! -DO JRR = KRR, 5, -1 - WHERE(PRS(:,:,:,JRR) < XRTMIN_ELEC(JRR)) - PSVS(:,:,:,NSV_ELECBEG-2+JRR) = PSVS(:,:,:,NSV_ELECBEG-2+JRR) + & - PSVS(:,:,:,NSV_ELECBEG-1+JRR) - PSVS(:,:,:,NSV_ELECBEG-1+JRR) = 0.0 - END WHERE -END DO -JRR = 3 -WHERE(PRS(:,:,:,JRR) < XRTMIN_ELEC(JRR)) - PSVS(:,:,:,NSV_ELECBEG-2+JRR) = PSVS(:,:,:,NSV_ELECBEG-2+JRR) + & - PSVS(:,:,:,NSV_ELECBEG-1+JRR) - PSVS(:,:,:,NSV_ELECBEG-1+JRR) = 0.0 -END WHERE -DO JRR = 4, 2, -2 - WHERE(PRS(:,:,:,JRR) < XRTMIN_ELEC(JRR)) -! - ZION_NUMBER(:,:,:) = ABS(PSVS(:,:,:,NSV_ELECBEG-1+JRR)) / XECHARGE - ZADD(:,:,:) = 0.5 + SIGN(0.5, PSVS(:,:,:,NSV_ELECBEG-1+JRR)) - PSVS(:,:,:,NSV_ELECBEG) = PSVS(:,:,:,NSV_ELECBEG) + & - ZADD(:,:,:) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECEND) = PSVS(:,:,:,NSV_ELECEND) + & - (1. - ZADD(:,:,:)) * ZION_NUMBER(:,:,:) - PSVS(:,:,:,NSV_ELECBEG-1+JRR) = 0.0 - END WHERE -END DO -! -! -!* 3.4 store the budget terms -! -if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'NEGA', pths(:, :, :) * prhodj(:, :, :) ) -if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'NEGA', prs (:, :, :, 1) * prhodj(:, :, :) ) -if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'NEGA', prs (:, :, :, 2) * prhodj(:, :, :) ) -if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'NEGA', prs (:, :, :, 3) * prhodj(:, :, :) ) -if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'NEGA', prs (:, :, :, 4) * prhodj(:, :, :) ) -if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'NEGA', prs (:, :, :, 5) * prhodj(:, :, :) ) -if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'NEGA', prs (:, :, :, 6) * prhodj(:, :, :) ) -if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'NEGA', prs (:, :, :, 7) * prhodj(:, :, :) ) -if ( lbudget_sv ) then - do jsv = nsv_elecbeg, nsv_elecend - call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'NEGA', psvs(:, :, :, jsv) * prhodj(:, :, :) ) - end do -end if -! -!------------------------------------------------------------------------------ -! -!* 4. ION SOURCE FROM DRIFT MOTION AND COSMIC RAYS -! --------------------------------------------- -! -!* 4.1 Compute the electric field at mass points -! -PSVT(:,:,:,NSV_ELECBEG) = XECHARGE*PSVT(:,:,:,NSV_ELECBEG) ! 1/kg --> C/kg -PSVT(:,:,:,NSV_ELECEND) =-XECHARGE*PSVT(:,:,:,NSV_ELECEND) -! -CALL TO_ELEC_FIELD_n (PRT, PSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND), PRHODJ, & - KTCOUNT, KRR, & - XEFIELDU, XEFIELDV, XEFIELDW ) -! -PSVT(:,:,:,NSV_ELECBEG) = PSVT(:,:,:,NSV_ELECBEG)/XECHARGE ! back to 1/kg -PSVT(:,:,:,NSV_ELECEND) =-PSVT(:,:,:,NSV_ELECEND)/XECHARGE -! -! -!* 4.2 Compute source term from -/+(Div (N.mu E)) at mass points, -! N positive or negative ion number per kg of air (= PSVT) -! This is a contribution of drift motion to Source PSVS for ions -! in 1/(kg.s) -! CALL MYPROC_ELEC_ll (IPROC) ! -! Hereafter, ZCPH and ZCOR are used temporarily to store the drift sources -! of the positive and negative ions, respectively -! -CALL ION_DRIFT(ZCPH, ZCOR, PSVT, HLBCX, HLBCY) - -PSVS(:,:,:,NSV_ELECBEG) = PSVS(:,:,:,NSV_ELECBEG) + ZCPH(:,:,:) -PSVS(:,:,:,NSV_ELECEND) = PSVS(:,:,:,NSV_ELECEND) + ZCOR(:,:,:) - -if ( lbudget_sv ) then - call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg), 'DRIFT', zcph(:, :, :) * prhodj(:, :, :) ) - call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend), 'DRIFT', zcor(:, :, :) * prhodj(:, :, :) ) -end if -! -!* 4.3 Add Cosmic Ray source -! -PSVS(:,:,:,NSV_ELECBEG) = PSVS(:,:,:,NSV_ELECBEG) + & - XIONSOURCEFW(:,:,:) / PRHODREF(:,:,:) -PSVS(:,:,:,NSV_ELECEND) = PSVS(:,:,:,NSV_ELECEND) + & - XIONSOURCEFW(:,:,:) / PRHODREF(:,:,:) - -if ( lbudget_sv ) then - call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg), 'CORAY', xionsourcefw(:,:,:)/prhodref(:,:,:) * prhodj(:, :, :) ) - call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend), 'CORAY', xionsourcefw(:,:,:)/prhodref(:,:,:) * prhodj(:, :, :) ) -end if -! -!------------------------------------------------------------------------------- -! -SELECT CASE (HCLOUD) -! - CASE ('ICE3') -! -!* 5. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 3 ICE SPECIES) -! ----------------------------------------------------- -! -!* 5.1 Compute the explicit microphysical sources and -!* the explicit charging rates -! - CALL RAIN_ICE_ELEC (OSEDIC, HSUBG_AUCV, OWARM, & - KSPLITR, PTSTEP, KMI, KRR, & - PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & - PRT(:,:,:,4), PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC, PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS, & - PSVT(:,:,:,NSV_ELECBEG), PSVT(:,:,:,NSV_ELECBEG+1), & - PSVT(:,:,:,NSV_ELECBEG+2), PSVT(:,:,:,NSV_ELECBEG+3), & - PSVT(:,:,:,NSV_ELECBEG+4), PSVT(:,:,:,NSV_ELECBEG+5), & - PSVT(:,:,:,NSV_ELECEND), & - PSVS(:,:,:,NSV_ELECBEG), PSVS(:,:,:,NSV_ELECBEG+1), & - PSVS(:,:,:,NSV_ELECBEG+2), PSVS(:,:,:,NSV_ELECBEG+3), & - PSVS(:,:,:,NSV_ELECBEG+4), PSVS(:,:,:,NSV_ELECBEG+5), & - PSVS(:,:,:,NSV_ELECEND), & - PSEA, PTOWN ) - -! -!* 5.2 Perform the saturation adjustment over cloud ice and cloud water -! - ZZZ = MZF( PZZ ) - CALL ICE_ADJUST_ELEC (KRR, KMI, HRAD, HTURBDIM, & - HSCONV, HMF_CLOUD, & - OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & - PRHODJ, PEXNREF, PSIGS, PPABST, ZZZ, & - PMFCONV, PCF_MF, PRC_MF, PRI_MF, & - PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2), & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRRT=PRT(:,:,:,3), PRRS=PRS(:,:,:,3), & - PRIT=PRT(:,:,:,4), PRIS=PRS(:,:,:,4), & - PRST=PRT(:,:,:,5), PRSS=PRS(:,:,:,5), & - PRGT=PRT(:,:,:,6), PRGS=PRS(:,:,:,6), & - PQPIT=PSVT(:,:,:,NSV_ELECBEG), & !..PI.. Positive - PQPIS=PSVS(:,:,:,NSV_ELECBEG), & ! Ion Mixing Ratio - PQCT=PSVT(:,:,:,NSV_ELECBEG+1), & - PQCS=PSVS(:,:,:,NSV_ELECBEG+1), & - PQRT=PSVT(:,:,:,NSV_ELECBEG+2), & - PQRS=PSVS(:,:,:,NSV_ELECBEG+2), & - PQIT=PSVT(:,:,:,NSV_ELECBEG+3), & - PQIS=PSVS(:,:,:,NSV_ELECBEG+3), & - PQST=PSVT(:,:,:,NSV_ELECBEG+4), & - PQSS=PSVS(:,:,:,NSV_ELECBEG+4), & - PQGT=PSVT(:,:,:,NSV_ELECBEG+5), & - PQGS=PSVS(:,:,:,NSV_ELECBEG+5), & - PQNIT=PSVT(:,:,:,NSV_ELECEND), & !..NI.. Negative - PQNIS=PSVS(:,:,:,NSV_ELECEND)) ! Ion Mixing Ratio -! -! -!------------------------------------------------------------------------------- -! -!* 6. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 4 ICE SPECIES) -! ----------------------------------------------------- -! -!* 6.1 Compute the explicit microphysical sources and -!* the explicit charging rates -! - CASE ('ICE4') -! - CALL RAIN_ICE_ELEC (OSEDIC, HSUBG_AUCV, OWARM, & - KSPLITR, PTSTEP, KMI, KRR, & - PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & - PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & - PRT(:,:,:,4), PRT(:,:,:,5), PRT(:,:,:,6), & - PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & - PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC, PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS, & - PSVT(:,:,:,NSV_ELECBEG), PSVT(:,:,:,NSV_ELECBEG+1), & - PSVT(:,:,:,NSV_ELECBEG+2), PSVT(:,:,:,NSV_ELECBEG+3), & - PSVT(:,:,:,NSV_ELECBEG+4), PSVT(:,:,:,NSV_ELECBEG+5), & - PSVT(:,:,:,NSV_ELECEND), & - PSVS(:,:,:,NSV_ELECBEG), PSVS(:,:,:,NSV_ELECBEG+1), & - PSVS(:,:,:,NSV_ELECBEG+2), PSVS(:,:,:,NSV_ELECBEG+3), & - PSVS(:,:,:,NSV_ELECBEG+4), PSVS(:,:,:,NSV_ELECBEG+5), & - PSVS(:,:,:,NSV_ELECEND), & - PSEA, PTOWN, & - PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, & - PSVT(:,:,:,NSV_ELECBEG+6), PSVS(:,:,:,NSV_ELECBEG+6) ) -! Index NSV_ELECBEG: Positive ion , NSV_ELECEND: Negative ion -! -! -!* 6.2 Perform the saturation adjustment over cloud ice and cloud water -! - ZZZ = MZF( PZZ ) - CALL ICE_ADJUST_ELEC (KRR, KMI, HRAD, & - HTURBDIM, HSCONV, HMF_CLOUD, & - OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & - PRHODJ, PEXNREF, PSIGS, PPABST, ZZZ, & - PMFCONV, PCF_MF, PRC_MF, PRI_MF, & - PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2), & - PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & - PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & - PRRT=PRT(:,:,:,3), PRRS=PRS(:,:,:,3), & - PRIT=PRT(:,:,:,4), PRIS=PRS(:,:,:,4), & - PRST=PRT(:,:,:,5), PRSS=PRS(:,:,:,5), & - PRGT=PRT(:,:,:,6), PRGS=PRS(:,:,:,6), & - PQPIT=PSVT(:,:,:,NSV_ELECBEG), & !..PI.. Positive - PQPIS=PSVS(:,:,:,NSV_ELECBEG), & ! Ion Mixing Ratio - PQCT=PSVT(:,:,:,NSV_ELECBEG+1), & - PQCS=PSVS(:,:,:,NSV_ELECBEG+1), & - PQRT=PSVT(:,:,:,NSV_ELECBEG+2), & - PQRS=PSVS(:,:,:,NSV_ELECBEG+2), & - PQIT=PSVT(:,:,:,NSV_ELECBEG+3), & - PQIS=PSVS(:,:,:,NSV_ELECBEG+3), & - PQST=PSVT(:,:,:,NSV_ELECBEG+4), & - PQSS=PSVS(:,:,:,NSV_ELECBEG+4), & - PQGT=PSVT(:,:,:,NSV_ELECBEG+5), & - PQGS=PSVS(:,:,:,NSV_ELECBEG+5), & - PQNIT=PSVT(:,:,:,NSV_ELECEND), & !..NI.. Negative - PQNIS=PSVS(:,:,:,NSV_ELECEND), & ! Ion Mixing Ratio - PRHT=PRT(:,:,:,7), PRHS=PRS(:,:,:,7), & - PQHT=PSVT(:,:,:,NSV_ELECBEG+6), & - PQHS=PSVS(:,:,:,NSV_ELECBEG+6) ) -! -END SELECT -! -IF(KTCOUNT .EQ. 1 .AND. IPROC .EQ. 0) PRINT *,'KSPLITR=', KSPLITR -! -!------------------------------------------------------------------------------- -! -!* 7. SWITCH BACK TO THE PROGNOSTIC VARIABLES -! --------------------------------------- -! -! Convert source into component per m3 of air and sec., i.e. volumetric source -! -PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:) -! -DO JRR = 1,KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PRHODJ(:,:,:) -END DO -! -DO JSV = NSV_ELECBEG, NSV_ELECEND - PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) -ENDDO -! -! Note that the LiNOx Conc. (in mol/mol) is PSVS (:,::,NSV_LNOXBEG) -! but there is no need to *PRHODJ(:,:,:) as it is done implicitly -! during unit conversion in flash_geom. -! -PSVS(:,:,:,NSV_ELECBEG) = MAX(0., PSVS(:,:,:,NSV_ELECBEG)) -PSVS(:,:,:,NSV_ELECEND) = MAX(0., PSVS(:,:,:,NSV_ELECEND)) +!------------------------------------------------------------------------------ ! -!------------------------------------------------------------------------------- ! -!* 8. ION RECOMBINATION AND ATTACHMENT +!* 2. ION RECOMBINATION AND ATTACHMENT ! -------------------------------- ! GATTACH(:,:,:) = .FALSE. GATTACH(IIB:IIE, IJB:IJE, IKB:IKE) = .TRUE. ! -IF (PRESENT(PSEA)) THEN - CALL ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF, & - PRHODJ, PSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & - PRS, PTHT, PCIT, PPABST, XEFIELDU, & - XEFIELDV, XEFIELDW, GATTACH, PTOWN, PSEA ) -ELSE - CALL ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF, & - PRHODJ, PSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & - PRS, PTHT, PCIT, PPABST, XEFIELDU, & - XEFIELDV, XEFIELDW, GATTACH ) -ENDIF +IF (HCLOUD(1:3) == 'ICE') THEN + IF (PRESENT(PSEA)) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PCIT, PPABST, XEFIELDU, & + XEFIELDV, XEFIELDW, GATTACH, & + PTOWN=PTOWN, PSEA=PSEA) + ELSE + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PCIT, PPABST, XEFIELDU, & + XEFIELDV, XEFIELDW, GATTACH) + ENDIF +ELSE IF (HCLOUD == 'LIMA') THEN + IF (KRR == 7) THEN + IF (NMOM_S == 1 .AND. NMOM_G == 1 .AND. NMOM_H == 1) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PCIT, PPABST, XEFIELDU, & + XEFIELDV, XEFIELDW, GATTACH, & + PCCS=PCCS, PCRS=PCRS) + ELSE IF (NMOM_S == 2 .AND. NMOM_G == 2 .AND. NMOM_H == 2) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PCIT, PPABST, XEFIELDU, & + XEFIELDV, XEFIELDW, GATTACH, & + PCCS=PCCS, PCRS=PCRS, PCSS=PCSS, PCGS=PCGS, PCHS=PCHS) + END IF + ELSE IF (KRR == 6) THEN + IF (NMOM_S == 1 .AND. NMOM_G == 1) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PCIT, PPABST, XEFIELDU, & + XEFIELDV, XEFIELDW, GATTACH, & + PCCS=PCCS, PCRS=PCRS) + ELSE IF (NMOM_S == 2 .AND. NMOM_G == 2) THEN + CALL ION_ATTACH_ELEC(KTCOUNT, KRR, HCLOUD, PTSTEP, PRHODREF, & + PRHODJ, PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PCIT, PPABST, XEFIELDU, & + XEFIELDV, XEFIELDW, GATTACH, & + PCCS=PCCS, PCRS=PCRS, PCSS=PCSS, PCGS=PCGS, PCHS=PCHS) + END IF + END IF +END IF ! !------------------------------------------------------------------------------- ! -!* 9. OPEN THE OUTPUT ASCII FILES +!* 3. OPEN THE OUTPUT ASCII FILES ! --------------------------- ! -IF (KTCOUNT==1 .AND. IPROC==0) THEN +IF (KTCOUNT == 1 .AND. IPROC == 0) THEN IF (LFLASH_GEOM) THEN - YASCFILE = CEXP//"_fgeom_diag.asc" + YASCFILE = CEXP//"_"//CSEG//"_fgeom_diag.asc" TZFILE_FGEOM_DIAG => NULL() CALL IO_File_add2list(TZFILE_FGEOM_DIAG,YASCFILE,'TXT','WRITE') CALL IO_File_open(TZFILE_FGEOM_DIAG,HPOSITION='APPEND',HSTATUS='UNKNOWN') @@ -1021,23 +469,116 @@ END IF ! the lightning scheme is now called at each time step ! but only if there's electric charge in the domain ! -ZQTOT(:,:,:) = XECHARGE * (PSVT(:,:,:,NSV_ELECBEG) - PSVT(:,:,:,NSV_ELECEND)) -DO JSV = NSV_ELECBEG+1, NSV_ELECEND-1 +ZQTOT(:,:,:) = XECHARGE * (PSVT(:,:,:,1) - PSVT(:,:,:,KRR+1)) +DO JSV = 2, KRR ZQTOT(:,:,:) = ZQTOT(:,:,:) + PSVT(:,:,:,JSV) END DO ! +!++cb-- reprendre les appels avec bcp de conditions : utiliser des tableaux (0,0,0) IF ((.NOT. LOCG) .AND. LELEC_FIELD .AND. MAX_ll(ABS(ZQTOT),IINFO_ll)>0.) THEN IF (LFLASH_GEOM) THEN - CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, PTSTEP, OEXIT, & - PRHODJ, PRHODREF, PRT, PCIT, PSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND), & - PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & - PZZ, PSVS(:,:,:,NSV_LNOXBEG), & - TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & - PTOWN, PSEA) + IF (HCLOUD(1:3) == 'ICE') THEN + IF (PRESENT(PTOWN) .AND. PRESENT(PSEA)) THEN + IF (PRESENT(PSVS_LNOX)) THEN + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PTOWN=PTOWN, PSEA=PSEA, PSVS_LNOX=PSVS_LNOX) + ELSE + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PTOWN=PTOWN, PSEA=PSEA) + END IF + ELSE + IF (PRESENT(PSVS_LNOX)) THEN + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PSVS_LNOX=PSVS_LNOX) + ELSE + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA) + END IF + END IF + ELSE + IF (HCLOUD == 'LIMA' .AND. ((KRR == 6 .AND. NMOM_S == 1 .AND. NMOM_G == 1) .OR. & + (KRR == 7 .AND. NMOM_S == 1 .AND. NMOM_G == 1 .AND. NMOM_H == 1))) THEN + IF (PRESENT(PSVS_LNOX)) THEN + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PCCS=PCCS, PCRS=PCRS, & + PSVS_LNOX=PSVS_LNOX) + ELSE + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PCCS=PCCS, PCRS=PCRS) + END IF + ELSE IF (HCLOUD == 'LIMA' .AND. KRR == 6 .AND. NMOM_S == 2 .AND. NMOM_G == 2) THEN + IF (PRESENT(PSVS_LNOX)) THEN + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PCCS=PCCS, PCRS=PCRS, PCSS=PCSS, PCGS=PCGS, & + PSVS_LNOX=PSVS_LNOX) + ELSE + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PCCS=PCCS, PCRS=PCRS, PCSS=PCSS, PCGS=PCGS) + END IF + ELSE IF (HCLOUD == 'LIMA' .AND. KRR == 7 .AND. NMOM_S == 2 .AND. NMOM_G == 2 .AND. NMOM_H == 2) THEN + IF (PRESENT(PSVS_LNOX)) THEN + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PCCS=PCCS, PCRS=PCRS, PCSS=PCSS, PCGS=PCGS, PCHS=PCHS, & + PSVS_LNOX=PSVS_LNOX) + ELSE + CALL FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, HCLOUD, PTSTEP, OEXIT, & + PRHODJ, PRHODREF, PRT, PCIT, & + PSVS(:,:,:,1:KRR+1), & + PRS, PTHT, PPABST, XEFIELDU, XEFIELDV, XEFIELDW, & + PZZ, & + TZFILE_FGEOM_DIAG, TZFILE_FGEOM_COORD, TZFILE_LMA, & + PCCS=PCCS, PCRS=PCRS, PCSS=PCSS, PCGS=PCGS, PCHS=PCHS) + END IF + END IF + END IF END IF ! - PSVS(:,:,:,NSV_ELECBEG) = MAX(0., PSVS(:,:,:,NSV_ELECBEG)) - PSVS(:,:,:,NSV_ELECEND) = MAX(0., PSVS(:,:,:,NSV_ELECEND)) + PSVS(:,:,:,1) = MAX(0., PSVS(:,:,:,1)) + PSVS(:,:,:,KRR+1) = MAX(0., PSVS(:,:,:,KRR+1)) ! END IF ! diff --git a/src/MNH/series_cloud_elec.f90 b/src/MNH/series_cloud_elec.f90 index c740922db924e0a69472a670046a154571f3977e..1eb1e4e48311570513adb6a6535a1290d6b07913 100644 --- a/src/MNH/series_cloud_elec.f90 +++ b/src/MNH/series_cloud_elec.f90 @@ -36,7 +36,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! ab. pressure at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice number ! concentration at time t TYPE(TFILEDATA), INTENT(IN) :: TPFILE_SERIES_CLOUD_ELEC -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(IN) :: PINPRR ! Rain instant precip ! END SUBROUTINE SERIES_CLOUD_ELEC END INTERFACE @@ -83,6 +83,7 @@ END MODULE MODI_SERIES_CLOUD_ELEC !! Philippe Wautelet: 22/01/2019: use standard FLUSH statement instead of non standard intrinsics ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! C. Barthe 20/03/2023: PRINPRR passed as input argument only ! !------------------------------------------------------------------------------- ! @@ -131,7 +132,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! ab. pressure at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Pristine ice number ! concentration at time t TYPE(TFILEDATA), INTENT(IN) :: TPFILE_SERIES_CLOUD_ELEC -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(IN) :: PINPRR ! Rain instant precip ! ! !* 0.2 Declarations of local variables : diff --git a/src/MNH/sources_neg_correct.f90 b/src/MNH/sources_neg_correct.f90 index 0302839408bb4045ae0b78adc29bdc812452c071..366fc1daafcb7e10049ec536a6977ccbe15c88e1 100644 --- a/src/MNH/sources_neg_correct.f90 +++ b/src/MNH/sources_neg_correct.f90 @@ -8,6 +8,7 @@ ! P. Wautelet 30/06/2020: remove non-local corrections in resolved_cloud for NEGA => new local corrections here ! J. Escobar 21/07/2020: bug <-> array of size(:,:,:,0) => return if krr=0 ! P. Wautelet 10/02/2021: budgets: add missing sources for NSV_C2R2BEG+3 budget +! C. Barthe 03/02/2022: add corrections for electric charges !----------------------------------------------------------------- module mode_sources_neg_correct @@ -19,7 +20,7 @@ public :: Sources_neg_correct,Sources_neg_correct_phy contains -subroutine Sources_neg_correct_phy(D, KSV, hcloud, hbudname, KRR, ptstep, ppabst, ptht, prt, prths, prrs, prsvs, prhodj) +subroutine Sources_neg_correct_phy(D, KSV, hcloud, helec, hbudname, KRR, ptstep, ppabst, ptht, prt, prths, prrs, prsvs, prhodj) ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t ! @@ -28,22 +29,23 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D INTEGER, INTENT(IN) :: KSV character(len=*), intent(in) :: hcloud ! Kind of cloud parameterization +character(len=*), intent(in) :: helec ! Kind of cloud electricity parameterization character(len=*), intent(in) :: hbudname ! Budget name integer, intent(in) :: KRR ! Number of moist variables real, intent(in) :: ptstep ! Timestep real, dimension(D%NIT,D%NJT,D%NKT), intent(in) :: ppabst ! Absolute pressure at time t real, dimension(D%NIT,D%NJT,D%NKT), intent(in) :: ptht ! Theta at time t -real, dimension(D%NIT,D%NJT,D%NKT, KRR), intent(in) :: prt ! Moist variables at time t +real, dimension(D%NIT,D%NJT,D%NKT, KRR), intent(in) :: prt ! Moist variables at time t real, dimension(D%NIT,D%NJT,D%NKT), intent(inout) :: prths ! Source terms -real, dimension(D%NIT,D%NJT,D%NKT, KRR), intent(inout) :: prrs ! Source terms -real, dimension(D%NIT,D%NJT,D%NKT, KSV), intent(inout) :: prsvs ! Source terms +real, dimension(D%NIT,D%NJT,D%NKT, KRR), intent(inout) :: prrs ! Source terms +real, dimension(D%NIT,D%NJT,D%NKT, KSV), intent(inout) :: prsvs ! Source terms real, dimension(D%NIT,D%NJT,D%NKT), intent(in), optional :: prhodj ! Dry density * jacobian ! -CALL SOURCES_NEG_CORRECT(HCLOUD, 'NETUR',KRR,PTSTEP,PPABST,PTHT,PRT,PRTHS,PRRS,PRSVS) +CALL SOURCES_NEG_CORRECT(HCLOUD, HELEC, 'NETUR',KRR,PTSTEP,PPABST,PTHT,PRT,PRTHS,PRRS,PRSVS) ! end subroutine Sources_neg_correct_phy ! -subroutine Sources_neg_correct( hcloud, hbudname, krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs, prhodj ) +subroutine Sources_neg_correct( hcloud, helec, hbudname, krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs, prhodj ) use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, & lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & @@ -52,9 +54,11 @@ use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudg tbudgets use modd_cst, only: xci, xcl, xcpd, xcpv, xlstt, xlvtt, xp00, xrd, xtt use modd_nsv, only: nsv_c2r2beg, nsv_c2r2end, nsv_lima_beg, nsv_lima_end, nsv_lima_nc, nsv_lima_nr,& - nsv_lima_ni, nsv_lima_ns, nsv_lima_ng, nsv_lima_nh + nsv_lima_ni, nsv_lima_ns, nsv_lima_ng, nsv_lima_nh, & + nsv_elecbeg, nsv_elecend use modd_param_lima, only: lspro_lima => lspro, & xctmin_lima => xctmin, xrtmin_lima => xrtmin +use modd_elec_descr, only: xrtmin_elec, xecharge use mode_budget, only: Budget_store_init, Budget_store_end use mode_msg @@ -62,6 +66,7 @@ use mode_msg implicit none character(len=*), intent(in) :: hcloud ! Kind of cloud parameterization +character(len=*), intent(in) :: helec ! Kind of cloud electricity parameterization character(len=*), intent(in) :: hbudname ! Budget name integer, intent(in) :: krr ! Number of moist variables real, intent(in) :: ptstep ! Timestep @@ -80,6 +85,7 @@ integer :: jsv integer :: isv_lima_end real, dimension(:, :, :), allocatable :: zt, zexn, zlv, zls, zcph, zcor logical, dimension(:, :, :), allocatable :: zmask +real, dimension(:, :, :), allocatable :: zadd, zion_number !++cb-- if ( krr == 0 ) return @@ -124,6 +130,11 @@ if ( hbudname /= 'NECON' .and. hbudname /= 'NEGA' ) then call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), Trim( hbudname ), prsvs(:, :, :, ji) ) end do end if + if ( lbudget_sv .and. helec(1:3) == 'ELE' ) then + do ji = nsv_elecbeg, nsv_elecend + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), Trim( hbudname ), prsvs(:, :, :, ji) ) + end do + end if else !NECON + NEGA if ( .not. present( prhodj ) ) & call Print_msg( NVERB_FATAL, 'GEN', 'Sources_neg_correct', 'optional argument prhodj not present' ) @@ -150,6 +161,11 @@ else !NECON + NEGA call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), Trim( hbudname ), prsvs(:, :, :, ji) * prhodj(:, :, :) ) end do end if + if ( lbudget_sv .and. helec(1:3) == 'ELE' ) then + do ji = nsv_elecbeg, nsv_elecend + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ji), Trim( hbudname ), prsvs(:, :, :, ji) * prhodj(:, :, :) ) + end do + end if end if allocate( zt ( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) @@ -166,6 +182,13 @@ if ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' ) then end if zcph(:, :, :) = xcpd + xcpv * prt(:, :, :, 1) +!++cb++ +if ( helec(1:3) == 'ELE' ) then + allocate( zadd( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) + allocate( zion_number( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) +end if +!--cb-- + deallocate( zt ) CLOUD: select case ( hcloud ) @@ -195,12 +218,29 @@ CLOUD: select case ( hcloud ) jrmax = Size( prrs, 4 ) end if do jr = 4, jrmax - where ( prrs(:, :, :, jr) < 0.) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, jr) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, jr) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, jr) = 0. - end where + if ( helec(1:3) == 'ELE' ) then + where ( prrs(:, :, :, jr) < 0.) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, jr) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, jr) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, jr) = 0. + ! + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+jr-1)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+jr-1)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+jr-1) = 0.0 + end where + else + where ( prrs(:, :, :, jr) < 0.) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, jr) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, jr) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, jr) = 0. + end where + end if end do ! ! cloud @@ -210,34 +250,119 @@ CLOUD: select case ( hcloud ) jrmax = 3 end if do jr = 2, jrmax - where ( prrs(:, :, :, jr) < 0.) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, jr) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, jr) * zlv(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, jr) = 0. - end where + if ( helec(1:3) == 'ELE' ) then + where ( prrs(:, :, :, jr) < 0.) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, jr) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, jr) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, jr) = 0. + ! + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+jr-1)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+jr-1)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+jr-1) = 0.0 + end where + else + where ( prrs(:, :, :, jr) < 0.) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, jr) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, jr) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, jr) = 0. + end where + end if end do ! ! if rc or ri are positive, we can correct negative rv + if ( helec(1:3) == 'ELE' ) then ! cloud - where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 2) > 0. ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 2) = 0. - end where + where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 2) > 0. ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 2) = 0. + ! + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+1)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+1)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+1) = 0.0 + end where ! ice - if ( krr > 3 ) then - allocate( zcor( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) - where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 4) > 0. ) - zcor(:, :, :) = Min( -prrs(:, :, :, 1), prrs(:, :, :, 4) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + zcor(:, :, :) - prths(:, :, :) = prths(:, :, :) - zcor(:, :, :) * zls(:, :, :) / & + if ( krr > 3 ) then + allocate( zcor( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) + where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 4) > 0. ) + zcor(:, :, :) = Min( -prrs(:, :, :, 1), prrs(:, :, :, 4) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + zcor(:, :, :) + prths(:, :, :) = prths(:, :, :) - zcor(:, :, :) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 4) = prrs(:, :, :, 4) - zcor(:, :, :) + ! + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+3)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+3)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+3) = 0.0 + end where + deallocate(zcor) + end if + else +! cloud + where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 2) > 0. ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 4) = prrs(:, :, :, 4) - zcor(:, :, :) + prrs(:, :, :, 2) = 0. end where +! ice + if ( krr > 3 ) then + allocate( zcor( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) + where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 4) > 0. ) + zcor(:, :, :) = Min( -prrs(:, :, :, 1), prrs(:, :, :, 4) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + zcor(:, :, :) + prths(:, :, :) = prths(:, :, :) - zcor(:, :, :) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 4) = prrs(:, :, :, 4) - zcor(:, :, :) + end where + deallocate(zcor) + end if end if ! +!++cb++ 08/06/23 deplace a la fin pour traiter aussi le cas de lima +! cascade the electric charge in the absence of hydrometeor +! if ( helec(1:3) == 'ELE' ) then +! do jr = krr, 5, -1 +! where(prrs(:,:,:,jr) < xrtmin_elec(jr)) +! prsvs(:,:,:,nsv_elecbeg-2+jr) = prsvs(:,:,:,nsv_elecbeg-2+jr) + & +! prsvs(:,:,:,nsv_elecbeg-1+jr) +! prsvs(:,:,:,nsv_elecbeg-1+jr) = 0.0 +! end where +! end do +! jr = 3 +! where(prrs(:,:,:,jr) < xrtmin_elec(jr)) +! prsvs(:,:,:,nsv_elecbeg-2+jr) = prsvs(:,:,:,nsv_elecbeg-2+jr) + & +! prsvs(:,:,:,nsv_elecbeg-1+jr) +! prsvs(:,:,:,nsv_elecbeg-1+jr) = 0.0 +! end where +! do jr = 4, 2, -2 +! where(prrs(:,:,:,jr) < xrtmin_elec(jr)) +! zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg-1+jr)) / xecharge +! zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg-1+jr)) +! prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & +! zadd(:,:,:) * zion_number(:,:,:) +! prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & +! (1. - zadd(:,:,:)) * zion_number(:,:,:) +! prsvs(:,:,:,nsv_elecbeg-1+jr) = 0.0 +! end where +! end do +! end if +!--cb-- ! case( 'C2R2', 'KHKO' ) where ( prrs(:, :, :, 2) < 0. .or. prsvs(:, :, :, nsv_c2r2beg + 1) < 0. ) @@ -262,110 +387,246 @@ CLOUD: select case ( hcloud ) ! ! case( 'LIMA' ) - allocate( zmask ( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) + allocate( zmask ( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) +! ! Correction where rc<0 or Nc<0 - if ( krr.GE.2 ) then - zmask(:,:,:)=(prrs(:, :, :, 2) < xrtmin_lima(2) / ptstep) - if (nsv_lima_nc.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nc) < xctmin_lima(2) / ptstep ) + if ( krr.GE.2 ) then + zmask(:,:,:)=(prrs(:, :, :, 2) < xrtmin_lima(2) / ptstep) + if (nsv_lima_nc.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nc) < xctmin_lima(2) / ptstep ) + if ( helec == 'ELE4' ) then where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 2) = 0. + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 2) = 0. + ! + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+1)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+1)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+1) = 0.0 end where where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 2) > 0. ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 2) = 0. + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 2) = 0. + ! + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+1)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+1)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+1) = 0.0 + end where + else + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 2) = 0. end where - if (nsv_lima_nc.gt.0) then - where (prrs(:, :, :, 2) == 0.) prsvs(:, :, :, nsv_lima_nc) = 0. - end if - end if + where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 2) > 0. ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 2) = 0. + end where + end if + if (nsv_lima_nc.gt.0) then + where (prrs(:, :, :, 2) == 0.) prsvs(:, :, :, nsv_lima_nc) = 0. + end if + end if +! ! Correction where rr<0 or Nr<0 - if ( krr.GE.3 .and. hbudname.ne.'NETUR' ) then - zmask(:,:,:)=(prrs(:, :, :, 3) < xrtmin_lima(3) / ptstep) - if (nsv_lima_nr.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nr) < xctmin_lima(3) / ptstep ) + if ( krr.GE.3 .and. hbudname.ne.'NETUR' ) then + zmask(:,:,:)=(prrs(:, :, :, 3) < xrtmin_lima(3) / ptstep) + if (nsv_lima_nr.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nr) < xctmin_lima(3) / ptstep ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 3) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 3) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 3) = 0. + end where + if ( helec == 'ELE4' ) then where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 3) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 3) * zlv(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 3) = 0. + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+2)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+2)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+2) = 0.0 end where - if (nsv_lima_nr.gt.0) then - where (prrs(:, :, :, 3) == 0.) prsvs(:, :, :, nsv_lima_nr) = 0. - end if - end if + end if + if (nsv_lima_nr.gt.0) then + where (prrs(:, :, :, 3) == 0.) prsvs(:, :, :, nsv_lima_nr) = 0. + end if + end if +! ! Correction where ri<0 or Ni<0 - if ( krr.GE.4 ) then - zmask(:,:,:)=(prrs(:, :, :, 4) < xrtmin_lima(4) / ptstep) - if (nsv_lima_ni.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ni) < xctmin_lima(4) / ptstep) + if ( krr.GE.4 ) then + zmask(:,:,:)=(prrs(:, :, :, 4) < xrtmin_lima(4) / ptstep) + if (nsv_lima_ni.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ni) < xctmin_lima(4) / ptstep) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 4) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 4) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 4) = 0. + end where + if ( helec == 'ELE4' ) then where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 4) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 4) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 4) = 0. + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+3)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+3)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+3) = 0.0 end where - allocate( zcor( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 4) > 0. ) - zcor(:, :, :) = Min( -prrs(:, :, :, 1), prrs(:, :, :, 4) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + zcor(:, :, :) - prths(:, :, :) = prths(:, :, :) - zcor(:, :, :) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 4) = prrs(:, :, :, 4) - zcor(:, :, :) + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+3)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+3)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+3) = 0.0 end where - deallocate( zcor ) - if (nsv_lima_ni.gt.0) then - where (prrs(:, :, :, 4) == 0.) prsvs(:, :, :, nsv_lima_ni) = 0. - end if - end if + end if + allocate( zcor( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) + where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 4) > 0. ) + zcor(:, :, :) = Min( -prrs(:, :, :, 1), prrs(:, :, :, 4) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + zcor(:, :, :) + prths(:, :, :) = prths(:, :, :) - zcor(:, :, :) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 4) = prrs(:, :, :, 4) - zcor(:, :, :) + end where + deallocate( zcor ) + if (nsv_lima_ni.gt.0) then + where (prrs(:, :, :, 4) == 0.) prsvs(:, :, :, nsv_lima_ni) = 0. + end if + end if +! ! Snow - if ( krr.GE.5 .and. hbudname.ne.'NETUR' ) then - zmask(:,:,:)=(prrs(:, :, :, 5) < xrtmin_lima(5) / ptstep) - if (nsv_lima_ns.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ns) < xctmin_lima(5) / ptstep ) + if ( krr.GE.5 .and. hbudname.ne.'NETUR' ) then + zmask(:,:,:)=(prrs(:, :, :, 5) < xrtmin_lima(5) / ptstep) + if (nsv_lima_ns.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ns) < xctmin_lima(5) / ptstep ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 5) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 5) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 5) = 0. + end where + if ( helec == 'ELE4' ) then where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 5) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 5) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 5) = 0. + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+4)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+4)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+4) = 0.0 end where - if (nsv_lima_ns.gt.0) then - where (prrs(:, :, :, 5) == 0.) prsvs(:, :, :, nsv_lima_ns) = 0. - end if - end if + end if + if (nsv_lima_ns.gt.0) then + where (prrs(:, :, :, 5) == 0.) prsvs(:, :, :, nsv_lima_ns) = 0. + end if + end if +! ! Graupel - if ( krr.GE.6 .and. hbudname.ne.'NETUR' ) then - zmask(:,:,:)=(prrs(:, :, :, 6) < xrtmin_lima(6) / ptstep) - if (nsv_lima_ng.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ng) < xctmin_lima(6) / ptstep ) + if ( krr.GE.6 .and. hbudname.ne.'NETUR' ) then + zmask(:,:,:)=(prrs(:, :, :, 6) < xrtmin_lima(6) / ptstep) + if (nsv_lima_ng.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ng) < xctmin_lima(6) / ptstep ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 6) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 6) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 6) = 0. + end where + if ( helec == 'ELE4' ) then where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 6) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 6) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 6) = 0. + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+5)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+5)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+5) = 0.0 end where - if (nsv_lima_ng.gt.0) then - where (prrs(:, :, :, 6) == 0.) prsvs(:, :, :, nsv_lima_ng) = 0. - end if - end if + end if + if (nsv_lima_ng.gt.0) then + where (prrs(:, :, :, 6) == 0.) prsvs(:, :, :, nsv_lima_ng) = 0. + end if + end if +! ! Hail - if ( krr.GE.7 .and. hbudname.ne.'NETUR' ) then - zmask(:,:,:)=(prrs(:, :, :, 7) < xrtmin_lima(7) / ptstep) - if (nsv_lima_nh.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nh) < xctmin_lima(7) / ptstep ) + if ( krr.GE.7 .and. hbudname.ne.'NETUR' ) then + zmask(:,:,:)=(prrs(:, :, :, 7) < xrtmin_lima(7) / ptstep) + if (nsv_lima_nh.gt.0) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nh) < xctmin_lima(7) / ptstep ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 7) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 7) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 7) = 0. + end where + if ( helec == 'ELE4' ) then where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 7) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 7) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 7) = 0. + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg+6)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg+6)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg+6) = 0.0 end where - if (nsv_lima_nh.gt.0) then - where (prrs(:, :, :, 7) == 0.) prsvs(:, :, :, nsv_lima_nh) = 0. - end if - end if + end if + if (nsv_lima_nh.gt.0) then + where (prrs(:, :, :, 7) == 0.) prsvs(:, :, :, nsv_lima_nh) = 0. + end if + end if ! - prsvs(:, :, :, nsv_lima_beg : isv_lima_end) = Max( 0.0, prsvs(:, :, :, nsv_lima_beg : isv_lima_end) ) - deallocate(zmask) + prsvs(:, :, :, nsv_lima_beg : isv_lima_end) = Max( 0.0, prsvs(:, :, :, nsv_lima_beg : isv_lima_end) ) + deallocate(zmask) end select CLOUD +! +! cascade the electric charge in the absence of hydrometeor +if ( helec(1:3) == 'ELE' ) then + do jr = krr, 5, -1 + where(prrs(:,:,:,jr) < xrtmin_elec(jr)) + prsvs(:,:,:,nsv_elecbeg-2+jr) = prsvs(:,:,:,nsv_elecbeg-2+jr) + & + prsvs(:,:,:,nsv_elecbeg-1+jr) + prsvs(:,:,:,nsv_elecbeg-1+jr) = 0.0 + end where + end do + jr = 3 + where(prrs(:,:,:,jr) < xrtmin_elec(jr)) + prsvs(:,:,:,nsv_elecbeg-2+jr) = prsvs(:,:,:,nsv_elecbeg-2+jr) + & + prsvs(:,:,:,nsv_elecbeg-1+jr) + prsvs(:,:,:,nsv_elecbeg-1+jr) = 0.0 + end where + do jr = 4, 2, -2 + where(prrs(:,:,:,jr) < xrtmin_elec(jr)) + zion_number(:,:,:) = abs(prsvs(:,:,:,nsv_elecbeg-1+jr)) / xecharge + zadd(:,:,:) = 0.5 + sign(0.5, prsvs(:,:,:,nsv_elecbeg-1+jr)) + prsvs(:,:,:,nsv_elecbeg) = prsvs(:,:,:,nsv_elecbeg) + & + zadd(:,:,:) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecend) = prsvs(:,:,:,nsv_elecend) + & + (1. - zadd(:,:,:)) * zion_number(:,:,:) + prsvs(:,:,:,nsv_elecbeg-1+jr) = 0.0 + end where + end do +end if +! +if (allocated(zion_number)) deallocate( zion_number ) +if (allocated(zadd)) deallocate( zadd ) +if (allocated(zls)) deallocate( zls ) +deallocate( zexn ) +deallocate( zlv ) +deallocate( zcph ) if ( hbudname /= 'NECON' .and. hbudname /= 'NEGA' ) then @@ -397,6 +658,11 @@ if ( hbudname /= 'NECON' .and. hbudname /= 'NEGA' ) then call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ji), Trim( hbudname ), prsvs(:, :, :, ji) ) end do end if + if ( lbudget_sv .and. helec(1:3) == 'ELE' ) then + do ji = nsv_elecbeg, nsv_elecend + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ji), Trim( hbudname ), prsvs(:, :, :, ji) ) + end do + end if else !NECON + NEGA if ( hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. & hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) then @@ -420,6 +686,11 @@ else !NECON + NEGA call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ji), Trim( hbudname ), prsvs(:, :, :, ji) * prhodj(:, :, :) ) end do end if + if ( lbudget_sv .and. helec(1:3) == 'ELE' ) then + do ji = nsv_elecbeg, nsv_elecend + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ji), Trim( hbudname ), prsvs(:, :, :, ji) * prhodj(:, :, :) ) + end do + end if end if end subroutine Sources_neg_correct diff --git a/src/PHYEX/micro/ini_param_elec.f90 b/src/PHYEX/micro/ini_param_elec.f90 index 03bc5fc30c2dc413ea721f83cdda88a4c543ae0e..b144572c51801be9f045437ebf8323b2a33b8994 100644 --- a/src/PHYEX/micro/ini_param_elec.f90 +++ b/src/PHYEX/micro/ini_param_elec.f90 @@ -10,18 +10,18 @@ IMPLICIT NONE INTERFACE ! - SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00, & - KRR, KND, PFDINFTY, IIU, IJU, IKU ) + SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVT, HCLOUD, HELEC, & + PRHO00, KRR, IIU, IJU, IKU ) ! USE MODD_IO, ONLY : TFILEDATA IMPLICIT NONE ! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVM -INTEGER, INTENT(IN) :: KND ! Number of intervals to integrate kernels +TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file +CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! microphysics scheme +CHARACTER (LEN=4), INTENT(IN) :: HELEC ! electrical scheme INTEGER, INTENT(IN) :: KRR ! Number of moist variables REAL, INTENT(IN) :: PRHO00 ! Pressure at ground level -REAL, INTENT(IN) :: PFDINFTY ! Factor used to define the "infinite" diameter INTEGER, INTENT(IN) :: IIU ! Upper dimension in x direction (local) INTEGER, INTENT(IN) :: IJU ! Upper dimension in y direction (local) INTEGER, INTENT(IN) :: IKU ! Upper dimension in z direction @@ -30,10 +30,10 @@ END SUBROUTINE INI_PARAM_ELEC END INTERFACE END MODULE MODI_INI_PARAM_ELEC ! -! ############################################################## - SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00, & - KRR, KND, PFDINFTY, IIU, IJU, IKU ) -! ############################################################## +! ############################################################### + SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVT, HCLOUD, HELEC, & + PRHO00, KRR, IIU, IJU, IKU) +! ############################################################### ! !!**** *INI_PARAM_ELEC* - initialize the constants necessary !! for the electrical scheme. @@ -88,6 +88,12 @@ END MODULE MODI_INI_PARAM_ELEC !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! J. Wurtz 03/2022: new snow characteristics +!! C. Barthe 04/02/2022 Add XGAMINC_RIM3 (no more initialized in ini_rain_ice_elec) +!! C. Barthe 07/06/2022 Add parameters for charge sedimentation in LIMA +!! C. Barthe 30/11/2022 Remove the section about charge neutralization ; +!! already done in ini_flash_geom_elec +!! C. Barthe 28/03/2023 Add parameters for sedimentation of cloud droplets charge +!! C. Barthe 13/07/2023 Modify parameters that contain C_x and x_x for Ns, Ng and Nh ! !------------------------------------------------------------------------------- ! @@ -102,12 +108,48 @@ USE MODD_IO, ONLY: TFILEDATA USE MODD_NSV, ONLY: NSV_ELECEND USE MODD_PARAMETERS USE MODD_PARAM_ICE_n -USE MODD_RAIN_ICE_DESCR_n -USE MODD_RAIN_ICE_PARAM_n +USE MODD_PARAM_LIMA, ONLY : XALPHAC_L=>XALPHAC, XNUC_L=>XNUC, XALPHAR_L=>XALPHAR, XNUR_L=>XNUR, & + XALPHAI_L=>XALPHAI, XNUI_L=>XNUI, XALPHAS_L=>XALPHAS, XNUS_L=>XNUS, & + XALPHAG_L=>XALPHAG, XNUG_L=>XNUG, & + XCEXVT_L=>XCEXVT +USE MODD_PARAM_LIMA_COLD, ONLY : XAI_L=>XAI, XBI_L=>XBI, XC_I_L=>XC_I, XDI_L=>XDI, & + XAS_L=>XAS, XBS_L=>XBS, XCS_L=>XCS, XDS_L=>XDS, XCCS_L=>XCCS, XCXS_L=>XCXS +USE MODD_PARAM_LIMA_MIXED,ONLY : XAG_L=>XAG, XBG_L=>XBG, XCG_L=>XCG, XDG_L=>XDG, XCCG_L=>XCCG, XCXG_L=>XCXG, & + XAH_L=>XAH, XBH_L=>XBH, XCH_L=>XCH, XDH_L=>XDH, XCCH_L=>XCCH, XCXH_L=>XCXH, & + XALPHAH_L=>XALPHAH, XNUH_L=>XNUH, & + XGAMINC_BOUND_MIN_L=>XGAMINC_BOUND_MIN, XGAMINC_BOUND_MAX_L=>XGAMINC_BOUND_MAX, & + NGAMINC_L=>NGAMINC, NACCLBDAR_L=>NACCLBDAR, NACCLBDAS_L=>NACCLBDAS, & + XACCLBDAR_MIN_L=>XACCLBDAR_MIN, XACCLBDAR_MAX_L=>XACCLBDAR_MAX, & + XACCLBDAS_MIN_L=>XACCLBDAS_MIN, XACCLBDAS_MAX_L=>XACCLBDAS_MAX, & + NDRYLBDAR_L=>NDRYLBDAR, NDRYLBDAS_L=>NDRYLBDAS, NDRYLBDAG_L=>NDRYLBDAG, & + XDRYLBDAR_MIN_L=>XDRYLBDAR_MIN, XDRYLBDAR_MAX_L=>XDRYLBDAR_MAX, & + XDRYLBDAS_MIN_L=>XDRYLBDAS_MIN, XDRYLBDAS_MAX_L=>XDRYLBDAS_MAX, & + XDRYLBDAG_MIN_L=>XDRYLBDAG_MIN, XDRYLBDAG_MAX_L=>XDRYLBDAG_MAX +USE MODD_PARAM_LIMA_WARM, ONLY : XAR_L=>XAR, XBR_L=>XBR, XCR_L=>XCR, XDR_L=>XDR, & + XCC_L=>XCC, XDC_L=>XDC, XCCR_L=>XCCR +USE MODD_RAIN_ICE_DESCR_n,ONLY : XALPHAC_I=>XALPHAC, XNUC_I=>XNUC, XALPHAR_I=>XALPHAR, XNUR_I=>XNUR, & + XALPHAI_I=>XALPHAI, XNUI_I=>XNUI, XALPHAS_I=>XALPHAS, XNUS_I=>XNUS, & + XALPHAG_I=>XALPHAG, XNUG_I=>XNUG, XALPHAH_I=>XALPHAH, XNUH_I=>XNUH, & + XCC_I=>XCC, XDC_I=>XDC, & + XAR_I=>XAR, XBR_I=>XBR, XCR_I=>XCR, XDR_I=>XDR, XCCR_I=>XCCR, & + XAI_I=>XAI, XBI_I=>XBI, XC_I_I=>XC_I, XDI_I=>XDI, & + XAS_I=>XAS, XBS_I=>XBS, XCS_I=>XCS, XDS_I=>XDS, XCCS_I=>XCCS, XCXS_I=>XCXS, & + XAG_I=>XAG, XBG_I=>XBG, XCG_I=>XCG, XDG_I=>XDG, XCCG_I=>XCCG, XCXG_I=>XCXG, & + XAH_I=>XAH, XBH_I=>XBH, XCH_I=>XCH, XDH_I=>XDH, XCCH_I=>XCCH, XCXH_I=>XCXH, & + XCEXVT_I=>XCEXVT +USE MODD_RAIN_ICE_PARAM_n,ONLY : XGAMINC_BOUND_MIN_I=>XGAMINC_BOUND_MIN, XGAMINC_BOUND_MAX_I=>XGAMINC_BOUND_MAX, & + NGAMINC_I=>NGAMINC, NACCLBDAR_I=>NACCLBDAR, NACCLBDAS_I=>NACCLBDAS, & + XACCLBDAR_MIN_I=>XACCLBDAR_MIN, XACCLBDAR_MAX_I=>XACCLBDAR_MAX, & + XACCLBDAS_MIN_I=>XACCLBDAS_MIN, XACCLBDAS_MAX_I=>XACCLBDAS_MAX, & + NDRYLBDAR_I=>NDRYLBDAR, NDRYLBDAS_I=>NDRYLBDAS, NDRYLBDAG_I=>NDRYLBDAG, & + XDRYLBDAR_MIN_I=>XDRYLBDAR_MIN, XDRYLBDAR_MAX_I=>XDRYLBDAR_MAX, & + XDRYLBDAS_MIN_I=>XDRYLBDAS_MIN, XDRYLBDAS_MAX_I=>XDRYLBDAS_MAX, & + XDRYLBDAG_MIN_I=>XDRYLBDAG_MIN, XDRYLBDAG_MAX_I=>XDRYLBDAG_MAX USE MODD_VAR_ll ! USE MODE_IO_FIELD_READ, only: IO_Field_read ! +USE MODI_GAMMA_INC USE MODI_MOMG USE MODE_RRCOLSS, ONLY: RRCOLSS USE MODE_RSCOLRG, ONLY: RSCOLRG @@ -118,37 +160,211 @@ IMPLICIT NONE ! !* 0.1 Declaration of dummy arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file -CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVM -INTEGER, INTENT(IN) :: KND ! Number of intervals to integrate kernels +TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file +CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! microphysics scheme +CHARACTER (LEN=4), INTENT(IN) :: HELEC ! electrical scheme INTEGER, INTENT(IN) :: KRR ! Number of moist variables REAL, INTENT(IN) :: PRHO00 ! Pressure at ground level -REAL, INTENT(IN) :: PFDINFTY ! Factor used to define the "infinite" diameter INTEGER, INTENT(IN) :: IIU ! Upper dimension in x direction (local) INTEGER, INTENT(IN) :: IJU ! Upper dimension in y direction (local) INTEGER, INTENT(IN) :: IKU ! Upper dimension in z direction ! !* 0.2 Declaration of local variables ! +INTEGER :: IND ! Number of intervals to integrate kernels +INTEGER :: J1, JLWC, JTEMP +INTEGER :: IGAMINC, IACCLBDAR, IACCLBDAS, IDRYLBDAR, IDRYLBDAS, IDRYLBDAG +! +REAL :: ZRATE ! Geometrical growth of Lbda in the tabulated + ! functions and kernels +REAL :: ZBOUND ! XDCSLIM*Lbda_s: upper bound for the partial + ! integration of the riming rate of the aggregates +! REAL :: ZESR ! Mean efficiency of rain-aggregate collection REAL :: ZEGS ! REAL :: ZEGR +REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter +! variables used to cope with the module variables common to icex and lima +REAL :: ZCEXVT, & + ZCC, ZDC, ZALPHAC, ZNUC, & + ZAR, ZBR, ZCR, ZDR, ZCCR, ZALPHAR, ZNUR, & + ZAI, ZBI, ZCI, ZDI, ZALPHAI, ZNUI, & + ZAS, ZBS, ZCS, ZDS, ZCCS, ZCXS, ZALPHAS, ZNUS, & + ZAG, ZBG, ZCG, ZDG, ZCCG, ZCXG, ZALPHAG, ZNUG, & + ZAH, ZBH, ZCH, ZDH, ZCCH, ZCXH, ZALPHAH, ZNUH, & + ZGAMINC_BOUND_MIN, ZGAMINC_BOUND_MAX, & + ZACCLBDAR_MIN, ZACCLBDAR_MAX, ZACCLBDAS_MIN, ZACCLBDAS_MAX, & + ZDRYLBDAR_MIN, ZDRYLBDAR_MAX, ZDRYLBDAS_MIN, ZDRYLBDAS_MAX, & + ZDRYLBDAG_MIN, ZDRYLBDAG_MAX +! REAL, DIMENSION(:,:), ALLOCATABLE :: ZMANSELL1, ZMANSELL2 ! Used to initialize ! XMANSELL array ! -INTEGER :: JLWC, JTEMP -REAL, DIMENSION(:), ALLOCATABLE :: ZT, ZLWCC, ZEW +REAL, DIMENSION(:), ALLOCATABLE :: ZT, ZLWCC, ZEW ! !------------------------------------------------------------------------------- -! constants for electricity +! +!* 1. PRELIMINARIES +! ------------- +! +!* 1.1 Constants for electricity ! XEPSILON = 8.85E-12 ! Dielectric permittivity of the air XECHARGE = 1.6E-19 ! Elementary charge (C) ! -!* 1. SHAPE PARAMETERS +! +!* 1.2 Address module variables common to ICEx and LIMA +! +IF (HCLOUD(1:3) == 'ICE') THEN + ZCEXVT = XCEXVT_I + ! + ZCC = XCC_I + ZDC = XDC_I + ZALPHAC = XALPHAC_I + ZNUC = XNUC_I + ! + ZAR = XAR_I + ZBR = XBR_I + ZCR = XCR_I + ZDR = XDR_I + ZCCR = XCCR_I + ZALPHAR = XALPHAR_I + ZNUR = XNUR_I + ! + ZAI = XAI_I + ZBI = XBI_I + ZCI = XC_I_I + ZDI = XDI_I + ZALPHAI = XALPHAI_I + ZNUI = XNUI_I + ! + ZAS = XAS_I + ZBS = XBS_I + ZCS = XCS_I + ZDS = XDS_I + ZCCS = XCCS_I + ZCXS = XCXS_I + ZALPHAS = XALPHAS_I + ZNUS = XNUS_I + ! + ZAG = XAG_I + ZBG = XBG_I + ZCG = XCG_I + ZDG = XDG_I + ZCCG = XCCG_I + ZCXG = XCXG_I + ZALPHAG = XALPHAG_I + ZNUG = XNUG_I + ! + ZAH = XAH_I + ZBH = XBH_I + ZCH = XCH_I + ZDH = XDH_I + ZCCH = XCCH_I + ZCXH = XCXH_I + ZALPHAH = XALPHAH_I + ZNUH = XNUH_I + ! + IGAMINC = NGAMINC_I + ZGAMINC_BOUND_MIN = XGAMINC_BOUND_MIN_I + ZGAMINC_BOUND_MAX = XGAMINC_BOUND_MAX_I + ! + IACCLBDAR = NACCLBDAR_I + IACCLBDAS = NACCLBDAS_I + ZACCLBDAR_MIN = XACCLBDAR_MIN_I + ZACCLBDAR_MAX = XACCLBDAR_MAX_I + ZACCLBDAS_MIN = XACCLBDAS_MIN_I + ZACCLBDAS_MAX = XACCLBDAS_MAX_I + ! + IDRYLBDAR = NDRYLBDAR_I + IDRYLBDAS = NDRYLBDAS_I + IDRYLBDAG = NDRYLBDAG_I + ZDRYLBDAR_MIN = XDRYLBDAR_MIN_I + ZDRYLBDAR_MAX = XDRYLBDAR_MAX_I + ZDRYLBDAS_MIN = XDRYLBDAS_MIN_I + ZDRYLBDAS_MAX = XDRYLBDAS_MAX_I + ZDRYLBDAG_MIN = XDRYLBDAG_MIN_I + ZDRYLBDAG_MAX = XDRYLBDAG_MAX_I + ! +ELSE IF (HCLOUD == 'LIMA') THEN + ZCEXVT = XCEXVT_L + ! + ZCC = XCC_L + ZDC = XDC_L + ZALPHAC = XALPHAC_L + ZNUC = XNUC_L + ! + ZAR = XAR_L + ZBR = XBR_L + ZCR = XCR_L + ZDR = XDR_L + ZCCR = XCCR_L + ZALPHAR = XALPHAR_L + ZNUR = XNUR_L + ! + ZAI = XAI_L + ZBI = XBI_L + ZCI = XC_I_L + ZDI = XDI_L + ZALPHAI = XALPHAI_L + ZNUI = XNUI_L + ! + ZAS = XAS_L + ZBS = XBS_L + ZCS = XCS_L + ZDS = XDS_L + ZCCS = XCCS_L + ZCXS = XCXS_L + ZALPHAS = XALPHAS_L + ZNUS = XNUS_L + ! + ZAG = XAG_L + ZBG = XBG_L + ZCG = XCG_L + ZDG = XDG_L + ZCCG = XCCG_L + ZCXG = XCXG_L + ZALPHAG = XALPHAG_L + ZNUG = XNUG_L + ! + ZAH = XAH_L + ZBH = XBH_L + ZCH = XCH_L + ZDH = XDH_L + ZCCH = XCCH_L + ZCXH = XCXH_L + ZALPHAH = XALPHAH_L + ZNUH = XNUH_L + ! + IGAMINC = NGAMINC_L + ZGAMINC_BOUND_MIN = XGAMINC_BOUND_MIN_L + ZGAMINC_BOUND_MAX = XGAMINC_BOUND_MAX_L + ! + IACCLBDAR = NACCLBDAR_L + IACCLBDAS = NACCLBDAS_L + ZACCLBDAR_MIN = XACCLBDAR_MIN_L + ZACCLBDAR_MAX = XACCLBDAR_MAX_L + ZACCLBDAS_MIN = XACCLBDAS_MIN_L + ZACCLBDAS_MAX = XACCLBDAS_MAX_L + ! + IDRYLBDAR = NDRYLBDAR_L + IDRYLBDAS = NDRYLBDAS_L + IDRYLBDAG = NDRYLBDAG_L + ZDRYLBDAR_MIN = XDRYLBDAR_MIN_L + ZDRYLBDAR_MAX = XDRYLBDAR_MAX_L + ZDRYLBDAS_MIN = XDRYLBDAS_MIN_L + ZDRYLBDAS_MAX = XDRYLBDAS_MAX_L + ZDRYLBDAG_MIN = XDRYLBDAG_MIN_L + ZDRYLBDAG_MAX = XDRYLBDAG_MAX_L +END IF +! +!------------------------------------------------------------------------------- +! +!* 2. SHAPE PARAMETERS ! ---------------- ! -XCXR = -1.0 ! Raindrop characteristic : XCXR (not declared in ini_rain_ice.f90) +XCXR = -1.0 ! Raindrop characteristic : XCXR (not initialized in ini_rain_ice.f90) ! ! Individual charge q(d) = e_x * d ** f_x with f_x = XFx ! @@ -205,7 +421,7 @@ XJCURR_FW = -2.7E-12 ! !------------------------------------------------------------------------------- ! -!* 2. COEFFICIENTS FOR CHARGE TRANSFERS +!* 3. COEFFICIENTS FOR CHARGE TRANSFERS ! --------------------------------- ! ! proportionality coefficient between mass transfer and charge transfer rates @@ -214,11 +430,11 @@ XJCURR_FW = -2.7E-12 ! XCOEF_RQ_V = 1 XCOEF_RQ_C = XFC / 3.0 ! XBC=3 -XCOEF_RQ_R = XFR / XBR -XCOEF_RQ_I = XFI / XBI -XCOEF_RQ_S = XFS / XBS -XCOEF_RQ_G = XFG / XBG -XCOEF_RQ_H = XFH / XBH +XCOEF_RQ_R = XFR / ZBR +XCOEF_RQ_I = XFI / ZBI +XCOEF_RQ_S = XFS / ZBS +XCOEF_RQ_G = XFG / ZBG +XCOEF_RQ_H = XFH / ZBH ! ! !------------------------------------------------------------------------------- @@ -240,6 +456,7 @@ XQHON = XQHON / (XLBDACQ**XFC) ! !* 4. SEDIMENTATION ! ------------- +! IF (ALLOCATED(XQTMIN)) DEALLOCATE(XQTMIN) IF (ALLOCATED(XRTMIN_ELEC)) DEALLOCATE(XRTMIN_ELEC) ! @@ -272,46 +489,78 @@ XLBDAS_MAXE = 2.E3 ! Less than 10000 particles in cube meter of cloud. XLBDAG_MAXE = 2.E3 ! XLBDAH_MAXE = 2.E3 ! ! -! Rain -! -XCEXVT = 0.4 -XEXQSEDR = (XCXR - XFR - XDR) / (XCXR - XBR) -XFQSEDR = XCR * (XCCR**(1 - XEXQSEDR)) * MOMG(XALPHAR,XNUR,XDR+XFR) * & - ((XAR * MOMG(XALPHAR,XNUR,XBR))**(-XEXQSEDR)) * (PRHO00)**XCEXVT -! -! Ice -! -XEXQSEDI = (XDI + XFI) / XBI -XFQSEDI = XC_I * MOMG(XALPHAI,XNUI,XDI+XFI) * (PRHO00**XCEXVT) * & - (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQSEDI) -! -! Snow -! -XEXQSEDS = (XCXS - XFS - XDS) / (XCXS - XBS) -XFQSEDS = XCS * (XCCS**(1 - XEXQSEDS)) * MOMG(XALPHAS,XNUS,XDS+XFS) * & - ((XAS * MOMG(XALPHAS,XNUS,XBS))**(-XEXQSEDS)) * (PRHO00)**XCEXVT -! -! Graupeln -! -XEXQSEDG = (XCXG - XFG - XDG) / (XCXG - XBG) -XFQSEDG = XCG * (XCCG**(1 - XEXQSEDG)) * MOMG(XALPHAG,XNUG,XDG+XFG) * & - ((XAG * MOMG(XALPHAG,XNUG,XBG))**(-XEXQSEDG)) * (PRHO00)**XCEXVT -! -! Hail -! -XEXQSEDH = (XCXH - XFH - XDH) / (XCXH - XBH) -XFQSEDH = XCH * (XCCH**(1 - XEXQSEDH)) * MOMG(XALPHAH,XNUH,XDH+XFH) * & - ((XAH * MOMG(XALPHAH,XNUH,XBH))**(-XEXQSEDH)) * (PRHO00)**XCEXVT -! +IF (HCLOUD(1:3) == 'ICE') THEN + ! + ! Cloud droplets + ! + ZCEXVT = 0.4 + XEXQSEDC = XFC + ZDC + XFQSEDC = ZCC * MOMG(ZALPHAC,ZNUC,ZDC+XFC) * (PRHO00)**ZCEXVT + ! + ! Rain + ! + XEXQSEDR = (XCXR - XFR - ZDR) / (XCXR - ZBR) + XFQSEDR = ZCR * (ZCCR**(1 - XEXQSEDR)) * MOMG(ZALPHAR,ZNUR,ZDR+XFR) * & + ((ZAR * MOMG(ZALPHAR,ZNUR,ZBR))**(-XEXQSEDR)) * (PRHO00)**ZCEXVT + ! + ! Ice +!!++cb++ 23/02/23 pour la microphysique, calcul fait pour des colonnes +! => on fait pareil ici pour garder la coherence +!XEXQSEDI = (ZDI + XFI) / ZBI +!XFQSEDI = ZCI * MOMG(ZALPHAI,ZNUI,ZDI+XFI) * (PRHO00**ZCEXVT) * & +! (ZAI * MOMG(ZALPHAI,ZNUI,ZBI))**(-XEXQSEDI) + XEXQSEDI = (1.585 + XFI) / 1.7 + XFQSEDI = 2.1E5 * MOMG(ZALPHAI,ZNUI,1.585+XFI) * (PRHO00**ZCEXVT) * & + (2.14E-3 * MOMG(ZALPHAI,ZNUI,1.7))**(-XEXQSEDI) +!--cb-- + XFCI = (4. * XPI * 900.)**(-1) + ! + ! Snow + ! + XEXQSEDS = (ZCXS - XFS - ZDS) / (ZCXS - ZBS) + XFQSEDS = ZCS * (ZCCS**(1 - XEXQSEDS)) * MOMG(ZALPHAS,ZNUS,ZDS+XFS) * & + ((ZAS * MOMG(ZALPHAS,ZNUS,ZBS))**(-XEXQSEDS)) * (PRHO00)**ZCEXVT + ! + ! Graupeln + ! + XEXQSEDG = (ZCXG - XFG - ZDG) / (ZCXG - ZBG) + XFQSEDG = ZCG * (ZCCG**(1 - XEXQSEDG)) * MOMG(ZALPHAG,ZNUG,ZDG+XFG) * & + ((ZAG * MOMG(ZALPHAG,ZNUG,ZBG))**(-XEXQSEDG)) * (PRHO00)**ZCEXVT + ! + ! Hail + ! + XEXQSEDH = (ZCXH - XFH - ZDH) / (ZCXH - ZBH) + XFQSEDH = ZCH * (ZCCH**(1 - XEXQSEDH)) * MOMG(ZALPHAH,ZNUH,ZDH+XFH) * & + ((ZAH * MOMG(ZALPHAH,ZNUH,ZBH))**(-XEXQSEDH)) * (PRHO00)**ZCEXVT +! +ELSE IF (HCLOUD == 'LIMA') THEN + ALLOCATE(XFQSED(KRR)) + XFQSED(:) = 0. + XFQSED(2) = ZCC * MOMG(ZALPHAC,ZNUC,ZDC+XFC) + XFQSED(3) = ZCR * MOMG(ZALPHAR,ZNUR,ZDR+XFR) + XFQSED(4) = ZCI * MOMG(ZALPHAI,ZNUI,ZDI+XFI) + XFQSED(5) = ZCS * MOMG(ZALPHAS,ZNUS,ZDS+XFS) + XFQSED(6) = ZCG * MOMG(ZALPHAG,ZNUG,ZDG+XFG) + IF (KRR == 7) XFQSED(7) = ZCH * MOMG(ZALPHAH,ZNUH,ZDH+XFH) + ! + ALLOCATE(XDQ(KRR)) + XDQ(:) = 0. + XDQ(2) = ZDC + XFC + XDQ(3) = ZDR + XFR + XDQ(4) = ZDI + XFI + XDQ(5) = ZDS + XFS + XDQ(6) = ZDG + XFG + IF (KRR == 7) XDQ(7) = ZDH + XFH +END IF ! !------------------------------------------------------------------------------- ! !* 5. EVAPORATION OF RAINDROPS ! ------------------------ ! -XQREVAV1 = (2. / XPI) * MOMG(XALPHAR,XNUR,XFR) / MOMG(XALPHAR,XNUR,2.) -XQREVAV2 = (XPI / XAR) * (MOMG(XALPHAR,XNUR,2.) / MOMG(XALPHAR,XNUR,XBR)) * & - (XCXR - 2.) / (XCXR - XBR) +!XQREVAV1 = (2. / XPI) * MOMG(ZALPHAR,ZNUR,XFR) / MOMG(ZALPHAR,ZNUR,2.) +!XQREVAV2 = (XPI / ZAR) * (MOMG(ZALPHAR,ZNUR,2.) / MOMG(ZALPHAR,ZNUR,ZBR)) * & +! (XCXR - 2.) / (XCXR - ZBR) ! ! !------------------------------------------------------------------------------- @@ -319,11 +568,22 @@ XQREVAV2 = (XPI / XAR) * (MOMG(XALPHAR,XNUR,2.) / MOMG(XALPHAR,XNUR,XBR)) * & !* 6. RIMING OF CLOUD DROPLETS ON SNOW ! -------------------------------- ! -XEXQSRIMCG = XCXS - XFS -XQSRIMCG = XCCS * MOMG(XALPHAS,XNUS,XFS) +IF (HELEC == 'ELE4') THEN + XEXQSRIMCG = -XFS + XQSRIMCG = MOMG(ZALPHAS,ZNUS,XFS) +ELSE + XEXQSRIMCG = ZCXS - XFS + XQSRIMCG = ZCCS * MOMG(ZALPHAS,ZNUS,XFS) +END IF ! ! The array containing the tabulated function M(fs,D_cs^lim)/M(fs) -! is implemented in ini_rain_ice.f90 +! is no more implemented in ini_rain_ice.f90 +ZRATE = EXP(LOG(ZGAMINC_BOUND_MAX/ZGAMINC_BOUND_MIN)/REAL(IGAMINC-1)) +IF( .NOT.ALLOCATED(XGAMINC_RIM3) ) ALLOCATE( XGAMINC_RIM3(IGAMINC) ) +DO J1 = 1, IGAMINC + ZBOUND = ZGAMINC_BOUND_MIN * ZRATE**(J1-1) + XGAMINC_RIM3(J1) = GAMMA_INC(ZNUS+XFS/ZALPHAS,ZBOUND) +END DO ! ! !------------------------------------------------------------------------------- @@ -331,9 +591,15 @@ XQSRIMCG = XCCS * MOMG(XALPHAS,XNUS,XFS) !* 7. CONTACT FREEZING BETWEEN RAINDROPS AND PRISTINE ICE ! --------------------------------------------------- ! -XEXQRCFRIG = XCXR - XDR - XFR - 2.0 -XQRCFRIG = (XPI / 4.0) * XCR * XCCR * MOMG(XALPHAR,XNUR,XDR+XFR+2.) * & - PRHO00**XCEXVT +IF (HELEC == 'ELE4') THEN + XEXQRCFRIG = - ZDR - XFR - 2.0 + XQRCFRIG = (XPI / 4.0) * ZCR * MOMG(ZALPHAR,ZNUR,ZDR+XFR+2.) * & + PRHO00**ZCEXVT +ELSE + XEXQRCFRIG = XCXR - ZDR - XFR - 2.0 + XQRCFRIG = (XPI / 4.0) * ZCR * ZCCR * MOMG(ZALPHAR,ZNUR,ZDR+XFR+2.) * & + PRHO00**ZCEXVT +END IF ! ! !------------------------------------------------------------------------------- @@ -350,7 +616,7 @@ ALLOCATE( XIND_RATE(IIU, IJU, IKU) ) ALLOCATE( XEW(IIU, IJU, IKU) ) XEW(:,:,:) = 0. ! -SELECT CASE(HGETSVM(NSV_ELECEND)) +SELECT CASE(HGETSVT(NSV_ELECEND)) CASE ('READ') CALL IO_Field_read(TPINIFILE,'NI_IAGGS',XNI_IAGGS) CALL IO_Field_read(TPINIFILE,'NI_IDRYG',XNI_IDRYG) @@ -399,39 +665,39 @@ IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & XSKN = 24. XSKN_TAK = 2.0 ! for Takahashi ! - XFQIAGGSP = XIKP * XCS**(1. + XINP) * & - MOMG(XALPHAS, XNUS, 2.+XDS*(1.+XINP)) * & - MOMG(XALPHAI, XNUI, XIMP) - XFQIAGGSN = XIKN * XCS**(1. + XINN) * & - MOMG(XALPHAS, XNUS, 2.+XDS*(1.+XINN)) * & - MOMG(XALPHAI, XNUI, XIMN) + XFQIAGGSP = XIKP * ZCS**(1. + XINP) * & + MOMG(ZALPHAS, ZNUS, 2.+ZDS*(1.+XINP)) * & + MOMG(ZALPHAI, ZNUI, XIMP) + XFQIAGGSN = XIKN * ZCS**(1. + XINN) * & + MOMG(ZALPHAS, ZNUS, 2.+ZDS*(1.+XINN)) * & + MOMG(ZALPHAI, ZNUI, XIMN) ! - XFQIDRYGBSP = XIKP * XCG**(1. + XINP) * & - MOMG(XALPHAG, XNUG, 2.+XDG*(1.+XINP)) * & - MOMG(XALPHAI, XNUI, XIMP) - XFQIDRYGBSN = XIKN * XCG**(1. + XINN) * & - MOMG(XALPHAG, XNUG, 2.+XDG*(1.+XINN)) * & - MOMG(XALPHAI, XNUI, XIMN) + XFQIDRYGBSP = XIKP * ZCG**(1. + XINP) * & + MOMG(ZALPHAG, ZNUG, 2.+ZDG*(1.+XINP)) * & + MOMG(ZALPHAI, ZNUI, XIMP) + XFQIDRYGBSN = XIKN * ZCG**(1. + XINN) * & + MOMG(ZALPHAG, ZNUG, 2.+ZDG*(1.+XINN)) * & + MOMG(ZALPHAI, ZNUI, XIMN) ! XFQIAGGSP_TAK = XFQIAGGSP * XIKP_TAK / XIKP XFQIAGGSN_TAK = XFQIAGGSN * XIKN_TAK / XIKN XFQIDRYGBSP_TAK = XFQIDRYGBSP * XIKP_TAK / XIKP XFQIDRYGBSN_TAK = XFQIDRYGBSN * XIKN_TAK / XIKN ! - XAIGAMMABI = XAI * MOMG(XALPHAI, XNUI, XBI) + XAIGAMMABI = ZAI * MOMG(ZALPHAI, ZNUI, ZBI) ! - XLBQSDRYGB1SP = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS, XNUS, XSMP) - XLBQSDRYGB1SN = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS, XNUS, XSMN) - XLBQSDRYGB2SP = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS, XNUS, 1.+XSMP) - XLBQSDRYGB2SN = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS, XNUS, 1.+XSMN) - XLBQSDRYGB3SP = MOMG(XALPHAS, XNUS, 2.+XSMP) - XLBQSDRYGB3SN = MOMG(XALPHAS, XNUS, 2.+XSMN) + XLBQSDRYGB1SP = MOMG(ZALPHAG,ZNUG,2.) * MOMG(ZALPHAS, ZNUS, XSMP) + XLBQSDRYGB1SN = MOMG(ZALPHAG,ZNUG,2.) * MOMG(ZALPHAS, ZNUS, XSMN) + XLBQSDRYGB2SP = 2. * MOMG(ZALPHAG,ZNUG,1.) * MOMG(ZALPHAS, ZNUS, 1.+XSMP) + XLBQSDRYGB2SN = 2. * MOMG(ZALPHAG,ZNUG,1.) * MOMG(ZALPHAS, ZNUS, 1.+XSMN) + XLBQSDRYGB3SP = MOMG(ZALPHAS, ZNUS, 2.+XSMP) + XLBQSDRYGB3SN = MOMG(ZALPHAS, ZNUS, 2.+XSMN) ENDIF ! IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'TERAR' .OR. & CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN - XVSCOEF = XCS * MOMG(XALPHAS, XNUS, XBS+XDS) / MOMG(XALPHAS, XNUS, XBS) - XVGCOEF = XCG * MOMG(XALPHAG, XNUG, XBG+XDG) / MOMG(XALPHAG, XNUG, XBG) + XVSCOEF = ZCS * MOMG(ZALPHAS, ZNUS, ZBS+ZDS) / MOMG(ZALPHAS, ZNUS, ZBS) + XVGCOEF = ZCG * MOMG(ZALPHAG, ZNUG, ZBG+ZDG) / MOMG(ZALPHAG, ZNUG, ZBG) END IF ! ! @@ -568,7 +834,7 @@ IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & ALLOCATE(ZT(NIND_TEMP+1)) ! Kelvin ALLOCATE(ZLWCC(NIND_TEMP+1)) DO JTEMP = 1, NIND_TEMP+1 - ZT(JTEMP)=1.0-REAL(JTEMP)+XTT + ZT(JTEMP) = 1.0 - REAL(JTEMP) + XTT END DO ZLWCC(:) = MIN( MAX( -0.49 + 6.64E-2*(XTT-ZT(:)),0.22 ),1.1 ) ! (g m^-3) ALLOCATE(ZEW(NIND_LWC+1)) @@ -578,13 +844,13 @@ IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & ! 0.10 to 0.90 every 0.10 (9 values) ! 1.00 to 10.0 every 1.00 (10 values) DO JLWC = 1, 9 - ZEW(JLWC)=0.01*REAL(JLWC) + ZEW(JLWC) = 0.01 * REAL(JLWC) END DO DO JLWC = 10, 18 - ZEW(JLWC)=0.1 + 0.1*REAL(JLWC-10) + ZEW(JLWC) = 0.1 + 0.1 * REAL(JLWC-10) END DO DO JLWC = 19, NIND_LWC+1 - ZEW(JLWC)=1.0 + REAL(JLWC-19) + ZEW(JLWC) = 1.0 + REAL(JLWC-19) END DO ! ! @@ -806,24 +1072,38 @@ XFQIAGGSBH = 2.E-14 ! (C.) Constant for ice-snow charging process ! !* 9.2 Gardiner et al. (1985) parameterization ! -XFQIAGGSBG = (XPI / 4.0) * XCCS * XCS**4. * PRHO00**(4. * XCEXVT) * & - MOMG(XALPHAS,XNUS,2.+4.*XDS) * 7.3 * & - MOMG(XALPHAI,XNUI,4.) +IF (HELEC == 'ELE4') THEN + XFQIAGGSBG = (XPI / 4.0) * ZCS**4. * PRHO00**(4. * ZCEXVT) * & + MOMG(ZALPHAS,ZNUS,2.+4.*ZDS) * 7.3 * & + MOMG(ZALPHAI,ZNUI,4.) +ELSE + XFQIAGGSBG = (XPI / 4.0) * ZCCS * ZCS**4. * PRHO00**(4. * ZCEXVT) * & + MOMG(ZALPHAS,ZNUS,2.+4.*ZDS) * 7.3 * & + MOMG(ZALPHAI,ZNUI,4.) +END IF ! ! !* 9.3 Saunders et al.(1991) parameterization ! -XFQIAGGSBS = (XPI / 4.0) * XCCS +IF (HELEC == 'ELE4') THEN + XFQIAGGSBS = XPI / 4.0 +ELSE + XFQIAGGSBS = (XPI / 4.0) * ZCCS +END IF ! ! !* 9.4 Takahashi (1978) parameterization ! IF (CNI_CHARGING == 'TAKAH') THEN - XFQIAGGSBT1 = (XPI / 4.0) * XCCS * XCS - XFQIAGGSBT2 = 10 * MOMG(XALPHAS,XNUS,2.+XDS) - XFQIAGGSBT3 = 5. * XCS * MOMG(XALPHAI,XNUI,2.) * & - MOMG(XALPHAS,XNUS,2.+2*XDS) / ((1.E-4)**2 * 8. * & - (XAI * MOMG(XALPHAI,XNUI,XBI))**(2 / XBI)) + IF (HELEC == 'ELE4') THEN + XFQIAGGSBT1 = (XPI / 4.0) * ZCS + ELSE + XFQIAGGSBT1 = (XPI / 4.0) * ZCCS * ZCS + END IF + XFQIAGGSBT2 = 10. * MOMG(ZALPHAS,ZNUS,2.+ZDS) + XFQIAGGSBT3 = 5. * ZCS * MOMG(ZALPHAI,ZNUI,2.) * & + MOMG(ZALPHAS,ZNUS,2.+2.*ZDS) / ((1.E-4)**2 * 8. * & + (ZAI * MOMG(ZALPHAI,ZNUI,ZBI))**(2. / ZBI)) END IF ! ! @@ -832,36 +1112,43 @@ END IF !* 10. ACCRETION OF RAINDROPS ON SNOW ! ------------------------------ ! -IF( .NOT.ALLOCATED(XKER_Q_RACCSS)) ALLOCATE( XKER_Q_RACCSS(NACCLBDAS,NACCLBDAR) ) -IF( .NOT.ALLOCATED(XKER_Q_RACCS)) ALLOCATE( XKER_Q_RACCS (NACCLBDAS,NACCLBDAR) ) -IF( .NOT.ALLOCATED(XKER_Q_SACCRG)) ALLOCATE( XKER_Q_SACCRG(NACCLBDAR,NACCLBDAS) ) +IF( .NOT.ALLOCATED(XKER_Q_RACCSS)) ALLOCATE( XKER_Q_RACCSS(IACCLBDAS,IACCLBDAR) ) +IF( .NOT.ALLOCATED(XKER_Q_RACCS)) ALLOCATE( XKER_Q_RACCS (IACCLBDAS,IACCLBDAR) ) +IF( .NOT.ALLOCATED(XKER_Q_SACCRG)) ALLOCATE( XKER_Q_SACCRG(IACCLBDAR,IACCLBDAS) ) ! -XFQRACCS = (XPI / 4.0) * XCCS * XCCR * (PRHO00**XCEXVT) +IF (HELEC == 'ELE4') THEN + XFQRACCS = (XPI / 4.0) * PRHO00**ZCEXVT +ELSE + XFQRACCS = (XPI / 4.0) * ZCCS * ZCCR * (PRHO00**ZCEXVT) +END IF ! -XLBQRACCS1 = MOMG(XALPHAR,XNUR,2.+XFR) -XLBQRACCS2 = 2. * MOMG(XALPHAR,XNUR,1.+XFR) * MOMG(XALPHAS,XNUS,1.) -XLBQRACCS3 = MOMG(XALPHAR,XNUR,XFR) * MOMG(XALPHAS,XNUS,2.) +XLBQRACCS1 = MOMG(ZALPHAR,ZNUR,2.+XFR) +XLBQRACCS2 = 2. * MOMG(ZALPHAR,ZNUR,1.+XFR) * MOMG(ZALPHAS,ZNUS,1.) +XLBQRACCS3 = MOMG(ZALPHAR,ZNUR,XFR) * MOMG(ZALPHAS,ZNUS,2.) ! -XLBQSACCRG1 = MOMG(XALPHAS,XNUS,2.+XFS) -XLBQSACCRG2 = 2. * MOMG(XALPHAS,XNUS,1.+XFS) * MOMG(XALPHAR,XNUR,1.) -XLBQSACCRG3 = MOMG(XALPHAS,XNUS,XFS) * MOMG(XALPHAR,XNUR,2.) +XLBQSACCRG1 = MOMG(ZALPHAS,ZNUS,2.+XFS) +XLBQSACCRG2 = 2. * MOMG(ZALPHAS,ZNUS,1.+XFS) * MOMG(ZALPHAR,ZNUR,1.) +XLBQSACCRG3 = MOMG(ZALPHAS,ZNUS,XFS) * MOMG(ZALPHAR,ZNUR,2.) ! -ZESR = 1.0 +! These values are pasted from ini_rain_ice (7.2.2) +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZESR = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG ! -CALL RRCOLSS (KND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XFR, XCS, XDS, 0., XCR, XDR, & - XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & - PFDINFTY, XKER_Q_RACCSS, XAG, XBS, XAS ) +CALL RRCOLSS (IND, ZALPHAS, ZNUS, ZALPHAR, ZNUR, & + ZESR, XFR, ZCS, ZDS, 0., ZCR, ZDR, & + ZACCLBDAS_MAX, ZACCLBDAR_MAX, ZACCLBDAS_MIN, ZACCLBDAR_MIN, & + ZFDINFTY, XKER_Q_RACCSS, ZAG, ZBS, ZAS ) ! -CALL RZCOLX (KND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XFR, XCS, XDS, 0., XCR, XDR, 0., & - XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & - PFDINFTY, XKER_Q_RACCS ) +CALL RZCOLX (IND, ZALPHAS, ZNUS, ZALPHAR, ZNUR, & + ZESR, XFR, ZCS, ZDS, 0., ZCR, ZDR, 0., & + ZACCLBDAS_MAX, ZACCLBDAR_MAX, ZACCLBDAS_MIN, ZACCLBDAR_MIN, & + ZFDINFTY, XKER_Q_RACCS ) ! -CALL RSCOLRG (KND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XFS, XCS, XDS, 0., XCR, XDR, & - XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & - PFDINFTY, XKER_Q_SACCRG, XAG, XBS, XAS ) +CALL RSCOLRG (IND, ZALPHAS, ZNUS, ZALPHAR, ZNUR, & + ZESR, XFS, ZCS, ZDS, 0., ZCR, ZDR, & + ZACCLBDAS_MAX, ZACCLBDAR_MAX, ZACCLBDAS_MIN, ZACCLBDAR_MIN, & + ZFDINFTY, XKER_Q_SACCRG, ZAG, ZBS, ZAS ) ! !------------------------------------------------------------------------------- ! @@ -870,20 +1157,24 @@ CALL RSCOLRG (KND, XALPHAS, XNUS, XALPHAR, XNUR, & ! !* 11.1 charge transfer associated to mass transfer ! -IF( .NOT.ALLOCATED(XKER_Q_SDRYG)) ALLOCATE( XKER_Q_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +IF( .NOT.ALLOCATED(XKER_Q_SDRYG)) ALLOCATE( XKER_Q_SDRYG(IDRYLBDAG,IDRYLBDAS) ) ! -XFQSDRYG = (XPI / 4.0) * XCCS * XCCG * (PRHO00**XCEXVT) +IF (HELEC == 'ELE4') THEN + XFQSDRYG = (XPI / 4.0) * (PRHO00**ZCEXVT) +ELSE + XFQSDRYG = (XPI / 4.0) * ZCCS * ZCCG * (PRHO00**ZCEXVT) +END IF ! -XLBQSDRYG1 = MOMG(XALPHAS,XNUS,2.+XFS) -XLBQSDRYG2 = 2. * MOMG(XALPHAS,XNUS,1.+XFS) * MOMG(XALPHAG,XNUG,1.) -XLBQSDRYG3 = MOMG(XALPHAS,XNUS,XFS) * MOMG(XALPHAG,XNUG,2.) +XLBQSDRYG1 = MOMG(ZALPHAS,ZNUS,2.+XFS) +XLBQSDRYG2 = 2. * MOMG(ZALPHAS,ZNUS,1.+XFS) * MOMG(ZALPHAG,ZNUG,1.) +XLBQSDRYG3 = MOMG(ZALPHAS,ZNUS,XFS) * MOMG(ZALPHAG,ZNUG,2.) ! ZEGS = 1. ! also initialized in ini_rain_ice_elec ! -CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XFS, XCG, XDG, 0., XCS, XDS, 0., & - XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & - PFDINFTY, XKER_Q_SDRYG ) +CALL RZCOLX (IND, ZALPHAG, ZNUG, ZALPHAS, ZNUS, & + ZEGS, XFS, ZCG, ZDG, 0., ZCS, ZDS, 0., & + ZDRYLBDAG_MAX, ZDRYLBDAS_MAX, ZDRYLBDAG_MIN, ZDRYLBDAS_MIN, & + ZFDINFTY, XKER_Q_SDRYG ) ! ! !* 11.2 NI process: Heldson et Farley (1987) parameterization @@ -892,39 +1183,46 @@ IF (CNI_CHARGING == 'HELFA') THEN XHIDRYG = 2.E-15 ! Charge exchanged per collision between ice and graupel XHSDRYG = 2.E-14 ! - XFQSDRYGBH = (XPI / 4.0) * XCCG * XCCS * (PRHO00**(XCEXVT)) * XHSDRYG + IF (HELEC == 'ELE4') THEN + XFQSDRYGBH = (XPI / 4.0) * PRHO00**(ZCEXVT) * XHSDRYG + ELSE + XFQSDRYGBH = (XPI / 4.0) * ZCCG * ZCCS * (PRHO00**(ZCEXVT)) * XHSDRYG + END IF ! - XLBQSDRYGB4H = MOMG(XALPHAS,XNUS,2.) - XLBQSDRYGB5H = 2. * MOMG(XALPHAS,XNUS,1.) * MOMG(XALPHAG,XNUG,1.) - XLBQSDRYGB6H = MOMG(XALPHAG,XNUG,2.) -! - IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) ) - CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, 0., XCG, XDG, 0., XCS, XDS, 0., & - XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & - PFDINFTY, XKER_Q_SDRYGB ) + XLBQSDRYGB4H = MOMG(ZALPHAS,ZNUS,2.) + XLBQSDRYGB5H = 2. * MOMG(ZALPHAS,ZNUS,1.) * MOMG(ZALPHAG,ZNUG,1.) + XLBQSDRYGB6H = MOMG(ZALPHAG,ZNUG,2.) +! + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(IDRYLBDAG,IDRYLBDAS) ) + CALL RZCOLX (IND, ZALPHAG, ZNUG, ZALPHAS, ZNUS, & + ZEGS, 0., ZCG, ZDG, 0., ZCS, ZDS, 0., & + ZDRYLBDAG_MAX, ZDRYLBDAS_MAX, ZDRYLBDAG_MIN, ZDRYLBDAS_MIN, & + ZFDINFTY, XKER_Q_SDRYGB ) ! Delta vqb1_sg ENDIF ! ! !* 11.3 NI process: Gardiner et al. (1985) parameterization ! -IF (CNI_CHARGING == 'GARDI') THEN - XFQIDRYGBG = (XPI / 4.0) * XCCG * (PRHO00**(4. * XCEXVT)) * XCG**4. * & - 7.3 - XLBQIDRYGBG = MOMG(XALPHAI,XNUI,4.) * MOMG(XALPHAG,XNUG,2.+4.*XDG) -! - XFQSDRYGBG = (XPI / 4.0) * XCCS * XCCG * (PRHO00**(4. * XCEXVT)) * & - 7.3 - XLBQSDRYGB4G = MOMG(XALPHAS,XNUS,4.) * MOMG(XALPHAG,XNUG,2.) - XLBQSDRYGB5G = 2. * MOMG(XALPHAS,XNUS,5.) * MOMG(XALPHAG,XNUG,1.) - XLBQSDRYGB6G = MOMG(XALPHAS,XNUS,6.) -! - IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) ) - CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, 4., XCG, XDG, XCS, XDS, 4., & - XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & - PFDINFTY, XKER_Q_SDRYGB ) +IF (CNI_CHARGING == 'GARDI') THEN + IF (HELEC == 'ELE4') THEN + XFQIDRYGBG = (XPI / 4.0) * PRHO00**(4.*ZCEXVT) * ZCG**4. * 7.3 + XFQSDRYGBG = (XPI / 4.0) * PRHO00**(4.*ZCEXVT) * 7.3 + ELSE + XFQIDRYGBG = (XPI / 4.0) * ZCCG * (PRHO00**(4.*ZCEXVT)) * ZCG**4. * 7.3 + XFQSDRYGBG = (XPI / 4.0) * ZCCS * ZCCG * (PRHO00**(4.*ZCEXVT)) * 7.3 + END IF + XLBQIDRYGBG = MOMG(ZALPHAI,ZNUI,4.) * MOMG(ZALPHAG,ZNUG,2.+4.*ZDG) +! + XLBQSDRYGB4G = MOMG(ZALPHAS,ZNUS,4.) * MOMG(ZALPHAG,ZNUG,2.) + XLBQSDRYGB5G = 2. * MOMG(ZALPHAS,ZNUS,5.) * MOMG(ZALPHAG,ZNUG,1.) + XLBQSDRYGB6G = MOMG(ZALPHAS,ZNUS,6.) +! + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(IDRYLBDAG,IDRYLBDAS) ) + CALL VQZCOLX (IND, ZALPHAG, ZNUG, ZALPHAS, ZNUS, & + ZEGS, 4., ZCG, ZDG, ZCS, ZDS, 4., & + ZDRYLBDAG_MAX, ZDRYLBDAS_MAX, ZDRYLBDAG_MIN, ZDRYLBDAS_MIN, & + ZFDINFTY, XKER_Q_SDRYGB ) END IF ! ! @@ -935,25 +1233,30 @@ IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & CNI_CHARGING == 'SAP98' .OR. & CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN - XFQIDRYGBS = (XPI / 4.0) * XCCG - XFQSDRYGBS = (XPI / 4.0) * XCCS * XCCG - XLBQSDRYGB1S = MOMG(XALPHAG,XNUG,2.) - XLBQSDRYGB2S = 2. * MOMG(XALPHAG,XNUG,1.) -! - IF( .NOT.ALLOCATED(XKER_Q_SDRYGB1)) ALLOCATE( XKER_Q_SDRYGB1(NDRYLBDAG,NDRYLBDAS) ) - IF( .NOT.ALLOCATED(XKER_Q_SDRYGB2)) ALLOCATE( XKER_Q_SDRYGB2(NDRYLBDAG,NDRYLBDAS) ) + IF (HELEC == 'ELE4') THEN + XFQIDRYGBS = XPI / 4.0 + XFQSDRYGBS = XPI / 4.0 + ELSE + XFQIDRYGBS = (XPI / 4.0) * ZCCG + XFQSDRYGBS = (XPI / 4.0) * ZCCS * ZCCG + END IF + XLBQSDRYGB1S = MOMG(ZALPHAG,ZNUG,2.) + XLBQSDRYGB2S = 2. * MOMG(ZALPHAG,ZNUG,1.) +! + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB1)) ALLOCATE( XKER_Q_SDRYGB1(IDRYLBDAG,IDRYLBDAS) ) + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB2)) ALLOCATE( XKER_Q_SDRYGB2(IDRYLBDAG,IDRYLBDAS) ) ! ! Positive charging region - CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XSMP, XCG, XDG, XCS, XDS, (1.+XSNP), & - XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & - PFDINFTY, XKER_Q_SDRYGB1 ) + CALL VQZCOLX (IND, ZALPHAG, ZNUG, ZALPHAS, ZNUS, & + ZEGS, XSMP, ZCG, ZDG, ZCS, ZDS, (1.+XSNP), & + ZDRYLBDAG_MAX, ZDRYLBDAS_MAX, ZDRYLBDAG_MIN, ZDRYLBDAS_MIN, & + ZFDINFTY, XKER_Q_SDRYGB1 ) ! ! Negative charging region - CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XSMN, XCG, XDG, XCS, XDS, (1.+XSNN), & - XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & - PFDINFTY, XKER_Q_SDRYGB2 ) + CALL VQZCOLX (IND, ZALPHAG, ZNUG, ZALPHAS, ZNUS, & + ZEGS, XSMN, ZCG, ZDG, ZCS, ZDS, (1.+XSNN), & + ZDRYLBDAG_MAX, ZDRYLBDAS_MAX, ZDRYLBDAG_MIN, ZDRYLBDAS_MIN, & + ZFDINFTY, XKER_Q_SDRYGB2 ) ENDIF ! ! @@ -962,30 +1265,38 @@ ENDIF IF (CNI_CHARGING == 'TAKAH') THEN ! ! IDRYG_boun - XFQIDRYGBT1 = (XPI / 4.0) * XCCG * XCG - XFQIDRYGBT2 = 10.0 * MOMG(XALPHAG,XNUG,2.+XDG) - XFQIDRYGBT3 = 5.0 * XCG * MOMG(XALPHAI,XNUI,2.) * & - MOMG(XALPHAG,XNUG,2.+2.*XDG) / ((2.E-4)**2 * 8. * & - (XAI * MOMG(XALPHAI,XNUI,XBI))**(2 / XBI)) + IF (HELEC == 'ELE4') THEN + XFQIDRYGBT1 = (XPI / 4.0) * ZCG + ELSE + XFQIDRYGBT1 = (XPI / 4.0) * ZCCG * ZCG + END IF + XFQIDRYGBT2 = 10.0 * MOMG(ZALPHAG,ZNUG,2.+ZDG) + XFQIDRYGBT3 = 5.0 * ZCG * MOMG(ZALPHAI,ZNUI,2.) * & + MOMG(ZALPHAG,ZNUG,2.+2.*ZDG) / ((2.E-4)**2 * 8. * & + (ZAI * MOMG(ZALPHAI,ZNUI,ZBI))**(2./ZBI)) ! ! SDRYG_boun - XFQSDRYGBT1 = (XPI / 4.0) * XCCG * XCCS - XFQSDRYGBT2 = XCG * MOMG(XALPHAG,XNUG,XDG) * MOMG(XALPHAS,XNUS,2.) - XFQSDRYGBT3 = XCS * MOMG(XALPHAS,XNUS,2.+XDS) - XFQSDRYGBT4 = XCG * MOMG(XALPHAG,XNUG,2.+XDG) - XFQSDRYGBT5 = XCS * MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS,XNUS,XDS) - XFQSDRYGBT6 = 2. * XCG * MOMG(XALPHAG,XNUG,1.+XDG) * MOMG(XALPHAS,XNUS,1.) - XFQSDRYGBT7 = 2. * XCS * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS,XNUS,1.+XDS) + IF (HELEC == 'ELE4') THEN + XFQSDRYGBT1 = XPI / 4.0 + ELSE + XFQSDRYGBT1 = (XPI / 4.0) * ZCCG * ZCCS + END IF + XFQSDRYGBT2 = ZCG * MOMG(ZALPHAG,ZNUG,ZDG) * MOMG(ZALPHAS,ZNUS,2.) + XFQSDRYGBT3 = ZCS * MOMG(ZALPHAS,ZNUS,2.+ZDS) + XFQSDRYGBT4 = ZCG * MOMG(ZALPHAG,ZNUG,2.+ZDG) + XFQSDRYGBT5 = ZCS * MOMG(ZALPHAG,ZNUG,2.) * MOMG(ZALPHAS,ZNUS,ZDS) + XFQSDRYGBT6 = 2. * ZCG * MOMG(ZALPHAG,ZNUG,1.+ZDG) * MOMG(ZALPHAS,ZNUS,1.) + XFQSDRYGBT7 = 2. * ZCS * MOMG(ZALPHAG,ZNUG,1.) * MOMG(ZALPHAS,ZNUS,1.+ZDS) XFQSDRYGBT8 = 5. / ((1.E-4)**2 * 8.) - XFQSDRYGBT9 = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS,XNUS,2.) - XFQSDRYGBT10 = MOMG(XALPHAS,XNUS,4.) - XFQSDRYGBT11 = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS,XNUS,3.) -! - IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) ) - CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, 2., XCG, XDG, XCS, XDS, 2., & - XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & - PFDINFTY, XKER_Q_SDRYGB ) + XFQSDRYGBT9 = MOMG(ZALPHAG,ZNUG,2.) * MOMG(ZALPHAS,ZNUS,2.) + XFQSDRYGBT10 = MOMG(ZALPHAS,ZNUS,4.) + XFQSDRYGBT11 = 2. * MOMG(ZALPHAG,ZNUG,1.) * MOMG(ZALPHAS,ZNUS,3.) +! + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(IDRYLBDAG,IDRYLBDAS) ) + CALL VQZCOLX (IND, ZALPHAG, ZNUG, ZALPHAS, ZNUS, & + ZEGS, 2., ZCG, ZDG, ZCS, ZDS, 2., & + ZDRYLBDAG_MAX, ZDRYLBDAS_MAX, ZDRYLBDAG_MIN, ZDRYLBDAS_MIN, & + ZFDINFTY, XKER_Q_SDRYGB ) END IF ! ! @@ -996,15 +1307,19 @@ IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'SAP98' .OR. & CNI_CHARGING == 'GARDI' .OR. & CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN - XAUX_LIM = (XPI / 4.0) * XCCG * XCCS - XAUX_LIM1 = MOMG(XALPHAS,XNUS,2.) - XAUX_LIM2 = 2. * MOMG(XALPHAS,XNUS,1.) * MOMG(XALPHAG,XNUG,1.) - XAUX_LIM3 = MOMG(XALPHAG,XNUG,2.) - IF( .NOT.ALLOCATED(XKER_Q_LIMSG)) ALLOCATE( XKER_Q_LIMSG(NDRYLBDAG,NDRYLBDAS) ) - CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, 0., XCG, XDG, 0., XCS, XDS, 0., & - XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & - PFDINFTY, XKER_Q_LIMSG) + IF (HELEC == 'ELE4') THEN + XAUX_LIM = XPI / 4.0 + ELSE + XAUX_LIM = (XPI / 4.0) * ZCCG * ZCCS + END IF + XAUX_LIM1 = MOMG(ZALPHAS,ZNUS,2.) + XAUX_LIM2 = 2. * MOMG(ZALPHAS,ZNUS,1.) * MOMG(ZALPHAG,ZNUG,1.) + XAUX_LIM3 = MOMG(ZALPHAG,ZNUG,2.) + IF( .NOT.ALLOCATED(XKER_Q_LIMSG)) ALLOCATE( XKER_Q_LIMSG(IDRYLBDAG,IDRYLBDAS) ) + CALL RZCOLX (IND, ZALPHAG, ZNUG, ZALPHAS, ZNUS, & + ZEGS, 0., ZCG, ZDG, 0., ZCS, ZDS, 0., & + ZDRYLBDAG_MAX, ZDRYLBDAS_MAX, ZDRYLBDAG_MIN, ZDRYLBDAS_MIN, & + ZFDINFTY, XKER_Q_LIMSG) ENDIF ! ! @@ -1013,20 +1328,24 @@ ENDIF !* 12. DRY GROWTH OF GRAUPELN BY CAPTURE OF RAINDROP ! --------------------------------------------- ! -IF( .NOT.ALLOCATED(XKER_Q_RDRYG)) ALLOCATE( XKER_Q_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +IF( .NOT.ALLOCATED(XKER_Q_RDRYG)) ALLOCATE( XKER_Q_RDRYG(IDRYLBDAG,IDRYLBDAR) ) ! -XFQRDRYG = (XPI / 4.0) * XCCG * XCCR * (PRHO00**XCEXVT) +IF (HELEC == 'ELE4') THEN + XFQRDRYG = (XPI / 4.0) * PRHO00**ZCEXVT +ELSE + XFQRDRYG = (XPI / 4.0) * ZCCG * ZCCR * (PRHO00**ZCEXVT) +END IF ! -XLBQRDRYG1 = MOMG(XALPHAR,XNUR,2.+XFR) -XLBQRDRYG2 = 2. * MOMG(XALPHAR,XNUR,1.+XFR) * MOMG(XALPHAG,XNUG,1.) -XLBQRDRYG3 = MOMG(XALPHAR,XNUR,XFR) * MOMG(XALPHAG,XNUG,2.) +XLBQRDRYG1 = MOMG(ZALPHAR,ZNUR,2.+XFR) +XLBQRDRYG2 = 2. * MOMG(ZALPHAR,ZNUR,1.+XFR) * MOMG(ZALPHAG,ZNUG,1.) +XLBQRDRYG3 = MOMG(ZALPHAR,ZNUR,XFR) * MOMG(ZALPHAG,ZNUG,2.) ! ZEGR = 1.0 ! -CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAR, XNUR, & - ZEGR, XFR, XCG, XDG, 0., XCR, XDR, 0., & - XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & - PFDINFTY, XKER_Q_RDRYG ) +CALL RZCOLX (IND, ZALPHAG, ZNUG, ZALPHAR, ZNUR, & + ZEGR, XFR, ZCG, ZDG, 0., ZCR, ZDR, 0., & + ZDRYLBDAG_MAX, ZDRYLBDAR_MAX, ZDRYLBDAG_MIN, ZDRYLBDAR_MIN, & + ZFDINFTY, XKER_Q_RDRYG ) ! ! !------------------------------------------------------------------------------- @@ -1034,15 +1353,17 @@ CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAR, XNUR, & !* 13. UPDATE THE Q=f(D) RELATION ! -------------------------- ! -XFQUPDC = 400.E6 * MOMG(XALPHACQ,XNUCQ,XFC) / XLBDACQ**XFC ! Nc~400E6 m-3 as +IF (HCLOUD(1:3) == 'ICE') THEN + XFQUPDC = 400.E6 * MOMG(XALPHACQ,XNUCQ,XFC) / XLBDACQ**XFC ! Nc~400E6 m-3 as ! proposed for RCHONI -! -XFQUPDR = XCCR * MOMG(XALPHAR,XNUR,XFR) -XEXFQUPDI = (XFI/XBI) -XFQUPDI = MOMG(XALPHAI,XNUI,XFI) * (XAI*MOMG(XALPHAI,XNUI,XBI))**(-XEXFQUPDI) -XFQUPDS = XCCS * MOMG(XALPHAS,XNUS,XFS) -XFQUPDG = XCCG * MOMG(XALPHAG,XNUG,XFG) -XFQUPDH = XCCH * MOMG(XALPHAH,XNUH,XFH) + ! + XFQUPDR = ZCCR * MOMG(ZALPHAR,ZNUR,XFR) + XEXFQUPDI = XFI / ZBI + XFQUPDI = MOMG(ZALPHAI,ZNUI,XFI) * (ZAI * MOMG(ZALPHAI,ZNUI,ZBI))**(-XEXFQUPDI) +END IF +XFQUPDS = ZCCS * MOMG(ZALPHAS,ZNUS,XFS) +XFQUPDG = ZCCG * MOMG(ZALPHAG,ZNUG,XFG) +XFQUPDH = ZCCH * MOMG(ZALPHAH,ZNUH,XFH) ! ! !------------------------------------------------------------------------------ @@ -1057,39 +1378,17 @@ XEBOUND = 0.1 XALPHA_IND = 0.07 ! moderate inductive charging XCOS_THETA = 0.2 ! -XIND1 = (XPI**3 / 8.) * (15.E-6)**2 * & - XCG * 400.E6 * XCCG * & - XCOLCG_IND * XEBOUND * XALPHA_IND -XIND2 = XPI * XEPSILON * XCOS_THETA * MOMG(XALPHAG,XNUG,2.+XDG) -XIND3 = MOMG(XALPHAG,XNUG,XDG+XFG) / 3. -! -!------------------------------------------------------------------------------- -! -!* 15. LIGHTNING FLASHES -! ----------------- -! -XFQLIGHTC = 660. * MOMG(3.,3.,2.) / MOMG(3.,3.,3.) ! PI/A*lbda^(b-2) = 660. -! -XFQLIGHTR = XPI * XCCR * MOMG(XALPHAR,XNUR,2.) -XEXQLIGHTR = XCXR - 2. -! -XEXQLIGHTI = 2. / XBI -XFQLIGHTI = XPI / 4. * MOMG(XALPHAI,XNUI,2.) * & - (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQLIGHTI) -! -XFQLIGHTS = XPI * XCCS * MOMG(XALPHAS,XNUS,2.) -XEXQLIGHTS = XCXS - 2. -! -XFQLIGHTG = XPI * XCCG * MOMG(XALPHAG,XNUG,2.) -XEXQLIGHTG = XCXG - 2. -! -XFQLIGHTH = XPI * XCCH * MOMG(XALPHAH,XNUH,2.) -XEXQLIGHTH = XCXH - 2. -! -IF( .NOT.ALLOCATED(XNEUT_POS)) ALLOCATE( XNEUT_POS(NLGHTMAX) ) -IF( .NOT.ALLOCATED(XNEUT_NEG)) ALLOCATE( XNEUT_NEG(NLGHTMAX) ) -XNEUT_POS(:) = 0. -XNEUT_NEG(:) = 0. +IF (HELEC == 'ELE4') THEN + XIND1 = (XPI**3 / 8.) * (15.E-6)**2 * & + ZCG * 400.E6 * & + XCOLCG_IND * XEBOUND * XALPHA_IND +ELSE + XIND1 = (XPI**3 / 8.) * (15.E-6)**2 * & + ZCG * 400.E6 * ZCCG * & + XCOLCG_IND * XEBOUND * XALPHA_IND +END IF +XIND2 = XPI * XEPSILON * XCOS_THETA * MOMG(ZALPHAG,ZNUG,2.+ZDG) +XIND3 = MOMG(ZALPHAG,ZNUG,ZDG+XFG) / 3. ! !------------------------------------------------------------------------------- ! diff --git a/src/PHYEX/micro/lima.f90 b/src/PHYEX/micro/lima.f90 index 6665319bc5689b249629c1cf42b6ce5ded85919b..27d8c5ac54dfcc1e4245902ac3de887c671634ff 100644 --- a/src/PHYEX/micro/lima.f90 +++ b/src/PHYEX/micro/lima.f90 @@ -5,14 +5,15 @@ !----------------------------------------------------------------- ! ##################################################################### SUBROUTINE LIMA ( D, CST, BUCONF, TBUDGETS, KBUDGETS, & - PTSTEP, & + PTSTEP, OELEC, & PRHODREF, PEXNREF, PDZZ, & PRHODJ, PPABST, & NCCN, NIFN, NIMM, & PDTHRAD, PTHT, PRT, PSVT, PW_NU, & PTHS, PRS, PSVS, & PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PINPRH, & - PEVAP3D, PCLDFR, PICEFR, PPRCFR, PFPR ) + PEVAP3D, PCLDFR, PICEFR, PPRCFR, PFPR, & + PLATHAM_IAGGS, PEFIELDW, PSV_ELEC_T, PSV_ELEC_S ) ! ##################################################################### ! !! PURPOSE @@ -41,6 +42,9 @@ SUBROUTINE LIMA ( D, CST, BUCONF, TBUDGETS, KBUDGETS, & ! P. Wautelet 28/05/2020: bugfix: correct array start for PSVT and PSVS ! P. Wautelet 03/02/2021: budgets: add new source if LIMA splitting: CORR2 ! B. Vie 06/2021: add subgrid condensation with LIMA +! C. Barthe 04/2022: add cloud electrification +! C. Barthe 03/2023: add CIBU, RDSF and 2 moments for s, g and h in cloud electrification +! !----------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -52,7 +56,7 @@ USE MODD_CST, ONLY: CST_t USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, & NSV_LIMA_NI, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH, & NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL, NSV_LIMA_HOM_HAZE, & - NSV_LIMA_BEG + NSV_LIMA_BEG, NSV_ELECBEG USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, LHHONI, & LFEEDBACKT, NMAXITER, XMRSTEP, XTSTEP_TS, & LSEDC, LSEDI, XRTMIN, XCTMIN, LDEPOC, XVDEPOC, & @@ -68,6 +72,8 @@ USE MODE_LIMA_NUCLEATION_PROCS, ONLY: LIMA_NUCLEATION_PROCS USE MODE_LIMA_SEDIMENTATION, ONLY: LIMA_SEDIMENTATION USE MODE_LIMA_TENDENCIES, ONLY: LIMA_TENDENCIES ! +USE MODI_ELEC_TENDENCIES +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -80,6 +86,8 @@ INTEGER, INTENT(IN) :: KBUDGETS ! REAL, INTENT(IN) :: PTSTEP ! Time step ! +LOGICAL, INTENT(IN) :: OELEC ! if true, cloud electrification is activated +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) @@ -115,6 +123,11 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Cloud fraction REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPRCFR ! Cloud fraction REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PFPR ! Precipitation fluxes in altitude ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLATHAM_IAGGS ! Factor for IAGGS modification due to Efield +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PEFIELDW ! Vertical component of the electric field +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PSV_ELEC_T ! Charge density at time t +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(INOUT) :: PSV_ELEC_S ! Charge density sources +! !* 0.2 Declarations of local variables : ! ! @@ -169,9 +182,15 @@ REAL, DIMENSION(:), ALLOCATABLE :: & Z_RI_AGGS, Z_CI_AGGS, & ! aggregation of ice on snow (AGGS) : ri, Ni, rs=-ri Z_TH_DEPG, Z_RG_DEPG, & ! deposition of vapor on graupel (DEPG) : rv=-rg, rg, th Z_TH_BERFI, Z_RC_BERFI, & ! Bergeron (BERFI) : rc, ri=-rc, th - Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_CS_RIM, Z_RG_RIM, & ! cloud droplet riming (RIM) : rc, Nc, rs, Ns, rg, Ng=-Ns, th +!++cb++ +! Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_CS_RIM, Z_RG_RIM, & ! cloud droplet riming (RIM) : rc, Nc, rs, Ns, rg, Ng=-Ns, th + Z_TH_RIM, Z_CC_RIM, Z_CS_RIM, Z_RC_RIMSS, Z_RC_RIMSG, Z_RS_RIMCG, & ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th +!--cb-- Z_RI_HMS, Z_CI_HMS, Z_RS_HMS, & ! hallett mossop snow (HMS) : ri, Ni, rs - Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_CS_ACC, Z_RG_ACC, & ! rain accretion on aggregates (ACC) : rr, Nr, rs, Ns, rg, Ng=-Ns, th +!++cb++ +! Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_CS_ACC, Z_RG_ACC, & ! rain accretion on aggregates (ACC) : rr, Nr, rs, Ns, rg, Ng=-Ns, th + Z_TH_ACC, Z_CR_ACC, Z_CS_ACC, Z_RR_ACCSS, Z_RR_ACCSG, Z_RS_ACCRG, & ! rain accretion on aggregates (ACC) : rr, Nr, rs, rg, th +!--cb-- Z_RS_CMEL, Z_CS_CMEL, & ! conversion-melting (CMEL) : rs, rg=-rs Z_TH_CFRZ, Z_RR_CFRZ, Z_CR_CFRZ, Z_RI_CFRZ, Z_CI_CFRZ, & ! rain freezing (CFRZ) : rr, Nr, ri, Ni, rg=-rr-ri, th Z_RI_CIBU, Z_CI_CIBU, & ! collisional ice break-up (CIBU) : ri, Ni, rs=-ri @@ -188,7 +207,10 @@ REAL, DIMENSION(:), ALLOCATABLE :: & Z_RG_COHG, Z_CG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh Z_TH_HMLT, Z_RR_HMLT, Z_CR_HMLT, Z_CH_HMLT, & ! hail melting (HMLT) : rr, Nr, rh=-rr, th Z_RV_CORR2, Z_RC_CORR2, Z_RR_CORR2, Z_RI_CORR2, & - Z_CC_CORR2, Z_CR_CORR2, Z_CI_CORR2 + Z_CC_CORR2, Z_CR_CORR2, Z_CI_CORR2, & +!++cb+ + + Z_RI_HIND, Z_RC_HINC, Z_RV_HENU, Z_RV_HONH +!--cb-- ! ! for the conversion from rain to cloud, we need a 3D variable instead of a 1D packed variable REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & @@ -224,9 +246,15 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: & ZTOT_RI_AGGS, ZTOT_CI_AGGS, & ! aggregation of ice on snow (AGGS) ZTOT_TH_DEPG, ZTOT_RG_DEPG, & ! deposition of vapor on graupel (DEPG) ZTOT_TH_BERFI, ZTOT_RC_BERFI, & ! Bergeron (BERFI) - ZTOT_TH_RIM, ZTOT_RC_RIM, ZTOT_CC_RIM, ZTOT_RS_RIM, ZTOT_CS_RIM, ZTOT_RG_RIM, & ! cloud droplet riming (RIM) +!++cb++ +! ZTOT_TH_RIM, ZTOT_RC_RIM, ZTOT_CC_RIM, ZTOT_RS_RIM, ZTOT_CS_RIM, ZTOT_RG_RIM, & ! cloud droplet riming (RIM) + ZTOT_TH_RIM, ZTOT_CC_RIM, ZTOT_CS_RIM, ZTOT_RC_RIMSS, ZTOT_RC_RIMSG, ZTOT_RS_RIMCG, & ! cloud droplet riming (RIM) +!--cb-- ZTOT_RI_HMS, ZTOT_CI_HMS, ZTOT_RS_HMS, & ! hallett mossop snow (HMS) - ZTOT_TH_ACC, ZTOT_RR_ACC, ZTOT_CR_ACC, ZTOT_RS_ACC, ZTOT_CS_ACC, ZTOT_RG_ACC, & ! rain accretion on aggregates (ACC) +!++cb++ +! ZTOT_TH_ACC, ZTOT_RR_ACC, ZTOT_CR_ACC, ZTOT_RS_ACC, ZTOT_CS_ACC, ZTOT_RG_ACC, & ! rain accretion on aggregates (ACC) + ZTOT_TH_ACC, ZTOT_CR_ACC, ZTOT_CS_ACC, ZTOT_RR_ACCSS, ZTOT_RR_ACCSG, ZTOT_RS_ACCRG, & ! rain accretion on aggregates (ACC) +!--cb-- ZTOT_RS_CMEL, ZTOT_CS_CMEL, & ! conversion-melting (CMEL) ZTOT_TH_CFRZ, ZTOT_RR_CFRZ, ZTOT_CR_CFRZ, ZTOT_RI_CFRZ, ZTOT_CI_CFRZ, & ! rain freezing (CFRZ) ZTOT_RI_CIBU, ZTOT_CI_CIBU, & ! collisional ice break-up (CIBU) @@ -244,7 +272,10 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: & ZTOT_TH_HMLT, ZTOT_RR_HMLT, ZTOT_CR_HMLT, ZTOT_CH_HMLT, & ! hail melting (HMLT) ZTOT_RR_CVRC, ZTOT_CR_CVRC, & ! conversion of rain into cloud droplets if diameter too small ZTOT_RV_CORR2, ZTOT_RC_CORR2, ZTOT_RR_CORR2, ZTOT_RI_CORR2, & - ZTOT_CC_CORR2, ZTOT_CR_CORR2, ZTOT_CI_CORR2 + ZTOT_CC_CORR2, ZTOT_CR_CORR2, ZTOT_CI_CORR2, & +!++cb++ + ZTOT_RI_HIND, ZTOT_RC_HINC, ZTOT_RV_HENU, ZTOT_RV_HONH +!--cb-- REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTOT_IFNN_IMLT ! @@ -294,6 +325,16 @@ INTEGER :: ISV_LIMA_IFN_NUCL INTEGER :: ISV_LIMA_IMM_NUCL INTEGER :: ISV_LIMA_HOM_HAZE ! +! Variables for the electrification scheme +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: GMASK_ELEC +INTEGER :: JL ! loop index +INTEGER :: IELEC ! nb of points where the electrification scheme may apply +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQPIT, ZQNIT, ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQHT +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQPIS, ZQNIS, ZQCS, ZQRS, ZQIS, ZQSS, ZQGS, ZQHS +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVT_ELEC, ZRCT_ELEC, ZRRT_ELEC, ZRIT_ELEC, ZRST_ELEC, ZRGT_ELEC, ZRHT_ELEC +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCCT_ELEC, ZCRT_ELEC, ZCIT_ELEC, ZCST_ELEC, ZCGT_ELEC, ZCHT_ELEC +REAL, DIMENSION(:), ALLOCATABLE :: ZLATHAM_IAGGS +! !------------------------------------------------------------------------------- ! !* 0. Init @@ -354,7 +395,9 @@ ZIMMNS(:,:,:,:) = 0. ZHOMFT(:,:,:) = 0. ZHOMFS(:,:,:) = 0. -if ( BUCONF%lbu_enable ) then +!++cb++ +if ( BUCONF%lbu_enable .OR. OELEC) then +!--cb-- Z_RR_CVRC(:,:,:) = 0. Z_CR_CVRC(:,:,:) = 0. allocate( ZTOT_CR_BRKU (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_BRKU(:,:,:) = 0. @@ -395,21 +438,31 @@ if ( BUCONF%lbu_enable ) then allocate( ZTOT_RG_DEPG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_DEPG(:,:,:) = 0. allocate( ZTOT_TH_BERFI(size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_BERFI(:,:,:) = 0. allocate( ZTOT_RC_BERFI(size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_BERFI(:,:,:) = 0. +!++cb++ need rcrimss, rcrimsg and rsrimcg to be consistent with ice3 allocate( ZTOT_TH_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_RIM(:,:,:) = 0. - allocate( ZTOT_RC_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_RIM(:,:,:) = 0. +! allocate( ZTOT_RC_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_RIM(:,:,:) = 0. allocate( ZTOT_CC_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_RIM(:,:,:) = 0. - allocate( ZTOT_RS_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_RIM(:,:,:) = 0. +! allocate( ZTOT_RS_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_RIM(:,:,:) = 0. allocate( ZTOT_CS_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_RIM(:,:,:) = 0. - allocate( ZTOT_RG_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_RIM(:,:,:) = 0. +! allocate( ZTOT_RG_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_RIM(:,:,:) = 0. + allocate( ZTOT_RC_RIMSS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_RIMSS(:,:,:) = 0. + allocate( ZTOT_RC_RIMSG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_RIMSG(:,:,:) = 0. + allocate( ZTOT_RS_RIMCG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_RIMCG(:,:,:) = 0. +!--cb-- allocate( ZTOT_RI_HMS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_HMS(:,:,:) = 0. allocate( ZTOT_CI_HMS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_HMS(:,:,:) = 0. allocate( ZTOT_RS_HMS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_HMS(:,:,:) = 0. +!++cb++ need rraccss, rraccsg and rsaccrg to be consistent with ice3 allocate( ZTOT_TH_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_ACC(:,:,:) = 0. - allocate( ZTOT_RR_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_ACC(:,:,:) = 0. +! allocate( ZTOT_RR_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_ACC(:,:,:) = 0. allocate( ZTOT_CR_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_ACC(:,:,:) = 0. - allocate( ZTOT_RS_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_ACC(:,:,:) = 0. +! allocate( ZTOT_RS_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_ACC(:,:,:) = 0. allocate( ZTOT_CS_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_ACC(:,:,:) = 0. - allocate( ZTOT_RG_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_ACC(:,:,:) = 0. +! allocate( ZTOT_RG_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_ACC(:,:,:) = 0. + allocate( ZTOT_RR_ACCSS(size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_ACCSS(:,:,:) = 0. + allocate( ZTOT_RR_ACCSG(size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_ACCSG(:,:,:) = 0. + allocate( ZTOT_RS_ACCRG(size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_ACCRG(:,:,:) = 0. +!--cb-- allocate( ZTOT_RS_CMEL (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_CMEL(:,:,:) = 0. allocate( ZTOT_CS_CMEL (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_CMEL(:,:,:) = 0. allocate( ZTOT_TH_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_CFRZ(:,:,:) = 0. @@ -482,6 +535,13 @@ if ( BUCONF%lbu_enable ) then allocate( ZTOT_CI_CORR2 (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_CORR2(:,:,:) = 0. END IF ! +!++cb++ necessaire pour l'electricite +ALLOCATE (ZTOT_RI_HIND(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) ; ZTOT_RI_HIND(:,:,:) = 0. +ALLOCATE (ZTOT_RC_HINC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) ; ZTOT_RC_HINC(:,:,:) = 0. +ALLOCATE (ZTOT_RV_HENU(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) ; ZTOT_RV_HENU(:,:,:) = 0. +ALLOCATE (ZTOT_RV_HONH(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) ; ZTOT_RV_HONH(:,:,:) = 0. +!--cb-- +! ! Initial values computed as source * PTSTEP ! ! Mixing ratios @@ -542,6 +602,69 @@ ZINV_TSTEP = 1./PTSTEP ZEXN(:,:,:) = (PPABST(:,:,:)/CST%XP00)**(CST%XRD/CST%XCPD) ZT(:,:,:) = ZTHT(:,:,:) * ZEXN(:,:,:) ! +! Electric charge density +! +IF (OELEC) THEN + ALLOCATE(ZQPIT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQCT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQRT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQIT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQST(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQGT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQNIT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + IF (KRR == 7) ALLOCATE(ZQHT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ! + ALLOCATE(ZQPIS(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQCS(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQRS(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQIS(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQSS(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQGS(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZQNIS(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + IF (KRR == 7) ALLOCATE(ZQHS(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ! + ALLOCATE(ZRVT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZRCT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZRRT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZRIT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZRST_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZRGT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + IF (KRR == 7) ALLOCATE(ZRHT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZCCT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZCRT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZCIT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZCST_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + ALLOCATE(ZCGT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) + IF (KRR == 7) ALLOCATE(ZCHT_ELEC(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) +! +!++cb++ 21/04/23 source * ptstep + ZQPIT(:,:,:) = PSV_ELEC_S(:,:,:,1) * PTSTEP + ZQCT(:,:,:) = PSV_ELEC_S(:,:,:,2) * PTSTEP + ZQRT(:,:,:) = PSV_ELEC_S(:,:,:,3) * PTSTEP + ZQIT(:,:,:) = PSV_ELEC_S(:,:,:,4) * PTSTEP + ZQST(:,:,:) = PSV_ELEC_S(:,:,:,5) * PTSTEP + ZQGT(:,:,:) = PSV_ELEC_S(:,:,:,6) * PTSTEP + IF (KRR == 6) THEN + ZQNIT(:,:,:) = PSV_ELEC_S(:,:,:,7) * PTSTEP + ELSE IF (KRR == 7) THEN + ZQHT(:,:,:) = PSV_ELEC_S(:,:,:,7) * PTSTEP + ZQNIT(:,:,:) = PSV_ELEC_S(:,:,:,8) * PTSTEP + END IF + ! + ZQPIS(:,:,:) = PSV_ELEC_S(:,:,:,1) + ZQCS(:,:,:) = PSV_ELEC_S(:,:,:,2) + ZQRS(:,:,:) = PSV_ELEC_S(:,:,:,3) + ZQIS(:,:,:) = PSV_ELEC_S(:,:,:,4) + ZQSS(:,:,:) = PSV_ELEC_S(:,:,:,5) + ZQGS(:,:,:) = PSV_ELEC_S(:,:,:,6) + IF (KRR == 6) THEN + ZQNIS(:,:,:) = PSV_ELEC_S(:,:,:,7) + ELSE IF (KRR == 7) THEN + ZQHS(:,:,:) = PSV_ELEC_S(:,:,:,7) + ZQNIS(:,:,:) = PSV_ELEC_S(:,:,:,8) + END IF +END IF +! !------------------------------------------------------------------------------- ! !* 0. Check mean diameter for cloud, rain and ice @@ -625,20 +748,20 @@ PINPRS=0. PINPRG=0. PINPRH=0. if ( BUCONF%lbu_enable ) then - if ( BUCONF%lbudget_th ) & - call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'SEDI', zths(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rc .and. nmom_c.ge.1 .and. lsedc ) & - call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', zrcs(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rr .and. nmom_r.ge.1 ) & - call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', zrrs(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_ri .and. nmom_i.ge.1 .and. lsedi ) & - call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', zris(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rs .and. nmom_s.ge.1 ) & - call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', zrss(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rg .and. nmom_g.ge.1 ) & - call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', zrgs(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rh .and. nmom_h.ge.1 ) & - call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', zrhs(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_th ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'SEDI', zths(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rc .and. nmom_c.ge.1 .and. lsedc ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', zrcs(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rr .and. nmom_r.ge.1 ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', zrrs(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_ri .and. nmom_i.ge.1 .and. lsedi ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', zris(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rs .and. nmom_s.ge.1 ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', zrss(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rg .and. nmom_g.ge.1 ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', zrgs(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rh .and. nmom_h.ge.1 ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', zrhs(:, :, :) * prhodj(:, :, :) ) if ( BUCONF%lbudget_sv ) then if ( lsedc .and. nmom_c.ge.2) & call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_lima_nc), 'SEDI', zccs(:, :, :) * prhodj(:, :, :) ) @@ -652,53 +775,132 @@ if ( BUCONF%lbu_enable ) then call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_lima_ng), 'SEDI', zcgs(:, :, :) * prhodj(:, :, :) ) if ( nmom_h.ge.2) & call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_lima_nh), 'SEDI', zchs(:, :, :) * prhodj(:, :, :) ) + ! + if (oelec) then + if ( lsedc ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 1), 'SEDI', zqcs(:, :, :) * prhodj(:, :, :) ) + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 2), 'SEDI', zqrs(:, :, :) * prhodj(:, :, :) ) + if ( lsedi ) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 3), 'SEDI', zqis(:, :, :) * prhodj(:, :, :) ) + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 4), 'SEDI', zqss(:, :, :) * prhodj(:, :, :) ) + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 5), 'SEDI', zqgs(:, :, :) * prhodj(:, :, :) ) + if (nmom_h .ge. 1) & + call BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 6), 'SEDI', zqhs(:, :, :) * prhodj(:, :, :) ) + end if end if end if +! PFPR(:,:,:,:)=0. +! +! sedimentation of cloud droplets ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (NMOM_C.GE.1 .AND. LSEDC) CALL LIMA_SEDIMENTATION(D, CST, & - 'L', 2, 2, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRCS, ZCCS, PINPRC, PFPR(:,:,:,2)) +IF (NMOM_C.GE.1 .AND. LSEDC) THEN + IF (OELEC) THEN + CALL LIMA_SEDIMENTATION(D, CST, & + 'L', 2, 2, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRCS, ZCCS, PINPRC, PFPR(:,:,:,2), PEFIELDW, ZQCS) + ELSE + CALL LIMA_SEDIMENTATION(D, CST, & + 'L', 2, 2, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRCS, ZCCS, PINPRC, PFPR(:,:,:,2)) + END IF +END IF +! +! sedimentation of raindrops ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (NMOM_R.GE.1) CALL LIMA_SEDIMENTATION(D, CST, & - 'L', NMOM_R, 3, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRRS, ZCRS, PINPRR, PFPR(:,:,:,3)) +IF (NMOM_R.GE.1) THEN + IF (OELEC) THEN + CALL LIMA_SEDIMENTATION(D, CST, & + 'L', NMOM_R, 3, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRRS, ZCRS, PINPRR, PFPR(:,:,:,3), PEFIELDW, ZQRS) + ELSE + CALL LIMA_SEDIMENTATION(D, CST, & + 'L', NMOM_R, 3, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRRS, ZCRS, PINPRR, PFPR(:,:,:,3)) + END IF +END IF +! +! sedimentation of ice crystals ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (NMOM_I.GE.1 .AND. LSEDI) CALL LIMA_SEDIMENTATION(D, CST, & - 'I', NMOM_I, 4, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRIS, ZCIS, ZW2D, PFPR(:,:,:,4)) +IF (NMOM_I.GE.1 .AND. LSEDI) THEN + IF (OELEC) THEN + CALL LIMA_SEDIMENTATION(D, CST, & + 'I', NMOM_I, 4, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRIS, ZCIS, ZW2D, PFPR(:,:,:,4), PEFIELDW, ZQIS) + ELSE + CALL LIMA_SEDIMENTATION(D, CST, & + 'I', NMOM_I, 4, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRIS, ZCIS, ZW2D, PFPR(:,:,:,4)) + END IF +END IF +! +! sedimentation of snow/aggregates ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (NMOM_S.GE.1) CALL LIMA_SEDIMENTATION(D, CST, & - 'I', NMOM_S, 5, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRSS, ZCSS, PINPRS, PFPR(:,:,:,5)) +IF (NMOM_S.GE.1) THEN + IF (OELEC) THEN + CALL LIMA_SEDIMENTATION(D, CST, & + 'I', NMOM_S, 5, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRSS, ZCSS, PINPRS, PFPR(:,:,:,5), PEFIELDW, ZQSS) + ELSE + CALL LIMA_SEDIMENTATION(D, CST, & + 'I', NMOM_S, 5, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRSS, ZCSS, PINPRS, PFPR(:,:,:,5)) + END IF +END IF +! +! sedimentation of graupel ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (NMOM_G.GE.1) CALL LIMA_SEDIMENTATION(D, CST, & - 'I', NMOM_G, 6, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRGS, ZCGS, PINPRG, PFPR(:,:,:,6)) +IF (NMOM_G.GE.1) THEN + IF (OELEC) THEN + CALL LIMA_SEDIMENTATION(D, CST, & + 'I', NMOM_G, 6, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRGS, ZCGS, PINPRG, PFPR(:,:,:,6), PEFIELDW, ZQGS) + ELSE + CALL LIMA_SEDIMENTATION(D, CST, & + 'I', NMOM_G, 6, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRGS, ZCGS, PINPRG, PFPR(:,:,:,6)) + END IF +END IF +! +! sedimentation of hail ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP ZCPT = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP -IF (NMOM_H.GE.1) CALL LIMA_SEDIMENTATION(D, CST, & - 'I', NMOM_H, 7, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRHS, ZCHS, PINPRH, PFPR(:,:,:,7)) +IF (NMOM_H.GE.1) THEN + IF (OELEC) THEN + CALL LIMA_SEDIMENTATION(D, CST, & + 'I', NMOM_H, 7, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRHS, ZCHS, PINPRH, PFPR(:,:,:,7), PEFIELDW, ZQHS) + ELSE + CALL LIMA_SEDIMENTATION(D, CST, & + 'I', NMOM_H, 7, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, & + ZRHS, ZCHS, PINPRH, PFPR(:,:,:,7)) + END IF +END IF ! ZTHS(:,:,:) = ZT(:,:,:) / ZEXN(:,:,:) * ZINV_TSTEP ! ! Call budgets ! if ( BUCONF%lbu_enable ) then - if ( BUCONF%lbudget_th ) & - call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'SEDI', zths(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rc .and. nmom_c.ge.1 .and. lsedc ) & - call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', zrcs(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rr .and. nmom_r.ge.2 ) & - call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', zrrs(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_ri .and. nmom_i.ge.1 .and. lsedi ) & - call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', zris(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rs .and. nmom_s.ge.1 ) & - call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', zrss(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rg .and. nmom_g.ge.1 ) & - call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', zrgs(:, :, :) * prhodj(:, :, :) ) - if ( BUCONF%lbudget_rh .and. nmom_h.ge.1 ) & - call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', zrhs(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_th ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'SEDI', zths(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rc .and. nmom_c.ge.1 .and. lsedc ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', zrcs(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rr .and. nmom_r.ge.2 ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', zrrs(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_ri .and. nmom_i.ge.1 .and. lsedi ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', zris(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rs .and. nmom_s.ge.1 ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', zrss(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rg .and. nmom_g.ge.1 ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', zrgs(:, :, :) * prhodj(:, :, :) ) + if ( BUCONF%lbudget_rh .and. nmom_h.ge.1 ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', zrhs(:, :, :) * prhodj(:, :, :) ) if ( BUCONF%lbudget_sv ) then if ( lsedc .and. nmom_c.ge.2 ) & call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_lima_nc), 'SEDI', zccs(:, :, :) * prhodj(:, :, :) ) @@ -712,6 +914,18 @@ if ( BUCONF%lbu_enable ) then call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_lima_ng), 'SEDI', zcgs(:, :, :) * prhodj(:, :, :) ) if ( nmom_h.ge.2 ) & call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_lima_nh), 'SEDI', zchs(:, :, :) * prhodj(:, :, :) ) +! + if (oelec) then + if ( lsedc ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 1), 'SEDI', zqcs(:, :, :) * prhodj(:, :, :) ) + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 2), 'SEDI', zqrs(:, :, :) * prhodj(:, :, :) ) + if ( lsedi ) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 3), 'SEDI', zqis(:, :, :) * prhodj(:, :, :) ) + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 4), 'SEDI', zqss(:, :, :) * prhodj(:, :, :) ) + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 5), 'SEDI', zqgs(:, :, :) * prhodj(:, :, :) ) + if (nmom_h .ge. 1) & + call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + nsv_elecbeg + 6), 'SEDI', zqhs(:, :, :) * prhodj(:, :, :) ) + end if end if end if ! @@ -786,6 +1000,15 @@ IF ( NMOM_I.GE.2 ) ZCIT(:,:,:) = ZCIS(:,:,:) * PTSTEP IF ( NMOM_S.GE.2 ) ZCST(:,:,:) = ZCSS(:,:,:) * PTSTEP IF ( NMOM_G.GE.2 ) ZCGT(:,:,:) = ZCGS(:,:,:) * PTSTEP IF ( NMOM_H.GE.2 ) ZCHT(:,:,:) = ZCHS(:,:,:) * PTSTEP +! +IF (OELEC) THEN + ZQCT(:,:,:) = ZQCS(:,:,:) * PTSTEP + ZQRT(:,:,:) = ZQRS(:,:,:) * PTSTEP + ZQIT(:,:,:) = ZQIS(:,:,:) * PTSTEP + ZQST(:,:,:) = ZQSS(:,:,:) * PTSTEP + ZQGT(:,:,:) = ZQGS(:,:,:) * PTSTEP + IF (NMOM_H .GE. 1) ZQHT(:,:,:) = ZQHS(:,:,:) * PTSTEP +END IF ! !------------------------------------------------------------------------------- ! @@ -801,6 +1024,7 @@ CALL LIMA_COMPUTE_CLOUD_FRACTIONS (D, & ZCHT, ZRHT, & PCLDFR, PICEFR, PPRCFR ) ! +! !------------------------------------------------------------------------------- ! !* 2. Nucleation processes @@ -812,7 +1036,8 @@ CALL LIMA_NUCLEATION_PROCS (D, CST, BUCONF, TBUDGETS, KBUDGETS, ZTHT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, & ZCCT, ZCRT, ZCIT, & ZCCNFT, ZCCNAT, ZIFNFT, ZIFNNT, ZIMMNT, ZHOMFT, & - PCLDFR, PICEFR, PPRCFR ) + PCLDFR, PICEFR, PPRCFR, & + ZTOT_RV_HENU, ZTOT_RC_HINC, ZTOT_RI_HIND, ZTOT_RV_HONH) ! ! Saving sources before microphysics time-splitting loop ! @@ -841,6 +1066,21 @@ ZHOMFS(:,:,:) = ZHOMFT(:,:,:) *ZINV_TSTEP ZTHS(:,:,:) = ZTHT(:,:,:) *ZINV_TSTEP ZT(:,:,:) = ZTHT(:,:,:) * ZEXN(:,:,:) ! +IF (OELEC) THEN + ZRVT_ELEC(:,:,:) = ZRVT(:,:,:) + ZRCT_ELEC(:,:,:) = ZRCT(:,:,:) + ZRRT_ELEC(:,:,:) = ZRRT(:,:,:) + ZRIT_ELEC(:,:,:) = ZRIT(:,:,:) + ZRST_ELEC(:,:,:) = ZRST(:,:,:) + ZRGT_ELEC(:,:,:) = ZRGT(:,:,:) + IF (NMOM_H .GE. 1) ZRHT_ELEC(:,:,:) = ZRHT(:,:,:) + IF (NMOM_C .GE. 2) ZCCT_ELEC(:,:,:) = ZCCT(:,:,:) + IF (NMOM_R .GE. 2) ZCRT_ELEC(:,:,:) = ZCRT(:,:,:) + IF (NMOM_I .GE. 2) ZCIT_ELEC(:,:,:) = ZCIT(:,:,:) + IF (NMOM_S .GE. 2) ZCST_ELEC(:,:,:) = ZCST(:,:,:) + IF (NMOM_G .GE. 2) ZCGT_ELEC(:,:,:) = ZCGT(:,:,:) + IF (NMOM_H .GE. 2) ZCHT_ELEC(:,:,:) = ZCHT(:,:,:) +END IF ! !------------------------------------------------------------------------------- ! @@ -932,6 +1172,7 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) ALLOCATE(ZCF1D(IPACK)) ALLOCATE(ZIF1D(IPACK)) ALLOCATE(ZPF1D(IPACK)) + ALLOCATE(ZLATHAM_IAGGS(IPACK)) IPACK = COUNTJV(LLCOMPUTE,I1,I2,I3) DO II=1,IPACK ZRHODREF1D(II) = PRHODREF(I1(II),I2(II),I3(II)) @@ -968,6 +1209,11 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) ZCF1D(II) = PCLDFR(I1(II),I2(II),I3(II)) ZIF1D(II) = PICEFR(I1(II),I2(II),I3(II)) ZPF1D(II) = PPRCFR(I1(II),I2(II),I3(II)) + IF (OELEC) THEN + ZLATHAM_IAGGS(II) = PLATHAM_IAGGS(I1(II),I2(II),I3(II)) + ELSE + ZLATHAM_IAGGS(II) = 1.0 + END IF END DO ! WHERE(ZCF1D(:)<1.E-10 .AND. ZRCT1D(:)>XRTMIN(2) .AND. ZCCT1D(:)>XCTMIN(2)) ZCF1D(:)=1. @@ -1048,21 +1294,31 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) ALLOCATE(Z_RG_DEPG(IPACK)) ; Z_RG_DEPG(:) = 0. ALLOCATE(Z_TH_BERFI(IPACK)) ; Z_TH_BERFI(:) = 0. ALLOCATE(Z_RC_BERFI(IPACK)) ; Z_RC_BERFI(:) = 0. +!++cb++ ALLOCATE(Z_TH_RIM(IPACK)) ; Z_TH_RIM(:) = 0. - ALLOCATE(Z_RC_RIM(IPACK)) ; Z_RC_RIM(:) = 0. +! ALLOCATE(Z_RC_RIM(IPACK)) ; Z_RC_RIM(:) = 0. ALLOCATE(Z_CC_RIM(IPACK)) ; Z_CC_RIM(:) = 0. - ALLOCATE(Z_RS_RIM(IPACK)) ; Z_RS_RIM(:) = 0. +! ALLOCATE(Z_RS_RIM(IPACK)) ; Z_RS_RIM(:) = 0. ALLOCATE(Z_CS_RIM(IPACK)) ; Z_CS_RIM(:) = 0. - ALLOCATE(Z_RG_RIM(IPACK)) ; Z_RG_RIM(:) = 0. +! ALLOCATE(Z_RG_RIM(IPACK)) ; Z_RG_RIM(:) = 0. + ALLOCATE(Z_RC_RIMSS(IPACK)) ; Z_RC_RIMSS = 0. + ALLOCATE(Z_RC_RIMSG(IPACK)) ; Z_RC_RIMSG = 0. + ALLOCATE(Z_RS_RIMCG(IPACK)) ; Z_RS_RIMCG = 0. +!--cb-- ALLOCATE(Z_RI_HMS(IPACK)) ; Z_RI_HMS(:) = 0. ALLOCATE(Z_CI_HMS(IPACK)) ; Z_CI_HMS(:) = 0. ALLOCATE(Z_RS_HMS(IPACK)) ; Z_RS_HMS(:) = 0. +!++cb++ ALLOCATE(Z_TH_ACC(IPACK)) ; Z_TH_ACC(:) = 0. - ALLOCATE(Z_RR_ACC(IPACK)) ; Z_RR_ACC(:) = 0. +! ALLOCATE(Z_RR_ACC(IPACK)) ; Z_RR_ACC(:) = 0. ALLOCATE(Z_CR_ACC(IPACK)) ; Z_CR_ACC(:) = 0. - ALLOCATE(Z_RS_ACC(IPACK)) ; Z_RS_ACC(:) = 0. +! ALLOCATE(Z_RS_ACC(IPACK)) ; Z_RS_ACC(:) = 0. ALLOCATE(Z_CS_ACC(IPACK)) ; Z_CS_ACC(:) = 0. - ALLOCATE(Z_RG_ACC(IPACK)) ; Z_RG_ACC(:) = 0. +! ALLOCATE(Z_RG_ACC(IPACK)) ; Z_RG_ACC(:) = 0. + ALLOCATE(Z_RR_ACCSS(IPACK)) ; Z_RR_ACCSS = 0. + ALLOCATE(Z_RR_ACCSG(IPACK)) ; Z_RR_ACCSG = 0. + ALLOCATE(Z_RS_ACCRG(IPACK)) ; Z_RS_ACCRG = 0. +!--cb-- ALLOCATE(Z_RS_CMEL(IPACK)) ; Z_RS_CMEL(:) = 0. ALLOCATE(Z_CS_CMEL(IPACK)) ; Z_CS_CMEL(:) = 0. ALLOCATE(Z_TH_CFRZ(IPACK)) ; Z_TH_CFRZ(:) = 0. @@ -1132,9 +1388,8 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) ALLOCATE(Z_CR_CORR2(IPACK)) ; Z_CR_CORR2(:) = 0. ALLOCATE(Z_CI_CORR2(IPACK)) ; Z_CI_CORR2(:) = 0. ! - !*** 4.1 Tendecies computation + !*** 4.1 Tendencies computation ! - CALL LIMA_INST_PROCS (PTSTEP, LLCOMPUTE1D, & ZEXNREF1D, ZP1D, & ZTHT1D, ZRVT1D, ZRCT1D, ZRRT1D, ZRIT1D, ZRST1D, ZRGT1D, & @@ -1166,9 +1421,15 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) Z_RI_AGGS, Z_CI_AGGS, & Z_TH_DEPG, Z_RG_DEPG, & Z_TH_BERFI, Z_RC_BERFI, & - Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_CS_RIM, Z_RG_RIM, & +!++cb++ +! Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_CS_RIM, Z_RG_RIM, & + Z_TH_RIM, Z_CC_RIM, Z_CS_RIM, Z_RC_RIMSS, Z_RC_RIMSG, Z_RS_RIMCG, & +!--cb-- Z_RI_HMS, Z_CI_HMS, Z_RS_HMS, & - Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_CS_ACC, Z_RG_ACC, & +!++cb++ +! Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_CS_ACC, Z_RG_ACC, & + Z_TH_ACC, Z_CR_ACC, Z_CS_ACC, Z_RR_ACCSS, Z_RR_ACCSG, Z_RS_ACCRG, & +!--cb-- Z_RS_CMEL, Z_CS_CMEL, & Z_TH_CFRZ, Z_RR_CFRZ, Z_CR_CFRZ, Z_RI_CFRZ, Z_CI_CFRZ, & Z_RI_CIBU, Z_CI_CIBU, & @@ -1187,7 +1448,8 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) ZA_TH, ZA_RV, ZA_RC, ZA_CC, ZA_RR, ZA_CR, & ZA_RI, ZA_CI, ZA_RS, ZA_CS, ZA_RG, ZA_CG, ZA_RH, ZA_CH, & ZEVAP1D, & - ZCF1D, ZIF1D, ZPF1D ) + ZCF1D, ZIF1D, ZPF1D, & + ZLATHAM_IAGGS ) ! !*** 4.2 Integration time @@ -1420,7 +1682,7 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) ! !*** 4.4 Unpacking for budgets ! - IF(BUCONF%LBU_ENABLE) THEN + IF(BUCONF%LBU_ENABLE .OR. OELEC) THEN ZTOT_RR_CVRC(:,:,:) = ZTOT_RR_CVRC(:,:,:) + Z_RR_CVRC(:,:,:) ZTOT_CR_CVRC(:,:,:) = ZTOT_CR_CVRC(:,:,:) + Z_CR_CVRC(:,:,:) @@ -1469,20 +1731,20 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) ZTOT_TH_BERFI(I1(II),I2(II),I3(II))= ZTOT_TH_BERFI(I1(II),I2(II),I3(II)) + Z_TH_BERFI(II) * ZMAXTIME(II) ZTOT_RC_BERFI(I1(II),I2(II),I3(II))= ZTOT_RC_BERFI(I1(II),I2(II),I3(II)) + Z_RC_BERFI(II) * ZMAXTIME(II) ZTOT_TH_RIM(I1(II),I2(II),I3(II)) = ZTOT_TH_RIM(I1(II),I2(II),I3(II)) + Z_TH_RIM(II) * ZMAXTIME(II) - ZTOT_RC_RIM(I1(II),I2(II),I3(II)) = ZTOT_RC_RIM(I1(II),I2(II),I3(II)) + Z_RC_RIM(II) * ZMAXTIME(II) ZTOT_CC_RIM(I1(II),I2(II),I3(II)) = ZTOT_CC_RIM(I1(II),I2(II),I3(II)) + Z_CC_RIM(II) * ZMAXTIME(II) - ZTOT_RS_RIM(I1(II),I2(II),I3(II)) = ZTOT_RS_RIM(I1(II),I2(II),I3(II)) + Z_RS_RIM(II) * ZMAXTIME(II) ZTOT_CS_RIM(I1(II),I2(II),I3(II)) = ZTOT_CS_RIM(I1(II),I2(II),I3(II)) + Z_CS_RIM(II) * ZMAXTIME(II) - ZTOT_RG_RIM(I1(II),I2(II),I3(II)) = ZTOT_RG_RIM(I1(II),I2(II),I3(II)) + Z_RG_RIM(II) * ZMAXTIME(II) + ZTOT_RC_RIMSS(I1(II),I2(II),I3(II))= ZTOT_RC_RIMSS(I1(II),I2(II),I3(II)) + Z_RC_RIMSS(II) * ZMAXTIME(II) + ZTOT_RC_RIMSG(I1(II),I2(II),I3(II))= ZTOT_RC_RIMSG(I1(II),I2(II),I3(II)) + Z_RC_RIMSG(II) * ZMAXTIME(II) + ZTOT_RS_RIMCG(I1(II),I2(II),I3(II))= ZTOT_RS_RIMCG(I1(II),I2(II),I3(II)) + Z_RS_RIMCG(II) * ZMAXTIME(II) ZTOT_RI_HMS(I1(II),I2(II),I3(II)) = ZTOT_RI_HMS(I1(II),I2(II),I3(II)) + Z_RI_HMS(II) * ZMAXTIME(II) ZTOT_CI_HMS(I1(II),I2(II),I3(II)) = ZTOT_CI_HMS(I1(II),I2(II),I3(II)) + Z_CI_HMS(II) * ZMAXTIME(II) ZTOT_RS_HMS(I1(II),I2(II),I3(II)) = ZTOT_RS_HMS(I1(II),I2(II),I3(II)) + Z_RS_HMS(II) * ZMAXTIME(II) ZTOT_TH_ACC(I1(II),I2(II),I3(II)) = ZTOT_TH_ACC(I1(II),I2(II),I3(II)) + Z_TH_ACC(II) * ZMAXTIME(II) - ZTOT_RR_ACC(I1(II),I2(II),I3(II)) = ZTOT_RR_ACC(I1(II),I2(II),I3(II)) + Z_RR_ACC(II) * ZMAXTIME(II) ZTOT_CR_ACC(I1(II),I2(II),I3(II)) = ZTOT_CR_ACC(I1(II),I2(II),I3(II)) + Z_CR_ACC(II) * ZMAXTIME(II) - ZTOT_RS_ACC(I1(II),I2(II),I3(II)) = ZTOT_RS_ACC(I1(II),I2(II),I3(II)) + Z_RS_ACC(II) * ZMAXTIME(II) ZTOT_CS_ACC(I1(II),I2(II),I3(II)) = ZTOT_CS_ACC(I1(II),I2(II),I3(II)) + Z_CS_ACC(II) * ZMAXTIME(II) - ZTOT_RG_ACC(I1(II),I2(II),I3(II)) = ZTOT_RG_ACC(I1(II),I2(II),I3(II)) + Z_RG_ACC(II) * ZMAXTIME(II) + ZTOT_RR_ACCSS(I1(II),I2(II),I3(II))= ZTOT_RR_ACCSS(I1(II),I2(II),I3(II)) + Z_RR_ACCSS(II) * ZMAXTIME(II) + ZTOT_RR_ACCSG(I1(II),I2(II),I3(II))= ZTOT_RR_ACCSG(I1(II),I2(II),I3(II)) + Z_RR_ACCSG(II) * ZMAXTIME(II) + ZTOT_RS_ACCRG(I1(II),I2(II),I3(II))= ZTOT_RS_ACCRG(I1(II),I2(II),I3(II)) + Z_RS_ACCRG(II) * ZMAXTIME(II) ZTOT_CS_CMEL(I1(II),I2(II),I3(II)) = ZTOT_CS_CMEL(I1(II),I2(II),I3(II)) + Z_CS_CMEL(II) * ZMAXTIME(II) ZTOT_RS_CMEL(I1(II),I2(II),I3(II)) = ZTOT_RS_CMEL(I1(II),I2(II),I3(II)) + Z_RS_CMEL(II) * ZMAXTIME(II) ZTOT_TH_CFRZ(I1(II),I2(II),I3(II)) = ZTOT_TH_CFRZ(I1(II),I2(II),I3(II)) + Z_TH_CFRZ(II) * ZMAXTIME(II) @@ -1544,14 +1806,14 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) ZTOT_CR_HMLT(I1(II),I2(II),I3(II)) = ZTOT_CR_HMLT(I1(II),I2(II),I3(II)) + Z_CR_HMLT(II) * ZMAXTIME(II) ZTOT_CH_HMLT(I1(II),I2(II),I3(II)) = ZTOT_CH_HMLT(I1(II),I2(II),I3(II)) + Z_CH_HMLT(II) * ZMAXTIME(II) - !Correction term - ZTOT_RV_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RV_CORR2(I1(II),I2(II),I3(II)) + Z_RV_CORR2(II) - ZTOT_RC_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RC_CORR2(I1(II),I2(II),I3(II)) + Z_RC_CORR2(II) - ZTOT_RR_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RR_CORR2(I1(II),I2(II),I3(II)) + Z_RR_CORR2(II) - ZTOT_RI_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RI_CORR2(I1(II),I2(II),I3(II)) + Z_RI_CORR2(II) - ZTOT_CC_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CC_CORR2(I1(II),I2(II),I3(II)) + Z_CC_CORR2(II) - ZTOT_CR_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CR_CORR2(I1(II),I2(II),I3(II)) + Z_CR_CORR2(II) - ZTOT_CI_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CI_CORR2(I1(II),I2(II),I3(II)) + Z_CI_CORR2(II) + ! Correction term + ZTOT_RV_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RV_CORR2(I1(II),I2(II),I3(II)) + Z_RV_CORR2(II) + ZTOT_RC_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RC_CORR2(I1(II),I2(II),I3(II)) + Z_RC_CORR2(II) + ZTOT_RR_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RR_CORR2(I1(II),I2(II),I3(II)) + Z_RR_CORR2(II) + ZTOT_RI_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RI_CORR2(I1(II),I2(II),I3(II)) + Z_RI_CORR2(II) + ZTOT_CC_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CC_CORR2(I1(II),I2(II),I3(II)) + Z_CC_CORR2(II) + ZTOT_CR_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CR_CORR2(I1(II),I2(II),I3(II)) + Z_CR_CORR2(II) + ZTOT_CI_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CI_CORR2(I1(II),I2(II),I3(II)) + Z_CI_CORR2(II) END DO ENDIF ! @@ -1594,6 +1856,7 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) DEALLOCATE(ZCF1D) DEALLOCATE(ZIF1D) DEALLOCATE(ZPF1D) + DEALLOCATE(ZLATHAM_IAGGS) ! DEALLOCATE(ZMAXTIME) DEALLOCATE(ZTIME_THRESHOLD) @@ -1665,20 +1928,20 @@ DO WHILE(ANY(ZTIME(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)<PTSTEP)) DEALLOCATE(Z_TH_BERFI) DEALLOCATE(Z_RC_BERFI) DEALLOCATE(Z_TH_RIM) - DEALLOCATE(Z_RC_RIM) DEALLOCATE(Z_CC_RIM) - DEALLOCATE(Z_RS_RIM) DEALLOCATE(Z_CS_RIM) - DEALLOCATE(Z_RG_RIM) + DEALLOCATE(Z_RC_RIMSS) + DEALLOCATE(Z_RC_RIMSG) + DEALLOCATE(Z_RS_RIMCG) DEALLOCATE(Z_RI_HMS) DEALLOCATE(Z_CI_HMS) - DEALLOCATE(Z_RS_HMS) + DEALLOCATE(Z_RS_HMS) DEALLOCATE(Z_TH_ACC) - DEALLOCATE(Z_RR_ACC) DEALLOCATE(Z_CR_ACC) - DEALLOCATE(Z_RS_ACC) DEALLOCATE(Z_CS_ACC) - DEALLOCATE(Z_RG_ACC) + DEALLOCATE(Z_RR_ACCSS) + DEALLOCATE(Z_RR_ACCSG) + DEALLOCATE(Z_RS_ACCRG) DEALLOCATE(Z_CS_CMEL) DEALLOCATE(Z_RS_CMEL) DEALLOCATE(Z_TH_CFRZ) @@ -1753,6 +2016,182 @@ ENDDO ! !------------------------------------------------------------------------------- ! +!* 7. CLOUD ELECTRIFICATION +! --------------------- +! +!* 7.1 Packing variables +! ----------------- +! +IF (OELEC) THEN + ALLOCATE(GMASK_ELEC(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3))) + GMASK_ELEC(:,:,:) = .FALSE. + GMASK_ELEC(:,:,:) = ZTOT_RI_HIND(:,:,:) .NE. 0. .OR. ZTOT_RR_HONR(:,:,:) .NE. 0. .OR. & + ZTOT_RC_IMLT(:,:,:) .NE. 0. .OR. ZTOT_RC_HONC(:,:,:) .NE. 0. .OR. & + ZTOT_RS_DEPS(:,:,:) .NE. 0. .OR. ZTOT_RI_AGGS(:,:,:) .NE. 0. .OR. & + ZTOT_RI_CNVS(:,:,:) .NE. 0. .OR. ZTOT_RG_DEPG(:,:,:) .NE. 0. .OR. & + ZTOT_RC_AUTO(:,:,:) .NE. 0. .OR. ZTOT_RC_ACCR(:,:,:) .NE. 0. .OR. & + ZTOT_RR_EVAP(:,:,:) .NE. 0. .OR. ZTOT_RC_RIMSS(:,:,:) .NE. 0. .OR. & + ZTOT_RC_RIMSG(:,:,:) .NE. 0. .OR. ZTOT_RS_RIMCG(:,:,:) .NE. 0. .OR. & + ZTOT_RR_ACCSS(:,:,:) .NE. 0. .OR. ZTOT_RR_ACCSG(:,:,:) .NE. 0. .OR. & + ZTOT_RS_ACCRG(:,:,:) .NE. 0. .OR. ZTOT_RS_CMEL(:,:,:) .NE. 0. .OR. & + ZTOT_RR_CFRZ(:,:,:) .NE. 0. .OR. ZTOT_RI_CFRZ(:,:,:) .NE. 0. .OR. & + ZTOT_RI_CIBU(:,:,:) .NE. 0. .OR. ZTOT_RI_RDSF(:,:,:) .NE. 0. .OR. & + ZTOT_RC_WETG(:,:,:) .NE. 0. .OR. ZTOT_RI_WETG(:,:,:) .NE. 0. .OR. & + ZTOT_RR_WETG(:,:,:) .NE. 0. .OR. ZTOT_RS_WETG(:,:,:) .NE. 0. .OR. & + ZTOT_RC_DRYG(:,:,:) .NE. 0. .OR. ZTOT_RI_DRYG(:,:,:) .NE. 0. .OR. & + ZTOT_RR_DRYG(:,:,:) .NE. 0. .OR. ZTOT_RS_DRYG(:,:,:) .NE. 0. .OR. & + ZTOT_RH_WETG(:,:,:) .NE. 0. .OR. ZTOT_RR_GMLT(:,:,:) .NE. 0. .OR. & + ZTOT_RC_BERFI(:,:,:) .NE. 0. .OR. ZTOT_RV_HENU(:,:,:) .NE. 0. .OR. & + ZTOT_RC_HINC(:,:,:) .NE. 0. .OR. ZTOT_RV_HONH(:,:,:) .NE. 0. .OR. & + ZTOT_RR_CVRC(:,:,:) .NE. 0. .OR. ZTOT_RI_CNVI(:,:,:) .NE. 0. .OR. & + ZTOT_RI_DEPI(:,:,:) .NE. 0. .OR. ZTOT_RI_HMS(:,:,:) .NE. 0. .OR. & + ZTOT_RI_HMG(:,:,:) .NE. 0. .OR. ZTOT_RC_CORR2(:,:,:) .NE. 0. .OR. & + ZTOT_RR_CORR2(:,:,:) .NE. 0. .OR. ZTOT_RI_CORR2(:,:,:) .NE. 0. + IF (NMOM_H .GE. 1) & + GMASK_ELEC(:,:,:) = GMASK_ELEC(:,:,:) .OR. & + ZTOT_RC_WETH(:,:,:) .NE. 0. .OR. ZTOT_RI_WETH(:,:,:) .NE. 0. .OR. & + ZTOT_RS_WETH(:,:,:) .NE. 0. .OR. ZTOT_RG_WETH(:,:,:) .NE. 0. .OR. & + ZTOT_RR_WETH(:,:,:) .NE. 0. .OR. & + !ZTOT_RC_DRYH(:,:,:) .NE. 0. .OR. ZTOT_RI_DRYH(:,:,:) .NE. 0. .OR. & + !ZTOT_RS_DRYH(:,:,:) .NE. 0. .OR. ZTOT_RR_DRYH(:,:,:) .NE. 0. .OR. & + !ZTOT_RG_DRYH(:,:,:) .NE. 0. .OR. & + ZTOT_RG_COHG(:,:,:) .NE. 0. .OR. ZTOT_RR_HMLT(:,:,:) .NE. 0. + ! + IELEC = COUNT(GMASK_ELEC) + ! +! +!* 7.2 Cloud electrification: +! --------------------- +! +! Attention, les signes des tendances ne sont pas traites de la meme facon dans ice3 et lima +! On se cale sur la facon de faire dans ice3 => on fait en sorte que les tendances soient positives + IF (NMOM_H .GE. 1) THEN + CALL ELEC_TENDENCIES(D, KRR, IELEC, PTSTEP, GMASK_ELEC, & + PRHODREF, PRHODJ, ZT, ZCIT_ELEC, & + ZRVT_ELEC, ZRCT_ELEC, ZRRT_ELEC, ZRIT_ELEC, ZRST_ELEC, ZRGT_ELEC, & + ZQPIT, ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQNIT, & + ZQPIS, ZQCS, ZQRS, ZQIS, ZQSS, ZQGS, ZQNIS, & + ZTOT_RI_HIND*ZINV_TSTEP, -ZTOT_RR_HONR*ZINV_TSTEP, ZTOT_RC_IMLT*ZINV_TSTEP, & + -ZTOT_RC_HONC*ZINV_TSTEP, ZTOT_RS_DEPS*ZINV_TSTEP, -ZTOT_RI_AGGS*ZINV_TSTEP, & + -ZTOT_RI_CNVS*ZINV_TSTEP, ZTOT_RG_DEPG*ZINV_TSTEP, -ZTOT_RC_AUTO*ZINV_TSTEP, & + -ZTOT_RC_ACCR*ZINV_TSTEP, -ZTOT_RR_EVAP*ZINV_TSTEP, & + ZTOT_RC_RIMSS*ZINV_TSTEP, ZTOT_RC_RIMSG*ZINV_TSTEP, ZTOT_RS_RIMCG*ZINV_TSTEP,& + ZTOT_RR_ACCSS*ZINV_TSTEP, ZTOT_RR_ACCSG*ZINV_TSTEP, ZTOT_RS_ACCRG*ZINV_TSTEP,& + -ZTOT_RS_CMEL*ZINV_TSTEP, -ZTOT_RI_CFRZ*ZINV_TSTEP, -ZTOT_RR_CFRZ*ZINV_TSTEP, & + -ZTOT_RC_WETG*ZINV_TSTEP, -ZTOT_RI_WETG*ZINV_TSTEP, -ZTOT_RR_WETG*ZINV_TSTEP, & + -ZTOT_RS_WETG*ZINV_TSTEP, & + -ZTOT_RC_DRYG*ZINV_TSTEP, -ZTOT_RI_DRYG*ZINV_TSTEP, -ZTOT_RR_DRYG*ZINV_TSTEP, & + -ZTOT_RS_DRYG*ZINV_TSTEP, & + ZTOT_RR_GMLT*ZINV_TSTEP, -ZTOT_RC_BERFI*ZINV_TSTEP, & +! variables et processus optionnels propres a la grele : pas encore teste + PRWETGH=ZTOT_RH_WETG*ZINV_TSTEP, & + PRCWETH=ZTOT_RC_WETH, PRIWETH=ZTOT_RI_WETH, PRSWETH=ZTOT_RS_WETH, & + PRGWETH=ZTOT_RG_WETH, PRRWETH=ZTOT_RR_WETH, & +! PRCDRYH=ZTOT_RC_DRYH, PRIDRYH=ZTOT_RI_DRYH, PRSDRYH=ZTOT_RS_DRYH, & +! PRRDRYH=ZTOT_RR_DRYH, PRGDRYH=ZTOT_RG_DRYH, & + PRDRYHG=ZTOT_RG_COHG, PRHMLTR=ZTOT_RR_HMLT, & + PRHT=ZRHT, PRHS=ZRHS, PQHT=ZQHT, PQHS=ZQHS, PCHT=ZCHT, & +! variables et processus optionnels propres a lima + PCCT=ZCCT_ELEC, PCRT=ZCRT_ELEC, PCST=ZCST_ELEC, PCGT=ZCGT_ELEC, & + PRVHENC=ZTOT_RV_HENU*ZINV_TSTEP, PRCHINC=-ZTOT_RC_HINC*ZINV_TSTEP, & + PRVHONH=-ZTOT_RV_HONH*ZINV_TSTEP, PRRCVRC=-ZTOT_RR_CVRC*ZINV_TSTEP, & + PRICNVI=ZTOT_RI_CNVI*ZINV_TSTEP, PRVDEPI=ZTOT_RI_DEPI*ZINV_TSTEP, & + PRSHMSI=ZTOT_RI_HMS*ZINV_TSTEP, PRGHMGI=ZTOT_RI_HMG*ZINV_TSTEP, & + PRICIBU=ZTOT_RI_CIBU*ZINV_TSTEP, PRIRDSF=ZTOT_RI_RDSF*ZINV_TSTEP, & + PRCCORR2=-ZTOT_RC_CORR2*ZINV_TSTEP, PRRCORR2=-ZTOT_RR_CORR2*ZINV_TSTEP, & + PRICORR2=-ZTOT_RI_CORR2*ZINV_TSTEP) + ELSE + CALL ELEC_TENDENCIES(D, KRR, IELEC, PTSTEP, GMASK_ELEC, & + PRHODREF, PRHODJ, ZT, ZCIT_ELEC, & + ZRVT_ELEC, ZRCT_ELEC, ZRRT_ELEC, ZRIT_ELEC, ZRST_ELEC, ZRGT_ELEC, & + ZQPIT, ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQNIT, & + ZQPIS, ZQCS, ZQRS, ZQIS, ZQSS, ZQGS, ZQNIS, & + ZTOT_RI_HIND*ZINV_TSTEP, -ZTOT_RR_HONR*ZINV_TSTEP, ZTOT_RC_IMLT*ZINV_TSTEP, & + -ZTOT_RC_HONC*ZINV_TSTEP, ZTOT_RS_DEPS*ZINV_TSTEP, -ZTOT_RI_AGGS*ZINV_TSTEP, & + -ZTOT_RI_CNVS*ZINV_TSTEP, ZTOT_RG_DEPG*ZINV_TSTEP, -ZTOT_RC_AUTO*ZINV_TSTEP, & + -ZTOT_RC_ACCR*ZINV_TSTEP, -ZTOT_RR_EVAP*ZINV_TSTEP, & + ZTOT_RC_RIMSS*ZINV_TSTEP, ZTOT_RC_RIMSG*ZINV_TSTEP, ZTOT_RS_RIMCG*ZINV_TSTEP,& + ZTOT_RR_ACCSS*ZINV_TSTEP, ZTOT_RR_ACCSG*ZINV_TSTEP, ZTOT_RS_ACCRG*ZINV_TSTEP,& + -ZTOT_RS_CMEL*ZINV_TSTEP, -ZTOT_RI_CFRZ*ZINV_TSTEP, -ZTOT_RR_CFRZ*ZINV_TSTEP, & + -ZTOT_RC_WETG*ZINV_TSTEP, -ZTOT_RI_WETG*ZINV_TSTEP, -ZTOT_RR_WETG*ZINV_TSTEP, & + -ZTOT_RS_WETG*ZINV_TSTEP, & + -ZTOT_RC_DRYG*ZINV_TSTEP, -ZTOT_RI_DRYG*ZINV_TSTEP, -ZTOT_RR_DRYG*ZINV_TSTEP, & + -ZTOT_RS_DRYG*ZINV_TSTEP, & + ZTOT_RR_GMLT*ZINV_TSTEP, -ZTOT_RC_BERFI*ZINV_TSTEP, & +! variables et processus optionnels propres a lima + PCCT=ZCCT, PCRT=ZCRT, PCST=ZCST, PCGT=ZCGT, & + PRVHENC=ZTOT_RV_HENU*ZINV_TSTEP, PRCHINC=-ZTOT_RC_HINC*ZINV_TSTEP, & + PRVHONH=-ZTOT_RV_HONH*ZINV_TSTEP, PRRCVRC=-ZTOT_RR_CVRC*ZINV_TSTEP, & + PRICNVI=ZTOT_RI_CNVI*ZINV_TSTEP, PRVDEPI=ZTOT_RI_DEPI*ZINV_TSTEP, & + PRSHMSI=ZTOT_RI_HMS*ZINV_TSTEP, PRGHMGI=ZTOT_RI_HMG*ZINV_TSTEP, & + PRICIBU=ZTOT_RI_CIBU*ZINV_TSTEP, PRIRDSF=ZTOT_RI_RDSF*ZINV_TSTEP, & + PRCCORR2=-ZTOT_RC_CORR2*ZINV_TSTEP, PRRCORR2=-ZTOT_RR_CORR2*ZINV_TSTEP, & + PRICORR2=-ZTOT_RI_CORR2*ZINV_TSTEP) + END IF + ! + ! update the source variables + PSV_ELEC_S(:,:,:,1) = ZQPIS(:,:,:) + PSV_ELEC_S(:,:,:,2) = ZQCS(:,:,:) + PSV_ELEC_S(:,:,:,3) = ZQRS(:,:,:) + PSV_ELEC_S(:,:,:,4) = ZQIS(:,:,:) + PSV_ELEC_S(:,:,:,5) = ZQSS(:,:,:) + PSV_ELEC_S(:,:,:,6) = ZQGS(:,:,:) + IF (KRR == 6) THEN + PSV_ELEC_S(:,:,:,7) = ZQNIS(:,:,:) + ELSE IF (KRR == 7) THEN + PSV_ELEC_S(:,:,:,7) = ZQHS(:,:,:) + PSV_ELEC_S(:,:,:,8) = ZQNIS(:,:,:) + END IF + ! + DEALLOCATE(GMASK_ELEC) + ! + DEALLOCATE(ZQPIT) + DEALLOCATE(ZQNIT) + DEALLOCATE(ZQCT) + DEALLOCATE(ZQRT) + DEALLOCATE(ZQIT) + DEALLOCATE(ZQST) + DEALLOCATE(ZQGT) + IF (ALLOCATED(ZQHT)) DEALLOCATE(ZQHT) + DEALLOCATE(ZQPIS) + DEALLOCATE(ZQNIS) + DEALLOCATE(ZQCS) + DEALLOCATE(ZQRS) + DEALLOCATE(ZQIS) + DEALLOCATE(ZQSS) + DEALLOCATE(ZQGS) + IF (ALLOCATED(ZQHS)) DEALLOCATE(ZQHS) + ! + DEALLOCATE(ZRVT_ELEC) + DEALLOCATE(ZRCT_ELEC) + DEALLOCATE(ZRRT_ELEC) + DEALLOCATE(ZRIT_ELEC) + DEALLOCATE(ZRST_ELEC) + DEALLOCATE(ZRGT_ELEC) + IF (ALLOCATED(ZRHT_ELEC)) DEALLOCATE(ZRHT_ELEC) + IF (ALLOCATED(ZCCT_ELEC)) DEALLOCATE(ZCCT_ELEC) + IF (ALLOCATED(ZCRT_ELEC)) DEALLOCATE(ZCRT_ELEC) + IF (ALLOCATED(ZCIT_ELEC)) DEALLOCATE(ZCIT_ELEC) + IF (ALLOCATED(ZCST_ELEC)) DEALLOCATE(ZCST_ELEC) + IF (ALLOCATED(ZCGT_ELEC)) DEALLOCATE(ZCGT_ELEC) + IF (ALLOCATED(ZCHT_ELEC)) DEALLOCATE(ZCHT_ELEC) + ! +END IF +! +DEALLOCATE(ZTOT_RI_HIND) +DEALLOCATE(ZTOT_RC_HINC) +DEALLOCATE(ZTOT_RV_HENU) +DEALLOCATE(ZTOT_RV_HONH) +! +! +!* 7.3 Unpacking variables +! ------------------- +! +! not necessary! the only variables needed in the following (PQxS) are already 3D +! +! +!------------------------------------------------------------------------------- +! !* 7. TOTAL TENDENCIES ! ---------------- ! @@ -1826,7 +2265,9 @@ if ( BUCONF%lbu_enable ) then call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'HONC', ztot_rc_honc (:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'IMLT', ztot_rc_imlt (:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'BERFI', ztot_rc_berfi(:, :, :) * zrhodjontstep(:, :, :) ) - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'RIM', ztot_rc_rim (:, :, :) * zrhodjontstep(:, :, :) ) +! call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'RIM', ztot_rc_rim (:, :, :) * zrhodjontstep(:, :, :) ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'RIM', (ztot_rc_rimss(:, :, :) + ztot_rc_rimsg(:, :, :)) & + * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'WETG', ztot_rc_wetg (:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'DRYG', ztot_rc_dryg (:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'CVRC', -ztot_rr_cvrc (:, :, :) * zrhodjontstep(:, :, :) ) @@ -1839,7 +2280,9 @@ if ( BUCONF%lbu_enable ) then call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'ACCR', -ztot_rc_accr(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'REVA', ztot_rr_evap(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'HONR', ztot_rr_honr(:, :, :) * zrhodjontstep(:, :, :) ) - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'ACC', ztot_rr_acc (:, :, :) * zrhodjontstep(:, :, :) ) +! call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'ACC', ztot_rr_acc (:, :, :) * zrhodjontstep(:, :, :) ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'ACC', (ztot_rc_rimss(:, :, :) + ztot_rc_rimsg(:, :, :)) & + * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'CFRZ', ztot_rr_cfrz(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'WETG', ztot_rr_wetg(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'DRYG', ztot_rr_dryg(:, :, :) * zrhodjontstep(:, :, :) ) @@ -1874,9 +2317,13 @@ if ( BUCONF%lbu_enable ) then call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'DEPS', ztot_rs_deps(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'CNVS', -ztot_ri_cnvs(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'AGGS', -ztot_ri_aggs(:, :, :) * zrhodjontstep(:, :, :) ) - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'RIM', ztot_rs_rim (:, :, :) * zrhodjontstep(:, :, :) ) +! call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'RIM', ztot_rs_rim (:, :, :) * zrhodjontstep(:, :, :) ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'RIM', (-ztot_rc_rimss(:, :, :) - ztot_rs_rimcg(:, :, :)) & + * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'HMS', ztot_rs_hms (:, :, :) * zrhodjontstep(:, :, :) ) - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'ACC', ztot_rs_acc (:, :, :) * zrhodjontstep(:, :, :) ) +! call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'ACC', ztot_rs_acc (:, :, :) * zrhodjontstep(:, :, :) ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'ACC', (ztot_rr_accss(:, :, :) - ztot_rs_accrg (:, :, :)) & + * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'CMEL', ztot_rs_cmel(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'CIBU', -ztot_ri_cibu(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'WETG', ztot_rs_wetg(:, :, :) * zrhodjontstep(:, :, :) ) @@ -1887,8 +2334,12 @@ if ( BUCONF%lbu_enable ) then if ( BUCONF%lbudget_rg ) then call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HONR', -ztot_rr_honr(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DEPG', ztot_rg_depg(:, :, :) * zrhodjontstep(:, :, :) ) - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'RIM', ztot_rg_rim (:, :, :) * zrhodjontstep(:, :, :) ) - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'ACC', ztot_rg_acc (:, :, :) * zrhodjontstep(:, :, :) ) +! call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'RIM', ztot_rg_rim (:, :, :) * zrhodjontstep(:, :, :) ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'RIM', (-ztot_rc_rimsg(:, :, :) + ztot_rs_rimcg(:, :, :) ) & + * zrhodjontstep(:, :, :) ) +! call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'ACC', ztot_rg_acc (:, :, :) * zrhodjontstep(:, :, :) ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'ACC', (ztot_rr_accsg(:, :, :) + ztot_rs_accrg (:, :, :)) & + * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'CMEL', -ztot_rs_cmel(:, :, :) * zrhodjontstep(:, :, :) ) call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'CFRZ', ( -ztot_rr_cfrz(:, :, :) - ztot_ri_cfrz(:, :, :) ) & * zrhodjontstep(:, :, :) ) diff --git a/src/PHYEX/micro/modd_elec_descr.f90 b/src/PHYEX/micro/modd_elec_descr.f90 index 82d346588cb8f8c435011290facd2b8c667f311f..24cdba934b55911b4d91d1a0da23427bd345a391 100644 --- a/src/PHYEX/micro/modd_elec_descr.f90 +++ b/src/PHYEX/micro/modd_elec_descr.f90 @@ -31,6 +31,8 @@ !! Helsdon-Farley (JGR, 1987, 5661-5675) !! Add "Beard" effect via sedimentation process !! J.-P. Pinty 25/10/13 Add "Latham" effect via aggregation process +!! C. Barthe 05/07/23 New data structures for PHYEX - for sedimentation in ICE3 +!! + Remove unused variables !! !------------------------------------------------------------------------------- ! @@ -90,30 +92,12 @@ REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XQTMIN ! Min values allowed for the ! volumetric charge REAL, DIMENSION(:) , ALLOCATABLE :: XRTMIN_ELEC ! Limit value of R where charge is available ! -REAL, SAVE :: XCXR ! Exponent in the concentration-slope REAL :: XEPSILON ! Dielectric permittivity of air (F/m) REAL :: XECHARGE ! Elementary charge (C) ! -! charge-diameter relationship : e_x and f_x in q_x=e_xD^f_x -! -REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XEC, XER, XEI, XES, XEG, XEH ! e_x -REAL, SAVE :: XFC, XFR, XFI, XFS, XFG, XFH ! f_x -! ! ! parameters relative to electrification ! -REAL :: XESR, & ! Mean collection efficiency for rain-aggregate, - XEGR, & ! graupel_rain, - XEGS ! graupel_snow -REAL :: XDELTATMIN ! Minimum temperature gap between ZTT(:) and XQTC -! -REAL :: XQINDIV_C_CST, & ! - XQINDIV_R_CST, & ! - XQINDIV_I_CST, & ! Constants for the individual charge - XQINDIV_I_EXP, & ! calculation - XQINDIV_S_CST, & ! - XQINDIV_G_CST ! -! REAL, SAVE :: XLBDAR_MAXE, & ! Max values allowed for the shape XLBDAS_MAXE, & ! when computation of charge separation XLBDAG_MAXE, & ! and of lightning neutralisation @@ -175,4 +159,34 @@ LOGICAL :: LSEDIM_BEARD=.FALSE. ! .T.: to enable ELEC=>MICROPHYS via LOGICAL :: LIAGGS_LATHAM=.FALSE. ! .T.: to enable ELEC=>MICROPHYS via ! ! ice aggregation rate ! +! The following variables must be declared with a derived type to match with PHYEX requirements +TYPE ELEC_DESCR_t + REAL :: XFC, XFR, XFI, XFS, XFG, XFH ! f_x in q_x = e_x D^f_x + REAL :: XCXR ! Exponent in the concentration-slope +END TYPE ELEC_DESCR_t +! +TYPE(ELEC_DESCR_t), SAVE, TARGET :: ELEC_DESCR +! +REAL, POINTER :: XFC => NULL(), & + XFR => NULL(), & + XFI => NULL(), & + XFS => NULL(), & + XFG => NULL(), & + XFH => NULL(), & + XCXR => NULL() +! +CONTAINS +! +SUBROUTINE ELEC_DESCR_ASSOCIATE() + IMPLICIT NONE + ! + XFC => ELEC_DESCR%XFC + XFR => ELEC_DESCR%XFR + XFI => ELEC_DESCR%XFI + XFS => ELEC_DESCR%XFS + XFG => ELEC_DESCR%XFG + XFH => ELEC_DESCR%XFH + XCXR => ELEC_DESCR%XCXR +END SUBROUTINE ELEC_DESCR_ASSOCIATE +! END MODULE MODD_ELEC_DESCR diff --git a/src/PHYEX/micro/mode_ice4_correct_negativities.f90 b/src/PHYEX/micro/mode_ice4_correct_negativities.f90 index cf569687e9cf6ddaac782d09e9f869eb0c5dde51..bb99a7cf1d25a40f136fb24824df880bf4863efe 100644 --- a/src/PHYEX/micro/mode_ice4_correct_negativities.f90 +++ b/src/PHYEX/micro/mode_ice4_correct_negativities.f90 @@ -6,24 +6,34 @@ MODULE MODE_ICE4_CORRECT_NEGATIVITIES IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRV, PRC, PRR, & + SUBROUTINE ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRV, PRC, PRR, & &PRI, PRS, PRG, & &PTH, PLVFACT, PLSFACT, PRH) + !SUBROUTINE ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, OELEC, PRV, PRC, PRR, & +! &PRI, PRS, PRG, & +! &PTH, PLVFACT, PLSFACT, PRH, & +! &PQPI, PQC, PQR, PQI, PQS, PQG, PQNI, & +! &PTH, PLVFACT, PLSFACT, PRH, PQH) ! USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t +!USE MODD_ELEC_DESCR, ONLY: XECHARGE ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KRR +!LOGICAL, INTENT(IN) :: OELEC REAL, DIMENSION(D%NIJT, D%NKT), INTENT(INOUT) :: PRV, PRC, PRR, PRI, PRS, PRG, PTH +!REAL, DIMENSION(D%NIJT, D%NKT), INTENT(INOUT) :: PQPI, PQC, PQR, PQI, PQS, PQG, PQNI REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PLVFACT, PLSFACT REAL, DIMENSION(D%NIJT, D%NKT), OPTIONAL, INTENT(INOUT) :: PRH +!REAL, DIMENSION(D%NIJT, D%NKT), OPTIONAL, INTENT(INOUT) :: PQH ! REAL :: ZW +!REAL :: ZION, ZADD INTEGER :: JIJ, JK, IKTB, IKTE, IIJB, IIJE REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -43,32 +53,75 @@ DO JK = IKTB, IKTE PRV(JIJ,JK)=PRV(JIJ,JK)+ZW PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) PRC(JIJ,JK)=PRC(JIJ,JK)-ZW +!++cb-- pour l'elec, on peut eventuellement appeler une routine : ca evitera les pb avec xecharge ? +! IF (OELEC .AND. ZW .LT. 0.) THEN +! ZION = PQC(JIJ,JK) / XECHARGE +! ZADD = 0.5 + SIGN(0.5, PQC(JIJ,JK)) +! PQPI(JIJ,JK) = PQPI(JIJ,JK) + ZADD * ZION +! PQNI(JIJ,JK) = PQNI(JIJ,JK) + (1. - ZADD) * ZION +! PQC(JIJ,JK) = 0. +! END IF ZW =PRR(JIJ,JK)-MAX(PRR(JIJ,JK), 0.) PRV(JIJ,JK)=PRV(JIJ,JK)+ZW PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) PRR(JIJ,JK)=PRR(JIJ,JK)-ZW +! IF (OELEC .AND. ZW .LT. 0.) THEN +! ZION = PQR(JIJ,JK) / XECHARGE +! ZADD = 0.5 + SIGN(0.5, PQR(JIJ,JK)) +! PQPI(JIJ,JK) = PQPI(JIJ,JK) + ZADD * ZION +! PQNI(JIJ,JK) = PQNI(JIJ,JK) + (1. - ZADD) * ZION +! PQR(JIJ,JK) = 0. +! END IF ZW =PRI(JIJ,JK)-MAX(PRI(JIJ,JK), 0.) PRV(JIJ,JK)=PRV(JIJ,JK)+ZW PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) PRI(JIJ,JK)=PRI(JIJ,JK)-ZW +! IF (OELEC .AND. ZW .LT. 0.) THEN +! ZION = PQI(JIJ,JK) / XECHARGE +! ZADD = 0.5 + SIGN(0.5, PQI(JIJ,JK)) +! PQPI(JIJ,JK) = PQPI(JIJ,JK) + ZADD * ZION +! PQNI(JIJ,JK) = PQNI(JIJ,JK) + (1. - ZADD) * ZION +! PQI(JIJ,JK) = 0. +! END IF ZW =PRS(JIJ,JK)-MAX(PRS(JIJ,JK), 0.) PRV(JIJ,JK)=PRV(JIJ,JK)+ZW PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) PRS(JIJ,JK)=PRS(JIJ,JK)-ZW +! IF (OELEC .AND. ZW .LT. 0.) THEN +! ZION = PQS(JIJ,JK) / XECHARGE +! ZADD = 0.5 + SIGN(0.5, PQS(JIJ,JK)) +! PQPI(JIJ,JK) = PQPI(JIJ,JK) + ZADD * ZION +! PQNI(JIJ,JK) = PQNI(JIJ,JK) + (1. - ZADD) * ZION +! PQS(JIJ,JK) = 0. +! END IF ZW =PRG(JIJ,JK)-MAX(PRG(JIJ,JK), 0.) PRV(JIJ,JK)=PRV(JIJ,JK)+ZW PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) PRG(JIJ,JK)=PRG(JIJ,JK)-ZW +! IF (OELEC .AND. ZW .LT. 0.) THEN +! ZION = PQG(JIJ,JK) / XECHARGE +! ZADD = 0.5 + SIGN(0.5, PQG(JIJ,JK)) +! PQPI(JIJ,JK) = PQPI(JIJ,JK) + ZADD * ZION +! PQNI(JIJ,JK) = PQNI(JIJ,JK) + (1. - ZADD) * ZION +! PQG(JIJ,JK) = 0. +! END IF IF(KRR==7) THEN ZW =PRH(JIJ,JK)-MAX(PRH(JIJ,JK), 0.) PRV(JIJ,JK)=PRV(JIJ,JK)+ZW PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) PRH(JIJ,JK)=PRH(JIJ,JK)-ZW +! IF (OELEC .AND. ZW .LT. 0.) THEN +! ZION = PQH(JIJ,JK) / XECHARGE +! ZADD = 0.5 + SIGN(0.5, PQH(JIJ,JK)) +! PQPI(JIJ,JK) = PQPI(JIJ,JK) + ZADD * ZION +! PQNI(JIJ,JK) = PQNI(JIJ,JK) + (1. - ZADD) * ZION +! PQH(JIJ,JK) = 0. +! END IF ENDIF ! 2) deal with negative vapor mixing ratio @@ -87,6 +140,13 @@ DO JK = IKTB, IKTE PRV(JIJ,JK)=PRV(JIJ,JK)+ZW PRR(JIJ,JK)=PRR(JIJ,JK)-ZW PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) +! IF (OELEC .AND. ZW .GT. 0.) THEN +! ZION = PQR(JIJ,JK) / XECHARGE +! ZADD = 0.5 + SIGN(0.5, PQG(JIJ,JK)) +! PQPI(JIJ,JK) = PQPI(JIJ,JK) + ZADD * ZION +! PQNI(JIJ,JK) = PQNI(JIJ,JK) + (1. - ZADD) * ZION +! PQR(JIJ,JK) = 0. +! END IF ZW=MIN(MAX(PRS(JIJ,JK), 0.), & &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rs to convert into rv diff --git a/src/PHYEX/micro/mode_ice4_pack.f90 b/src/PHYEX/micro/mode_ice4_pack.f90 index 558f0ab52a7b1da958a7f4f89a8a0aabc022d474..8c334e752f0acf2e1b459e83f90394f8ee4f240d 100644 --- a/src/PHYEX/micro/mode_ice4_pack.f90 +++ b/src/PHYEX/micro/mode_ice4_pack.f90 @@ -8,7 +8,7 @@ IMPLICIT NONE CONTAINS SUBROUTINE ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF, & KPROMA, KSIZE, KSIZE2, & - PTSTEP, KRR, ODMICRO, PEXN, & + PTSTEP, KRR, OSAVE_MICRO, ODMICRO, OELEC, PEXN, & PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & @@ -17,7 +17,7 @@ SUBROUTINE ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF, & PRVHENI, PLVFACT, PLSFACT, & PWR, & TBUDGETS, KBUDGETS, & - PRHS ) + PMICRO_TEND, PLATHAM_IAGGS, PRHS ) ! ###################################################################### ! !!**** * - compute the explicit microphysical sources @@ -100,6 +100,8 @@ INTEGER, INTENT(IN) :: KSIZE INTEGER, INTENT(IN) :: KSIZE2 REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSAVE_MICRO ! If true, microphysical tendencies are saved +LOGICAL, INTENT(IN) :: OELEC ! if true, cloud electricity is activated LOGICAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: ODMICRO ! mask to limit computation ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXN ! Exner function @@ -132,6 +134,11 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLSFACT REAL, DIMENSION(D%NIJT,D%NKT,0:7), INTENT(INOUT) :: PWR TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(MERGE(D%NIJT,0,OSAVE_MICRO),MERGE(D%NKT,0,OSAVE_MICRO),MERGE(IBUNUM-IBUNUM_EXTRA,0,OSAVE_MICRO)), & + INTENT(INOUT) :: PMICRO_TEND ! Microphysical tendencies +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), & + INTENT(IN) :: PLATHAM_IAGGS ! E Function to simulate + ! enhancement of IAGGS REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source ! ! @@ -172,6 +179,9 @@ REAL, DIMENSION(KPROMA, IBUNUM-IBUNUM_EXTRA) :: ZBU_SUM REAL, DIMENSION(KPROMA,0:7) :: ZVART !Packed variables REAL, DIMENSION(KSIZE2,0:7) :: ZEXTPK !To take into acount external tendencies inside the splitting ! +!For retroaction of E on IAGGS +REAL, DIMENSION(MERGE(KPROMA,0,OELEC)) :: ZLATHAM_IAGGS +! INTEGER, DIMENSION(KPROMA) :: I1,I2 ! Used to replace the COUNT and PACK intrinsics on variables INTEGER, DIMENSION(KSIZE) :: I1TOT, I2TOT ! Used to replace the COUNT and PACK intrinsics ! @@ -205,7 +215,7 @@ IF(PARAMI%LPACK_MICRO) THEN ! Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert ENDIF ! - IF(BUCONF%LBU_ENABLE) THEN + IF(BUCONF%LBU_ENABLE .OR. OSAVE_MICRO) THEN DO JV=1, IBUNUM-IBUNUM_EXTRA ZBU_PACK(:, JV)=0. ENDDO @@ -285,6 +295,7 @@ IF(PARAMI%LPACK_MICRO) THEN ZHLI_HCF(IC) = PHLI_HCF(JIJ, JK) ZHLI_HRI(IC) = PHLI_HRI(JIJ, JK) ENDIF + IF (OELEC) ZLATHAM_IAGGS(IC) = PLATHAM_IAGGS(JIJ, JK) ! Save indices for later usages: I1(IC) = JIJ I2(IC) = JK @@ -323,14 +334,15 @@ IF(PARAMI%LPACK_MICRO) THEN CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, & &KPROMA, IMICRO, LLMICRO, PTSTEP, & - &KRR, & + &KRR, OSAVE_MICRO, OELEC, & &ZEXN, ZRHODREF, I1, I2, & &ZPRES, ZCF, ZSIGMA_RC, & &ZCIT, & &ZVART, & &ZHLC_HCF, ZHLC_HRC, & &ZHLI_HCF, ZHLI_HRI, PRAINFR, & - &ZEXTPK, ZBU_SUM, ZRREVAV) + &ZEXTPK, ZBU_SUM, ZRREVAV, & + &ZLATHAM_IAGGS) ! !* 6. UNPACKING ! --------- @@ -350,7 +362,7 @@ IF(PARAMI%LPACK_MICRO) THEN PWR(I1(JL),I2(JL),IRH)=ZVART(JL, IRH) ENDIF ENDDO - IF(BUCONF%LBU_ENABLE) THEN + IF(BUCONF%LBU_ENABLE .OR. OSAVE_MICRO) THEN DO JV=1, IBUNUM-IBUNUM_EXTRA DO JL=1, IMICRO ZBU_PACK(JMICRO+JL-1, JV) = ZBU_SUM(JL, JV) @@ -432,17 +444,31 @@ ELSE ! PARAMI%LPACK_MICRO CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, & &KSIZE, KSIZE, ODMICRO, PTSTEP, & - &KRR, & + &KRR, OSAVE_MICRO, OELEC, & &PEXN, PRHODREF, I1TOT, I2TOT, & &PPABST, PCLDFR, ZSIGMA_RC, & &PCIT, & &PWR, & &PHLC_HCF, PHLC_HRC, & &PHLI_HCF, PHLI_HRI, PRAINFR, & - &ZEXTPK, ZBU_PACK, PEVAP3D) + &ZEXTPK, ZBU_PACK, PEVAP3D, & + &ZLATHAM_IAGGS) ENDIF ! PARAMI%LPACK_MICRO ! +! +!* 6. SAVE MICROPHYSICAL TENDENCIES USED BY OTHER PHYSICAL PARAMETERIZATIONS +! ---------------------------------------------------------------------- +! +IF (OSAVE_MICRO) THEN + DO JV = 1, IBUNUM-IBUNUM_EXTRA + DO JL = 1, KSIZE + PMICRO_TEND(I1TOT(JL),I2TOT(JL),JV) = ZBU_PACK(JL,JV) + ENDDO + ENDDO +END IF +! +! !* 7. BUDGETS ! ------- ! diff --git a/src/PHYEX/micro/mode_ice4_sedimentation.f90 b/src/PHYEX/micro/mode_ice4_sedimentation.f90 index 0a59d64e3d9c0407b4738743b36e99728933bb1a..52d72c4e3e7ac0a51c50faf09f071ff1af79964d 100644 --- a/src/PHYEX/micro/mode_ice4_sedimentation.f90 +++ b/src/PHYEX/micro/mode_ice4_sedimentation.f90 @@ -6,14 +6,16 @@ MODULE MODE_ICE4_SEDIMENTATION IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, BUCONF, & - &PTSTEP, KRR, PDZZ, & +SUBROUTINE ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, BUCONF, & + &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, & &PLVFACT, PLSFACT, PRHODREF, PPABST, PTHT, PT, PRHODJ, & &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, PINPRS, PINPRG, & + &PQCT, PQRT, PQIT, PQST, PQGT, PQCS, PQRS, PQIS, PQSS, PQGS, PEFIELDW, & &TBUDGETS, KBUDGETS, & &PSEA, PTOWN, & - &PINPRH, PRHT, PRHS, PFPR) + &PINPRH, PRHT, PRHS, PFPR, & + &PQHT, PQHS) !! !!** PURPOSE !! ------- @@ -33,12 +35,15 @@ SUBROUTINE ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, BUCONF, & ! USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_RC, & +USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_RC, NBUDGET_SV1, & NBUDGET_RI, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH USE MODD_CST, ONLY: CST_t USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t +USE MODD_ELEC_DESCR, ONLY: ELEC_DESCR_t +USE MODD_ELEC_PARAM, ONLY: ELEC_PARAM_t +USE MODD_NSV, ONLY: NSV_ELECBEG ! USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL USE MODE_BUDGET_PHY, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY @@ -57,7 +62,11 @@ TYPE(CST_t), INTENT(IN) :: CST TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(ELEC_PARAM_t), INTENT(IN) :: ELECP ! electrical parameters +TYPE(ELEC_DESCR_t), INTENT(IN) :: ELECD ! electrical descriptive csts TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF +LOGICAL, INTENT(IN) :: OELEC ! switch to activate cloud electrification +LOGICAL, INTENT(IN) :: OSEDIM_BEARD ! Switch for effect of electrical forces on sedim. REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) @@ -86,12 +95,33 @@ REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRS ! Snow ins REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRG ! Graupel instant precip TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS INTEGER, INTENT(IN) :: KBUDGETS +! +! variables for cloud electricity +! +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQCT ! Cloud droplet | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQRT ! Rain | electric +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQIT ! Ice crystals | charge +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQST ! Snow | at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQGT ! Graupel | +! +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCS ! Cloud droplet | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRS ! Rain | electric +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIS ! Ice crystals | charge +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQSS ! Snow | source +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGS ! Graupel | +! +REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), INTENT(IN) :: PEFIELDW ! vert. E field +! +! optional variables REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN) :: PQHT ! Hail electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQHS ! Hail electric charge source +! ! !* 0.2 declaration of local variables ! @@ -120,7 +150,17 @@ IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDG IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :) * PRHODJ(:, :)) IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :) * PRHODJ(:, :)) IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :) * PRHODJ(:, :)) - +! +! budget of electric charges +IF (BUCONF%LBUDGET_SV .AND. OELEC) THEN + IF (PARAMI%LSEDIC) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+1), 'SEDI', PQCS(:, :) * PRHODJ(:, :)) + CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+2), 'SEDI', PQRS(:, :) * PRHODJ(:, :)) + CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+3), 'SEDI', PQIS(:, :) * PRHODJ(:, :)) + CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+4), 'SEDI', PQSS(:, :) * PRHODJ(:, :)) + CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+5), 'SEDI', PQGS(:, :) * PRHODJ(:, :)) + IF (KRR == 7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+6), 'SEDI', PQHS(:, :) * PRHODJ(:, :)) +END IF +! IF(PARAMI%CSEDIM=='STAT') THEN DO JK = IKTB,IKTE DO JIJ = IIJB,IIJE @@ -143,13 +183,16 @@ IF(PARAMI%CSEDIM=='STAT') THEN PINPRS(:) = PINPRS(:) + ZINPRI(:) !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables ELSEIF(PARAMI%CSEDIM=='SPLI') THEN - CALL ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, & - &PTSTEP, KRR, PDZZ, & + CALL ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, & &PRHODREF, PPABST, PTHT, PT, PRHODJ, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PQCT, PQRT, PQIT, PQST, PQGT, PQCS, PQRS, PQIS, PQSS, PQGS, & + &PEFIELDW, & &PSEA=PSEA, PTOWN=PTOWN, & - &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) + &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR, & + &PQHT=PQHT, PQHS=PQHS) PINPRS(:) = PINPRS(:) + ZINPRI(:) !We correct negativities with conservation !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used. @@ -161,9 +204,15 @@ ELSEIF(PARAMI%CSEDIM=='SPLI') THEN ! will be still active and will lead to negative values. ! We could prevent the algorithm to not consume too much a species, instead we apply ! a correction here. +!++cb-- il faudrait faire la correction correspondante sur les charges electriques pour eviter de se retrouver +! avec des points ou il y a de la charge mais pas de masse ! CALL ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRVS, PRCS, PRRS, & &PRIS, PRSS, PRGS, & &PTHS, PLVFACT, PLSFACT, PRHS) +! CALL ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRVS, PRCS, PRRS, & +! &PRIS, PRSS, PRGS, & +! &PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & +! &PTHS, PLVFACT, PLSFACT, PRHS, PQHS) ELSEIF(PARAMI%CSEDIM=='NONE') THEN ELSE CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for PARAMI%CSEDIM='//PARAMI%CSEDIM) @@ -177,6 +226,16 @@ IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGE IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :) * PRHODJ(:, :)) IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :) * PRHODJ(:, :)) ! +! Budget for electric charges +IF (BUCONF%LBUDGET_SV .AND. OELEC) THEN + IF (PARAMI%LSEDIC) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+1), 'SEDI', PQCS(:, :) * PRHODJ(:, :)) + CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+2), 'SEDI', PQRS(:, :) * PRHODJ(:, :)) + CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+3), 'SEDI', PQIS(:, :) * PRHODJ(:, :)) + CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+4), 'SEDI', PQSS(:, :) * PRHODJ(:, :)) + CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+5), 'SEDI', PQGS(:, :) * PRHODJ(:, :)) + IF (KRR == 7) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1-1+NSV_ELECBEG+6), 'SEDI', PQHS(:, :) * PRHODJ(:, :)) +END IF +! IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION', 1, ZHOOK_HANDLE) ! END SUBROUTINE ICE4_SEDIMENTATION diff --git a/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 b/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 index b2ef8d05bda3cadc3cca8095a718c98e4f880adc..829cb2189c7c2a85a945f7338cec1380437451d2 100644 --- a/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 +++ b/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 @@ -6,13 +6,16 @@ MODULE MODE_ICE4_SEDIMENTATION_SPLIT IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, & - &PTSTEP, KRR, PDZZ, & +SUBROUTINE ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, & &PRHODREF, PPABST, PTHT, PT, PRHODJ, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & + &PQCT, PQRT, PQIT, PQST, PQGT, PQCS, PQRS, PQIS, PQSS, PQGS,& + &PEFIELDW, & &PSEA, PTOWN, & - &PINPRH, PRHT, PRHS, PFPR) + &PINPRH, PRHT, PRHS, PFPR, & + &PQHT, PQHS) !! !!** PURPOSE !! ------- @@ -28,6 +31,7 @@ SUBROUTINE ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, & !! ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! J. Wurtz 03/2022: New snow characteristics with LSNOW_T +! C. Barthe 03/2023: Add sedimentation of electric charges ! ! !* 0. DECLARATIONS @@ -39,8 +43,11 @@ USE MODD_CST, ONLY: CST_t USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t +USE MODD_ELEC_DESCR, ONLY: ELEC_DESCR_t +USE MODD_ELEC_PARAM, ONLY: ELEC_PARAM_t ! USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL +USE MODE_ELEC_BEARD_EFFECT, ONLY: ELEC_BEARD_EFFECT ! USE MODI_GAMMA, ONLY: GAMMA ! @@ -48,13 +55,17 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -TYPE(DIMPHYEX_t), INTENT(IN) :: D !array dimensions -TYPE(CST_t), INTENT(IN) :: CST -TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP -TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED -TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable +TYPE(DIMPHYEX_t), INTENT(IN) :: D !array dimensions +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(ELEC_PARAM_t), INTENT(IN) :: ELECP ! electrical parameters +TYPE(ELEC_DESCR_t), INTENT(IN) :: ELECD ! electrical descriptive csts +LOGICAL, INTENT(IN) :: OELEC ! if true, cloud electricity is activated +LOGICAL, INTENT(IN) :: OSEDIM_BEARD ! if true, effect of electrical forces on sedim. +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at t @@ -71,44 +82,62 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRSS ! Snow/aggrega REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! variables for cloud electricity +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQCT ! Cloud water electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQRT ! Rain water electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQIT ! Pristine ice electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQST ! Snow/aggregate electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQGT ! Graupel electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN) :: PQHT ! Hail electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCS ! Cloud water electric charge source +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRS ! Rain water electric charge source +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIS ! Pristine ice electric charge source +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQSS ! Snow/aggregate electric charge source +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGS ! Graupel electric charge source +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQHS ! Hail electric charge source +REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), INTENT(IN) :: PEFIELDW ! Vertical E field ! !* 0.2 declaration of local variables ! ! -INTEGER :: JIJ, JK -INTEGER :: IKTB, IKTE, IIJE, IIJB -INTEGER :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL :: GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL :: GPRESENT_PFPR, GPRESENT_PSEA -REAL :: ZINVTSTEP -REAL, DIMENSION(D%NIJT) :: ZCONC_TMP ! Weighted concentration -REAL, DIMENSION(D%NIJT,D%NKTB:D%NKTE) :: ZW ! work array -REAL, DIMENSION(D%NIJT, D%NKT) :: ZCONC3D, & ! droplet condensation - & ZRAY, & ! Cloud Mean radius - & ZLBC, & ! XLBC weighted by sea fraction - & ZFSEDC, & - & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step - & ZRCT, & - & ZRRT, & - & ZRIT, & - & ZRST, & - & ZRGT, & - & ZRHT +INTEGER :: JIJ, JK +INTEGER :: IKTB, IKTE, IKB, IKL, IIJE, IIJB +INTEGER :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL :: GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL :: GPRESENT_PFPR, GPRESENT_PSEA +REAL :: ZINVTSTEP +REAL, DIMENSION(D%NIJT) :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(D%NIJT,D%NKTB:D%NKTE) :: ZW ! work array +REAL, DIMENSION(D%NIJT, D%NKT) :: ZCONC3D, & ! droplet condensation + & ZRAY, & ! Cloud Mean radius + & ZLBC, & ! XLBC weighted by sea fraction + & ZFSEDC, & + & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step + & ZRCT, & + & ZRRT, & + & ZRIT, & + & ZRST, & + & ZRGT, & + & ZRHT +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)) :: & + ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQHT, & ! electric charge a t + ZPQCS, ZPQRS, ZPQIS, ZPQSS, ZPQGS, ZPQHS ! electric charge created during the time step REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT', 0, ZHOOK_HANDLE) + !------------------------------------------------------------------------------- ! ! @@ -204,6 +233,23 @@ DO JK=IKTB, IKTE END IF ! ZW(JIJ,JK) =1./(PRHODREF(JIJ,JK)* PDZZ(JIJ,JK)) + ! + ! Cloud electricity + IF (OELEC) THEN + IF (GSEDIC) ZPQCS(JIJ,JK) = PQCS(JIJ,JK) - PQCT(JIJ,JK) * ZINVTSTEP + ZPQRS(JIJ,JK) = PQRS(JIJ,JK) - PQRT(JIJ,JK) * ZINVTSTEP + ZPQIS(JIJ,JK) = PQIS(JIJ,JK) - PQIT(JIJ,JK) * ZINVTSTEP + ZPQSS(JIJ,JK) = PQSS(JIJ,JK) - PQST(JIJ,JK) * ZINVTSTEP + ZPQGS(JIJ,JK) = PQGS(JIJ,JK) - PQGT(JIJ,JK) * ZINVTSTEP + IF (IRR==7) ZPQHS(JIJ,JK) = PQHS(JIJ,JK) - PQHT(JIJ,JK) * ZINVTSTEP + ! + ZQCT(JIJ,JK) = PQCT(JIJ,JK) + ZQRT(JIJ,JK) = PQST(JIJ,JK) + ZQIT(JIJ,JK) = PQIT(JIJ,JK) + ZQST(JIJ,JK) = PQST(JIJ,JK) + ZQGT(JIJ,JK) = PQGT(JIJ,JK) + IF (IRR==7) ZQHT(JIJ,JK) = PQHT(JIJ,JK) + ENDIF ENDDO ENDDO ! @@ -211,52 +257,65 @@ ENDDO !* 2.1 for cloud ! IF (GSEDIC) THEN - CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & + CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &KRR, OELEC, OSEDIM_BEARD, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & &2, & &ZRCT, PRCS, PINPRC, ZPRCS, & - &ZRAY, ZLBC, ZFSEDC, ZCONC3D, PFPR=PFPR) + &ZQCT, PQCS, ZPQCS, PEFIELDW, & + &PRAY=ZRAY, PLBC=ZLBC, PFSEDC=ZFSEDC, PCONC3D=ZCONC3D, & + &PFPR=PFPR) ENDIF ! !* 2.2 for rain ! - CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & + CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &KRR, OELEC, OSEDIM_BEARD, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & &3, & &ZRRT, PRRS, PINPRR, ZPRRS, & + &ZQRT, PQRS, ZPQRS, PEFIELDW, & &PFPR=PFPR) ! !* 2.3 for pristine ice ! - CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & + CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &KRR, OELEC, OSEDIM_BEARD, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & &4, & &ZRIT, PRIS, PINPRI, ZPRIS, & + &ZQIT, PQIS, ZPQIS, PEFIELDW, & &PFPR=PFPR) ! !* 2.4 for aggregates/snow ! - CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & + CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &KRR, OELEC, OSEDIM_BEARD, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & &5, & &ZRST, PRSS, PINPRS, ZPRSS, & + &ZQST, PQSS, ZPQSS, PEFIELDW, & &PFPR=PFPR) ! !* 2.5 for graupeln ! - CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & + CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &KRR, OELEC, OSEDIM_BEARD, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & &6, & &ZRGT, PRGS, PINPRG, ZPRGS, & + &ZQGT, PQGS, ZPQGS, PEFIELDW, & &PFPR=PFPR) ! !* 2.6 for hail ! IF (IRR==7) THEN - CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & + CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &KRR, OELEC, OSEDIM_BEARD, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & &7, & &ZRHT, PRHS, PINPRH, ZPRHS, & + &ZQHT, PQHS, ZPQHS, PEFIELDW, & &PFPR=PFPR) ENDIF ! @@ -268,10 +327,12 @@ CONTAINS !------------------------------------------------------------------------------- ! ! -SUBROUTINE INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & +SUBROUTINE INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, & + &KRR, OELEC, OSEDIM_BEARD, & &PRHODREF, POORHODZ, PDZZ, PPABST, PTHT, PT, PTSTEP, & &KSPE, & &PRXT, PRXS, PINPRX, PPRXS, & + &PQXT, PQXS, PPQXS, PEFIELDW, & &PRAY, PLBC, PFSEDC, PCONC3D, PFPR) ! !* 0. DECLARATIONS @@ -282,6 +343,12 @@ USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t ! +! parameters for electricity +USE MODD_ELEC_PARAM, ONLY: ELEC_PARAM_t +USE MODD_ELEC_DESCR, ONLY: ELEC_DESCR_t +! +USE MODI_MOMG +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -291,19 +358,28 @@ TYPE(CST_t), INTENT(IN) :: CST TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(ELEC_PARAM_t), INTENT(IN) :: ELECP ! electrical parameters +TYPE(ELEC_DESCR_t), INTENT(IN) :: ELECD ! electrical descriptive csts INTEGER, INTENT(IN) :: KRR -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(D%NIJT,D%NKTB:D%NKTE), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! layer thikness (m) -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PT -REAL, INTENT(IN) :: PTSTEP ! total timestep -INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRXT ! mr of specy X -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE -REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRX ! instant precip -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPRXS ! external tendencie +LOGICAL, INTENT(IN) :: OELEC ! if true, sedimentation of elec. charges +LOGICAL, INTENT(IN) :: OSEDIM_BEARD ! if true, effect of electric forces on sedim. +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(D%NIJT,D%NKTB:D%NKTE), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! layer thikness (m) +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PT +REAL, INTENT(IN) :: PTSTEP ! total timestep +INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRXT ! mr of specy X +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRX ! instant precip +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPRXS ! external tendencie +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQXT ! electric charge at t for specy KSPE +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQXS ! tendency of the electric charge + ! for specy KSPE +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PPQXS ! external tendency +REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), INTENT(IN) :: PEFIELDW ! Vertical E field REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT), OPTIONAL :: PFPR ! upper-air precipitation fluxes ! @@ -316,13 +392,40 @@ REAL :: ZINVTSTEP REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC REAL :: ZLBDA REAL :: ZFSED, ZEXSED -REAL :: ZMRCHANGE +REAL :: ZMRCHANGE REAL, DIMENSION(D%NIJT) :: ZMAX_TSTEP ! Maximum CFL in column REAL, DIMENSION(SIZE(ICED%XRTMIN)) :: ZRSMIN REAL, DIMENSION(D%NIJT) :: ZREMAINT ! Remaining time until the timestep end REAL, DIMENSION(D%NIJT, 0:D%NKT+1) :: ZWSED ! Sedimentation fluxes INTEGER :: IKTB, IKTE, IKB, IKL, IIJE, IIJB REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +! +! local variables for cloud electricity +REAL :: ZEXT ! e_x coefficient of the q(D) relation +REAL :: ZNCI ! N_ci for ice crystal sedimentation +!REAL, DIMENSION(D%NIJT,0:D%NKT+1) :: ZWSEDQ ! Sedimentation fluxes for electric charges +!REAL, DIMENSION(D%NIJT,0:D%NKT+1) :: ZBEARDCOEFF ! effect of electric forces on sedimentation +!REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(0:D%NKT+1,0,OELEC)) :: & +!++cb-- est-ce que cette declaration est correcte par rapport a ce qui est fait pour zwsed ? +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT+2,0,OELEC)) :: & + ZWSEDQ ! Sedimentation fluxes for electric charges +!REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(0:D%NKT+1,0,OSEDIM_BEARD)) :: & +REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)) :: & + ZBEARDCOEFF ! effect of electric forces on sedimentation +!REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(0:D%NKT+1,0,OSEDIM_BEARD)) :: & +REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)) :: & + ZLBDA3 ! slope parameter of the distribution +!LOGICAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(0:D%NKT+1,0,OSEDIM_BEARD)) :: GMASK +LOGICAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)) :: GMASK +REAL :: ZQCHANGE +REAL :: ZFQSED, ZEXQSED +REAL :: ZEXMIN, ZEXMAX +REAL :: ZLBX, ZLBEXX +REAL :: ZFQUPDX +REAL :: ZCXX +REAL :: ZFX +! end - local variables for cloud electricity +! IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:INTERNAL_SEDIM_SPLIT', 0, ZHOOK_HANDLE) ! IKTB=D%NKTB @@ -348,6 +451,18 @@ ZREMAINT(:) = PTSTEP ! DO WHILE (ANY(ZREMAINT>0.)) ! + ! Effect of electrical forces on sedimentation + IF (OELEC .AND. OSEDIM_BEARD) THEN + DO JK = IKTB, IKTE + DO JIJ = IIJB, IIJE + IF (PRXT(JIJ,JK)>ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN + GMASK(JIJ,JK) = .TRUE. + ELSE + GMASK(JIJ,JK) = .FALSE. + END IF + END DO + END DO + END IF ! !* 1. Parameters for cloud sedimentation ! @@ -358,6 +473,10 @@ DO WHILE (ANY(ZREMAINT>0.)) IF(KSPE==2) THEN !******* for cloud ZWSED(:,:) = 0. + IF (OELEC) THEN + ZWSEDQ(:,:) = 0. + ZLBDA3(:,:) = 0. + END IF DO JK = IKTB,IKTE DO JIJ = IIJB,IIJE IF(PRXT(JIJ,JK)>ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN @@ -370,12 +489,37 @@ DO WHILE (ANY(ZREMAINT>0.)) ZZCC = ICED%XCC*(1.+1.26*ZZWLBDA/ZRAY) ZWSED(JIJ, JK) = PRHODREF(JIJ,JK)**(-ICED%XCEXVT +1 ) * & &ZZWLBDC**(-ICED%XDC)*ZZCC*PFSEDC(JIJ,JK) * PRXT(JIJ,JK) +!++cb++ nouveau : traitement de la sedimentation des charges portees par les gouttelettes +! A TESTER + IF (OELEC) THEN + ZEXT = PQXT(JIJ,JK) / ELECP%XFQUPDC * PRHODREF(JIJ,JK) + IF (ABS(ZEXT) .GT. ELECP%XECMIN) THEN + ZWSEDQ(JIJ,JK) = ELECP%XFQSEDC * ZEXT * PCONC3D(JIJ,JK) * & + PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * & + ZZCC * ZZWLBDC**(-ELECP%XEXQSEDC) + IF (OSEDIM_BEARD) ZLBDA3(JIJ,JK) = ZZWLBDC + ENDIF + ENDIF ENDIF +!--cb-- ENDDO ENDDO + IF (OELEC .AND. OSEDIM_BEARD) THEN + CALL ELEC_BEARD_EFFECT(D, KSPE, GMASK, PT, PRHODREF, PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF) + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + ZWSED(JIJ,JK) = ZWSED(JIJ,JK) * ZBEARDCOEFF(JIJ,JK) + ZWSEDQ(JIJ,JK) = ZWSEDQ(JIJ,JK) * ZBEARDCOEFF(JIJ,JK) + END DO + END DO + END IF ELSEIF(KSPE==4) THEN ! ******* for pristine ice ZWSED(:,:) = 0. + IF (OELEC) THEN + ZWSEDQ(:,:) = 0. + ZLBDA3(:,:) = 0. + END IF DO JK = IKTB,IKTE DO JIJ = IIJB,IIJE IF(PRXT(JIJ, JK) .GT. MAX(ICED%XRTMIN(4), 1.0E-7) .AND. ZREMAINT(JIJ)>0.) THEN @@ -383,33 +527,81 @@ DO WHILE (ANY(ZREMAINT>0.)) & PRHODREF(JIJ,JK)**(1.-ICED%XCEXVT) * & ! McF&H & MAX( 0.05E6,-0.15319E6-0.021454E6* & & ALOG(PRHODREF(JIJ,JK)*PRXT(JIJ,JK)) )**ICEP%XEXCSEDI + IF (OELEC) THEN + ! N_ci from McF&H + ZNCI = ELECP%XFCI * PRHODREF(JIJ,JK) * PRXT(JIJ,JK) * & + MAX(0.05E6,-0.15319E6-0.021454E6*ALOG(PRHODREF(JIJ,JK)*PRXT(JIJ,JK)))**3. + ! compute e_i of the q - D relationship + ZEXT = PQXT(JIJ,JK) / ELECP%XFQUPDI * & + (PRHODREF(JIJ,JK) * PRXT(JIJ,JK))**(-ELECP%XEXFQUPDI) * & + ZNCI**(ELECP%XEXFQUPDI-1.) + IF (ABS(ZEXT) .GT. ELECP%XEIMIN) THEN + ZWSEDQ(JIJ,JK) = ELECP%XFQSEDI * ZEXT * PRXT(JIJ,JK) * & + PRHODREF(JIJ,JK)**(1.-ICED%XCEXVT) * & + MAX( 0.05E6,-0.15319E6-0.021454E6* & ! McF&H + ALOG(PRHODREF(JIJ,JK)*PRXT(JIJ,JK)) )**(3.*(1-ELECP%XEXQSEDI)) + IF (OSEDIM_BEARD) ZLBDA3(JIJ,JK) = (2.14E-3 * MOMG(ICED%XALPHAI,ICED%XNUI,1.7) * & + ZNCI / (PRHODREF(JIJ,JK) * PRXT(JIJ,JK)))**0.588235 + ENDIF + ENDIF ENDIF ENDDO ENDDO -#ifdef REPRO48 + IF (OELEC .AND. OSEDIM_BEARD) THEN + CALL ELEC_BEARD_EFFECT(D, KSPE, GMASK, PT, PRHODREF, PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF) + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + ZWSED(JIJ,JK) = ZWSED(JIJ,JK) * ZBEARDCOEFF(JIJ,JK) + ZWSEDQ(JIJ,JK) = ZWSEDQ(JIJ,JK) * ZBEARDCOEFF(JIJ,JK) + END DO + END DO + END IF +#ifdef REPRO48 #else ELSEIF(KSPE==5) THEN ! ******* for snow ZWSED(:,:) = 0. + IF (OELEC) THEN + ZWSEDQ(:,:) = 0. + ZLBDA3(:,:) = 0. + END IF DO JK = IKTB,IKTE DO JIJ = IIJB,IIJE IF(PRXT(JIJ,JK)> ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN - IF (PARAMI%LSNOW_T .AND. PT(JIJ,JK)>263.15) THEN - ZLBDA = MAX(MIN(ICED%XLBDAS_MAX, 10**(14.554-0.0423*PT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS - ELSE IF (PARAMI%LSNOW_T) THEN - ZLBDA = MAX(MIN(ICED%XLBDAS_MAX, 10**(6.226 -0.0106*PT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS - ELSE - ZLBDA=MAX(MIN(ICED%XLBDAS_MAX, ICED%XLBS * ( PRHODREF(JIJ,JK) * PRXT(JIJ,JK) )**ICED%XLBEXS),ICED%XLBDAS_MIN) - END IF - ZWSED(JIJ, JK) = ICEP%XFSEDS * & - & PRXT(JIJ,JK)* & - & PRHODREF(JIJ,JK)**(1-ICED%XCEXVT) * & - & (1 + (ICED%XFVELOS/ZLBDA)**ICED%XALPHAS)** (-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS) * & - & ZLBDA ** (ICED%XBS+ICEP%XEXSEDS) - + IF (PARAMI%LSNOW_T .AND. PT(JIJ,JK)>263.15) THEN + ZLBDA = MAX(MIN(ICED%XLBDAS_MAX, 10**(14.554-0.0423*PT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS + ELSE IF (PARAMI%LSNOW_T) THEN + ZLBDA = MAX(MIN(ICED%XLBDAS_MAX, 10**(6.226 -0.0106*PT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS + ELSE + ZLBDA=MAX(MIN(ICED%XLBDAS_MAX, ICED%XLBS * ( PRHODREF(JIJ,JK) * PRXT(JIJ,JK) )**ICED%XLBEXS),ICED%XLBDAS_MIN) + END IF + ZWSED(JIJ, JK) = ICEP%XFSEDS * & + & PRXT(JIJ,JK)* & + & PRHODREF(JIJ,JK)**(1-ICED%XCEXVT) * & + & (1 + (ICED%XFVELOS/ZLBDA)**ICED%XALPHAS)** (-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS) * & + & ZLBDA ** (ICED%XBS+ICEP%XEXSEDS) + IF (OELEC .AND. ZLBDA > 0.) THEN + ! compute the e_x coefficient of the q - D relationship + ZEXT = PRHODREF(JIJ,JK) * PQXT(JIJ,JK) / (ELECP%XFQUPDS * ZLBDA**(ICED%XCXS-ELECD%XFS)) + ZEXT = SIGN( MIN(ABS(ZEXT), ELECP%XESMAX), ZEXT) + IF (ABS(ZEXT) > ELECP%XESMIN) THEN + ZWSEDQ(JIJ,JK) = ELECP%XFQSEDS * ZEXT * PRXT(JIJ,JK)**ELECP%XEXQSEDS & + * PRHODREF(JIJ,JK)**(ELECP%XEXQSEDS-ICED%XCEXVT) + IF (OSEDIM_BEARD) ZLBDA3(JIJ,JK) = ZLBDA + ENDIF + ENDIF ENDIF ENDDO ENDDO + IF (OELEC .AND. OSEDIM_BEARD) THEN + CALL ELEC_BEARD_EFFECT(D, KSPE, GMASK, PT, PRHODREF, PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF) + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + ZWSED(JIJ,JK) = ZWSED(JIJ,JK) * ZBEARDCOEFF(JIJ,JK) + ZWSEDQ(JIJ,JK) = ZWSEDQ(JIJ,JK) * ZBEARDCOEFF(JIJ,JK) + END DO + END DO + END IF #endif ELSE ! ******* for other species @@ -434,15 +626,80 @@ DO WHILE (ANY(ZREMAINT>0.)) CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT', 'no sedimentation parameter for KSPE='//TRIM(YSPE) ) END SELECT ! + IF (OELEC) THEN + SELECT CASE(KSPE) + CASE(3) + ZFQSED = ELECP%XFQSEDR + ZEXQSED = ELECP%XEXQSEDR + ZEXMIN = ELECP%XERMIN + ZEXMAX = ELECP%XERMAX + ZLBX = ICED%XLBR + ZLBEXX = ICED%XLBEXR + ZFQUPDX = ELECP%XFQUPDR + ZCXX = ELECD%XCXR + ZFX = ELECD%XFR + CASE(6) + ZFQSED = ELECP%XFQSEDG + ZEXQSED = ELECP%XEXQSEDG + ZEXMIN = ELECP%XEGMIN + ZEXMAX = ELECP%XEGMAX + ZLBX = ICED%XLBG + ZLBEXX = ICED%XLBEXG + ZFQUPDX = ELECP%XFQUPDG + ZCXX = ICED%XCXG + ZFX = ELECD%XFG + CASE(7) + ZFQSED = ELECP%XFQSEDH + ZEXQSED = ELECP%XEXQSEDH + ZEXMIN = ELECP%XEHMIN + ZEXMAX = ELECP%XEHMAX + ZLBX = ICED%XLBH + ZLBEXX = ICED%XLBEXH + ZFQUPDX = ELECP%XFQUPDH + ZCXX = ICED%XCXH + ZFX = ELECD%XFH + CASE DEFAULT + write( yspe, '( I10 )' ) kspe + call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT', 'no sedimentation parameter for KSPE='//trim(yspe) ) + END SELECT + END IF + ! ZWSED(:,:) = 0. + IF (OELEC) THEN + ZWSEDQ(:,:) = 0. + ZLBDA3(:,:) = 0. + END IF DO JK = IKTB,IKTE DO JIJ = IIJB,IIJE IF(PRXT(JIJ,JK)>ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN ZWSED(JIJ, JK) = ZFSED * PRXT(JIJ, JK)**ZEXSED & & * PRHODREF(JIJ, JK)**(ZEXSED-ICED%XCEXVT) + IF (OELEC) THEN + ! need lambda_x to compute e_x + ZLBDA = ZLBX * (PRHODREF(JIJ,JK) * MAX(PRXT(JIJ,JK), ICED%XRTMIN(KSPE)))**ZLBEXX + IF (ZLBDA > 0.) THEN + ! compute the e_x coefficient of the q - D relationship + ZEXT = PRHODREF(JIJ,JK) * PQXT(JIJ,JK) / (ZFQUPDX * ZLBDA**(ZCXX-ZFX)) + ZEXT = SIGN( MIN(ABS(ZEXT), ZEXMAX), ZEXT) + END IF + IF (ABS(ZEXT) > ZEXMIN) THEN + ZWSEDQ(JIJ,JK) = ZFQSED * ZEXT * PRXT(JIJ,JK)**ZEXQSED & + * PRHODREF(JIJ,JK)**(ZEXQSED-ICED%XCEXVT) + IF (OSEDIM_BEARD) ZLBDA3(JIJ,JK) = ZLBDA + END IF + ENDIF ENDIF ENDDO ENDDO + IF (OELEC .AND. OSEDIM_BEARD) THEN + CALL ELEC_BEARD_EFFECT(D, KSPE, GMASK, PT, PRHODREF, PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF) + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + ZWSED(JIJ,JK) = ZWSED(JIJ,JK) * ZBEARDCOEFF(JIJ,JK) + ZWSEDQ(JIJ,JK) = ZWSEDQ(JIJ,JK) * ZBEARDCOEFF(JIJ,JK) + END DO + END DO + END IF ENDIF ZMAX_TSTEP(:) = ZREMAINT(:) DO JK = IKTB,IKTE @@ -467,6 +724,11 @@ DO WHILE (ANY(ZREMAINT>0.)) IF (GPRESENT_PFPR) THEN PFPR(JIJ,JK,KSPE) = PFPR(JIJ,JK,KSPE) + ZWSED(JIJ,JK) * (ZMAX_TSTEP(JIJ) * ZINVTSTEP) ENDIF + IF (OELEC) THEN + ZQCHANGE = ZMAX_TSTEP(JIJ) * POORHODZ(JIJ,JK) * (ZWSEDQ(JIJ,JK+IKL) - ZWSEDQ(JIJ,JK)) + PQXT(JIJ,JK) = PQXT(JIJ,JK) + ZQCHANGE + PPQXS(JIJ,JK) * ZMAX_TSTEP(JIJ) + PQXS(JIJ,JK) = PQXS(JIJ,JK) + ZQCHANGE * ZINVTSTEP + ENDIF ENDDO ENDDO ! diff --git a/src/PHYEX/micro/mode_ice4_slow.f90 b/src/PHYEX/micro/mode_ice4_slow.f90 index e05c784fae93f11baa945c7859f61084cd5ccbcc..6b6c7140e0351dbedde6ffe0a1850d2e39b0982b 100644 --- a/src/PHYEX/micro/mode_ice4_slow.f90 +++ b/src/PHYEX/micro/mode_ice4_slow.f90 @@ -5,11 +5,12 @@ MODULE MODE_ICE4_SLOW IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_SLOW(CST, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, PRHODREF, PT, & +SUBROUTINE ICE4_SLOW(CST, ICEP, ICED, KPROMA, KSIZE, LDSOFT, OELEC, LDCOMPUTE, PRHODREF, PT, & &PSSI, PLVFACT, PLSFACT, & &PRVT, PRCT, PRIT, PRST, PRGT, & &PLBDAS, PLBDAG, & &PAI, PCJ, PHLI_HCF, PHLI_HRI,& + &PLATHAM_IAGGS, & &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG) !! !!** PURPOSE @@ -25,6 +26,7 @@ SUBROUTINE ICE4_SLOW(CST, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, PRHODREF !! !! R. El Khatib 24-Aug-2021 Optimizations ! J. Wurtz 03/2022: New snow characteristics with LSNOW_T +! C. Barthe 06/2023: Add retroaction of electric field on IAGGS ! ! !* 0. DECLARATIONS @@ -44,6 +46,7 @@ TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KPROMA, KSIZE LOGICAL, INTENT(IN) :: LDSOFT +LOGICAL, INTENT(IN) :: OELEC LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDCOMPUTE REAL, DIMENSION(KPROMA), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(KPROMA), INTENT(IN) :: PT ! Temperature @@ -61,6 +64,7 @@ REAL, DIMENSION(KPROMA), INTENT(IN) :: PAI ! Thermodynamical functi REAL, DIMENSION(KPROMA), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient REAL, DIMENSION(KPROMA), INTENT(IN) :: PHLI_HCF ! REAL, DIMENSION(KPROMA), INTENT(IN) :: PHLI_HRI ! +REAL, DIMENSION(MERGE(KPROMA,0,OELEC)), INTENT(IN) :: PLATHAM_IAGGS ! enhancement factor of IAGGS due to Efield REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRCHONI ! Homogeneous nucleation REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRVDEPS ! Deposition on r_s REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRIAGGS ! Aggregation on r_s @@ -144,6 +148,7 @@ DO JL=1, KSIZE * PRHODREF(JL)**(-ICED%XCEXVT+1.) & * ((PLBDAS(JL))**(ICED%XBS+ICEP%XEXIAGGS)) #endif + IF (OELEC) PRIAGGS(JL) = PRIAGGS(JL) * PLATHAM_IAGGS(JL) ENDIF ELSE PRIAGGS(JL) = 0. diff --git a/src/PHYEX/micro/mode_ice4_stepping.f90 b/src/PHYEX/micro/mode_ice4_stepping.f90 index 43604d778dd49d7da69518fc55b4ad0b608e4165..2494a19afb24944ecd7ede51364ddd4d845a9ddc 100644 --- a/src/PHYEX/micro/mode_ice4_stepping.f90 +++ b/src/PHYEX/micro/mode_ice4_stepping.f90 @@ -9,14 +9,15 @@ CONTAINS SUBROUTINE ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & &LDSIGMA_RC, LDAUCV_ADJU, LDEXT_TEND, & &KPROMA, KMICRO, LDMICRO, PTSTEP, & - &KRR, & + &KRR, OSAVE_MICRO, OELEC, & &PEXN, PRHODREF, K1, K2, & &PPRES, PCF, PSIGMA_RC, & &PCIT, & &PVART, & &PHLC_HCF, PHLC_HRC, & &PHLI_HCF, PHLI_HRI, PRAINFR, & - &PEXTPK, PBU_SUM, PRREVAV) + &PEXTPK, PBU_SUM, PRREVAV, & + &PLATHAM_IAGGS) ! ###################################################################### ! !!**** * - compute the explicit microphysical sources @@ -82,6 +83,8 @@ INTEGER, INTENT(IN) :: KMICRO ! Case r_x>0 locations LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDMICRO REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSAVE_MICRO ! if true, save the microphysical tendencies +LOGICAL, INTENT(IN) :: OELEC ! if true, cloud electricity is activated ! REAL, DIMENSION(KPROMA), INTENT(IN) :: PEXN ! Exner function REAL, DIMENSION(KPROMA), INTENT(IN) :: PRHODREF! Reference density @@ -99,6 +102,8 @@ REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRAINFR REAL, DIMENSION(KPROMA,0:7), INTENT(INOUT) :: PEXTPK !To take into acount external tendencies inside the splitting REAL, DIMENSION(KPROMA, IBUNUM-IBUNUM_EXTRA),INTENT(OUT) :: PBU_SUM REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRREVAV +REAL, DIMENSION(MERGE(KPROMA,0,OELEC)), INTENT(IN) :: PLATHAM_IAGGS ! E Function to simulate + ! enhancement of IAGGS ! ! !* 0.2 Declarations of local variables : @@ -156,7 +161,7 @@ IF (LHOOK) CALL DR_HOOK('ICE4_STEPPING', 0, ZHOOK_HANDLE) ! ZINV_TSTEP=1./PTSTEP ! -IF(BUCONF%LBU_ENABLE) THEN +IF(BUCONF%LBU_ENABLE .OR. OSAVE_MICRO) THEN DO JV=1, IBUNUM-IBUNUM_EXTRA PBU_SUM(:, JV)=0. ENDDO @@ -255,10 +260,12 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, & &KPROMA, KMICRO, & &KRR, LSOFT, LLCOMPUTE, & + &OSAVE_MICRO, OELEC, & &PEXN, PRHODREF, ZLVFACT, ZLSFACT, K1, K2, & &PPRES, PCF, PSIGMA_RC, & &PCIT, & &ZZT, PVART, & + &PLATHAM_IAGGS, & &ZBU_INST, & &ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, & &ZA, ZB, & @@ -397,7 +404,7 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies ! !*** 4.8 Mixing ratio change due to each process ! - IF(BUCONF%LBU_ENABLE) THEN + IF(BUCONF%LBU_ENABLE .OR. OSAVE_MICRO) THEN !Mixing ratio change due to a tendency DO JV=1, IBUNUM-IBUNUM_MR-IBUNUM_EXTRA DO JL=1, KMICRO diff --git a/src/PHYEX/micro/mode_ice4_tendencies.f90 b/src/PHYEX/micro/mode_ice4_tendencies.f90 index 0883b6c8fa9fc2e7bceb0216b00f48c84382b1f5..611c82c1548a01a526448410c7f2d8b775bbaf86 100644 --- a/src/PHYEX/micro/mode_ice4_tendencies.f90 +++ b/src/PHYEX/micro/mode_ice4_tendencies.f90 @@ -8,10 +8,12 @@ IMPLICIT NONE CONTAINS SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, & &KRR, ODSOFT, LDCOMPUTE, & + &OSAVE_MICRO, OELEC, & &PEXN, PRHODREF, PLVFACT, PLSFACT, K1, K2, & &PPRES, PCF, PSIGMA_RC, & &PCIT, & &PT, PVART, & + &PLATHAM_IAGGS, & &PBU_INST, & &PRS_TEND, PRG_TEND, PRH_TEND, PSSI, & &PA, PB, & @@ -32,6 +34,7 @@ SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, & !! ! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) !! R. El Khatib 24-Aug-2021 Optimizations +!! C. Barthe 06/2023: Add retroaction of electric field on IAGGS ! ! !* 0. DECLARATIONS @@ -74,6 +77,8 @@ INTEGER, INTENT(IN) :: KPROMA, KSIZE INTEGER, INTENT(IN) :: KRR LOGICAL, INTENT(IN) :: ODSOFT LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDCOMPUTE +LOGICAL, INTENT(IN) :: OSAVE_MICRO +LOGICAL, INTENT(IN) :: OELEC REAL, DIMENSION(KPROMA), INTENT(IN) :: PEXN REAL, DIMENSION(KPROMA), INTENT(IN) :: PRHODREF REAL, DIMENSION(KPROMA), INTENT(IN) :: PLVFACT @@ -86,6 +91,7 @@ REAL, DIMENSION(KPROMA), INTENT(IN) :: PSIGMA_RC REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PCIT REAL, DIMENSION(KPROMA), INTENT(IN) :: PT REAL, DIMENSION(KPROMA,0:KRR), INTENT(IN) :: PVART +REAL, DIMENSION(MERGE(KPROMA,0,OELEC)), INTENT(IN) :: PLATHAM_IAGGS REAL, DIMENSION(KPROMA, IBUNUM),INTENT(INOUT):: PBU_INST REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRS_TEND REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRG_TEND @@ -330,11 +336,12 @@ DO JL=1, KSIZE ENDDO ! ! -CALL ICE4_SLOW(CST, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, PRHODREF, ZT, & +CALL ICE4_SLOW(CST, ICEP, ICED, KPROMA, KSIZE, ODSOFT, OELEC, LDCOMPUTE, PRHODREF, ZT, & &PSSI, PLVFACT, PLSFACT, & &ZVART(:,IRV), ZVART(:,IRC), ZVART(:,IRI), ZVART(:,IRS), ZVART(:,IRG), & &ZLBDAS, ZLBDAG, & &ZAI, ZCJ, PHLI_HCF, PHLI_HRI, & + &PLATHAM_IAGGS, & &PBU_INST(:, IRCHONI), PBU_INST(:, IRVDEPS), PBU_INST(:, IRIAGGS), PBU_INST(:, IRIAUTS), PBU_INST(:, IRVDEPG)) ! !------------------------------------------------------------------------------- @@ -417,7 +424,7 @@ IF (KRR==7) THEN &PBU_INST(:, IRCDRYH), PBU_INST(:, IRIDRYH), PBU_INST(:, IRSDRYH), PBU_INST(:, IRRDRYH), & &PBU_INST(:, IRGDRYH), PBU_INST(:, IRDRYHG), PBU_INST(:, IRHMLTR), & &PRH_TEND) -ELSEIF (BUCONF%LBU_ENABLE) THEN +ELSEIF (BUCONF%LBU_ENABLE .OR. OSAVE_MICRO) THEN PBU_INST(:, IRCWETH)=0. PBU_INST(:, IRIWETH)=0. PBU_INST(:, IRSWETH)=0. diff --git a/src/PHYEX/micro/mode_lima_ccn_activation.f90 b/src/PHYEX/micro/mode_lima_ccn_activation.f90 index 38732eee869583c4958e6624ee743a1e322a847f..b7886c3bb8d572d3a1ce708194ae1fe719926b4f 100644 --- a/src/PHYEX/micro/mode_lima_ccn_activation.f90 +++ b/src/PHYEX/micro/mode_lima_ccn_activation.f90 @@ -10,7 +10,7 @@ CONTAINS SUBROUTINE LIMA_CCN_ACTIVATION (CST, & PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT, & - PCLDFR ) + PCLDFR, PTOT_RV_HENU ) ! ############################################################################## ! !! @@ -59,6 +59,7 @@ CONTAINS ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! C. Barthe 06/2022: save mixing ratio change for cloud electrification ! !------------------------------------------------------------------------------- ! @@ -107,6 +108,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT ! CCN C. activated at t ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Precipitation fraction ! +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PTOT_RV_HENU ! Mixing ratio change due to HENU +! !* 0.1 Declarations of local variables : ! ! Packing variables @@ -421,8 +424,10 @@ IF( INUCT >= 1 ) THEN ZZW1(:) = MIN(XCSTDCRIT*ZZW6(:)/(((ZZT(:)*ZSMAX(:))**3)*ZRHODREF(:)),1.E-5) END WHERE ! + PTOT_RV_HENU(:,:,:) = 0. IF (.NOT.LSUBG_COND) THEN ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVT(:,:,:) ) + PTOT_RV_HENU(:,:,:) = ZW(:,:,:) PTHT(:,:,:) = PTHT(:,:,:) + ZW(:,:,:) * (CST%XLVTT+(CST%XCPV-CST%XCL)*(PT(:,:,:)-CST%XTT))/ & (PEXNREF(:,:,:)*(CST%XCPD+CST%XCPV*PRVT(:,:,:)+CST%XCL*(PRCT(:,:,:)+PRRT(:,:,:)))) PRVT(:,:,:) = PRVT(:,:,:) - ZW(:,:,:) @@ -433,6 +438,8 @@ IF( INUCT >= 1 ) THEN PCCT(:,:,:) = PCCT(:,:,:) + ZCLDFR(:,:,:) * UNPACK( ZZW6(:),MASK=GNUCT(:,:,:),FIELD=0. ) END IF ! +!++cb-- A quoi servent ces 2 dernieres lignes ? variables locales, non sauvees, et ne servent pas +! a calculer quoi que ce soit (fin de la routine) ZW(:,:,:) = UNPACK( 100.0*ZSMAX(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) ZW2(:,:,:) = ZCLDFR(:,:,:) * UNPACK( ZZW6(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) ! diff --git a/src/PHYEX/micro/mode_lima_ccn_hom_freezing.f90 b/src/PHYEX/micro/mode_lima_ccn_hom_freezing.f90 index 38f760fc59473f3cad1d4d5ef76083cf52a7bd16..f3b9dc125e3d7a7282392b769be65ea4950f0c7d 100644 --- a/src/PHYEX/micro/mode_lima_ccn_hom_freezing.f90 +++ b/src/PHYEX/micro/mode_lima_ccn_hom_freezing.f90 @@ -10,7 +10,7 @@ CONTAINS SUBROUTINE LIMA_CCN_HOM_FREEZING (CST, PRHODREF, PEXNREF, PPABST, PW_NU, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PCCT, PCRT, PCIT, PNFT, PNHT , & - PICEFR ) + PICEFR, PTOT_RV_HONH ) ! ########################################################################## ! !! PURPOSE @@ -29,6 +29,7 @@ CONTAINS !! ------------- !! Original 15/03/2018 ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! C. Barthe 07/06/2022: save mixing ratio change for cloud electrification ! !------------------------------------------------------------------------------- ! @@ -74,6 +75,8 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHT ! haze homogeneous freezing ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Ice fraction ! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTOT_RV_HONH ! Mixing ratio change due to HONH +! !* 0.2 Declarations of local variables : ! REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t @@ -299,6 +302,8 @@ IF (INEGT.GT.0) THEN END WHERE PNFT(:,:,:,JMOD_CCN) = PNFT(:,:,:,JMOD_CCN) - UNPACK( ZCCNFROZEN(:), MASK=GNEGT(:,:,:),FIELD=0.) END DO +! + PTOT_RV_HONH(:,:,:) = UNPACK( ZZW(:), MASK=GNEGT(:,:,:),FIELD=0.) ! PTHT(:,:,:) = PTHT(:,:,:) + UNPACK( ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)), MASK=GNEGT(:,:,:),FIELD=0.) PRVT(:,:,:) = PRVT(:,:,:) - UNPACK( ZZW(:), MASK=GNEGT(:,:,:),FIELD=0.) diff --git a/src/PHYEX/micro/mode_lima_droplets_riming_snow.f90 b/src/PHYEX/micro/mode_lima_droplets_riming_snow.f90 index 9974166a1111a0ed9f0815781a6333b6eac5661e..56b57d5d8c7ecdecdbdd168e9da5ad189697de28 100644 --- a/src/PHYEX/micro/mode_lima_droplets_riming_snow.f90 +++ b/src/PHYEX/micro/mode_lima_droplets_riming_snow.f90 @@ -6,13 +6,16 @@ MODULE MODE_LIMA_DROPLETS_RIMING_SNOW IMPLICIT NONE CONTAINS -! ######################################################################################### - SUBROUTINE LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & - PRHODREF, PT, & - PRCT, PCCT, PRST, PCST, PLBDC, PLBDS, PLVFACT, PLSFACT, & - P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & - P_RI_HMS, P_CI_HMS, P_RS_HMS ) -! ######################################################################################### +! ########################################################################################### + SUBROUTINE LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRCT, PCCT, PRST, PCST, PLBDC, PLBDS, PLVFACT, PLSFACT, & +!++cb++ +! P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & + P_TH_RIM, P_CC_RIM, P_CS_RIM, & + P_RC_RIMSS, P_RC_RIMSG, P_RS_RIMCG, & + P_RI_HMS, P_CI_HMS, P_RS_HMS ) +! ########################################################################################### ! !! PURPOSE !! ------- @@ -31,6 +34,8 @@ CONTAINS !! Original 15/03/2018 ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! J. Wurtz 03/2022: new snow characteristics +! C. Barthe 06/2022: modify the microphysics terms to save to simplify the merging with the electrification scheme +! (same terms as in ICE3) ! !------------------------------------------------------------------------------- ! @@ -63,11 +68,16 @@ REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! ! -REAL, DIMENSION(:), INTENT(OUT) :: P_RC_RIM +!++cb++ +!REAL, DIMENSION(:), INTENT(OUT) :: P_RC_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_CC_RIM -REAL, DIMENSION(:), INTENT(OUT) :: P_RS_RIM +!REAL, DIMENSION(:), INTENT(OUT) :: P_RS_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_CS_RIM -REAL, DIMENSION(:), INTENT(OUT) :: P_RG_RIM +!REAL, DIMENSION(:), INTENT(OUT) :: P_RG_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_RC_RIMSS +REAL, DIMENSION(:), INTENT(OUT) :: P_RC_RIMSG +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_RIMCG +!--cb-- ! REAL, DIMENSION(:), INTENT(OUT) :: P_TH_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_RI_HMS @@ -77,6 +87,7 @@ REAL, DIMENSION(:), INTENT(OUT) :: P_RS_HMS !* 0.2 Declarations of local variables : ! REAL, DIMENSION(SIZE(PRCT)) :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5 +REAL, DIMENSION(SIZE(PRCT)) :: Z_RC_RIM, Z_RS_RIM, Z_RG_RIM !++cb-- ! INTEGER, DIMENSION(SIZE(PRCT)) :: IVEC2 ! Vector of indices REAL, DIMENSION(SIZE(PRCT)) :: ZVEC1,ZVEC2,ZVEC1W ! Work vectors @@ -85,112 +96,127 @@ INTEGER :: JI !------------------------------------------------------------------------------- ! ! -! DO JI = 1, SIZE(PRCT) ! !* Cloud droplet riming of the aggregates ! -------------------------------------- ! - IF ( PRCT(JI)>XRTMIN(2) .AND. PRST(JI)>XRTMIN(5) .AND. PT(JI)<XTT .AND. & - PCCT(JI)>XCTMIN(2) .AND. PCST(JI)>XCTMIN(5) .AND. LDCOMPUTE(JI) ) THEN + IF ( PRCT(JI)>XRTMIN(2) .AND. PRST(JI)>XRTMIN(5) .AND. PT(JI)<XTT .AND. & + PCCT(JI)>XCTMIN(2) .AND. PCST(JI)>XCTMIN(5) .AND. LDCOMPUTE(JI) ) THEN ! - ZVEC1(JI) = PLBDS(JI) - ZVEC1W(JI)= ( XFVELOS**XALPHAS + PLBDS(JI)**XALPHAS ) ** (1./XALPHAS) ! modified equivalent lambda + ZVEC1(JI) = PLBDS(JI) + ZVEC1W(JI)= ( XFVELOS**XALPHAS + PLBDS(JI)**XALPHAS ) ** (1./XALPHAS) ! modified equivalent lambda ! ! 2. perform the linear interpolation of the normalized ! "2+XDS"-moment of the incomplete gamma function using the modified equivalent lambda ! - ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & - XRIMINTP1 * LOG( ZVEC1W(JI) ) + XRIMINTP2 ) ) - IVEC2(JI) = INT( ZVEC2(JI) ) - ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) + ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XRIMINTP1 * LOG( ZVEC1W(JI) ) + XRIMINTP2 ) ) + IVEC2(JI) = INT( ZVEC2(JI) ) + ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) ! - ZZW1(JI) = XGAMINC_RIM1( IVEC2(JI)+1 )* ZVEC2(JI) & - - XGAMINC_RIM1( IVEC2(JI) )*(ZVEC2(JI) - 1.0) + ZZW1(JI) = XGAMINC_RIM1( IVEC2(JI)+1 )* ZVEC2(JI) & + - XGAMINC_RIM1( IVEC2(JI) )*(ZVEC2(JI) - 1.0) ! ! 3. perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function ! - ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & - XRIMINTP1 * LOG( ZVEC1(JI) ) + XRIMINTP2 ) ) - IVEC2(JI) = INT( ZVEC2(JI) ) - ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) + ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XRIMINTP1 * LOG( ZVEC1(JI) ) + XRIMINTP2 ) ) + IVEC2(JI) = INT( ZVEC2(JI) ) + ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) ! - ZZW2(JI) = XGAMINC_RIM2( IVEC2(JI)+1 )* ZVEC2(JI) & - - XGAMINC_RIM2( IVEC2(JI) )*(ZVEC2(JI) - 1.0) + ZZW2(JI) = XGAMINC_RIM2( IVEC2(JI)+1 )* ZVEC2(JI) & + - XGAMINC_RIM2( IVEC2(JI) )*(ZVEC2(JI) - 1.0) ! ! 4. riming ! +!++cb++ ! Cloud droplets collected - P_RC_RIM(JI) = - XCRIMSS * PRCT(JI) * PCST(JI)*(1+(XFVELOS/PLBDS(JI))**XALPHAS)**(-XNUS+XEXCRIMSS/XALPHAS) & +! P_RC_RIM(JI) = - XCRIMSS * PRCT(JI) * PCST(JI)*(1+(XFVELOS/PLBDS(JI))**XALPHAS)**(-XNUS+XEXCRIMSS/XALPHAS) & +! * PRHODREF(JI)**(-XCEXVT+1) * PLBDS(JI)**XEXCRIMSS +! P_CC_RIM(JI) = P_RC_RIM(JI) * PCCT(JI)/PRCT(JI) ! Lambda_c**3 +! total mass loss of cloud droplets, < 0 + Z_RC_RIM(JI) = - XCRIMSS * PRCT(JI) * PCST(JI)*(1+(XFVELOS/PLBDS(JI))**XALPHAS)**(-XNUS+XEXCRIMSS/XALPHAS) & * PRHODREF(JI)**(-XCEXVT+1) * PLBDS(JI)**XEXCRIMSS - P_CC_RIM(JI) = P_RC_RIM(JI) * PCCT(JI)/PRCT(JI) ! Lambda_c**3 - ! - ! Cloud droplets collected on small aggregates add to snow - P_RS_RIM(JI) = - P_RC_RIM(JI) * ZZW1(JI) - ! - ! Cloud droplets collected on large aggregates add to graupel - P_RG_RIM(JI) = - P_RC_RIM(JI) - P_RS_RIM(JI) - ! - IF (LMURAKAMI) THEN - ! Graupel formation based on Murakami - ZVEC1(JI) = XGAMINC_RIM4( IVEC2(JI)+1 )* ZVEC2(JI) & - - XGAMINC_RIM4( IVEC2(JI) )*(ZVEC2(JI) - 1.0) - ZZW5(JI) = ZVEC1(JI) - ZZW3(JI) = XSRIMCG * PRHODREF(JI) * PCST(JI) * PLBDS(JI)**XEXSRIMCG * (1.0 - ZZW2(JI))!/(PTSTEP*PRHODREF(JI)) - ZZW3(JI) = P_RG_RIM(JI)*ZZW3(JI)/ & - MAX(1.E-10, & !-20 - XSRIMCG3*XSRIMCG2*PCST(JI)*PRHODREF(JI)*PLBDS(JI)**(XEXSRIMCG2)*(1.-ZZW5(JI))- & - XSRIMCG3*ZZW3(JI)) - ELSE - ! Large aggregates collecting droplets add to graupel (instant process ???) - ZZW3(JI) = PRST(JI)*(1.0 - ZZW2(JI))/PTSTEP - END IF - P_RS_RIM(JI) = P_RS_RIM(JI) - ZZW3(JI) - P_CS_RIM(JI) = -ZZW3(JI) * PCST(JI)/PRST(JI) - P_RG_RIM(JI) = P_RG_RIM(JI) + ZZW3(JI) - ! - P_TH_RIM(JI) = - P_RC_RIM(JI)*(PLSFACT(JI)-PLVFACT(JI)) - ELSE - P_TH_RIM(JI) = 0. - P_RC_RIM(JI) = 0. - P_CC_RIM(JI) = 0. - P_RS_RIM(JI) = 0. - P_CS_RIM(JI) = 0. - P_RG_RIM(JI) = 0. - END IF + P_CC_RIM(JI) = Z_RC_RIM(JI) * (PCCT(JI) / PRCT(JI)) ! Lambda_c**3 + ! + ! Cloud droplets collected on small aggregates add to snow +! P_RS_RIM(JI) = - P_RC_RIM(JI) * ZZW1(JI) + Z_RS_RIM(JI) = -Z_RC_RIM(JI) * ZZW1(JI) + P_RC_RIMSS(JI) = Z_RC_RIM(JI) * ZZW1(JI) ! < 0, loss of mass for rc + ! + ! Cloud droplets collected on large aggregates add to graupel +! P_RG_RIM(JI) = - P_RC_RIM(JI) - P_RS_RIM(JI) + Z_RG_RIM(JI) = -Z_RC_RIM(JI) - Z_RS_RIM(JI) + P_RC_RIMSG(JI) = Z_RC_RIM(JI) - P_RC_RIMSS(JI) ! < 0, loss of mass for rc + ! + IF (LMURAKAMI) THEN + ! Graupel formation based on Murakami + ZVEC1(JI) = XGAMINC_RIM4( IVEC2(JI)+1 )* ZVEC2(JI) & + - XGAMINC_RIM4( IVEC2(JI) )*(ZVEC2(JI) - 1.0) + ZZW5(JI) = ZVEC1(JI) + ZZW3(JI) = XSRIMCG * PRHODREF(JI) * PCST(JI) * PLBDS(JI)**XEXSRIMCG * (1.0 - ZZW2(JI))!/(PTSTEP*PRHODREF(JI)) + ZZW3(JI) = Z_RG_RIM(JI)*ZZW3(JI)/ & + MAX(1.E-10, & !-20 + XSRIMCG3*XSRIMCG2*PCST(JI)*PRHODREF(JI)*PLBDS(JI)**(XEXSRIMCG2)*(1.-ZZW5(JI))- & + XSRIMCG3*ZZW3(JI)) + ELSE + ! Large aggregates collecting droplets add to graupel (instant process ???) + ZZW3(JI) = PRST(JI)*(1.0 - ZZW2(JI))/PTSTEP + END IF + ! + P_RS_RIMCG(JI) = ZZW3(JI) + P_CS_RIM(JI) = -ZZW3(JI) * PCST(JI)/PRST(JI) +! P_RS_RIM(JI) = P_RS_RIM(JI) - ZZW3(JI) +! P_RG_RIM(JI) = P_RG_RIM(JI) + ZZW3(JI) + ! +! P_TH_RIM(JI) = - P_RC_RIM(JI)*(PLSFACT(JI)-PLVFACT(JI)) + P_TH_RIM(JI) = - Z_RC_RIM(JI)*(PLSFACT(JI)-PLVFACT(JI)) +!--cb-- + ELSE + P_TH_RIM(JI) = 0. + P_RC_RIMSS(JI) = 0. + P_RC_RIMSG(JI) = 0. + P_RS_RIMCG(JI) = 0. + Z_RC_RIM(JI) = 0. + P_CC_RIM(JI) = 0. + Z_RS_RIM(JI) = 0. + P_CS_RIM(JI) = 0. + Z_RG_RIM(JI) = 0. + END IF ! !* Hallett-Mossop ice production (HMS) ! ----------------------------------- ! - IF ( PRST(JI)>XRTMIN(5) .AND. PRCT(JI)>XRTMIN(2) .AND. PT(JI)<XHMTMAX .AND. PT(JI)>XHMTMIN .AND. & - PCST(JI)>XCTMIN(5) .AND. PCCT(JI)>XCTMIN(2) .AND. LDCOMPUTE(JI) ) THEN -! - ZVEC1(JI) = PLBDC(JI) - ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & - XHMLINTP1 * LOG( ZVEC1(JI) ) + XHMLINTP2 ) ) - IVEC2(JI) = INT( ZVEC2(JI) ) - ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) - ZVEC1(JI) = XGAMINC_HMC( IVEC2(JI)+1 )* ZVEC2(JI) & - - XGAMINC_HMC( IVEC2(JI) )*(ZVEC2(JI) - 1.0) - ZZW4(JI) = ZVEC1(JI) ! Large droplets -! - IF ( ZZW4(JI)<0.99 ) THEN - P_CI_HMS(JI) = - P_RC_RIM(JI) * (PCCT(JI)/PRCT(JI)) * (1.0-ZZW4(JI)) * XHM_FACTS * & - MAX( 0.0, MIN( (PT(JI)-XHMTMIN)/3.0,(XHMTMAX-PT(JI))/2.0 ) ) ! CCHMSI -! - P_RI_HMS(JI) = P_CI_HMS(JI) * XMNU0 ! RCHMSI - P_RS_HMS(JI) = - P_RI_HMS(JI) - ELSE - P_RI_HMS(JI) = 0. - P_CI_HMS(JI) = 0. - P_RS_HMS(JI) = 0. - END IF - ELSE + IF ( PRST(JI)>XRTMIN(5) .AND. PRCT(JI)>XRTMIN(2) .AND. PT(JI)<XHMTMAX .AND. PT(JI)>XHMTMIN .AND. & + PCST(JI)>XCTMIN(5) .AND. PCCT(JI)>XCTMIN(2) .AND. LDCOMPUTE(JI) ) THEN +! + ZVEC1(JI) = PLBDC(JI) + ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XHMLINTP1 * LOG( ZVEC1(JI) ) + XHMLINTP2 ) ) + IVEC2(JI) = INT( ZVEC2(JI) ) + ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) + ZVEC1(JI) = XGAMINC_HMC( IVEC2(JI)+1 )* ZVEC2(JI) & + - XGAMINC_HMC( IVEC2(JI) )*(ZVEC2(JI) - 1.0) + ZZW4(JI) = ZVEC1(JI) ! Large droplets +! + IF ( ZZW4(JI)<0.99 ) THEN + P_CI_HMS(JI) = - Z_RC_RIM(JI) * (PCCT(JI)/PRCT(JI)) * (1.0-ZZW4(JI)) * XHM_FACTS * & + MAX( 0.0, MIN( (PT(JI)-XHMTMIN)/3.0,(XHMTMAX-PT(JI))/2.0 ) ) ! CCHMSI +! + P_RI_HMS(JI) = P_CI_HMS(JI) * XMNU0 ! RCHMSI + P_RS_HMS(JI) = - P_RI_HMS(JI) + ELSE P_RI_HMS(JI) = 0. P_CI_HMS(JI) = 0. P_RS_HMS(JI) = 0. - END IF + END IF + ELSE + P_RI_HMS(JI) = 0. + P_CI_HMS(JI) = 0. + P_RS_HMS(JI) = 0. + END IF END DO ! !------------------------------------------------------------------------------- diff --git a/src/PHYEX/micro/mode_lima_ice_aggregation_snow.f90 b/src/PHYEX/micro/mode_lima_ice_aggregation_snow.f90 index c442ab8b02965cbbf95a0a20709632085783b02b..6097a688e663a38d0d722fd828ef85e9972a4d3f 100644 --- a/src/PHYEX/micro/mode_lima_ice_aggregation_snow.f90 +++ b/src/PHYEX/micro/mode_lima_ice_aggregation_snow.f90 @@ -10,6 +10,7 @@ CONTAINS SUBROUTINE LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & PT, PRHODREF, & PRIT, PRST, PCIT, PCST, PLBDI, PLBDS, & + PLATHAM_IAGGS, & P_RI_AGGS, P_CI_AGGS ) ! ####################################################################### ! @@ -30,6 +31,7 @@ CONTAINS ! J. Wurtz 03/2022: new snow characteristics ! B. Vie 03/2022: Add option for 1-moment pristine ice ! M. Taufour 07/2022: add concentration for snow, graupel, hail +! C. Barthe 06/2023: add Latham effect (Efield) for IAGGS ! !------------------------------------------------------------------------------- ! @@ -56,6 +58,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PCIT REAL, DIMENSION(:), INTENT(IN) :: PCST REAL, DIMENSION(:), INTENT(IN) :: PLBDI REAL, DIMENSION(:), INTENT(IN) :: PLBDS +REAL, DIMENSION(:), INTENT(IN) :: PLATHAM_IAGGS ! REAL, DIMENSION(:), INTENT(OUT) :: P_RI_AGGS REAL, DIMENSION(:), INTENT(OUT) :: P_CI_AGGS @@ -81,6 +84,7 @@ P_CI_AGGS(:) = 0. IF (NMOM_I.EQ.1) THEN WHERE ( PRIT(:)>XRTMIN(4) .AND. PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) ) ZZW1(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) & + * PLATHAM_IAGGS(:) & * PRIT(:) & * PCST(:) * (1+(XFVELOS/PLBDS(:))**XALPHAS)**(-XNUS+XEXIAGGS/XALPHAS) & * PRHODREF(:)**(-XCEXVT+1.) & diff --git a/src/PHYEX/micro/mode_lima_nucleation_procs.f90 b/src/PHYEX/micro/mode_lima_nucleation_procs.f90 index 58f9212cc92f27eeca5fb93952f8a5e476357ba9..7a70adf55443ad065d97e46b04548f0416f840d4 100644 --- a/src/PHYEX/micro/mode_lima_nucleation_procs.f90 +++ b/src/PHYEX/micro/mode_lima_nucleation_procs.f90 @@ -6,15 +6,17 @@ MODULE MODE_LIMA_NUCLEATION_PROCS IMPLICIT NONE CONTAINS -! ############################################################################# +! ############################################################################### SUBROUTINE LIMA_NUCLEATION_PROCS (D, CST, BUCONF, TBUDGETS, KBUDGETS, & PTSTEP, PRHODJ, & PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & PCCT, PCRT, PCIT, & PNFT, PNAT, PIFT, PINT, PNIT, PNHT, & - PCLDFR, PICEFR, PPRCFR ) -! ############################################################################# + PCLDFR, PICEFR, PPRCFR, & + PTOT_RV_HENU, PTOT_RC_HINC, PTOT_RI_HIND, & + PTOT_RV_HONH ) +! ############################################################################### ! !! PURPOSE !! ------- @@ -33,6 +35,7 @@ CONTAINS ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets ! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation ! B. Vie 03/2022: Add option for 1-moment pristine ice +! C. Barthe 06/2022: add dummy arguments (mass transfer rates) for cloud electrication !------------------------------------------------------------------------------- ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t @@ -100,10 +103,16 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Ice fraction REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPRCFR ! Precipitation fraction ! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTOT_RV_HENU ! Mixing ratio change due to HENU +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTOT_RC_HINC ! Mixing ratio change due to HINC +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTOT_RI_HIND ! Mixing ratio change due to HIND +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTOT_RV_HONH ! Mixing ratio change due to HONH +! !------------------------------------------------------------------------------- ! -REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, Z_TH_HINC, Z_RC_HINC, Z_CC_HINC -REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZLSFACT, ZRVHENIMR +!REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, Z_TH_HINC, Z_RC_HINC, Z_CC_HINC +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: Z_TH_HIND, Z_CI_HIND, Z_TH_HINC, Z_CC_HINC +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZLSFACT, ZRVHENIMR ! integer :: idx, jl INTEGER :: JI,JJ @@ -132,9 +141,11 @@ IF ( LACTI .AND. NMOD_CCN >=1 .AND. NMOM_C.GE.2) THEN end if end if - CALL LIMA_CCN_ACTIVATION( CST, & + CALL LIMA_CCN_ACTIVATION( CST, & PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & - PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT, PCLDFR ) + PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT, PCLDFR, & + PTOT_RV_HENU ) + if ( BUCONF%lbu_enable ) then if ( BUCONF%lbudget_th ) & call BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'HENU', ptht(:, :, :) * prhodj(:, :, :) / ptstep ) @@ -186,18 +197,18 @@ IF ( LNUCL .AND. NMOM_I>=2 .AND. .NOT.LMEYERS .AND. NMOD_IFN >= 1 ) THEN PRHODREF, PEXNREF, PPABST, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PCCT, PCIT, PNAT, PIFT, PINT, PNIT, & - Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, & - Z_TH_HINC, Z_RC_HINC, Z_CC_HINC, & + Z_TH_HIND, PTOT_RI_HIND, Z_CI_HIND, & + Z_TH_HINC, PTOT_RC_HINC, Z_CC_HINC, & PICEFR ) WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. ! if ( BUCONF%lbu_enable ) then if ( BUCONF%lbudget_th ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HIND', z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HIND', z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_rv ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HIND', -ptot_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_ri ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HIND', z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HIND', ptot_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_sv ) then call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1-1+nsv_lima_ni), 'HIND', z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep ) do jl = 1, nmod_ifn @@ -209,11 +220,11 @@ IF ( LNUCL .AND. NMOM_I>=2 .AND. .NOT.LMEYERS .AND. NMOD_IFN >= 1 ) THEN end if if ( BUCONF%lbudget_th ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HINC', z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HINC', z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_rc ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'HINC', z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'HINC', ptot_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_ri ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HINC', -z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HINC', -ptot_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_sv ) then if (nmom_c.ge.2) then call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1-1+nsv_lima_nc), 'HINC', z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) @@ -238,18 +249,18 @@ IF (LNUCL .AND. NMOM_I>=2 .AND. LMEYERS) THEN PRHODREF, PEXNREF, PPABST, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PCCT, PCIT, PINT, & - Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, & - Z_TH_HINC, Z_RC_HINC, Z_CC_HINC, & + Z_TH_HIND, PTOT_RI_HIND, Z_CI_HIND, & + Z_TH_HINC, PTOT_RC_HINC, Z_CC_HINC, & PICEFR ) WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. ! if ( BUCONF%lbu_enable ) then if ( BUCONF%lbudget_th ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HIND', z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HIND', z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_rv ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HIND', -ptot_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_ri ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HIND', z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HIND', ptot_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_sv ) then call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1-1+nsv_lima_ni), 'HIND', z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep ) if (nmod_ifn > 0 ) & @@ -258,11 +269,11 @@ IF (LNUCL .AND. NMOM_I>=2 .AND. LMEYERS) THEN end if if ( BUCONF%lbudget_th ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HINC', z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HINC', z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_rc ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'HINC', z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'HINC', ptot_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_ri ) & - call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HINC', -z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HINC', -ptot_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) if ( BUCONF%lbudget_sv ) then if (nmom_c.ge.2) then call BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1-1+nsv_lima_nc), 'HINC', z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) @@ -277,6 +288,8 @@ END IF ! !------------------------------------------------------------------------------- ! +!++cb-- pour l'instant, on ne recupere pas cette tendance +! actuellement, les echanges vapeur-->glace/eau lies a la nucleation ne sont pas traites dans l'electrisation IF (LNUCL .AND. NMOM_I.EQ.1) THEN WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. ! @@ -357,7 +370,7 @@ IF ( LNUCL .AND. LHHONI .AND. NMOD_CCN >= 1 .AND. NMOM_I.GE.2) THEN CALL LIMA_CCN_HOM_FREEZING (CST, PRHODREF, PEXNREF, PPABST, PW_NU, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PCCT, PCRT, PCIT, PNFT, PNHT, & - PICEFR ) + PICEFR, PTOT_RV_HONH ) WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. ! if ( BUCONF%lbu_enable ) then diff --git a/src/PHYEX/micro/mode_lima_rain_accr_snow.f90 b/src/PHYEX/micro/mode_lima_rain_accr_snow.f90 index 6c83bf6cd49554c08f21caed8d9d6258be9d5fd5..e7ee26f7e5bccf8d571eae3b7639011b2fe16042 100644 --- a/src/PHYEX/micro/mode_lima_rain_accr_snow.f90 +++ b/src/PHYEX/micro/mode_lima_rain_accr_snow.f90 @@ -6,12 +6,16 @@ MODULE MODE_LIMA_RAIN_ACCR_SNOW IMPLICIT NONE CONTAINS -! ################################################################################### - SUBROUTINE LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & - PRHODREF, PT, & - PRRT, PCRT, PRST, PCST, PLBDR, PLBDS, PLVFACT, PLSFACT, & - P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC ) -! ################################################################################### +! ###################################################################################### + SUBROUTINE LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRRT, PCRT, PRST, PCST, PLBDR, PLBDS, PLVFACT, PLSFACT, & +!++cb++ +! P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC ) + P_TH_ACC, P_CR_ACC, P_CS_ACC, & + P_RR_ACCSS, P_RR_ACCSG, P_RS_ACCRG ) +!--cb-- +! ###################################################################################### ! !! PURPOSE !! ------- @@ -30,6 +34,9 @@ CONTAINS !! Original 15/03/2018 ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! J. Wurtz 03/2022: new snow characteristics +! C. Barthe 04/07/2022: modify the microphysics terms to save to simplify the merging +! with the electrification scheme +! QUESTION : ne fonctionne pas si NMOM_R=1 ??? ! !------------------------------------------------------------------------------- ! @@ -68,12 +75,17 @@ REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! ! +!++cb++ REAL, DIMENSION(:), INTENT(OUT) :: P_TH_ACC -REAL, DIMENSION(:), INTENT(OUT) :: P_RR_ACC +!REAL, DIMENSION(:), INTENT(OUT) :: P_RR_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_CR_ACC -REAL, DIMENSION(:), INTENT(OUT) :: P_RS_ACC +!REAL, DIMENSION(:), INTENT(OUT) :: P_RS_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_CS_ACC -REAL, DIMENSION(:), INTENT(OUT) :: P_RG_ACC +!REAL, DIMENSION(:), INTENT(OUT) :: P_RG_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_RR_ACCSS +REAL, DIMENSION(:), INTENT(OUT) :: P_RR_ACCSG +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_ACCRG +!--cb-- ! !* 0.2 Declarations of local variables : ! @@ -85,15 +97,22 @@ REAL, DIMENSION(SIZE(PRRT)) :: ZZWC1, ZZWC2, ZZWC3, ZZWC4, ZZWC5 ! INTEGER, DIMENSION(SIZE(PRRT)) :: IVEC1,IVEC2 ! Vectors of indices REAL, DIMENSION(SIZE(PRRT)) :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors +REAL, DIMENSION(SIZE(PRRT)) :: Z_RR_ACC ! ++cb-- for elec ! !------------------------------------------------------------------------------- ! -! +!++cb++ P_TH_ACC(:) = 0. -P_RR_ACC(:) = 0. +!P_RR_ACC(:) = 0. P_CR_ACC(:) = 0. -P_RS_ACC(:) = 0. -P_RG_ACC(:) = 0. +P_CS_ACC(:) = 0. +!P_RS_ACC(:) = 0. +!P_RG_ACC(:) = 0. +P_RR_ACCSS(:) = 0. +P_RR_ACCSG(:) = 0. +P_RS_ACCRG(:) = 0. +Z_RR_ACC(:) = 0. +!--cb-- ! ZZW1(:) = 0. ZZW2(:) = 0. @@ -268,12 +287,19 @@ WHERE( GACC ) XLBNSACCR2/( PLBDR(:) * PLBDS(:) ) + & XLBNSACCR3/( PLBDS(:)**2 ) ) ! - P_RR_ACC(:) = - ZZW4(:) * ZZW2(:) +!++cb++ + Z_RR_ACC(:) = - ZZW4(:) * ZZW2(:) ! < 0 +! P_RR_ACC(:) = - ZZW4(:) * ZZW2(:) P_CR_ACC(:) = - ZZWC4(:) * ZZWC2(:) - P_RS_ACC(:) = ZZW4(:) * ZZW1(:) - ZZW5(:) +! P_RS_ACC(:) = ZZW4(:) * ZZW1(:) - ZZW5(:) P_CS_ACC(:) = - ZZWC5(:) - P_RG_ACC(:) = ZZW4(:) * ( ZZW2(:) - ZZW1(:) ) + ZZW5(:) - P_TH_ACC(:) = - P_RR_ACC(:) * (PLSFACT(:)-PLVFACT(:)) +! P_RG_ACC(:) = ZZW4(:) * ( ZZW2(:) - ZZW1(:) ) + ZZW5(:) + P_RR_ACCSS(:) = ZZW4(:) * ZZW1(:) ! perte pour rr, > 0 + P_RR_ACCSG(:) = ZZW4(:) * ( ZZW2(:) - ZZW1(:) ) ! rraccsg = rraccs - rraccss + P_RS_ACCRG(:) = ZZW5(:) ! perte pour rs, > 0 +! P_TH_ACC(:) = - P_RR_ACC(:) * (PLSFACT(:)-PLVFACT(:)) + P_TH_ACC(:) = - Z_RR_ACC(:) * (PLSFACT(:)-PLVFACT(:)) +!--cb-- ! END WHERE ! diff --git a/src/PHYEX/micro/mode_lima_sedimentation.f90 b/src/PHYEX/micro/mode_lima_sedimentation.f90 index 1efeb31919684052c0a3fe5ba224450e668fb0e9..9c59f23d3b7e454a9081897e019db570bacff274 100644 --- a/src/PHYEX/micro/mode_lima_sedimentation.f90 +++ b/src/PHYEX/micro/mode_lima_sedimentation.f90 @@ -8,8 +8,10 @@ MODULE MODE_LIMA_SEDIMENTATION CONTAINS ! ###################################################################### SUBROUTINE LIMA_SEDIMENTATION (D, CST, & - HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, PDZZ, PRHODREF, & - PPABST, PT, PRT_SUM, PCPT, PRS, PCS, PINPR, PFPR ) + HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, OELEC, & + PDZZ, PRHODREF, & + PPABST, PT, PRT_SUM, PCPT, PRS, PCS, PINPR, PFPR, & + PEFIELDW, PQS) ! ###################################################################### ! !! PURPOSE @@ -40,6 +42,8 @@ CONTAINS ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 ! B. Vie 03/2020: disable temperature change of droplets by air temperature ! J. Wurtz 03/2022: new snow characteristics +! C. Barthe 03/06/2022: add sedimentation for electric charges +! C. Barthe 02/06/2023: add the Beard effect (electric field) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -47,16 +51,22 @@ CONTAINS ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_CST, ONLY: CST_t +USE MODD_ELEC_DESCR, ONLY: LSEDIM_BEARD +USE MODD_ELEC_PARAM, ONLY: XFQSED, XDQ USE MODD_PARAM_LIMA, ONLY: XCEXVT, XRTMIN, XCTMIN, NSPLITSED, & XLB, XLBEX, XD, XFSEDR, XFSEDC, & XALPHAC, XNUC, XALPHAS, XNUS, LSNOW_T, & NMOM_S -USE MODD_PARAM_LIMA_COLD, ONLY: XLBDAS_MAX, XBS, & - XLBDAS_MIN, XTRANS_MP_GAMMAS, XFVELOS +USE MODD_PARAM_LIMA_COLD, ONLY: XLBEXI, XLBI, XDI, XLBDAS_MAX, XBS, XEXSEDS, & + XLBDAS_MIN, XTRANS_MP_GAMMAS, XFVELOS, & + XCCS, XCXS +USE MODD_PARAM_LIMA_MIXED, ONLY: XCCG, XCXG, XCCH, XCXH use mode_tools, only: Countjv USE MODI_GAMMA, ONLY: GAMMA_X0D +USE MODI_ELEC_COMPUTE_EX +USE MODE_ELEC_BEARD_EFFECT, ONLY: ELEC_BEARD_EFFECT ! IMPLICIT NONE ! @@ -68,7 +78,8 @@ CHARACTER(1), INTENT(IN) :: HPHASE ! Liquid or solid hydromete INTEGER, INTENT(IN) :: KMOMENTS ! Number of moments INTEGER, INTENT(IN) :: KID ! Hydrometeor ID INTEGER, INTENT(IN) :: KSPLITG ! -REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, INTENT(IN) :: PTSTEP ! Time step +LOGICAL, INTENT(IN) :: OELEC ! if true, cloud electrification is activated REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Height (z) REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t @@ -79,6 +90,8 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRS ! m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCS ! C. source REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPR ! Instant precip rate REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFPR ! Precip. fluxes in altitude +REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PEFIELDW ! Vertical component of the electric field +REAL, DIMENSION(:,:,:), INTENT(INOUT), OPTIONAL :: PQS ! Elec. charge density source ! !* 0.2 Declarations of local variables : ! @@ -110,12 +123,21 @@ INTEGER , DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement ! REAL :: ZTSPLITG ! Small time step for rain sedimentation REAL :: ZC ! Cpl or Cpi -INTEGER :: ZMOMENTS +INTEGER :: IMOMENTS ! +! Variables for cloud electricity +REAL :: ZCX, ZXX ! C and x parameters for N-lambda relationship +REAL, DIMENSION(:), ALLOCATABLE :: ZQS, & ! Electric charge density source + ZZQ, & ! Work array + ZES ! e in q-D relationship +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWSEDQ ! Sedimentation of electric charge density +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDA3 +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZBEARDCOEFF ! effect of + ! electrical forces on terminal fall speed ! !------------------------------------------------------------------------------- ! -ZMOMENTS=KMOMENTS +IMOMENTS=KMOMENTS ! ! Time splitting ! @@ -128,6 +150,7 @@ ZWSEDC(:,:,:) = 0. ! PRS(:,:,:) = PRS(:,:,:) * PTSTEP IF (KMOMENTS==2) PCS(:,:,:) = PCS(:,:,:) * PTSTEP +IF (OELEC) PQS(:,:,:) = PQS(:,:,:) * PTSTEP DO JK = D%NKTB , D%NKTE ZW(:,:,JK)=ZTSPLITG/PDZZ(:,:,JK) END DO @@ -135,8 +158,10 @@ END DO IF (HPHASE=='L') ZC=CST%XCL IF (HPHASE=='I') ZC=CST%XCI ! -IF (KID==4 .AND. ZMOMENTS==1) THEN - ZMOMENTS=2 +! When pristine ice is 1-moment, nb concentration is parameterized following +! McFarquhar and Heymsfield (1997) for columns as in ICE3 +IF (KID==4 .AND. IMOMENTS==1) THEN + IMOMENTS=2 WHERE(PRS(:,:,:)>0) PCS(:,:,:)=1/(4*CST%XPI*900.) * PRS(:,:,:) * & MAX(0.05E6,-0.15319E6-0.021454E6*ALOG(PRHODREF(:,:,:)*PRS(:,:,:)))**3 END IF @@ -149,7 +174,7 @@ DO JN = 1 , NSPLITSED(KID) ! Computation only where enough ice, snow, graupel or hail GSEDIM(:,:,:) = .FALSE. GSEDIM(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE) = PRS(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE)>XRTMIN(KID) - IF (ZMOMENTS==2) GSEDIM(:,:,:) = GSEDIM(:,:,:) .AND. PCS(:,:,:)>XCTMIN(KID) + IF (IMOMENTS==2) GSEDIM(:,:,:) = GSEDIM(:,:,:) .AND. PCS(:,:,:)>XCTMIN(KID) ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) ! IF( ISEDIM >= 1 ) THEN @@ -164,15 +189,24 @@ DO JN = 1 , NSPLITSED(KID) ALLOCATE(ZZW(ISEDIM)) ; ZZW(:) = 0.0 ALLOCATE(ZZX(ISEDIM)) ; ZZX(:) = 0.0 ALLOCATE(ZZY(ISEDIM)) ; ZZY(:) = 0.0 + ! + IF (OELEC) THEN + ALLOCATE(ZWSEDQ(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3))) ; ZWSEDQ(:,:,:) = 0. + ALLOCATE(ZES(ISEDIM)) ; ZES(:) = 0.0 + ALLOCATE(ZQS(ISEDIM)) ; ZQS(:) = 0.0 + ALLOCATE(ZZQ(ISEDIM)) ; ZZQ(:) = 0.0 + END IF ! DO JL = 1,ISEDIM ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) ZPABST(JL) = PPABST(I1(JL),I2(JL),I3(JL)) ZT(JL) = PT(I1(JL),I2(JL),I3(JL)) ZRS(JL) = PRS(I1(JL),I2(JL),I3(JL)) - IF (ZMOMENTS==2) ZCS(JL) = PCS(I1(JL),I2(JL),I3(JL)) + IF (IMOMENTS==2) ZCS(JL) = PCS(I1(JL),I2(JL),I3(JL)) + IF (OELEC) ZQS(JL) = PQS(I1(JL),I2(JL),I3(JL)) END DO ! +! Compute lambda IF (KID == 5 .AND. NMOM_S.EQ.1 .AND. LSNOW_T) THEN ZLBDA(:) = 1.E10 WHERE(ZT(:)>263.15 .AND. ZRS(:)>XRTMIN(5)) @@ -185,8 +219,8 @@ DO JN = 1 , NSPLITSED(KID) ZZW(:) = XFSEDR(KID) * ZRHODREF(:)**(1.-XCEXVT)*ZRS(:)* & (1 + (XFVELOS/ZLBDA(:))**XALPHAS)**(-XNUS-(XD(KID)+XBS)/XALPHAS) * ZLBDA(:)**(-XD(KID)) ELSE - IF (ZMOMENTS==1) ZLBDA(:) = XLB(KID) * ( ZRHODREF(:) * ZRS(:) )**XLBEX(KID) - IF (ZMOMENTS==2) ZLBDA(:) = ( XLB(KID)*ZCS(:) / ZRS(:) )**XLBEX(KID) + IF (IMOMENTS==1) ZLBDA(:) = XLB(KID) * ( ZRHODREF(:) * ZRS(:) )**XLBEX(KID) + IF (IMOMENTS==2) ZLBDA(:) = ( XLB(KID)*ZCS(:) / ZRS(:) )**XLBEX(KID) ZZY(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDA(:)**(-XD(KID)) IF (LSNOW_T .AND. KID==5) & ZZY(:) = ZZY(:) * (1 + (XFVELOS/ZLBDA(:))**XALPHAS)**(-XNUS-(XD(KID)+XBS)/XALPHAS) @@ -196,20 +230,73 @@ DO JN = 1 , NSPLITSED(KID) IF (KMOMENTS==2) ZZX(:) = XFSEDC(KID) * ZCS(:) * ZZY(:) * ZRHODREF(:) IF (KID==2) THEN + ! mean cloud droplet diameter ZCC(:) = 0.5*GAMMA_X0D(XNUC+1./XALPHAC)/(GAMMA_X0D(XNUC)*ZLBDA(:)) + ! correction factor for cloud droplet terminal fall speed ZCC(:) = 1.+1.26*6.6E-8*(101325./ZPABST(:))*(ZT(:)/293.15)/ZCC(:) ZZW(:) = ZCC(:) * ZZW(:) ZZX(:) = ZCC(:) * ZZX(:) END IF - +! +! If the electrical scheme is activated, the electric field can impact the sedimentation + ZBEARDCOEFF(:,:,:) = 1.0 + IF (OELEC .AND. LSEDIM_BEARD) THEN + ALLOCATE(ZLBDA3(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3))) + ZLBDA3(:,:,:) = UNPACK( ZLBDA(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + CALL ELEC_BEARD_EFFECT(D, KID, GSEDIM, PT, PRHODREF, & + PRS, PQS, PEFIELDW, ZLBDA3, ZBEARDCOEFF) + DEALLOCATE(ZLBDA3) + END IF +! ZWSEDR(:,:,1:D%NKT) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - ZWSEDR(:,:,D%NKTB:D%NKTE) = MIN( ZWSEDR(:,:,D%NKTB:D%NKTE), PRS(:,:,D%NKTB:D%NKTE) & - * PRHODREF(:,:,D%NKTB:D%NKTE) / ZW(:,:,D%NKTB:D%NKTE) ) + ZWSEDR(:,:,D%NKTB:D%NKTE) = MIN( ZWSEDR(:,:,D%NKTB:D%NKTE) * ZBEARDCOEFF(:,:,D%NKTB:D%NKTE), & + PRS(:,:,D%NKTB:D%NKTE) * PRHODREF(:,:,D%NKTB:D%NKTE) / & + ZW(:,:,D%NKTB:D%NKTE) ) IF (KMOMENTS==2) THEN ZWSEDC(:,:,1:D%NKT) = UNPACK( ZZX(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - ZWSEDC(:,:,D%NKTB:D%NKTE) = MIN( ZWSEDC(:,:,D%NKTB:D%NKTE), PCS(:,:,D%NKTB:D%NKTE) & - * PRHODREF(:,:,D%NKTB:D%NKTE) / ZW(:,:,D%NKTB:D%NKTE) ) + ZWSEDC(:,:,D%NKTB:D%NKTE) = MIN( ZWSEDC(:,:,D%NKTB:D%NKTE) * ZBEARDCOEFF(:,:,D%NKTB:D%NKTE), & + PCS(:,:,D%NKTB:D%NKTE) * PRHODREF(:,:,D%NKTB:D%NKTE) / & + ZW(:,:,D%NKTB:D%NKTE) ) END IF +! +! Sedimentation of electric charges + IF (OELEC) THEN + ! compute e of the q-D relationship + IF (IMOMENTS == 2) THEN ! 2-moment species + CALL ELEC_COMPUTE_EX (KID, IMOMENTS, ISEDIM, PTSTEP, ZRHODREF, XRTMIN(KID), & + ZRS, ZQS, ZES, PLBDX=ZLBDA, PCX=ZCS) + ELSE ! 1-moment species + CALL ELEC_COMPUTE_EX (KID, IMOMENTS, ISEDIM, PTSTEP, ZRHODREF, XRTMIN(KID), & + ZRS, ZQS, ZES, PLBDX=ZLBDA) + END IF + ! + ! number concentration for 1-moment species + ! for precipitating hydrometeors, N=C\lambda^x, except for snow if lsnow_t=t + IF (IMOMENTS == 1) THEN + IF (KID == 5) THEN + ZCX = XCCS + ZXX = XCXS + ELSE IF (KID == 6) THEN + ZCX = XCCG + ZXX = XCXG + ELSE IF (KID == 7) THEN + ZCX = XCCH + ZXX = XCXH + END IF + ZCS(:) = ZCX * ZLBDA(:)**ZXX + END IF + ! + ZZQ(:) = ZRHODREF(:)**(1.-XCEXVT) * ZES(:) * ZCS(:) * XFQSED(KID) * ZLBDA(:)**(-XDQ(KID)) + ! + ! correction for cloud droplet terminal fall speed + IF (KID == 2) ZZQ(:) = ZZQ(:) * ZCC(:) + ! + ZWSEDQ(:,:,1:D%NKT) = UNPACK( ZZQ(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDQ(:,:,1:D%NKT) = ZWSEDQ(:,:,1:D%NKT) * ZBEARDCOEFF(:,:,1:D%NKT) + ZWSEDQ(:,:,D%NKTB:D%NKTE) = SIGN(MIN(ABS(ZWSEDQ(:,:,D%NKTB:D%NKTE)), & + ABS(PQS(:,:,D%NKTB:D%NKTE)*PRHODREF(:,:,D%NKTB:D%NKTE)/ZW(:,:,D%NKTB:D%NKTE))), & + ZWSEDQ(:,:,D%NKTB:D%NKTE)) + END IF DO JK = D%NKTB , D%NKTE PRS(:,:,JK) = PRS(:,:,JK) + ZW(:,:,JK)* & @@ -226,7 +313,11 @@ DO JN = 1 , NSPLITSED(KID) ! ZW(:,:,JK)*ZWSEDR(:,:,JK+1)*ZC*PT(:,:,JK+D%NKL)) / & ! (PRHODREF(:,:,JK+D%NKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK) + ZW(:,:,JK)*ZWSEDR(:,:,JK+D%NKL)*ZC) !ZWDT(:,:,JK) = ZWDT(:,:,JK) - PT(:,:,JK) + IF (OELEC) PQS(:,:,JK) = PQS(:,:,JK) + ZW(:,:,JK) * & + (ZWSEDQ(:,:,JK+D%NKL) - ZWSEDQ(:,:,JK)) / PRHODREF(:,:,JK) + END DO + ! DEALLOCATE(ZRHODREF) DEALLOCATE(ZPABST) DEALLOCATE(ZT) @@ -237,6 +328,10 @@ DO JN = 1 , NSPLITSED(KID) DEALLOCATE(ZZW) DEALLOCATE(ZZX) DEALLOCATE(ZZY) + IF (ALLOCATED(ZWSEDQ)) DEALLOCATE(ZWSEDQ) + IF (ALLOCATED(ZQS)) DEALLOCATE(ZQS) + IF (ALLOCATED(ZZQ)) DEALLOCATE(ZZQ) + IF (ALLOCATED(ZES)) DEALLOCATE(ZES) ! PINPR(:,:) = PINPR(:,:) + ZWSEDR(:,:,D%NKB)/CST%XRHOLW/NSPLITSED(KID) ! in m/s !PT(:,:,:) = PT(:,:,:) + ZWDT(:,:,:) @@ -246,6 +341,7 @@ END DO ! PRS(:,:,:) = PRS(:,:,:) / PTSTEP IF (KMOMENTS==2) PCS(:,:,:) = PCS(:,:,:) / PTSTEP +IF (OELEC) PQS(:,:,:) = PQS(:,:,:) / PTSTEP ! END SUBROUTINE LIMA_SEDIMENTATION END MODULE MODE_LIMA_SEDIMENTATION diff --git a/src/PHYEX/micro/mode_lima_tendencies.f90 b/src/PHYEX/micro/mode_lima_tendencies.f90 index cbfde662f9a2a3c67c487e313b5199da0dd7ebc1..eb06801c43352dac5bb1388e4b719bc6c9d31e41 100644 --- a/src/PHYEX/micro/mode_lima_tendencies.f90 +++ b/src/PHYEX/micro/mode_lima_tendencies.f90 @@ -25,9 +25,13 @@ CONTAINS P_RI_AGGS, P_CI_AGGS, & P_TH_DEPG, P_RG_DEPG, & P_TH_BERFI, P_RC_BERFI, & - P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & +!++cb++ +! P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & + P_TH_RIM, P_CC_RIM, P_CS_RIM, P_RC_RIMSS, P_RC_RIMSG, P_RS_RIMCG, & P_RI_HMS, P_CI_HMS, P_RS_HMS, & - P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC, & +! P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC, & + P_TH_ACC, P_CR_ACC, P_CS_ACC, P_RR_ACCSS, P_RR_ACCSG, P_RS_ACCRG, & +!--cb-- P_RS_CMEL, P_CS_CMEL, & P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ, & P_RI_CIBU, P_CI_CIBU, & @@ -46,7 +50,8 @@ CONTAINS PA_TH, PA_RV, PA_RC, PA_CC, PA_RR, PA_CR, & PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH, & PEVAP3D, & - PCF1D, PIF1D, PPF1D ) + PCF1D, PIF1D, PPF1D, & + PLATHAM_IAGGS ) ! ###################################################################### !! !! PURPOSE @@ -65,6 +70,8 @@ CONTAINS ! Delbeke/Vie 03/2022 : KHKO option ! J. Wurtz 03/2022 : new snow characteristics ! B. Vie 03/2022: Add option for 1-moment pristine ice +! C. Barthe 06/2022: change some mass transfer rates to be consistent with ICE3, for cloud electrification +! C. Barthe 06/2023: add Latham effet for IAGGS !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -171,23 +178,33 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DEPG ! deposition of vapor on graup REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_BERFI REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_BERFI ! Bergeron (BERFI) : rc, ri=-rc, th ! +!++cb++ REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_RIM -REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_RIM +!REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_RIM -REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_RIM +!REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_RIM -REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_RIM ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th +!REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_RIM ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_RIMSS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_RIMSG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_RIMCG ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th +!--cb-- ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMS REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMS REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_HMS ! hallett mossop snow (HMS) : ri, Ni, rs ! +!++cb++ REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_ACC -REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_ACC +!REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_ACC REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_ACC -REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_ACC +!REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_ACC REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_ACC -REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_ACC ! rain accretion on aggregates (ACC) : rr, Nr, rs, Ns, rg, Ng=-Ns, th +!REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_ACC ! rain accretion on aggregates (ACC) : rr, Nr, rs, Ns, rg, Ng=-Ns, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_ACCSS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_ACCSG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_ACCRG ! rain accretion on aggregates (ACC) : rr, Nr, rs, rg, th +!--cb-- ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_CMEL REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_CMEL ! conversion-melting (CMEL) : rs, Ns, rg=-rs, Ng=-Ns @@ -282,6 +299,8 @@ REAL, DIMENSION(:), INTENT(IN) :: PCF1D REAL, DIMENSION(:), INTENT(IN) :: PIF1D REAL, DIMENSION(:), INTENT(IN) :: PPF1D ! +REAL, DIMENSION(:), INTENT(IN) :: PLATHAM_IAGGS ! factor to account for the effect of Efield on IAGGS +! !* 0.2 Declarations of local variables : ! REAL, DIMENSION(SIZE(PRCT)) :: ZT @@ -647,6 +666,7 @@ IF (NMOM_I.GE.1 .AND. NMOM_S.GE.1) THEN CALL LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & ! depends on IF, PF ZT, PRHODREF, & ZRIT/ZIF1D, ZRST/ZPF1D, PCIT/ZIF1D, PCST/ZPF1D, ZLBDI, ZLBDS, & + PLATHAM_IAGGS, & P_RI_AGGS, P_CI_AGGS ) P_CI_AGGS(:) = P_CI_AGGS(:) * ZIF1D(:) P_RI_AGGS(:) = P_RI_AGGS(:) * ZIF1D(:) @@ -686,53 +706,71 @@ IF (NMOM_C.GE.1 .AND. NMOM_S.GE.1) THEN ! Graupel production as tendency (or should be tendency + instant to stick to the previous version ?) ! Includes the Hallett Mossop process for riming of droplets by snow (HMS) ! +!++cb++ CALL LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & ! depends on CF PRHODREF, ZT, & ZRCT/ZCF1D, PCCT/ZCF1D, ZRST/ZPF1D, PCST/ZPF1D, ZLBDC, ZLBDS, ZLVFACT, ZLSFACT, & - P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & +! P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & + P_TH_RIM, P_CC_RIM, P_CS_RIM, P_RC_RIMSS, P_RC_RIMSG, P_RS_RIMCG, & P_RI_HMS, P_CI_HMS, P_RS_HMS ) - P_RC_RIM(:) = P_RC_RIM(:) * ZCF1D(:) +! P_RC_RIM(:) = P_RC_RIM(:) * ZCF1D(:) P_CC_RIM(:) = P_CC_RIM(:) * ZCF1D(:) - P_RS_RIM(:) = P_RS_RIM(:) * ZCF1D(:) +! P_RS_RIM(:) = P_RS_RIM(:) * ZCF1D(:) P_CS_RIM(:) = P_CS_RIM(:) * ZCF1D(:) - P_RG_RIM(:) = P_RG_RIM(:) * ZCF1D(:) - P_TH_RIM(:) = - P_RC_RIM(:) * (ZLSFACT(:)-ZLVFACT(:)) +! P_RG_RIM(:) = P_RG_RIM(:) * ZCF1D(:) + P_RC_RIMSS(:) = P_RC_RIMSS(:) * ZCF1D(:) + P_RC_RIMSG(:) = P_RC_RIMSG(:) * ZCF1D(:) + P_RS_RIMCG(:) = P_RS_RIMCG(:) * ZCF1D(:) +! P_TH_RIM(:) = - P_RC_RIM(:) * (ZLSFACT(:)-ZLVFACT(:)) + P_TH_RIM(:) = - (P_RC_RIMSS(:) + P_RC_RIMSG(:)) * (ZLSFACT(:)-ZLVFACT(:)) P_RI_HMS(:) = P_RI_HMS(:) * ZCF1D(:) P_CI_HMS(:) = P_CI_HMS(:) * ZCF1D(:) P_RS_HMS(:) = P_RS_HMS(:) * ZCF1D(:) ! - PA_RC(:) = PA_RC(:) + P_RC_RIM(:) +! PA_RC(:) = PA_RC(:) + P_RC_RIM(:) + PA_RC(:) = PA_RC(:) + P_RC_RIMSS(:) + P_RC_RIMSG(:) ! RCRIMSS < 0 and RCRIMSG < 0 (both loss for rc) IF (NMOM_C.GE.2) PA_CC(:) = PA_CC(:) + P_CC_RIM(:) PA_RI(:) = PA_RI(:) + P_RI_HMS(:) IF (NMOM_I.GE.2) PA_CI(:) = PA_CI(:) + P_CI_HMS(:) - PA_RS(:) = PA_RS(:) + P_RS_RIM(:) + P_RS_HMS(:) +! PA_RS(:) = PA_RS(:) + P_RS_RIM(:) + P_RS_HMS(:) + PA_RS(:) = PA_RS(:) - P_RC_RIMSS(:) - P_RS_RIMCG(:) ! RCRIMSS < 0 (gain for rs), RSRIMCG > 0 (loss for rs) IF (NMOM_S.GE.2) PA_CS(:) = PA_CS(:) + P_CS_RIM(:) - PA_RG(:) = PA_RG(:) + P_RG_RIM(:) +! PA_RG(:) = PA_RG(:) + P_RG_RIM(:) + PA_RG(:) = PA_RG(:) - P_RC_RIMSG(:) + P_RS_RIMCG(:) ! RCRIMSG < 0 (gain for rg), RSRIMCG > 0 (gain for rg) IF (NMOM_G.GE.2) PA_CG(:) = PA_CG(:) - P_CS_RIM(:) PA_TH(:) = PA_TH(:) + P_TH_RIM(:) - +!--cb-- END IF ! IF (NMOM_R.GE.1 .AND. NMOM_S.GE.1) THEN +!++cb++ CALL LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & ! depends on PF PRHODREF, ZT, & ZRRT/ZPF1D, PCRT/ZPF1D, ZRST/ZPF1D, PCST/ZPF1D, ZLBDR, ZLBDS, ZLVFACT, ZLSFACT, & - P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC ) - P_RR_ACC(:) = P_RR_ACC(:) * ZPF1D(:) +! P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC ) + P_TH_ACC, P_CR_ACC, P_CS_ACC, P_RR_ACCSS, P_RR_ACCSG, P_RS_ACCRG ) +! P_RR_ACC(:) = P_RR_ACC(:) * ZPF1D(:) P_CR_ACC(:) = P_CR_ACC(:) * ZPF1D(:) - P_RS_ACC(:) = P_RS_ACC(:) * ZPF1D(:) +! P_RS_ACC(:) = P_RS_ACC(:) * ZPF1D(:) P_CS_ACC(:) = P_CS_ACC(:) * ZPF1D(:) - P_RG_ACC(:) = P_RG_ACC(:) * ZPF1D(:) - P_TH_ACC(:) = - P_RR_ACC(:) * (ZLSFACT(:)-ZLVFACT(:)) - ! - PA_RR(:) = PA_RR(:) + P_RR_ACC(:) +! P_RG_ACC(:) = P_RG_ACC(:) * ZPF1D(:) +! P_TH_ACC(:) = - P_RR_ACC(:) * (ZLSFACT(:)-ZLVFACT(:)) + P_RR_ACCSS(:) = P_RR_ACCSS(:) * ZPF1D(:) + P_RR_ACCSG(:) = P_RR_ACCSG(:) * ZPF1D(:) + P_RS_ACCRG(:) = P_RS_ACCRG(:) * ZPF1D(:) + P_TH_ACC(:) = (P_RR_ACCSS(:) + P_RR_ACCSG(:)) * (ZLSFACT(:)-ZLVFACT(:)) + ! +! PA_RR(:) = PA_RR(:) + P_RR_ACC(:) + PA_RR(:) = PA_RR(:) - P_RR_ACCSS(:) - P_RR_ACCSG(:) IF (NMOM_R.GE.2) PA_CR(:) = PA_CR(:) + P_CR_ACC(:) - PA_RS(:) = PA_RS(:) + P_RS_ACC(:) +! PA_RS(:) = PA_RS(:) + P_RS_ACC(:) + PA_RS(:) = PA_RS(:) + P_RR_ACCSS(:) - P_RS_ACCRG(:) IF (NMOM_S.GE.2) PA_CS(:) = PA_CS(:) + P_CS_ACC(:) - PA_RG(:) = PA_RG(:) + P_RG_ACC(:) +! PA_RG(:) = PA_RG(:) + P_RG_ACC(:) + PA_RG(:) = PA_RG(:) + P_RR_ACCSG(:) + P_RS_ACCRG(:) IF (NMOM_G.GE.2) PA_CG(:) = PA_CG(:) - P_CS_ACC(:) PA_TH(:) = PA_TH(:) + P_TH_ACC(:) - +!--cb-- END IF ! IF (NMOM_S.GE.1) THEN diff --git a/src/PHYEX/micro/modi_lima.f90 b/src/PHYEX/micro/modi_lima.f90 index 383df6c4d7fcad487defdff132df7cca37bb3b74..a2c536238d29c46a42143be62a9c9d360cf90309 100644 --- a/src/PHYEX/micro/modi_lima.f90 +++ b/src/PHYEX/micro/modi_lima.f90 @@ -4,14 +4,15 @@ IMPLICIT NONE INTERFACE ! SUBROUTINE LIMA ( D, CST, BUCONF, TBUDGETS, KBUDGETS, & - PTSTEP, & + PTSTEP, OELEC, & PRHODREF, PEXNREF, PDZZ, & PRHODJ, PPABST, & NCCN, NIFN, NIMM, & PDTHRAD, PTHT, PRT, PSVT, PW_NU, & PTHS, PRS, PSVS, & PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PINPRH, & - PEVAP3D, PCLDFR, PICEFR, PPRCFR, PFPR ) + PEVAP3D, PCLDFR, PICEFR, PPRCFR, PFPR, & + PLATHAM_IAGGS, PEFIELDW, PSV_ELEC_T, PSV_ELEC_S ) ! USE MODD_IO, ONLY: TFILEDATA USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t @@ -27,6 +28,8 @@ INTEGER, INTENT(IN) :: KBUDGETS ! REAL, INTENT(IN) :: PTSTEP ! Time step ! +LOGICAL, INTENT(IN) :: OELEC ! if true, cloud electrification is activated +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) @@ -62,6 +65,11 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Cloud fraction REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPRCFR ! Cloud fraction REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PFPR ! Precipitation fluxes in altitude ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLATHAM_IAGGS ! Factor for IAGGS modification due to Efield +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PEFIELDW ! Vertical component of the electric field +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PSV_ELEC_T ! Charge density at time t +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(INOUT) :: PSV_ELEC_S ! Charge density sources +! END SUBROUTINE LIMA END INTERFACE END MODULE MODI_LIMA diff --git a/src/PHYEX/micro/modi_rain_ice.f90 b/src/PHYEX/micro/modi_rain_ice.f90 index abb7ff6b5430b32c0da9cda82f0fe64b99c91c96..17f83cbc4916f6a6e55f2fc1edd6e6d3bfb1112a 100644 --- a/src/PHYEX/micro/modi_rain_ice.f90 +++ b/src/PHYEX/micro/modi_rain_ice.f90 @@ -4,7 +4,8 @@ ! IMPLICIT NONE INTERFACE - SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, BUCONF, & + SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, ELECP, ELECD, BUCONF, & + KPROMA, OCND2, OELEC, OSEDIM_BEARD, & PTSTEP, KRR, PEXN, & PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & @@ -13,15 +14,19 @@ INTERFACE PINPRC, PINPRR, PEVAP3D, & PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & TBUDGETS, KBUDGETS, & + PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT, & + PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & + PEFIELDW, PLATHAM_IAGGS, & PSEA, PTOWN, & - PRHT, PRHS, PINPRH, PFPR ) + PRHT, PRHS, PINPRH, PFPR, PQHT, PQHS ) ! USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t USE MODD_CST, ONLY: CST_t USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t -USE MODD_TURB_n, ONLY: TURB_t +USE MODD_ELEC_DESCR, ONLY: ELEC_DESCR_t +USE MODD_ELEC_PARAM, ONLY: ELEC_PARAM_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t ! IMPLICIT NONE @@ -31,7 +36,13 @@ TYPE(CST_t), INTENT(IN) :: CST TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +TYPE(ELEC_PARAM_t), INTENT(IN) :: ELECP ! electrical parameters +TYPE(ELEC_DESCR_t), INTENT(IN) :: ELECD ! electrical descriptive csts TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF +INTEGER, INTENT(IN) :: KPROMA ! cache-blocking factor for microphysic loop +LOGICAL :: OCND2 ! Logical switch to separate liquid and ice +LOGICAL, INTENT(IN) :: OELEC ! Switch for cloud electricity +LOGICAL, INTENT(IN) :: OSEDIM_BEARD ! Switch for effect of electrical forces on sedim. REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable ! @@ -76,12 +87,36 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PSIGS ! Sigma_s at t ! TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS INTEGER, INTENT(IN) :: KBUDGETS +! +! scalar variables for cloud electricity +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQPIT ! Positive ion - +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCT ! Cloud droplet | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRT ! Rain | electric +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIT ! Ice crystals | charge +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQST ! Snow | at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGT ! Graupel | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQNIT ! Negative ion - +! +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQPIS ! Positive ion - +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCS ! Cloud droplet | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRS ! Rain | electric +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIS ! Ice crystals | charge +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQSS ! Snow | source +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGS ! Graupel | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQNIS ! Negative ion - +! +REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), INTENT(IN) :: PEFIELDW ! vertical electric field +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PLATHAM_IAGGS ! E Function to simulate + ! enhancement of IAGGS +! REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH! Hail instant precip REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQHT ! Hail electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQHS ! Hail electric charge source ! END SUBROUTINE RAIN_ICE END INTERFACE diff --git a/src/PHYEX/micro/rain_ice.f90 b/src/PHYEX/micro/rain_ice.f90 index 18b10bb3de19c5c346847d2688fd77479c0c4a74..1bbd44d1053ed5f3962e006c8b51bce22b35dcd6 100644 --- a/src/PHYEX/micro/rain_ice.f90 +++ b/src/PHYEX/micro/rain_ice.f90 @@ -4,7 +4,8 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ######spl - SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, BUCONF, & + SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, ELECP, ELECD, BUCONF, & + KPROMA, OCND2, OELEC, OSEDIM_BEARD, & PTSTEP, KRR, PEXN, & PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & @@ -13,9 +14,12 @@ PINPRC, PINPRR, PEVAP3D, & PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & TBUDGETS, KBUDGETS, & + PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT, & + PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & + PEFIELDW, PLATHAM_IAGGS, & PSEA, PTOWN, & - PRHT, PRHS, PINPRH, PFPR ) -! ###################################################################### + PRHT, PRHS, PINPRH, PFPR, PQHT, PQHS ) +! ############################################################################# ! !!**** * - compute the explicit microphysical sources !! @@ -171,6 +175,9 @@ ! P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG !! R. El Khatib 24-Aug-2021 Optimizations ! J. Wurtz 03/2022: New snow characteristics with LSNOW_T +! C. Barthe 03/2023: Add call to cloud electrification +! C. Barthe 06/2023: Add retroaction of electric field on IAGGS +! C. Barthe 07/2023: use new data structures for electricity !----------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -185,15 +192,47 @@ USE MODD_CST, ONLY: CST_t USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t -USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress - & ITH, & ! Potential temperature - & IRV, & ! Water vapor - & IRC, & ! Cloud water - & IRR, & ! Rain water - & IRI, & ! Pristine ice - & IRS, & ! Snow/aggregate - & IRG, & ! Graupel - & IRH ! Hail +USE MODD_ELEC_PARAM, ONLY: ELEC_PARAM_t +USE MODD_ELEC_DESCR, ONLY: ELEC_DESCR_t +USE MODD_FIELDS_ADDRESS +!USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress +! & ITH, & ! Potential temperature +! & IRV, & ! Water vapor +! & IRC, & ! Cloud water +! & IRR, & ! Rain water +! & IRI, & ! Pristine ice +! & IRS, & ! Snow/aggregate +! & IRG, & ! Graupel +! & IRH, & ! Hail +! & IBUNUM, & ! Number of tendency terms +! & IBUNUM_EXTRA, & ! Number of extra tendency terms +! & IRCHONI, & ! Homogeneous nucleation +! & IRVDEPS, & ! Deposition on r_s, +! & IRIAGGS, & ! Aggregation on r_s +! & IRIAUTS, & ! Autoconversion of r_i for r_s production +! & IRVDEPG, & ! Deposition on r_g +! & IRCAUTR, & ! Autoconversion of r_c for r_r production +! & IRCACCR, & ! Accretion of r_c for r_r production +! & IRREVAV, & ! Evaporation of r_r +! & IRCBERI, & ! Bergeron-Findeisen effect +! & IRHMLTR, & ! Melting of the hailstones +! & IRSMLTG, & ! Conversion-Melting of the aggregates +! & IRCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature +! & IRRACCSS, IRRACCSG, IRSACCRG, & ! Rain accretion onto the aggregates +! & IRCRIMSS, IRCRIMSG, IRSRIMCG, & ! Cloud droplet riming of the aggregates +! & IRICFRRG, IRRCFRIG, IRICFRR, & ! Rain contact freezing +! & IRCWETG, IRIWETG, IRRWETG, IRSWETG, & ! Graupel wet growth +! & IRCDRYG, IRIDRYG, IRRDRYG, IRSDRYG, & ! Graupel dry growth +! & IRWETGH, & ! Conversion of graupel into hail +! & IRGMLTR, & ! Melting of the graupel +! & IRCWETH, IRIWETH, IRSWETH, IRGWETH, IRRWETH, & ! Dry growth of hailstone +! & IRCDRYH, IRIDRYH, IRSDRYH, IRRDRYH, IRGDRYH, & ! Wet growth of hailstone +! & IRDRYHG, & +! & IRVHENI_MR, & ! heterogeneous nucleation mixing ratio change +! & IRRHONG_MR, & ! Spontaneous freezing mixing ratio change +! & IRIMLTC_MR, & ! Cloud ice melting mixing ratio change +! & IRSRIMCG_MR,& ! Cloud droplet riming of the aggregates +! & IRWETGH_MR USE MODE_BUDGET_PHY, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL @@ -204,6 +243,8 @@ USE MODE_ICE4_PACK, ONLY: ICE4_PACK USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION USE MODE_ICE4_CORRECT_NEGATIVITIES, ONLY: ICE4_CORRECT_NEGATIVITIES ! +USE MODI_ELEC_TENDENCIES +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -215,7 +256,13 @@ TYPE(CST_t), INTENT(IN) :: CST TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +TYPE(ELEC_PARAM_t), INTENT(IN) :: ELECP ! electrical parameters +TYPE(ELEC_DESCR_t), INTENT(IN) :: ELECD ! electrical descriptive csts TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF +INTEGER, INTENT(IN) :: KPROMA ! cache-blocking factor for microphysic loop +LOGICAL :: OCND2 ! Logical switch to separate liquid and ice +LOGICAL, INTENT(IN) :: OELEC ! Switch for cloud electricity +LOGICAL, INTENT(IN) :: OSEDIM_BEARD ! Switch for effect of electrical forces on sedim. REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable ! @@ -260,12 +307,37 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PSIGS ! Sigma_s at t ! TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town -REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH! Hail instant precip -REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +! scalar variables for cloud electricity +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQPIT ! Positive ion - +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCT ! Cloud droplet | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRT ! Rain | electric +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIT ! Ice crystals | charge +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQST ! Snow | at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGT ! Graupel | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PQNIT ! Negative ion - +! +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQPIS ! Positive ion - +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCS ! Cloud droplet | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRS ! Rain | electric +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIS ! Ice crystals | charge +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQSS ! Snow | source +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGS ! Graupel | +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQNIS ! Negative ion - +! +REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), INTENT(IN) :: PEFIELDW ! vertical electric field +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN) :: PLATHAM_IAGGS ! E Function to simulate + ! enhancement of IAGGS +! +! optional variables +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQHT ! Hail electric charge at t +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQHS ! Hail electric charge source ! ! !* 0.2 Declarations of local variables : @@ -292,6 +364,13 @@ LOGICAL, DIMENSION(D%NIJT,D%NKT) :: LLW3D REAL, DIMENSION(KRR) :: ZRSMIN INTEGER :: ISIZE, IPROMA, IGPBLKS, ISIZE2 ! +LOGICAL :: LSAVE_MICRO ! if true, microphysical tendencies are saved for cloud electricity +REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC),MERGE(IBUNUM-IBUNUM_EXTRA,0,OELEC)) :: & + ZMICRO_TEND ! Total mixing ratio change, used for electric charge tendencies +LOGICAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)) :: GMASK_ELEC +INTEGER :: IELEC ! nb of points where microphysical tendencies are not null +INTEGER :: JI ! loop index +! !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE) ! @@ -352,14 +431,16 @@ ENDDO ! ------------------------------------- ! IF(.NOT. PARAMI%LSEDIM_AFTER) THEN - CALL ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, BUCONF, & - &PTSTEP, KRR, PDZZ, & + CALL ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, BUCONF, & + &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, & &ZZ_LVFACT, ZZ_LSFACT, PRHODREF, PPABST, PTHT, ZT, PRHODJ, & &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, PINPRS, PINPRG, & + &PQCT, PQRT, PQIT, PQST, PQGT, PQCS, PQRS, PQIS, PQSS, PQGS, PEFIELDW, & &TBUDGETS, KBUDGETS, & &PSEA=PSEA, PTOWN=PTOWN, & - &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) + &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR, & + &PQHT=PQHT, PQHS=PQHS) ENDIF ! ! @@ -395,7 +476,7 @@ ENDDO !* 4. COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF LLMICRO POINTS ! ----------------------------------------------------------------- ! -!The nucelation must be call everywhere +!The nucleation must be called everywhere !This call is for points outside of the LLMICR mask, another call is coded in ice4_tendencies LLW3D(:,:)=.FALSE. DO JK=IKTB,IKTE @@ -444,10 +525,17 @@ ELSE IPROMA=0 ISIZE2=ISIZE ENDIF +! +!Microphysical tendencies must be saved for some physical parameterizations +IF (OELEC) THEN + LSAVE_MICRO = .TRUE. + ZMICRO_TEND(:,:,:) = 0. +END IF +! !This part is put in another routine to separate pack/unpack operations from computations CALL ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF, & IPROMA, ISIZE, ISIZE2, & - PTSTEP, KRR, LLMICRO, PEXN, & + PTSTEP, KRR, LSAVE_MICRO, LLMICRO, OELEC, PEXN, & PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & @@ -456,15 +544,105 @@ CALL ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF, & ZZ_RVHENI, ZZ_LVFACT, ZZ_LSFACT, & ZWR, & TBUDGETS, KBUDGETS, & - PRHS ) + ZMICRO_TEND, PLATHAM_IAGGS, PRHS ) +! ! !------------------------------------------------------------------------------- ! -!* 6. TOTAL TENDENCIES +!* 7. CALL TO PHYSICAL PARAMETERIZATIONS CLOSELY LINKED TO MICROPHYSICS +! ----------------------------------------------------------------- +! +! Cloud electrification, water isotopes and aqueous chemistry need the mixing ratio tendencies +! to compute the evolution of electric charges, water isotopes and ... +! +!* 7.1 Cloud electrification +! +IF (OELEC) THEN + DO JK = IKTB, IKTE + DO JIJ = IIJB, IIJE + DO JI = 1, IBUNUM-IBUNUM_EXTRA + ZMICRO_TEND(JIJ,JK,JI) = ZMICRO_TEND(JIJ,JK,JI) * ZINV_TSTEP + ! + ! transfer of electric charges occurs only where transfer of mass is non null + GMASK_ELEC(JIJ,JK) = GMASK_ELEC(JIJ,JK) .OR. (ZMICRO_TEND(JIJ,JK,JI) .NE. 0.) + END DO + END DO + END DO + ! + IELEC = COUNT(GMASK_ELEC) + ! + ! RVHENI : ajout de prvheni ? + ! traitement des deux termes extra ? irwetgh_mr et irsrimcg_mr ? + IF (KRR == 7) THEN + CALL ELEC_TENDENCIES(D, KRR, IELEC, PTSTEP, GMASK_ELEC, & + PRHODREF, PRHODJ, ZT, PCIT, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT, & + PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & + ZMICRO_TEND(:,:,IRVHENI_MR), ZMICRO_TEND(:,:,IRRHONG_MR), & + ZMICRO_TEND(:,:,IRIMLTC_MR), ZMICRO_TEND(:,:,IRCHONI), & + ZMICRO_TEND(:,:,IRVDEPS), ZMICRO_TEND(:,:,IRIAGGS), & + ZMICRO_TEND(:,:,IRIAUTS), ZMICRO_TEND(:,:,IRVDEPG), & + ZMICRO_TEND(:,:,IRCAUTR), ZMICRO_TEND(:,:,IRCACCR), & + ZMICRO_TEND(:,:,IRREVAV), ZMICRO_TEND(:,:,IRCRIMSS), & + ZMICRO_TEND(:,:,IRCRIMSG), ZMICRO_TEND(:,:,IRSRIMCG), & + ZMICRO_TEND(:,:,IRRACCSS), ZMICRO_TEND(:,:,IRRACCSG), & + ZMICRO_TEND(:,:,IRSACCRG), ZMICRO_TEND(:,:,IRSMLTG), & + ZMICRO_TEND(:,:,IRICFRRG), ZMICRO_TEND(:,:,IRRCFRIG), & + ZMICRO_TEND(:,:,IRCWETG), ZMICRO_TEND(:,:,IRIWETG), & + ZMICRO_TEND(:,:,IRRWETG), ZMICRO_TEND(:,:,IRSWETG), & + ZMICRO_TEND(:,:,IRCDRYG), ZMICRO_TEND(:,:,IRIDRYG), & + ZMICRO_TEND(:,:,IRRDRYG), ZMICRO_TEND(:,:,IRSDRYG), & + ZMICRO_TEND(:,:,IRGMLTR), ZMICRO_TEND(:,:,IRCBERI), & + PRCMLTSR=ZMICRO_TEND(:,:,IRCMLTSR), PRICFRR=ZMICRO_TEND(:,:,IRICFRR),& + PRWETGH=ZMICRO_TEND(:,:,IRWETGH), & + PRCWETH=ZMICRO_TEND(:,:,IRCWETH), PRIWETH=ZMICRO_TEND(:,:,IRIWETH), & + PRSWETH=ZMICRO_TEND(:,:,IRSWETH), & + PRGWETH=ZMICRO_TEND(:,:,IRGWETH), PRRWETH=ZMICRO_TEND(:,:,IRRWETH), & + PRCDRYH=ZMICRO_TEND(:,:,IRCDRYH), PRIDRYH=ZMICRO_TEND(:,:,IRIDRYH), & + PRSDRYH=ZMICRO_TEND(:,:,IRSDRYH), & + PRRDRYH=ZMICRO_TEND(:,:,IRRDRYH), PRGDRYH=ZMICRO_TEND(:,:,IRGDRYH), & + PRDRYHG=ZMICRO_TEND(:,:,IRDRYHG), PRHMLTR=ZMICRO_TEND(:,:,IRHMLTR), & + PRHT=PRHT, PRHS=PRHS, PQHT=PQHT, PQHS=PQHS ) + ELSE + CALL ELEC_TENDENCIES(D, KRR, ISIZE, PTSTEP, LLMICRO, & + PRHODREF, PRHODJ, ZT, PCIT, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT, & + PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & + ZMICRO_TEND(:,:,IRVHENI_MR), ZMICRO_TEND(:,:,IRRHONG_MR), & + ZMICRO_TEND(:,:,IRIMLTC_MR), ZMICRO_TEND(:,:,IRCHONI), & + ZMICRO_TEND(:,:,IRVDEPS), ZMICRO_TEND(:,:,IRIAGGS), & + ZMICRO_TEND(:,:,IRIAUTS), ZMICRO_TEND(:,:,IRVDEPG), & + ZMICRO_TEND(:,:,IRCAUTR), ZMICRO_TEND(:,:,IRCACCR), & + ZMICRO_TEND(:,:,IRREVAV), ZMICRO_TEND(:,:,IRCRIMSS), & + ZMICRO_TEND(:,:,IRCRIMSG), ZMICRO_TEND(:,:,IRSRIMCG), & + ZMICRO_TEND(:,:,IRRACCSS), ZMICRO_TEND(:,:,IRRACCSG), & + ZMICRO_TEND(:,:,IRSACCRG), ZMICRO_TEND(:,:,IRSMLTG), & + ZMICRO_TEND(:,:,IRICFRRG), ZMICRO_TEND(:,:,IRRCFRIG), & + ZMICRO_TEND(:,:,IRCWETG), ZMICRO_TEND(:,:,IRIWETG), & + ZMICRO_TEND(:,:,IRRWETG), ZMICRO_TEND(:,:,IRSWETG), & + ZMICRO_TEND(:,:,IRCDRYG), ZMICRO_TEND(:,:,IRIDRYG), & + ZMICRO_TEND(:,:,IRRDRYG), ZMICRO_TEND(:,:,IRSDRYG), & + ZMICRO_TEND(:,:,IRGMLTR), ZMICRO_TEND(:,:,IRCBERI), & + PRCMLTSR=ZMICRO_TEND(:,:,IRCMLTSR), PRICFRR=ZMICRO_TEND(:,:,IRICFRR)) + END IF +END IF +! +! +!* 7.2 Water isotopologues +! +! +!* 7.3 Aqueous chemistry +! +! +!------------------------------------------------------------------------------- +! +!* 8. TOTAL TENDENCIES ! ---------------- ! ! -!*** 6.1 total tendencies limited by available species +!*** 8.1 total tendencies limited by available species ! DO JK = IKTB, IKTE DO JIJ=IIJB, IIJE @@ -504,7 +682,7 @@ DO JK = IKTB, IKTE ENDDO !------------------------------------------------------------------------------- ! -!*** 6.2 Negative corrections +!*** 8.2 Negative corrections ! !NOTE: ! This call cannot be moved before the preeceding budget calls because, @@ -525,11 +703,16 @@ IF(BUCONF%LBU_ENABLE) THEN IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'CORR', PRGS(:, :)*PRHODJ(:, :)) IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'CORR', PRHS(:, :)*PRHODJ(:, :)) END IF +!++cb-- ajouter les bilans pour l'elec !!! !We correct negativities with conservation CALL ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRVS, PRCS, PRRS, & &PRIS, PRSS, PRGS, & &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS) +!CALL ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, OELEC, PRVS, PRCS, PRRS, & +! &PRIS, PRSS, PRGS, & +! &PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & +! &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS, PQHS) IF (BUCONF%LBU_ENABLE) THEN IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'CORR', PTHS(:, :)*PRHODJ(:, :)) @@ -544,19 +727,21 @@ END IF ! !------------------------------------------------------------------------------- ! -!* 7. COMPUTE THE SEDIMENTATION (RS) SOURCE +!* 9. COMPUTE THE SEDIMENTATION (RS) SOURCE ! ------------------------------------- ! IF(PARAMI%LSEDIM_AFTER) THEN - CALL ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, BUCONF, & - &PTSTEP, KRR, PDZZ, & + CALL ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, BUCONF, & + &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, & &ZZ_LVFACT, ZZ_LSFACT, PRHODREF, PPABST, PTHT, ZT, PRHODJ, & &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, PINPRS, PINPRG, & + &PQCT, PQRT, PQIT, PQST, PQGT, PQCS, PQRS, PQIS, PQSS, PQGS, PEFIELDW, & &TBUDGETS, KBUDGETS, & &PSEA=PSEA, PTOWN=PTOWN, & - &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) - + &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR, & + &PQHT=PQHT, PQHS=PQHS) + !"sedimentation" of rain fraction DO JK = IKTB, IKTE DO JIJ=IIJB,IIJE @@ -579,7 +764,7 @@ ENDIF ! !------------------------------------------------------------------------------- ! -!* 8. COMPUTE THE FOG DEPOSITION TERM +!* 10. COMPUTE THE FOG DEPOSITION TERM ! ------------------------------------- ! IF (PARAMI%LDEPOSC) THEN !cloud water deposition on vegetation diff --git a/src/PHYEX/turb/modi_turb.f90 b/src/PHYEX/turb/modi_turb.f90 index f7141ca30fca10492d45724fba9bc77b5e8ec1fb..302d34ae89dbb7fc4ff5b39440d9495b3da70b78 100644 --- a/src/PHYEX/turb/modi_turb.f90 +++ b/src/PHYEX/turb/modi_turb.f90 @@ -12,7 +12,7 @@ INTERFACE & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & - & HTURBLEN_CL,HCLOUD, & + & HTURBLEN_CL,HCLOUD,HELEC, & & PTSTEP,TPFILE, & & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & @@ -72,6 +72,7 @@ LOGICAL, INTENT(IN) :: ODIAG_IN_RUN ! switch to activate onlin LOGICAL, INTENT(IN) :: OIBM ! switch to modity mixing length near building with IBM CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme +CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of cloud electricity scheme REAL, INTENT(IN) :: PRSNOW ! Ratio for diffusion coeff. scalar (blowing snow) REAL, INTENT(IN) :: PTSTEP ! timestep TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file diff --git a/src/PHYEX/turb/turb.f90 b/src/PHYEX/turb/turb.f90 index 5549a0c826674351524f2707876a10a87816e827..42b1d1cb8485d0e037f5b0264d79ffc8c090e022 100644 --- a/src/PHYEX/turb/turb.f90 +++ b/src/PHYEX/turb/turb.f90 @@ -10,7 +10,7 @@ & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & - & HTURBLEN_CL,HCLOUD, & + & HTURBLEN_CL,HCLOUD,HELEC, & & PTSTEP,TPFILE, & & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & @@ -234,6 +234,7 @@ ! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct ! R. Honnert/V. Masson 02/2021: new mixing length in the grey zone ! J.L. Redelsperger 03/2021: add Ocean LES case +! C. Barthe 08/02/2022: add helec in arguments of Sources_neg_correct ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -313,6 +314,8 @@ LOGICAL, INTENT(IN) :: ODIAG_IN_RUN ! switch to activate onlin LOGICAL, INTENT(IN) :: OIBM ! switch to modity mixing length near building with IBM CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme +CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of cloud electricity scheme + REAL, INTENT(IN) :: PRSNOW ! Ratio for diffusion coeff. scalar (blowing snow) REAL, INTENT(IN) :: PTSTEP ! timestep TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file @@ -1314,7 +1317,7 @@ IF ( KRRL >= 1 ) THEN END IF ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -CALL SOURCES_NEG_CORRECT_PHY(D,KSV,HCLOUD, 'NETUR',KRR,PTSTEP,PPABST,PTHLT,PRT,PRTHLS,PRRS,PRSVS) +CALL SOURCES_NEG_CORRECT_PHY(D,KSV,HCLOUD,HELEC,'NETUR',KRR,PTSTEP,PPABST,PTHLT,PRT,PRTHLS,PRRS,PRSVS) !---------------------------------------------------------------------------- ! !* 9. LES averaged surface fluxes