SCALE-RM
Functions/Subroutines | Variables
scale_atmos_phy_mp_sn14 Module Reference

module ATMOSPHERE / Physics Cloud Microphysics More...

Functions/Subroutines

subroutine, public atmos_phy_mp_sn14_setup (KA, IA, JA)
 ATMOS_PHY_MP_sn14_setup setup. More...
 
subroutine, public atmos_phy_mp_sn14_finalize
 finalize More...
 
subroutine, public atmos_phy_mp_sn14_tendency (KA, KS, KE, IA, IS, IE, JA, JS, JE, DENS, W, QTRC, PRES, TEMP, Qdry, CPtot, CVtot, CCN, dt, cz, fz, RHOQ_t, RHOE_t, CPtot_t, CVtot_t, EVAPORATE, flg_lt, d0_crg, v0_crg, dqcrg, beta_crg, QTRC_crg, QSPLT_in, Sarea, RHOQcrg_t)
 ATMOS_PHY_MP_sn14_tendency calculate tendency. More...
 
subroutine, public atmos_phy_mp_sn14_cloud_fraction (KA, KS, KE, IA, IS, IE, JA, JS, JE, QTRC, mask_criterion, cldfrac)
 ATMOS_PHY_MP_sn14_cloud_fraction Calculate Cloud Fraction. More...
 
subroutine, public atmos_phy_mp_sn14_effective_radius (KA, KS, KE, IA, IS, IE, JA, JS, JE, DENS0, TEMP0, QTRC0, Re)
 ATMOS_PHY_MP_sn14_effective_radius Calculate Effective Radius. More...
 
subroutine, public atmos_phy_mp_sn14_qtrc2qhyd (KA, KS, KE, IA, IS, IE, JA, JS, JE, QTRC0, Qe)
 ATMOS_PHY_MP_sn14_qtrc2qhyd Calculate mass ratio of each category. More...
 
subroutine, public atmos_phy_mp_sn14_qtrc2nhyd (KA, KS, KE, IA, IS, IE, JA, JS, JE, QTRC0, Ne)
 Calculate number concentration of each category. More...
 
subroutine, public atmos_phy_mp_sn14_qhyd2qtrc (KA, KS, KE, IA, IS, IE, JA, JS, JE, Qe, QTRC, QNUM)
 
subroutine, public atmos_phy_mp_sn14_terminal_velocity (KA, KS, KE, DENS, TEMP, RHOQ, PRES, vterm)
 ATMOS_PHY_MP_sn14_terminal_velocity Calculate terminal velocity. More...
 
subroutine debug_tem (KA, KS, KE, point, i, j, tem, rho, pre, qv)
 
subroutine nucleation (KA, KS, KE, cz, fz, w, rho, tem, pre, qdry, rhoq, cpa, cva, dTdt_rad, qke, CCN, nc_uplim_d, dt, dq_xa, vt_xa, PQ)
 
subroutine nucleation_ice_hom (KA, KS, KE, tem, pre, rho, qd, rhoq_qv, cva, cpa, w, dTdt_rad, dTdt_dep, PLIdep, dt, PLIhom, PNIhom)
 
subroutine ice_multiplication (KA, KS, KE, flg_lt, Pac, tem, rhoq, rhoq_crg, xq, PQ, Pcrg1)
 
subroutine mixed_phase_collection (KA, KS, KE, flg_lt, d0_crg, v0_crg, beta_crg, dqcrg, wtem, rhoq, rhoq_crg, xq, dq_xave, vt_xave, PQ, Pcrg1, Pcrg2, Pac)
 
subroutine mixed_phase_collection_bin (KA, KS, KE, flg_lt, d0_crg, v0_crg, beta_crg, dqcrg, wtem, rhoq, rhoq_crg, xq, dq_xave, vt_xave, rho, PQ, Pcrg1, Pcrg2, Pac)
 
subroutine aut_acc_slc_brk (KA, KS, KE, flg_lt, rhoq, rhoq_crg, xq, dq_xave, rho, PQ, Pcrg)
 
subroutine dep_vapor_ice_wrk (KA, KS, KE, PLIdep_total, rho, tem, pre, qd, esi, qsi, rhoq, vt_xave, dq_xave, dt)
 
subroutine freezing_water (KA, KS, KE, dt, rhoq, xq, tem, PQ)
 
subroutine cross_section (KA, KS, KE, QA_MP, QTRC0, DENS0, Crs)
 Calculate Cross Section. More...
 

Variables

integer, parameter, public qa_mp = 11
 
integer, parameter, public atmos_phy_mp_sn14_ntracers = QA_MP
 
integer, parameter, public atmos_phy_mp_sn14_nwaters = 2
 
integer, parameter, public atmos_phy_mp_sn14_nices = 3
 
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_names = (/ 'QV', 'QC', 'QR', 'QI', 'QS', 'QG', 'NC', 'NR', 'NI', 'NS', 'NG' /)
 
character(len=h_mid), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_descriptions = (/ 'Ratio of Water Vapor mass to total mass (Specific humidity)', 'Ratio of Cloud Water mass to total mass ', 'Ratio of Rain Water mass to total mass ', 'Ratio of Cloud Ice mass ratio to total mass ', 'Ratio of Snow mass ratio to total mass ', 'Ratio of Graupel mass ratio to total mass ', 'Cloud Water Number Density ', 'Rain Water Number Density ', 'Cloud Ice Number Density ', 'Snow Number Density ', 'Graupel Number Density '/)
 
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_units = (/ 'kg/kg ', 'kg/kg ', 'kg/kg ', 'kg/kg ', 'kg/kg ', 'kg/kg ', 'num/kg', 'num/kg', 'num/kg', 'num/kg', 'num/kg' /)
 

Detailed Description

module ATMOSPHERE / Physics Cloud Microphysics

Description
Cloud Microphysics by 6 water category, double moment bulk scheme Seiki and Nakajima(2014) J. Atmos. Sci., 71, 833-853

Reference: – Journals Seifert and Beheng(2006) : Meteorol.Atmos.Phys.,vol.92,pp.45-66 Seifert and Beheng(2001) : Atmos.Res.,vol.59-60,pp.265-281 Seifert(2008) : J.Atmos.Sci.,vol.65,pp.3608-3619 Lin et al.(1983) : J.Appl.Meteor.,vol.22,pp.1065-1092 Ruttledge and Hobbs(1983) : J.Atmos.Sci.,vol.40,pp.1185-1206 Ruttledge and Hobbs(1984) : J.Atmos.Sci.,vol.40,pp.2949-2977 Cotton etal.(1986) : J.C.Appl.Meteor.,25,pp.1658-1680 Cotton and Field (2002) : QJRMS.,vol.128,pp2417-pp2437 Beard(1980) : J.Atmos.Sci.,vol.37,pp.1363-1374 [Add] 10/08/03 Berry and Reinhardt(1974a): J.Atmos.Sci.,vol.31,pp.1814-1824 Berry and Reinhardt(1974b): J.Atmos.Sci.,vol.31,pp.1825-1831 Fu(1996) : J.Climate, vol.9, pp.2058-2082 [Add] 10/08/03 Fu etal(1998) : J.Climate, vol.11, pp.2223-2237 [Add] 10/08/03 Ghan etal.(1997) : J.Geophys.Res.,vol.102,pp.21777-21794, [Add] 09/08/18 Hong et al.(2004) : Mon.Wea.Rev.,pp.103-120 Heymsfeild and Iaquinta(2000): J.Atmos.Sci., vol.57, pp.916-938 [Add] 10/08/03 Heymsfield and Kajikawa(1987): J.Atmos.Sci., vol.44, pp.1088-1099 Johnson(1981) : J.Atmos.Sci., vol.38, pp.215-218 [Add] 09/08/18 McFarquhar and Heymsfield(1996): J.Atmos.Sci.,vol.53,pp.2401-2423 Mitchell(1996) : J.Atmos.Sci., vol.53, pp.1710-1723. [Add] 10/08/03 Morrison etal.(2005) : Mon.Wea.Rev.,vol.62,pp.1665-1677, [Add] 09/08/18 Locatelli and Hobbs (1974): J.Geophys.Res., vol.70, pp.2185-2197 Lohmann(2002) : J.Atmos.Sci.,vol.59,pp.647-656 Takano and Liou(1989) : J.Atmos.Sci.,vol.46,pp.3-19 Takano and Liou(1994) : J.Atmos.Sci.,vol.52,pp.818-837 Auer and Veal(1970) : J.Atmos.Sci.,vol.27,pp.919-926 Ikawa et al.(1991) : J.M.S.J.,vol.69,pp.641-667 Murakami(1990) : J.M.S.J.,vol.68,pp.107-128 – Books Pruppacher and Klett(1997): Kluwer Academic Publishers Microphysics of Clouds and Precipitation, 2nd.edit. Seinfeld and Pandis(1998) : Wiley Interscience Atmospheric Chemistry and Physics. Jacobson(2005) : Cambridge press Fundamentals of Atmospheric Modeling, 2nd.edit.

Author
Team SCALE
NAMELIST
  • PARAM_ATMOS_PHY_MP_SN14
    nametypedefault valuecomment
    MP_DOAUTOCONVERSION logical .true.
    MP_SSW_LIM real(RP) 1.E+1_RP
    MP_COUPLE_AEROSOL logical .false. apply CCN effect?

  • PARAM_ATMOS_PHY_MP_SN14_init
    nametypedefault valuecomment
    OPT_DEBUG logical .false.
    OPT_DEBUG_INC logical .true.
    OPT_DEBUG_ACT logical .true.
    OPT_DEBUG_REE logical .true.
    OPT_DEBUG_BCS logical .true.
    OPT_COLLECTION_BIN logical .false. SO22
    NTMAX_PHASE_CHANGE integer 1
    NTMAX_COLLECTION integer 1

  • PARAM_ATMOS_PHY_MP_SN14_particles
    nametypedefault valuecomment
    A_M real(RP), dimension(HYDRO_MAX)
    B_M real(RP), dimension(HYDRO_MAX)
    ALPHA_V real(RP), dimension(HYDRO_MAX,2)
    BETA_V real(RP), dimension(HYDRO_MAX,2)
    GAMMA_V real(RP), dimension(HYDRO_MAX)
    ALPHA_VN real(RP), dimension(HYDRO_MAX,2)
    BETA_VN real(RP), dimension(HYDRO_MAX,2)
    A_AREA real(RP), dimension(HYDRO_MAX)
    B_AREA real(RP), dimension(HYDRO_MAX)
    CAP real(RP), dimension(HYDRO_MAX)
    NU real(RP), dimension(HYDRO_MAX)
    MU real(RP), dimension(HYDRO_MAX)
    OPT_M96_COLUMN_ICE logical .false.
    OPT_M96_ICE logical .true.
    AR_ICE_FIX real(RP) 0.7_RP

  • PARAM_ATMOS_PHY_MP_SN14_nucleation
    nametypedefault valuecomment
    IN_MAX real(RP) 1000.E+3_RP max num. of Ice-Nuclei [num/m3]
    C_CCN real(RP) 1.00E+8_RP
    KAPPA real(RP)
    NM_M92 real(RP) 1.E+3_RP
    AM_M92 real(RP) -0.639_RP
    BM_M92 real(RP) 12.96_RP
    XC_CCN real(RP) 1.E-12_RP [kg]
    XI_CCN real(RP) 1.E-12_RP [kg] ! [move] 11/08/30 T.Mitsui
    TEM_CCN_LOW real(RP) 233.150_RP = -40 degC ! [Add] 10/08/03 T.Mitsui
    TEM_IN_LOW real(RP) 173.150_RP = -100 degC ! [Add] 10/08/03 T.Mitsui
    SSW_MAX real(RP) 1.1_RP [%]
    SSI_MAX real(RP) 0.60_RP
    NUCL_TWOMEY logical .false.
    INUCL_W logical .false.
    SO22_HET logical .false. SO22
    OPT_NUCLEATION_ICE_HOM logical .false. SO22

  • PARAM_ATMOS_PHY_MP_SN14_collection
    nametypedefault valuecomment
    DC0 real(RP) 15.0E-6_RP lower threshold of cloud
    DC1 real(RP) 40.0E-6_RP upper threshold of cloud
    DI0 real(RP) 150.0E-6_RP lower threshold of cloud
    DS0 real(RP) 150.0E-6_RP lower threshold of cloud
    DG0 real(RP) 150.0E-6_RP lower threshold of cloud
    SIGMA_C real(RP) 0.00_RP cloud
    SIGMA_R real(RP) 0.00_RP rain
    SIGMA_I real(RP) 0.2_RP ice
    SIGMA_S real(RP) 0.2_RP snow
    SIGMA_G real(RP) 0.00_RP graupel
    OPT_STICK_KS96 logical .false.
    OPT_STICK_CO86 logical .false.
    E_IM real(RP) 0.80_RP ice max
    E_SM real(RP) 0.80_RP snow max
    E_GM real(RP) 1.00_RP graupel max
    E_IR real(RP) 1.0_RP ice x rain
    E_SR real(RP) 1.0_RP snow x rain
    E_GR real(RP) 1.0_RP graupel x rain
    E_II real(RP) 1.0_RP ice x ice
    E_SI real(RP) 1.0_RP snow x ice
    E_GI real(RP) 1.0_RP graupel x ice
    E_SS real(RP) 1.0_RP snow x snow
    E_GS real(RP) 1.0_RP graupel x snow
    E_GG real(RP) 1.0_RP graupel x graupel
    I_ICONV2G integer 1 ice => graupel
    I_SCONV2G integer 1 snow => graupel
    RHO_G real(RP) 900.0_RP [kg/m3]
    CFILL_I real(RP) 0.68_RP ice
    CFILL_S real(RP) 0.01_RP snow
    DI_CRI real(RP) 500.E-6_RP [m]

  • PARAM_ATMOS_PHY_MP_SN14_collection_bin
    nametypedefault valuecomment
    DC0 real(RP) 15.0E-6_RP lower threshold of cloud
    DC1 real(RP) 40.0E-6_RP upper threshold of cloud
    DI0 real(RP) 150.0E-6_RP lower threshold of cloud
    DS0 real(RP) 150.0E-6_RP lower threshold of cloud
    DG0 real(RP) 150.0E-6_RP lower threshold of cloud
    OPT_STICK_KS96 logical .false.
    OPT_STICK_CO86 logical .false.
    TEM_MIN_ESTICK real(RP) 253.0_RP
    OPT_STICK_RHH57 logical .false.
    OPT_STICK_RHKS96 logical .false.
    OPT_STICK_C12 logical .false.
    E_IM real(RP) 0.80_RP ice max
    E_SM real(RP) 0.80_RP snow max
    E_GM real(RP) 1.00_RP graupel max
    E_IR real(RP) 1.0_RP ice x rain
    E_SR real(RP) 1.0_RP snow x rain
    E_GR real(RP) 1.0_RP graupel x rain
    E_II real(RP) 1.0_RP ice x ice
    E_SI real(RP) 1.0_RP snow x ice
    E_GI real(RP) 1.0_RP graupel x ice
    E_SS real(RP) 1.0_RP snow x snow
    E_GS real(RP) 1.0_RP graupel x snow
    E_GG real(RP) 1.0_RP graupel x graupel
    I_ICONV2G integer 1 ice => graupel
    I_SCONV2G integer 1 snow => graupel
    RHO_G real(RP) 900.0_RP [kg/m3]
    CFILL_I real(RP) 0.68_RP ice
    CFILL_S real(RP) 0.01_RP snow
    DI_CRI real(RP) 500.E-6_RP [m]

  • PARAM_ATMOS_PHY_MP_SN14_condensation
    nametypedefault valuecomment
    OPT_FIX_TAUCND_C logical .false.
    FAC_CNDC real(RP) 1.0_RP

History Output
namedescriptionunitvariable
I_CGNGacNI2NG individual tendency term in SN14 kg/kg/s I_CGNGacNI2NG

Function/Subroutine Documentation

◆ atmos_phy_mp_sn14_setup()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_setup ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  JA 
)

ATMOS_PHY_MP_sn14_setup setup.

Definition at line 714 of file scale_atmos_phy_mp_sn14.F90.

716  use scale_prc, only: &
717  prc_abort
718  use scale_file_history, only: &
720  implicit none
721  integer, intent(in) :: KA
722  integer, intent(in) :: IA
723  integer, intent(in) :: JA
724 
725  namelist / param_atmos_phy_mp_sn14 / &
726  mp_doautoconversion, &
727  mp_ssw_lim, &
728  mp_couple_aerosol
729 
730  integer :: ip
731  integer :: ierr
732  !---------------------------------------------------------------------------
733 
734  log_newline
735  log_info("ATMOS_PHY_MP_sn14_setup",*) 'Setup'
736  log_info("ATMOS_PHY_MP_sn14_setup",*) 'Seiki and Nakajima (2014) 2-moment bulk 6 category'
737 
738  !--- read namelist
739  rewind(io_fid_conf)
740  read(io_fid_conf,nml=param_atmos_phy_mp_sn14,iostat=ierr)
741  if( ierr < 0 ) then !--- missing
742  log_info("ATMOS_PHY_MP_sn14_setup",*) 'Not found namelist. Default used.'
743  elseif( ierr > 0 ) then !--- fatal error
744  log_error("ATMOS_PHY_MP_sn14_setup",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_MP_SN14. Check!'
745  call prc_abort
746  endif
747  log_nml(param_atmos_phy_mp_sn14)
748 
749  call mp_sn14_init
750 
751  allocate(nc_uplim_d(1,ia,ja))
752  nc_uplim_d(:,:,:) = 150.e6_rp
753 
754  hist_max = 0
755  hist_idx(:) = -1
756  do ip = 1, w_nmax
757  call file_history_reg( w_name(ip), 'individual tendency term in SN14', 'kg/kg/s', &
758  hist_id(ip) )
759  if ( hist_id(ip) > 0 ) then
760  hist_max = hist_max + 1
761  hist_idx(ip) = hist_max
762  end if
763  enddo
764  allocate( w3d(ka,ia,ja,hist_max) )
765  w3d(:,:,:,:) = 0.0_rp
766 
767  return
module file_history
subroutine, public file_history_reg(name, desc, unit, itemid, standard_name, ndims, dim_type, cell_measures, fill_halo)
Register/Append variable to history file.
module PROCESS
Definition: scale_prc.F90:11
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:350

References scale_file_history::file_history_reg(), scale_io::io_fid_conf, and scale_prc::prc_abort().

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_setup().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ atmos_phy_mp_sn14_finalize()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_finalize

finalize

Definition at line 772 of file scale_atmos_phy_mp_sn14.F90.

773 
774  deallocate(nc_uplim_d)
775  deallocate(w3d)
776 
777  return

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_finalize().

Here is the caller graph for this function:

◆ atmos_phy_mp_sn14_tendency()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_tendency ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
integer, intent(in)  IA,
integer, intent(in)  IS,
integer, intent(in)  IE,
integer, intent(in)  JA,
integer, intent(in)  JS,
integer, intent(in)  JE,
real(rp), dimension (ka,ia,ja), intent(in)  DENS,
real(rp), dimension (ka,ia,ja), intent(in)  W,
real(rp), dimension (ka,ia,ja,qa_mp), intent(in)  QTRC,
real(rp), dimension(ka,ia,ja), intent(in)  PRES,
real(rp), dimension(ka,ia,ja), intent(in)  TEMP,
real(rp), dimension(ka,ia,ja), intent(in)  Qdry,
real(rp), dimension(ka,ia,ja), intent(in)  CPtot,
real(rp), dimension(ka,ia,ja), intent(in)  CVtot,
real(rp), dimension (ka,ia,ja), intent(in)  CCN,
real(dp), intent(in)  dt,
real(rp), dimension( ka,ia,ja), intent(in)  cz,
real(rp), dimension(0:ka,ia,ja), intent(in)  fz,
real(rp), dimension (ka,ia,ja,qa_mp), intent(out)  RHOQ_t,
real(rp), dimension (ka,ia,ja), intent(out)  RHOE_t,
real(rp), dimension(ka,ia,ja), intent(out)  CPtot_t,
real(rp), dimension(ka,ia,ja), intent(out)  CVtot_t,
real(rp), dimension(ka,ia,ja), intent(out)  EVAPORATE,
logical, intent(in), optional  flg_lt,
real(rp), intent(in), optional  d0_crg,
real(rp), intent(in), optional  v0_crg,
real(rp), dimension(ka,ia,ja), intent(in), optional  dqcrg,
real(rp), dimension(ka,ia,ja), intent(in), optional  beta_crg,
real(rp), dimension(ka,ia,ja,hydro_max), intent(in), optional  QTRC_crg,
real(rp), dimension(ka,ia,ja,3), intent(out), optional  QSPLT_in,
real(rp), dimension(ka,ia,ja,hydro_max), intent(out), optional  Sarea,
real(rp), dimension(ka,ia,ja,hydro_max), intent(out), optional  RHOQcrg_t 
)

ATMOS_PHY_MP_sn14_tendency calculate tendency.

Definition at line 784 of file scale_atmos_phy_mp_sn14.F90.

810  implicit none
811 
812  integer, intent(in) :: KA, KS, KE
813  integer, intent(in) :: IA, IS, IE
814  integer, intent(in) :: JA, JS, JE
815 
816  real(RP), intent(in) :: DENS (KA,IA,JA)
817  real(RP), intent(in) :: W (KA,IA,JA)
818  real(RP), intent(in) :: QTRC (KA,IA,JA,QA_MP)
819  real(RP), intent(in) :: PRES(KA,IA,JA)
820  real(RP), intent(in) :: TEMP(KA,IA,JA)
821  real(RP), intent(in) :: Qdry(KA,IA,JA)
822  real(RP), intent(in) :: CPtot(KA,IA,JA)
823  real(RP), intent(in) :: CVtot(KA,IA,JA)
824  real(RP), intent(in) :: CCN (KA,IA,JA)
825  real(DP), intent(in) :: dt
826  real(RP), intent(in) :: cz( KA,IA,JA)
827  real(RP), intent(in) :: fz(0:KA,IA,JA)
828 
829  real(RP), intent(out) :: RHOQ_t (KA,IA,JA,QA_MP)
830  real(RP), intent(out) :: RHOE_t (KA,IA,JA)
831  real(RP), intent(out) :: CPtot_t(KA,IA,JA)
832  real(RP), intent(out) :: CVtot_t(KA,IA,JA)
833  real(RP), intent(out) :: EVAPORATE(KA,IA,JA) !--- number of evaporated cloud [/m3]
834 
835  ! Optional for Lightning
836  logical, intent(in), optional :: flg_lt
837  real(RP), intent(in), optional :: d0_crg, v0_crg
838  real(RP), intent(in), optional :: dqcrg(KA,IA,JA)
839  real(RP), intent(in), optional :: beta_crg(KA,IA,JA)
840  real(RP), intent(in), optional :: QTRC_crg(KA,IA,JA,HYDRO_MAX)
841  real(RP), intent(out), optional :: QSPLT_in(KA,IA,JA,3)
842  real(RP), intent(out), optional :: Sarea(KA,IA,JA,HYDRO_MAX)
843  real(RP), intent(out), optional :: RHOQcrg_t(KA,IA,JA,HYDRO_MAX)
844  !---------------------------------------------------------------------------
845 
846  log_progress(*) 'atmosphere / physics / microphysics / SN14'
847 
848 #ifdef PROFILE_FIPP
849  call fipp_start()
850 #endif
851 
852  !##### MP Main #####
853  call mp_sn14 ( &
854  ka, ks, ke, ia, is, ie, ja, js, je, &
855  dens(:,:,:), w(:,:,:), qtrc(:,:,:,:), pres(:,:,:), temp(:,:,:), & ! (in)
856  qdry(:,:,:), cptot(:,:,:), cvtot(:,:,:), ccn(:,:,:), & ! (in)
857  real(dt,RP), cz(:,:,:), fz(:,:,:), & ! (in)
858  RHOQ_t(:,:,:,:), RHOE_t(:,:,:), CPtot_t(:,:,:), CVtot_t(:,:,:), & ! (out)
859  EVAPORATE(:,:,:), & ! (out)
860  flg_lt, d0_crg, v0_crg, dqcrg(:,:,:), beta_crg(:,:,:), & ! (optional in)
861  QTRC_crg(:,:,:,:), & ! (optional in)
862  QSPLT_in(:,:,:,:), Sarea(:,:,:,:), RHOQcrg_t(:,:,:,:) ) ! (optional out)
863 
864 #ifdef PROFILE_FIPP
865  call fipp_stop()
866 #endif
867 
868  return

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_calc_tendency().

Here is the caller graph for this function:

◆ atmos_phy_mp_sn14_cloud_fraction()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_cloud_fraction ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
integer, intent(in)  IA,
integer, intent(in)  IS,
integer, intent(in)  IE,
integer, intent(in)  JA,
integer, intent(in)  JS,
integer, intent(in)  JE,
real(rp), dimension (ka,ia,ja,qa_mp-1), intent(in)  QTRC,
real(rp), intent(in)  mask_criterion,
real(rp), dimension(ka,ia,ja), intent(out)  cldfrac 
)

ATMOS_PHY_MP_sn14_cloud_fraction Calculate Cloud Fraction.

Definition at line 875 of file scale_atmos_phy_mp_sn14.F90.

880  implicit none
881  integer, intent(in) :: KA, KS, KE
882  integer, intent(in) :: IA, IS, IE
883  integer, intent(in) :: JA, JS, JE
884 
885  real(RP), intent(in) :: QTRC (KA,IA,JA,QA_MP-1)
886  real(RP), intent(in) :: mask_criterion
887 
888  real(RP), intent(out) :: cldfrac(KA,IA,JA)
889 
890  real(RP) :: qhydro
891  integer :: k, i, j, iq
892  !---------------------------------------------------------------------------
893 
894  !$omp parallel do &
895  !$omp private(qhydro)
896  do j = js, je
897  do i = is, ie
898  do k = ks, ke
899  qhydro = 0.0_rp
900  do iq = i_mp_qc, i_mp_qg
901  qhydro = qhydro + qtrc(k,i,j,iq)
902  enddo
903  cldfrac(k,i,j) = 0.5_rp + sign(0.5_rp,qhydro-mask_criterion)
904  enddo
905  enddo
906  enddo
907 
908  return

Referenced by mod_atmos_phy_mp_vars::atmos_phy_mp_vars_get_diagnostic().

Here is the caller graph for this function:

◆ atmos_phy_mp_sn14_effective_radius()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_effective_radius ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
integer, intent(in)  IA,
integer, intent(in)  IS,
integer, intent(in)  IE,
integer, intent(in)  JA,
integer, intent(in)  JS,
integer, intent(in)  JE,
real(rp), dimension(ka,ia,ja), intent(in)  DENS0,
real(rp), dimension(ka,ia,ja), intent(in)  TEMP0,
real(rp), dimension(ka,ia,ja,i_qc:i_ng), intent(in)  QTRC0,
real(rp), dimension (ka,ia,ja,n_hyd), intent(out)  Re 
)

ATMOS_PHY_MP_sn14_effective_radius Calculate Effective Radius.

Definition at line 914 of file scale_atmos_phy_mp_sn14.F90.

918  use scale_atmos_hydrometeor, only: &
919  n_hyd, &
920  i_hc, &
921  i_hr, &
922  i_hi, &
923  i_hs, &
924  i_hg, &
925  i_hh
926  implicit none
927  integer, intent(in) :: KA, KS, KE
928  integer, intent(in) :: IA, IS, IE
929  integer, intent(in) :: JA, JS, JE
930 
931  real(RP), intent(in) :: DENS0(KA,IA,JA) ! density [kg/m3]
932  real(RP), intent(in) :: TEMP0(KA,IA,JA) ! temperature [K]
933  real(RP), intent(in) :: QTRC0(KA,IA,JA,I_QC:I_NG) ! tracer mass concentration [kg/kg]
934 
935  real(RP), intent(out) :: Re (KA,IA,JA,N_HYD) ! effective radius [cm]
936 
937  ! mass concentration[kg/m3] and mean particle mass[kg]
938  real(RP) :: xc(KA)
939  real(RP) :: xr(KA)
940  real(RP) :: xi(KA)
941  real(RP) :: xs(KA)
942  real(RP) :: xg(KA)
943  ! diameter of average mass[kg/m3]
944  real(RP) :: dc_ave(KA)
945  real(RP) :: dr_ave(KA)
946  ! radius of average mass
947  real(RP) :: rc, rr
948  ! 2nd. and 3rd. order moment of DSD
949  real(RP) :: ri2m(KA), ri3m(KA)
950  real(RP) :: rs2m(KA), rs3m(KA)
951  real(RP) :: rg2m(KA), rg3m(KA)
952 
953  real(RP), parameter :: coef_Fuetal1998 = 3.0_rp / (4.0_rp*rhoi)
954 
955  ! r2m_min is minimum value(moment of 1 particle with 1 micron)
956  real(RP), parameter :: r2m_min=1.e-12_rp
957  real(RP), parameter :: um2cm = 100.0_rp
958 
959  real(RP) :: limitsw, zerosw
960  integer :: k, i, j
961  !---------------------------------------------------------------------------
962 
963  !$omp parallel do &
964  !$omp private(xc,xr,xi,xs,xg,dc_ave,dr_ave,rc,rr,ri2m,ri3m,rs2m,rs3m,rg2m,rg3m, &
965  !$omp limitsw,zerosw)
966  do j = js, je
967  do i = is, ie
968 
969  ! mean particle mass[kg]
970  do k = ks, ke
971  xc(k) = min( xc_max, max( xc_min, dens0(k,i,j)*qtrc0(k,i,j,i_qc)/(qtrc0(k,i,j,i_nc)+nc_min) ) )
972  xr(k) = min( xr_max, max( xr_min, dens0(k,i,j)*qtrc0(k,i,j,i_qr)/(qtrc0(k,i,j,i_nr)+nr_min) ) )
973  xi(k) = min( xi_max, max( xi_min, dens0(k,i,j)*qtrc0(k,i,j,i_qi)/(qtrc0(k,i,j,i_ni)+ni_min) ) )
974  xs(k) = min( xs_max, max( xs_min, dens0(k,i,j)*qtrc0(k,i,j,i_qs)/(qtrc0(k,i,j,i_ns)+ns_min) ) )
975  xg(k) = min( xg_max, max( xg_min, dens0(k,i,j)*qtrc0(k,i,j,i_qg)/(qtrc0(k,i,j,i_ng)+ng_min) ) )
976  enddo
977 
978  ! diameter of average mass : SB06 eq.(32)
979  do k = ks, ke
980  dc_ave(k) = a_m(i_mp_qc) * xc(k)**b_m(i_mp_qc)
981  dr_ave(k) = a_m(i_mp_qr) * xr(k)**b_m(i_mp_qr)
982  enddo
983 
984  ! cloud effective radius
985  do k = ks, ke
986  rc = 0.5_rp * dc_ave(k)
987  limitsw = 0.5_rp + sign(0.5_rp, rc-rmin_re )
988  re(k,i,j,i_hc) = coef_re(i_mp_qc) * rc * limitsw * um2cm
989  enddo
990 
991  ! rain effective radius
992  do k = ks, ke
993  rr = 0.5_rp * dr_ave(k)
994  limitsw = 0.5_rp + sign(0.5_rp, rr-rmin_re )
995  re(k,i,j,i_hr) = coef_re(i_mp_qr) * rr * limitsw * um2cm
996  enddo
997 
998  do k = ks, ke
999  ri2m(k) = pi * coef_rea2(i_mp_qi) * qtrc0(k,i,j,i_ni) * a_rea2(i_mp_qi) * xi(k)**b_rea2(i_mp_qi)
1000  rs2m(k) = pi * coef_rea2(i_mp_qs) * qtrc0(k,i,j,i_ns) * a_rea2(i_mp_qs) * xs(k)**b_rea2(i_mp_qs)
1001  rg2m(k) = pi * coef_rea2(i_mp_qg) * qtrc0(k,i,j,i_ng) * a_rea2(i_mp_qg) * xg(k)**b_rea2(i_mp_qg)
1002  enddo
1003 
1004  ! Fu(1996), eq.(3.11) or Fu et al.(1998), eq.(2.5)
1005  do k = ks, ke
1006  ri3m(k) = coef_fuetal1998 * qtrc0(k,i,j,i_ni) * xi(k)
1007  rs3m(k) = coef_fuetal1998 * qtrc0(k,i,j,i_ns) * xs(k)
1008  rg3m(k) = coef_fuetal1998 * qtrc0(k,i,j,i_ng) * xg(k)
1009  enddo
1010 
1011  ! ice effective radius
1012  do k = ks, ke
1013  zerosw = 0.5_rp - sign(0.5_rp, ri2m(k) - r2m_min )
1014  re(k,i,j,i_hi) = ri3m(k) / ( ri2m(k) + zerosw ) * ( 1.0_rp - zerosw ) * um2cm
1015  enddo
1016 
1017  ! snow effective radius
1018  do k = ks, ke
1019  zerosw = 0.5_rp - sign(0.5_rp, rs2m(k) - r2m_min )
1020  re(k,i,j,i_hs) = rs3m(k) / ( rs2m(k) + zerosw ) * ( 1.0_rp - zerosw ) * um2cm
1021  enddo
1022 
1023  ! graupel effective radius
1024  do k = ks, ke
1025  zerosw = 0.5_rp - sign(0.5_rp, rg2m(k) - r2m_min )
1026  re(k,i,j,i_hg) = rg3m(k) / ( rg2m(k) + zerosw ) * ( 1.0_rp - zerosw ) * um2cm
1027  enddo
1028 
1029  do k = ks, ke
1030  re(k,i,j,i_hh) = 0.0_rp
1031  end do
1032 
1033  enddo
1034  enddo
1035 
1036 
1037  return
module atmosphere / hydrometeor
integer, parameter, public n_hyd
integer, parameter, public i_hc
liquid water cloud
integer, parameter, public i_hs
snow
integer, parameter, public i_hg
graupel
integer, parameter, public i_hh
hail
integer, parameter, public i_hi
ice water cloud
integer, parameter, public i_hr
liquid water rain

References scale_atmos_hydrometeor::i_hc, scale_atmos_hydrometeor::i_hg, scale_atmos_hydrometeor::i_hh, scale_atmos_hydrometeor::i_hi, scale_atmos_hydrometeor::i_hr, scale_atmos_hydrometeor::i_hs, and scale_atmos_hydrometeor::n_hyd.

Referenced by mod_atmos_phy_mp_vars::atmos_phy_mp_vars_get_diagnostic().

Here is the caller graph for this function:

◆ atmos_phy_mp_sn14_qtrc2qhyd()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_qtrc2qhyd ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
integer, intent(in)  IA,
integer, intent(in)  IS,
integer, intent(in)  IE,
integer, intent(in)  JA,
integer, intent(in)  JS,
integer, intent(in)  JE,
real(rp), dimension(ka,ia,ja,qa_mp-1), intent(in)  QTRC0,
real(rp), dimension (ka,ia,ja,n_hyd), intent(out)  Qe 
)

ATMOS_PHY_MP_sn14_qtrc2qhyd Calculate mass ratio of each category.

Definition at line 1043 of file scale_atmos_phy_mp_sn14.F90.

1047  use scale_atmos_hydrometeor, only: &
1048  n_hyd, &
1049  i_hc, &
1050  i_hr, &
1051  i_hi, &
1052  i_hs, &
1053  i_hg, &
1054  i_hh
1055  implicit none
1056  integer, intent(in) :: KA, KS, KE
1057  integer, intent(in) :: IA, IS, IE
1058  integer, intent(in) :: JA, JS, JE
1059 
1060  real(RP), intent(in) :: QTRC0(KA,IA,JA,QA_MP-1) ! tracer mass concentration [kg/kg]
1061 
1062  real(RP), intent(out) :: Qe (KA,IA,JA,N_HYD) ! mixing ratio of each cateory [kg/kg]
1063 
1064  integer :: k, i, j
1065  !---------------------------------------------------------------------------
1066 
1067 !OCL XFILL
1068  !$omp parallel do
1069  do j = js, je
1070  do i = is, ie
1071  do k = ks, ke
1072  qe(k,i,j,i_hc) = qtrc0(k,i,j,i_mp_qc)
1073  qe(k,i,j,i_hr) = qtrc0(k,i,j,i_mp_qr)
1074  qe(k,i,j,i_hi) = qtrc0(k,i,j,i_mp_qi)
1075  qe(k,i,j,i_hs) = qtrc0(k,i,j,i_mp_qs)
1076  qe(k,i,j,i_hg) = qtrc0(k,i,j,i_mp_qg)
1077  qe(k,i,j,i_hh) = 0.0_rp
1078  end do
1079  end do
1080  end do
1081 
1082  return

References scale_atmos_hydrometeor::i_hc, scale_atmos_hydrometeor::i_hg, scale_atmos_hydrometeor::i_hh, scale_atmos_hydrometeor::i_hi, scale_atmos_hydrometeor::i_hr, scale_atmos_hydrometeor::i_hs, and scale_atmos_hydrometeor::n_hyd.

Referenced by mod_atmos_phy_mp_vars::atmos_phy_mp_vars_get_diagnostic().

Here is the caller graph for this function:

◆ atmos_phy_mp_sn14_qtrc2nhyd()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_qtrc2nhyd ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
integer, intent(in)  IA,
integer, intent(in)  IS,
integer, intent(in)  IE,
integer, intent(in)  JA,
integer, intent(in)  JS,
integer, intent(in)  JE,
real(rp), dimension(ka,ia,ja,qa_mp-1), intent(in)  QTRC0,
real(rp), dimension (ka,ia,ja,n_hyd), intent(out)  Ne 
)

Calculate number concentration of each category.

Definition at line 1086 of file scale_atmos_phy_mp_sn14.F90.

1090  use scale_atmos_hydrometeor, only: &
1091  n_hyd, &
1092  i_hc, &
1093  i_hr, &
1094  i_hi, &
1095  i_hs, &
1096  i_hg, &
1097  i_hh
1098  implicit none
1099  integer, intent(in) :: KA, KS, KE
1100  integer, intent(in) :: IA, IS, IE
1101  integer, intent(in) :: JA, JS, JE
1102 
1103  real(RP), intent(in) :: QTRC0(KA,IA,JA,QA_MP-1) ! tracer mass concentration [kg/kg]
1104 
1105  real(RP), intent(out) :: Ne (KA,IA,JA,N_HYD) ! number density of each cateory [1/m3]
1106 
1107  integer :: k, i, j
1108  !---------------------------------------------------------------------------
1109 
1110 !OCL XFILL
1111  !$omp parallel do
1112  do j = js, je
1113  do i = is, ie
1114  do k = ks, ke
1115  ne(k,i,j,i_hc) = qtrc0(k,i,j,i_mp_nc)
1116  ne(k,i,j,i_hr) = qtrc0(k,i,j,i_mp_nr)
1117  ne(k,i,j,i_hi) = qtrc0(k,i,j,i_mp_ni)
1118  ne(k,i,j,i_hs) = qtrc0(k,i,j,i_mp_ns)
1119  ne(k,i,j,i_hg) = qtrc0(k,i,j,i_mp_ng)
1120  ne(k,i,j,i_hh) = 0.0_rp
1121  end do
1122  end do
1123  end do
1124 
1125  return

References scale_atmos_hydrometeor::i_hc, scale_atmos_hydrometeor::i_hg, scale_atmos_hydrometeor::i_hh, scale_atmos_hydrometeor::i_hi, scale_atmos_hydrometeor::i_hr, scale_atmos_hydrometeor::i_hs, and scale_atmos_hydrometeor::n_hyd.

Referenced by mod_atmos_phy_mp_vars::atmos_phy_mp_vars_get_diagnostic().

Here is the caller graph for this function:

◆ atmos_phy_mp_sn14_qhyd2qtrc()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_qhyd2qtrc ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
integer, intent(in)  IA,
integer, intent(in)  IS,
integer, intent(in)  IE,
integer, intent(in)  JA,
integer, intent(in)  JS,
integer, intent(in)  JE,
real(rp), dimension(ka,ia,ja,n_hyd), intent(in)  Qe,
real(rp), dimension(ka,ia,ja,qa_mp-1), intent(out)  QTRC,
real(rp), dimension(ka,ia,ja,n_hyd), intent(in), optional  QNUM 
)

Definition at line 1128 of file scale_atmos_phy_mp_sn14.F90.

1133  use scale_const, only: &
1134  pi => const_pi, &
1135  undef => const_undef
1136  use scale_atmos_hydrometeor, only: &
1137  n_hyd, &
1138  i_hc, &
1139  i_hr, &
1140  i_hi, &
1141  i_hs, &
1142  i_hg, &
1143  i_hh
1144  implicit none
1145  integer, intent(in) :: KA, KS, KE
1146  integer, intent(in) :: IA, IS, IE
1147  integer, intent(in) :: JA, JS, JE
1148 
1149  real(RP), intent(in) :: Qe(KA,IA,JA,N_HYD) ! mass ratio of each cateory [kg/kg]
1150 
1151  real(RP), intent(out) :: QTRC(KA,IA,JA,QA_MP-1) ! tracer mass concentration [kg/kg]
1152 
1153  real(RP), intent(in), optional :: QNUM(KA,IA,JA,N_HYD)
1154 
1155  real(RP), parameter :: Dc = 20.e-6_rp ! typical particle diameter for cloud [m]
1156  real(RP), parameter :: Dr = 200.e-6_rp ! typical particle diameter for rain [m]
1157  real(RP), parameter :: Di = 80.e-6_rp ! typical particle diameter for ice [m]
1158  real(RP), parameter :: Ds = 80.e-6_rp ! typical particle diameter for snow [m]
1159  real(RP), parameter :: Dg = 200.e-6_rp ! typical particle diameter for grapel [m]
1160  real(RP), parameter :: b = 3.0_rp ! assume spherical form
1161 
1162  real(RP) :: piov6
1163 
1164  integer :: k, i, j
1165  !---------------------------------------------------------------------------
1166 
1167 
1168 !OCL XFILL
1169  !$omp parallel do
1170  do j = js, je
1171  do i = is, ie
1172  do k = ks, ke
1173  qtrc(k,i,j,i_mp_qc) = qe(k,i,j,i_hc)
1174  end do
1175  end do
1176  end do
1177 
1178 !OCL XFILL
1179  !$omp parallel do
1180  do j = js, je
1181  do i = is, ie
1182  do k = ks, ke
1183  qtrc(k,i,j,i_mp_qr) = qe(k,i,j,i_hr)
1184  end do
1185  end do
1186  end do
1187 
1188 !OCL XFILL
1189  !$omp parallel do
1190  do j = js, je
1191  do i = is, ie
1192  do k = ks, ke
1193  qtrc(k,i,j,i_mp_qi) = qe(k,i,j,i_hi)
1194  end do
1195  end do
1196  end do
1197 
1198 !OCL XFILL
1199  !$omp parallel do
1200  do j = js, je
1201  do i = is, ie
1202  do k = ks, ke
1203  qtrc(k,i,j,i_mp_qs) = qe(k,i,j,i_hs)
1204  end do
1205  end do
1206  end do
1207 
1208 !OCL XFILL
1209  !$omp parallel do
1210  do j = js, je
1211  do i = is, ie
1212  do k = ks, ke
1213  qtrc(k,i,j,i_mp_qg) = qe(k,i,j,i_hg) + qe(k,i,j,i_hh)
1214  end do
1215  end do
1216  end do
1217 
1218  piov6 = pi / 6.0_rp
1219 
1220  if ( present(qnum) ) then
1221 
1222 !OCL XFILL
1223  !$omp parallel do
1224  do j = js, je
1225  do i = is, ie
1226  do k = ks, ke
1227  if ( qnum(k,i,j,i_hc) .ne. undef ) then
1228  qtrc(k,i,j,i_mp_nc) = qnum(k,i,j,i_hc)
1229  else
1230  qtrc(k,i,j,i_mp_nc) = qtrc(k,i,j,i_mp_qc) / ( (piov6*rhow) * dc**b )
1231  end if
1232  end do
1233  end do
1234  end do
1235 
1236 !OCL XFILL
1237  !$omp parallel do
1238  do j = js, je
1239  do i = is, ie
1240  do k = ks, ke
1241  if ( qnum(k,i,j,i_hr) .ne. undef ) then
1242  qtrc(k,i,j,i_mp_nr) = qnum(k,i,j,i_hr)
1243  else
1244  qtrc(k,i,j,i_mp_nr) = qtrc(k,i,j,i_mp_qr) / ( (piov6*rhow) * dr**b )
1245  end if
1246  end do
1247  end do
1248  end do
1249 
1250 !OCL XFILL
1251  !$omp parallel do
1252  do j = js, je
1253  do i = is, ie
1254  do k = ks, ke
1255  if ( qnum(k,i,j,i_hi) .ne. undef ) then
1256  qtrc(k,i,j,i_mp_ni) = qnum(k,i,j,i_hi)
1257  else
1258  qtrc(k,i,j,i_mp_ni) = qtrc(k,i,j,i_mp_qi) / ( (piov6*rhof) * di**b )
1259  end if
1260  end do
1261  end do
1262  end do
1263 
1264 !OCL XFILL
1265  !$omp parallel do
1266  do j = js, je
1267  do i = is, ie
1268  do k = ks, ke
1269  if ( qnum(k,i,j,i_hs) .ne. undef ) then
1270  qtrc(k,i,j,i_mp_ns) = qnum(k,i,j,i_hs)
1271  else
1272  qtrc(k,i,j,i_mp_ns) = qtrc(k,i,j,i_mp_qs) / ( (piov6*rhof) * ds**b )
1273  end if
1274  end do
1275  end do
1276  end do
1277 
1278 !OCL XFILL
1279  !$omp parallel do
1280  do j = js, je
1281  do i = is, ie
1282  do k = ks, ke
1283  if ( qnum(k,i,j,i_hg) .ne. undef ) then
1284  if ( qnum(k,i,j,i_hh) .ne. undef ) then
1285  qtrc(k,i,j,i_mp_ng) = qnum(k,i,j,i_hg) + qnum(k,i,j,i_hh)
1286  else
1287  qtrc(k,i,j,i_mp_ng) = qnum(k,i,j,i_hg)
1288  end if
1289  else
1290  qtrc(k,i,j,i_mp_ng) = qtrc(k,i,j,i_mp_qg) / ( (piov6*rhog) * dg**b )
1291  end if
1292  end do
1293  end do
1294  end do
1295 
1296  else
1297 
1298 !OCL XFILL
1299  !$omp parallel do
1300  do j = js, je
1301  do i = is, ie
1302  do k = ks, ke
1303  qtrc(k,i,j,i_mp_nc) = qtrc(k,i,j,i_mp_qc) / ( (piov6*rhow) * dc**b )
1304  end do
1305  end do
1306  end do
1307 
1308 !OCL XFILL
1309  !$omp parallel do
1310  do j = js, je
1311  do i = is, ie
1312  do k = ks, ke
1313  qtrc(k,i,j,i_mp_nr) = qtrc(k,i,j,i_mp_qr) / ( (piov6*rhow) * dr**b )
1314  end do
1315  end do
1316  end do
1317 
1318 !OCL XFILL
1319  !$omp parallel do
1320  do j = js, je
1321  do i = is, ie
1322  do k = ks, ke
1323  qtrc(k,i,j,i_mp_ni) = qtrc(k,i,j,i_mp_qi) / ( (piov6*rhof) * di**b )
1324  end do
1325  end do
1326  end do
1327 
1328 !OCL XFILL
1329  !$omp parallel do
1330  do j = js, je
1331  do i = is, ie
1332  do k = ks, ke
1333  qtrc(k,i,j,i_mp_ns) = qtrc(k,i,j,i_mp_qs) / ( (piov6*rhof) * ds**b )
1334  end do
1335  end do
1336  end do
1337 
1338 !OCL XFILL
1339  !$omp parallel do
1340  do j = js, je
1341  do i = is, ie
1342  do k = ks, ke
1343  qtrc(k,i,j,i_mp_ng) = qtrc(k,i,j,i_mp_qg) / ( (piov6*rhog) * dg**b )
1344  end do
1345  end do
1346  end do
1347 
1348  end if
1349 
1350  return
module CONSTANT
Definition: scale_const.F90:11
real(rp), parameter, public const_pi
pi
Definition: scale_const.F90:32
real(rp), public const_undef
Definition: scale_const.F90:43

References scale_const::const_pi, scale_const::const_undef, scale_atmos_hydrometeor::i_hc, scale_atmos_hydrometeor::i_hg, scale_atmos_hydrometeor::i_hh, scale_atmos_hydrometeor::i_hi, scale_atmos_hydrometeor::i_hr, scale_atmos_hydrometeor::i_hs, and scale_atmos_hydrometeor::n_hyd.

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_qhyd2qtrc().

Here is the caller graph for this function:

◆ atmos_phy_mp_sn14_terminal_velocity()

subroutine, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_terminal_velocity ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
real(rp), dimension(ka), intent(in)  DENS,
real(rp), dimension(ka), intent(in)  TEMP,
real(rp), dimension(ka,i_qc:i_ng), intent(in)  RHOQ,
real(rp), dimension(ka), intent(in)  PRES,
real(rp), dimension(ka,qa_mp-1), intent(out)  vterm 
)

ATMOS_PHY_MP_sn14_terminal_velocity Calculate terminal velocity.

Definition at line 1358 of file scale_atmos_phy_mp_sn14.F90.

1365  !$acc routine vector
1366  use scale_const, only: &
1367  const_undef
1368  implicit none
1369 
1370  integer, intent(in) :: KA, KS, KE
1371 
1372  real(RP), intent(in) :: RHOQ(KA,I_QC:I_NG) ! rho * q
1373  real(RP), intent(in) :: DENS(KA) ! rho
1374  real(RP), intent(in) :: TEMP(KA) ! temperature
1375  real(RP), intent(in) :: PRES(KA) ! pressure
1376 
1377  real(RP), intent(out) :: vterm(KA,QA_MP-1) ! terminal velocity of cloud mass
1378 
1379  real(RP) :: xq, log_xq ! average mass of 1 particle( mass/number )
1380 
1381  real(RP) :: rhofac ! density factor for terminal velocity
1382  real(RP) :: rhofac_q(KA), log_rhofac_q
1383 
1384  real(RP) :: rlambdar(KA) ! work for diagnosis of Rain DSD ( Seifert, 2008 )
1385  real(RP) :: mud_r
1386  real(RP) :: dq, log_dq ! weigthed diameter. Improved Rogers etal. (1993) formula by T.Mitsui
1387 
1388  real(RP) :: weight ! weighting coefficient for 2-branches is determined by ratio between 0.745mm and weighted diameter. SB06 Table.1
1389  real(RP) :: velq_s ! terminal velocity for small branch of Rogers formula
1390  real(RP) :: velq_l ! terminal velocity for large branch of Rogers formula
1391 
1392  real(RP) :: tmp
1393  integer :: k, i, j, iq
1394  !---------------------------------------------------------------------------
1395 
1396  ! QC, NC
1397  do k = ks, ke
1398  rhofac = rho_0 / max( dens(k), rho_min )
1399 
1400  log_rhofac_q = log(rhofac) * gamma_v(i_mp_qc)
1401  log_xq = log( max( xc_min, min( xc_max, rhoq(k,i_qc) / ( rhoq(k,i_nc) + nc_min ) ) ) )
1402 
1403  vterm(k,i_mp_qc) = - exp( log_rhofac_q + log_coef_vt1(i_mp_qc,1) + log_xq * beta_v(i_mp_qc,1) )
1404 
1405  vterm(k,i_mp_nc) = - exp( log_rhofac_q + log_coef_vt0(i_mp_qc,1) + log_xq * beta_vn(i_mp_qc,1) )
1406  end do
1407 
1408  ! QR, NR
1409  mud_r = 3.0_rp * nu(i_mp_qr) + 2.0_rp
1410  do k = ks, ke
1411  rhofac = rho_0 / max( dens(k), rho_min )
1412  rhofac_q(k) = rhofac**gamma_v(i_mp_qr)
1413  end do
1414  do k = ks, ke
1415  xq = max( xr_min, min( xr_max, rhoq(k,i_qr) / ( rhoq(k,i_nr) + nr_min ) ) )
1416 
1417  rlambdar(k) = a_m(i_mp_qr) * xq**b_m(i_mp_qr) &
1418  * ( (mud_r+3.0_rp) * (mud_r+2.0_rp) * (mud_r+1.0_rp) )**(-0.333333333_rp)
1419  end do
1420 !OCL LOOP_FISSION_TARGET(LS)
1421  do k = ks, ke
1422  dq = ( 4.0_rp + mud_r ) * rlambdar(k) ! D^(3)+mu weighted mean diameter
1423  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + tanh( pi * log( dq/d_vtr_branch ) ) ) ) )
1424  velq_s = coef_vtr_ar2 * dq &
1425  * ( 1.0_rp - ( 1.0_rp + coef_vtr_br2*rlambdar(k) )**(-5.0_rp-mud_r) )
1426  velq_l = coef_vtr_ar1 &
1427  - coef_vtr_br1 * ( 1.0_rp + coef_vtr_cr1*rlambdar(k) )**(-4.0_rp-mud_r)
1428  vterm(k,i_mp_qr) = -rhofac_q(k) * ( velq_l * ( weight ) &
1429  + velq_s * ( 1.0_rp - weight ) )
1430  end do
1431 !OCL LOOP_FISSION_TARGET(LS)
1432  do k = ks, ke
1433  dq = ( 1.0_rp + mud_r ) * rlambdar(k) ! D^(0)+mu weighted mean diameter
1434  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + tanh( pi * log( dq/d_vtr_branch ) ) ) ) )
1435  velq_s = coef_vtr_ar2 * dq &
1436  * ( 1.0_rp - ( 1.0_rp + coef_vtr_br2*rlambdar(k) )**(-2.0_rp-mud_r) )
1437  velq_l = coef_vtr_ar1 &
1438  - coef_vtr_br1 * ( 1.0_rp + coef_vtr_cr1*rlambdar(k) )**(-1.0_rp-mud_r)
1439  vterm(k,i_mp_nr) = -rhofac_q(k) * ( velq_l * ( weight ) &
1440  + velq_s * ( 1.0_rp - weight ) )
1441  end do
1442 
1443  do k = ks, ke
1444  rhofac_q(k) = exp( log( pres(k)/pre0_vt ) * a_pre0_vt + log( temp(k)/tem0_vt ) * a_tem0_vt )
1445  end do
1446 
1447  ! QI, NI
1448 !OCL LOOP_FISSION_TARGET(LS)
1449  do k = ks, ke
1450  log_xq = log( max( xi_min, min( xi_max, rhoq(k,i_qi) / ( rhoq(k,i_ni) + ni_min ) ) ) )
1451 
1452  tmp = log_a_m(i_mp_qi) + log_xq * b_m(i_mp_qi)
1453  log_dq = log_coef_dave_l(i_mp_qi) + tmp
1454  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_li ) ) )
1455 
1456  velq_s = exp( log_coef_vt1(i_mp_qi,1) + log_xq * beta_v(i_mp_qi,1) )
1457  velq_l = exp( log_coef_vt1(i_mp_qi,2) + log_xq * beta_v(i_mp_qi,2) )
1458  vterm(k,i_mp_qi) = - rhofac_q(k) * ( velq_l * ( weight ) &
1459  + velq_s * ( 1.0_rp - weight ) )
1460 
1461  log_dq = log_coef_dave_n(i_mp_qi) + tmp
1462  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_ni ) ) )
1463 
1464  velq_s = exp( log_coef_vt0(i_mp_qi,1) + log_xq * beta_vn(i_mp_qi,1) )
1465  velq_l = exp( log_coef_vt0(i_mp_qi,2) + log_xq * beta_vn(i_mp_qi,2) )
1466  vterm(k,i_mp_ni) = - rhofac_q(k) * ( velq_l * ( weight ) &
1467  + velq_s * ( 1.0_rp - weight ) )
1468  end do
1469 
1470  ! QS, NS
1471 !OCL LOOP_FISSION_TARGET(LS)
1472  do k = ks, ke
1473  log_xq = log( max( xs_min, min( xs_max, rhoq(k,i_qs) / ( rhoq(k,i_ns) + ns_min ) ) ) )
1474 
1475  tmp = log_a_m(i_mp_qs) + log_xq * b_m(i_mp_qs)
1476  log_dq = log_coef_dave_l(i_mp_qs) + tmp
1477  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_ls ) ) )
1478 
1479  velq_s = exp( log_coef_vt1(i_mp_qs,1) + log_xq * beta_v(i_mp_qs,1) )
1480  velq_l = exp( log_coef_vt1(i_mp_qs,2) + log_xq * beta_v(i_mp_qs,2) )
1481  vterm(k,i_mp_qs) = - rhofac_q(k) * ( velq_l * ( weight ) &
1482  + velq_s * ( 1.0_rp - weight ) )
1483 
1484  log_dq = log_coef_dave_n(i_mp_qs) + tmp
1485  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_ns ) ) )
1486 
1487  velq_s = exp( log_coef_vt0(i_mp_qs,1) + log_xq * beta_vn(i_mp_qs,1) )
1488  velq_l = exp( log_coef_vt0(i_mp_qs,2) + log_xq * beta_vn(i_mp_qs,2) )
1489  vterm(k,i_mp_ns) = - rhofac_q(k) * ( velq_l * ( weight ) &
1490  + velq_s * ( 1.0_rp - weight ) )
1491  end do
1492 
1493  ! QG, NG
1494 !OCL LOOP_FISSION_TARGET(LS)
1495  do k = ks, ke
1496  log_xq = log( max( xg_min, min( xg_max, rhoq(k,i_qg) / ( rhoq(k,i_ng) + ng_min ) ) ) )
1497 
1498  tmp = log_a_m(i_mp_qg) + log_xq * b_m(i_mp_qg)
1499  log_dq = log_coef_dave_l(i_mp_qg) + tmp
1500  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_lg ) ) )
1501 
1502  velq_s = exp( log_coef_vt1(i_mp_qg,1) + log_xq * beta_v(i_mp_qg,1) )
1503  velq_l = exp( log_coef_vt1(i_mp_qg,2) + log_xq * beta_v(i_mp_qg,2) )
1504  vterm(k,i_mp_qg) = - rhofac_q(k) * ( velq_l * ( weight ) &
1505  + velq_s * ( 1.0_rp - weight ) )
1506 
1507  log_dq = log_coef_dave_n(i_mp_qg) + tmp
1508  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_ng ) ) )
1509 
1510  velq_s = exp( log_coef_vt0(i_mp_qg,1) + log_xq * beta_vn(i_mp_qg,1) )
1511  velq_l = exp( log_coef_vt0(i_mp_qg,2) + log_xq * beta_vn(i_mp_qg,2) )
1512  vterm(k,i_mp_ng) = - rhofac_q(k) * ( velq_l * ( weight ) &
1513  + velq_s * ( 1.0_rp - weight ) )
1514  enddo
1515 
1516  do iq = 1, qa_mp-1
1517  vterm(1:ks-2 ,iq) = const_undef
1518  vterm(ks-1 ,iq) = vterm(ks,iq)
1519  vterm(ke+1:ka,iq) = const_undef
1520  enddo
1521 
1522  return

References aut_acc_slc_brk(), scale_const::const_undef, scale_atmos_hydrometeor::cp_ice, scale_atmos_hydrometeor::cp_vapor, scale_atmos_hydrometeor::cp_water, cross_section(), scale_atmos_hydrometeor::cv_ice, scale_atmos_hydrometeor::cv_vapor, scale_atmos_hydrometeor::cv_water, debug_tem(), freezing_water(), ice_multiplication(), scale_io::io_fid_conf, mixed_phase_collection(), mixed_phase_collection_bin(), nucleation(), scale_prc::prc_abort(), qa_mp, and scale_specfunc::sf_gamma().

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_calc_tendency().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ debug_tem()

subroutine scale_atmos_phy_mp_sn14::debug_tem ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
integer, intent(in)  point,
integer, intent(in)  i,
integer, intent(in)  j,
real(rp), dimension(ka), intent(in)  tem,
real(rp), dimension(ka), intent(in)  rho,
real(rp), dimension(ka), intent(in)  pre,
real(rp), dimension (ka), intent(in)  qv 
)

Definition at line 3476 of file scale_atmos_phy_mp_sn14.F90.

3480  use scale_prc, only: &
3481  prc_myrank
3482  implicit none
3483  integer, intent(in) :: KA, KS, KE
3484 
3485  integer, intent(in) :: point
3486  integer, intent(in) :: i, j
3487  real(RP), intent(in) :: tem(KA)
3488  real(RP), intent(in) :: rho(KA)
3489  real(RP), intent(in) :: pre(KA)
3490  real(RP), intent(in) :: qv (KA)
3491 
3492  integer :: k
3493  !---------------------------------------------------------------------------
3494 
3495  do k = ks, ke
3496  if ( tem(k) < tem_min &
3497  .OR. rho(k) < rho_min &
3498  .OR. pre(k) < 1.0_rp ) then
3499 
3500  log_info("ATMOS_PHY_MP_SN14_debug_tem_kij",'(A,I3,A,4(F16.5),3(I6))') &
3501  "point: ", point, " low tem,rho,pre:", tem(k), rho(k), pre(k), qv(k), k, i, j, prc_myrank
3502  endif
3503  enddo
3504 
3505  return
integer, public prc_myrank
process num in local communicator
Definition: scale_prc.F90:91

References scale_prc::prc_myrank.

Referenced by atmos_phy_mp_sn14_terminal_velocity().

Here is the caller graph for this function:

◆ nucleation()

subroutine scale_atmos_phy_mp_sn14::nucleation ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
real(rp), dimension( ka), intent(in)  cz,
real(rp), dimension(0:ka), intent(in)  fz,
real(rp), dimension (ka), intent(in)  w,
real(rp), dimension (ka), intent(in)  rho,
real(rp), dimension (ka), intent(in)  tem,
real(rp), dimension (ka), intent(in)  pre,
real(rp), dimension(ka), intent(in)  qdry,
real(rp), dimension(ka,i_qv:i_ng), intent(in)  rhoq,
real(rp), dimension(ka), intent(in)  cpa,
real(rp), dimension(ka)  cva,
real(rp), dimension(ka), intent(in)  dTdt_rad,
real(rp), dimension(ka), intent(in)  qke,
real(rp), dimension(ka), intent(in)  CCN,
real(rp), intent(in)  nc_uplim_d,
real(rp), intent(in)  dt,
real(rp), dimension(ka,hydro_max)  dq_xa,
real(rp), dimension(ka,hydro_max,2)  vt_xa,
real(rp), dimension(ka,pq_max), intent(out)  PQ 
)

Definition at line 3509 of file scale_atmos_phy_mp_sn14.F90.

3520  use scale_prc, only: &
3521  prc_abort
3522  use scale_atmos_saturation, only: &
3523  moist_psat_liq => atmos_saturation_psat_liq, &
3524  moist_psat_ice => atmos_saturation_psat_ice, &
3525  moist_pres2qsat_liq => atmos_saturation_pres2qsat_liq, &
3526  moist_pres2qsat_ice => atmos_saturation_pres2qsat_ice, &
3527  moist_dqsi_dtem_dens => atmos_saturation_dqs_dtem_dens_liq, &
3528  moist_dqs_dtem_dpre_ice => atmos_saturation_dqs_dtem_dpre_ice
3529  use scale_atmos_hydrometeor, only: &
3530  cv_vapor, &
3531  cv_ice
3532  implicit none
3533 
3534  integer, intent(in) :: KA, KS, KE
3535 
3536  real(RP), intent(in) :: cz( KA)
3537  real(RP), intent(in) :: fz(0:KA)
3538  real(RP), intent(in) :: w (KA) ! w of full level
3539  real(RP), intent(in) :: rho (KA)
3540  real(RP), intent(in) :: tem (KA)
3541  real(RP), intent(in) :: pre (KA)
3542  real(RP), intent(in) :: qdry(KA)
3543  !
3544  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
3545  !
3546  real(RP), intent(in) :: cpa(KA)
3547  real(RP), intent(in) :: dTdt_rad(KA)
3548  real(RP), intent(in) :: qke(KA)
3549  real(RP), intent(in) :: dt
3550  real(RP), intent(in) :: CCN(KA)
3551  real(RP), intent(in) :: nc_uplim_d
3552  !
3553  real(RP), intent(out) :: PQ(KA,PQ_MAX)
3554  !
3555  !
3556 ! real(RP) :: c_ccn_map(1) ! c_ccn horizontal distribution
3557 ! real(RP) :: kappa_map(1) ! kappa horizontal distribution
3558 ! real(RP) :: c_in_map(1) ! c_in horizontal distribution ! [Add] 11/08/30 T.Mitsui
3559  real(RP) :: esw(KA) ! saturation vapor pressure, water
3560  real(RP) :: esi(KA) ! ice
3561  real(RP) :: ssw(KA) ! super saturation (water)
3562  real(RP) :: ssi(KA) ! super saturation (ice)
3563 ! real(RP) :: w_dsswdz(KA) ! w*(d_ssw/ d_z) super saturation(water) flux
3564  real(RP) :: w_dssidz(KA) ! w*(d_ssi/ d_z), 09/04/14 T.Mitsui
3565 ! real(RP) :: ssw_below(KA) ! ssw(k-1)
3566  real(RP) :: ssi_below(KA) ! ssi(k-1), 09/04/14 T.Mitsui
3567  real(RP) :: z_below(KA) ! z(k-1)
3568  real(RP) :: dzh ! z(k)-z(k-1)
3569  real(RP) :: pv ! vapor pressure
3570  ! work variables for Twomey Equation.
3571  real(RP) :: qsw(KA)
3572  real(RP) :: qsi(KA)
3573  real(RP) :: dqsidtem_rho(KA)
3574  real(RP) :: dssidt_rad(KA)
3575  real(RP) :: wssi, wdssi
3576  !
3577 
3578  real(RP) :: cva(KA)
3579  real(RP) :: dq_xa(KA,HYDRO_MAX)
3580  real(RP) :: vt_xa(KA,HYDRO_MAX,2) ! terminal velocity
3581  real(RP) :: dTdt_dep(KA)
3582  real(RP) :: PLIdep_total(KA)
3583  real(RP) :: wtem(KA) ! temperature[K]
3584  real(RP) :: dqsidpre_tem(KA)
3585  real(RP) :: dqsidtem_pre(KA)
3586  real(RP) :: dssidt
3587  real(RP) :: dssidt_mp(KA)
3588  real(RP) :: dssidt_dyn(KA)
3589  !!
3590 
3591 
3592 ! real(RP) :: xi_nuc(1) ! xi use the value @ cloud base
3593 ! real(RP) :: alpha_nuc(1) ! alpha_nuc
3594 ! real(RP) :: eta_nuc(1) ! xi use the value @ cloud base
3595  !
3596  real(RP) :: sigma_w(KA)
3597  real(RP) :: weff(KA)
3598  real(RP) :: weff_max(KA)
3599  real(RP) :: velz(KA)
3600  !
3601  real(RP) :: coef_ccn
3602  real(RP) :: slope_ccn
3603  real(RP) :: nc_new(KA)
3604  real(RP) :: nc_new_below(KA)
3605  real(RP) :: dnc_new
3606  real(RP) :: nc_new_max ! Lohmann (2002),
3607  real(RP) :: a_max
3608  real(RP) :: b_max
3609  logical :: flag_nucleation(KA)
3610  !
3611  real(RP) :: r_gravity
3612  real(RP), parameter :: r_sqrt3=0.577350269_rp ! = sqrt(1.0/3.0)
3613  real(RP), parameter :: eps=1.e-30_rp
3614  !====> ! 09/08/18
3615  !
3616  real(RP) :: dlcdt_max, dli_max ! defined by supersaturation
3617  real(RP) :: dncdt_max, dni_max ! defined by supersaturation
3618  real(RP) :: rdt
3619 
3620  real(RP) :: tmp
3621  !
3622  integer :: k
3623  !
3624  !
3625 
3626  if( so22_het ) then
3627  do k = ks, ke
3628  ! Temperature lower limit is only used for saturation condition.
3629  ! On the other hand original "tem" is used for calculation of latent heat or energy equation.
3630  wtem(k) = max( tem(k), tem_min )
3631  end do
3632  endif
3633 
3634 
3635 ! c_ccn_map(1) = c_ccn
3636 ! kappa_map(1) = kappa
3637 ! c_in_map(1) = c_in
3638  !
3639  !
3640  rdt = 1.0_rp/dt
3641  r_gravity = 1.0_rp/grav
3642  !
3643  call moist_psat_liq ( ka, ks, ke, &
3644  tem(:), esw(:) ) ! [IN], [OUT]
3645  call moist_psat_ice ( ka, ks, ke, &
3646  tem(:), esi(:) ) ! [IN], [OUT]
3647  call moist_pres2qsat_liq ( ka, ks, ke, &
3648  tem(:), pre(:), qdry(:), & ! [IN]
3649  qsw(:) ) ! [OUT]
3650  call moist_pres2qsat_ice ( ka, ks, ke, &
3651  tem(:), pre(:), qdry(:), & ! [IN]
3652  qsi(:) ) ! [OUT]
3653  call moist_dqsi_dtem_dens( ka, ks, ke, &
3654  tem(:), rho(:), & ! [IN]
3655  dqsidtem_rho(:) ) ! [OUT]
3656 
3657  if( so22_het ) then
3658  call moist_dqs_dtem_dpre_ice( ka, ks, ke, &
3659  wtem(:), pre(:), qdry(:), & ! [IN]
3660  dqsidtem_pre(:), dqsidpre_tem(:) ) ! [OUT]
3661  endif
3662  !!
3663 
3664 
3665  !
3666  ! Lohmann (2002),JAS, eq.(1) but changing unit [cm-3] => [m-3]
3667  a_max = 1.e+6_rp*0.1_rp*(1.e-6_rp)**1.27_rp
3668  b_max = 1.27_rp
3669  !
3670  ssi_max = 1.0_rp
3671 
3672  do k = ks, ke
3673  pv = rhoq(k,i_qv)*rvap*tem(k)
3674  ssw(k) = min( mp_ssw_lim, ( pv/esw(k)-1.0_rp ) )*100.0_rp
3675  ssi(k) = ( pv/esi(k) - 1.00_rp )
3676 ! ssw_below(k+1) = ssw(k)
3677  ssi_below(k+1) = ssi(k)
3678  z_below(k+1) = cz(k)
3679  end do
3680 ! ssw_below(KS) = ssw(KS)
3681  ssi_below(ks) = ssi(ks)
3682  z_below(ks) = cz(ks-1)
3683 
3684  ! dS/dz is evaluated by first order upstream difference
3685  !*** Solution for Twomey Equation ***
3686 ! coef_ccn = 1.E+6_RP*0.88_RP*(c_ccn_map(1)*1.E-6_RP)**(2.0_RP/(kappa_map(1) + 2.0_RP)) * &
3687  coef_ccn = 1.e+6_rp*0.88_rp*(c_ccn*1.e-6_rp)**(2.0_rp/(kappa + 2.0_rp)) &
3688 ! * (70.0_RP)**(kappa_map(1)/(kappa_map(1) + 2.0_RP))
3689  * (70.0_rp)**(kappa/(kappa + 2.0_rp))
3690 ! slope_ccn = 1.5_RP*kappa_map(1)/(kappa_map(1) + 2.0_RP)
3691  slope_ccn = 1.5_rp*kappa/(kappa + 2.0_rp)
3692  !
3693  do k=ks, ke
3694  sigma_w(k) = r_sqrt3*sqrt(max(qke(k),qke_min))
3695  end do
3696  sigma_w(ks-1) = sigma_w(ks)
3697  sigma_w(ke+1) = sigma_w(ke)
3698  ! effective vertical velocity
3699  do k=ks, ke
3700  weff(k) = w(k) - cpa(k)*r_gravity*dtdt_rad(k)
3701  end do
3702  !
3703  if( mp_couple_aerosol ) then
3704 
3705  do k = ks, ke
3706  if( ssw(k) > 1.e-10_rp .AND. pre(k) > 300.e+2_rp ) then
3707  nc_new(k) = max( ccn(k), c_ccn )
3708  else
3709  nc_new(k) = 0.0_rp
3710  endif
3711  enddo
3712 
3713  else
3714 
3715  if( nucl_twomey ) then
3716  ! diagnose cloud condensation nuclei
3717  do k = ks, ke
3718  ! effective vertical velocity (maximum vertical velocity in turbulent flow)
3719  weff_max(k) = weff(k) + sigma_w(k)
3720  ! large scale upward motion region and saturated
3721  if( (weff(k) > 1.e-8_rp) .AND. (ssw(k) > 1.e-10_rp) .AND. pre(k) > 300.e+2_rp )then
3722  ! Lohmann (2002), eq.(1)
3723  nc_new_max = coef_ccn*weff_max(k)**slope_ccn
3724  nc_new(k) = a_max*nc_new_max**b_max
3725  else
3726  nc_new(k) = 0.0_rp
3727  end if
3728  end do
3729 
3730  else
3731  ! calculate cloud condensation nuclei
3732  do k = ks, ke
3733  if( ssw(k) > 1.e-10_rp .AND. pre(k) > 300.e+2_rp ) then
3734  nc_new(k) = c_ccn*ssw(k)**kappa
3735  else
3736  nc_new(k) = 0.0_rp
3737  endif
3738  enddo
3739  endif
3740 
3741  endif
3742 
3743  do k = ks, ke
3744  ! nc_new is bound by upper limit
3745  if( nc_new(k) > nc_uplim_d ) then ! no more CCN
3746  flag_nucleation(k) = .false.
3747  nc_new_below(k+1) = 1.e+30_rp
3748  else if( nc_new(k) > eps ) then ! nucleation can occur
3749  flag_nucleation(k) = .true.
3750  nc_new_below(k+1) = nc_new(k)
3751  else ! nucleation cannot occur(unsaturated or negative w)
3752  flag_nucleation(k) = .false.
3753  nc_new_below(k+1) = 0.0_rp
3754  end if
3755  end do
3756  nc_new_below(ks) = 0.0_rp
3757 ! do k=KS, KE
3758  ! search maximum value of nc_new
3759 ! if( ( nc_new(k) < nc_new_below(k) ) .OR. &
3760 ! ( nc_new_below(k) > c_ccn_map(1)*0.05_RP ) )then ! 5% of c_ccn
3761 ! ( nc_new_below(k) > c_ccn*0.05_RP ) )then ! 5% of c_ccn
3762 ! flag_nucleation(k) = .false.
3763 ! end if
3764 ! end do
3765 
3766  if( mp_couple_aerosol ) then
3767  do k = ks, ke
3768  ! nucleation occurs at only cloud base.
3769  ! if CCN is more than below parcel, nucleation newly occurs
3770  ! effective vertical velocity
3771  if ( flag_nucleation(k) .AND. & ! large scale upward motion region and saturated
3772  tem(k) > tem_ccn_low ) then
3773  dlcdt_max = ( rhoq(k,i_qv) - esw(k) / ( rvap * tem(k) ) ) * rdt
3774  dlcdt_max = max( dlcdt_max, 0.0_rp ) ! dlcdt_max can be artificially negative due to truncation error in floating point operation
3775  dncdt_max = dlcdt_max/xc_min
3776 ! dnc_new = nc_new(k)-rhoq(k,I_NC)
3777  dnc_new = nc_new(k)
3778  pq(k,i_ncccn) = min( dncdt_max, dnc_new*rdt )
3779  pq(k,i_lcccn) = min( dlcdt_max, xc_min*pq(k,i_ncccn) )
3780  else
3781  pq(k,i_ncccn) = 0.0_rp
3782  pq(k,i_lcccn) = 0.0_rp
3783  end if
3784  end do
3785  else
3786 
3787  if( nucl_twomey ) then
3788  do k = ks, ke
3789  ! nucleation occurs at only cloud base.
3790  ! if CCN is more than below parcel, nucleation newly occurs
3791  ! effective vertical velocity
3792  if ( flag_nucleation(k) .AND. & ! large scale upward motion region and saturated
3793  tem(k) > tem_ccn_low .AND. &
3794  nc_new(k) > rhoq(k,i_nc) ) then
3795  dlcdt_max = ( rhoq(k,i_qv) - esw(k) / ( rvap * tem(k) ) ) * rdt
3796  dlcdt_max = max( dlcdt_max, 0.0_rp ) ! dlcdt_max can be artificially negative due to truncation error in floating point operation
3797  dncdt_max = dlcdt_max/xc_min
3798  dnc_new = nc_new(k)-rhoq(k,i_nc)
3799  pq(k,i_ncccn) = min( dncdt_max, dnc_new*rdt )
3800  pq(k,i_lcccn) = min( dlcdt_max, xc_min*pq(k,i_ncccn) )
3801  else
3802  pq(k,i_ncccn) = 0.0_rp
3803  pq(k,i_lcccn) = 0.0_rp
3804  end if
3805  end do
3806  else
3807  do k = ks, ke
3808  ! effective vertical velocity
3809  if( tem(k) > tem_ccn_low .AND. &
3810  nc_new(k) > rhoq(k,i_nc) ) then
3811  dlcdt_max = ( rhoq(k,i_qv) - esw(k) / ( rvap * tem(k) ) ) * rdt
3812  dlcdt_max = max( dlcdt_max, 0.0_rp ) ! dlcdt_max can be artificially negative due to truncation error in floating point operation
3813  dncdt_max = dlcdt_max/xc_min
3814  dnc_new = nc_new(k)-rhoq(k,i_nc)
3815  pq(k,i_ncccn) = min( dncdt_max, dnc_new*rdt )
3816  pq(k,i_lcccn) = min( dlcdt_max, xc_min*pq(k,i_ncccn) )
3817  else
3818  pq(k,i_ncccn) = 0.0_rp
3819  pq(k,i_lcccn) = 0.0_rp
3820  end if
3821  end do
3822  endif
3823 
3824  endif
3825 
3826  !
3827  ! ice nucleation
3828  !
3829  ! +++ NOTE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3830  ! Based on Phillips etal.(2006).
3831  ! However this approach doesn't diagnose Ni itself but diagnose tendency.
3832  ! Original approach adjust Ni instantaneously .
3833  ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3834 
3835  if( so22_het .or. opt_nucleation_ice_hom ) then
3836  call dep_vapor_ice_wrk( & ! in
3837  ka, ks, ke, & ! in
3838  plidep_total(:), & ! out for ice nucleation
3839  rho(:), tem(:), pre(:), & ! in
3840  qdry(:), esi(:), qsi(:), & ! in
3841  rhoq(:,:), & ! in
3842  vt_xa, dq_xa, & ! in
3843  dt ) ! in
3844 
3845  do k = ks, ke
3846  dtdt_dep(k) = (lhs0+(cv_vapor-cv_ice)*tem(k))*plidep_total(k)/(rho(k)*cva(k))
3847  enddo
3848  else
3849  dtdt_dep(:) = 0.0_rp
3850  endif
3851 
3852  do k = ks, ke-1
3853  velz(k) = ( w(k) * ( cz(k+1) - fz(k) ) + w(k+1) * ( fz(k) - cz(k) ) ) / ( cz(k+1) - cz(k) ) ! @ half level
3854  end do
3855  velz(ke) = 0.0_rp
3856  do k = ks, ke
3857  dzh = cz(k) - z_below(k)
3858  w_dssidz(k) = velz(k) * (ssi(k) - ssi_below(k))/dzh
3859  dssidt_rad(k) = -rhoq(k,i_qv)/(rho(k)*qsi(k)*qsi(k))*dqsidtem_rho(k)*dtdt_rad(k)
3860  dli_max = ( rhoq(k,i_qv) - esi(k) / ( rvap * tem(k) ) ) * rdt
3861  dli_max = max( dli_max, 0.0_rp ) ! dli_max can be artificially negative due to truncation error in floating point operation
3862  dni_max = min( dli_max/xi_ccn, (in_max-rhoq(k,i_ni))*rdt )
3863  wdssi = min( w_dssidz(k)+dssidt_rad(k), 0.01_rp)
3864  wssi = min( ssi(k), ssi_max)
3865 
3866  !! Seiki and Ohno 2022
3867  if( so22_het ) then
3868  dssidt_mp(k) = -plidep_total(k)/(rho(k)*qsi(k))
3869  !! PLIdep(k) -> PQ(k,I_LIdep)
3870  dssidt_rad(k) = -rhoq(k,i_qv)/(rho(k)*qsi(k)*qsi(k))*dqsidtem_rho(k)*dtdt_rad(k)
3871  !!
3872  dssidt_dyn(k) = +rhoq(k,i_qv)/(rho(k)*qsi(k)*qsi(k))&
3873  * velz(k)*grav*(dqsidtem_pre(k)/cpa(k)+dqsidpre_tem(k)*rho(k))
3874  ! * w(k)*CNST_GRAV*(dqsidtem_pre(ij,k)/cpa(ij,k)+dqsidpre_tem(ij,k)*rho(ij,k))
3875  dssidt = dssidt_mp(k) + dssidt_rad(k) + dssidt_dyn(k)
3876  endif
3877 
3878  ! SB06(34),(35)
3879 !# if( ( wdssi > eps ) .AND. & !
3880 !# (tem(k) < 273.15_RP ) .AND. & !
3881 !# (rhoq(k,I_NI) < in_max ) .AND. &
3882 !# (wssi >= eps ) )then !
3883 !# tmp = c_in * nm_M92 * exp( 0.3_RP * bm_M92 * ( wssi - 0.1_RP ) )
3884 !# if( inucl_w ) then
3885 !# tmp = bm_M92 * 0.3_RP * tmp * wdssi
3886 !# else
3887 !# tmp = max( tmp - rhoq(k,I_NI), 0.0_RP ) * rdt
3888 !# endif
3889 !# PQ(k,I_NIccn) = min(dni_max, tmp)
3890 !# PQ(k,I_LIccn) = min(dli_max, PQ(k,I_NIccn)*xi_ccn )
3891 !# else
3892 !# PQ(k,I_NIccn) = 0.0_RP
3893 !# PQ(k,I_LIccn) = 0.0_RP
3894 !# end if
3895  if( (tem(k) < 273.15_rp ) .AND. & !
3896  (rhoq(k,i_ni) < in_max ) .AND. &
3897  (wssi >= eps ) )then !
3898  tmp = c_in * nm_m92 * exp( 0.3_rp * bm_m92 * ( wssi - 0.1_rp ) )
3899  if( inucl_w .and. wdssi > eps ) then
3900  tmp = bm_m92 * 0.3_rp * tmp * wdssi
3901  elseif( so22_het .and. dssidt > eps ) then
3902  tmp = bm_m92 * 0.3_rp * tmp * dssidt
3903  else
3904  tmp = max( tmp - rhoq(k,i_ni), 0.0_rp ) * rdt
3905  endif
3906  pq(k,i_niccn) = min(dni_max, tmp)
3907  pq(k,i_liccn) = min(dli_max, pq(k,i_niccn)*xi_ccn )
3908  else
3909  pq(k,i_niccn) = 0.0_rp
3910  pq(k,i_liccn) = 0.0_rp
3911  end if
3912 
3913 
3914  end do
3915 
3916  if( opt_nucleation_ice_hom ) then
3917  call nucleation_ice_hom( &
3918  ka, ks, ke, & !in
3919  tem, pre, rho, & !in
3920  qdry, rhoq(:,i_qv), & !in
3921  cva, cpa, & !in
3922  w, & !in
3923  dtdt_rad, & !in
3924  dtdt_dep, & !in
3925  plidep_total, dt, & !in
3926  pq(:,i_lihom), & !out
3927  pq(:,i_nihom) ) !out
3928  else
3929  pq(:,i_lihom) = 0.0_rp
3930  pq(:,i_nihom) = 0.0_rp
3931  endif
3932 
3933 
3934  return
real(rp), public cv_vapor
CV for vapor [J/kg/K].
real(rp), public cv_ice
CV for ice [J/kg/K].
module atmosphere / saturation

References scale_atmos_hydrometeor::cv_ice, scale_atmos_hydrometeor::cv_vapor, dep_vapor_ice_wrk(), nucleation_ice_hom(), and scale_prc::prc_abort().

Referenced by atmos_phy_mp_sn14_terminal_velocity().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ nucleation_ice_hom()

subroutine scale_atmos_phy_mp_sn14::nucleation_ice_hom ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
real(rp), dimension(ka), intent(in)  tem,
real(rp), dimension(ka), intent(in)  pre,
real(rp), dimension(ka), intent(in)  rho,
real(rp), dimension(ka), intent(in)  qd,
real(rp), dimension(ka), intent(in)  rhoq_qv,
real(rp), dimension(ka), intent(in)  cva,
real(rp), dimension(ka), intent(in)  cpa,
real(rp), dimension(ka), intent(in)  w,
real(rp), dimension(ka), intent(in)  dTdt_rad,
real(rp), dimension(ka), intent(in)  dTdt_dep,
real(rp), dimension(ka), intent(in)  PLIdep,
real(rp), intent(in)  dt,
real(rp), dimension(ka), intent(out)  PLIhom,
real(rp), dimension(ka), intent(out)  PNIhom 
)

Definition at line 3939 of file scale_atmos_phy_mp_sn14.F90.

3945  use scale_prc, only: &
3946  prc_abort
3947  use scale_const, only: &
3948  psat0 => const_psat0, &
3949  t00 => const_tem00, &
3950  pstd => const_pstd, &
3951  cpvap => const_cpvap, &
3952  cvvap => const_cvvap, &
3953  ci => const_ci, &
3954  cl => const_cl, &
3955  rvap => const_rvap, &
3956  rdry => const_rdry, &
3957  lhs00 => const_lhs00, &
3958  lhs0 => const_lhs0, &
3959  lhv00 => const_lhv00, &
3960  lhf00 => const_lhf00, &
3961  epsvap => const_epsvap, &
3962  grav => const_grav, &
3963  pi => const_pi
3964  implicit none
3965 
3966  integer, intent(in) :: KA, KS, KE
3967 
3968  real(RP), intent(in) :: tem(KA)
3969  real(RP), intent(in) :: pre(KA)
3970  real(RP), intent(in) :: rho(KA)
3971  real(RP), intent(in) :: qd(KA)
3972  real(RP), intent(in) :: rhoq_qv(KA)
3973  real(RP), intent(in) :: cpa(KA) ! specific heat @ cnst. pressure
3974  real(RP), intent(in) :: cva(KA) ! specific heat @ cnst. volume
3975  ! balance equation @ homogeneous ice nucleation
3976  real(RP), intent(in) :: w(KA) ! adiabatic ascending
3977  real(RP), intent(in) :: dTdt_rad(KA) ! effect of radiative heating
3978  real(RP), intent(in) :: dTdt_dep(KA) ! effect of radiative heating
3979  real(RP), intent(in) :: PLIdep(KA)
3980 ! real(RP), intent(out) :: PQ(KA,PQ_MAX) ! competition effect by vapor consumption
3981  real(RP), intent(out):: PLIhom(KA)
3982  real(RP), intent(out):: PNIhom(KA)
3983  real(RP), intent(in) :: dt
3984  real(RP), parameter :: rhoi=916.0_rp ! ice density [kg/m3]
3985  real(RP), parameter :: rrhoi=1.0_rp/rhoi !
3986  real(RP), parameter :: Mw=18.01528_rp ! Water Molar Weight
3987  real(RP), parameter :: Nav=6.0221415e+23_rp ! Avogadro Number
3988  real(RP), parameter :: vw=(mw*1.e-3_rp/nav)/rhoi ! volume of a water molecule in ice phase
3989  ! 18nm*exp( 3.0*log(1.5)**2 )=29.4760367
3990  real(RP), parameter :: r0=29.5e-9_rp ! aerosol mass(volume) mode radius
3991  real(RP), parameter :: c_gf = 1.01187_rp ! dAlmeida
3992  real(RP), parameter :: g_gf = -0.206449_rp ! dAlmeida
3993  real(RP), parameter :: rho_min=1.e-5_rp ! 3.e-3 is lower limit recognized in many experiments.
3994  real(RP), parameter :: tem_min=150.0_rp
3995  real(RP), parameter :: ni_max =300.e+6_rp
3996 ! real(RP) :: dTdt_dep(KA) ! effect of deposition heating
3997  real(RP) :: wtem
3998  real(RP) :: esi, esw
3999  real(RP) :: qsi
4000  real(RP) :: lhs
4001  real(RP) :: dqsidtem
4002  real(RP) :: den1, den2
4003  real(RP) :: dqsidt_pre
4004  real(RP) :: dqsidp_tem
4005  real(RP) :: rw
4006  real(RP) :: temc_lim
4007  real(RP) :: rho_lim
4008  real(RP) :: pre_lim
4009  real(RP) :: Dw
4010  real(RP) :: si, sw
4011  real(RP) :: Scr
4012  real(RP) :: dsidt_mp
4013  real(RP) :: dsidt_rd
4014  real(RP) :: wp
4015  real(RP) :: a1,a2,a3
4016  real(RP) :: b1,b2
4017  real(RP) :: dlogJdT
4018  real(RP) :: dtemdt_dyn
4019  real(RP) :: rtau ! 1/tau
4020  real(RP) :: delta
4021  real(RP) :: kappa
4022  real(RP) :: Rim_w
4023  real(RP) :: ri_wrk
4024  real(RP) :: ri
4025  !
4026  real(RP), parameter :: r2pi = 0.5_rp/pi ! 1/2pi
4027  real(RP), parameter :: sqrt_pi = sqrt(pi)
4028  real(RP), parameter :: coef_mi = 4.0_rp/3.0_rp*pi*rhoi
4029  real(RP), parameter :: eps = 1.e-30_rp
4030  real(RP) :: rdt
4031  integer :: ierr
4032  integer :: ij,k
4033  !
4034 
4035  rdt = 1.0_rp/dt
4036  plihom(:) = 0.0_rp
4037  pnihom(:) = 0.0_rp
4038 ! PQ(:,I_NIhom) = 0.0_RP
4039 ! PQ(:,I_LIhom) = 0.0_RP
4040 ! PQ(1:KS,I_NIhom) = 0.0_RP
4041 ! PQ(1:KS,I_LIhom) = 0.0_RP
4042 ! PQ(KE:KA,I_NIhom) = 0.0_RP
4043 ! PQ(KE:KA,I_LIhom) = 0.0_RP
4044  do k = ks, ke
4045  wtem= max(tem(k), tem_min)
4046  esi = min( psat0 &
4047  * ( wtem / t00 ) ** ( ( cpvap - ci ) / rvap ) &
4048  * exp( lhs00 / rvap &
4049  * ( 1.0_rp / t00 - 1.0_rp / wtem ) ), pre(k))
4050  esw = psat0 &
4051  * ( wtem / t00 ) ** ( ( cpvap - cl ) / rvap ) &
4052  * exp( lhv00 / rvap &
4053  * ( 1.0_rp / t00 - 1.0_rp / wtem ) )
4054  ! (10) in Ren and MacKenzie (2005)
4055  scr = 2.349_rp - wtem/259.0_rp
4056  qsi = epsvap * esi / ( pre(k) - ( 1.0_rp - epsvap ) * esi )
4057  si = rhoq_qv(k)*rvap*wtem/esi ! rho(k)*qv(k)
4058  ! sw must be less than 1 to calculate hygroscopic growth (otherwise, already activated)
4059  sw = min(rho(k)*rhoq_qv(k)*rvap*wtem/esw,0.999_rp)
4060  if ( si < scr ) then
4061  ! No nucleation occurs
4062  qsi = 0.0_rp
4063  lhs = lhs00 + (cpvap - ci )*(wtem-t00)
4064  dqsidtem = 0.0_rp
4065  si = 0.0_rp
4066  sw = 0.0_rp
4067  scr = 100.0_rp
4068  a1 = 0.0_rp
4069  wp = -1.0_rp
4070  rtau = -1.0_rp
4071  else
4072  ! (dsi/dt)_MP
4073  lhs = lhs0 + (cpvap - ci)*(wtem-t00)
4074  dqsidtem = esi/(rho(k)*rvap*wtem*wtem)&
4075  * (lhs/(rvap*wtem)-1.0_rp)
4076  dsidt_mp = -1.0_rp/(rho(k)*qsi) &
4077  * (1.0_rp+si*(lhv00+lhf00+(cvvap-ci)*wtem)/cva(k)*dqsidtem)&
4078  * plidep(k)
4079  dsidt_rd = -si/qsi*dqsidtem*dtdt_rad(k)
4080  ! This is an simple formulation from original paper
4081  a1 = lhs0*grav/(cpa(k)*rvap*tem(k)*tem(k))&
4082  - grav/(rdry*tem(k))
4083 !!$ ! alternative formulation for NICAM-EXACT
4084 !!$ den1 = (pre(k)-(1.0_RP-EPSvap)*esi)*(pre(k)-(1.0_RP-EPSvap)*esi)
4085 !!$ den2 = den1*Rvap*wtem*wtem
4086 !!$ dqsidp_tem=-EPSvap* esi/den1
4087 !!$ dqsidt_pre= EPSvap*pre(k)*lhs*esi/den2
4088 !!$ a1 = GRAV/qsi*(dqsidt_pre/cpa(k)+dqsidp_tem*rho(k))
4089  wp = w(k) + 1.0_rp/(a1*si)*(dsidt_mp+dsidt_rd)
4090  ! (21) in RM05
4091  dlogjdt = -0.004_rp*wtem*wtem + 2.0_rp*wtem - 304.4_rp
4092  ! (22) in RM05
4093  dtemdt_dyn= - grav*w(k)/cpa(k)
4094  rtau = dlogjdt*(dtdt_rad(k)+dtdt_dep(k)+dtemdt_dyn )
4095  endif
4096  rw = r0*c_gf*(1-sw)**g_gf
4097 
4098  if ( wp > eps .AND. rtau > eps ) then
4099  ! a1,a2,a3,b1,b2 are given by Appendix B in RM05
4100  temc_lim= max(tem(k)-t00, temc_lim_diff )
4101  rho_lim = max(rho(k),rho_min) !
4102  pre_lim = rho_lim*(qd(k)*rdry + rhoq_qv(k)*rvap)*(temc_lim+t00)! only for Dw
4103  dw = 0.211e-4_rp* (((temc_lim+t00)/t00)**1.94_rp) *(pstd/pre_lim)
4104  ! v_th = sqrt(8*Rv*T/pi) in the paragraph after eq(2) in Karcher etal.(2006)
4105  b2 = 0.5_rp/dw*sqrt(rvap*wtem*r2pi)
4106  b1 = (si-1.0_rp)*0.5_rp*rrhoi*esi/sqrt(2.0_rp*pi*rvap*wtem)
4107  a2 = mw*rvap*wtem/(nav*esi)
4108  a3 = epsvap*mw*lhs0*lhs0/(nav*cpa(k)*pre(k)*wtem)
4109  delta = b2*rw
4110  kappa = 2.0_rp*b1*b2/( rtau*(1.0_rp+delta)*(1.0_rp+delta) )
4111  ! (A9) in RM05
4112  rim_w = max(1.e-20_rp, 0.5_rp*(1.0_rp+delta)*(3.0_rp*kappa/(2.0_rp+sqrt(1.0_rp+9.0_rp/pi*kappa))) &
4113  + 1.0_rp/(1.0_rp+delta)*(3.0_rp /(2.0_rp+sqrt(1.0_rp+9.0_rp/pi*kappa)))+delta-1.0_rp )
4114  pnihom(k) = min( scr/(scr-1.0_rp)*a1*wp/(rim_w*4.0_rp*pi*dw/b2), ni_max )* rdt
4115  ri_wrk = 1.0_rp+b2*rw
4116  ri = ( sqrt(ri_wrk*ri_wrk + 2.0_rp*b1*b2*dt )-1.0_rp )/b2
4117  plihom(k) = coef_mi*ri*ri*ri*pnihom(k)
4118  else
4119  plihom(k) = 0.0_rp
4120  pnihom(k) = 0.0_rp
4121  endif
4122  enddo
4123  !
4124  return
real(rp), parameter, public const_tem00
temperature reference (0C) [K]
Definition: scale_const.F90:99
real(rp), public const_pstd
standard pressure [Pa]
Definition: scale_const.F90:96
real(rp), parameter, public const_rvap
specific gas constant (water vapor) [J/kg/K]
Definition: scale_const.F90:68
real(rp), public const_lhf00
latent heat of fusion at 0K [J/kg]
Definition: scale_const.F90:87
real(rp), public const_lhv00
latent heat of vaporizaion at 0K [J/kg]
Definition: scale_const.F90:83
real(rp), public const_lhs00
latent heat of sublimation at 0K [J/kg]
Definition: scale_const.F90:85
real(rp), parameter, public const_lhs0
latent heat of sublimation at 0C [J/kg]
Definition: scale_const.F90:84
real(rp), parameter, public const_cl
specific heat (liquid water) [J/kg/K]
Definition: scale_const.F90:71
real(rp), parameter, public const_ci
specific heat (ice) [J/kg/K]
Definition: scale_const.F90:72
real(rp), public const_grav
standard acceleration of gravity [m/s2]
Definition: scale_const.F90:49
real(rp), public const_cvvap
specific heat (water vapor, constant volume) [J/kg/K]
Definition: scale_const.F90:70
real(rp), parameter, public const_psat0
saturate pressure of water vapor at 0C [Pa]
Definition: scale_const.F90:88
real(rp), public const_epsvap
Rdry / Rvap.
Definition: scale_const.F90:75
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
Definition: scale_const.F90:59
real(rp), parameter, public const_cpvap
specific heat (water vapor, constant pressure) [J/kg/K]
Definition: scale_const.F90:69

References scale_const::const_ci, scale_const::const_cl, scale_const::const_cpvap, scale_const::const_cvvap, scale_const::const_epsvap, scale_const::const_grav, scale_const::const_lhf00, scale_const::const_lhs0, scale_const::const_lhs00, scale_const::const_lhv00, scale_const::const_pi, scale_const::const_psat0, scale_const::const_pstd, scale_const::const_rdry, scale_const::const_rvap, scale_const::const_tem00, and scale_prc::prc_abort().

Referenced by nucleation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ice_multiplication()

subroutine scale_atmos_phy_mp_sn14::ice_multiplication ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
logical, intent(in)  flg_lt,
real(rp), dimension(ka,pac_max), intent(in)  Pac,
real(rp), dimension(ka), intent(in)  tem,
real(rp), dimension(ka,i_qv:i_ng), intent(in)  rhoq,
real(rp), dimension(ka,i_qc:i_qg), intent(in)  rhoq_crg,
real(rp), dimension(ka,hydro_max), intent(in)  xq,
real(rp), dimension(ka,pq_max), intent(inout)  PQ,
real(rp), dimension(ka,pq_max), intent(inout)  Pcrg1 
)

Definition at line 4128 of file scale_atmos_phy_mp_sn14.F90.

4135 
4136  ! ice multiplication by splintering
4137  ! we consider Hallet-Mossop process
4138  use scale_specfunc, only: &
4139  gammafunc => sf_gamma
4140  implicit none
4141  integer, intent(in) :: KA, KS, KE
4142 
4143  real(RP), intent(in) :: Pac(KA,Pac_MAX)
4144  real(RP), intent(in) :: tem(KA)
4145  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
4146  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
4147  !
4148  real(RP), intent(inout):: PQ(KA,PQ_MAX)
4149  ! for lightning
4150  logical, intent(in) :: flg_lt
4151  real(RP), intent(in) :: rhoq_crg(KA,I_QC:I_QG)
4152  real(RP), intent(inout):: Pcrg1(KA,PQ_MAX)
4153  !
4154  ! production of (350.d3 ice particles)/(cloud riming [g]) => 350*d6 [/kg]
4155  real(RP), parameter :: pice = 350.0e+6_rp
4156  ! production of (1 ice particle)/(250 cloud particles riming)
4157  real(RP), parameter :: pnc = 250.0_rp
4158  ! temperature factor
4159  real(RP) :: fp
4160 
4161  real(RP) :: igm ! in complete gamma(x,alpha)
4162  real(RP) :: x
4163  ! coefficient of expansion using in calculation of igm
4164  real(RP) :: a0,a1,a2,a3,a4,a5
4165  real(RP) :: a6,a7,a8,a9,a10
4166  real(RP) :: an1,an2,b0,b1,b2,c0,c1,c2
4167  real(RP) :: d0,d1,d2,e1,e2,h0,h1,h2
4168  real(RP), parameter :: eps=1.0e-30_rp
4169  ! number of cloud droplets larger than 12 micron(radius).
4170  real(RP) :: n12
4171  !
4172  real(RP) :: wn, wni, wns, wng
4173  integer :: k, iq
4174  real(RP) :: sw1
4175  !
4176  !
4177 !OCL LOOP_FISSION_TARGET(LS)
4178  do k = ks, ke
4179  ! Here we assume particle temperature is same as environment temperature.
4180  ! If you want to treat in a better manner,
4181  ! you can diagnose with eq.(64) in CT(86)
4182  if (tem(k) > 270.16_rp)then
4183  fp = 0.0_rp
4184  else if(tem(k) >= 268.16_rp)then
4185  fp = (270.16_rp-tem(k))*0.5_rp
4186  else if(tem(k) >= 265.16_rp)then
4187  fp = (tem(k)-265.16_rp)*0.333333333_rp
4188  else
4189  fp = 0.0_rp
4190  end if
4191  ! Approximation of Incomplete Gamma function
4192  ! Here we calculate with algorithm by Numerical Recipes.
4193  ! This approach is based on eq.(78) in Cotton etal.(1986),
4194  ! but more accurate and expanded for Generalized Gamma Distribution.
4195  x = coef_lambda(i_mp_qc)*(xc_cr/xq(k,i_mp_qc))**mu(i_mp_qc)
4196  !
4197  if(x<1.e-2_rp*alpha)then ! negligible
4198  igm = 0.0_rp
4199  else if(x<alpha+1.0_rp)then ! series expansion
4200  ! 10th-truncation is enough for cloud droplet.
4201  a0 = 1.0_rp/alpha ! n=0
4202  a1 = a0*x/(alpha+1.0_rp) ! n=1
4203  a2 = a1*x/(alpha+2.0_rp) ! n=2
4204  a3 = a2*x/(alpha+3.0_rp) ! n=3
4205  a4 = a3*x/(alpha+4.0_rp) ! n=4
4206  a5 = a4*x/(alpha+5.0_rp) ! n=5
4207  a6 = a5*x/(alpha+6.0_rp) ! n=6
4208  a7 = a6*x/(alpha+7.0_rp) ! n=7
4209  a8 = a7*x/(alpha+8.0_rp) ! n=8
4210  a9 = a8*x/(alpha+9.0_rp) ! n=9
4211  a10 = a9*x/(alpha+10.0_rp) ! n=10
4212  igm = (a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10)*exp( -x + alpha*log(x) - lgm )
4213  else if(x<alpha*100.0_rp) then ! continued fraction expansion
4214  ! 2nd-truncation is enough for cloud droplet.
4215  ! setup
4216  b0 = x+1.0_rp-alpha
4217  c0 = 1.0_rp/eps
4218  d0 = 1.0_rp/b0
4219  h0 = d0
4220  ! n=1
4221  an1 = -(1.0_rp-alpha)
4222  b1 = b0 + 2.0_rp
4223  d1 = 1.0_rp/(an1*d0+b1)
4224  c1 = b1+an1/c0
4225  e1 = d1*c1
4226  h1 = h0*e1
4227  ! n=2
4228  an2 = -2.0_rp*(2.0_rp-alpha)
4229  b2 = b1 + 2.0_rp
4230  d2 = 1.0_rp/(an2*d1+b2)
4231  c2 = b2+an2/c1
4232  e2 = d2*c2
4233  h2 = h1*e2
4234  !
4235  igm = 1.0_rp - exp( -x + alpha*log(x) - lgm )*h2
4236  else ! negligible
4237  igm = 1.0_rp
4238  end if
4239  ! n12 is number of cloud droplets larger than 12 micron.
4240  n12 = rhoq(k,i_nc)*(1.0_rp-igm)
4241  ! eq.(82) CT(86)
4242  wn = (pice + n12/((rhoq(k,i_qc)+xc_min)*pnc) )*fp ! filtered by xc_min
4243  wni = wn*(-pac(k,i_liaclc2li) ) ! riming production rate is all negative
4244  wns = wn*(-pac(k,i_lsaclc2ls) )
4245  wng = wn*(-pac(k,i_lgaclc2lg) )
4246  pq(k,i_nispl) = wni+wns+wng
4247  !
4248  pq(k,i_lsspl) = - wns*xq(k,i_mp_qi) ! snow => ice
4249  pq(k,i_lgspl) = - wng*xq(k,i_mp_qi) ! graupel => ice
4250  if (flg_lt) then
4251  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NC is small,ignore charge transfer
4252  pcrg1(k,i_nsspl) = - wns*(1.0_rp-sw1) &
4253  / (rhoq(k,i_ns)+sw1)*rhoq_crg(k,i_qs)
4254  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NC is small,ignore charge transfer
4255  pcrg1(k,i_ngspl) = - wng*(1.0_rp-sw1) &
4256  / (rhoq(k,i_ng)+sw1)*rhoq_crg(k,i_qg)
4257  pcrg1(k,i_nispl) = - ( pcrg1(k,i_nsspl) + pcrg1(k,i_ngspl) )
4258  end if
4259  !
4260  end do
4261  !
4262  return
module SPECFUNC
real(rp) function, public sf_gamma(x)
Gamma function.

References scale_specfunc::sf_gamma().

Referenced by atmos_phy_mp_sn14_terminal_velocity().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ mixed_phase_collection()

subroutine scale_atmos_phy_mp_sn14::mixed_phase_collection ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
logical, intent(in)  flg_lt,
real(rp), intent(in)  d0_crg,
real(rp), intent(in)  v0_crg,
real(rp), dimension(ka), intent(in)  beta_crg,
real(rp), dimension(ka), intent(in)  dqcrg,
real(rp), dimension(ka), intent(in)  wtem,
real(rp), dimension(ka,i_qv:i_ng), intent(in)  rhoq,
real(rp), dimension(ka,i_qc:i_qg), intent(in)  rhoq_crg,
real(rp), dimension(ka,hydro_max), intent(in)  xq,
real(rp), dimension(ka,hydro_max), intent(in)  dq_xave,
real(rp), dimension(ka,hydro_max,2), intent(in)  vt_xave,
real(rp), dimension(ka,pq_max), intent(inout)  PQ,
real(rp), dimension(ka,pq_max), intent(inout)  Pcrg1,
real(rp), dimension(ka,pcrg_max), intent(inout)  Pcrg2,
real(rp), dimension(ka,pac_max), intent(out)  Pac 
)

Definition at line 4267 of file scale_atmos_phy_mp_sn14.F90.

4279  use scale_atmos_saturation, only: &
4280  moist_psat_ice => atmos_saturation_psat_ice
4281  implicit none
4282 
4283  integer, intent(in) :: KA, KS, KE
4284 
4285  !--- mixed-phase collection process
4286  ! And all we set all production term as a negative sign to avoid confusion.
4287  !
4288  real(RP), intent(in) :: wtem(KA)
4289  !--- mass/number concentration[kg/m3]
4290  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
4291  ! necessary ?
4292  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
4293  !--- diameter of averaged mass( D(ave x) )
4294  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX)
4295  !--- terminal velocity of averaged mass( vt(ave x) )
4296  real(RP), intent(in) :: vt_xave(KA,HYDRO_MAX,2)
4297  ! [Add] 11/08/30 T.Mitsui, for autoconversion of ice
4298  ! real(RP), intent(in) :: rho(KA)
4299  !--- partial conversion
4300  real(RP), intent(inout):: PQ(KA,PQ_MAX)
4301  !
4302  real(RP), intent(out):: Pac(KA,Pac_MAX)
4303  !--- for lightning component
4304  logical, intent(in) :: flg_lt
4305  real(RP), intent(in) :: beta_crg(KA)
4306  real(RP), intent(in) :: dqcrg(KA)
4307  real(RP), intent(in) :: d0_crg, v0_crg
4308  real(RP), intent(in) :: rhoq_crg(KA,I_QC:I_QG)
4309  real(RP), intent(inout):: Pcrg1(KA,PQ_MAX)
4310  real(RP), intent(inout):: Pcrg2(KA,Pcrg_MAX)
4311 
4312  real(RP), parameter :: a_dec = 0.883_rp
4313  real(RP), parameter :: b_dec = 0.093_rp
4314  real(RP), parameter :: c_dec = 0.00348_rp
4315  real(RP), parameter :: d_dec = 4.5185e-5_rp
4316  !
4317  !
4318  real(RP) :: tem(KA)
4319  !
4320  !--- collection efficency of each specie
4321  real(RP) :: E_c(KA), E_r, E_i, E_s, E_g
4322  real(RP) :: E_ic, E_sc, E_gc
4323  !--- sticking efficiency
4324  real(RP) :: E_stick(KA)
4325  ! [Add] 10/08/03 T.Mitsui
4326  real(RP) :: temc, temc2, temc3
4327  real(RP) :: E_dec
4328  real(RP) :: esi_rat
4329  real(RP) :: esi(KA)
4330  !
4331  real(RP) :: temc_p, temc_m ! celcius tem.
4332 ! real(RP) :: ci_aut(KA)
4333 ! real(RP) :: taui_aut(KA)
4334 ! real(RP) :: tau_sce(KA)
4335  !--- DSD averaged diameter for each species
4336  real(RP) :: ave_dc ! cloud
4337 ! real(RP) :: ave_dr ! rain
4338  real(RP) :: ave_di(KA) ! ice
4339  real(RP) :: ave_ds(KA) ! snow
4340  real(RP) :: ave_dg ! graupel
4341  !--- coefficient of collection equations(L:mass, N:number)
4342  real(RP) :: coef_acc_LCI, coef_acc_NCI ! cloud - cloud ice
4343  real(RP) :: coef_acc_LCS, coef_acc_NCS ! cloud - snow
4344  !
4345  real(RP) :: coef_acc_LCG, coef_acc_NCG ! cloud - graupel
4346  real(RP) :: coef_acc_LRI_I, coef_acc_NRI_I ! rain - cloud ice
4347  real(RP) :: coef_acc_LRI_R, coef_acc_NRI_R ! rain - cloud ice
4348  real(RP) :: coef_acc_LRS_S, coef_acc_NRS_S ! rain - snow
4349  real(RP) :: coef_acc_LRS_R, coef_acc_NRS_R ! rain - snow
4350  real(RP) :: coef_acc_LRG, coef_acc_NRG ! rain - graupel
4351  real(RP) :: coef_acc_LII, coef_acc_NII ! cloud ice - cloud ice
4352  real(RP) :: coef_acc_LIS, coef_acc_NIS ! cloud ice - snow
4353  real(RP) :: coef_acc_NSS ! snow - snow
4354  real(RP) :: coef_acc_NGG ! grauepl - graupel
4355  real(RP) :: coef_acc_LSG, coef_acc_NSG(KA) ! snow - graupel
4356  !--- (diameter) x (diameter)
4357  real(RP) :: dcdc(KA), dcdi, dcds, dcdg
4358  real(RP) :: drdr(KA), drdi(KA), drds(KA), drdg
4359  real(RP) :: didi(KA), dids, didg
4360  real(RP) :: dsds(KA), dsdg
4361  real(RP) :: dgdg(KA)
4362  !--- (terminal velocity) x (terminal velocity)
4363  real(RP) :: vcvc(KA), vcvi, vcvs, vcvg
4364  real(RP) :: vrvr(KA), vrvi(KA), vrvs(KA), vrvg
4365  real(RP) :: vivi(KA), vivs, vivg
4366  real(RP) :: vsvs(KA), vsvg
4367  real(RP) :: vgvg(KA)
4368  !
4369  real(RP) :: wx_cri, wx_crs
4370  real(RP) :: coef_emelt
4371  real(RP) :: w1
4372 
4373  real(RP) :: sw, sw1, sw2
4374  real(RP) :: alpha_lt
4375  !
4376  integer :: k, iqw
4377  !
4378  !
4379  do k = ks, ke
4380  tem(k) = max( wtem(k), tem_min ) ! 11/08/30 T.Mitsui
4381  end do
4382 
4383  call moist_psat_ice( ka, ks, ke, &
4384  tem(:), esi(:) ) ! [IN], [OUT]
4385 
4386  if( opt_stick_ks96 )then
4387  do k = ks, ke
4388  ! Khain and Sednev (1996), eq.(3.15)
4389  temc = tem(k) - t00
4390  temc2 = temc*temc
4391  temc3 = temc2*temc
4392  e_dec = max(0.0_rp, a_dec + b_dec*temc + c_dec*temc2 + d_dec*temc3 )
4393  esi_rat = rhoq(k,i_qv)*rvap*tem(k)/esi(k)
4394  e_stick(k) = min(1.0_rp, e_dec*esi_rat)
4395  end do
4396  else if( opt_stick_co86 )then
4397  do k = ks, ke
4398  ! [Add] 11/08/30 T.Mitsui, Cotton et al. (1986)
4399  temc = min(tem(k) - t00,0.0_rp)
4400  w1 = 0.035_rp*temc-0.7_rp
4401  e_stick(k) = 10._rp**w1
4402  end do
4403  else
4404  do k = ks, ke
4405  ! Lin et al. (1983)
4406  temc_m = min(tem(k) - t00,0.0_rp) ! T < 273.15
4407  e_stick(k) = exp(0.09_rp*temc_m)
4408  end do
4409  end if
4410 
4411  do k = ks, ke
4412  ! averaged diameter using SB06(82)
4413  ave_dc = coef_d(i_mp_qc)*xq(k,i_mp_qc)**b_m(i_mp_qc)
4414  !------------------------------------------------------------------------
4415  ! coellection efficiency are given as follows
4416  e_c(k) = max(0.0_rp, min(1.0_rp, (ave_dc-dc0)/(dc1-dc0) ))
4417  end do
4418 
4419  !------------------------------------------------------------------------
4420  ! Collection: a collects b ( assuming particle size a>b )
4421  do k = ks, ke
4422  dcdc(k) = dq_xave(k,i_mp_qc) * dq_xave(k,i_mp_qc)
4423  drdr(k) = dq_xave(k,i_mp_qr) * dq_xave(k,i_mp_qr)
4424  didi(k) = dq_xave(k,i_mp_qi) * dq_xave(k,i_mp_qi)
4425  dsds(k) = dq_xave(k,i_mp_qs) * dq_xave(k,i_mp_qs)
4426  dgdg(k) = dq_xave(k,i_mp_qg) * dq_xave(k,i_mp_qg)
4427  drdi(k) = dq_xave(k,i_mp_qr) * dq_xave(k,i_mp_qi)
4428  drds(k) = dq_xave(k,i_mp_qr) * dq_xave(k,i_mp_qs)
4429  end do
4430  do k = ks, ke
4431  vcvc(k) = vt_xave(k,i_mp_qc,2) * vt_xave(k,i_mp_qc,2)
4432  vrvr(k) = vt_xave(k,i_mp_qr,2) * vt_xave(k,i_mp_qr,2)
4433  vivi(k) = vt_xave(k,i_mp_qi,2) * vt_xave(k,i_mp_qi,2)
4434  vsvs(k) = vt_xave(k,i_mp_qs,2) * vt_xave(k,i_mp_qs,2)
4435  vgvg(k) = vt_xave(k,i_mp_qg,2) * vt_xave(k,i_mp_qg,2)
4436  vrvi(k) = vt_xave(k,i_mp_qr,2) * vt_xave(k,i_mp_qi,2)
4437  vrvs(k) = vt_xave(k,i_mp_qr,2) * vt_xave(k,i_mp_qs,2)
4438  end do
4439 
4440  do k = ks, ke
4441  ave_di(k) = coef_d(i_mp_qi)*xq(k,i_mp_qi)**b_m(i_mp_qi)
4442  ave_ds(k) = coef_d(i_mp_qs)*xq(k,i_mp_qs)**b_m(i_mp_qs)
4443  end do
4444 
4445  !------------------------------------------------------------------------
4446  !
4447  !+++ pattern 1: a + b => a (a>b)
4448  ! (i-c, s-c, g-c, s-i, g-r, s-g)
4449  !------------------------------------------------------------------------
4450 
4451  ! cloud-ice => ice
4452  ! reduction term of cloud
4453  do k = ks, ke
4454  dcdi = dq_xave(k,i_mp_qc) * dq_xave(k,i_mp_qi)
4455  vcvi = vt_xave(k,i_mp_qc,2) * vt_xave(k,i_mp_qi,2)
4456  sw = 0.5_rp - sign(0.5_rp, di0-ave_di(k)) ! if(ave_di>di0)then sw=1
4457  e_i = e_im * sw
4458  e_ic = e_i*e_c(k)
4459  coef_acc_lci = &
4460  ( delta_b1(i_mp_qc)*dcdc(k) + delta_ab1(i_mp_qi,i_mp_qc)*dcdi + delta_b0(i_mp_qi)*didi(k) ) &
4461  * sqrt( theta_b1(i_mp_qc)*vcvc(k) - theta_ab1(i_mp_qi,i_mp_qc)*vcvi + theta_b0(i_mp_qi)*vivi(k) &
4462  + sigma_i + sigma_c )
4463  coef_acc_nci = &
4464  ( delta_b0(i_mp_qc)*dcdc(k) + delta_ab0(i_mp_qi,i_mp_qc)*dcdi + delta_b0(i_mp_qi)*didi(k) ) &
4465  * sqrt( theta_b0(i_mp_qc)*vcvc(k) - theta_ab0(i_mp_qi,i_mp_qc)*vcvi + theta_b0(i_mp_qi)*vivi(k) &
4466  + sigma_i + sigma_c )
4467  pac(k,i_liaclc2li)= -0.25_rp*pi*e_ic*rhoq(k,i_ni)*rhoq(k,i_qc)*coef_acc_lci
4468  pac(k,i_niacnc2ni)= -0.25_rp*pi*e_ic*rhoq(k,i_ni)*rhoq(k,i_nc)*coef_acc_nci
4469  end do
4470 
4471  ! cloud-snow => snow
4472  ! reduction term of cloud
4473  do k = ks, ke
4474  dcds = dq_xave(k,i_mp_qc) * dq_xave(k,i_mp_qs)
4475  vcvs = vt_xave(k,i_mp_qc,2) * vt_xave(k,i_mp_qs,2)
4476  sw = 0.5_rp - sign(0.5_rp, ds0-ave_ds(k)) ! if(ave_ds>ds0)then sw=1
4477  e_s = e_sm * sw
4478  e_sc = e_s*e_c(k)
4479  coef_acc_lcs = &
4480  ( delta_b1(i_mp_qc)*dcdc(k) + delta_ab1(i_mp_qs,i_mp_qc)*dcds + delta_b0(i_mp_qs)*dsds(k) ) &
4481  * sqrt( theta_b1(i_mp_qc)*vcvc(k) - theta_ab1(i_mp_qs,i_mp_qc)*vcvs + theta_b0(i_mp_qs)*vsvs(k) &
4482  + sigma_s + sigma_c )
4483  coef_acc_ncs = &
4484  ( delta_b0(i_mp_qc)*dcdc(k) + delta_ab0(i_mp_qs,i_mp_qc)*dcds + delta_b0(i_mp_qs)*dsds(k) ) &
4485  * sqrt( theta_b0(i_mp_qc)*vcvc(k) - theta_ab0(i_mp_qs,i_mp_qc)*vcvs + theta_b0(i_mp_qs)*vsvs(k) &
4486  + sigma_s + sigma_c )
4487  pac(k,i_lsaclc2ls)= -0.25_rp*pi*e_sc*rhoq(k,i_ns)*rhoq(k,i_qc)*coef_acc_lcs
4488  pac(k,i_nsacnc2ns)= -0.25_rp*pi*e_sc*rhoq(k,i_ns)*rhoq(k,i_nc)*coef_acc_ncs
4489  end do
4490 
4491  ! cloud-graupel => graupel
4492  ! reduction term of cloud
4493  do k = ks, ke
4494  dcdg = dq_xave(k,i_mp_qc) * dq_xave(k,i_mp_qg)
4495  vcvg = vt_xave(k,i_mp_qc,2) * vt_xave(k,i_mp_qg,2)
4496  ave_dg = coef_d(i_mp_qg)*xq(k,i_mp_qg)**b_m(i_mp_qg)
4497  sw = 0.5_rp - sign(0.5_rp, dg0-ave_dg) ! if(ave_dg>dg0)then sw=1
4498  e_g = e_gm * sw
4499  e_gc = e_g*e_c(k)
4500  coef_acc_lcg = &
4501  ( delta_b1(i_mp_qc)*dcdc(k) + delta_ab1(i_mp_qg,i_mp_qc)*dcdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4502  * sqrt( theta_b1(i_mp_qc)*vcvc(k) - theta_ab1(i_mp_qg,i_mp_qc)*vcvg + theta_b0(i_mp_qg)*vgvg(k) &
4503  + sigma_g + sigma_c )
4504  coef_acc_ncg = &
4505  ( delta_b0(i_mp_qc)*dcdc(k) + delta_ab0(i_mp_qg,i_mp_qc)*dcdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4506  * sqrt( theta_b0(i_mp_qc)*vcvc(k) - theta_ab0(i_mp_qg,i_mp_qc)*vcvg + theta_b0(i_mp_qg)*vgvg(k) &
4507  + sigma_g + sigma_c )
4508  pac(k,i_lgaclc2lg)= -0.25_rp*pi*e_gc*rhoq(k,i_ng)*rhoq(k,i_qc)*coef_acc_lcg
4509  pac(k,i_ngacnc2ng)= -0.25_rp*pi*e_gc*rhoq(k,i_ng)*rhoq(k,i_nc)*coef_acc_ncg
4510  end do
4511 
4512  ! snow-graupel => graupel
4513  do k = ks, ke
4514  dsdg = dq_xave(k,i_mp_qs) * dq_xave(k,i_mp_qg)
4515  vsvg = vt_xave(k,i_mp_qs,2) * vt_xave(k,i_mp_qg,2)
4516  coef_acc_lsg = &
4517  ( delta_b1(i_mp_qs)*dsds(k) + delta_ab1(i_mp_qg,i_mp_qs)*dsdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4518  * sqrt( theta_b1(i_mp_qs)*vsvs(k) - theta_ab1(i_mp_qg,i_mp_qs)*vsvg + theta_b0(i_mp_qg)*vgvg(k) &
4519  + sigma_g + sigma_s )
4520  coef_acc_nsg(k) = &
4521  ( delta_b0(i_mp_qs)*dsds(k) + delta_ab0(i_mp_qg,i_mp_qs)*dsdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4522  ! [fix] T.Mitsui 08/05/08
4523  * sqrt( theta_b0(i_mp_qs)*vsvs(k) - theta_ab0(i_mp_qg,i_mp_qs)*vsvg + theta_b0(i_mp_qg)*vgvg(k) &
4524  + sigma_g + sigma_s )
4525  pac(k,i_lgacls2lg)= -0.25_rp*pi*e_stick(k)*e_gs*rhoq(k,i_ng)*rhoq(k,i_qs)*coef_acc_lsg
4526  pac(k,i_ngacns2ng)= -0.25_rp*pi*e_stick(k)*e_gs*rhoq(k,i_ng)*rhoq(k,i_ns)*coef_acc_nsg(k)
4527  end do
4528 
4529  !-----------------
4530  ! (start) Y.Sato added on 2018/8/31
4531  !--- ice-graupel => graupel
4532 !!$ do k = KS, KE
4533 !!$ didg = dq_xave(k,I_mp_QI) * dq_xave(k,I_mp_QG)
4534 !!$ vivg = vt_xave(k,I_mp_QI,2) * vt_xave(k,I_mp_QG,2)
4535 !!$ coef_acc_LIG = &
4536 !!$ ( delta_b1(I_QI)*didi(k) + delta_ab1(I_QG,I_QI)*didg + delta_b0(I_QG)*dgdg(k) ) &
4537 !!$ * sqrt( theta_b1(I_QI)*vivi(k) - theta_ab1(I_QG,I_QI)*vivg + theta_b0(I_QG)*vgvg(k) &
4538 !!$ + sigma_g + sigma_i )
4539 !!$ coef_acc_NIG(k) = &
4540 !!$ ( delta_b0(I_QI)*didi(k) + delta_ab0(I_QG,I_QI)*didg + delta_b0(I_QG)*dgdg(k) ) &
4541 !!$ * sqrt( theta_b0(I_QI)*vivi(k) - theta_ab0(I_QG,I_QI)*vivg + theta_b0(I_QG)*vgvg(k) &
4542 !!$ + sigma_g + sigma_i )
4543 !!$ Pac(k,I_LGacLI2LG)= -0.25_RP*pi*E_stick(k)*E_gi*rhoq(k,I_NG)*rhoq(k,I_QI)*coef_acc_LIG*flg_igcol
4544 !!$ Pac(k,I_NGacNI2NG)= -0.25_RP*pi*E_stick(k)*E_gi*rhoq(k,I_NG)*rhoq(k,I_NI)*coef_acc_NIG(k)*flg_igcol
4545 !!$ end do
4546 
4547  !------------------------------------------------------------------------
4548  ! ice-snow => snow
4549  ! reduction term of ice
4550  do k = ks, ke
4551  dids = dq_xave(k,i_mp_qi) * dq_xave(k,i_mp_qs)
4552  vivs = vt_xave(k,i_mp_qi,2) * vt_xave(k,i_mp_qs,2)
4553  coef_acc_lis = &
4554  ( delta_b1(i_mp_qi)*didi(k) + delta_ab1(i_mp_qs,i_mp_qi)*dids + delta_b0(i_mp_qs)*dsds(k) ) &
4555  * sqrt( theta_b1(i_mp_qi)*vivi(k) - theta_ab1(i_mp_qs,i_mp_qi)*vivs + theta_b0(i_mp_qs)*vsvs(k) &
4556  + sigma_i + sigma_s )
4557  coef_acc_nis = &
4558  ( delta_b0(i_mp_qi)*didi(k) + delta_ab0(i_mp_qs,i_mp_qi)*dids + delta_b0(i_mp_qs)*dsds(k) ) &
4559  * sqrt( theta_b0(i_mp_qi)*vivi(k) - theta_ab0(i_mp_qs,i_mp_qi)*vivs + theta_b0(i_mp_qs)*vsvs(k) &
4560  + sigma_i + sigma_s )
4561  pac(k,i_liacls2ls)= -0.25_rp*pi*e_stick(k)*e_si*rhoq(k,i_ns)*rhoq(k,i_qi)*coef_acc_lis
4562  pac(k,i_niacns2ns)= -0.25_rp*pi*e_stick(k)*e_si*rhoq(k,i_ns)*rhoq(k,i_ni)*coef_acc_nis
4563  end do
4564 
4565  do k = ks, ke
4566  drdg = dq_xave(k,i_mp_qr) * dq_xave(k,i_mp_qg)
4567  vrvg = vt_xave(k,i_mp_qr,2) * vt_xave(k,i_mp_qg,2)
4568  sw = sign(0.5_rp, t00-tem(k)) + 0.5_rp
4569  ! if ( tem(k) <= T00 )then
4570  ! rain-graupel => graupel
4571  ! reduction term of rain
4572  ! sw = 1
4573  ! else
4574  ! rain-graupel => rain
4575  ! reduction term of graupel
4576  ! sw = 0
4577  coef_acc_lrg = &
4578  ( ( delta_b1(i_mp_qr)*drdr(k) + delta_ab1(i_mp_qg,i_mp_qr)*drdg + delta_b0(i_mp_qg)*dgdg(k) ) * sw &
4579  + ( delta_b1(i_mp_qg)*dgdg(k) + delta_ab1(i_mp_qr,i_mp_qg)*drdg + delta_b0(i_mp_qr)*drdr(k) ) * (1.0_rp-sw) ) &
4580  * sqrt( ( theta_b1(i_mp_qr)*vrvr(k) - theta_ab1(i_mp_qg,i_mp_qr)*vrvg + theta_b0(i_mp_qg)*vgvg(k) ) * sw &
4581  + ( theta_b1(i_mp_qg)*vgvg(k) - theta_ab1(i_mp_qr,i_mp_qg)*vrvg + theta_b0(i_mp_qr)*vrvr(k) ) * (1.0_rp-sw) &
4582  + sigma_r + sigma_g )
4583  pac(k,i_lraclg2lg) = -0.25_rp*pi*e_gr*coef_acc_lrg * ( rhoq(k,i_ng)*rhoq(k,i_qr) * sw &
4584  + rhoq(k,i_nr)*rhoq(k,i_qg) * (1.0_rp-sw) )
4585  coef_acc_nrg = &
4586  ( delta_b0(i_mp_qr)*drdr(k) + delta_ab0(i_mp_qg,i_mp_qr)*drdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4587  * sqrt( theta_b0(i_mp_qr)*vrvr(k) - theta_ab0(i_mp_qg,i_mp_qr)*vrvg + theta_b0(i_mp_qg)*vgvg(k) &
4588  + sigma_r + sigma_g )
4589  pac(k,i_nracng2ng) = -0.25_rp*pi*e_gr*rhoq(k,i_ng)*rhoq(k,i_nr)*coef_acc_nrg
4590  end do
4591 
4592  !------------------------------------------------------------------------
4593  !
4594  !+++ pattern 2: a + b => c (a>b)
4595  ! (r-i,r-s)
4596  !------------------------------------------------------------------------
4597 
4598  ! rain-ice => graupel
4599  ! reduction term of ice
4600  do k = ks, ke
4601  coef_acc_lri_i = &
4602  ( delta_b1(i_mp_qi)*didi(k) + delta_ab1(i_mp_qr,i_mp_qi)*drdi(k) + delta_b0(i_mp_qr)*drdr(k) ) &
4603  * sqrt( theta_b1(i_mp_qi)*vivi(k) - theta_ab1(i_mp_qr,i_mp_qi)*vrvi(k) + theta_b0(i_mp_qr)*vrvr(k) &
4604  + sigma_r + sigma_i )
4605  coef_acc_nri_i = &
4606  ( delta_b0(i_mp_qi)*didi(k) + delta_ab0(i_mp_qr,i_mp_qi)*drdi(k) + delta_b0(i_mp_qr)*drdr(k) ) &
4607  * sqrt( theta_b0(i_mp_qi)*vivi(k) - theta_ab0(i_mp_qr,i_mp_qi)*vrvi(k) + theta_b0(i_mp_qr)*vrvr(k) &
4608  + sigma_r + sigma_i )
4609  pac(k,i_lracli2lg_i)= -0.25_rp*pi*e_ir*rhoq(k,i_nr)*rhoq(k,i_qi)*coef_acc_lri_i
4610  pac(k,i_nracni2ng_i)= -0.25_rp*pi*e_ir*rhoq(k,i_nr)*rhoq(k,i_ni)*coef_acc_nri_i
4611  end do
4612 
4613  ! reduction term of rain
4614  do k = ks, ke
4615  coef_acc_lri_r = &
4616  ( delta_b1(i_mp_qr)*drdr(k) + delta_ab1(i_mp_qi,i_mp_qr)*drdi(k) + delta_b0(i_mp_qi)*didi(k) ) &
4617  * sqrt( theta_b1(i_mp_qr)*vrvr(k) - theta_ab1(i_mp_qi,i_mp_qr)*vrvi(k) + theta_b0(i_mp_qi)*vivi(k) &
4618  + sigma_r + sigma_i )
4619  coef_acc_nri_r = &
4620  ( delta_b0(i_mp_qr)*drdr(k) + delta_ab0(i_mp_qi,i_mp_qr)*drdi(k) + delta_b0(i_mp_qi)*didi(k) ) &
4621  * sqrt( theta_b0(i_mp_qr)*vrvr(k) - theta_ab0(i_mp_qi,i_mp_qr)*vrvi(k) + theta_b0(i_mp_qi)*vivi(k) &
4622  + sigma_r + sigma_i )
4623  pac(k,i_lracli2lg_r)= -0.25_rp*pi*e_ir*rhoq(k,i_ni)*rhoq(k,i_qr)*coef_acc_lri_r
4624  pac(k,i_nracni2ng_r)= -0.25_rp*pi*e_ir*rhoq(k,i_ni)*rhoq(k,i_nr)*coef_acc_nri_r
4625  end do
4626 
4627  ! rain-snow => graupel
4628  ! reduction term of snow
4629  do k = ks, ke
4630  coef_acc_lrs_s = &
4631  ( delta_b1(i_mp_qs)*dsds(k) + delta_ab1(i_mp_qr,i_mp_qs)*drds(k) + delta_b0(i_mp_qr)*drdr(k) ) &
4632  * sqrt( theta_b1(i_mp_qs)*vsvs(k) - theta_ab1(i_mp_qr,i_mp_qs)*vrvs(k) + theta_b0(i_mp_qr)*vrvr(k) &
4633  + sigma_r + sigma_s )
4634  coef_acc_nrs_s = &
4635  ( delta_b0(i_mp_qs)*dsds(k) + delta_ab0(i_mp_qr,i_mp_qs)*drds(k) + delta_b0(i_mp_qr)*drdr(k) ) &
4636  * sqrt( theta_b0(i_mp_qs)*vsvs(k) - theta_ab0(i_mp_qr,i_mp_qs)*vrvs(k) + theta_b0(i_mp_qr)*vrvr(k) &
4637  + sigma_r + sigma_s )
4638  pac(k,i_lracls2lg_s)= -0.25_rp*pi*e_sr*rhoq(k,i_nr)*rhoq(k,i_qs)*coef_acc_lrs_s
4639  pac(k,i_nracns2ng_s)= -0.25_rp*pi*e_sr*rhoq(k,i_nr)*rhoq(k,i_ns)*coef_acc_nrs_s
4640  end do
4641 
4642  ! reduction term of rain
4643  do k = ks, ke
4644  coef_acc_lrs_r = &
4645  ( delta_b1(i_mp_qr)*drdr(k) + delta_ab1(i_mp_qs,i_mp_qr)*drds(k) + delta_b0(i_mp_qs)*dsds(k) ) &
4646  * sqrt( theta_b1(i_mp_qr)*vrvr(k) - theta_ab1(i_mp_qs,i_mp_qr)*vrvs(k) + theta_b0(i_mp_qs)*vsvs(k) &
4647  + sigma_r + sigma_s )
4648  coef_acc_nrs_r = &
4649  ( delta_b0(i_mp_qr)*drdr(k) + delta_ab0(i_mp_qs,i_mp_qr)*drds(k) + delta_b0(i_mp_qs)*dsds(k) ) &
4650  * sqrt( theta_b0(i_mp_qr)*vrvr(k) - theta_ab0(i_mp_qs,i_mp_qr)*vrvs(k) + theta_b0(i_mp_qs)*vsvs(k) &
4651  + sigma_r + sigma_s )
4652  pac(k,i_lracls2lg_r)= -0.25_rp*pi*e_sr*rhoq(k,i_ns)*rhoq(k,i_qr)*coef_acc_lrs_r
4653  pac(k,i_nracns2ng_r)= -0.25_rp*pi*e_sr*rhoq(k,i_ns)*rhoq(k,i_nr)*coef_acc_nrs_r
4654  end do
4655 
4656  !------------------------------------------------------------------------
4657  !
4658  !+++ pattern 3: a + a => b (i-i)
4659  !
4660  !------------------------------------------------------------------------
4661 
4662  ! ice-ice ( reduction is double, but includes double-count)
4663  do k = ks, ke
4664  coef_acc_lii = &
4665  ( delta_b0(i_mp_qi)*didi(k) + delta_ab1(i_mp_qi,i_mp_qi)*didi(k) + delta_b1(i_mp_qi)*didi(k) ) &
4666  * sqrt( theta_b0(i_mp_qi)*vivi(k) - theta_ab1(i_mp_qi,i_mp_qi)*vivi(k) + theta_b1(i_mp_qi)*vivi(k) &
4667  + sigma_i + sigma_i )
4668  coef_acc_nii = &
4669  ( delta_b0(i_mp_qi)*didi(k) + delta_ab0(i_mp_qi,i_mp_qi)*didi(k) + delta_b0(i_mp_qi)*didi(k) ) &
4670  * sqrt( theta_b0(i_mp_qi)*vivi(k) - theta_ab0(i_mp_qi,i_mp_qi)*vivi(k) + theta_b0(i_mp_qi)*vivi(k) &
4671  + sigma_i + sigma_i )
4672  pac(k,i_liacli2ls)= -0.25_rp*pi*e_stick(k)*e_ii*rhoq(k,i_ni)*rhoq(k,i_qi)*coef_acc_lii
4673  pac(k,i_niacni2ns)= -0.25_rp*pi*e_stick(k)*e_ii*rhoq(k,i_ni)*rhoq(k,i_ni)*coef_acc_nii
4674 
4675 ! ci_aut(k) = 0.25_RP*pi*E_ii*rhoq(k,I_NI)*coef_acc_LII
4676 ! taui_aut(k) = 1._RP/max(E_stick(k)*ci_aut(k),1.E-10_RP)
4677 ! tau_sce(k) = rhoq(k,I_QI)/max(rhoq(k,I_QIj)+rhoq(k,I_QS),1.E-10_RP)
4678  end do
4679 
4680  !------------------------------------------------------------------------
4681  !
4682  !+++ pattern 4: a + a => a (s-s)
4683  !
4684  !------------------------------------------------------------------------
4685 
4686  ! snow-snow => snow
4687  do k = ks, ke
4688  coef_acc_nss = &
4689  ( delta_b0(i_mp_qs)*dsds(k) + delta_ab0(i_mp_qs,i_mp_qs)*dsds(k) + delta_b0(i_mp_qs)*dsds(k) ) &
4690  * sqrt( theta_b0(i_mp_qs)*vsvs(k) - theta_ab0(i_mp_qs,i_mp_qs)*vsvs(k) + theta_b0(i_mp_qs)*vsvs(k) &
4691  + sigma_s + sigma_s )
4692  pac(k,i_nsacns2ns)= -0.125_rp*pi*e_stick(k)*e_ss*rhoq(k,i_ns)*rhoq(k,i_ns)*coef_acc_nss
4693  end do
4694 
4695  ! graupel-grauple => graupel
4696  do k = ks, ke
4697  coef_acc_ngg = &
4698  ( delta_b0(i_mp_qg)*dgdg(k) + delta_ab0(i_mp_qg,i_mp_qg)*dgdg(k) + delta_b0(i_mp_qg)*dgdg(k) ) &
4699  * sqrt( theta_b0(i_mp_qg)*vgvg(k) - theta_ab0(i_mp_qg,i_mp_qg)*vgvg(k) + theta_b0(i_mp_qg)*vgvg(k) &
4700  + sigma_g + sigma_g )
4701  pac(k,i_ngacng2ng)= -0.125_rp*pi*e_stick(k)*e_gg*rhoq(k,i_ng)*rhoq(k,i_ng)*coef_acc_ngg
4702  end do
4703 
4704  !------------------------------------------------------------------------
4705  !--- Partial conversion
4706  ! SB06(70),(71)
4707  ! i_iconv2g: option whether partial conversions work or not
4708 
4709  ! ice-cloud => graupel
4710  do k = ks, ke
4711  sw = 0.5_rp - sign(0.5_rp,di_cri-ave_di(k)) ! if( ave_di > di_cri )then sw=1
4712  wx_cri = cfill_i*dwatr/rho_g*( pi/6.0_rp*rho_g*ave_di(k)**3/xq(k,i_mp_qi) - 1.0_rp ) * sw
4713  pq(k,i_licon) = i_iconv2g * pac(k,i_liaclc2li)/max(1.0_rp, wx_cri) * sw
4714  pq(k,i_nicon) = i_iconv2g * pq(k,i_licon)/xq(k,i_mp_qi) * sw
4715  end do
4716 
4717  ! snow-cloud => graupel
4718  do k = ks, ke
4719  wx_crs = cfill_s*dwatr/rho_g*( pi/6.0_rp*rho_g*ave_ds(k)**3/xq(k,i_mp_qs) - 1.0_rp )
4720  pq(k,i_lscon) = i_sconv2g * (pac(k,i_lsaclc2ls))/max(1.0_rp, wx_crs)
4721  pq(k,i_nscon) = i_sconv2g * pq(k,i_lscon)/xq(k,i_mp_qs)
4722  end do
4723 
4724  !--- enhanced melting( due to collection-freezing of water droplets )
4725  ! originally from Rutledge and Hobbs(1984). eq.(A.21)
4726  ! if T > 273.15 then temc_p=T-273.15, else temc_p=0
4727  ! 08/05/08 [fix] T.Mitsui LHF00 => LHF0
4728  ! melting occurs around T=273K, so LHF0 is suitable both SIMPLE and EXACT,
4729  ! otherwise LHF can have sign both negative(EXACT) and positive(SIMPLE).
4730  do k = ks, ke
4731 ! temc_m = min(tem(k) - T00, 0.0_RP) ! T < 273.15
4732  temc_p = max(tem(k) - t00, 0.0_rp) ! T > 273.15
4733 !!$ coef_emelt = -CL/LHF00*temc_p
4734  coef_emelt = cl/lhf0*temc_p
4735  ! cloud-graupel
4736  pq(k,i_lgacm) = coef_emelt*pac(k,i_lgaclc2lg)
4737  pq(k,i_ngacm) = pq(k,i_lgacm)/xq(k,i_mp_qg)
4738  ! rain-graupel
4739  pq(k,i_lgarm) = coef_emelt*pac(k,i_lraclg2lg)
4740  pq(k,i_ngarm) = pq(k,i_lgarm)/xq(k,i_mp_qg)
4741  ! cloud-snow
4742  pq(k,i_lsacm) = coef_emelt*(pac(k,i_lsaclc2ls))
4743  pq(k,i_nsacm) = pq(k,i_lsacm)/xq(k,i_mp_qs)
4744  ! rain-snow
4745  pq(k,i_lsarm) = coef_emelt*(pac(k,i_lracls2lg_r)+pac(k,i_lracls2lg_s))
4746  pq(k,i_nsarm) = pq(k,i_lsarm)/xq(k,i_mp_qg)
4747  ! cloud-ice
4748  pq(k,i_liacm) = coef_emelt*pac(k,i_liaclc2li)
4749  pq(k,i_niacm) = pq(k,i_liacm)/xq(k,i_mp_qi)
4750  ! rain-ice
4751  pq(k,i_liarm) = coef_emelt*(pac(k,i_lracli2lg_r)+pac(k,i_lracli2lg_i))
4752  pq(k,i_niarm) = pq(k,i_liarm)/xq(k,i_mp_qg)
4753  end do
4754 
4755 
4756  !---- for charge density
4757  if ( flg_lt ) then
4758  !--- C + I -> I (decrease from cloud charge)
4759  do k = ks, ke
4760  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small ) !--- if NC is small, ignore charge transfer
4761  pcrg2(k,i_niacnc2ni) = pac(k,i_niacnc2ni)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
4762  end do
4763 
4764  !--- C + S -> S (decrease from cloud charge)
4765  do k = ks, ke
4766  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small ) !--- if NC is small, ignore charge transfer
4767  pcrg2(k,i_nsacnc2ns) = pac(k,i_nsacnc2ns)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
4768  end do
4769 
4770  !--- C + G -> G (decrease from cloud charge)
4771  do k = ks, ke
4772  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small ) !--- if NC is small, ignore charge transfer
4773  pcrg2(k,i_ngacnc2ng) = pac(k,i_ngacnc2ng)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
4774  end do
4775 
4776  !--- S + G -> G (decrease from snow charge)
4777  do k = ks, ke
4778  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4779  pcrg2(k,i_ngacns2ng) = pac(k,i_ngacns2ng)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4780  end do
4781 
4782  !--- Charge separation by Snow-Graupel rebound--------------------------------
4783  do k = ks, ke
4784  alpha_lt = 5.0_rp * ( dq_xave(k,i_mp_qs) / d0_crg )**2 * vt_xave(k,i_mp_qg,2) / v0_crg
4785  alpha_lt = min( alpha_lt, 10.0_rp )
4786  pcrg2(k,i_cgngacns2ng)= 0.25_rp*pi*( 1.0_rp - e_stick(k) )*e_gs &
4787  * rhoq(k,i_ng)*rhoq(k,i_ns)*coef_acc_nsg(k) &
4788  * ( dqcrg(k)*alpha_lt ) &
4789  * beta_crg(k)
4790  end do
4791 
4792  !--- I + G -> G (decrease from snow charge)
4793 !!$ do k = KS, KE
4794 !!$ sw1 = 0.5_RP - sign( 0.5_RP, rhoq(k,I_NI)-SMALL ) !--- if NS is small, ignore charge transfer
4795 !!$ Pcrg2(k,I_NGacNI2NG) = Pac(k,I_NGacNI2NG)*(1.0_RP-sw1) / (rhoq(k,I_NI)+sw1) * rhoq_crg(k,I_QI) * flg_igcol
4796 !!$ !--- Charge separation by Ice-Graupel rebound--------------------------------
4797 !!$ alpha_lt = 5.0_RP * ( dq_xave(k,I_mp_QI) / d0_crg )**2 * vt_xave(k,I_mp_QG,2) / v0_crg
4798 !!$ alpha_lt = min( alpha_lt, 10.0_RP )
4799 !!$ Pcrg2(k,I_CGNGacNI2NG)= 0.25_RP*pi*( 1.0_RP - E_stick(k) )*E_gi &
4800 !!$ * rhoq(k,I_NG)*rhoq(k,I_NI)*coef_acc_NIG(k) &
4801 !!$ * ( dqcrg(k)*alpha_lt ) &
4802 !!$ * beta_crg(k) * flg_igcol
4803 !!$ end do
4804 
4805  !--- I + S -> S (decrease from ice charge)
4806  do k = ks, ke
4807  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4808  pcrg2(k,i_niacns2ns) = pac(k,i_niacns2ns)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4809  end do
4810 
4811  !--- R+G->R (T>T00 sw=0, decrease from graupel charge), ->G(T<=T00 sw=1, dcrerase from rain charge)
4812  do k = ks, ke
4813  sw = 0.5_rp + sign( 0.5_rp, t00-tem(k) )
4814  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small ) !--- if NR is small, ignore charge transfer
4815  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NG is small, ignore charge transfer
4816  pcrg2(k,i_nracng2ng) = pac(k,i_nracng2ng)*(1.0_rp-sw1)/(rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr) * sw &
4817  + pac(k,i_nracng2ng)*(1.0_rp-sw2)/(rhoq(k,i_ng)+sw2) * rhoq_crg(k,i_qg) * (1.0_rp-sw)
4818  end do
4819 
4820  !--- R + I -> G (decrease from both ice and rain charge, but only ice charge at this part)
4821  do k = ks, ke
4822  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4823  pcrg2(k,i_nracni2ng_i) = pac(k,i_nracni2ng_i)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4824  end do
4825 
4826  !--- R + I -> G (decrease from both ice and rain charge, but only rain charge at this part)
4827  do k = ks, ke
4828  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small ) !--- if NR is small, ignore charge transfer
4829  pcrg2(k,i_nracni2ng_r) = pac(k,i_nracni2ng_r)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
4830  end do
4831 
4832  !--- R + S -> G (decrease from both snow and rain charge, but only snow charge at this part)
4833  do k = ks, ke
4834  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4835  pcrg2(k,i_nracns2ng_s) = pac(k,i_nracns2ng_s)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4836  end do
4837 
4838  !--- R + S -> G (decrease from both snow and rain charge, but only rain charge at this part)
4839  do k = ks, ke
4840  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small ) !--- if NR is small, ignore charge transfer
4841  pcrg2(k,i_nracns2ng_r) = pac(k,i_nracns2ng_r)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
4842  end do
4843 
4844  !--- I + I -> S (decrease from ice charge)
4845  do k = ks, ke
4846  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4847  pcrg2(k,i_niacni2ns) = pac(k,i_niacni2ns)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4848  end do
4849 
4850  !--- I + C -> G (decrease from ice charge)
4851  do k = ks, ke
4852  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4853  pcrg1(k,i_nicon) = i_iconv2g * pq(k,i_nicon)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4854  end do
4855 
4856  !--- S + C -> G (decrease from snow charge)
4857  do k = ks, ke
4858  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4859  pcrg1(k,i_nscon) = i_sconv2g * pq(k,i_nscon)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4860  end do
4861 
4862  do k = ks, ke
4863  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NG is small, ignore charge transfer
4864  pcrg1(k,i_ngacm) = pq(k,i_ngacm)*(1.0_rp-sw1) / (rhoq(k,i_ng)+sw1) * rhoq_crg(k,i_qg)
4865  end do
4866 
4867  do k = ks, ke
4868  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NG is small, ignore charge transfer
4869  pcrg1(k,i_ngarm) = pq(k,i_ngarm)*(1.0_rp-sw1) / (rhoq(k,i_ng)+sw1) * rhoq_crg(k,i_qg)
4870  end do
4871 
4872  do k = ks, ke
4873  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4874  pcrg1(k,i_nsacm) = pq(k,i_nsacm)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4875  end do
4876 
4877  do k = ks, ke
4878  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4879  pcrg1(k,i_nsarm) = pq(k,i_nsarm)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4880  end do
4881 
4882  do k = ks, ke
4883  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4884  pcrg1(k,i_niacm) = pq(k,i_niacm)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4885  end do
4886 
4887  do k = ks, ke
4888  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4889  pcrg1(k,i_niarm) = pq(k,i_niarm)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4890  end do
4891 
4892  end if
4893 
4894  return

Referenced by atmos_phy_mp_sn14_terminal_velocity().

Here is the caller graph for this function:

◆ mixed_phase_collection_bin()

subroutine scale_atmos_phy_mp_sn14::mixed_phase_collection_bin ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
logical, intent(in)  flg_lt,
real(rp), intent(in)  d0_crg,
real(rp), intent(in)  v0_crg,
real(rp), dimension(ka), intent(in)  beta_crg,
real(rp), dimension(ka), intent(in)  dqcrg,
real(rp), dimension(ka), intent(in)  wtem,
real(rp), dimension(ka,i_qv:i_ng), intent(in)  rhoq,
real(rp), dimension(ka,i_qc:i_qg), intent(in)  rhoq_crg,
real(rp), dimension(ka,hydro_max), intent(in)  xq,
real(rp), dimension(ka,hydro_max), intent(in)  dq_xave,
real(rp), dimension(ka,hydro_max,2), intent(in)  vt_xave,
real(rp), dimension(ka), intent(in)  rho,
real(rp), dimension(ka,pq_max), intent(inout)  PQ,
real(rp), dimension(ka,pq_max), intent(inout)  Pcrg1,
real(rp), dimension(ka,pcrg_max), intent(inout)  Pcrg2,
real(rp), dimension(ka,pac_max), intent(out)  Pac 
)

0degC

Definition at line 4898 of file scale_atmos_phy_mp_sn14.F90.

4910  use scale_atmos_saturation, only: &
4911  moist_psat_ice => atmos_saturation_psat_ice
4912  use scale_prc, only: &
4913  prc_abort
4914  implicit none
4915 
4916  integer, intent(in) :: KA, KS, KE
4917 
4918  !--- mixed-phase collection process
4919  ! And all we set all production term as a negative sign to avoid confusion.
4920  !
4921  real(RP), intent(in) :: wtem(KA)
4922  !--- mass/number concentration[kg/m3]
4923  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
4924  real(RP), intent(in) :: rho(KA) ! air density
4925  ! necessary ?
4926  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
4927  !--- diameter of averaged mass( D(ave x) )
4928  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX)
4929  !--- terminal velocity of averaged mass( vt(ave x) )
4930  real(RP), intent(in) :: vt_xave(KA,HYDRO_MAX,2)
4931  ! [Add] 11/08/30 T.Mitsui, for autoconversion of ice
4932  ! real(RP), intent(in) :: rho(KA)
4933  !--- partial conversion
4934  real(RP), intent(inout):: PQ(KA,PQ_MAX)
4935  !
4936  real(RP), intent(out):: Pac(KA,Pac_MAX)
4937  !--- for lightning component
4938  logical, intent(in) :: flg_lt
4939  real(RP), intent(in) :: beta_crg(KA)
4940  real(RP), intent(in) :: dqcrg(KA)
4941  real(RP), intent(in) :: d0_crg, v0_crg
4942  real(RP), intent(in) :: rhoq_crg(KA,I_QC:I_QG)
4943  real(RP), intent(inout):: Pcrg1(KA,PQ_MAX)
4944  real(RP), intent(inout):: Pcrg2(KA,Pcrg_MAX)
4945 
4946  real(RP), parameter :: a_dec = 0.883_rp
4947  real(RP), parameter :: b_dec = 0.093_rp
4948  real(RP), parameter :: c_dec = 0.00348_rp
4949  real(RP), parameter :: d_dec = 4.5185e-5_rp
4950  !
4951  !!!!from default SN14
4952 
4953  real(RP), parameter :: E_C12(6)=(/&
4954  0.010_rp, 0.080_rp, 0.10_rp, 0.60_rp, 0.20_rp, 0.10_rp/)
4955 
4956  real(RP) :: tem(KA)
4957  !
4958  !--- collection efficency of each specie
4959  real(RP) :: E_c, E_r, E_i, E_s, E_g
4960 ! real(RP) :: E_ic, E_sc, E_gc
4961  !--- sticking efficiency
4962  real(RP):: E_stick(KA)
4963  ! [Add] 10/08/03 T.Mitsui
4964  real(RP) :: temc, temc2, temc3
4965  real(RP) :: E_dec
4966  real(RP) :: esi_rat(KA)
4967  real(RP) :: esi(KA)
4968  !
4969  real(RP) :: temc_p, temc_m ! celcius tem.
4970 ! real(RP) :: ci_aut(KA)
4971 ! real(RP) :: taui_aut(KA)
4972 ! real(RP) :: tau_sce(KA)
4973  !--- DSD averaged diameter for each species
4974  real(RP) :: ave_dc ! cloud
4975 ! real(RP) :: ave_dr ! rain
4976  real(RP) :: ave_di(KA) ! ice
4977  real(RP) :: ave_ds(KA) ! snow
4978  real(RP) :: ave_dg ! graupel
4979  !--- coefficient of collection equations(L:mass, N:number)
4980  real(RP) :: coef_acc_LCI, coef_acc_NCI ! cloud - cloud ice
4981  real(RP) :: coef_acc_LCS, coef_acc_NCS ! cloud - snow
4982  !
4983  real(RP) :: coef_acc_LCG, coef_acc_NCG ! cloud - graupel
4984  real(RP) :: coef_acc_LRI_I, coef_acc_NRI_I ! rain - cloud ice
4985  real(RP) :: coef_acc_LRI_R, coef_acc_NRI_R ! rain - cloud ice
4986  real(RP) :: coef_acc_LRS_S, coef_acc_NRS_S ! rain - snow
4987  real(RP) :: coef_acc_LRS_R, coef_acc_NRS_R ! rain - snow
4988  real(RP) :: coef_acc_LRG, coef_acc_NRG ! rain - graupel
4989  real(RP) :: coef_acc_LII, coef_acc_NII ! cloud ice - cloud ice
4990  real(RP) :: coef_acc_LIS, coef_acc_NIS ! cloud ice - snow
4991  real(RP) :: coef_acc_NSS ! snow - snow
4992  real(RP) :: coef_acc_NGG ! grauepl - graupel
4993  real(RP) :: coef_acc_LSG, coef_acc_NSG(KA) ! snow - graupel
4994  !--- (diameter) x (diameter)
4995  real(RP) :: dcdc(KA), dcdi, dcds, dcdg
4996  real(RP) :: drdr(KA), drdi(KA), drds(KA), drdg
4997  real(RP) :: didi(KA), dids, didg
4998  real(RP) :: dsds(KA), dsdg
4999  real(RP) :: dgdg(KA)
5000 !# !--- (terminal velocity) x (terminal velocity)
5001 !# real(RP) :: vcvc(KA), vcvi, vcvs, vcvg
5002 !# real(RP) :: vrvr(KA), vrvi(KA), vrvs(KA), vrvg
5003 !# real(RP) :: vivi(KA), vivs, vivg
5004 !# real(RP) :: vsvs(KA), vsvg
5005 !# real(RP) :: vgvg(KA)
5006  !
5007 ! real(RP) :: wx_cri, wx_crs
5008 ! real(RP) :: coef_emelt
5009 ! real(RP) :: w1
5010 
5011  real(RP) :: sw, sw1, sw2, tmp
5012  real(RP) :: alpha_lt
5013  !
5014  integer :: k, iqw
5015  !
5016 
5017  real(RP) :: tem_e(KA) ! [Add] 15/05/19 T.Seiki
5018 
5019 
5020  !
5021  ! work for binary collision
5022  !
5023  ! work for Gauss-Legendre quadrature
5024  integer, parameter :: ngmax=4
5025 
5026  real(RP) :: lambdac(KA), lambdar(KA), lambdai(KA), lambdas(KA), lambdag(KA)
5027  real(RP) :: A_dsdc(KA), A_dsdr(KA), A_dsdi(KA), A_dsds(KA), A_dsdg(KA)
5028  real(RP) :: dNdx
5029  real(RP) :: dxdd
5030  real(RP) :: dNdD
5031  real(RP) :: dNc_glx(KA,ngmax), dNr_glx(KA,ngmax), dNi_glx(KA,ngmax), dNs_glx(KA,ngmax), dNg_glx(KA,ngmax)
5032  real(RP) :: dNc_gly, dNr_gly(KA,ngmax), dNi_gly(KA,ngmax), dNs_gly(KA,ngmax), dNg_gly(KA,ngmax)
5033  !
5034  real(RP) :: dc_glx, dr_glx, di_glx, ds_glx, dg_glx
5035  real(RP) :: dc_gly, dr_gly, di_gly, ds_gly, dg_gly
5036  real(RP) :: xc_glx(KA,ngmax), xr_glx(KA,ngmax), xi_glx(KA,ngmax), xs_glx(KA,ngmax), xg_glx(KA,ngmax)
5037  real(RP) :: xc_gly, xr_gly(KA,ngmax), xi_gly, xs_gly, xg_gly
5038 
5039  real(RP) :: vtc_glx(KA,ngmax), vtr_glx(KA,ngmax), vti_glx(KA,ngmax), vts_glx(KA,ngmax), vtg_glx(KA,ngmax)
5040  real(RP) :: vtc_gly, vtr_gly(KA,ngmax), vti_gly(KA,ngmax), vts_gly(KA,ngmax), vtg_gly(KA,ngmax)
5041  real(RP) :: dac_glx(KA,ngmax), dar_glx(KA,ngmax), dai_glx(KA,ngmax), das_glx(KA,ngmax), dag_glx(KA,ngmax)
5042  real(RP) :: dac_gly, dar_gly(KA,ngmax), dai_gly(KA,ngmax), das_gly(KA,ngmax), dag_gly(KA,ngmax)
5043  !
5044  integer :: ngx, ngy
5045  !
5046  real(RP) :: E_ic(KA), E_sc(KA), E_gc(KA)
5047  !
5048  ! Parameters to calculate terminal velocity formulated by Mitchell (1996)
5049  !
5050  real(RP) :: acx, bcx, gcx, scx ! geometric parameters of hexagonal column ice defined by Mitchell (1996)
5051  real(RP) :: acy, bcy, gcy, scy ! geometric parameters of hexagonal column ice defined by Mitchell (1996)
5052  real(RP), parameter :: as = 0.59452551_rp
5053  real(RP), parameter :: bs = 2.4490_rp
5054  real(RP), parameter :: gs = 0.131488_rp
5055  real(RP), parameter :: ss = 1.880000_rp
5056  real(RP), parameter :: ag = 19.5072514_rp !0.049d0*1.d-3*(100.0d0**2.8d0)
5057  real(RP), parameter :: bg = 2.8_rp
5058  real(RP), parameter :: gg = 0.5_rp
5059  real(RP), parameter :: sg = 2.0_rp
5060  real(RP) :: num_Besti_glx, num_Bests_glx, num_Bestg_glx
5061  real(RP) :: num_Besti_gly, num_Bests_gly, num_Bestg_gly
5062  real(RP) :: num_Rei_glx, num_Res_glx, num_Reg_glx
5063  real(RP) :: num_Rei_gly, num_Res_gly, num_Reg_gly
5064  real(RP), parameter :: c0=0.6_rp ! Bohm (1989)
5065  real(RP), parameter :: d0=5.83_rp ! Bohm (1989)
5066  !
5067  real(RP) :: mua(KA), nua(KA)
5068  !--- Dynamic viscosity
5069  real(RP), parameter :: mua0 = 1.718e-5_rp
5070 
5071  real(RP), parameter :: dmua_dT = 5.28e-8_rp
5072 
5073  !====== mua = mua0 + temc*dmua_dT
5074  !
5075  ! collection Kernel
5076  !
5077  real(RP) :: kernel_cg, kernel_cs, kernel_ci
5078  real(RP) :: kernel_rg, kernel_rs, kernel_ri
5079  real(RP) :: kernel_ig, kernel_is, kernel_ii
5080  real(RP) :: kernel_sg, kernel_ss
5081  real(RP) :: kernel_gg
5082  real(RP) :: kernel_sg_reb
5083  !
5084  !--------------------------
5085  !
5086  ! accurate for PSDs with optimization
5087  !
5088  !-------------------------------
5089  ! cloud
5090  ! gauss_range = 2.0_RP
5091  ! ngmax = 4
5092  ! rain,
5093  ! gauss_range = xxx
5094  ! ngmax = 4
5095  ! ice, snow, graupel
5096  ! gauss_range = 5.0_RP
5097  ! ngmax = 4
5098  !
5099  real(RP), parameter :: gauss_rangec=2.0_rp
5100  real(RP), parameter :: wc_gl(ngmax)=(/&
5101  0.2411146051511425e+00_rp, &
5102  0.4520325754088027e+00_rp, &
5103  0.4520325754088027e+00_rp, &
5104  0.2411146051511425e+00_rp &
5105  /)
5106  real(RP), parameter :: coefc_d_gl(ngmax)=(/&
5107  0.5505187813766612e+00_rp, &
5108  0.7900516927471093e+00_rp, &
5109  0.1265739962562290e+01_rp, &
5110  0.1816468454535444e+01_rp &
5111  /)
5112  real(RP), parameter :: gauss_ranger=8.0_rp
5113  real(RP), parameter :: wr_gl(ngmax)=(/&
5114  0.723343815453428e+00_rp,&
5115  1.35609772622641e+00_rp, &
5116  1.35609772622641e+00_rp, &
5117  0.723343815453428e+00_rp &
5118  /)
5119  real(RP), parameter :: coefr_d_gl(ngmax)=(/&
5120  0.166846238310235e+00_rp, &
5121  0.493135790663523e+00_rp, &
5122  2.02783902311062e+00_rp, &
5123  5.99354237846583e+00_rp &
5124  /)
5125  real(RP), parameter :: gauss_range=5.0_rp
5126  real(RP), parameter :: w_gl(ngmax)=(/&
5127  0.559850775788111e+00_rp, &
5128  1.04958713664599e+00_rp, &
5129  1.04958713664599e+00_rp, &
5130  0.559850775788111e+00_rp &
5131  /)
5132  real(RP), parameter :: coef_d_gl(ngmax)=(/&
5133  0.2500872485877803e+00_rp, &
5134  0.5785800417604080e+00_rp, &
5135  0.1728369331505741e+01_rp, &
5136  0.3998604509613778e+01_rp &
5137  /)
5138  !
5139  real(RP) :: wx_cri, wx_crs
5140  real(RP) :: coef_emelt
5141  real(RP) :: w1
5142 ! integer :: ij, k
5143  integer :: ierr
5144 
5145  !---------------------------------------------------------------------------
5146  !
5147  !
5148 
5149  do k = ks, ke
5150  tem(k) = max( wtem(k), tem_min ) ! 11/08/30 T.Mitsui
5151  end do
5152 
5153  call moist_psat_ice( ka, ks, ke, &
5154  tem(:), esi(:) ) ! [IN], [OUT]
5155 
5156  if( opt_stick_ks96 )then
5157  do k = ks, ke
5158  ! Khain and Sednev (1996), eq.(3.15)
5159  temc = tem(k) - t00
5160  temc2 = temc*temc
5161  temc3 = temc2*temc
5162  e_dec = max(0.0_rp, a_dec + b_dec*temc + c_dec*temc2 + d_dec*temc3 )
5163  esi_rat(k) = rhoq(k,i_qv)*rvap*tem(k)/esi(k)
5164  e_stick(k) = min(1.0_rp, e_dec*esi_rat(k))
5165  end do
5166  else if( opt_stick_co86 )then
5167  do k = ks, ke
5168  ! [Add] 11/08/30 T.Mitsui, Cotton et al. (1986)
5169  temc = min(tem(k) - t00,0.0_rp)
5170  w1 = 0.035_rp*temc-0.7_rp
5171  e_stick(k) = 10._rp**w1
5172  end do
5173  else
5174  do k = ks, ke
5175  ! Lin et al. (1983)
5176  temc_m = min(tem(k) - t00,0.0_rp) ! T < 273.15
5177  e_stick(k) = exp(0.09_rp*temc_m)
5178  end do
5179  end if
5180 
5181  !------------------------------------------------------------------------
5182 
5183 
5184  pac(:,:) = 0.0_rp
5185 
5186  tem(:) = max(wtem(:), tem_min )
5187  tem_e(:) = max(wtem(:), tem_min_estick )
5188 
5189  call moist_psat_ice( ka, ks, ke, tem(:), esi(:) )
5190 
5191 
5192  if ( opt_stick_ks96 ) then
5193  do k=ks, ke
5194  ! Khain and Sednev (1996), eq.(3.15)
5195  temc = tem_e(k) - t00 ![Mod] 15/05/19 T.Seiki
5196  temc2 = temc*temc
5197  temc3 = temc2*temc
5198  e_dec = max(0.0_rp, a_dec + b_dec*temc + c_dec*temc2 + d_dec*temc3 )
5199  esi_rat(k) = rhoq(k,i_qv)*rvap*tem(k)/esi(k)
5200  e_stick(k) = min(1.0_rp, e_dec*esi_rat(k))
5201  enddo
5202  elseif( opt_stick_co86 ) then
5203  do k=ks, ke
5204  temc = min(tem_e(k) - t00,0.0_rp)
5205  w1 = 0.035_rp*temc-0.7_rp
5206  e_stick(k) = 10.0_rp**w1
5207  enddo
5208  elseif( opt_stick_c12 ) then
5209  do k=ks, ke
5210  if (tem_e(k)>273.15_rp) then
5211  e_stick(k)=1.0_rp
5212  elseif(tem_e(k)<243.15_rp) then !-30degC
5213  e_stick(k)=e_c12(1)
5214  elseif(tem_e(k)<248.15_rp) then !-25degC
5215  e_stick(k)=e_c12(1)+0.2_rp*(e_c12(2)-e_c12(1))*(tem_e(k)-243.15_rp)
5216  elseif(tem_e(k)<253.15_rp) then !-20degC
5217  e_stick(k)=e_c12(2)+0.2_rp*(e_c12(3)-e_c12(2))*(tem_e(k)-248.15_rp)
5218  elseif(tem_e(k)<258.15_rp) then !-15degC
5219  e_stick(k)=e_c12(3)+0.2_rp*(e_c12(4)-e_c12(3))*(tem_e(k)-253.15_rp)
5220  elseif(tem_e(k)<263.15_rp) then !-10degC
5221  e_stick(k)=e_c12(4)+0.2_rp*(e_c12(5)-e_c12(4))*(tem_e(k)-258.15_rp)
5222  elseif(tem_e(k)<268.15_rp) then !- 5degC
5223  e_stick(k)=e_c12(5)+0.2_rp*(e_c12(6)-e_c12(5))*(tem_e(k)-263.15_rp)
5224  else ! 0degC
5225  e_stick(k)=e_c12(6)
5226  endif
5227  enddo
5228  else
5229  if ( opt_stick_rhh57 ) then
5230  do k=ks, ke
5231  if ( tem_e(k) < 270.0_rp .AND. rhoq(k,i_qv)*rvap*tem(k) < esi(k) ) then
5232  esi_rat(k) = 0.0_rp
5233  else
5234  esi_rat(k) = 1.0_rp
5235  endif
5236  enddo
5237  elseif( opt_stick_rhks96 ) then
5238  do k=ks, ke
5239  esi_rat(k) = min( rhoq(k,i_qv)*rvap*tem(k)/esi(k),1.0_rp )
5240  enddo
5241  else
5242  esi_rat(:) = 1.0_rp
5243  endif
5244  !
5245  do k=ks, ke
5246  ! Lin et al. (1983)
5247  temc_m = min(tem_e(k) - t00,0.0_rp) ! T < 273.15
5248  e_stick(k) = exp(0.09_rp*temc_m)*esi_rat(k)
5249  enddo
5250  endif
5251 
5252  !
5253  ! Integration Start
5254  !
5255 
5256  do k = ks, ke
5257  mua(k) = mua0 + dmua_dt*(tem(k)-273.15_rp)
5258  nua(k) = mua(k)/rho(k) ! [m2/s]
5259  end do
5260  do k = ks, ke
5261  lambdac(k) = xq(k,i_mp_qc)**(-mu(i_mp_qc))*coef_lambda(i_mp_qc)
5262  a_dsdc(k) = rhoq(k,i_nc)*coef_a(i_mp_qc)*lambdac(k)**((nu(i_mp_qc)+1.0_rp)/mu(i_mp_qc))
5263  end do
5264  do k = ks, ke
5265  lambdar(k) = xq(k,i_mp_qr)**(-mu(i_mp_qr))*coef_lambda(i_mp_qr)
5266  a_dsdr(k) = rhoq(k,i_nr)*coef_a(i_mp_qr)*lambdar(k)**((nu(i_mp_qr)+1.0_rp)/mu(i_mp_qr))
5267  end do
5268  do k = ks, ke
5269  lambdai(k) = xq(k,i_mp_qi)**(-mu(i_mp_qi))*coef_lambda(i_mp_qi)
5270  a_dsdi(k) = rhoq(k,i_ni)*coef_a(i_mp_qi)*lambdai(k)**((nu(i_mp_qi)+1.0_rp)/mu(i_mp_qi))
5271  end do
5272  do k = ks, ke
5273  lambdas(k) = xq(k,i_mp_qs)**(-mu(i_mp_qs))*coef_lambda(i_mp_qs)
5274  a_dsds(k) = rhoq(k,i_ns)*coef_a(i_mp_qs)*lambdas(k)**((nu(i_mp_qs)+1.0_rp)/mu(i_mp_qs))
5275  end do
5276  do k = ks, ke
5277  lambdag(k) = xq(k,i_mp_qg)**(-mu(i_mp_qg))*coef_lambda(i_mp_qg)
5278  a_dsdg(k) = rhoq(k,i_ng)*coef_a(i_mp_qg)*lambdag(k)**((nu(i_mp_qg)+1.0_rp)/mu(i_mp_qg))
5279  end do
5280 
5281  !
5282  ! Particle X
5283  !
5284  do ngx=1, ngmax ! X < Y
5285 !OCL LOOP_FISSION_TARGET(LS)
5286  do k = ks, ke
5287  dc_glx = dq_xave(k,i_mp_qc)*coefc_d_gl(ngx)
5288  xc_glx(k,ngx) = ( (dc_glx/a_m(i_mp_qc)) )**(1.0_rp/b_m(i_mp_qc))
5289  dnc_glx(k,ngx) = a_dsdc(k)*(xc_glx(k,ngx)**nu(i_mp_qc)) * exp(-lambdac(k)*xc_glx(k,ngx)**mu(i_mp_qc))&
5290  *(xc_glx(k,ngx)/(b_m(i_mp_qc)*dc_glx))*dc_glx*wc_gl(ngx) ! dNdlogD*weight
5291  !
5292  dr_glx = dq_xave(k,i_mp_qr)*coefr_d_gl(ngx)
5293  xr_glx(k,ngx) = ( (dr_glx/a_m(i_mp_qr)) )**(1.0_rp/b_m(i_mp_qr))
5294  dnr_glx(k,ngx) = a_dsdr(k)*(xr_glx(k,ngx)**nu(i_mp_qr)) * exp(-lambdar(k)*xr_glx(k,ngx)**mu(i_mp_qr))&
5295  *(xr_glx(k,ngx)/(b_m(i_mp_qr)*dr_glx))*dr_glx*wr_gl(ngx) ! dNdlogD*weight
5296  !
5297  di_glx = dq_xave(k,i_mp_qi)*coef_d_gl(ngx)
5298  xi_glx(k,ngx) = ( (di_glx/a_m(i_mp_qi)) )**(1.0_rp/b_m(i_mp_qi))
5299  dni_glx(k,ngx) = a_dsdi(k)*(xi_glx(k,ngx)**nu(i_mp_qi)) * exp(-lambdai(k)*xi_glx(k,ngx)**mu(i_mp_qi))&
5300  *(xi_glx(k,ngx)/(b_m(i_mp_qi)*di_glx))*di_glx*w_gl(ngx) ! dNdlogD*weight
5301  !
5302  ds_glx = dq_xave(k,i_mp_qs)*coef_d_gl(ngx)
5303  xs_glx(k,ngx) = ( (ds_glx/a_m(i_mp_qs)) )**(1.0_rp/b_m(i_mp_qs))
5304  dns_glx(k,ngx) = a_dsds(k)*(xs_glx(k,ngx)**nu(i_mp_qs)) * exp(-lambdas(k)*xs_glx(k,ngx)**mu(i_mp_qs))&
5305  *(xs_glx(k,ngx)/(b_m(i_mp_qs)*ds_glx))*ds_glx*w_gl(ngx)! dNdlogD*weight
5306  !
5307  dg_glx = dq_xave(k,i_mp_qg)*coef_d_gl(ngx)
5308  xg_glx(k,ngx) = ( (dg_glx/a_m(i_mp_qg)) )**(1.0_rp/b_m(i_mp_qg))
5309  dng_glx(k,ngx) = a_dsdg(k)*(xg_glx(k,ngx)**nu(i_mp_qg)) * exp(-lambdag(k)*xg_glx(k,ngx)**mu(i_mp_qg))&
5310  *(xg_glx(k,ngx)/(b_m(i_mp_qg)*dg_glx))*dg_glx*w_gl(ngx)! dNdlogD*weight
5311  !
5312  ! Hexagonal Columns
5313 !!$ if( di_glx <= 100.e-6_RP )then
5314 !!$ acx = 0.1677_RP*1.e-3_RP*(100.0_RP**2.91_RP)
5315 !!$ bcx = 2.91_RP
5316 !!$ gcx = (0.684_RP*1.e-4_RP)*10.0_RP**(2.0_RP*2.0_RP)
5317 !!$ scx = 2.0_RP
5318 !!$ else
5319 !!$ acx = 0.00166_RP*1.e-3_RP*(100.0_RP**1.91_RP)
5320 !!$ bcx = 1.91_RP
5321 !!$ gcx = (0.0696_RP*1.e-4_RP)*10.0_RP**(2.0_RP*1.5_RP)
5322 !!$ scx = 1.5_RP
5323 !!$ end if
5324  sw = 0.5_rp + sign(0.5_rp, di_glx - 100.e-6_rp )
5325  acx = ( 0.1677_rp*(1.0_rp-sw) + 0.00166_rp*sw ) * 1.e-3_rp * 100.0_rp**( 2.91_rp*(1.0_rp-sw) + 1.91_rp*sw )
5326  bcx = 2.91_rp*(1.0_rp-sw) + 1.91_rp*sw
5327  gcx = (0.684_rp*(1.0_rp-sw) + 0.0696_rp*sw ) * 1.e-4_rp * 10.0_rp**( 4.0_rp*(1.0_rp-sw) + 3.0_rp*sw )
5328  scx = 2.0_rp*(1.0_rp-sw) + 1.5_rp*sw
5329  num_besti_glx = 2.0_rp*acx*grav*rho(k)*di_glx**(bcx+2.0_rp-scx)/(gcx*mua(k)**2)
5330  num_bests_glx = 2.0_rp*as *grav*rho(k)*ds_glx**(bs +2.0_rp-ss )/(gs *mua(k)**2)
5331  num_bestg_glx = 2.0_rp*ag *grav*rho(k)*dg_glx**(bg +2.0_rp-sg )/(gg *mua(k)**2)
5332  num_rei_glx = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_besti_glx)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5333  num_res_glx = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_bests_glx)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5334  num_reg_glx = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_bestg_glx)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5335  !
5336  vtc_glx(k,ngx) = coef_vtr_ar2*dc_glx*(1.0_rp-exp(-coef_vtr_br2*dc_glx))
5337  !
5338 !!$ if( dr_glx < d_vtr_branch )then
5339 !!$ vtr_glx = coef_vtr_ar2*dr_glx*(1.0_RP-exp(-coef_vtr_br2*dr_glx))
5340 !!$ else
5341 !!$ vtr_glx = coef_vtr_ar1-coef_vtr_br1*exp(-coef_vtr_cr1*dr_glx)
5342 !!$ end if
5343  sw = 0.5_rp + sign( 0.5_rp, dr_glx - d_vtr_branch )
5344  tmp = exp( - ( coef_vtr_br2*(1.0_rp-sw) + coef_vtr_cr1*sw ) * dr_glx )
5345  vtr_glx(k,ngx) = coef_vtr_ar2 * dr_glx * ( 1.0_rp - tmp ) * (1.0_rp-sw) &
5346  + ( coef_vtr_ar1 - coef_vtr_br1 * tmp ) * sw
5347  !
5348  vti_glx(k,ngx) = num_rei_glx*nua(k)/di_glx
5349  vts_glx(k,ngx) = num_res_glx*nua(k)/ds_glx
5350  vtg_glx(k,ngx) = num_reg_glx*nua(k)/dg_glx
5351  ! equivalent area diameter
5352  dac_glx(k,ngx) = dc_glx
5353  dar_glx(k,ngx) = dr_glx
5354  dai_glx(k,ngx) = 2.0_rp*sqrt( (gcx*di_glx**scx)/pi )
5355  das_glx(k,ngx) = 2.0_rp*sqrt( (gs *ds_glx**ss )/pi )
5356  dag_glx(k,ngx) = 2.0_rp*sqrt( (gg *dg_glx**sg )/pi )
5357  end do
5358  end do
5359 
5360  !
5361  ! Particle Y
5362  !
5363  do ngy=1, ngmax
5364 !OCL LOOP_FISSION_TARGET(LS)
5365  do k = ks, ke
5366  dr_gly = dq_xave(k,i_mp_qr)*coefr_d_gl(ngy)
5367  xr_gly(k,ngy) = ( (dr_gly/a_m(i_mp_qr)) )**(1.0_rp/b_m(i_mp_qr))
5368  dnr_gly(k,ngy) = a_dsdr(k)*(xr_gly(k,ngy)**nu(i_mp_qr)) * exp(-lambdar(k)*xr_gly(k,ngy)**mu(i_mp_qr))&
5369  *(xr_gly(k,ngy)/(b_m(i_mp_qr)*dr_gly))*dr_gly*wr_gl(ngy) ! dNdlogD*weight
5370  !
5371  di_gly = dq_xave(k,i_mp_qi)*coef_d_gl(ngy)
5372  xi_gly = ( (di_gly/a_m(i_mp_qi)) )**(1.0_rp/b_m(i_mp_qi))
5373  dni_gly(k,ngy) = a_dsdi(k)*(xi_gly**nu(i_mp_qi)) * exp(-lambdai(k)*xi_gly**mu(i_mp_qi))&
5374  *(xi_gly/(b_m(i_mp_qi)*di_gly))*di_gly*w_gl(ngy) ! dNdlogD*weight
5375  !
5376  ds_gly = dq_xave(k,i_mp_qs)*coef_d_gl(ngy)
5377  xs_gly = ( (ds_gly/a_m(i_mp_qs)) )**(1.0_rp/b_m(i_mp_qs))
5378  dns_gly(k,ngy) = a_dsds(k)*(xs_gly**nu(i_mp_qs)) * exp(-lambdas(k)*xs_gly**mu(i_mp_qs))&
5379  *(xs_gly/(b_m(i_mp_qs)*ds_gly))*ds_gly*w_gl(ngy)! dNdlogD*weight
5380  !
5381  dg_gly = dq_xave(k,i_mp_qg)*coef_d_gl(ngy)
5382  xg_gly = ( (dg_gly/a_m(i_mp_qg)) )**(1.0_rp/b_m(i_mp_qg))
5383  dng_gly(k,ngy) = a_dsdg(k)*(xg_gly**nu(i_mp_qg)) * exp(-lambdag(k)*xg_gly**mu(i_mp_qg))&
5384  *(xg_gly/(b_m(i_mp_qg)*dg_gly))*dg_gly*w_gl(ngy)! dNdlogD*weight
5385  !
5386  ! Hexagonal Columns
5387 !!$ if( di_gly <= 100.e-6_RP )then
5388 !!$ acy = 0.1677_RP*1.d-3*(100.0_RP**2.91_RP)
5389 !!$ bcy = 2.91_RP
5390 !!$ gcy = (0.684_RP*1.e-4_RP)*10.0_RP**(2.0_RP*2.0_RP)
5391 !!$ scy = 2.0_RP
5392 !!$ else
5393 !!$ acy = 0.00166_RP*1.e-3_RP*(100.0_RP**1.91_RP)
5394 !!$ bcy = 1.91_RP
5395 !!$ gcy = (0.0696_RP*1.e-4_RP)*10.0_RP**(2.0_RP*1.5_RP)
5396 !!$ scy = 1.5_RP
5397 !!$ end if
5398  sw = 0.5_rp + sign( 0.5_rp, di_gly - 100.e-6_rp )
5399  acy = ( 0.1677_rp*(1.0_rp-sw) + 0.00166_rp*sw ) * 1.e-3_rp * 100.0_rp**( 2.91_rp*(1.0_rp-sw) + 1.91_rp*sw )
5400  bcy = 2.91_rp*(1.0_rp-sw) + 1.91_rp*sw
5401  gcy = ( 0.684_rp*(1.0_rp-sw) + 0.0696_rp*sw ) * 1.e-4_rp * 10.0_rp**( 4.0_rp*(1.0_rp-sw) + 3.0_rp*sw )
5402  scy = 2.0_rp*(1.0_rp-sw) + 1.5_rp*sw
5403  num_besti_gly = 2.0_rp*acy*grav*rho(k)*di_gly**(bcy+2.0_rp-scy)/(gcy*mua(k)**2)
5404  num_bests_gly = 2.0_rp*as *grav*rho(k)*ds_gly**(bs +2.0_rp-ss )/(gs *mua(k)**2)
5405  num_bestg_gly = 2.0_rp*ag *grav*rho(k)*dg_gly**(bg +2.0_rp-sg )/(gg *mua(k)**2)
5406  num_rei_gly = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_besti_gly)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5407  num_res_gly = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_bests_gly)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5408  num_reg_gly = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_bestg_gly)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5409  !
5410 !!$ if( dr_gly < d_vtr_branch )then
5411 !!$ vtr_gly(k,ngy) = coef_vtr_ar2*dr_gly*(1.0_RP-exp(-coef_vtr_br2*dr_gly))
5412 !!$ else
5413 !!$ vtr_gly(k,ngy) = coef_vtr_ar1-coef_vtr_br1*exp(-coef_vtr_cr1*dr_gly)
5414 !!$ end if
5415  sw = 0.5_rp + sign( 0.5_rp, dr_gly - d_vtr_branch )
5416  tmp = exp( - ( coef_vtr_br2*(1.0_rp-sw) + coef_vtr_cr1*sw ) * dr_gly )
5417  vtr_gly(k,ngy) = coef_vtr_ar2 * dr_gly * ( 1.0_rp - tmp ) * (1.0_rp-sw) &
5418  + ( coef_vtr_ar1 - coef_vtr_br1 * tmp ) * sw
5419  !
5420  vti_gly(k,ngy) = num_rei_gly*nua(k)/di_gly
5421  vts_gly(k,ngy) = num_res_gly*nua(k)/ds_gly
5422  vtg_gly(k,ngy) = num_reg_gly*nua(k)/dg_gly
5423  ! equivalent area diameter
5424  dar_gly(k,ngy) = dr_gly
5425  dai_gly(k,ngy) = 2.0_rp*sqrt( (gcy*di_gly**scy)/pi )
5426  das_gly(k,ngy) = 2.0_rp*sqrt( (gs *ds_gly**ss )/pi )
5427  dag_gly(k,ngy) = 2.0_rp*sqrt( (gg *dg_gly**sg )/pi )
5428  end do
5429  end do
5430 
5431  !
5432  ! BULK collection efficiency are given as follows
5433  !
5434  do k = ks, ke
5435  e_c = max(0.0_rp, min(1.0_rp, (dq_xave(k,i_mp_qc)-dc0)/(dc1-dc0) ))
5436  !
5437 !!$ if (dq_xave(k,I_mp_QI)>di0) then
5438 !!$ E_i = E_im
5439 !!$ else
5440 !!$ E_i = 0.0_RP
5441 !!$ endif
5442  sw = 0.5_rp + sign( 0.5_rp, dq_xave(k,i_mp_qi)-di0 )
5443  e_i = e_im * sw
5444 !!$ if (dq_xave(k,I_mp_QS)>ds0) then
5445 !!$ E_s = E_sm
5446 !!$ else
5447 !!$ E_s = 0.0_RP
5448 !!$ endif
5449  sw = 0.5_rp + sign( 0.5_rp, dq_xave(k,i_mp_qs)-ds0 )
5450  e_s = e_sm * sw
5451 !!$ if (dq_xave(k,I_mp_QG)>dg0) then
5452 !!$ E_g = E_gm
5453 !!$ else
5454 !!$ E_g = 0.0_RP
5455 !!$ endif
5456  sw = 0.5_rp + sign( 0.5_rp, dq_xave(k,i_mp_qg)-dg0 )
5457  e_g = e_gm * sw
5458 
5459  e_ic(k) = e_i*e_c
5460  e_sc(k) = e_s*e_c
5461  e_gc(k) = e_g*e_c
5462  end do
5463 
5464 
5465  !=========================================================================================
5466  ! collection equation
5467  !=========================================================================================
5468  do ngx=1, ngmax ! X < Y
5469  do ngy=1, ngmax
5470 
5471  do k = ks, ke
5472  !
5473  ! 1.c-g (X=Cloud, Y=Graupel)
5474  !
5475 ! kernel_cg = 0.25_RP*pi*(dag_gly(k,ngy)+dac_glx(k,ngx))*(dag_gly(k,ngy)+dac_glx(k,ngx))*sqrt((vtg_gly(k,ngy)-vtc_glx(k,ngx))*(vtg_gly(k,ngy)-vtc_glx(k,ngx))) * E_gc(k)
5476  kernel_cg = 0.25_rp * pi * (dag_gly(k,ngy)+dac_glx(k,ngx))**2 * abs(vtg_gly(k,ngy)-vtc_glx(k,ngx)) * e_gc(k)
5477  pac(k,i_ngacnc2ng) = pac(k,i_ngacnc2ng) - kernel_cg *dnc_glx(k,ngx)*dng_gly(k,ngy)
5478  pac(k,i_lgaclc2lg) = pac(k,i_lgaclc2lg) - kernel_cg*xc_glx(k,ngx)*dnc_glx(k,ngx)*dng_gly(k,ngy)
5479  end do
5480  do k = ks, ke
5481  !
5482  ! 2.c-s (X=Cloud, Y=Snow)
5483  !
5484 ! kernel_cs = 0.25_RP*pi*(das_gly(k,ngy)+dac_glx(k,ngx))*(das_gly(k,ngy)+dac_glx(k,ngx))*sqrt((vts_gly(k,ngy)-vtc_glx(k,ngx))*(vts_gly(k,ngy)-vtc_glx(k,ngx))) * E_sc(k)
5485  kernel_cs = 0.25_rp * pi * (das_gly(k,ngy)+dac_glx(k,ngx))**2 * abs(vts_gly(k,ngy)-vtc_glx(k,ngx)) * e_sc(k)
5486  pac(k,i_nsacnc2ns) = pac(k,i_nsacnc2ns) - kernel_cs *dnc_glx(k,ngx)*dns_gly(k,ngy)
5487  pac(k,i_lsaclc2ls) = pac(k,i_lsaclc2ls) - kernel_cs*xc_glx(k,ngx)*dnc_glx(k,ngx)*dns_gly(k,ngy)
5488  end do
5489  do k = ks, ke
5490  !
5491  ! 3.c-i (X=Cloud, Y=Cloud Ice)
5492  !
5493 ! kernel_ci = 0.25_RP*pi*(dai_gly(k,ngy)+dac_glx(k,ngx))*(dai_gly(k,ngy)+dac_glx(k,ngx))*sqrt((vti_gly(k,ngy)-vtc_glx(k,ngx))*(vti_gly(k,ngy)-vtc_glx(k,ngx))) * E_ic(k)
5494  kernel_ci = 0.25_rp * pi * (dai_gly(k,ngy)+dac_glx(k,ngx))**2 * abs(vti_gly(k,ngy)-vtc_glx(k,ngx)) * e_ic(k)
5495  pac(k,i_niacnc2ni) = pac(k,i_niacnc2ni) - kernel_ci *dnc_glx(k,ngx)*dni_gly(k,ngy)
5496  pac(k,i_liaclc2li) = pac(k,i_liaclc2li) - kernel_ci*xc_glx(k,ngx)*dnc_glx(k,ngx)*dni_gly(k,ngy)
5497  end do
5498  do k = ks, ke
5499  !
5500  ! 4.r-g
5501  !
5502 ! kernel_rg = 0.25_RP*pi*(dag_gly(k,ngy)+dar_glx(k,ngx))*(dag_gly(k,ngy)+dar_glx(k,ngx))*sqrt((vtg_gly(k,ngy)-vtr_glx(k,ngx))*(vtg_gly(k,ngy)-vtr_glx(k,ngx))) * E_gr
5503  kernel_rg = 0.25_rp * pi * (dag_gly(k,ngy)+dar_glx(k,ngx))**2 * abs(vtg_gly(k,ngy)-vtr_glx(k,ngx)) * e_gr
5504  ! T < 273K (X=Rain , Y=Graupel)
5505  pac(k,i_nracng2ng) = pac(k,i_nracng2ng) - kernel_rg *dnr_glx(k,ngx)*dng_gly(k,ngy)
5506  pac(k,i_lraclg2lg) = pac(k,i_lraclg2lg) - kernel_rg*xr_glx(k,ngx)*dnr_glx(k,ngx)*dng_gly(k,ngy)
5507  ! T > 273K (X=Graupel, Y=Rain )
5508  pac(k,i_nracng2nr) = pac(k,i_nracng2nr) - kernel_rg *dng_glx(k,ngx)*dnr_gly(k,ngy)
5509  pac(k,i_lraclg2lr) = pac(k,i_lraclg2lr) - kernel_rg*xg_glx(k,ngx)*dng_glx(k,ngx)*dnr_gly(k,ngy)
5510  end do
5511  do k = ks, ke
5512  !
5513  ! 5.r-s
5514  !
5515 ! kernel_rs = 0.25_RP*pi*(das_glx(k,ngx)+dar_gly(k,ngy))*(das_glx(k,ngx)+dar_gly(k,ngy))*sqrt((vts_glx(k,ngx)-vtr_gly(k,ngy))*(vts_glx(k,ngx)-vtr_gly(k,ngy))) * E_sr
5516  kernel_rs = 0.25_rp * pi * (das_glx(k,ngx)+dar_gly(k,ngy))**2 * abs(vts_glx(k,ngx)-vtr_gly(k,ngy)) * e_sr
5517  ! (X=Snow, Y=Rain)
5518  pac(k,i_nracns2ng_r) = pac(k,i_nracns2ng_r) - kernel_rs *dns_glx(k,ngx)*dnr_gly(k,ngy)
5519  pac(k,i_lracls2lg_r) = pac(k,i_lracls2lg_r) - kernel_rs*xr_gly(k,ngy)*dns_glx(k,ngx)*dnr_gly(k,ngy)
5520  !
5521  pac(k,i_nracns2ng_s) = pac(k,i_nracns2ng_s) - kernel_rs *dns_glx(k,ngx)*dnr_gly(k,ngy)
5522  pac(k,i_lracls2lg_s) = pac(k,i_lracls2lg_s) - kernel_rs*xs_glx(k,ngx)*dns_glx(k,ngx)*dnr_gly(k,ngy)
5523  end do
5524  do k = ks, ke
5525  !
5526  ! 6.r-i
5527  !
5528 ! kernel_ri = 0.25_RP*pi*(dai_glx(k,ngx)+dar_gly(k,ngy))*(dai_glx(k,ngx)+dar_gly(k,ngy))*sqrt((vti_glx(k,ngx)-vtr_gly(k,ngy))*(vti_glx(k,ngx)-vtr_gly(k,ngy))) * E_ir
5529  kernel_ri = 0.25_rp * pi * (dai_glx(k,ngx)+dar_gly(k,ngy))**2 * abs(vti_glx(k,ngx)-vtr_gly(k,ngy)) * e_ir
5530  ! (X=Cloud Ice, Y=Rain)
5531  pac(k,i_nracni2ng_r) = pac(k,i_nracni2ng_r) - kernel_ri *dni_glx(k,ngx)*dnr_gly(k,ngy)
5532  pac(k,i_lracli2lg_r) = pac(k,i_lracli2lg_r) - kernel_ri*xr_gly(k,ngy)*dni_glx(k,ngx)*dnr_gly(k,ngy)
5533  !
5534  pac(k,i_nracni2ng_i) = pac(k,i_nracni2ng_i) - kernel_ri *dni_glx(k,ngx)*dnr_gly(k,ngy)
5535  pac(k,i_lracli2lg_i) = pac(k,i_lracli2lg_i) - kernel_ri*xi_glx(k,ngx)*dni_glx(k,ngx)*dnr_gly(k,ngy)
5536  end do
5537  do k = ks, ke
5538  !
5539  ! 7.i-g
5540  !
5541 ! kernel_ig = 0.25_RP*pi*(dai_glx(k,ngx)+dag_gly(k,ngy))*(dai_glx(k,ngx)+dag_gly(k,ngy))*sqrt((vti_glx(k,ngx)-vtg_gly(k,ngy))*(vti_glx(k,ngx)-vtg_gly(k,ngy))) * E_stick(k) * E_gi
5542  kernel_ig = 0.25_rp * pi * (dai_glx(k,ngx)+dag_gly(k,ngy))**2 * abs(vti_glx(k,ngx)-vtg_gly(k,ngy)) * e_stick(k) * e_gi
5543  pac(k,i_niacng2ng) = pac(k,i_niacng2ng) - kernel_ig *dni_glx(k,ngx)*dng_gly(k,ngy)
5544  pac(k,i_liaclg2lg) = pac(k,i_liaclg2lg) - kernel_ig*xi_glx(k,ngx)*dni_glx(k,ngx)*dng_gly(k,ngy)
5545  end do
5546  do k = ks, ke
5547  !
5548  ! 8.i-s
5549  !
5550 ! kernel_is = 0.25_RP*pi*(dai_glx(k,ngx)+das_gly(k,ngy))*(dai_glx(k,ngx)+das_gly(k,ngy))*sqrt((vti_glx(k,ngx)-vts_gly(k,ngy))*(vti_glx(k,ngx)-vts_gly(k,ngy))) * E_stick(k) * E_si
5551  kernel_is = 0.25_rp * pi * (dai_glx(k,ngx)+das_gly(k,ngy))**2 * abs(vti_glx(k,ngx)-vts_gly(k,ngy)) * e_stick(k) * e_si
5552  pac(k,i_niacns2ns) = pac(k,i_niacns2ns) - kernel_is *dni_glx(k,ngx)*dns_gly(k,ngy)
5553  pac(k,i_liacls2ls) = pac(k,i_liacls2ls) - kernel_is*xi_glx(k,ngx)*dni_glx(k,ngx)*dns_gly(k,ngy)
5554  end do
5555  do k = ks, ke
5556  !
5557  ! 9.i-i
5558  !
5559 ! kernel_ii = 0.25_RP*pi*(dai_glx(k,ngx)+dai_gly(k,ngy))*(dai_glx(k,ngx)+dai_gly(k,ngy))*sqrt((vti_glx(k,ngx)-vti_gly(k,ngy))*(vti_glx(k,ngx)-vti_gly(k,ngy))) * E_stick(k) * E_ii
5560  kernel_ii = 0.25_rp * pi * (dai_glx(k,ngx)+dai_gly(k,ngy))**2 * abs(vti_glx(k,ngx)-vti_gly(k,ngy)) * e_stick(k) * e_ii
5561  pac(k,i_niacni2ns) = pac(k,i_niacni2ns) - kernel_ii *dni_glx(k,ngx)*dni_gly(k,ngy)
5562  pac(k,i_liacli2ls) = pac(k,i_liacli2ls) - kernel_ii*xi_glx(k,ngx)*dni_glx(k,ngx)*dni_gly(k,ngy)
5563  end do
5564  do k = ks, ke
5565  !
5566  ! 10.s-g
5567  !
5568 ! kernel_sg = 0.25_RP*pi*(das_glx(k,ngx)+dag_gly(k,ngy))*(das_glx(k,ngx)+dag_gly(k,ngy))*sqrt((vts_glx(k,ngx)-vtg_gly(k,ngy))*(vts_glx(k,ngx)-vtg_gly(k,ngy))) * E_stick(k) * E_gs
5569  kernel_sg = 0.25_rp * pi * (das_glx(k,ngx)+dag_gly(k,ngy))**2 * abs(vts_glx(k,ngx)-vtg_gly(k,ngy)) * e_stick(k) * e_gs
5570  pac(k,i_ngacns2ng) = pac(k,i_ngacns2ng) - kernel_sg *dns_glx(k,ngx)*dng_gly(k,ngy)
5571  pac(k,i_lgacls2lg) = pac(k,i_lgacls2lg) - kernel_sg*xs_glx(k,ngx)*dns_glx(k,ngx)*dng_gly(k,ngy)
5572  end do
5573  do k = ks, ke
5574  !
5575  ! 11.s-s
5576  !
5577 ! kernel_ss = 0.125_RP*pi*(das_glx(k,ngx)+das_gly(k,ngy))*(das_glx(k,ngx)+das_gly(k,ngy))*sqrt((vts_glx(k,ngx)-vts_gly(k,ngy))*(vts_glx(k,ngx)-vts_gly(k,ngy))) * E_stick(k) * E_ss
5578  kernel_ss = 0.125_rp * pi * (das_glx(k,ngx)+das_gly(k,ngy))**2 * abs(vts_glx(k,ngx)-vts_gly(k,ngy)) * e_stick(k) * e_ss
5579  pac(k,i_nsacns2ns) = pac(k,i_nsacns2ns) - kernel_ss*dns_glx(k,ngx)*dns_gly(k,ngy)
5580  end do
5581  do k = ks, ke
5582  !
5583  ! 12.g-g
5584  !
5585 ! kernel_gg = 0.125_RP*pi*(dag_glx(k,ngx)+dag_gly(k,ngy))*(dag_glx(k,ngx)+dag_gly(k,ngy))*sqrt((vtg_glx(k,ngx)-vtg_gly(k,ngy))*(vtg_glx(k,ngx)-vtg_gly(k,ngy))) * E_stick(k) * E_gg
5586  kernel_gg = 0.125_rp * pi * (dag_glx(k,ngx)+dag_gly(k,ngy))**2 * abs(vtg_glx(k,ngx)-vtg_gly(k,ngy)) * e_stick(k) * e_gg
5587  pac(k,i_ngacng2ng) = pac(k,i_ngacng2ng) - kernel_gg*dng_glx(k,ngx)*dng_gly(k,ngy)
5588 
5589  end do
5590  end do
5591  end do
5592 
5593  !--- Charge separation by Snow-Graupel rebound--------------------------------
5594  if ( flg_lt ) then
5595  do k = ks, ke
5596 !OCL UNROLL('full')
5597  do ngy = 1, ngmax
5598 !OCL UNROLL('full')
5599  do ngx = 1, ngmax
5600  alpha_lt = 5.0_rp * ( das_glx(k,ngx) / d0_crg )**2*vtg_gly(k,ngy)/v0_crg
5601  alpha_lt = min( alpha_lt, 10.0_rp )
5602 ! kernel_sg_reb = 0.25_RP*pi*(das_glx(k,ngx)+dag_gly(k,ngy))*(das_glx(k,ngx)+dag_gly(k,ngy))*sqrt((vts_glx(k,ngx)-vtg_gly(k,ngy))*(vts_glx(k,ngx)-vtg_gly(k,ngy))) &
5603  kernel_sg_reb = 0.25_rp * pi * (das_glx(k,ngx)+dag_gly(k,ngy))**2 * abs(vts_glx(k,ngx)-vtg_gly(k,ngy)) &
5604  * ( 1.0_rp - e_stick(k) ) * e_gs
5605  pcrg2(k,i_cgngacns2ng) = pcrg2(k,i_cgngacns2ng) + kernel_sg_reb*dns_glx(k,ngx)*dng_gly(k,ngy)*dqcrg(k)*alpha_lt*beta_crg(k)
5606  end do
5607  end do
5608  end do
5609  end if
5610 
5611  !
5612  !
5613  do k=ks, ke
5614  temc_p = max(tem(k) - t00,0.0_rp) ! T > 273.15
5615  !------------------------------------------------------------------------
5616  !--- Partial conversion
5617  ! SB06(70),(71)
5618  ! i_iconv2g: option whether partial conversions work or not
5619  ! ice-cloud => graupel
5620  if ( dq_xave(k,i_mp_qi) > di_cri ) then
5621  wx_cri = cfill_i*rhow/rho_g*( pi/6.0_rp*rho_g*dq_xave(k,i_mp_qi)*dq_xave(k,i_mp_qi)*dq_xave(k,i_mp_qi)/xq(k,i_mp_qi) - 1.0_rp )
5622  pq(k,i_licon) = i_iconv2g* pac(k,i_liaclc2li)/max(1.0_rp, wx_cri)
5623  pq(k,i_nicon) = i_iconv2g* pq(k,i_licon)/xq(k,i_mp_qi)
5624  else
5625  wx_cri = 0.0_rp
5626  pq(k,i_licon) = 0.0_rp
5627  pq(k,i_nicon) = 0.0_rp
5628  endif
5629  ! snow-cloud => graupel
5630  wx_crs = cfill_s*rhow/rho_g*( pi/6.0_rp*rho_g*dq_xave(k,i_mp_qs)*dq_xave(k,i_mp_qs)*dq_xave(k,i_mp_qs)/xq(k,i_mp_qs) - 1.0_rp )
5631  pq(k,i_lscon) = i_sconv2g* (pac(k,i_lsaclc2ls))/max(1.0_rp, wx_crs)
5632  pq(k,i_nscon) = i_sconv2g* pq(k,i_lscon)/xq(k,i_mp_qs)
5633  !------------------------------------------------------------------------
5634  !--- enhanced melting( due to collection-freezing of water droplets )
5635  ! originally from Rutledge and Hobbs(1984). eq.(A.21)
5636  ! if T > 273.15 then temc_p=T-273.15, else temc_p=0
5637  ! 08/05/08 [fix] T.Mitsui LHF00 => LHF0
5638  ! melting occurs around T=273K, so LHF0 is suitable both SIMPLE and EXACT,
5639  ! otherwise LHF can have sign both negative(EXACT) and positive(SIMPLE).
5640  coef_emelt = cl/lhf0*temc_p
5641  ! cloud-graupel
5642  pq(k,i_lgacm) = coef_emelt*pac(k,i_lgaclc2lg)
5643  pq(k,i_ngacm) = pq(k,i_lgacm)/xq(k,i_mp_qg)
5644  ! rain-graupel
5645  pq(k,i_lgarm) = coef_emelt*pac(k,i_lraclg2lg)
5646  pq(k,i_ngarm) = pq(k,i_lgarm)/xq(k,i_mp_qg)
5647  ! cloud-snow
5648  pq(k,i_lsacm) = coef_emelt*(pac(k,i_lsaclc2ls))
5649  pq(k,i_nsacm) = pq(k,i_lsacm)/xq(k,i_mp_qs)
5650  ! rain-snow
5651  pq(k,i_lsarm) = coef_emelt*(pac(k,i_lracls2lg_r)+pac(k,i_lracls2lg_s))
5652  pq(k,i_nsarm) = pq(k,i_lsarm)/xq(k,i_mp_qg)
5653  ! cloud-ice
5654  pq(k,i_liacm) = coef_emelt*pac(k,i_liaclc2li)
5655  pq(k,i_niacm) = pq(k,i_liacm)/xq(k,i_mp_qi)
5656  ! rain-ice
5657  pq(k,i_liarm) = coef_emelt*(pac(k,i_lracli2lg_r)+pac(k,i_lracli2lg_i))
5658  pq(k,i_niarm) = pq(k,i_liarm)/xq(k,i_mp_qg)
5659  enddo
5660 
5661  !---- for charge density
5662  if ( flg_lt ) then
5663 
5664  ! 1.c-g (X=Cloud, Y=Graupel)
5665  do k = ks, ke
5666  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5667  pcrg2(k,i_ngacnc2ng) = pac(k,i_ngacnc2ng)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
5668  end do
5669 
5670  ! 2.c-s (X=Cloud, Y=Snow)
5671  do k = ks, ke
5672  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5673  pcrg2(k,i_nsacnc2ns) = pac(k,i_nsacnc2ns)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
5674  end do
5675 
5676  ! 3.c-i (X=Cloud, Y=Cloud Ice)
5677  do k = ks, ke
5678  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5679  pcrg2(k,i_niacnc2ni) = pac(k,i_niacnc2ni)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
5680  end do
5681 
5682  ! 4.r-g
5683  do k = ks, ke
5684  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small )
5685  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small )
5686  pcrg2(k,i_nracng2ng) = pac(k,i_nracng2ng)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
5687  pcrg2(k,i_nracng2nr) = pac(k,i_nracng2nr)*(1.0_rp-sw2) / (rhoq(k,i_ng)+sw2) * rhoq_crg(k,i_qg)
5688  end do
5689 
5690  ! 5.r-s
5691  do k = ks, ke
5692  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small )
5693  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5694  pcrg2(k,i_nracns2ng_r) = pac(k,i_nracns2ng_r)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
5695  pcrg2(k,i_nracns2ng_s) = pac(k,i_nracns2ng_s)*(1.0_rp-sw2) / (rhoq(k,i_ns)+sw2) * rhoq_crg(k,i_qs)
5696  end do
5697 
5698 
5699  ! 6.r-i
5700  do k = ks, ke
5701  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small )
5702  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5703  pcrg2(k,i_nracni2ng_r) = pac(k,i_nracni2ng_r)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
5704  pcrg2(k,i_nracni2ng_i) = pac(k,i_nracni2ng_i)*(1.0_rp-sw2) / (rhoq(k,i_ni)+sw2) * rhoq_crg(k,i_qi)
5705  end do
5706 
5707  ! 7.i-g
5708  do k = ks, ke
5709  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5710  pcrg2(k,i_niacng2ng) = pac(k,i_niacng2ng)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5711  end do
5712 
5713  ! 8.i-s
5714  do k = ks, ke
5715  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5716  pcrg2(k,i_niacns2ns) = pac(k,i_niacns2ns)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5717  end do
5718 
5719  ! 9.i-i
5720  do k = ks, ke
5721  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5722  pcrg2(k,i_niacni2ns) = pac(k,i_niacni2ns)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5723  end do
5724 
5725  ! 10.s-g
5726  do k = ks, ke
5727  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5728  pcrg2(k,i_ngacns2ng) = pac(k,i_ngacns2ng)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
5729  end do
5730 
5731  ! 11.s-s
5732  do k = ks, ke
5733  pcrg2(k,i_nsacns2ns) = 0.0_rp ! no charge transfer between category due to the collection of the same category (snow-snow)
5734  end do
5735 
5736  ! 12.g-g
5737  do k = ks, ke
5738  pcrg2(k,i_ngacng2ng) = 0.0_rp ! no charge transfer between category due to the collection of the same category (graupel-graupel)
5739  end do
5740 
5741  !--- Partial conversion
5742  ! ice-cloud => graupel
5743  do k = ks, ke
5744  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5745  pcrg1(k,i_nicon) = pq(k,i_nicon)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5746  end do
5747 
5748  ! snow-cloud => graupel
5749  do k = ks, ke
5750  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5751  pcrg1(k,i_nscon) = pq(k,i_nscon)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
5752  end do
5753 
5754  !--- enhanced melting( due to collection-freezing of water droplets )
5755  ! cloud-graupel
5756  do k = ks, ke
5757  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small )
5758  pcrg1(k,i_ngacm) = pq(k,i_ngacm)*(1.0_rp-sw1) / (rhoq(k,i_ng)+sw1) * rhoq_crg(k,i_qg)
5759  end do
5760 
5761  ! rain-graupel
5762  do k = ks, ke
5763  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small )
5764  pcrg1(k,i_ngarm) = pq(k,i_ngarm)*(1.0_rp-sw1) / (rhoq(k,i_ng)+sw1) * rhoq_crg(k,i_qg)
5765  end do
5766 
5767  ! cloud-snow
5768  do k = ks, ke
5769  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5770  pcrg1(k,i_nsacm) = pq(k,i_nsacm)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
5771  end do
5772 
5773  ! rain-snow
5774  do k = ks, ke
5775  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5776  pcrg1(k,i_nsarm) = pq(k,i_nsarm)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
5777  end do
5778 
5779  ! cloud-ice
5780  do k = ks, ke
5781  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5782  pcrg1(k,i_niacm) = pq(k,i_niacm)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5783  end do
5784 
5785  ! rain-ice
5786  do k = ks, ke
5787  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5788  pcrg1(k,i_niarm) = pq(k,i_niarm)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5789  end do
5790 
5791  endif
5792 
5793  return

References scale_prc::prc_abort().

Referenced by atmos_phy_mp_sn14_terminal_velocity().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ aut_acc_slc_brk()

subroutine scale_atmos_phy_mp_sn14::aut_acc_slc_brk ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
logical, intent(in)  flg_lt,
real(rp), dimension(ka,i_qv:i_ng), intent(in)  rhoq,
real(rp), dimension(ka,i_qc:i_qg), intent(in)  rhoq_crg,
real(rp), dimension(ka,hydro_max), intent(in)  xq,
real(rp), dimension(ka,hydro_max), intent(in)  dq_xave,
real(rp), dimension(ka), intent(in)  rho,
real(rp), dimension(ka,pq_max), intent(inout)  PQ,
real(rp), dimension(ka,pq_max), intent(inout)  Pcrg 
)

Definition at line 5799 of file scale_atmos_phy_mp_sn14.F90.

5806  implicit none
5807 
5808  integer, intent(in) :: KA, KS, KE
5809  !
5810  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
5811  real(RP), intent(in) :: rhoq_crg(KA,I_QC:I_QG)
5812  logical, intent(in) :: flg_lt
5813  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
5814  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX)
5815  real(RP), intent(in) :: rho(KA)
5816  !
5817  real(RP), intent(inout) :: PQ(KA,PQ_MAX)
5818  real(RP), intent(inout) :: Pcrg(KA,PQ_MAX)
5819  !
5820  ! parameter for autoconversion
5821  real(RP), parameter :: kcc = 4.44e+9_rp ! collision efficiency [m3/kg2/sec]
5822  real(RP), parameter :: tau_min = 1.e-20_rp ! empirical filter by T.Mitsui
5823  real(RP), parameter :: rx_sep = 1.0_rp/x_sep ! 1/x_sep, 10/08/03 [Add] T.Mitsui
5824  !
5825  ! parameter for accretion
5826  real(RP), parameter :: kcr = 5.8_rp ! collision efficiency [m3/kg2/sec]
5827  real(RP), parameter :: thr_acc = 5.e-5_rp ! threshold for universal function original
5828  !
5829  ! parameter for self collection and collison break-up
5830  real(RP), parameter :: krr = 4.33_rp ! k_rr, S08 (35)
5831  real(RP), parameter :: kaprr = 60.7_rp ! kappa_rr, SB06(11)
5832  real(RP), parameter :: kbr = 1000._rp ! k_br, SB06(14)
5833  real(RP), parameter :: kapbr = 2.3e+3_rp ! kappa_br, SB06(15)
5834  real(RP), parameter :: dr_min = 0.35e-3_rp ! minimum diameter, SB06(13)-(15)
5835  !
5836  ! work variables
5837  real(RP) :: coef_nuc0 ! coefficient of number for Auto-conversion
5838  real(RP) :: coef_nuc1 ! mass
5839  real(RP) :: coef_aut0 ! number
5840  real(RP) :: coef_aut1 ! mass
5841  real(RP) :: lwc ! lc+lr
5842  real(RP) :: tau ! conversion ratio: qr/(qc+qr) ranges [0:1]
5843  real(RP) :: rho_fac ! factor of air density
5844  real(RP) :: psi_aut ! Universal function of Auto-conversion
5845  real(RP) :: psi_acc ! Universal function of Accretion
5846  real(RP) :: psi_brk ! Universal function of Breakup
5847  real(RP) :: ddr ! diameter difference from equilibrium
5848  !
5849  integer :: k, iqw
5850  real(RP) :: sw
5851  !
5852  coef_nuc0 = (nu(i_mp_qc)+2.0_rp)/(nu(i_mp_qc)+1.0_rp)
5853  coef_nuc1 = (nu(i_mp_qc)+2.0_rp)*(nu(i_mp_qc)+4.0_rp)/(nu(i_mp_qc)+1.0_rp)/(nu(i_mp_qc)+1.0_rp)
5854  coef_aut0 = -kcc*coef_nuc0
5855  coef_aut1 = -kcc/x_sep/20._rp*coef_nuc1
5856  !
5857 !OCL LOOP_FISSION_TARGET(LS)
5858  do k = ks, ke
5859  lwc = rhoq(k,i_qr) + rhoq(k,i_qc)
5860  if( lwc > xc_min )then
5861  tau = max(tau_min, rhoq(k,i_qr)/lwc)
5862  else
5863  tau = tau_min
5864  end if
5865  rho_fac = sqrt(rho_0/max(rho(k),rho_min))
5866  !
5867  ! Auto-conversion ( cloud-cloud => rain )
5868  psi_aut = 400._rp*(tau**0.7_rp)*(1.0_rp - (tau**0.7_rp))**3 ! (6) SB06
5869  pq(k,i_ncaut) = coef_aut0*rhoq(k,i_qc)*rhoq(k,i_qc)*rho_fac*rho_fac ! (9) SB06 sc+aut
5870  ! lc = lwc*(1-tau), lr = lwc*tau
5871  pq(k,i_lcaut) = coef_aut1*lwc*lwc*xq(k,i_mp_qc)*xq(k,i_mp_qc) & ! (4) SB06
5872  *((1.0_rp-tau)*(1.0_rp-tau) + psi_aut)*rho_fac*rho_fac !
5873  pq(k,i_nraut) = -rx_sep*pq(k,i_lcaut) ! (A7) SB01
5874  !--- for Charge density
5875  if (flg_lt) then
5876  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5877  pcrg(k,i_ncaut) = pq(k,i_ncaut)*(1.0_rp-sw)/(rhoq(k,i_nc)+sw)*rhoq_crg(k,i_qc)
5878  pcrg(k,i_nraut) = -pcrg(k,i_ncaut)
5879  end if
5880  !
5881  ! Accretion ( cloud-rain => rain )
5882  psi_acc =(tau/(tau+thr_acc))**4 ! (8) SB06
5883  pq(k,i_lcacc) = -kcr*rhoq(k,i_qc)*rhoq(k,i_qr)*rho_fac*psi_acc ! (7) SB06
5884  pq(k,i_ncacc) = -kcr*rhoq(k,i_nc)*rhoq(k,i_qr)*rho_fac*psi_acc ! (A6) SB01
5885  !--- for Charge density
5886  if (flg_lt) then
5887  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5888  pcrg(k,i_ncacc) = pq(k,i_ncacc)*(1.0_rp-sw)/(rhoq(k,i_nc)+sw)*rhoq(k,i_qc)
5889  end if
5890  !
5891  ! Self-collection ( rain-rain => rain )
5892  pq(k,i_nrslc) = -krr*rhoq(k,i_nr)*rhoq(k,i_qr)*rho_fac ! (A.8) SB01
5893  !
5894  ! Collisional breakup of rain
5895  ddr = min(1.e-3_rp, dq_xave(k,i_mp_qr) - dr_eq )
5896  if ( dq_xave(k,i_mp_qr) < dr_min ) then ! negligible
5897  psi_brk = -1.0_rp
5898  else if ( dq_xave(k,i_mp_qr) <= dr_eq ) then
5899  psi_brk = kbr*ddr ! (14) SB06
5900  else
5901  psi_brk = exp(kapbr*ddr) - 1.0_rp ! (15) SB06 (SB06 has a typo)
5902  end if
5903  pq(k,i_nrbrk) = - (psi_brk + 1.0_rp)*pq(k,i_nrslc) ! (13) SB06
5904  !
5905  end do
5906  !
5907  return

References scale_const::const_eps.

Referenced by atmos_phy_mp_sn14_terminal_velocity().

Here is the caller graph for this function:

◆ dep_vapor_ice_wrk()

subroutine scale_atmos_phy_mp_sn14::dep_vapor_ice_wrk ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
real(rp), dimension(ka), intent(out)  PLIdep_total,
real(rp), dimension(ka), intent(in)  rho,
real(rp), dimension(ka), intent(in)  tem,
real(rp), dimension(ka), intent(in)  pre,
real(rp), dimension(ka), intent(in)  qd,
real(rp), dimension(ka), intent(in)  esi,
real(rp), dimension(ka), intent(in)  qsi,
real(rp), dimension(ka,i_qv:i_ng), intent(in)  rhoq,
real(rp), dimension(ka,hydro_max,1:2), intent(in)  vt_xave,
real(rp), dimension(ka,hydro_max), intent(in)  dq_xave,
real(rp), intent(in)  dt 
)

Definition at line 6151 of file scale_atmos_phy_mp_sn14.F90.

6160  use scale_const, only: &
6161  rvap => const_rvap, &
6162  rdry => const_rdry, &
6163  t00 => const_tem00, &
6164  lhs0 => const_lhs0, &
6165  lhf00 => const_lhf00, &
6166  pi => const_pi, &
6167  cpdry => const_cpdry, &
6168  pstd => const_pstd, &
6169  psat0 => const_psat0
6170  implicit none
6171 
6172  integer, intent(in) :: KA
6173  integer, intent(in) :: KS
6174  integer, intent(in) :: KE
6175  ! Diffusion growth or Evaporation, Sublimation
6176  real(RP), intent(out) :: PLIdep_total(KA) ! mass for cloud ice
6177  real(RP), intent(in) :: rho(KA) ! air density
6178  real(RP), intent(in) :: tem(KA) ! air temperature
6179  real(RP), intent(in) :: pre(KA) ! air pressure
6180  real(RP), intent(in) :: qd(KA) ! mixing ratio of dry air
6181  real(RP), intent(in) :: esi(KA) ! saturation vapor pressure(solid water)
6182  real(RP), intent(in) :: qsi(KA) ! saturation vapor pressure(solid water)
6183  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
6184  ! Notice following values differ from mean terminal velocity or diameter.
6185  ! mean(vt(x)) /= vt(mean(x)) and mean(D(x)) /= D(mean(x))
6186  ! Following ones are vt(mean(x)) and D(mean(x)).
6187  real(RP), intent(in) :: vt_xave(KA,HYDRO_MAX,1:2) ! terminal velocity of mean cloud
6188  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX) !
6189  real(RP), intent(in) :: dt
6190  !
6191 ! real(RP), intent(in) :: dtime
6192 ! real(RP) :: dtime
6193  !
6194  real(RP) :: rho_lim ! limited density
6195  real(RP) :: temc_lim ! limited temperature[celsius]
6196  real(RP) :: pre_lim ! limited density
6197  real(RP) :: temc ! temperature[celsius]
6198  real(RP) :: pv ! vapor pressure
6199  real(RP) :: qv ! vapor pressure
6200  real(RP) :: ssi ! super saturation ratio(ice water)
6201  real(RP) :: nua, r_nua ! kinematic viscosity of air
6202  real(RP) :: mua ! viscosity of air
6203  real(RP) :: Kat ! thermal conductance
6204  real(RP) :: Dw ! diffusivity of water vapor
6205  real(RP) :: Dht ! diffusivity of heat
6206  real(RP) :: Gi ! diffusion factor by balance between heat and vapor
6207  real(RP) :: Gii, Gis, Gig ! for rain, ice, snow and graupel.
6208  real(RP) :: Gm ! melting factor by balance between heat and vapor
6209  real(RP) :: Nsc_r3 !
6210  !
6211  real(RP) :: Nreis_r2 !
6212  real(RP) :: Nress_r2, Nregs_r2 !
6213  real(RP) :: Nreil_r2 !
6214  real(RP) :: Nresl_r2, Nregl_r2 !
6215  real(RP) :: NscNrei_s, NscNrei_l
6216  real(RP) :: NscNres_s, NscNres_l
6217  real(RP) :: NscNreg_s, NscNreg_l
6218  real(RP) :: ventLI_s, ventLI_l
6219  real(RP) :: ventLS_s, ventLS_l
6220  real(RP) :: ventLG_s, ventLG_l
6221  real(RP) :: wti, wts, wtg
6222  real(RP), parameter :: r_14=1.0_rp/1.4_rp
6223  real(RP), parameter :: r_15=1.0_rp/1.5_rp
6224  real(RP) :: ventLI !
6225  real(RP) :: ventLS !
6226  real(RP) :: ventLG !
6227  !
6228  real(RP) :: total_dep
6229  real(RP) :: PLIdep_wrk
6230  real(RP) :: PLSdep_wrk
6231  real(RP) :: PLGdep_wrk
6232  real(RP) :: dep_limiter
6233  !
6234  real(RP), parameter :: Re_max=1.e3_rp
6235  real(RP), parameter :: Re_min=1.e-4_rp
6236  integer :: k
6237  !
6238 ! PLIdep_total(1:KS)=0.0_RP
6239 ! PLIdep_total(KE:KA)=0.0_RP
6240  plidep_total(:)=0.0_rp !! 22/10/14
6241 
6242  !
6243  do k=ks, ke
6244  temc = tem(k) - t00 ! degC
6245  temc_lim= max(temc, temc_lim_diff) !
6246  rho_lim = max(rho(k),rho_min) !
6247  qv = rhoq(k,i_qv)/rho_lim
6248  pre_lim = rho_lim*(qd(k)*rdry + qv*rvap)*(temc_lim+t00)
6249  !--------------------------------------------------------------------
6250  ! Diffusion growth part is described in detail
6251  ! by Pruppacher and Klett (1997) Sec. 13.2(liquid) and 13.3(solid)
6252  ! G:factor of thermal diffusion(1st.term) and vapor diffusion(2nd. term)
6253  ! SB06(23),(38), Lin et al(31),(52) or others
6254  ! Dw is introduced by Pruppacher and Klett(1997),(13-3)
6255  dw = 0.211e-4_rp* (((temc_lim+t00)/t00)**1.94_rp) *(pstd/pre_lim)
6256  kat = ka0 + temc_lim*dka_dt
6257  mua = mua0 + temc_lim*dmua_dt
6258  nua = mua/rho_lim
6259  r_nua = 1.0_rp/nua
6260  gi = (lhs0/kat/tem(k))*(lhs0/rvap/tem(k)-1.0_rp)+(rvap*tem(k)/dw/esi(k))
6261  ! capacities account for their surface geometries
6262  gii = 4.0_rp*pi/cap(i_mp_qi)/gi
6263  gis = 4.0_rp*pi/cap(i_mp_qs)/gi
6264  gig = 4.0_rp*pi/cap(i_mp_qg)/gi
6265  ! vent: ventilation effect( asymmetry vapor field around particles due to aerodynamic )
6266  ! SB06 (30),(31) and each coefficient is by (88),(89)
6267  nsc_r3 = (nua/dw)**(0.33333333_rp) ! (Schmidt number )^(1/3)
6268  ! Beard and Pruppacher(1971) had performed in the range [0<Re<=320],
6269  ! So here we limit Re in the range Re_max=1000, Re_min=0.0001.
6270  nreis_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qi,1)*dq_xave(k,i_mp_qi)*r_nua))) ! (Reynolds number)^(1/2) cloud ice
6271  nress_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qs,1)*dq_xave(k,i_mp_qs)*r_nua))) ! (Reynolds number)^(1/2) snow
6272  nregs_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qg,1)*dq_xave(k,i_mp_qg)*r_nua))) ! (Reynolds number)^(1/2) graupel
6273  nreil_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qi,2)*dq_xave(k,i_mp_qi)*r_nua))) ! (Reynolds number)^(1/2) cloud ice
6274  nresl_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qs,2)*dq_xave(k,i_mp_qs)*r_nua))) ! (Reynolds number)^(1/2) snow
6275  nregl_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qg,2)*dq_xave(k,i_mp_qg)*r_nua))) ! (Reynolds number)^(1/2) graupel
6276  !
6277  nscnrei_s=nsc_r3*nreis_r2 ! small ice
6278  nscnrei_l=nsc_r3*nreil_r2 ! large ice
6279  nscnres_s=nsc_r3*nress_r2 ! small snow
6280  nscnres_l=nsc_r3*nresl_r2 ! large snow
6281  nscnreg_s=nsc_r3*nregs_r2 ! small snow
6282  nscnreg_l=nsc_r3*nregl_r2 ! large snow
6283  !
6284  ventli_s = ah_vent1(i_mp_qi,1) + bh_vent1(i_mp_qi,1)*nscnrei_s
6285  ventli_l = ah_vent1(i_mp_qi,2) + bh_vent1(i_mp_qi,2)*nscnrei_l
6286  ventls_s = ah_vent1(i_mp_qs,1) + bh_vent1(i_mp_qs,1)*nscnres_s
6287  ventls_l = ah_vent1(i_mp_qs,2) + bh_vent1(i_mp_qs,2)*nscnres_l
6288  ventlg_s = ah_vent1(i_mp_qg,1) + bh_vent1(i_mp_qg,1)*nscnreg_s
6289  ventlg_l = ah_vent1(i_mp_qg,2) + bh_vent1(i_mp_qg,2)*nscnreg_l
6290  ! branch is 1.4 for rain, snow, graupel; is 1.0 for ice (PK97, 13-60,-61,-88,-89).
6291  wti = ( min(max( nscnrei_s , 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.0*0.5 and 1.0*2
6292  wts = ( min(max( nscnres_s*r_14, 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.4*0.5 and 1.4*2
6293  wtg = ( min(max( nscnreg_s*r_14, 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.4*0.5 and 1.4*2
6294  ! interpolation between two branches
6295  ventli = (1.0_rp-wti)*ventli_s + wti*ventli_l
6296  ventls = (1.0_rp-wts)*ventls_s + wts*ventls_l
6297  ventlg = (1.0_rp-wtg)*ventlg_s + wtg*ventlg_l
6298  ! SB06(29)
6299  ssi = qv/qsi(k) - 1.0_rp ! supersaturation
6300  plidep_wrk = gii*ssi*max(rhoq(k,i_ni),0.0_rp)*dq_xave(k,i_mp_qi)*ventli
6301  plsdep_wrk = gis*ssi*max(rhoq(k,i_ns),0.0_rp)*dq_xave(k,i_mp_qs)*ventls
6302  plgdep_wrk = gig*ssi*max(rhoq(k,i_ng),0.0_rp)*dq_xave(k,i_mp_qg)*ventlg
6303  !
6304  dep_limiter = rho(k)*(qv-qsi(k))/dt
6305  if (ssi < -1.e-30_rp)then ! unsaturated
6306  plidep_total(k) = max(plidep_wrk+plsdep_wrk+plgdep_wrk, dep_limiter)
6307  else if (ssi > 1.e-30_rp)then ! saturated
6308  plidep_total(k) = min(plidep_wrk+plsdep_wrk+plgdep_wrk, dep_limiter)
6309  else
6310  plidep_total(k) = 0.0_rp
6311  end if
6312  enddo
6313 
6314  return
real(rp), public const_cpdry
specific heat (dry air,constant pressure) [J/kg/K]
Definition: scale_const.F90:60

References scale_const::const_cpdry, scale_const::const_lhf00, scale_const::const_lhs0, scale_const::const_pi, scale_const::const_psat0, scale_const::const_pstd, scale_const::const_rdry, scale_const::const_rvap, and scale_const::const_tem00.

Referenced by nucleation().

Here is the caller graph for this function:

◆ freezing_water()

subroutine scale_atmos_phy_mp_sn14::freezing_water ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
real(rp), intent(in)  dt,
real(rp), dimension(ka,i_qv:i_ng), intent(in)  rhoq,
real(rp), dimension(ka,hydro_max), intent(in)  xq,
real(rp), dimension(ka), intent(in)  tem,
real(rp), dimension(ka,pq_max), intent(inout)  PQ 
)

Definition at line 6319 of file scale_atmos_phy_mp_sn14.F90.

6324  implicit none
6325  !
6326  ! In this subroutine,
6327  ! We assumed surface temperature of droplets are same as environment.
6328 
6329  integer, intent(in) :: KA, KS, KE
6330 
6331  real(RP), intent(in) :: dt
6332  !
6333  real(RP), intent(in) :: tem(KA)
6334  !
6335  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
6336  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
6337  !
6338  real(RP), intent(inout):: PQ(KA,PQ_MAX)
6339  !
6340  real(RP), parameter :: temc_min = -65.0_rp
6341  real(RP), parameter :: a_het = 0.2_rp ! SB06 (44)
6342  real(RP), parameter :: b_het = 0.65_rp ! SB06 (44)
6343  !
6344  real(RP) :: coef_m2_c
6345  real(RP) :: coef_m2_r
6346  ! temperature [celsius]
6347  real(RP) :: temc, temc2, temc3, temc4
6348  ! temperature function of homegenous/heterogenous freezing
6349  real(RP) :: Jhom, Jhet, Jh(KA)
6350  real(RP) :: rdt
6351  real(RP) :: tmp
6352  !
6353  integer :: k
6354  !
6355  rdt = 1.0_rp/dt
6356  !
6357  coef_m2_c = coef_m2(i_mp_qc)
6358  coef_m2_r = coef_m2(i_mp_qr)
6359  !
6360 
6361  ! Note, xc should be limited in range[xc_min:xc_max].
6362  ! and PNChom need to be calculated by NC
6363  ! because reduction rate of Nc need to be bound by NC.
6364  ! For the same reason PLChom also bound by LC and xc.
6365  ! Basically L and N should be independent
6366  ! but average particle mass x should be in suitable range.
6367 
6368  ! Homogenous Freezing
6369  do k = ks, ke
6370  pq(k,i_lchom) = 0.0_rp
6371  pq(k,i_nchom) = 0.0_rp
6372  end do
6373 
6374  ! Heterogenous Freezing
6375  do k = ks, ke
6376  temc = max( tem(k) - t00, temc_min )
6377  ! These cause from aerosol-droplet interaction.
6378  ! Bigg(1953) formula, Khain etal.(2000) eq.(4.5), Pruppacher and Klett(1997) eq.(9-48)
6379  jhet = a_het*( exp( -b_het*temc ) - 1.0_rp )
6380  ! These cause in nature.
6381  ! Cotton and Field 2002, QJRMS. (12)
6382  if( temc < -30.0_rp ) then
6383  temc2 = temc*temc
6384  temc3 = temc*temc2
6385  temc4 = temc2*temc2
6386  jhom = 10.0_rp**(&
6387  - 243.40_rp - 14.75_rp*temc - 0.307_rp*temc2 &
6388  - 0.00287_rp*temc3 - 0.0000102_rp*temc4 ) *1.e+3_rp
6389  else if( temc < 0.0_rp) then
6390  jhom = 10._rp**(-7.63_rp-2.996_rp*(temc+30.0_rp))*1.e+3_rp
6391  else
6392  jhom = 0.0_rp
6393  jhet = 0.0_rp
6394  end if
6395  jh(k) = ( jhet + jhom ) * dt
6396  end do
6397 
6398  do k = ks, ke
6399 #if defined(NVIDIA) || defined(SX)
6400  tmp = min( xq(k,i_mp_qc)*jh(k), 1.e+3_rp) ! apply exp limiter
6401  pq(k,i_lchet) = -rdt*rhoq(k,i_qc)*( 1.0_rp - exp( -coef_m2_c*tmp ) )
6402  pq(k,i_nchet) = -rdt*rhoq(k,i_nc)*( 1.0_rp - exp( - tmp ) )
6403 
6404  tmp = min( xq(k,i_mp_qr)*jh(k), 1.e+3_rp) ! apply exp limiter
6405  pq(k,i_lrhet) = -rdt*rhoq(k,i_qr)*( 1.0_rp - exp( -coef_m2_r*tmp ) )
6406  pq(k,i_nrhet) = -rdt*rhoq(k,i_nr)*( 1.0_rp - exp( - tmp ) )
6407 #else
6408  pq(k,i_lchet) = -rdt*rhoq(k,i_qc)*( 1.0_rp - exp( -coef_m2_c*xq(k,i_mp_qc)*jh(k) ) )
6409  pq(k,i_nchet) = -rdt*rhoq(k,i_nc)*( 1.0_rp - exp( - xq(k,i_mp_qc)*jh(k) ) )
6410  pq(k,i_lrhet) = -rdt*rhoq(k,i_qr)*( 1.0_rp - exp( -coef_m2_r*xq(k,i_mp_qr)*jh(k) ) )
6411  pq(k,i_nrhet) = -rdt*rhoq(k,i_nr)*( 1.0_rp - exp( - xq(k,i_mp_qr)*jh(k) ) )
6412 #endif
6413  end do
6414 
6415  !
6416  return

References scale_atmos_hydrometeor::cp_ice, scale_atmos_hydrometeor::cp_vapor, scale_atmos_hydrometeor::cp_water, scale_atmos_hydrometeor::cv_ice, scale_atmos_hydrometeor::cv_vapor, and scale_atmos_hydrometeor::cv_water.

Referenced by atmos_phy_mp_sn14_terminal_velocity().

Here is the caller graph for this function:

◆ cross_section()

subroutine scale_atmos_phy_mp_sn14::cross_section ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
integer, intent(in)  QA_MP,
real(rp), dimension(ka,qa_mp), intent(in)  QTRC0,
real(rp), dimension(ka), intent(in)  DENS0,
real(rp), dimension(ka,hydro_max), intent(out)  Crs 
)

Calculate Cross Section.

Definition at line 7138 of file scale_atmos_phy_mp_sn14.F90.

7144  implicit none
7145 
7146  integer, intent(in) :: KA, KS, KE
7147  integer, intent(in) :: QA_MP
7148  real(RP), intent(in) :: QTRC0(KA,QA_MP) ! tracer mass concentration [kg/kg]
7149  real(RP), intent(in) :: DENS0(KA) ! density [kg/m3]
7150  real(RP), intent(out) :: Crs(KA,HYDRO_MAX)! Cross section [cm]
7151 
7152  ! mass concentration[kg/m3] and mean particle mass[kg]
7153  real(RP) :: xc(KA)
7154  real(RP) :: xr(KA)
7155  real(RP) :: xi(KA)
7156  real(RP) :: xs(KA)
7157  real(RP) :: xg(KA)
7158  ! radius of average mass
7159  real(RP) :: rc, rr
7160 
7161  real(RP) :: coef_Fuetal1998
7162  ! r2m_min is minimum value(moment of 1 particle with 1 micron)
7163  real(RP), parameter :: r2m_min=1.e-12_rp
7164  real(RP), parameter :: um2cm = 100.0_rp
7165 
7166  real(RP) :: limitsw, zerosw
7167  integer :: k
7168  !---------------------------------------------------------------------------
7169 
7170  ! mean particle mass[kg]
7171  do k = ks, ke
7172  xc(k) = min( xc_max, max( xc_min, dens0(k)*qtrc0(k,i_qc)/(qtrc0(k,i_nc)+nc_min) ) )
7173  xr(k) = min( xr_max, max( xr_min, dens0(k)*qtrc0(k,i_qr)/(qtrc0(k,i_nr)+nr_min) ) )
7174  xi(k) = min( xi_max, max( xi_min, dens0(k)*qtrc0(k,i_qi)/(qtrc0(k,i_ni)+ni_min) ) )
7175  xs(k) = min( xs_max, max( xs_min, dens0(k)*qtrc0(k,i_qs)/(qtrc0(k,i_ns)+ns_min) ) )
7176  xg(k) = min( xg_max, max( xg_min, dens0(k)*qtrc0(k,i_qg)/(qtrc0(k,i_ng)+ng_min) ) )
7177  enddo
7178 
7179 
7180  do k = ks, ke
7181  crs(k,i_mp_qc) = pi * coef_r2(i_mp_qc) * qtrc0(k,i_nc) * a_rea2(i_mp_qc) * xc(k)**b_rea2(i_mp_qc)
7182  enddo
7183 
7184  do k = ks, ke
7185  crs(k,i_mp_qr) = pi * coef_r2(i_mp_qr) * qtrc0(k,i_nr) * a_rea2(i_mp_qr) * xr(k)**b_rea2(i_mp_qr)
7186  enddo
7187 
7188  do k = ks, ke
7189  crs(k,i_mp_qi) = pi * coef_rea2(i_mp_qi) * qtrc0(k,i_ni) * a_rea2(i_mp_qi) * xi(k)**b_rea2(i_mp_qi)
7190  crs(k,i_mp_qs) = pi * coef_rea2(i_mp_qs) * qtrc0(k,i_ns) * a_rea2(i_mp_qs) * xs(k)**b_rea2(i_mp_qs)
7191  crs(k,i_mp_qg) = pi * coef_rea2(i_mp_qg) * qtrc0(k,i_ng) * a_rea2(i_mp_qg) * xg(k)**b_rea2(i_mp_qg)
7192  enddo
7193 
7194  return

Referenced by atmos_phy_mp_sn14_terminal_velocity().

Here is the caller graph for this function:

Variable Documentation

◆ qa_mp

integer, parameter, public scale_atmos_phy_mp_sn14::qa_mp = 11

Definition at line 110 of file scale_atmos_phy_mp_sn14.F90.

110  integer, public, parameter :: QA_MP = 11

Referenced by atmos_phy_mp_sn14_terminal_velocity().

◆ atmos_phy_mp_sn14_ntracers

integer, parameter, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_ntracers = QA_MP

Definition at line 112 of file scale_atmos_phy_mp_sn14.F90.

112  integer, parameter, public :: ATMOS_PHY_MP_SN14_ntracers = qa_mp

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_tracer_setup().

◆ atmos_phy_mp_sn14_nwaters

integer, parameter, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_nwaters = 2

Definition at line 113 of file scale_atmos_phy_mp_sn14.F90.

113  integer, parameter, public :: ATMOS_PHY_MP_SN14_nwaters = 2

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_tracer_setup().

◆ atmos_phy_mp_sn14_nices

integer, parameter, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_nices = 3

Definition at line 114 of file scale_atmos_phy_mp_sn14.F90.

114  integer, parameter, public :: ATMOS_PHY_MP_SN14_nices = 3

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_tracer_setup().

◆ atmos_phy_mp_sn14_tracer_names

character(len=h_short), dimension(qa_mp), parameter, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_tracer_names = (/ 'QV', 'QC', 'QR', 'QI', 'QS', 'QG', 'NC', 'NR', 'NI', 'NS', 'NG' /)

Definition at line 115 of file scale_atmos_phy_mp_sn14.F90.

115  character(len=H_SHORT), parameter, public :: ATMOS_PHY_MP_SN14_tracer_names(QA_MP) = (/ &
116  'QV', &
117  'QC', &
118  'QR', &
119  'QI', &
120  'QS', &
121  'QG', &
122  'NC', &
123  'NR', &
124  'NI', &
125  'NS', &
126  'NG' /)

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_tracer_setup().

◆ atmos_phy_mp_sn14_tracer_descriptions

character(len=h_mid), dimension(qa_mp), parameter, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_tracer_descriptions = (/ 'Ratio of Water Vapor mass to total mass (Specific humidity)', 'Ratio of Cloud Water mass to total mass ', 'Ratio of Rain Water mass to total mass ', 'Ratio of Cloud Ice mass ratio to total mass ', 'Ratio of Snow mass ratio to total mass ', 'Ratio of Graupel mass ratio to total mass ', 'Cloud Water Number Density ', 'Rain Water Number Density ', 'Cloud Ice Number Density ', 'Snow Number Density ', 'Graupel Number Density '/)

Definition at line 127 of file scale_atmos_phy_mp_sn14.F90.

127  character(len=H_MID) , parameter, public :: ATMOS_PHY_MP_SN14_tracer_descriptions(QA_MP) = (/ &
128  'Ratio of Water Vapor mass to total mass (Specific humidity)', &
129  'Ratio of Cloud Water mass to total mass ', &
130  'Ratio of Rain Water mass to total mass ', &
131  'Ratio of Cloud Ice mass ratio to total mass ', &
132  'Ratio of Snow mass ratio to total mass ', &
133  'Ratio of Graupel mass ratio to total mass ', &
134  'Cloud Water Number Density ', &
135  'Rain Water Number Density ', &
136  'Cloud Ice Number Density ', &
137  'Snow Number Density ', &
138  'Graupel Number Density '/)

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_tracer_setup().

◆ atmos_phy_mp_sn14_tracer_units

character(len=h_short), dimension(qa_mp), parameter, public scale_atmos_phy_mp_sn14::atmos_phy_mp_sn14_tracer_units = (/ 'kg/kg ', 'kg/kg ', 'kg/kg ', 'kg/kg ', 'kg/kg ', 'kg/kg ', 'num/kg', 'num/kg', 'num/kg', 'num/kg', 'num/kg' /)

Definition at line 139 of file scale_atmos_phy_mp_sn14.F90.

139  character(len=H_SHORT), parameter, public :: ATMOS_PHY_MP_SN14_tracer_units(QA_MP) = (/ &
140  'kg/kg ', &
141  'kg/kg ', &
142  'kg/kg ', &
143  'kg/kg ', &
144  'kg/kg ', &
145  'kg/kg ', &
146  'num/kg', &
147  'num/kg', &
148  'num/kg', &
149  'num/kg', &
150  'num/kg' /)

Referenced by mod_atmos_phy_mp_driver::atmos_phy_mp_driver_tracer_setup().