38module gfdl_cloud_microphys_v3_mod
39 use machine,
only: kind_phys, r8 => kind_dbl_prec
40 use module_gfdlmp_param,
only: read_gfdlmp_nml, &
41 t_min, t_sub, tau_r2g, tau_smlt, tau_gmlt, dw_land, dw_ocean, vw_fac, vi_fac, &
42 vr_fac, vs_fac, vg_fac, ql_mlt, do_qa, fix_negative, vw_max, vi_max, vs_max, &
43 vg_max, vr_max, qs_mlt, qs0_crt, ql0_max, qi0_max, qi0_crt, ifflag, rh_inc, rh_ins,&
44 rh_inr, const_vw, const_vi, const_vs, const_vg, const_vr, rthresh, ccn_l, ccn_o, &
45 igflag, c_paut, tau_imlt, tau_v2l, tau_l2v, tau_i2s, tau_l2r, qi_lim, ql_gen, &
46 do_hail, inflag, c_psacw, c_psaci, c_pracs, c_psacr, c_pgacr, c_pgacs, c_pgacw, &
47 c_pgaci, z_slope_liq, z_slope_ice, prog_ccn, c_pracw, c_praci, rad_snow, &
48 rad_graupel, rad_rain, cld_min, sedflag, sed_fac, do_sedi_uv, do_sedi_w, &
49 do_sedi_heat, icloud_f, irain_f, xr_a, xr_b, xr_c, ntimes, tau_revp, tice_mlt, &
50 do_cond_timescale, mp_time, consv_checker, te_err, tw_err, use_rhc_cevap, &
51 use_rhc_revap, tau_wbf, do_warm_rain_mp, rh_thres, f_dq_p, f_dq_m, do_cld_adj, &
52 rhc_cevap, rhc_revap, beta, liq_ice_combine, rewflag, reiflag, rerflag, resflag, &
53 regflag, rewmin, rewmax, reimin, reimax, rermin, rermax, resmin, resmax, regmin, &
54 regmax, fs2g_fac, fi2s_fac, fi2g_fac, do_sedi_melt, radr_flag, rads_flag, &
55 radg_flag, do_wbf, do_psd_water_fall, do_psd_ice_fall, n0w_sig, n0i_sig, n0r_sig, &
56 n0s_sig, n0g_sig, n0h_sig, n0w_exp, n0i_exp, n0r_exp, n0s_exp, n0g_exp, n0h_exp, &
57 muw, mui, mur, mus, mug, muh, alinw, alini, alinr, alins, aling, alinh, blinw, &
58 blini, blinr, blins, bling, blinh, do_new_acc_water, do_new_acc_ice, is_fac, &
59 ss_fac, gs_fac, rh_fac_evap, rh_fac_cond, snow_grauple_combine, do_psd_water_num, &
60 do_psd_ice_num, vdiffflag, rewfac, reifac, cp_heating, nconds, do_evap_timescale, &
61 delay_cond_evap, do_subgrid_proc, fast_fr_mlt, fast_dep_sub, qi_gen, tice
62 use physcons,
only: grav => con_g, &
65 boltzmann => con_boltz, &
66 avogadro => con_sbc, &
70 runiver => con_runiver, &
80 con_amd, con_amw, visd, &
81 visk, vdifu, tcond, cdg, &
86 rhoh => rhoch, qcmin, qfmin
118 procedure wet_bulb_dry
119 procedure wet_bulb_moist
126 public :: gfdl_cloud_microphys_v3_mod_init
127 public :: gfdl_cloud_microphys_v3_mod_driver
128 public :: gfdl_cloud_microphys_v3_mod_end
129 public :: cld_sat_adj, cld_eff_rad, rad_ref
130 public :: qs_init,
wqs,
mqs, mqs3d
138 logical :: tables_are_initialized = .false.
143 real(kind_phys),
parameter :: c_liq = 4.218e3
144 real(kind = r8),
parameter :: e00 = 611.21
149 real(kind_phys),
parameter :: mmd = con_amd*1e-3
150 real(kind_phys),
parameter :: mmv = con_amw*1e-3
151 real(kind_phys),
parameter :: cv_air = cp_air - rdgas
152 real(kind_phys),
parameter :: cp_vap = 4.0 * rvgas
153 real(kind_phys),
parameter :: cv_vap = 3.0 * rvgas
154 real(kind_phys),
parameter :: dc_vap = cp_vap - c_liq
155 real(kind_phys),
parameter :: dc_ice = c_liq - c_ice
156 real(kind_phys),
parameter :: d2_ice = cp_vap - c_ice
162 integer,
parameter :: length = 2621
163 real(kind_phys),
parameter :: dz_min = 1.0e-2
164 real(kind_phys),
parameter :: dt_fr = 8.0
165 integer :: cfflag = 1
175 real(kind = r8) :: lv0
176 real(kind = r8) :: li0
177 real(kind = r8) :: li2
179 real(kind_phys) :: acco (3, 10), acc (20)
180 real(kind_phys) :: cracs, csacr, cgacr, cgacs, csacw, craci, csaci, cgacw, cgaci, cracw
181 real(kind_phys) :: cssub (5), cgsub (5), crevp (5), cgfr (2), csmlt (4), cgmlt (4)
183 real(kind_phys) :: t_wfr, fac_rc, c_air, c_vap, d0_vap
185 real (kind = r8) :: lv00, li00, li20, cpaut
186 real (kind = r8) :: d1_vap, d1_ice, c1_vap, c1_liq, c1_ice
187 real (kind = r8) :: normw, normr, normi, norms, normg, normh
188 real (kind = r8) :: expow, expor, expoi, expos, expog, expoh
189 real (kind = r8) :: pcaw, pcar, pcai, pcas, pcag, pcah
190 real (kind = r8) :: pcbw, pcbr, pcbi, pcbs, pcbg, pcbh
191 real (kind = r8) :: edaw, edar, edai, edas, edag, edah
192 real (kind = r8) :: edbw, edbr, edbi, edbs, edbg, edbh
193 real (kind = r8) :: oeaw, oear, oeai, oeas, oeag, oeah
194 real (kind = r8) :: oebw, oebr, oebi, oebs, oebg, oebh
195 real (kind = r8) :: rraw, rrar, rrai, rras, rrag, rrah
196 real (kind = r8) :: rrbw, rrbr, rrbi, rrbs, rrbg, rrbh
197 real (kind = r8) :: tvaw, tvar, tvai, tvas, tvag, tvah
198 real (kind = r8) :: tvbw, tvbr, tvbi, tvbs, tvbg, tvbh
200 real(kind_phys),
allocatable :: table0 (:), table1 (:), table2 (:), table3 (:), table4 (:)
201 real(kind_phys),
allocatable :: des0 (:), des1 (:), des2 (:), des3 (:), des4 (:)
209subroutine gfdl_cloud_microphys_v3_mod_init (me, master, nlunit, input_nml_file, logunit, &
210 fn_nml, hydrostatic, errmsg, errflg)
218 integer,
intent (in) :: me
219 integer,
intent (in) :: master
220 integer,
intent (in) :: nlunit
221 integer,
intent (in) :: logunit
223 character (len = 64),
intent (in) :: fn_nml
224 character (len = *),
intent (in) :: input_nml_file (:)
225 logical,
intent (in) :: hydrostatic
226 character(len=*),
intent(out) :: errmsg
227 integer,
intent(out) :: errflg
244 call read_gfdlmp_nml(errmsg = errmsg, errflg = errflg, unit = nlunit, &
245 input_nml_file = input_nml_file, fn_nml = fn_nml, version=3, &
249 lv0 = hlv - dc_vap * tice
250 li0 = hlf - dc_ice * tice
256 if (me == master)
then
257 write (logunit, *)
" ================================================================== "
258 write (logunit, *)
"gfdl_cloud_microphysics_nml_v3"
265 if (.not. tables_are_initialized)
call qs_init
273 call setup_mhc_lhc (hydrostatic)
275end subroutine gfdl_cloud_microphys_v3_mod_init
281subroutine gfdl_cloud_microphys_v3_mod_driver (qv, ql, qr, qi, qs, qg, qa, qnl, qni, pt, wa, &
282 ua, va, delz, delp, gsize, dtm, hs, water, rain, ice, snow, graupel, &
283 hydrostatic, is, ie, ks, ke, q_con, cappa, consv_te, adj_vmr, te, dte, &
284 prefluxw, prefluxr, prefluxi, prefluxs, prefluxg, last_step, do_inline_mp)
292 integer,
intent (in) :: is, ie, ks, ke
294 logical,
intent (in) :: hydrostatic, last_step, consv_te, do_inline_mp
296 real(kind_phys),
intent (in) :: dtm
298 real(kind_phys),
intent (in),
dimension (is:ie) :: hs, gsize
300 real(kind_phys),
intent (in),
dimension (is:ie, ks:ke) :: qnl, qni
302 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: delp, delz, pt, ua, va, wa, te
303 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: qv, ql, qr, qi, qs, qg, qa
304 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: prefluxw, prefluxr, prefluxi, prefluxs, prefluxg
306 real(kind_phys),
intent (inout),
dimension (is:, ks:) :: q_con, cappa
308 real(kind_phys),
intent (inout),
dimension (is:ie) :: water, rain, ice, snow, graupel
310 real(kind_phys),
intent (out),
dimension (is:ie, ks:ke) :: adj_vmr
312 real (kind = r8),
intent (out),
dimension (is:ie) :: dte
318 call mpdrv (hydrostatic, ua, va, wa, delp, pt, qv, ql, qr, qi, qs, qg, qa, &
319 qnl, qni, delz, is, ie, ks, ke, dtm, water, rain, ice, snow, graupel, &
320 gsize, hs, q_con, cappa, consv_te, adj_vmr, te, dte, prefluxw, prefluxr, &
321 prefluxi, prefluxs, prefluxg, last_step, do_inline_mp, .false., .true.)
323end subroutine gfdl_cloud_microphys_v3_mod_driver
329subroutine gfdl_cloud_microphys_v3_mod_end
348 tables_are_initialized = .false.
350end subroutine gfdl_cloud_microphys_v3_mod_end
362 real(kind_phys) :: gcon, hcon, scm3, pisq, act (20), ace (20), occ (3), aone
368 if (do_warm_rain_mp)
then
378 fac_rc = (4. / 3.) * pi * rhow * rthresh ** 3
380 aone = 2. / 9. * (3. / 4.) ** (4. / 3.) / pi ** (1. / 3.)
381 cpaut = c_paut * aone * grav / visd
387 gcon = (4. * grav * rhog / (3. * cdg * rho0)) ** 0.5
388 hcon = (4. * grav * rhoh / (3. * cdh * rho0)) ** 0.5
394 normw = pi * rhow * n0w_sig * gamma(muw + 3)
395 normi = pi * rhoi * n0i_sig * gamma(mui + 3)
396 normr = pi * rhor * n0r_sig * gamma(mur + 3)
397 norms = pi * rhos * n0s_sig * gamma(mus + 3)
398 normg = pi * rhog * n0g_sig * gamma(mug + 3)
399 normh = pi * rhoh * n0h_sig * gamma(muh + 3)
401 expow = exp(n0w_exp / (muw + 3) * log(10.))
402 expoi = exp(n0i_exp / (mui + 3) * log(10.))
403 expor = exp(n0r_exp / (mur + 3) * log(10.))
404 expos = exp(n0s_exp / (mus + 3) * log(10.))
405 expog = exp(n0g_exp / (mug + 3) * log(10.))
406 expoh = exp(n0h_exp / (muh + 3) * log(10.))
414 pcaw = exp(3 / (muw + 3) * log(n0w_sig)) * gamma(muw) * exp(3 * n0w_exp / (muw + 3) * log(10.))
415 pcai = exp(3 / (mui + 3) * log(n0i_sig)) * gamma(mui) * exp(3 * n0i_exp / (mui + 3) * log(10.))
416 pcar = exp(3 / (mur + 3) * log(n0r_sig)) * gamma(mur) * exp(3 * n0r_exp / (mur + 3) * log(10.))
417 pcas = exp(3 / (mus + 3) * log(n0s_sig)) * gamma(mus) * exp(3 * n0s_exp / (mus + 3) * log(10.))
418 pcag = exp(3 / (mug + 3) * log(n0g_sig)) * gamma(mug) * exp(3 * n0g_exp / (mug + 3) * log(10.))
419 pcah = exp(3 / (muh + 3) * log(n0h_sig)) * gamma(muh) * exp(3 * n0h_exp / (muh + 3) * log(10.))
421 pcbw = exp(muw / (muw + 3) * log(pi * rhow * gamma(muw + 3)))
422 pcbi = exp(mui / (mui + 3) * log(pi * rhoi * gamma(mui + 3)))
423 pcbr = exp(mur / (mur + 3) * log(pi * rhor * gamma(mur + 3)))
424 pcbs = exp(mus / (mus + 3) * log(pi * rhos * gamma(mus + 3)))
425 pcbg = exp(mug / (mug + 3) * log(pi * rhog * gamma(mug + 3)))
426 pcbh = exp(muh / (muh + 3) * log(pi * rhoh * gamma(muh + 3)))
428 edaw = exp(- 1. / (muw + 3) * log(n0w_sig)) * (muw + 2) * exp(- n0w_exp / (muw + 3) * log(10.))
429 edai = exp(- 1. / (mui + 3) * log(n0i_sig)) * (mui + 2) * exp(- n0i_exp / (mui + 3) * log(10.))
430 edar = exp(- 1. / (mur + 3) * log(n0r_sig)) * (mur + 2) * exp(- n0r_exp / (mur + 3) * log(10.))
431 edas = exp(- 1. / (mus + 3) * log(n0s_sig)) * (mus + 2) * exp(- n0s_exp / (mus + 3) * log(10.))
432 edag = exp(- 1. / (mug + 3) * log(n0g_sig)) * (mug + 2) * exp(- n0g_exp / (mug + 3) * log(10.))
433 edah = exp(- 1. / (muh + 3) * log(n0h_sig)) * (muh + 2) * exp(- n0h_exp / (muh + 3) * log(10.))
435 edbw = exp(1. / (muw + 3) * log(pi * rhow * gamma(muw + 3)))
436 edbi = exp(1. / (mui + 3) * log(pi * rhoi * gamma(mui + 3)))
437 edbr = exp(1. / (mur + 3) * log(pi * rhor * gamma(mur + 3)))
438 edbs = exp(1. / (mus + 3) * log(pi * rhos * gamma(mus + 3)))
439 edbg = exp(1. / (mug + 3) * log(pi * rhog * gamma(mug + 3)))
440 edbh = exp(1. / (muh + 3) * log(pi * rhoh * gamma(muh + 3)))
442 oeaw = exp(1. / (muw + 3) * log(n0w_sig)) * pi * gamma(muw + 2) * &
443 exp(n0w_exp / (muw + 3) * log(10.))
444 oeai = exp(1. / (mui + 3) * log(n0i_sig)) * pi * gamma(mui + 2) * &
445 exp(n0i_exp / (mui + 3) * log(10.))
446 oear = exp(1. / (mur + 3) * log(n0r_sig)) * pi * gamma(mur + 2) * &
447 exp(n0r_exp / (mur + 3) * log(10.))
448 oeas = exp(1. / (mus + 3) * log(n0s_sig)) * pi * gamma(mus + 2) * &
449 exp(n0s_exp / (mus + 3) * log(10.))
450 oeag = exp(1. / (mug + 3) * log(n0g_sig)) * pi * gamma(mug + 2) * &
451 exp(n0g_exp / (mug + 3) * log(10.))
452 oeah = exp(1. / (muh + 3) * log(n0h_sig)) * pi * gamma(muh + 2) * &
453 exp(n0h_exp / (muh + 3) * log(10.))
455 oebw = 2 * exp((muw + 2) / (muw + 3) * log(pi * rhow * gamma(muw + 3)))
456 oebi = 2 * exp((mui + 2) / (mui + 3) * log(pi * rhoi * gamma(mui + 3)))
457 oebr = 2 * exp((mur + 2) / (mur + 3) * log(pi * rhor * gamma(mur + 3)))
458 oebs = 2 * exp((mus + 2) / (mus + 3) * log(pi * rhos * gamma(mus + 3)))
459 oebg = 2 * exp((mug + 2) / (mug + 3) * log(pi * rhog * gamma(mug + 3)))
460 oebh = 2 * exp((muh + 2) / (muh + 3) * log(pi * rhoh * gamma(muh + 3)))
462 rraw = exp(- 3 / (muw + 3) * log(n0w_sig)) * gamma(muw + 6) * &
463 exp(- 3 * n0w_exp / (muw + 3) * log(10.))
464 rrai = exp(- 3 / (mui + 3) * log(n0i_sig)) * gamma(mui + 6) * &
465 exp(- 3 * n0i_exp / (mui + 3) * log(10.))
466 rrar = exp(- 3 / (mur + 3) * log(n0r_sig)) * gamma(mur + 6) * &
467 exp(- 3 * n0r_exp / (mur + 3) * log(10.))
468 rras = exp(- 3 / (mus + 3) * log(n0s_sig)) * gamma(mus + 6) * &
469 exp(- 3 * n0s_exp / (mus + 3) * log(10.))
470 rrag = exp(- 3 / (mug + 3) * log(n0g_sig)) * gamma(mug + 6) * &
471 exp(- 3 * n0g_exp / (mug + 3) * log(10.))
472 rrah = exp(- 3 / (muh + 3) * log(n0h_sig)) * gamma(muh + 6) * &
473 exp(- 3 * n0h_exp / (muh + 3) * log(10.))
475 rrbw = exp((muw + 6) / (muw + 3) * log(pi * rhow * gamma(muw + 3)))
476 rrbi = exp((mui + 6) / (mui + 3) * log(pi * rhoi * gamma(mui + 3)))
477 rrbr = exp((mur + 6) / (mur + 3) * log(pi * rhor * gamma(mur + 3)))
478 rrbs = exp((mus + 6) / (mus + 3) * log(pi * rhos * gamma(mus + 3)))
479 rrbg = exp((mug + 6) / (mug + 3) * log(pi * rhog * gamma(mug + 3)))
480 rrbh = exp((muh + 6) / (muh + 3) * log(pi * rhoh * gamma(muh + 3)))
482 tvaw = exp(- blinw / (muw + 3) * log(n0w_sig)) * alinw * gamma(muw + blinw + 3) * &
483 exp(- blinw * n0w_exp / (muw + 3) * log(10.))
484 tvai = exp(- blini / (mui + 3) * log(n0i_sig)) * alini * gamma(mui + blini + 3) * &
485 exp(- blini * n0i_exp / (mui + 3) * log(10.))
486 tvar = exp(- blinr / (mur + 3) * log(n0r_sig)) * alinr * gamma(mur + blinr + 3) * &
487 exp(- blinr * n0r_exp / (mur + 3) * log(10.))
488 tvas = exp(- blins / (mus + 3) * log(n0s_sig)) * alins * gamma(mus + blins + 3) * &
489 exp(- blins * n0s_exp / (mus + 3) * log(10.))
490 tvag = exp(- bling / (mug + 3) * log(n0g_sig)) * aling * gamma(mug + bling + 3) * &
491 exp(- bling * n0g_exp / (mug + 3) * log(10.)) * gcon
492 tvah = exp(- blinh / (muh + 3) * log(n0h_sig)) * alinh * gamma(muh + blinh + 3) * &
493 exp(- blinh * n0h_exp / (muh + 3) * log(10.)) * hcon
495 tvbw = exp(blinw / (muw + 3) * log(pi * rhow * gamma(muw + 3))) * gamma(muw + 3)
496 tvbi = exp(blini / (mui + 3) * log(pi * rhoi * gamma(mui + 3))) * gamma(mui + 3)
497 tvbr = exp(blinr / (mur + 3) * log(pi * rhor * gamma(mur + 3))) * gamma(mur + 3)
498 tvbs = exp(blins / (mus + 3) * log(pi * rhos * gamma(mus + 3))) * gamma(mus + 3)
499 tvbg = exp(bling / (mug + 3) * log(pi * rhog * gamma(mug + 3))) * gamma(mug + 3)
500 tvbh = exp(blinh / (muh + 3) * log(pi * rhoh * gamma(muh + 3))) * gamma(muh + 3)
506 scm3 = exp(1. / 3. * log(visk / vdifu))
514 cracw = pi * n0r_sig * alinr * gamma(2 + mur + blinr) / &
515 (4. * exp((2 + mur + blinr) / (mur + 3) * log(normr))) * &
516 exp((1 - blinr) * log(expor))
517 craci = pi * n0r_sig * alinr * gamma(2 + mur + blinr) / &
518 (4. * exp((2 + mur + blinr) / (mur + 3) * log(normr))) * &
519 exp((1 - blinr) * log(expor))
520 csacw = pi * n0s_sig * alins * gamma(2 + mus + blins) / &
521 (4. * exp((2 + mus + blins) / (mus + 3) * log(norms))) * &
522 exp((1 - blins) * log(expos))
523 csaci = pi * n0s_sig * alins * gamma(2 + mus + blins) / &
524 (4. * exp((2 + mus + blins) / (mus + 3) * log(norms))) * &
525 exp((1 - blins) * log(expos))
527 cgacw = pi * n0h_sig * alinh * gamma(2 + muh + blinh) * hcon / &
528 (4. * exp((2 + muh + blinh) / (muh + 3) * log(normh))) * &
529 exp((1 - blinh) * log(expoh))
530 cgaci = pi * n0h_sig * alinh * gamma(2 + muh + blinh) * hcon / &
531 (4. * exp((2 + muh + blinh) / (muh + 3) * log(normh))) * &
532 exp((1 - blinh) * log(expoh))
534 cgacw = pi * n0g_sig * aling * gamma(2 + mug + bling) * gcon / &
535 (4. * exp((2 + mug + bling) / (mug + 3) * log(normg))) * &
536 exp((1 - bling) * log(expog))
537 cgaci = pi * n0g_sig * aling * gamma(2 + mug + bling) * gcon / &
538 (4. * exp((2 + mug + bling) / (mug + 3) * log(normg))) * &
539 exp((1 - bling) * log(expog))
542 if (do_new_acc_water)
then
544 cracw = pisq * n0r_sig * n0w_sig * rhow / 24.
545 csacw = pisq * n0s_sig * n0w_sig * rhow / 24.
547 cgacw = pisq * n0h_sig * n0w_sig * rhow / 24.
549 cgacw = pisq * n0g_sig * n0w_sig * rhow / 24.
554 if (do_new_acc_ice)
then
556 craci = pisq * n0r_sig * n0i_sig * rhoi / 24.
557 csaci = pisq * n0s_sig * n0i_sig * rhoi / 24.
559 cgaci = pisq * n0h_sig * n0i_sig * rhoi / 24.
561 cgaci = pisq * n0g_sig * n0i_sig * rhoi / 24.
566 cracw = cracw * c_pracw
567 craci = craci * c_praci
568 csacw = csacw * c_psacw
569 csaci = csaci * c_psaci
570 cgacw = cgacw * c_pgacw
571 cgaci = cgaci * c_pgaci
577 cracs = pisq * n0r_sig * n0s_sig * rhos / 24.
578 csacr = pisq * n0s_sig * n0r_sig * rhor / 24.
580 cgacr = pisq * n0h_sig * n0r_sig * rhor / 24.
581 cgacs = pisq * n0h_sig * n0s_sig * rhos / 24.
583 cgacr = pisq * n0g_sig * n0r_sig * rhor / 24.
584 cgacs = pisq * n0g_sig * n0s_sig * rhos / 24.
587 cracs = cracs * c_pracs
588 csacr = csacr * c_psacr
589 cgacr = cgacr * c_pgacr
590 cgacs = cgacs * c_pgacs
685 acco(i, k) = occ(i) * gamma(6 + acc(2 * k - 1) - i) * gamma(acc(2 * k) + i - 1) / &
686 (exp((6 + acc(2 * k - 1) - i) / (acc(2 * k - 1) + 3) * log(act(2 * k - 1))) * &
687 exp((acc(2 * k) + i - 1) / (acc(2 * k) + 3) * log(act(2 * k)))) * &
688 exp((i - 3) * log(ace(2 * k - 1))) * exp((4 - i) * log(ace(2 * k)))
696 crevp(1) = 2. * pi * vdifu * tcond * rvgas * n0r_sig * gamma(1 + mur) / &
697 exp((1 + mur) / (mur + 3) * log(normr)) * exp(2.0 * log(expor))
699 crevp(3) = 0.31 * scm3 * sqrt(alinr / visk) * gamma((3 + 2 * mur + blinr) / 2) / &
700 exp((3 + 2 * mur + blinr) / (mur + 3) / 2 * log(normr)) * &
701 exp((1 + mur) / (mur + 3) * log(normr)) / gamma(1 + mur) * &
702 exp((- 1 - blinr) / 2. * log(expor))
703 crevp(4) = tcond * rvgas
706 cssub(1) = 2. * pi * vdifu * tcond * rvgas * n0s_sig * gamma(1 + mus) / &
707 exp((1 + mus) / (mus + 3) * log(norms)) * exp(2.0 * log(expos))
709 cssub(3) = 0.31 * scm3 * sqrt(alins / visk) * gamma((3 + 2 * mus + blins) / 2) / &
710 exp((3 + 2 * mus + blins) / (mus + 3) / 2 * log(norms)) * &
711 exp((1 + mus) / (mus + 3) * log(norms)) / gamma(1 + mus) * &
712 exp((- 1 - blins) / 2. * log(expos))
713 cssub(4) = tcond * rvgas
717 cgsub(1) = 2. * pi * vdifu * tcond * rvgas * n0h_sig * gamma(1 + muh) / &
718 exp((1 + muh) / (muh + 3) * log(normh)) * exp(2.0 * log(expoh))
720 cgsub(3) = 0.31 * scm3 * sqrt(alinh * hcon / visk) * gamma((3 + 2 * muh + blinh) / 2) / &
721 exp(1. / (muh + 3) * (3 + 2 * muh + blinh) / 2 * log(normh)) * &
722 exp(1. / (muh + 3) * (1 + muh) * log(normh)) / gamma(1 + muh) * &
723 exp((- 1 - blinh) / 2. * log(expoh))
725 cgsub(1) = 2. * pi * vdifu * tcond * rvgas * n0g_sig * gamma(1 + mug) / &
726 exp((1 + mug) / (mug + 3) * log(normg)) * exp(2.0 * log(expog))
728 cgsub(3) = 0.31 * scm3 * sqrt(aling * gcon / visk) * gamma((3 + 2 * mug + bling) / 2) / &
729 exp((3 + 2 * mug + bling) / (mug + 3) / 2 * log(normg)) * &
730 exp((1 + mug) / (mug + 3) * log(normg)) / gamma(1 + mug) * &
731 exp((- 1 - bling) / 2. * log(expog))
733 cgsub(4) = tcond * rvgas
740 csmlt(1) = 2. * pi * tcond * n0s_sig * gamma(1 + mus) / &
741 exp((1 + mus) / (mus + 3) * log(norms)) * exp(2.0 * log(expos))
742 csmlt(2) = 2. * pi * vdifu * n0s_sig * gamma(1 + mus) / &
743 exp((1 + mus) / (mus + 3) * log(norms)) * exp(2.0 * log(expos))
752 cgmlt(1) = 2. * pi * tcond * n0h_sig * gamma(1 + muh) / &
753 exp((1 + muh) / (muh + 3) * log(normh)) * exp(2.0 * log(expoh))
754 cgmlt(2) = 2. * pi * vdifu * n0h_sig * gamma(1 + muh) / &
755 exp((1 + muh) / (muh + 3) * log(normh)) * exp(2.0 * log(expoh))
757 cgmlt(1) = 2. * pi * tcond * n0g_sig * gamma(1 + mug) / &
758 exp((1 + mug) / (mug + 3) * log(normg)) * exp(2.0 * log(expog))
759 cgmlt(2) = 2. * pi * vdifu * n0g_sig * gamma(1 + mug) / &
760 exp((1 + mug) / (mug + 3) * log(normg)) * exp(2.0 * log(expog))
769 cgfr(1) = 1.e2 / 36 * pisq * n0r_sig * rhor * gamma(6 + mur) / &
770 exp((6 + mur) / (mur + 3) * log(normr)) * exp(- 3.0 * log(expor))
773end subroutine setup_mp
779subroutine setup_mhc_lhc (hydrostatic)
787 logical,
intent (in) :: hydrostatic
789 if (hydrostatic)
then
797 d0_vap = c_vap - c_liq
801 d1_vap = d0_vap / c_air
802 d1_ice = dc_ice / c_air
804 lv00 = (hlv - d0_vap * tice) / c_air
805 li00 = (hlf - dc_ice * tice) / c_air
808 c1_vap = c_vap / c_air
809 c1_liq = c_liq / c_air
810 c1_ice = c_ice / c_air
812end subroutine setup_mhc_lhc
818subroutine mpdrv (hydrostatic, ua, va, wa, delp, pt, qv, ql, qr, qi, qs, qg, &
819 qa, qnl, qni, delz, is, ie, ks, ke, dtm, water, rain, ice, snow, graupel, &
820 gsize, hs, q_con, cappa, consv_te, adj_vmr, te, dte, prefluxw, prefluxr, &
821 prefluxi, prefluxs, prefluxg, last_step, do_inline_mp, do_mp_fast, do_mp_full)
829 integer,
intent (in) :: is, ie, ks, ke
831 logical,
intent (in) :: hydrostatic, last_step, consv_te, do_inline_mp
832 logical,
intent (in) :: do_mp_fast, do_mp_full
834 real(kind_phys),
intent (in) :: dtm
836 real(kind_phys),
intent (in),
dimension (is:ie) :: gsize, hs
838 real(kind_phys),
intent (in),
dimension (is:ie, ks:ke) :: qnl, qni
840 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: delp, delz, pt, ua, va, wa
841 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: qv, ql, qr, qi, qs, qg, qa
842 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: prefluxw, prefluxr, prefluxi, prefluxs, prefluxg
844 real(kind_phys),
intent (inout),
dimension (is:, ks:) :: q_con, cappa
846 real(kind_phys),
intent (inout),
dimension (is:ie) :: water, rain, ice, snow, graupel
848 real(kind_phys),
intent (out),
dimension (is:ie, ks:ke) :: te, adj_vmr
850 real (kind = r8),
intent (out),
dimension (is:ie) :: dte
858 real(kind_phys) :: rh_adj, rh_rain, ccn0, cin0, cond, q1, q2
859 real(kind_phys) :: convt, dts, q_cond, t_lnd, t_ocn, h_var, tmp, nl, ni
861 real(kind_phys),
dimension (ks:ke) :: q_liq, q_sol, dp, dz, dp0
862 real(kind_phys),
dimension (ks:ke) :: qvz, qlz, qrz, qiz, qsz, qgz, qaz
863 real(kind_phys),
dimension (ks:ke) :: den, pz, denfac, ccn, cin
864 real(kind_phys),
dimension (ks:ke) :: u, v, w
866 real(kind_phys),
dimension (is:ie, ks:ke) :: pcw, edw, oew, rrw, tvw
867 real(kind_phys),
dimension (is:ie, ks:ke) :: pci, edi, oei, rri, tvi
868 real(kind_phys),
dimension (is:ie, ks:ke) :: pcr, edr, oer, rrr, tvr
869 real(kind_phys),
dimension (is:ie, ks:ke) :: pcs, eds, oes, rrs, tvs
870 real(kind_phys),
dimension (is:ie, ks:ke) :: pcg, edg, oeg, rrg, tvg
872 real(kind_phys),
dimension (is:ie) :: condensation, deposition
873 real(kind_phys),
dimension (is:ie) :: evaporation, sublimation
875 real (kind = r8) :: con_r8, c8, cp8
877 real (kind = r8),
dimension (is:ie, ks:ke) :: te_beg_d, te_end_d, tw_beg_d, tw_end_d
878 real (kind = r8),
dimension (is:ie, ks:ke) :: te_beg_m, te_end_m, tw_beg_m, tw_end_m
880 real (kind = r8),
dimension (is:ie) :: te_b_beg_d, te_b_end_d, tw_b_beg_d, tw_b_end_d, te_loss
881 real (kind = r8),
dimension (is:ie) :: te_b_beg_m, te_b_end_m, tw_b_beg_m, tw_b_end_m
883 real (kind = r8),
dimension (ks:ke) :: tz, tzuv, tzw
889 ntimes = max(ntimes, int(dtm / min(dtm, mp_time)))
890 dts = dtm / real(ntimes, kind=kind_phys)
909 convt = 86400. * rgrav / dtm
917 if (do_inline_mp)
then
919 q_cond = ql(i, k) + qr(i, k) + qi(i, k) + qs(i, k) + qg(i, k)
920 tz(k) = pt(i, k) / ((1. + zvir * qv(i, k)) * (1. - q_cond))
933 if (hydrostatic)
then
935 te(i, k) = - c_air * tz(k) * delp(i, k)
939 te(i, k) = - mte(qv(i, k), ql(i, k), qr(i, k), qi(i, k), &
940 qs(i, k), qg(i, k), tz(k), delp(i, k), .true.) * grav
949 if (consv_checker)
then
950 call mtetw (ks, ke, qv(i, :), ql(i, :), qr(i, :), qi(i, :), &
951 qs(i, :), qg(i, :), tz, ua(i, :), va(i, :), wa(i, :), &
952 delp(i, :), dte(i), 0.0, water(i), rain(i), ice(i), &
953 snow(i), graupel(i), 0.0, 0.0, dtm, te_beg_m(i, :), &
954 tw_beg_m(i, :), te_b_beg_m(i), tw_b_beg_m(i), .true., hydrostatic)
971 if (do_inline_mp)
then
972 q_cond = qlz(k) + qrz(k) + qiz(k) + qsz(k) + qgz(k)
973 con_r8 = one_r8 - (qvz(k) + q_cond)
975 con_r8 = one_r8 - qvz(k)
979 dp(k) = delp(i, k) * con_r8
980 con_r8 = one_r8 / con_r8
981 qvz(k) = qvz(k) * con_r8
982 qlz(k) = qlz(k) * con_r8
983 qrz(k) = qrz(k) * con_r8
984 qiz(k) = qiz(k) * con_r8
985 qsz(k) = qsz(k) * con_r8
986 qgz(k) = qgz(k) * con_r8
993 den(k) = - dp(k) / (grav * dz(k))
994 pz(k) = den(k) * rdgas * tz(k)
1002 if (.not. hydrostatic)
then
1009 denfac(k) = sqrt(den(ke) / den(k))
1016 if (consv_checker)
then
1017 call mtetw (ks, ke, qvz, qlz, qrz, qiz, qsz, qgz, tz, u, v, w, &
1018 dp, dte(i), 0.0, water(i), rain(i), ice(i), snow(i), &
1019 graupel(i), 0.0, 0.0, dtm, te_beg_d(i, :), tw_beg_d(i, :), &
1020 te_b_beg_d(i), tw_b_beg_d(i), .false., hydrostatic)
1030 nl = min(1., abs(hs(i)) / (10. * grav)) * &
1031 (10. ** 2.24 * (qnl(i, k) * den(k) * 1.e9) ** 0.257) + &
1032 (1. - min(1., abs(hs(i)) / (10. * grav))) * &
1033 (10. ** 2.06 * (qnl(i, k) * den(k) * 1.e9) ** 0.48)
1035 ccn(k) = max(10.0, nl) * 1.e6
1036 cin(k) = max(10.0, ni) * 1.e6
1037 ccn(k) = ccn(k) / den(k)
1038 cin(k) = cin(k) / den(k)
1041 ccn0 = (ccn_l * min(1., abs(hs(i)) / (10. * grav)) + &
1042 ccn_o * (1. - min(1., abs(hs(i)) / (10. * grav)))) * 1.e6
1045 ccn(k) = ccn0 / den(k)
1046 cin(k) = cin0 / den(k)
1055 t_lnd = dw_land * sqrt(gsize(i) / 1.e5)
1056 t_ocn = dw_ocean * sqrt(gsize(i) / 1.e5)
1057 tmp = min(1., abs(hs(i)) / (10. * grav))
1058 h_var = t_lnd * tmp + t_ocn * (1. - tmp)
1059 h_var = min(0.20, max(0.01, h_var))
1065 rh_adj = 1. - h_var - rh_inc
1066 rh_rain = max(0.35, rh_adj - rh_inr)
1073 call neg_adj (ks, ke, tz, dp, qvz, qlz, qrz, qiz, qsz, qgz, cond)
1075 condensation(i) = condensation(i) + cond * convt
1081 if (do_mp_fast)
then
1083 call mp_fast (ks, ke, tz, qvz, qlz, qrz, qiz, qsz, qgz, dtm, dp, den, &
1084 ccn, cin, condensation(i), deposition(i), evaporation(i), &
1085 sublimation(i), denfac, convt, last_step)
1093 if (do_mp_full)
then
1095 call mp_full (ks, ke, ntimes, tz, qvz, qlz, qrz, qiz, qsz, qgz, dp, dz, &
1096 u, v, w, den, denfac, ccn, cin, dts, rh_adj, rh_rain, h_var, dte(i), &
1097 water(i), rain(i), ice(i), snow(i), graupel(i), prefluxw(i, :), &
1098 prefluxr(i, :), prefluxi(i, :), prefluxs(i, :), prefluxg(i, :), &
1099 condensation(i), deposition(i), evaporation(i), sublimation(i), &
1108 if (do_qa .and. last_step)
then
1109 call cloud_fraction (ks, ke, pz, den, qvz, qlz, qrz, qiz, qsz, qgz, qaz, &
1110 tz, h_var, gsize(i))
1146 if (qlz(k) .gt. qcmin)
then
1147 call cal_pc_ed_oe_rr_tv (qlz(k), den(k), blinw, muw, pcaw, pcbw, pcw(i, k), &
1148 edaw, edbw, edw(i, k), oeaw, oebw, oew(i, k), rraw, rrbw, rrw(i, k), &
1149 tvaw, tvbw, tvw(i, k))
1151 if (qiz(k) .gt. qcmin)
then
1152 call cal_pc_ed_oe_rr_tv (qiz(k), den(k), blini, mui, pcai, pcbi, pci(i, k), &
1153 edai, edbi, edi(i, k), oeai, oebi, oei(i, k), rrai, rrbi, rri(i, k), &
1154 tvai, tvbi, tvi(i, k))
1156 if (qrz(k) .gt. qcmin)
then
1157 call cal_pc_ed_oe_rr_tv (qrz(k), den(k), blinr, mur, pcar, pcbr, pcr(i, k), &
1158 edar, edbr, edr(i, k), oear, oebr, oer(i, k), rrar, rrbr, rrr(i, k), &
1159 tvar, tvbr, tvr(i, k))
1161 if (qsz(k) .gt. qcmin)
then
1162 call cal_pc_ed_oe_rr_tv (qsz(k), den(k), blins, mus, pcas, pcbs, pcs(i, k), &
1163 edas, edbs, eds(i, k), oeas, oebs, oes(i, k), rras, rrbs, rrs(i, k), &
1164 tvas, tvbs, tvs(i, k))
1167 if (qgz(k) .gt. qcmin)
then
1168 call cal_pc_ed_oe_rr_tv (qgz(k), den(k), blinh, muh, pcah, pcbh, pcg(i, k), &
1169 edah, edbh, edg(i, k), oeah, oebh, oeg(i, k), rrah, rrbh, rrg(i, k), &
1170 tvah, tvbh, tvg(i, k))
1173 if (qgz(k) .gt. qcmin)
then
1174 call cal_pc_ed_oe_rr_tv (qgz(k), den(k), bling, mug, pcag, pcbg, pcg(i, k), &
1175 edag, edbg, edg(i, k), oeag, oebg, oeg(i, k), rrag, rrbg, rrg(i, k), &
1176 tvag, tvbg, tvg(i, k))
1186 if (do_sedi_uv)
then
1188 c8 = mhc(qvz(k), qlz(k), qrz(k), qiz(k), qsz(k), qgz(k)) * c_air
1189 tzuv(k) = 0.5 * (ua(i, k) ** 2 + va(i, k) ** 2 - (u(k) ** 2 + v(k) ** 2)) / c8
1190 tz(k) = tz(k) + tzuv(k)
1196 c8 = mhc(qvz(k), qlz(k), qrz(k), qiz(k), qsz(k), qgz(k)) * c_air
1197 tzw(k) = 0.5 * (wa(i, k) ** 2 - w(k) ** 2) / c8
1198 tz(k) = tz(k) + tzw(k)
1206 if (consv_checker)
then
1207 call mtetw (ks, ke, qvz, qlz, qrz, qiz, qsz, qgz, tz, u, v, w, &
1208 dp, dte(i), 0.0, water(i), rain(i), ice(i), snow(i), &
1209 graupel(i), 0.0, 0.0, dtm, te_end_d(i, :), tw_end_d(i, :), &
1210 te_b_end_d(i), tw_b_end_d(i), .false., hydrostatic, te_loss(i))
1219 if (do_inline_mp)
then
1220 q_cond = qlz(k) + qrz(k) + qiz(k) + qsz(k) + qgz(k)
1221 con_r8 = one_r8 + qvz(k) + q_cond
1223 con_r8 = one_r8 + qvz(k)
1226 delp(i, k) = dp(k) * con_r8
1227 con_r8 = one_r8 / con_r8
1228 qvz(k) = qvz(k) * con_r8
1229 qlz(k) = qlz(k) * con_r8
1230 qrz(k) = qrz(k) * con_r8
1231 qiz(k) = qiz(k) * con_r8
1232 qsz(k) = qsz(k) * con_r8
1233 qgz(k) = qgz(k) * con_r8
1235 q1 = qv(i, k) + ql(i, k) + qr(i, k) + qi(i, k) + qs(i, k) + qg(i, k)
1236 q2 = qvz(k) + qlz(k) + qrz(k) + qiz(k) + qsz(k) + qgz(k)
1237 adj_vmr(i, k) = ((one_r8 - q1) / (one_r8 - q2)) / (one_r8 + q2 - q1)
1251 q_liq(k) = qlz(k) + qrz(k)
1252 q_sol(k) = qiz(k) + qsz(k) + qgz(k)
1253 q_cond = q_liq(k) + q_sol(k)
1254 con_r8 = one_r8 - (qvz(k) + q_cond)
1255 c8 = mhc(con_r8, qvz(k), q_liq(k), q_sol(k)) * c_air
1258 q_con(i, k) = q_cond
1261 tmp = rdgas * (1. + zvir * qvz(k))
1262 cappa(i, k) = tmp / (tmp + c8)
1272 if (do_sedi_uv)
then
1274 tz(k) = tz(k) - tzuv(k)
1275 q_liq(k) = qlz(k) + qrz(k)
1276 q_sol(k) = qiz(k) + qsz(k) + qgz(k)
1277 q_cond = q_liq(k) + q_sol(k)
1278 con_r8 = one_r8 - (qvz(k) + q_cond)
1279 c8 = mhc(con_r8, qvz(k), q_liq(k), q_sol(k)) * c_air
1280 tzuv(k) = (0.5 * (ua(i, k) ** 2 + va(i, k) ** 2) * dp0(k) - &
1281 0.5 * (u(k) ** 2 + v(k) ** 2) * delp(i, k)) / c8 / delp(i, k)
1282 tz(k) = tz(k) + tzuv(k)
1292 tz(k) = tz(k) - tzw(k)
1293 q_liq(k) = qlz(k) + qrz(k)
1294 q_sol(k) = qiz(k) + qsz(k) + qgz(k)
1295 q_cond = q_liq(k) + q_sol(k)
1296 con_r8 = one_r8 - (qvz(k) + q_cond)
1297 c8 = mhc(con_r8, qvz(k), q_liq(k), q_sol(k)) * c_air
1298 tzw(k) = (0.5 * (wa(i, k) ** 2) * dp0(k) - &
1299 0.5 * (w(k) ** 2) * delp(i, k)) / c8 / delp(i, k)
1300 tz(k) = tz(k) + tzw(k)
1311 if (consv_checker)
then
1312 call mtetw (ks, ke, qv(i, :), ql(i, :), qr(i, :), qi(i, :), &
1313 qs(i, :), qg(i, :), tz, ua(i, :), va(i, :), wa(i, :), &
1314 delp(i, :), dte(i), 0.0, water(i), rain(i), ice(i), &
1315 snow(i), graupel(i), 0.0, 0.0, dtm, te_end_m(i, :), &
1316 tw_end_m(i, :), te_b_end_m(i), tw_b_end_m(i), .true., hydrostatic)
1324 if (hydrostatic)
then
1326 te(i, k) = te(i, k) + c_air * tz(k) * delp(i, k)
1330 te(i, k) = te(i, k) + mte(qv(i, k), ql(i, k), qr(i, k), qi(i, k), &
1331 qs(i, k), qg(i, k), tz(k), delp(i, k), .true.) * grav
1340 if (do_inline_mp)
then
1342 q_cond = qlz(k) + qrz(k) + qiz(k) + qsz(k) + qgz(k)
1343 if (cp_heating)
then
1344 con_r8 = one_r8 - (qvz(k) + q_cond)
1345 c8 = mhc(con_r8, qvz(k), q_liq(k), q_sol(k)) * c_air
1346 cp8 = con_r8 * cp_air + qvz(k) * cp_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1347 delz(i, k) = delz(i, k) / pt(i, k)
1348 pt(i, k) = pt(i, k) + (tz(k) * ((1. + zvir * qvz(k)) * (1. - q_cond)) - pt(i, k)) * c8 / cp8
1349 delz(i, k) = delz(i, k) * pt(i, k)
1351 pt(i, k) = tz(k) * ((1. + zvir * qvz(k)) * (1. - q_cond))
1356 q_liq(k) = qlz(k) + qrz(k)
1357 q_sol(k) = qiz(k) + qsz(k) + qgz(k)
1358 q_cond = q_liq(k) + q_sol(k)
1359 con_r8 = one_r8 - (qvz(k) + q_cond)
1360 c8 = mhc(con_r8, qvz(k), q_liq(k), q_sol(k)) * c_air
1361 pt(i, k) = pt(i, k) + (tz(k) - pt(i, k)) * c8 / cp_air
1369 if (consv_checker)
then
1370 if (abs(sum(te_end_d(i, :)) + te_b_end_d(i) - sum(te_beg_d(i, :)) - te_b_beg_d(i)) / &
1371 (sum(te_beg_d(i, :)) + te_b_beg_d(i)) .gt. te_err)
then
1372 print*,
"GFDL-MP-DRY TE: ", &
1375 (sum(te_end_d(i, :)) + te_b_end_d(i) - sum(te_beg_d(i, :)) - te_b_beg_d(i)) / &
1376 (sum(te_beg_d(i, :)) + te_b_beg_d(i))
1378 if (abs(sum(tw_end_d(i, :)) + tw_b_end_d(i) - sum(tw_beg_d(i, :)) - tw_b_beg_d(i)) / &
1379 (sum(tw_beg_d(i, :)) + tw_b_beg_d(i)) .gt. tw_err)
then
1380 print*,
"GFDL-MP-DRY TW: ", &
1383 (sum(tw_end_d(i, :)) + tw_b_end_d(i) - sum(tw_beg_d(i, :)) - tw_b_beg_d(i)) / &
1384 (sum(tw_beg_d(i, :)) + tw_b_beg_d(i))
1387 if (abs(sum(te_end_m(i, :)) + te_b_end_m(i) - sum(te_beg_m(i, :)) - te_b_beg_m(i)) / &
1388 (sum(te_beg_m(i, :)) + te_b_beg_m(i)) .gt. te_err)
then
1389 print*,
"GFDL-MP-WET TE: ", &
1392 (sum(te_end_m(i, :)) + te_b_end_m(i) - sum(te_beg_m(i, :)) - te_b_beg_m(i)) / &
1393 (sum(te_beg_m(i, :)) + te_b_beg_m(i))
1395 if (abs(sum(tw_end_m(i, :)) + tw_b_end_m(i) - sum(tw_beg_m(i, :)) - tw_b_beg_m(i)) / &
1396 (sum(tw_beg_m(i, :)) + tw_b_beg_m(i)) .gt. tw_err)
then
1397 print*,
"GFDL-MP-WET TW: ", &
1400 (sum(tw_end_m(i, :)) + tw_b_end_m(i) - sum(tw_beg_m(i, :)) - tw_b_beg_m(i)) / &
1401 (sum(tw_beg_m(i, :)) + tw_b_beg_m(i))
1414subroutine neg_adj (ks, ke, tz, dp, qv, ql, qr, qi, qs, qg, cond)
1422 integer,
intent (in) :: ks, ke
1424 real(kind_phys),
intent (in),
dimension (ks:ke) :: dp
1426 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
1428 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
1430 real(kind_phys),
intent (out) :: cond
1438 real(kind_phys) :: dq, sink
1440 real(kind_phys),
dimension (ks:ke) :: q_liq, q_sol, lcpk, icpk, tcpk, tcp3
1442 real (kind = r8),
dimension (ks:ke) :: cvm, te8
1454 call cal_mhc_lhc (ks, ke, qv, ql, qr, qi, qs, qg, q_liq, q_sol, cvm, te8, tz, &
1455 lcpk, icpk, tcpk, tcp3)
1464 if (qi(k) .lt. 0.)
then
1465 sink = min(- qi(k), max(0., qs(k)))
1466 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
1467 0., 0., 0., sink, - sink, 0.)
1471 if (qs(k) .lt. 0.)
then
1472 sink = min(- qs(k), max(0., qg(k)))
1473 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
1474 0., 0., 0., 0., sink, - sink)
1478 if (qg(k) .lt. 0.)
then
1479 sink = min(- qg(k), max(0., qr(k)))
1480 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
1481 0., 0., - sink, 0., 0., sink, te8(k), cvm(k), tz(k), &
1482 lcpk(k), icpk(k), tcpk(k), tcp3(k))
1490 if (qr(k) .lt. 0.)
then
1491 sink = min(- qr(k), max(0., ql(k)))
1492 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
1493 0., - sink, sink, 0., 0., 0.)
1497 if (ql(k) .lt. 0.)
then
1498 sink = min(- ql(k), max(0., qv(k)))
1499 cond = cond + sink * dp(k)
1500 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
1501 - sink, sink, 0., 0., 0., 0., te8(k), cvm(k), tz(k), &
1502 lcpk(k), icpk(k), tcpk(k), tcp3(k))
1513 if (qv(k) .lt. 0.)
then
1514 qv(k + 1) = qv(k + 1) + qv(k) * dp(k) / dp(k + 1)
1520 if (qv(ke) .lt. 0. .and. qv(ke - 1) .gt. 0.)
then
1521 dq = min(- qv(ke) * dp(ke), qv(ke - 1) * dp(ke - 1))
1522 qv(ke - 1) = qv(ke - 1) - dq / dp(ke - 1)
1523 qv(ke) = qv(ke) + dq / dp(ke)
1526end subroutine neg_adj
1532subroutine mp_full (ks, ke, ntimes, tz, qv, ql, qr, qi, qs, qg, dp, dz, u, v, w, &
1533 den, denfac, ccn, cin, dts, rh_adj, rh_rain, h_var, dte, water, rain, ice, &
1534 snow, graupel, prefluxw, prefluxr, prefluxi, prefluxs, prefluxg, &
1535 condensation, deposition, evaporation, sublimation, convt, last_step)
1543 logical,
intent (in) :: last_step
1545 integer,
intent (in) :: ks, ke, ntimes
1547 real(kind_phys),
intent (in) :: dts, rh_adj, rh_rain, h_var, convt
1549 real(kind_phys),
intent (in),
dimension (ks:ke) :: dp, dz, den, denfac
1551 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, u, v, w, ccn, cin
1552 real(kind_phys),
intent (inout),
dimension (ks:ke) :: prefluxw, prefluxr, prefluxi, prefluxs, prefluxg
1554 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
1556 real(kind_phys),
intent (inout) :: water, rain, ice, snow, graupel
1557 real(kind_phys),
intent (inout) :: condensation, deposition
1558 real(kind_phys),
intent (inout) :: evaporation, sublimation
1560 real (kind = r8),
intent (inout) :: dte
1568 real(kind_phys) :: w1, r1, i1, s1, g1, cond, dep, reevap, sub
1570 real(kind_phys),
dimension (ks:ke) :: vtw, vtr, vti, vts, vtg, pfw, pfr, pfi, pfs, pfg
1578 call sedimentation (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, &
1579 dz, dp, vtw, vtr, vti, vts, vtg, w1, r1, i1, s1, g1, pfw, pfr, pfi, pfs, pfg, &
1580 u, v, w, den, denfac, dte)
1582 water = water + w1 * convt
1583 rain = rain + r1 * convt
1584 ice = ice + i1 * convt
1585 snow = snow + s1 * convt
1586 graupel = graupel + g1 * convt
1588 prefluxw = prefluxw + pfw * convt
1589 prefluxr = prefluxr + pfr * convt
1590 prefluxi = prefluxi + pfi * convt
1591 prefluxs = prefluxs + pfs * convt
1592 prefluxg = prefluxg + pfg * convt
1598 call warm_rain (dts, ks, ke, dp, dz, tz, qv, ql, qr, qi, qs, qg, &
1599 den, denfac, vtw, vtr, ccn, rh_rain, h_var, reevap)
1601 evaporation = evaporation + reevap * convt
1607 call ice_cloud (ks, ke, tz, qv, ql, qr, qi, qs, qg, den, &
1608 denfac, vtw, vtr, vti, vts, vtg, dts, h_var)
1610 if (do_subgrid_proc)
then
1616 call subgrid_z_proc (ks, ke, den, denfac, dts, rh_adj, tz, qv, ql, &
1617 qr, qi, qs, qg, dp, ccn, cin, cond, dep, reevap, sub, last_step)
1619 condensation = condensation + cond * convt
1620 deposition = deposition + dep * convt
1621 evaporation = evaporation + reevap * convt
1622 sublimation = sublimation + sub * convt
1628end subroutine mp_full
1634subroutine mp_fast (ks, ke, tz, qv, ql, qr, qi, qs, qg, dtm, dp, den, &
1635 ccn, cin, condensation, deposition, evaporation, sublimation, &
1636 denfac, convt, last_step)
1644 logical,
intent (in) :: last_step
1646 integer,
intent (in) :: ks, ke
1648 real(kind_phys),
intent (in) :: dtm, convt
1650 real(kind_phys),
intent (in),
dimension (ks:ke) :: dp, den, denfac
1652 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, ccn, cin
1654 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
1656 real(kind_phys),
intent (inout) :: condensation, deposition
1657 real(kind_phys),
intent (inout) :: evaporation, sublimation
1663 logical :: cond_evap
1667 real(kind_phys) :: cond, dep, reevap, sub
1669 real(kind_phys),
dimension (ks:ke) :: q_liq, q_sol, lcpk, icpk, tcpk, tcp3
1671 real (kind = r8),
dimension (ks:ke) :: cvm, te8
1686 call cal_mhc_lhc (ks, ke, qv, ql, qr, qi, qs, qg, q_liq, q_sol, cvm, te8, tz, &
1687 lcpk, icpk, tcpk, tcp3)
1689 if (.not. do_warm_rain_mp .and. fast_fr_mlt)
then
1695 call pimlt (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, cvm, te8, &
1696 lcpk, icpk, tcpk, tcp3)
1702 call pcomp (ks, ke, qv, ql, qr, qi, qs, qg, tz, cvm, te8, &
1703 lcpk, icpk, tcpk, tcp3)
1711 if (delay_cond_evap)
then
1712 cond_evap = last_step
1719 call pcond_pevap (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
1720 lcpk, icpk, tcpk, tcp3, cond, reevap)
1724 condensation = condensation + cond * convt
1725 evaporation = evaporation + reevap * convt
1727 if (.not. do_warm_rain_mp .and. fast_fr_mlt)
then
1733 call pifr (ks, ke, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, &
1734 lcpk, icpk, tcpk, tcp3)
1740 call pwbf (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, &
1741 lcpk, icpk, tcpk, tcp3)
1747 call pbigg (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, ccn, &
1748 lcpk, icpk, tcpk, tcp3)
1754 call pgfr_simp (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, cvm, te8, &
1755 lcpk, icpk, tcpk, tcp3)
1761 call psmlt_simp (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, cvm, te8, &
1762 lcpk, icpk, tcpk, tcp3)
1770 call praut_simp (ks, ke, dtm, tz, qv, ql, qr, qi, qs, qg)
1772 if (.not. do_warm_rain_mp .and. fast_dep_sub)
then
1778 call pidep_pisub (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
1779 lcpk, icpk, tcpk, tcp3, cin, dep, sub)
1781 deposition = deposition + dep * convt
1782 sublimation = sublimation + sub * convt
1788 call psaut_simp (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, den)
1794 call psdep_pssub (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
1795 denfac, lcpk, icpk, tcpk, tcp3, dep, sub)
1801 call pgdep_pgsub (ks, ke, dtm, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
1802 denfac, lcpk, icpk, tcpk, tcp3, dep, sub)
1806end subroutine mp_fast
1812subroutine sedimentation (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1813 vtw, vtr, vti, vts, vtg, w1, r1, i1, s1, g1, pfw, pfr, pfi, pfs, pfg, &
1814 u, v, w, den, denfac, dte)
1822 integer,
intent (in) :: ks, ke
1824 real(kind_phys),
intent (in) :: dts
1826 real(kind_phys),
intent (in),
dimension (ks:ke) :: dp, dz, den, denfac
1828 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, u, v, w
1830 real(kind_phys),
intent (out) :: w1, r1, i1, s1, g1
1832 real(kind_phys),
intent (out),
dimension (ks:ke) :: vtw, vtr, vti, vts, vtg, pfw, pfr, pfi, pfs, pfg
1834 real (kind = r8),
intent (inout) :: dte
1836 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
1844 real(kind_phys),
dimension (ks:ke) :: q_liq, q_sol, lcpk, icpk, tcpk, tcp3
1846 real (kind = r8),
dimension (ks:ke) :: te8, cvm
1870 call cal_mhc_lhc (ks, ke, qv, ql, qr, qi, qs, qg, q_liq, q_sol, cvm, te8, tz, &
1871 lcpk, icpk, tcpk, tcp3)
1877 if (do_psd_ice_fall)
then
1878 call term_rsg (ks, ke, qi, den, denfac, vi_fac, blini, mui, tvai, tvbi, vi_max, const_vi, vti)
1880 call term_ice (ks, ke, tz, qi, den, vi_fac, vi_max, const_vi, vti)
1883 if (do_sedi_melt)
then
1884 call sedi_melt (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1885 vti, r1, tau_imlt, icpk,
"qi")
1888 call terminal_fall (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1889 vti, i1, pfi, u, v, w, dte,
"qi")
1891 pfi(ks) = max(0.0, pfi(ks))
1892 do k = ke, ks + 1, -1
1893 pfi(k) = max(0.0, pfi(k) - pfi(k - 1))
1900 call term_rsg (ks, ke, qs, den, denfac, vs_fac, blins, mus, tvas, tvbs, vs_max, const_vs, vts)
1902 if (do_sedi_melt)
then
1903 call sedi_melt (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1904 vts, r1, tau_smlt, icpk,
"qs")
1907 call terminal_fall (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1908 vts, s1, pfs, u, v, w, dte,
"qs")
1910 pfs(ks) = max(0.0, pfs(ks))
1911 do k = ke, ks + 1, -1
1912 pfs(k) = max(0.0, pfs(k) - pfs(k - 1))
1920 call term_rsg (ks, ke, qg, den, denfac, vg_fac, blinh, muh, tvah, tvbh, vg_max, const_vg, vtg)
1922 call term_rsg (ks, ke, qg, den, denfac, vg_fac, bling, mug, tvag, tvbg, vg_max, const_vg, vtg)
1925 if (do_sedi_melt)
then
1926 call sedi_melt (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1927 vtg, r1, tau_gmlt, icpk,
"qg")
1930 call terminal_fall (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1931 vtg, g1, pfg, u, v, w, dte,
"qg")
1933 pfg(ks) = max(0.0, pfg(ks))
1934 do k = ke, ks + 1, -1
1935 pfg(k) = max(0.0, pfg(k) - pfg(k - 1))
1942 if (do_psd_water_fall)
then
1944 call term_rsg (ks, ke, ql, den, denfac, vw_fac, blinw, muw, tvaw, tvbw, vw_max, const_vw, vtw)
1946 call terminal_fall (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1947 vtw, w1, pfw, u, v, w, dte,
"ql")
1949 pfw(ks) = max(0.0, pfw(ks))
1950 do k = ke, ks + 1, -1
1951 pfw(k) = max(0.0, pfw(k) - pfw(k - 1))
1960 call term_rsg (ks, ke, qr, den, denfac, vr_fac, blinr, mur, tvar, tvbr, vr_max, const_vr, vtr)
1962 call terminal_fall (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
1963 vtr, r1, pfr, u, v, w, dte,
"qr")
1965 pfr(ks) = max(0.0, pfr(ks))
1966 do k = ke, ks + 1, -1
1967 pfr(k) = max(0.0, pfr(k) - pfr(k - 1))
1970end subroutine sedimentation
1976subroutine term_ice (ks, ke, tz, q, den, v_fac, v_max, const_v, vt)
1984 integer,
intent (in) :: ks, ke
1986 logical,
intent (in) :: const_v
1988 real(kind_phys),
intent (in) :: v_fac, v_max
1990 real(kind_phys),
intent (in),
dimension (ks:ke) :: q, den
1992 real (kind = r8),
intent (in),
dimension (ks:ke) :: tz
1994 real(kind_phys),
intent (out),
dimension (ks:ke) :: vt
2002 real(kind_phys) :: qden
2004 real(kind_phys),
parameter :: aa = - 4.14122e-5
2005 real(kind_phys),
parameter :: bb = - 0.00538922
2006 real(kind_phys),
parameter :: cc = - 0.0516344
2007 real(kind_phys),
parameter :: dd = 0.00216078
2008 real(kind_phys),
parameter :: ee = 1.9714
2010 real(kind_phys),
dimension (ks:ke) :: tc
2016 qden = q(k) * den(k)
2017 if (q(k) .lt. qfmin)
then
2020 tc(k) = tz(k) - tice
2021 if (ifflag .eq. 1)
then
2022 vt(k) = (3. + log10(qden)) * (tc(k) * (aa * tc(k) + bb) + cc) + &
2024 vt(k) = 0.01 * v_fac * exp(vt(k) * log(10.))
2026 if (ifflag .eq. 2) &
2027 vt(k) = v_fac * 3.29 * exp(0.16 * log(qden))
2028 vt(k) = min(v_max, max(0.0, vt(k)))
2033end subroutine term_ice
2039subroutine term_rsg (ks, ke, q, den, denfac, v_fac, blin, mu, tva, tvb, v_max, const_v, vt)
2047 integer,
intent (in) :: ks, ke
2049 logical,
intent (in) :: const_v
2051 real(kind_phys),
intent (in) :: v_fac, blin, v_max, mu
2053 real (kind = r8),
intent (in) :: tva, tvb
2055 real(kind_phys),
intent (in),
dimension (ks:ke) :: q, den, denfac
2057 real(kind_phys),
intent (out),
dimension (ks:ke) :: vt
2069 if (q(k) .lt. qfmin)
then
2072 call cal_pc_ed_oe_rr_tv (q(k), den(k), blin, mu, &
2073 tva = tva, tvb = tvb, tv = vt(k))
2074 vt(k) = v_fac * vt(k) * denfac(k)
2075 vt(k) = min(v_max, max(0.0, vt(k)))
2080end subroutine term_rsg
2086subroutine sedi_melt (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
2087 vt, r1, tau_mlt, icpk, qflag)
2095 integer,
intent (in) :: ks, ke
2097 real(kind_phys),
intent (in) :: dts, tau_mlt
2099 real(kind_phys),
intent (in),
dimension (ks:ke) :: vt, dp, dz, icpk
2101 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
2103 real(kind_phys),
intent (inout) :: r1
2105 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
2107 character (len = 2),
intent (in) :: qflag
2115 real(kind_phys) :: dtime, sink, zs
2117 real(kind_phys),
dimension (ks:ke) :: q
2119 real(kind_phys),
dimension (ks:ke + 1) :: ze, zt
2121 real (kind = r8),
dimension (ks:ke) :: cvm
2123 call zezt (ks, ke, dts, zs, dz, vt, ze, zt)
2133 print *,
"gfdl_mp: qflag error!"
2140 do k = ke - 1, ks, - 1
2141 if (vt(k) .lt. 1.e-10) cycle
2142 if (q(k) .gt. qcmin)
then
2144 if (zt(k + 1) .ge. ze(m))
exit
2145 if (zt(k) .lt. ze(m + 1) .and. tz(m) .gt. tice)
then
2146 cvm(k) = mhc(qv(k), ql(k), qr(k), qi(k), qs(k), qg(k))
2147 cvm(m) = mhc(qv(m), ql(m), qr(m), qi(m), qs(m), qg(m))
2148 dtime = min(dts, (ze(m) - ze(m + 1)) / vt(k))
2149 dtime = min(1.0, dtime / tau_mlt)
2150 sink = min(q(k) * dp(k) / dp(m), dtime * (tz(m) - tice) / icpk(m))
2151 q(k) = q(k) - sink * dp(m) / dp(k)
2152 if (zt(k) .lt. zs)
then
2153 r1 = r1 + sink * dp(m)
2155 qr(m) = qr(m) + sink
2165 print *,
"gfdl_mp: qflag error!"
2167 tz(k) = (tz(k) * cvm(k) - li00 * sink * dp(m) / dp(k)) / &
2168 mhc(qv(k), ql(k), qr(k), qi(k), qs(k), qg(k))
2169 tz(m) = (tz(m) * cvm(m)) / &
2170 mhc(qv(m), ql(m), qr(m), qi(m), qs(m), qg(m))
2172 if (q(k) .lt. qcmin)
exit
2177end subroutine sedi_melt
2183subroutine terminal_fall (dts, ks, ke, tz, qv, ql, qr, qi, qs, qg, dz, dp, &
2184 vt, x1, m1, u, v, w, dte, qflag)
2192 integer,
intent (in) :: ks, ke
2194 real(kind_phys),
intent (in) :: dts
2196 real(kind_phys),
intent (in),
dimension (ks:ke) :: vt, dp, dz
2198 character (len = 2),
intent (in) :: qflag
2200 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, u, v, w
2202 real(kind_phys),
intent (inout) :: x1
2204 real (kind = r8),
intent (inout) :: dte
2206 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
2208 real(kind_phys),
intent (out),
dimension (ks:ke) :: m1
2218 real(kind_phys) :: zs
2220 real(kind_phys),
dimension (ks:ke) :: dm, q
2222 real(kind_phys),
dimension (ks:ke + 1) :: ze, zt
2224 real (kind = r8),
dimension (ks:ke) :: te1, te2
2228 call zezt (ks, ke, dts, zs, dz, vt, ze, zt)
2242 print *,
"gfdl_mp: qflag error!"
2245 call check_column (ks, ke, q, no_fall)
2255 dm(k) = dp(k) * (1. + qv(k) + ql(k) + qr(k) + qi(k) + qs(k) + qg(k))
2264 te1(k) = mte(qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), tz(k), dp(k), .false.)
2283 print *,
"gfdl_mp: qflag error!"
2286 if (sedflag .eq. 1) &
2287 call implicit_fall (dts, ks, ke, ze, vt, dp, q, x1, m1)
2288 if (sedflag .eq. 2) &
2289 call explicit_fall (dts, ks, ke, ze, vt, dp, q, x1, m1)
2290 if (sedflag .eq. 3) &
2291 call lagrangian_fall (ks, ke, zs, ze, zt, dp, q, x1, m1)
2292 if (sedflag .eq. 4) &
2293 call implicit_lagrangian_fall (dts, ks, ke, zs, ze, zt, vt, dp, q, &
2308 print *,
"gfdl_mp: qflag error!"
2316 te2(k) = mte(qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), tz(k), dp(k), .false.)
2318 dte = dte + sum(te1) - sum(te2)
2324 if (do_sedi_uv)
then
2325 call sedi_uv (ks, ke, m1, dp, u, v)
2329 call sedi_w (ks, ke, m1, w, vt, dm)
2337 te1(k) = mte(qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), tz(k), dp(k), .false.)
2344 if (do_sedi_heat)
then
2345 call sedi_heat (ks, ke, dp, m1, dz, tz, qv, ql, qr, qi, qs, qg, c_ice)
2353 te2(k) = mte(qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), tz(k), dp(k), .false.)
2355 dte = dte + sum(te1) - sum(te2)
2357end subroutine terminal_fall
2363subroutine zezt (ks, ke, dts, zs, dz, vt, ze, zt)
2371 integer,
intent (in) :: ks, ke
2373 real(kind_phys),
intent (in) :: dts
2375 real(kind_phys),
intent (in),
dimension (ks:ke) :: dz, vt
2377 real(kind_phys),
intent (out) :: zs
2379 real(kind_phys),
intent (out),
dimension (ks:ke + 1) :: ze, zt
2387 real(kind_phys) :: dt5
2393 ze(k) = ze(k + 1) - dz(k)
2397 zt(k) = ze(k) - dt5 * (vt(k - 1) + vt(k))
2399 zt(ke + 1) = zs - dts * vt(ke)
2401 if (zt(k + 1) .ge. zt(k)) zt(k + 1) = zt(k) - dz_min
2410subroutine check_column (ks, ke, q, no_fall)
2418 integer,
intent (in) :: ks, ke
2420 real(kind_phys),
intent (in) :: q (ks:ke)
2422 logical,
intent (out) :: no_fall
2433 if (q(k) .gt. qfmin)
then
2439end subroutine check_column
2445subroutine warm_rain (dts, ks, ke, dp, dz, tz, qv, ql, qr, qi, qs, qg, &
2446 den, denfac, vtw, vtr, ccn, rh_rain, h_var, reevap)
2454 integer,
intent (in) :: ks, ke
2456 real(kind_phys),
intent (in) :: dts, rh_rain, h_var
2458 real(kind_phys),
intent (in),
dimension (ks:ke) :: dp, dz, den, denfac, vtw, vtr
2460 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, ccn
2462 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
2464 real(kind_phys),
intent (out) :: reevap
2476 call prevp (ks, ke, dts, tz, qv, ql, qr, qi, qs, qg, den, denfac, rh_rain, h_var, dp, reevap)
2482 call pracw (ks, ke, dts, tz, qv, ql, qr, qi, qs, qg, den, denfac, vtw, vtr)
2488 call praut (ks, ke, dts, tz, qv, ql, qr, qi, qs, qg, den, ccn, h_var)
2490end subroutine warm_rain
2496subroutine prevp (ks, ke, dts, tz, qv, ql, qr, qi, qs, qg, den, denfac, rh_rain, h_var, dp, reevap)
2504 integer,
intent (in) :: ks, ke
2506 real(kind_phys),
intent (in) :: dts, rh_rain, h_var
2508 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, dp
2510 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
2512 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, qr, ql, qi, qs, qg
2514 real(kind_phys),
intent (out) :: reevap
2522 real(kind_phys) :: dqv, qsat, dqdt, tmp, t2, qden, q_plus, q_minus, sink
2523 real(kind_phys) :: qpz, dq, dqh, tin, fac_revp, rh_tem
2525 real(kind_phys),
dimension (ks:ke) :: q_liq, q_sol, lcpk, icpk, tcpk, tcp3
2527 real (kind = r8),
dimension (ks:ke) :: cvm, te8
2540 if (tau_revp .gt. 1.e-6)
then
2541 fac_revp = 1. - exp(- dts / tau_revp)
2548 call cal_mhc_lhc (ks, ke, qv, ql, qr, qi, qs, qg, q_liq, q_sol, cvm, te8, tz, &
2549 lcpk, icpk, tcpk, tcp3)
2553 tin = (tz(k) * cvm(k) - lv00 * ql(k)) / mhc(qv(k) + ql(k), qr(k), q_sol(k))
2560 qsat =
wqs(tin, den(k), dqdt)
2563 dqh = max(ql(k), h_var * max(qpz, qcmin))
2564 dqh = min(dqh, 0.2 * qpz)
2574 if (tz(k) .gt. t_wfr .and. qr(k) .gt. qcmin .and. dqv .gt. 0.0 .and. qsat .gt. q_minus)
then
2576 if (qsat .gt. q_plus)
then
2579 dq = 0.25 * (qsat - q_minus) ** 2 / dqh
2581 qden = qr(k) * den(k)
2583 sink = psub(t2, dq, qden, qsat, crevp, den(k), denfac(k), blinr, mur, lcpk(k), cvm(k))
2584 sink = min(qr(k), dts * fac_revp * sink, dqv / (1. + lcpk(k) * dqdt))
2585 if (use_rhc_revap .and. rh_tem .ge. rhc_revap)
then
2595 reevap = reevap + sink * dp(k)
2597 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
2598 sink, 0., - sink, 0., 0., 0., te8(k), cvm(k), tz(k), &
2599 lcpk(k), icpk(k), tcpk(k), tcp3(k))
2611subroutine pracw (ks, ke, dts, tz, qv, ql, qr, qi, qs, qg, den, denfac, vtw, vtr)
2619 integer,
intent (in) :: ks, ke
2621 real(kind_phys),
intent (in) :: dts
2623 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, vtw, vtr
2625 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
2627 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, qr, ql, qi, qs, qg
2635 real(kind_phys) :: qden, sink
2639 if (tz(k) .gt. t_wfr .and. qr(k) .gt. qcmin .and. ql(k) .gt. qcmin)
then
2641 qden = qr(k) * den(k)
2642 if (do_new_acc_water)
then
2643 sink = dts * acr3d(vtr(k), vtw(k), ql(k), qr(k), cracw, acco(:, 5), &
2644 acc(9), acc(10), den(k))
2646 sink = dts * acr2d(qden, cracw, denfac(k), blinr, mur)
2647 sink = sink / (1. + sink) * ql(k)
2650 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
2651 0., - sink, sink, 0., 0., 0.)
2663subroutine praut (ks, ke, dts, tz, qv, ql, qr, qi, qs, qg, den, ccn, h_var)
2671 integer,
intent (in) :: ks, ke
2673 real(kind_phys),
intent (in) :: dts, h_var
2675 real(kind_phys),
intent (in),
dimension (ks:ke) :: den
2677 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, ccn
2679 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
2685 real(kind_phys),
parameter :: so3 = 7.0 / 3.0
2686 real(kind_phys),
parameter :: so1 = - 1.0 / 3.0
2690 real(kind_phys) :: sink, dq, qc
2692 real(kind_phys),
dimension (ks:ke) :: dl, c_praut
2694 if (irain_f .eq. 0)
then
2696 call linear_prof (ke - ks + 1, ql(ks), dl(ks), z_slope_liq, h_var)
2700 if (tz(k) .gt. t_wfr .and. ql(k) .gt. qcmin)
then
2702 if (do_psd_water_num)
then
2703 call cal_pc_ed_oe_rr_tv (ql(k), den(k), blinw, muw, &
2704 pca = pcaw, pcb = pcbw, pc = ccn(k))
2705 ccn(k) = ccn(k) / den(k)
2708 qc = fac_rc * ccn(k)
2709 dl(k) = min(max(qcmin, dl(k)), 0.5 * ql(k))
2710 dq = 0.5 * (ql(k) + dl(k) - qc)
2712 if (dq .gt. 0.)
then
2714 c_praut(k) = cpaut * exp(so1 * log(ccn(k) * rhow))
2715 sink = min(1., dq / dl(k)) * dts * c_praut(k) * den(k) * &
2716 exp(so3 * log(ql(k)))
2717 sink = min(ql(k), sink)
2719 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
2720 0., - sink, sink, 0., 0., 0.)
2730 if (irain_f .eq. 1)
then
2734 if (tz(k) .gt. t_wfr .and. ql(k) .gt. qcmin)
then
2736 if (do_psd_water_num)
then
2737 call cal_pc_ed_oe_rr_tv (ql(k), den(k), blinw, muw, &
2738 pca = pcaw, pcb = pcbw, pc = ccn(k))
2739 ccn(k) = ccn(k) / den(k)
2742 qc = fac_rc * ccn(k)
2745 if (dq .gt. 0.)
then
2747 c_praut(k) = cpaut * exp(so1 * log(ccn(k) * rhow))
2748 sink = min(dq, dts * c_praut(k) * den(k) * exp(so3 * log(ql(k))))
2749 sink = min(ql(k), sink)
2751 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
2752 0., - sink, sink, 0., 0., 0.)
2768subroutine ice_cloud (ks, ke, tz, qv, ql, qr, qi, qs, qg, den, &
2769 denfac, vtw, vtr, vti, vts, vtg, dts, h_var)
2777 integer,
intent (in) :: ks, ke
2779 real(kind_phys),
intent (in) :: dts, h_var
2781 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, vtw, vtr, vti, vts, vtg
2783 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
2785 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
2791 real(kind_phys),
dimension (ks:ke) :: di, q_liq, q_sol, lcpk, icpk, tcpk, tcp3
2793 real (kind = r8),
dimension (ks:ke) :: cvm, te8
2799 call cal_mhc_lhc (ks, ke, qv, ql, qr, qi, qs, qg, q_liq, q_sol, cvm, te8, tz, &
2800 lcpk, icpk, tcpk, tcp3)
2802 if (.not. do_warm_rain_mp)
then
2808 call pimlt (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, lcpk, icpk, tcpk, tcp3)
2814 call pifr (ks, ke, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, lcpk, icpk, tcpk, tcp3)
2820 call linear_prof (ke - ks + 1, qi, di, z_slope_ice, h_var)
2826 call psmlt (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, denfac, &
2827 vtw, vtr, vts, lcpk, icpk, tcpk, tcp3)
2833 call pgmlt (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, denfac, &
2834 vtw, vtr, vtg, lcpk, icpk, tcpk, tcp3)
2840 call psaci (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den, denfac, vti, vts)
2846 call psaut (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den, di)
2852 call pgaci (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den, denfac, vti, vtg)
2858 call psacr_pgfr (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, denfac, &
2859 vtr, vts, lcpk, icpk, tcpk, tcp3)
2865 call pgacs (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den, vts, vtg)
2871 call pgaut (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den)
2877 call pgacw_pgacr (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, denfac, &
2878 vtr, vtg, lcpk, icpk, tcpk, tcp3)
2882end subroutine ice_cloud
2888subroutine pimlt (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, lcpk, icpk, tcpk, tcp3)
2896 integer,
intent (in) :: ks, ke
2898 real(kind_phys),
intent (in) :: dts
2900 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
2902 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
2903 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
2905 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
2913 real(kind_phys) :: tc, tmp, sink, fac_imlt
2915 fac_imlt = 1. - exp(- dts / tau_imlt)
2919 tc = tz(k) - tice_mlt
2921 if (tc .gt. 0 .and. qi(k) .gt. qcmin)
then
2923 sink = fac_imlt * tc / icpk(k)
2924 sink = min(qi(k), sink)
2925 tmp = min(sink, dim(ql_mlt, ql(k)))
2927 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
2928 0., tmp, sink - tmp, - sink, 0., 0., te8(k), cvm(k), tz(k), &
2929 lcpk(k), icpk(k), tcpk(k), tcp3(k))
2941subroutine pifr (ks, ke, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, lcpk, icpk, tcpk, tcp3)
2949 integer,
intent (in) :: ks, ke
2951 real(kind_phys),
intent (in),
dimension (ks:ke) :: den
2953 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
2955 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
2956 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
2958 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
2966 real(kind_phys) :: tc, tmp, sink, qim
2972 if (tc .gt. 0. .and. ql(k) .gt. qcmin)
then
2974 sink = ql(k) * tc / dt_fr
2975 sink = min(ql(k), sink, tc / icpk(k))
2976 qim = qi0_crt / den(k)
2977 tmp = min(sink, dim(qim, qi(k)))
2979 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
2980 0., - sink, 0., tmp, sink - tmp, 0., te8(k), cvm(k), tz(k), &
2981 lcpk(k), icpk(k), tcpk(k), tcp3(k))
2994subroutine psmlt (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, denfac, &
2995 vtw, vtr, vts, lcpk, icpk, tcpk, tcp3)
3003 integer,
intent (in) :: ks, ke
3005 real(kind_phys),
intent (in) :: dts
3007 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, vtw, vtr, vts
3009 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
3011 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3012 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
3014 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
3022 real(kind_phys) :: tc, factor, tmp, sink, qden, dqdt, tin, dq, qsi
3023 real(kind_phys) :: psacw, psacr, pracs
3029 if (tc .ge. 0. .and. qs(k) .gt. qcmin)
then
3032 qden = qs(k) * den(k)
3033 if (ql(k) .gt. qcmin)
then
3034 if (do_new_acc_water)
then
3035 psacw = acr3d(vts(k), vtw(k), ql(k), qs(k), csacw, acco(:, 7), &
3036 acc(13), acc(14), den(k))
3038 factor = acr2d(qden, csacw, denfac(k), blins, mus)
3039 psacw = factor / (1. + dts * factor) * ql(k)
3045 if (qr(k) .gt. qcmin)
then
3046 psacr = min(acr3d(vts(k), vtr(k), qr(k), qs(k), csacr, acco(:, 2), &
3047 acc(3), acc(4), den(k)), qr(k) / dts)
3048 pracs = acr3d(vtr(k), vts(k), qs(k), qr(k), cracs, acco(:, 1), &
3049 acc(1), acc(2), den(k))
3053 qsi = iqs(tin, den(k), dqdt)
3055 sink = max(0., pmlt(tc, dq, qden, psacw, psacr, csmlt, den(k), denfac(k), blins, mus, &
3056 lcpk(k), icpk(k), cvm(k)))
3058 sink = min(qs(k), (sink + pracs) * dts, tc / icpk(k))
3059 tmp = min(sink, dim(qs_mlt, ql(k)))
3061 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3062 0., tmp, sink - tmp, 0., - sink, 0., te8(k), cvm(k), tz(k), &
3063 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3076subroutine pgmlt (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, denfac, &
3077 vtw, vtr, vtg, lcpk, icpk, tcpk, tcp3)
3085 integer,
intent (in) :: ks, ke
3087 real(kind_phys),
intent (in) :: dts
3089 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, vtw, vtr, vtg
3091 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
3093 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3094 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
3096 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
3104 real(kind_phys) :: tc, factor, sink, qden, dqdt, tin, dq, qsi
3105 real(kind_phys) :: pgacw, pgacr
3111 if (tc .ge. 0. .and. qg(k) .gt. qcmin)
then
3114 qden = qg(k) * den(k)
3115 if (ql(k) .gt. qcmin)
then
3116 if (do_new_acc_water)
then
3117 pgacw = acr3d(vtg(k), vtw(k), ql(k), qg(k), cgacw, acco(:, 9), &
3118 acc(17), acc(18), den(k))
3121 factor = acr2d(qden, cgacw, denfac(k), blinh, muh)
3123 factor = acr2d(qden, cgacw, denfac(k), bling, mug)
3125 pgacw = factor / (1. + dts * factor) * ql(k)
3130 if (qr(k) .gt. qcmin)
then
3131 pgacr = min(acr3d(vtg(k), vtr(k), qr(k), qg(k), cgacr, acco(:, 3), &
3132 acc(5), acc(6), den(k)), qr(k) / dts)
3136 qsi = iqs(tin, den(k), dqdt)
3139 sink = max(0., pmlt(tc, dq, qden, pgacw, pgacr, cgmlt, den(k), denfac(k), &
3140 blinh, muh, lcpk(k), icpk(k), cvm(k)))
3142 sink = max(0., pmlt(tc, dq, qden, pgacw, pgacr, cgmlt, den(k), denfac(k), &
3143 bling, mug, lcpk(k), icpk(k), cvm(k)))
3146 sink = min(qg(k), sink * dts, tc / icpk(k))
3148 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3149 0., 0., sink, 0., 0., - sink, te8(k), cvm(k), tz(k), &
3150 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3162subroutine psaci (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den, denfac, vti, vts)
3170 integer,
intent (in) :: ks, ke
3172 real(kind_phys),
intent (in) :: dts
3174 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, vti, vts
3176 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3178 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
3186 real(kind_phys) :: tc, factor, sink, qden
3192 if (tc .lt. 0. .and. qi(k) .gt. qcmin)
then
3195 qden = qs(k) * den(k)
3196 if (qs(k) .gt. qcmin)
then
3197 if (do_new_acc_ice)
then
3198 sink = dts * acr3d(vts(k), vti(k), qi(k), qs(k), csaci, acco(:, 8), &
3199 acc(15), acc(16), den(k))
3201 factor = dts * acr2d(qden, csaci, denfac(k), blins, mus)
3202 sink = factor / (1. + factor) * qi(k)
3206 sink = min(fi2s_fac * qi(k), sink)
3208 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3209 0., 0., 0., - sink, sink, 0.)
3221subroutine psaut (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den, di)
3229 integer,
intent (in) :: ks, ke
3231 real(kind_phys),
intent (in) :: dts
3233 real(kind_phys),
intent (in),
dimension (ks:ke) :: den
3235 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, di
3237 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
3245 real(kind_phys) :: tc, sink, fac_i2s, q_plus, qim, dq, tmp
3247 fac_i2s = 1. - exp(- dts / tau_i2s)
3253 if (tc .lt. 0. .and. qi(k) .gt. qcmin)
then
3256 tmp = fac_i2s * exp(0.025 * tc)
3257 di(k) = max(di(k), qcmin)
3258 q_plus = qi(k) + di(k)
3259 qim = qi0_crt / den(k)
3260 if (q_plus .gt. (qim + qcmin))
then
3261 if (qim .gt. (qi(k) - di(k)))
then
3262 dq = (0.25 * (q_plus - qim) ** 2) / di(k)
3269 sink = min(fi2s_fac * qi(k), sink)
3271 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3272 0., 0., 0., - sink, sink, 0.)
3284subroutine pgaci (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den, denfac, vti, vtg)
3292 integer,
intent (in) :: ks, ke
3294 real(kind_phys),
intent (in) :: dts
3296 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, vti, vtg
3298 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3300 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
3308 real(kind_phys) :: tc, factor, sink, qden
3314 if (tc .lt. 0. .and. qi(k) .gt. qcmin)
then
3317 qden = qg(k) * den(k)
3318 if (qg(k) .gt. qcmin)
then
3319 if (do_new_acc_ice)
then
3320 sink = dts * acr3d(vtg(k), vti(k), qi(k), qg(k), cgaci, acco(:, 10), &
3321 acc(19), acc(20), den(k))
3324 factor = dts * acr2d(qden, cgaci, denfac(k), blinh, muh)
3326 factor = dts * acr2d(qden, cgaci, denfac(k), bling, mug)
3328 sink = factor / (1. + factor) * qi(k)
3332 sink = min(fi2g_fac * qi(k), sink)
3334 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3335 0., 0., 0., - sink, 0., sink)
3347subroutine psacr_pgfr (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, denfac, &
3348 vtr, vts, lcpk, icpk, tcpk, tcp3)
3356 integer,
intent (in) :: ks, ke
3358 real(kind_phys),
intent (in) :: dts
3360 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, vtr, vts
3362 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
3364 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3365 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
3367 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
3375 real(kind_phys) :: tc, factor, sink
3376 real(kind_phys) :: psacr, pgfr
3382 if (tc .lt. 0. .and. qr(k) .gt. qcmin)
then
3385 if (qs(k) .gt. qcmin)
then
3386 psacr = dts * acr3d(vts(k), vtr(k), qr(k), qs(k), csacr, acco(:, 2), &
3387 acc(3), acc(4), den(k))
3390 pgfr = dts * cgfr(1) / den(k) * (exp(- cgfr(2) * tc) - 1.) * &
3391 exp((6 + mur) / (mur + 3) * log(6 * qr(k) * den(k)))
3394 factor = min(sink, qr(k), - tc / icpk(k)) / max(sink, qcmin)
3395 psacr = factor * psacr
3396 pgfr = factor * pgfr
3398 sink = min(qr(k), psacr + pgfr)
3400 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3401 0., 0., - sink, 0., psacr, pgfr, te8(k), cvm(k), tz(k), &
3402 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3408end subroutine psacr_pgfr
3414subroutine pgacs (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den, vts, vtg)
3422 integer,
intent (in) :: ks, ke
3424 real(kind_phys),
intent (in) :: dts
3426 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, vts, vtg
3428 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3430 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
3438 real(kind_phys) :: sink
3442 if (tz(k) .lt. tice .and. qs(k) .gt. qcmin .and. qg(k) .gt. qcmin)
then
3444 sink = dts * acr3d(vtg(k), vts(k), qs(k), qg(k), cgacs, acco(:, 4), &
3445 acc(7), acc(8), den(k))
3446 sink = min(fs2g_fac * qs(k), sink)
3448 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3449 0., 0., 0., 0., - sink, sink)
3461subroutine pgaut (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den)
3469 integer,
intent (in) :: ks, ke
3471 real(kind_phys),
intent (in) :: dts
3473 real(kind_phys),
intent (in),
dimension (ks:ke) :: den
3475 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3477 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
3485 real(kind_phys) :: tc, factor, sink, qsm
3491 if (tc .lt. 0. .and. qs(k) .gt. qcmin)
then
3494 qsm = qs0_crt / den(k)
3495 if (qs(k) .gt. qsm)
then
3496 factor = dts * 1.e-3 * exp(0.09 * (tz(k) - tice))
3497 sink = factor / (1. + factor) * (qs(k) - qsm)
3500 sink = min(fs2g_fac * qs(k), sink)
3502 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3503 0., 0., 0., 0., - sink, sink)
3515subroutine pgacw_pgacr (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, denfac, &
3516 vtr, vtg, lcpk, icpk, tcpk, tcp3)
3524 integer,
intent (in) :: ks, ke
3526 real(kind_phys),
intent (in) :: dts
3528 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, vtr, vtg
3530 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
3532 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3533 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
3535 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
3543 real(kind_phys) :: tc, factor, sink, qden
3544 real(kind_phys) :: pgacw, pgacr
3550 if (tc .lt. 0. .and. qg(k) .gt. qcmin)
then
3553 if (ql(k) .gt. qcmin)
then
3554 qden = qg(k) * den(k)
3556 factor = dts * acr2d(qden, cgacw, denfac(k), blinh, muh)
3558 factor = dts * acr2d(qden, cgacw, denfac(k), bling, mug)
3560 pgacw = factor / (1. + factor) * ql(k)
3564 if (qr(k) .gt. qcmin)
then
3565 pgacr = min(dts * acr3d(vtg(k), vtr(k), qr(k), qg(k), cgacr, acco(:, 3), &
3566 acc(5), acc(6), den(k)), qr(k))
3569 sink = pgacr + pgacw
3570 factor = min(sink, dim(tice, tz(k)) / icpk(k)) / max(sink, qcmin)
3571 pgacr = factor * pgacr
3572 pgacw = factor * pgacw
3574 sink = pgacr + pgacw
3576 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3577 0., - pgacw, - pgacr, 0., 0., sink, te8(k), cvm(k), tz(k), &
3578 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3584end subroutine pgacw_pgacr
3590subroutine subgrid_z_proc (ks, ke, den, denfac, dts, rh_adj, tz, qv, ql, qr, &
3591 qi, qs, qg, dp, ccn, cin, cond, dep, reevap, sub, last_step)
3599 logical,
intent (in) :: last_step
3601 integer,
intent (in) :: ks, ke
3603 real(kind_phys),
intent (in) :: dts, rh_adj
3605 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, denfac, dp
3607 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, ccn, cin
3609 real(kind_phys),
intent (out) :: cond, dep, reevap, sub
3611 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
3617 logical :: cond_evap
3621 real(kind_phys),
dimension (ks:ke) :: q_liq, q_sol, q_cond, lcpk, icpk, tcpk, tcp3
3623 real (kind = r8),
dimension (ks:ke) :: cvm, te8
3638 call cal_mhc_lhc (ks, ke, qv, ql, qr, qi, qs, qg, q_liq, q_sol, cvm, te8, tz, &
3639 lcpk, icpk, tcpk, tcp3)
3645 if (.not. do_warm_rain_mp)
then
3647 call pinst (ks, ke, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
3648 lcpk, icpk, tcpk, tcp3, rh_adj, dep, sub, reevap)
3656 if (delay_cond_evap)
then
3657 cond_evap = last_step
3664 call pcond_pevap (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
3665 lcpk, icpk, tcpk, tcp3, cond, reevap)
3669 if (.not. do_warm_rain_mp)
then
3675 call pcomp (ks, ke, qv, ql, qr, qi, qs, qg, tz, cvm, te8, lcpk, icpk, tcpk, tcp3)
3681 call pwbf (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, lcpk, icpk, tcpk, tcp3)
3687 call pbigg (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, ccn, lcpk, icpk, tcpk, tcp3)
3693 call pidep_pisub (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
3694 lcpk, icpk, tcpk, tcp3, cin, dep, sub)
3700 call psdep_pssub (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
3701 denfac, lcpk, icpk, tcpk, tcp3, dep, sub)
3707 call pgdep_pgsub (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
3708 denfac, lcpk, icpk, tcpk, tcp3, dep, sub)
3712end subroutine subgrid_z_proc
3718subroutine pinst (ks, ke, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
3719 lcpk, icpk, tcpk, tcp3, rh_adj, dep, sub, reevap)
3727 integer,
intent (in) :: ks, ke
3729 real(kind_phys),
intent (in) :: rh_adj
3731 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, dp
3733 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
3735 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3736 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
3738 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
3740 real(kind_phys),
intent (out) :: dep, reevap, sub
3748 real(kind_phys) :: sink, tin, qpz, rh, dqdt, tmp, qsi
3756 if (tz(k) .lt. t_min)
then
3758 sink = dim(qv(k), qcmin)
3759 dep = dep + sink * dp(k)
3761 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3762 - sink, 0., 0., sink, 0., 0., te8(k), cvm(k), tz(k), &
3763 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3771 qpz = qv(k) + ql(k) + qi(k)
3772 tin = (te8(k) - lv00 * qpz + li00 * (qs(k) + qg(k))) / &
3773 mhc(qpz, qr(k), qs(k) + qg(k))
3775 if (tin .gt. t_sub + 6.)
then
3777 qsi = iqs(tin, den(k), dqdt)
3779 if (rh .lt. rh_adj)
then
3784 reevap = reevap + sink * dp(k)
3785 sub = sub + tmp * dp(k)
3787 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3788 sink + tmp, - sink, 0., - tmp, 0., 0., te8(k), cvm(k), tz(k), &
3789 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3803subroutine pcond_pevap (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
3804 lcpk, icpk, tcpk, tcp3, cond, reevap)
3812 integer,
intent (in) :: ks, ke
3814 real(kind_phys),
intent (in) :: dts
3816 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, dp
3818 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
3820 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3821 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
3823 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
3825 real(kind_phys),
intent (out) :: cond, reevap
3833 real(kind_phys) :: sink, tin, qpz, dqdt, qsw, rh_tem, dq, factor, fac_l2v, fac_v2l
3835 fac_l2v = 1. - exp(- dts / tau_l2v)
3836 fac_v2l = 1. - exp(- dts / tau_v2l)
3841 qsw =
wqs(tin, den(k), dqdt)
3842 qpz = qv(k) + ql(k) + qi(k)
3845 if (dq .gt. 0.)
then
3846 if (do_evap_timescale)
then
3847 factor = min(1., fac_l2v * (rh_fac_evap * dq / qsw))
3851 sink = min(ql(k), factor * dq / (1. + tcp3(k) * dqdt))
3852 if (use_rhc_cevap .and. rh_tem .ge. rhc_cevap)
then
3855 reevap = reevap + sink * dp(k)
3857 if (do_cond_timescale)
then
3858 factor = min(1., fac_v2l * (rh_fac_cond * (- dq) / qsw))
3862 sink = - min(qv(k), factor * (- dq) / (1. + tcp3(k) * dqdt))
3863 cond = cond - sink * dp(k)
3866 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3867 sink, - sink, 0., 0., 0., 0., te8(k), cvm(k), tz(k), &
3868 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3872end subroutine pcond_pevap
3878subroutine pcomp (ks, ke, qv, ql, qr, qi, qs, qg, tz, cvm, te8, lcpk, icpk, tcpk, tcp3)
3886 integer,
intent (in) :: ks, ke
3888 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
3890 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3891 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
3893 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
3901 real(kind_phys) :: tc, sink
3907 if (tc .gt. 0. .and. ql(k) .gt. qcmin)
then
3909 sink = ql(k) * tc / dt_fr
3910 sink = min(ql(k), sink, tc / icpk(k))
3912 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3913 0., - sink, 0., sink, 0., 0., te8(k), cvm(k), tz(k), &
3914 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3926subroutine pwbf (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, lcpk, icpk, tcpk, tcp3)
3934 integer,
intent (in) :: ks, ke
3936 real(kind_phys),
intent (in) :: dts
3938 real(kind_phys),
intent (in),
dimension (ks:ke) :: den
3940 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
3942 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
3943 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
3945 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
3953 real(kind_phys) :: tc, tin, sink, dqdt, qsw, qsi, qim, tmp, fac_wbf
3955 if (.not. do_wbf)
return
3957 fac_wbf = 1. - exp(- dts / tau_wbf)
3964 qsw =
wqs(tin, den(k), dqdt)
3965 qsi = iqs(tin, den(k), dqdt)
3967 if (tc .gt. 0. .and. ql(k) .gt. qcmin .and. qi(k) .gt. qcmin .and. &
3968 qv(k) .gt. qsi .and. qv(k) .lt. qsw)
then
3970 sink = min(fac_wbf * ql(k), tc / icpk(k))
3971 qim = qi0_crt / den(k)
3972 tmp = min(sink, dim(qim, qi(k)))
3974 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
3975 0., - sink, 0., tmp, sink - tmp, 0., te8(k), cvm(k), tz(k), &
3976 lcpk(k), icpk(k), tcpk(k), tcp3(k))
3988subroutine pbigg (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, den, ccn, lcpk, icpk, tcpk, tcp3)
3996 integer,
intent (in) :: ks, ke
3998 real(kind_phys),
intent (in) :: dts
4000 real(kind_phys),
intent (in),
dimension (ks:ke) :: den
4002 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
4004 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, ccn
4005 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
4007 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
4015 real(kind_phys) :: sink, tc
4021 if (tc .gt. 0 .and. ql(k) .gt. qcmin)
then
4023 if (do_psd_water_num)
then
4024 call cal_pc_ed_oe_rr_tv (ql(k), den(k), blinw, muw, &
4025 pca = pcaw, pcb = pcbw, pc = ccn(k))
4026 ccn(k) = ccn(k) / den(k)
4029 sink = 100. / (rhow * ccn(k)) * dts * (exp(0.66 * tc) - 1.) * ql(k) ** 2
4030 sink = min(ql(k), sink, tc / icpk(k))
4032 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
4033 0., - sink, 0., sink, 0., 0., te8(k), cvm(k), tz(k), &
4034 lcpk(k), icpk(k), tcpk(k), tcp3(k))
4046subroutine pidep_pisub (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
4047 lcpk, icpk, tcpk, tcp3, cin, dep, sub)
4055 integer,
intent (in) :: ks, ke
4057 real(kind_phys),
intent (in) :: dts
4059 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, dp
4061 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
4063 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, cin
4064 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
4066 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
4068 real(kind_phys),
intent (out) :: dep, sub
4076 real(kind_phys) :: sink, tin, dqdt, qsi, dq, pidep, tmp, tc, qi_crt
4080 if (tz(k) .lt. tice)
then
4084 qsi = iqs(tin, den(k), dqdt)
4086 tmp = dq / (1. + tcpk(k) * dqdt)
4088 if (qi(k) .gt. qcmin)
then
4089 if (.not. prog_ccn)
then
4090 if (inflag .eq. 1) &
4091 cin(k) = 5.38e7 * exp(0.75 * log(qi(k) * den(k)))
4092 if (inflag .eq. 2) &
4093 cin(k) = exp(- 2.80 + 0.262 * (tice - tz(k))) * 1000.0
4094 if (inflag .eq. 3) &
4095 cin(k) = exp(- 0.639 + 12.96 * (qv(k) / qsi - 1.0)) * 1000.0
4096 if (inflag .eq. 4) &
4097 cin(k) = 5.e-3 * exp(0.304 * (tice - tz(k))) * 1000.0
4098 if (inflag .eq. 5) &
4099 cin(k) = 1.e-5 * exp(0.5 * (tice - tz(k))) * 1000.0
4101 if (do_psd_ice_num)
then
4102 call cal_pc_ed_oe_rr_tv (qi(k), den(k), blini, mui, &
4103 pca = pcai, pcb = pcbi, pc = cin(k))
4104 cin(k) = cin(k) / den(k)
4106 pidep = dts * dq * 4.0 * 11.9 * exp(0.5 * log(qi(k) * den(k) * cin(k))) / &
4107 (qsi * den(k) * (tcpk(k) * cvm(k)) ** 2 / (tcond * rvgas * tz(k) ** 2) + &
4111 if (dq .gt. 0.)
then
4114 if (igflag .eq. 1) &
4115 qi_crt = qi_gen / den(k)
4116 if (igflag .eq. 2) &
4117 qi_crt = qi_gen * min(qi_lim, 0.1 * tc) / den(k)
4118 if (igflag .eq. 3) &
4119 qi_crt = 1.82e-6 * min(qi_lim, 0.1 * tc) / den(k)
4120 if (igflag .eq. 4) &
4121 qi_crt = max(qi_gen, 1.82e-6) * min(qi_lim, 0.1 * tc) / den(k)
4122 sink = min(tmp, max(qi_crt - qi(k), pidep), tc / tcpk(k))
4123 dep = dep + sink * dp(k)
4125 pidep = pidep * min(1., dim(tz(k), t_sub) * is_fac)
4126 sink = max(pidep, tmp, - qi(k))
4127 sub = sub - sink * dp(k)
4130 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
4131 - sink, 0., 0., sink, 0., 0., te8(k), cvm(k), tz(k), &
4132 lcpk(k), icpk(k), tcpk(k), tcp3(k))
4138end subroutine pidep_pisub
4144subroutine psdep_pssub (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
4145 denfac, lcpk, icpk, tcpk, tcp3, dep, sub)
4153 integer,
intent (in) :: ks, ke
4155 real(kind_phys),
intent (in) :: dts
4157 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, dp, denfac
4159 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
4161 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
4162 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
4164 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
4166 real(kind_phys),
intent (out) :: dep, sub
4174 real(kind_phys) :: sink, tin, dqdt, qsi, qden, t2, dq, pssub
4178 if (qs(k) .gt. qcmin)
then
4181 qsi = iqs(tin, den(k), dqdt)
4182 qden = qs(k) * den(k)
4185 pssub = psub(t2, dq, qden, qsi, cssub, den(k), denfac(k), blins, mus, tcpk(k), cvm(k))
4187 dq = dq / (1. + tcpk(k) * dqdt)
4188 if (pssub .gt. 0.)
then
4189 sink = min(pssub * min(1., dim(tz(k), t_sub) * ss_fac), qs(k))
4190 sub = sub + sink * dp(k)
4193 if (tz(k) .le. tice)
then
4194 sink = max(pssub, dq, (tz(k) - tice) / tcpk(k))
4196 dep = dep - sink * dp(k)
4199 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
4200 sink, 0., 0., 0., - sink, 0., te8(k), cvm(k), tz(k), &
4201 lcpk(k), icpk(k), tcpk(k), tcp3(k))
4207end subroutine psdep_pssub
4213subroutine pgdep_pgsub (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, dp, cvm, te8, den, &
4214 denfac, lcpk, icpk, tcpk, tcp3, dep, sub)
4222 integer,
intent (in) :: ks, ke
4224 real(kind_phys),
intent (in) :: dts
4226 real(kind_phys),
intent (in),
dimension (ks:ke) :: den, dp, denfac
4228 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
4230 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
4231 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
4233 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
4235 real(kind_phys),
intent (out) :: dep, sub
4243 real(kind_phys) :: sink, tin, dqdt, qsi, qden, t2, dq, pgsub
4247 if (qg(k) .gt. qcmin)
then
4250 qsi = iqs(tin, den(k), dqdt)
4251 qden = qg(k) * den(k)
4255 pgsub = psub(t2, dq, qden, qsi, cgsub, den(k), denfac(k), &
4256 blinh, muh, tcpk(k), cvm(k))
4258 pgsub = psub(t2, dq, qden, qsi, cgsub, den(k), denfac(k), &
4259 bling, mug, tcpk(k), cvm(k))
4262 dq = dq / (1. + tcpk(k) * dqdt)
4263 if (pgsub .gt. 0.)
then
4264 sink = min(pgsub * min(1., dim(tz(k), t_sub) * gs_fac), qg(k))
4265 sub = sub + sink * dp(k)
4268 if (tz(k) .le. tice)
then
4269 sink = max(pgsub, dq, (tz(k) - tice) / tcpk(k))
4271 dep = dep - sink * dp(k)
4274 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
4275 sink, 0., 0., 0., 0., - sink, te8(k), cvm(k), tz(k), &
4276 lcpk(k), icpk(k), tcpk(k), tcp3(k))
4282end subroutine pgdep_pgsub
4288subroutine cloud_fraction (ks, ke, pz, den, qv, ql, qr, qi, qs, qg, qa, tz, h_var, gsize)
4296 integer,
intent (in) :: ks, ke
4298 real(kind_phys),
intent (in) :: h_var, gsize
4300 real(kind_phys),
intent (in),
dimension (ks:ke) :: pz, den
4302 real (kind = r8),
intent (in),
dimension (ks:ke) :: tz
4304 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, qa
4312 real(kind_phys) :: q_plus, q_minus
4313 real(kind_phys) :: rh, rqi, tin, qsw, qsi, qpz, qstar, sigma, gam
4314 real(kind_phys) :: dqdt, dq, liq, ice
4315 real(kind_phys) :: qa10, qa100
4317 real(kind_phys),
dimension (ks:ke) :: q_liq, q_sol, q_cond, lcpk, icpk, tcpk, tcp3
4319 real (kind = r8),
dimension (ks:ke) :: cvm, te8
4325 call cal_mhc_lhc (ks, ke, qv, ql, qr, qi, qs, qg, q_liq, q_sol, cvm, te8, tz, &
4326 lcpk, icpk, tcpk, tcp3)
4335 q_sol(k) = qi(k) + qs(k)
4336 if (rad_graupel)
then
4337 q_sol(k) = qi(k) + qs(k) + qg(k)
4344 q_liq(k) = ql(k) + qr(k)
4347 q_cond(k) = q_liq(k) + q_sol(k)
4348 qpz = qv(k) + q_cond(k)
4352 ice = ice - q_sol(k)
4353 liq = liq - q_liq(k)
4354 tin = (te8(k) - lv00 * qpz + li00 * ice) / mhc(qpz, liq, ice)
4358 if (tin .le. t_wfr)
then
4359 qstar = iqs(tin, den(k), dqdt)
4360 elseif (tin .ge. tice)
then
4361 qstar =
wqs(tin, den(k), dqdt)
4363 qsi = iqs(tin, den(k), dqdt)
4364 qsw =
wqs(tin, den(k), dqdt)
4365 if (q_cond(k) .gt. qcmin)
then
4366 rqi = q_sol(k) / q_cond(k)
4368 rqi = (tice - tin) / (tice - t_wfr)
4370 qstar = rqi * qsi + (1. - rqi) * qsw
4377 if (cfflag .eq. 1)
then
4378 if (rh .gt. rh_thres .and. qpz .gt. qcmin)
then
4381 if (do_cld_adj)
then
4382 q_plus = qpz + dq * f_dq_p * min(1.0, max(0.0, (pz(k) - 200.e2) / &
4383 (1000.e2 - 200.e2)))
4385 q_plus = qpz + dq * f_dq_p
4387 q_minus = qpz - dq * f_dq_m
4389 if (icloud_f .eq. 2)
then
4390 if (qstar .lt. qpz)
then
4395 elseif (icloud_f .eq. 3)
then
4396 if (qstar .lt. qpz)
then
4399 if (qstar .lt. q_plus)
then
4400 qa(k) = (q_plus - qstar) / (dq * f_dq_p)
4404 if (q_cond(k) .gt. qcmin)
then
4405 qa(k) = max(cld_min, qa(k))
4407 qa(k) = min(1., qa(k))
4410 if (qstar .lt. q_minus)
then
4413 if (qstar .lt. q_plus)
then
4414 if (icloud_f .eq. 0)
then
4415 qa(k) = (q_plus - qstar) / (dq * f_dq_p + dq * f_dq_m)
4417 qa(k) = (q_plus - qstar) / ((dq * f_dq_p + dq * f_dq_m) * &
4423 if (q_cond(k) .gt. qcmin)
then
4424 qa(k) = max(cld_min, qa(k))
4426 qa(k) = min(1., qa(k))
4434 if (cfflag .eq. 2)
then
4435 if (rh .ge. 1.0)
then
4437 elseif (rh .gt. rh_thres .and. q_cond(k) .gt. qcmin)
then
4438 qa(k) = exp(xr_a * log(rh)) * (1.0 - exp(- xr_b * max(0.0, q_cond(k)) / &
4439 max(1.e-5, exp(xr_c * log(max(1.e-10, 1.0 - rh) * qstar)))))
4440 qa(k) = max(0.0, min(1., qa(k)))
4446 if (cfflag .eq. 3)
then
4447 if (q_cond(k) .gt. qcmin)
then
4448 qa(k) = 1. / 50. * (5.77 * (100. - gsize / 1000.) * &
4449 exp(1.07 * log(max(qcmin * 1000., q_cond(k) * 1000.))) + &
4450 4.82 * (gsize / 1000. - 50.) * &
4451 exp(0.94 * log(max(qcmin * 1000., q_cond(k) * 1000.))))
4452 qa(k) = qa(k) * (0.92 / 0.96 * q_liq(k) / q_cond(k) + &
4453 1.0 / 0.96 * q_sol(k) / q_cond(k))
4454 qa(k) = max(0.0, min(1., qa(k)))
4460 if (cfflag .eq. 4)
then
4461 sigma = 0.28 + exp(0.49 * log(max(qcmin * 1000., q_cond(k) * 1000.)))
4462 gam = max(0.0, q_cond(k) * 1000.) / sigma
4463 if (gam .lt. 0.18)
then
4465 elseif (gam .gt. 2.0)
then
4468 qa10 = - 0.1754 + 0.9811 * gam - 0.2223 * gam ** 2 + 0.0104 * gam ** 3
4469 qa10 = max(0.0, min(1., qa10))
4471 if (gam .lt. 0.12)
then
4473 elseif (gam .gt. 1.85)
then
4476 qa100 = - 0.0913 + 0.7213 * gam + 0.1060 * gam ** 2 - 0.0946 * gam ** 3
4477 qa100 = max(0.0, min(1., qa100))
4479 qa(k) = qa10 + (log10(gsize / 1000.) - 1) * (qa100 - qa10)
4480 qa(k) = max(0.0, min(1., qa(k)))
4485end subroutine cloud_fraction
4492subroutine lagrangian_fall (ks, ke, zs, ze, zt, dp, q, precip, m1)
4500 integer,
intent (in) :: ks, ke
4502 real(kind_phys),
intent (in) :: zs
4504 real(kind_phys),
intent (in),
dimension (ks:ke + 1) :: ze, zt
4506 real(kind_phys),
intent (in),
dimension (ks:ke) :: dp
4508 real(kind_phys),
intent (inout),
dimension (ks:ke) :: q
4510 real(kind_phys),
intent (inout) :: precip
4512 real(kind_phys),
intent (out),
dimension (ks:ke) :: m1
4518 integer :: k, k0, n, m
4520 real(kind_phys) :: a4 (4, ks:ke), pl, pr, delz, esl
4522 real(kind_phys),
parameter :: r3 = 1. / 3., r23 = 2. / 3.
4524 real(kind_phys),
dimension (ks:ke) :: qm, dz
4531 dz(k) = zt(k) - zt(k + 1)
4533 a4(1, k) = q(k) / dz(k)
4541 call cs_profile (a4(1, ks), dz(ks), ke - ks + 1)
4545 n_loop:
do n = k0, ke
4546 if (ze(k) .le. zt(n) .and. ze(k) .ge. zt(n + 1))
then
4547 pl = (zt(n) - ze(k)) / dz(n)
4548 if (zt(n + 1) .le. ze(k + 1))
then
4550 pr = (zt(n) - ze(k + 1)) / dz(n)
4551 qm(k) = a4(2, n) + 0.5 * (a4(4, n) + a4(3, n) - a4(2, n)) * (pr + pl) - &
4552 a4(4, n) * r3 * (pr * (pr + pl) + pl ** 2)
4553 qm(k) = qm(k) * (ze(k) - ze(k + 1))
4557 qm(k) = (ze(k) - zt(n + 1)) * (a4(2, n) + 0.5 * (a4(4, n) + &
4558 a4(3, n) - a4(2, n)) * (1. + pl) - a4(4, n) * (r3 * (1. + pl * (1. + pl))))
4562 if (ze(k + 1) .lt. zt(m + 1))
then
4563 qm(k) = qm(k) + q(m)
4565 delz = zt(m) - ze(k + 1)
4567 qm(k) = qm(k) + delz * (a4(2, m) + 0.5 * esl * &
4568 (a4(3, m) - a4(2, m) + a4(4, m) * (1. - r23 * esl)))
4580 m1(ks) = q(ks) - qm(ks)
4582 m1(k) = m1(k - 1) + q(k) - qm(k)
4584 precip = precip + m1(ke)
4592 q(k) = qm(k) / dp(k)
4595end subroutine lagrangian_fall
4602subroutine cs_profile (a4, del, km)
4610 integer,
intent (in) :: km
4612 real(kind_phys),
intent (in) :: del (km)
4614 real(kind_phys),
intent (inout) :: a4 (4, km)
4622 logical :: extm (km)
4624 real(kind_phys) :: gam (km), q (km + 1), d4, bet, a_bot, grat, pmp, lac
4625 real(kind_phys) :: pmp_1, lac_1, pmp_2, lac_2, da1, da2, a6da
4627 grat = del(2) / del(1)
4628 bet = grat * (grat + 0.5)
4629 q(1) = (2. * grat * (grat + 1.) * a4(1, 1) + a4(1, 2)) / bet
4630 gam(1) = (1. + grat * (grat + 1.5)) / bet
4633 d4 = del(k - 1) / del(k)
4634 bet = 2. + 2. * d4 - gam(k - 1)
4635 q(k) = (3. * (a4(1, k - 1) + d4 * a4(1, k)) - q(k - 1)) / bet
4639 a_bot = 1. + d4 * (d4 + 1.5)
4640 q(km + 1) = (2. * d4 * (d4 + 1.) * a4(1, km) + a4(1, km - 1) - a_bot * q(km)) &
4641 / (d4 * (d4 + 0.5) - a_bot * gam(km))
4644 q(k) = q(k) - gam(k) * q(k + 1)
4652 gam(k) = a4(1, k) - a4(1, k - 1)
4659 q(1) = max(q(1), 0.)
4660 q(2) = min(q(2), max(a4(1, 1), a4(1, 2)))
4661 q(2) = max(q(2), min(a4(1, 1), a4(1, 2)), 0.)
4668 if (gam(k - 1) * gam(k + 1) .gt. 0.)
then
4670 q(k) = min(q(k), max(a4(1, k - 1), a4(1, k)))
4671 q(k) = max(q(k), min(a4(1, k - 1), a4(1, k)))
4673 if (gam(k - 1) .gt. 0.)
then
4675 q(k) = max(q(k), min(a4(1, k - 1), a4(1, k)))
4678 q(k) = min(q(k), max(a4(1, k - 1), a4(1, k)))
4680 q(k) = max(q(k), 0.0)
4689 q(km) = min(q(km), max(a4(1, km - 1), a4(1, km)))
4690 q(km) = max(q(km), min(a4(1, km - 1), a4(1, km)), 0.)
4691 q(km + 1) = max(q(km + 1), 0.)
4699 if (k .eq. 1 .or. k .eq. km)
then
4700 extm(k) = (a4(2, k) - a4(1, k)) * (a4(3, k) - a4(1, k)) .gt. 0.
4702 extm(k) = gam(k) * gam(k + 1) .lt. 0.
4716 a4(2, 1) = max(0., a4(2, 1))
4725 if (a4(1, k) .lt. qcmin .or. extm(k - 1) .or. extm(k + 1))
then
4730 a4(4, k) = 6. * a4(1, k) - 3. * (a4(2, k) + a4(3, k))
4731 if (abs(a4(4, k)) .gt. abs(a4(2, k) - a4(3, k)))
then
4733 pmp_1 = a4(1, k) - 2.0 * gam(k + 1)
4734 lac_1 = pmp_1 + 1.5 * gam(k + 2)
4735 a4(2, k) = min(max(a4(2, k), min(a4(1, k), pmp_1, lac_1)), &
4736 max(a4(1, k), pmp_1, lac_1))
4737 pmp_2 = a4(1, k) + 2.0 * gam(k)
4738 lac_2 = pmp_2 - 1.5 * gam(k - 1)
4739 a4(3, k) = min(max(a4(3, k), min(a4(1, k), pmp_2, lac_2)), &
4740 max(a4(1, k), pmp_2, lac_2))
4746 a4(4, k) = 6. * a4(1, k) - 3. * (a4(2, k) + a4(3, k))
4755 da1 = a4(3, k) - a4(2, k)
4757 a6da = a4(4, k) * da1
4758 if (a6da .lt. - da2)
then
4759 a4(4, k) = 3. * (a4(2, k) - a4(1, k))
4760 a4(3, k) = a4(2, k) - a4(4, k)
4761 elseif (a6da .gt. da2)
then
4762 a4(4, k) = 3. * (a4(3, k) - a4(1, k))
4763 a4(2, k) = a4(3, k) - a4(4, k)
4767 call cs_limiters (km - 1, a4)
4773 a4(2, km) = a4(1, km)
4774 a4(3, km) = a4(1, km)
4777end subroutine cs_profile
4786subroutine cs_limiters (km, a4)
4794 integer,
intent (in) :: km
4796 real(kind_phys),
intent (inout) :: a4 (4, km)
4804 real(kind_phys),
parameter :: r12 = 1. / 12.
4807 if (a4(1, k) .le. 0.)
then
4812 if (abs(a4(3, k) - a4(2, k)) .lt. - a4(4, k))
then
4813 if ((a4(1, k) + 0.25 * (a4(3, k) - a4(2, k)) ** 2 / a4(4, k) + &
4814 a4(4, k) * r12) .lt. 0.)
then
4816 if (a4(1, k) .lt. a4(3, k) .and. a4(1, k) .lt. a4(2, k))
then
4820 elseif (a4(3, k) .gt. a4(2, k))
then
4821 a4(4, k) = 3. * (a4(2, k) - a4(1, k))
4822 a4(3, k) = a4(2, k) - a4(4, k)
4824 a4(4, k) = 3. * (a4(3, k) - a4(1, k))
4825 a4(2, k) = a4(3, k) - a4(4, k)
4832end subroutine cs_limiters
4838subroutine implicit_fall (dts, ks, ke, ze, vt, dp, q, precip, m1)
4846 integer,
intent (in) :: ks, ke
4848 real(kind_phys),
intent (in) :: dts
4850 real(kind_phys),
intent (in),
dimension (ks:ke + 1) :: ze
4852 real(kind_phys),
intent (in),
dimension (ks:ke) :: vt, dp
4854 real(kind_phys),
intent (inout),
dimension (ks:ke) :: q
4856 real(kind_phys),
intent (inout) :: precip
4858 real(kind_phys),
intent (out),
dimension (ks:ke) :: m1
4866 real(kind_phys),
dimension (ks:ke) :: dz, qm, dd
4869 dz(k) = ze(k) - ze(k + 1)
4874 qm(ks) = q(ks) / (dz(ks) + dd(ks))
4876 qm(k) = (q(k) + qm(k - 1) * dd(k - 1)) / (dz(k) + dd(k))
4880 qm(k) = qm(k) * dz(k)
4883 m1(ks) = q(ks) - qm(ks)
4885 m1(k) = m1(k - 1) + q(k) - qm(k)
4887 precip = precip + m1(ke)
4890 q(k) = qm(k) / dp(k)
4893end subroutine implicit_fall
4899subroutine explicit_fall (dts, ks, ke, ze, vt, dp, q, precip, m1)
4907 integer,
intent (in) :: ks, ke
4909 real(kind_phys),
intent (in) :: dts
4911 real(kind_phys),
intent (in),
dimension (ks:ke + 1) :: ze
4913 real(kind_phys),
intent (in),
dimension (ks:ke) :: vt, dp
4915 real(kind_phys),
intent (inout),
dimension (ks:ke) :: q
4917 real(kind_phys),
intent (inout) :: precip
4919 real(kind_phys),
intent (out),
dimension (ks:ke) :: m1
4925 integer :: n, k, nstep
4927 real(kind_phys),
dimension (ks:ke) :: dz, qm, q0, dd
4930 dz(k) = ze(k) - ze(k + 1)
4932 q0(k) = q(k) * dp(k)
4935 nstep = 1 + int(maxval(dd / dz))
4937 dd(k) = dd(k) / nstep
4942 qm(ks) = q(ks) - q(ks) * dd(ks) / dz(ks)
4944 qm(k) = q(k) - q(k) * dd(k) / dz(k) + q(k - 1) * dd(k - 1) / dz(k - 1)
4949 m1(ks) = q0(ks) - qm(ks)
4951 m1(k) = m1(k - 1) + q0(k) - qm(k)
4953 precip = precip + m1(ke)
4956 q(k) = qm(k) / dp(k)
4959end subroutine explicit_fall
4965subroutine implicit_lagrangian_fall (dts, ks, ke, zs, ze, zt, vt, dp, q, &
4966 precip, flux, sed_fac)
4974 integer,
intent (in) :: ks, ke
4976 real(kind_phys),
intent (in) :: zs, dts, sed_fac
4978 real(kind_phys),
intent (in),
dimension (ks:ke + 1) :: ze, zt
4980 real(kind_phys),
intent (in),
dimension (ks:ke) :: vt, dp
4982 real(kind_phys),
intent (inout),
dimension (ks:ke) :: q
4984 real(kind_phys),
intent (inout) :: precip
4986 real(kind_phys),
intent (out),
dimension (ks:ke) :: flux
4992 real(kind_phys) :: pre0, pre1
4994 real(kind_phys),
dimension (ks:ke) :: q0, q1, m0, m1
4999 call implicit_fall (dts, ks, ke, ze, vt, dp, q0, pre0, m0)
5004 call lagrangian_fall (ks, ke, zs, ze, zt, dp, q1, pre1, m1)
5006 q = q0 * sed_fac + q1 * (1.0 - sed_fac)
5007 flux = m0 * sed_fac + m1 * (1.0 - sed_fac)
5008 precip = pre0 * sed_fac + pre1 * (1.0 - sed_fac)
5010end subroutine implicit_lagrangian_fall
5017subroutine linear_prof (km, q, dm, z_var, h_var)
5025 integer,
intent (in) :: km
5027 logical,
intent (in) :: z_var
5029 real(kind_phys),
intent (in) :: q (km), h_var
5031 real(kind_phys),
intent (out) :: dm (km)
5039 real(kind_phys) :: dq (km)
5043 dq(k) = 0.5 * (q(k) - q(k - 1))
5050 dm(k) = 0.5 * min(abs(dq(k) + dq(k + 1)), 0.5 * q(k))
5051 if (dq(k) * dq(k + 1) .le. 0.)
then
5052 if (dq(k) .gt. 0.)
then
5053 dm(k) = min(dm(k), dq(k), - dq(k + 1))
5064 dm(k) = max(dm(k), 0.0, h_var * q(k))
5068 dm(k) = max(0.0, h_var * q(k))
5072end subroutine linear_prof
5078function acr2d (qden, c, denfac, blin, mu)
5082 real(kind_phys) :: acr2d
5088 real(kind_phys),
intent (in) :: qden, c, denfac, blin, mu
5090 acr2d = denfac * c * exp((2 + mu + blin) / (mu + 3) * log(6 * qden))
5098function acr3d (v1, v2, q1, q2, c, acco, acc1, acc2, den)
5102 real(kind_phys) :: acr3d
5108 real(kind_phys),
intent (in) :: v1, v2, c, den, q1, q2, acco (3), acc1, acc2
5116 real(kind_phys) :: t1, t2, tmp, vdiff
5118 t1 = exp(1. / (acc1 + 3) * log(6 * q1 * den))
5119 t2 = exp(1. / (acc2 + 3) * log(6 * q2 * den))
5121 if (vdiffflag .eq. 1) vdiff = abs(v1 - v2)
5122 if (vdiffflag .eq. 2) vdiff = sqrt((1.20 * v1 - 0.95 * v2) ** 2. + 0.08 * v1 * v2)
5123 if (vdiffflag .eq. 3) vdiff = sqrt((1.00 * v1 - 1.00 * v2) ** 2. + 0.04 * v1 * v2)
5125 acr3d = c * vdiff / den
5129 tmp = tmp + acco(i) * exp((6 + acc1 - i) * log(t1)) * exp((acc2 + i - 1) * log(t2))
5140function vent_coeff (qden, c1, c2, denfac, blin, mu)
5144 real(kind_phys) :: vent_coeff
5150 real(kind_phys),
intent (in) :: qden, c1, c2, denfac, blin, mu
5152 vent_coeff = c1 + c2 * exp((3 + 2 * mu + blin) / (mu + 3) / 2 * log(6 * qden)) * &
5153 sqrt(denfac) / exp((1 + mu) / (mu + 3) * log(6 * qden))
5155end function vent_coeff
5161function psub (t2, dq, qden, qsat, c, den, denfac, blin, mu, cpk, cvm)
5165 real(kind_phys) :: psub
5171 real(kind_phys),
intent (in) :: t2, dq, qden, qsat, c (5), den, denfac, blin, cpk, mu
5173 real (kind = r8),
intent (in) :: cvm
5175 psub = c(1) * t2 * dq * exp((1 + mu) / (mu + 3) * log(6 * qden)) * &
5176 vent_coeff(qden, c(2), c(3), denfac, blin, mu) / &
5177 (c(4) * t2 + c(5) * (cpk * cvm) ** 2 * qsat * den)
5185function pmlt (tc, dq, qden, pxacw, pxacr, c, den, denfac, blin, mu, lcpk, icpk, cvm)
5189 real(kind_phys) :: pmlt
5195 real(kind_phys),
intent (in) :: tc, dq, qden, pxacw, pxacr, c (4), den, denfac, blin, lcpk, icpk, mu
5197 real (kind = r8),
intent (in) :: cvm
5199 pmlt = (c(1) / (icpk * cvm) * tc / den - c(2) * lcpk / icpk * dq) * &
5200 exp((1 + mu) / (mu + 3) * log(6 * qden)) * &
5201 vent_coeff(qden, c(3), c(4), denfac, blin, mu) + &
5202 c_liq / (icpk * cvm) * tc * (pxacw + pxacr)
5210subroutine sedi_uv (ks, ke, m1, dp, u, v)
5218 integer,
intent (in) :: ks, ke
5220 real(kind_phys),
intent (in),
dimension (ks:ke) :: m1, dp
5222 real(kind_phys),
intent (inout),
dimension (ks:ke) :: u, v
5231 u(k) = (dp(k) * u(k) + m1(k - 1) * u(k - 1)) / (dp(k) + m1(k - 1))
5232 v(k) = (dp(k) * v(k) + m1(k - 1) * v(k - 1)) / (dp(k) + m1(k - 1))
5235end subroutine sedi_uv
5241subroutine sedi_w (ks, ke, m1, w, vt, dm)
5249 integer,
intent (in) :: ks, ke
5251 real(kind_phys),
intent (in),
dimension (ks:ke) :: m1, vt, dm
5253 real(kind_phys),
intent (inout),
dimension (ks:ke) :: w
5261 w(ks) = w(ks) + m1(ks) * vt(ks) / dm(ks)
5263 w(k) = (dm(k) * w(k) + m1(k - 1) * (w(k - 1) - vt(k - 1)) + m1(k) * vt(k)) / &
5267end subroutine sedi_w
5273subroutine sedi_heat (ks, ke, dm, m1, dz, tz, qv, ql, qr, qi, qs, qg, cw)
5281 integer,
intent (in) :: ks, ke
5283 real(kind_phys),
intent (in) :: cw
5285 real(kind_phys),
intent (in),
dimension (ks:ke) :: dm, m1, dz, qv, ql, qr, qi, qs, qg
5287 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
5295 real(kind_phys),
dimension (ks:ke) :: dgz, cv0
5298 dgz(k) = - 0.5 * grav * (dz(k - 1) + dz(k))
5299 cv0(k) = dm(k) * (cv_air + qv(k) * cv_vap + (qr(k) + ql(k)) * c_liq + &
5300 (qi(k) + qs(k) + qg(k)) * c_ice) + cw * (m1(k) - m1(k - 1))
5304 tz(k) = (cv0(k) * tz(k) + m1(k - 1) * (cw * tz(k - 1) + dgz(k))) / &
5305 (cv0(k) + cw * m1(k - 1))
5308end subroutine sedi_heat
5314subroutine cld_sat_adj (dtm, is, ie, ks, ke, hydrostatic, consv_te, &
5315 adj_vmr, te, dte, qv, ql, qr, qi, qs, qg, qa, qnl, qni, hs, delz, &
5316 pt, delp, q_con, cappa, gsize, last_step, do_sat_adj)
5324 integer,
intent (in) :: is, ie, ks, ke
5326 logical,
intent (in) :: hydrostatic, last_step, consv_te, do_sat_adj
5328 real(kind_phys),
intent (in) :: dtm
5330 real(kind_phys),
intent (in),
dimension (is:ie) :: hs, gsize
5332 real(kind_phys),
intent (in),
dimension (is:ie, ks:ke) :: qnl, qni
5334 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: delp, delz, pt, te
5335 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: qv, ql, qr, qi, qs, qg, qa
5337 real(kind_phys),
intent (inout),
dimension (is:, ks:) :: q_con, cappa
5339 real(kind_phys),
intent (out),
dimension (is:ie, ks:ke) :: adj_vmr
5341 real (kind = r8),
intent (out),
dimension (is:ie) :: dte
5347 real(kind_phys),
dimension (is:ie, ks:ke) :: ua, va, wa, prefluxw, prefluxr, prefluxi, prefluxs, prefluxg
5349 real(kind_phys),
dimension (is:ie) :: water, rain, ice, snow, graupel
5375 call mpdrv (hydrostatic, ua, va, wa, delp, pt, qv, ql, qr, qi, qs, qg, qa, &
5376 qnl, qni, delz, is, ie, ks, ke, dtm, water, rain, ice, snow, graupel, &
5377 gsize, hs, q_con, cappa, consv_te, adj_vmr, te, dte, prefluxw, prefluxr, &
5378 prefluxi, prefluxs, prefluxg, last_step, .false., do_sat_adj, .false.)
5380end subroutine cld_sat_adj
5386subroutine pgfr_simp (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, &
5387 lcpk, icpk, tcpk, tcp3)
5395 integer,
intent (in) :: ks, ke
5397 real(kind_phys),
intent (in) :: dts
5399 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
5401 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
5402 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
5404 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
5412 real(kind_phys) :: tc, sink, fac_r2g
5414 fac_r2g = 1. - exp(- dts / tau_r2g)
5420 if (tc .lt. 0. .and. qr(k) .gt. qcmin)
then
5422 sink = (- tc * 0.025) ** 2 * qr(k)
5423 sink = min(qr(k), sink, - fac_r2g * tc / icpk(k))
5425 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
5426 0., 0., - sink, 0., 0., sink, te8(k), cvm(k), tz(k), &
5427 lcpk(k), icpk(k), tcpk(k), tcp3(k))
5433end subroutine pgfr_simp
5439subroutine psmlt_simp (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, cvm, te8, &
5440 lcpk, icpk, tcpk, tcp3)
5448 integer,
intent (in) :: ks, ke
5450 real(kind_phys),
intent (in) :: dts
5452 real (kind = r8),
intent (in),
dimension (ks:ke) :: te8
5454 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
5455 real(kind_phys),
intent (inout),
dimension (ks:ke) :: lcpk, icpk, tcpk, tcp3
5457 real (kind = r8),
intent (inout),
dimension (ks:ke) :: cvm, tz
5465 real(kind_phys) :: tc, tmp, sink, fac_smlt
5467 fac_smlt = 1. - exp(- dts / tau_smlt)
5473 if (tc .ge. 0. .and. qs(k) .gt. qcmin)
then
5475 sink = (tc * 0.1) ** 2 * qs(k)
5476 sink = min(qs(k), sink, fac_smlt * tc / icpk(k))
5477 tmp = min(sink, dim(qs_mlt, ql(k)))
5479 call update_qt (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
5480 0., tmp, sink - tmp, 0., - sink, 0., te8(k), cvm(k), tz(k), &
5481 lcpk(k), icpk(k), tcpk(k), tcp3(k))
5487end subroutine psmlt_simp
5493subroutine praut_simp (ks, ke, dts, tz, qv, ql, qr, qi, qs, qg)
5501 integer,
intent (in) :: ks, ke
5503 real(kind_phys),
intent (in) :: dts
5505 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
5507 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
5515 real(kind_phys) :: tc, sink, fac_l2r
5517 fac_l2r = 1. - exp(- dts / tau_l2r)
5523 if (tc .gt. 0 .and. ql(k) .gt. ql0_max)
then
5525 sink = fac_l2r * (ql(k) - ql0_max)
5527 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
5528 0., - sink, sink, 0., 0., 0.)
5534end subroutine praut_simp
5540subroutine psaut_simp (ks, ke, dts, qv, ql, qr, qi, qs, qg, tz, den)
5548 integer,
intent (in) :: ks, ke
5550 real(kind_phys),
intent (in) :: dts
5552 real(kind_phys),
intent (in),
dimension (ks:ke) :: den
5554 real(kind_phys),
intent (inout),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
5556 real (kind = r8),
intent (inout),
dimension (ks:ke) :: tz
5564 real(kind_phys) :: tc, sink, fac_i2s, qim
5566 fac_i2s = 1. - exp(- dts / tau_i2s)
5572 qim = qi0_max / den(k)
5574 if (tc .lt. 0. .and. qi(k) .gt. qim)
then
5576 sink = fac_i2s * (qi(k) - qim)
5578 call update_qq (qv(k), ql(k), qr(k), qi(k), qs(k), qg(k), &
5579 0., 0., 0., - sink, sink, 0.)
5585end subroutine psaut_simp
5591subroutine cld_eff_rad (is, ie, ks, ke, lsm, p, delp, t, qv, qw, qi, qr, qs, qg, qa, &
5592 rew, rei, rer, res, reg, snowd, cnvw, cnvi)
5600 integer,
intent (in) :: is, ie, ks, ke
5602 real(kind_phys),
intent (in),
dimension (is:ie) :: lsm, snowd
5604 real(kind_phys),
intent (in),
dimension (is:ie, ks:ke) :: delp, t, p
5605 real(kind_phys),
intent (in),
dimension (is:ie, ks:ke) :: qv, qw, qi, qr, qs, qg, qa
5607 real(kind_phys),
intent (in),
dimension (is:ie, ks:ke),
optional :: cnvw, cnvi
5609 real(kind_phys),
intent (inout),
dimension (is:ie, ks:ke) :: rew, rei, rer, res, reg
5615 integer :: i, k, ind
5617 real(kind_phys),
dimension (is:ie, ks:ke) :: qcw, qci, qcr, qcs, qcg
5618 real(kind_phys),
dimension (is:ie, ks:ke) :: qmw, qmr, qmi, qms, qmg
5620 real(kind_phys) :: dpg, rho, ccnw, mask, cor, tc, bw
5621 real(kind_phys) :: lambdaw, lambdar, lambdai, lambdas, lambdag, rei_fac
5623 real(kind_phys) :: retab (138) = (/ &
5624 0.05000, 0.05000, 0.05000, 0.05000, 0.05000, 0.05000, &
5625 0.05500, 0.06000, 0.07000, 0.08000, 0.09000, 0.10000, &
5626 0.20000, 0.30000, 0.40000, 0.50000, 0.60000, 0.70000, &
5627 0.80000, 0.90000, 1.00000, 1.10000, 1.20000, 1.30000, &
5628 1.40000, 1.50000, 1.60000, 1.80000, 2.00000, 2.20000, &
5629 2.40000, 2.60000, 2.80000, 3.00000, 3.20000, 3.50000, &
5630 3.80000, 4.10000, 4.40000, 4.70000, 5.00000, 5.30000, &
5631 5.60000, 5.92779, 6.26422, 6.61973, 6.99539, 7.39234, &
5632 7.81177, 8.25496, 8.72323, 9.21800, 9.74075, 10.2930, &
5633 10.8765, 11.4929, 12.1440, 12.8317, 13.5581, 14.2319, &
5634 15.0351, 15.8799, 16.7674, 17.6986, 18.6744, 19.6955, &
5635 20.7623, 21.8757, 23.0364, 24.2452, 25.5034, 26.8125, &
5636 27.7895, 28.6450, 29.4167, 30.1088, 30.7306, 31.2943, &
5637 31.8151, 32.3077, 32.7870, 33.2657, 33.7540, 34.2601, &
5638 34.7892, 35.3442, 35.9255, 36.5316, 37.1602, 37.8078, &
5639 38.4720, 39.1508, 39.8442, 40.5552, 41.2912, 42.0635, &
5640 42.8876, 43.7863, 44.7853, 45.9170, 47.2165, 48.7221, &
5641 50.4710, 52.4980, 54.8315, 57.4898, 60.4785, 63.7898, &
5642 65.5604, 71.2885, 75.4113, 79.7368, 84.2351, 88.8833, &
5643 93.6658, 98.5739, 103.603, 108.752, 114.025, 119.424, &
5644 124.954, 130.630, 136.457, 142.446, 148.608, 154.956, &
5645 161.503, 168.262, 175.248, 182.473, 189.952, 197.699, &
5646 205.728, 214.055, 222.694, 231.661, 240.971, 250.639 /)
5658 if (
present (cnvw))
then
5661 if (
present (cnvi))
then
5669 if (liq_ice_combine)
then
5672 qmw(i, k) = qmw(i, k) + qmr(i, k)
5674 qmi(i, k) = qmi(i, k) + qms(i, k) + qmg(i, k)
5685 if (snow_grauple_combine)
then
5688 qms(i, k) = qms(i, k) + qmg(i, k)
5698 qmw(i, k) = max(qmw(i, k), qcmin)
5699 qmi(i, k) = max(qmi(i, k), qcmin)
5700 qmr(i, k) = max(qmr(i, k), qcmin)
5701 qms(i, k) = max(qms(i, k), qcmin)
5702 qmg(i, k) = max(qmg(i, k), qcmin)
5705 mask = min(max(lsm(i), 0.0), 2.0)
5707 dpg = abs(delp(i, k)) / grav
5708 rho = p(i, k) / (rdgas * t(i, k) * (1. + zvir * qv(i, k)))
5712 if (rewflag .eq. 1)
then
5720 ccnw = (1.0 - abs(mask - 1.0)) * &
5721 (10. ** 2.24 * (qa(i, k) * rho * 1.e9) ** 0.257) + &
5723 (10. ** 2.06 * (qa(i, k) * rho * 1.e9) ** 0.48)
5725 ccnw = ccn_o * abs(mask - 1.0) + ccn_l * (1.0 - abs(mask - 1.0))
5728 if (qmw(i, k) .gt. qcmin)
then
5729 qcw(i, k) = dpg * qmw(i, k) * 1.0e3
5730 rew(i, k) = exp(1.0 / 3.0 * log((3.0 * qmw(i, k) * rho) / &
5731 (4.0 * pi * rhow * ccnw))) * 1.0e4
5732 rew(i, k) = max(rewmin, min(rewmax, rew(i, k)))
5740 if (rewflag .eq. 2)
then
5748 ccnw = (1.0 - abs(mask - 1.0)) * &
5749 (10. ** 2.24 * (qa(i, k) * rho * 1.e9) ** 0.257) + &
5751 (10. ** 2.06 * (qa(i, k) * rho * 1.e9) ** 0.48)
5753 ccnw = 1.077 * ccn_o * abs(mask - 1.0) + 1.143 * ccn_l * (1.0 - abs(mask - 1.0))
5756 if (qmw(i, k) .gt. qcmin)
then
5757 qcw(i, k) = dpg * qmw(i, k) * 1.0e3
5758 rew(i, k) = exp(1.0 / 3.0 * log((3.0 * qmw(i, k) * rho) / &
5759 (4.0 * pi * rhow * ccnw))) * 1.0e4
5760 rew(i, k) = max(rewmin, min(rewmax, rew(i, k)))
5768 if (rewflag .eq. 3)
then
5774 if (qmw(i, k) .gt. qcmin)
then
5775 qcw(i, k) = dpg * qmw(i, k) * 1.0e3
5776 rew(i, k) = 14.0 * abs(mask - 1.0) + &
5777 (8.0 + (14.0 - 8.0) * min(1.0, max(0.0, - tc / 30.0))) * &
5778 (1.0 - abs(mask - 1.0))
5779 rew(i, k) = rew(i, k) + (14.0 - rew(i, k)) * &
5780 min(1.0, max(0.0, snowd(i) / 1000.0))
5781 rew(i, k) = max(rewmin, min(rewmax, rew(i, k)))
5789 if (rewflag .eq. 4)
then
5795 if (qmw(i, k) .gt. qcmin)
then
5796 qcw(i, k) = dpg * qmw(i, k) * 1.0e3
5797 call cal_pc_ed_oe_rr_tv (qmw(i, k), rho, blinw, muw, &
5798 eda = edaw, edb = edbw, ed = rew(i, k))
5799 rew(i, k) = rewfac * 0.5 * rew(i, k) * 1.0e6
5800 rew(i, k) = max(rewmin, min(rewmax, rew(i, k)))
5808 if (reiflag .eq. 1)
then
5814 if (qmi(i, k) .gt. qcmin)
then
5815 qci(i, k) = dpg * qmi(i, k) * 1.0e3
5816 rei_fac = log(1.0e3 * qmi(i, k) * rho)
5817 if (tc .lt. - 50)
then
5818 rei(i, k) = beta / 9.917 * exp(0.109 * rei_fac) * 1.0e3
5819 elseif (tc .lt. - 40)
then
5820 rei(i, k) = beta / 9.337 * exp(0.080 * rei_fac) * 1.0e3
5821 elseif (tc .lt. - 30)
then
5822 rei(i, k) = beta / 9.208 * exp(0.055 * rei_fac) * 1.0e3
5824 rei(i, k) = beta / 9.387 * exp(0.031 * rei_fac) * 1.0e3
5826 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
5834 if (reiflag .eq. 2)
then
5840 if (qmi(i, k) .gt. qcmin)
then
5841 qci(i, k) = dpg * qmi(i, k) * 1.0e3
5842 if (tc .le. - 55)
then
5843 rei(i, k) = 15.41627
5844 elseif (tc .le. - 50)
then
5845 rei(i, k) = 16.60895
5846 elseif (tc .le. - 45)
then
5847 rei(i, k) = 32.89967
5848 elseif (tc .le. - 40)
then
5849 rei(i, k) = 35.29989
5850 elseif (tc .le. - 35)
then
5851 rei(i, k) = 55.65818
5852 elseif (tc .le. - 30)
then
5853 rei(i, k) = 85.19071
5854 elseif (tc .le. - 25)
then
5855 rei(i, k) = 72.35392
5857 rei(i, k) = 92.46298
5859 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
5867 if (reiflag .eq. 3)
then
5873 if (qmi(i, k) .gt. qcmin)
then
5874 qci(i, k) = dpg * qmi(i, k) * 1.0e3
5875 rei(i, k) = 47.05 + tc * (0.6624 + 0.001741 * tc)
5876 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
5884 if (reiflag .eq. 4)
then
5890 if (qmi(i, k) .gt. qcmin)
then
5891 qci(i, k) = dpg * qmi(i, k) * 1.0e3
5892 ind = min(max(int(t(i, k) - 136.0), 44), 138 - 1)
5893 cor = t(i, k) - int(t(i, k))
5894 rei(i, k) = retab(ind) * (1. - cor) + retab(ind + 1) * cor
5895 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
5903 if (reiflag .eq. 5)
then
5909 if (qmi(i, k) .gt. qcmin)
then
5910 qci(i, k) = dpg * qmi(i, k) * 1.0e3
5911 bw = - 2. + 1.e-3 * log10(rho * qmi(i, k) / 50.e-3) * &
5912 exp(1.5 * log(max(1.e-10, - tc)))
5913 rei(i, k) = 377.4 + bw * (203.3 + bw * (37.91 + 2.3696 * bw))
5914 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
5922 if (reiflag .eq. 6)
then
5928 if (qmi(i, k) .gt. qcmin)
then
5929 qci(i, k) = dpg * qmi(i, k) * 1.0e3
5930 rei_fac = log(1.0e3 * qmi(i, k) * rho)
5931 rei(i, k) = 45.8966 * exp(0.2214 * rei_fac) + &
5932 0.7957 * exp(0.2535 * rei_fac) * (tc + 190.0)
5933 rei(i, k) = (1.2351 + 0.0105 * tc) * rei(i, k)
5934 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
5942 if (reiflag .eq. 7)
then
5948 if (qmi(i, k) .gt. qcmin)
then
5949 qci(i, k) = dpg * qmi(i, k) * 1.0e3
5950 call cal_pc_ed_oe_rr_tv (qmi(i, k), rho, blini, mui, &
5951 eda = edai, edb = edbi, ed = rei(i, k))
5952 rei(i, k) = reifac * 0.5 * rei(i, k) * 1.0e6
5953 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
5961 if (rerflag .eq. 1)
then
5967 if (qmr(i, k) .gt. qcmin)
then
5968 qcr(i, k) = dpg * qmr(i, k) * 1.0e3
5969 call cal_pc_ed_oe_rr_tv (qmr(i, k), rho, blinr, mur, &
5970 eda = edar, edb = edbr, ed = rer(i, k))
5971 rer(i, k) = 0.5 * rer(i, k) * 1.0e6
5972 rer(i, k) = max(rermin, min(rermax, rer(i, k)))
5980 if (resflag .eq. 1)
then
5986 if (qms(i, k) .gt. qcmin)
then
5987 qcs(i, k) = dpg * qms(i, k) * 1.0e3
5988 call cal_pc_ed_oe_rr_tv (qms(i, k), rho, blins, mus, &
5989 eda = edas, edb = edbs, ed = res(i, k))
5990 res(i, k) = 0.5 * res(i, k) * 1.0e6
5991 res(i, k) = max(resmin, min(resmax, res(i, k)))
5999 if (regflag .eq. 1)
then
6005 if (qmg(i, k) .gt. qcmin)
then
6006 qcg(i, k) = dpg * qmg(i, k) * 1.0e3
6008 call cal_pc_ed_oe_rr_tv (qmg(i, k), rho, blinh, muh, &
6009 eda = edah, edb = edbh, ed = reg(i, k))
6011 call cal_pc_ed_oe_rr_tv (qmg(i, k), rho, bling, mug, &
6012 eda = edag, edb = edbg, ed = reg(i, k))
6014 reg(i, k) = 0.5 * reg(i, k) * 1.0e6
6015 reg(i, k) = max(regmin, min(regmax, reg(i, k)))
6027end subroutine cld_eff_rad
6033subroutine rad_ref (is, ie, js, je, qv, qr, qs, qg, pt, delp, &
6034 delz, dbz, npz, hydrostatic, do_inline_mp, mp_top)
6042 logical,
intent (in) :: hydrostatic, do_inline_mp
6044 integer,
intent (in) :: is, ie, js, je
6045 integer,
intent (in) :: npz, mp_top
6050 real(kind_phys),
intent (in),
dimension (is:ie, js:je, npz) :: delz
6052 real(kind_phys),
intent (in),
dimension (is:ie, js:je, npz) :: pt, delp
6054 real(kind_phys),
intent (in),
dimension (is:ie, js:je, npz) :: qv, qr, qs, qg
6062 real(kind_phys),
intent (out),
dimension (is:ie, js:je, npz) :: dbz
6070 real(kind_phys),
parameter :: alpha = 0.224, mp_const = 200 * exp(1.6 * log(3.6e6))
6072 real (kind = r8) :: qden, z_e
6073 real(kind_phys) :: fac_r, fac_s, fac_g
6074 real(kind_phys) :: allmax
6075 real(kind_phys),
dimension (is:ie, js:je) :: maxdbz
6077 real(kind_phys),
dimension (npz) :: den, denfac, qmr, qms, qmg, vtr, vts, vtg
6112 den(k) = - delp(i, j, k) / (grav * delz(i, j, k))
6113 qmr(k) = max(qcmin, qr(i, j, k))
6114 qms(k) = max(qcmin, qs(i, j, k))
6115 qmg(k) = max(qcmin, qg(i, j, k))
6119 denfac(k) = sqrt(den(npz) / den(k))
6126 if (radr_flag .eq. 3)
then
6127 call term_rsg (1, npz, qmr, den, denfac, vr_fac, blinr, &
6128 mur, tvar, tvbr, vr_max, const_vr, vtr)
6132 if (rads_flag .eq. 3)
then
6133 call term_rsg (1, npz, qms, den, denfac, vs_fac, blins, &
6134 mus, tvas, tvbs, vs_max, const_vs, vts)
6138 if (radg_flag .eq. 3)
then
6139 if (do_hail .and. .not. do_inline_mp)
then
6140 call term_rsg (1, npz, qmg, den, denfac, vg_fac, blinh, &
6141 muh, tvah, tvbh, vg_max, const_vg, vtg)
6144 call term_rsg (1, npz, qmg, den, denfac, vg_fac, bling, &
6145 mug, tvag, tvbg, vg_max, const_vg, vtg)
6154 do k = mp_top + 1, npz
6158 qden = den(k) * qmr(k)
6159 if (qmr(k) .gt. qcmin)
then
6160 call cal_pc_ed_oe_rr_tv (qmr(k), den(k), blinr, mur, &
6161 rra = rrar, rrb = rrbr, rr = fac_r)
6165 if (radr_flag .eq. 1 .or. radr_flag .eq. 2)
then
6166 z_e = z_e + fac_r * 1.e18
6168 if (radr_flag .eq. 3)
then
6169 z_e = z_e + mp_const * exp(1.6 * log(qden * vtr(k)))
6174 qden = den(k) * qms(k)
6175 if (qms(k) .gt. qcmin)
then
6176 call cal_pc_ed_oe_rr_tv (qms(k), den(k), blins, mus, &
6177 rra = rras, rrb = rrbs, rr = fac_s)
6181 if (rads_flag .eq. 1)
then
6182 if (pt(i, j, k) .lt. tice)
then
6183 z_e = z_e + fac_s * 1.e18 * alpha * (rhos / rhor) ** 2
6185 z_e = z_e + fac_s * 1.e18 * alpha * (rhos / rhor) ** 2 / alpha
6188 if (rads_flag .eq. 2)
then
6189 if (pt(i, j, k) .lt. tice)
then
6190 z_e = z_e + fac_s * 1.e18 * alpha * (rhos / rhoi) ** 2
6192 z_e = z_e + fac_s * 1.e18
6195 if (rads_flag .eq. 3)
then
6196 z_e = z_e + mp_const * exp(1.6 * log(qden * vts(k)))
6201 qden = den(k) * qmg(k)
6202 if (do_hail .and. .not. do_inline_mp)
then
6203 if (qmg(k) .gt. qcmin)
then
6204 call cal_pc_ed_oe_rr_tv (qmg(k), den(k), blinh, muh, &
6205 rra = rrah, rrb = rrbh, rr = fac_g)
6209 if (radg_flag .eq. 1)
then
6210 if (pt(i, j, k) .lt. tice)
then
6211 z_e = z_e + fac_g * 1.e18 * alpha * (rhoh / rhor) ** 2
6213 z_e = z_e + fac_g * 1.e18 * alpha * (rhoh / rhor) ** 2 / alpha
6216 if (radg_flag .eq. 2)
then
6217 z_e = z_e + fac_g * 1.e18
6220 if (qmg(k) .gt. qcmin)
then
6221 call cal_pc_ed_oe_rr_tv (qmg(k), den(k), bling, mug, &
6222 rra = rrag, rrb = rrbg, rr = fac_g)
6226 if (radg_flag .eq. 1)
then
6227 if (pt(i, j, k) .lt. tice)
then
6228 z_e = z_e + fac_g * 1.e18 * alpha * (rhog / rhor) ** 2
6230 z_e = z_e + fac_g * 1.e18 * alpha * (rhog / rhor) ** 2 / alpha
6233 if (radg_flag .eq. 2)
then
6234 z_e = z_e + fac_g * 1.e18
6237 if (radg_flag .eq. 3)
then
6238 z_e = z_e + mp_const * exp(1.6 * log(qden * vtg(k)))
6242 dbz(i, j, k) = 10. * log10(max(0.01, z_e))
6245 do k = mp_top + 1, npz
6246 maxdbz(i, j) = max(dbz(i, j, k), maxdbz(i, j))
6249 allmax = max(maxdbz(i, j), allmax)
6254end subroutine rad_ref
6260function mhc3 (qv, q_liq, q_sol)
6264 real (kind = r8) :: mhc3
6270 real(kind_phys),
intent (in) :: qv, q_liq, q_sol
6276 mhc3 = one_r8 + qv * c1_vap + q_liq * c1_liq + q_sol * c1_ice
6284function mhc4 (qd, qv, q_liq, q_sol)
6288 real (kind = r8) :: mhc4
6294 real(kind_phys),
intent (in) :: qv, q_liq, q_sol
6296 real (kind = r8),
intent (in) :: qd
6302 mhc4 = qd + qv * c1_vap + q_liq * c1_liq + q_sol * c1_ice
6310function mhc6 (qv, ql, qr, qi, qs, qg)
6314 real (kind = r8) :: mhc6
6320 real(kind_phys),
intent (in) :: qv, ql, qr, qi, qs, qg
6326 real(kind_phys) :: q_liq, q_sol
6329 q_sol = qi + qs + qg
6330 mhc6 = mhc(qv, q_liq, q_sol)
6338function mte (qv, ql, qr, qi, qs, qg, tk, dp, moist_q)
6342 real (kind = r8) :: mte
6348 logical,
intent (in) :: moist_q
6350 real(kind_phys),
intent (in) :: qv, ql, qr, qi, qs, qg, dp
6352 real (kind = r8),
intent (in) :: tk
6358 real(kind_phys) :: q_liq, q_sol, q_cond
6360 real (kind = r8) :: cvm, con_r8
6363 q_sol = qi + qs + qg
6364 q_cond = q_liq + q_sol
6365 con_r8 = one_r8 - (qv + q_cond)
6367 cvm = mhc(con_r8, qv, q_liq, q_sol)
6369 cvm = mhc(qv, q_liq, q_sol)
6371 mte = rgrav * cvm * c_air * tk * dp
6379subroutine mtetw (ks, ke, qv, ql, qr, qi, qs, qg, tz, ua, va, wa, delp, &
6380 dte, vapor, water, rain, ice, snow, graupel, sen, stress, dts, &
6381 te, tw, te_b, tw_b, moist_q, hydrostatic, te_loss)
6389 integer,
intent (in) :: ks, ke
6391 logical,
intent (in) :: moist_q, hydrostatic
6393 real(kind_phys),
intent (in) :: vapor, water, rain, ice, snow, graupel, dts, sen, stress
6395 real(kind_phys),
intent (in),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg, ua, va, wa, delp
6397 real (kind = r8),
intent (in) :: dte
6399 real (kind = r8),
intent (in),
dimension (ks:ke) :: tz
6401 real (kind = r8),
intent (out) :: te_b, tw_b
6403 real (kind = r8),
intent (out),
optional :: te_loss
6405 real (kind = r8),
intent (out),
dimension (ks:ke) :: te, tw
6413 real(kind_phys) :: q_cond
6415 real (kind = r8) :: con_r8
6417 real(kind_phys),
dimension (ks:ke) :: q_liq, q_sol
6419 real (kind = r8),
dimension (ks:ke) :: cvm
6422 q_liq(k) = ql(k) + qr(k)
6423 q_sol(k) = qi(k) + qs(k) + qg(k)
6424 q_cond = q_liq(k) + q_sol(k)
6425 con_r8 = one_r8 - (qv(k) + q_cond)
6427 cvm(k) = mhc(con_r8, qv(k), q_liq(k), q_sol(k))
6429 cvm(k) = mhc(qv(k), q_liq(k), q_sol(k))
6431 te(k) = (cvm(k) * tz(k) + lv00 * qv(k) - li00 * q_sol(k)) * c_air
6432 if (hydrostatic)
then
6433 te(k) = te(k) + 0.5 * (ua(k) ** 2 + va(k) ** 2)
6435 te(k) = te(k) + 0.5 * (ua(k) ** 2 + va(k) ** 2 + wa(k) ** 2)
6437 te(k) = rgrav * te(k) * delp(k)
6438 tw(k) = rgrav * (qv(k) + q_cond) * delp(k)
6440 te_b = (dte + (lv00 * c_air * vapor - li00 * c_air * (ice + snow + graupel)) * dts / 86400 + sen * dts + stress * dts)
6441 tw_b = (vapor + water + rain + ice + snow + graupel) * dts / 86400
6443 if (
present (te_loss))
then
6454subroutine cal_mhc_lhc (ks, ke, qv, ql, qr, qi, qs, qg, q_liq, q_sol, &
6455 cvm, te8, tz, lcpk, icpk, tcpk, tcp3)
6463 integer,
intent (in) :: ks, ke
6465 real(kind_phys),
intent (in),
dimension (ks:ke) :: qv, ql, qr, qi, qs, qg
6467 real (kind = r8),
intent (in),
dimension (ks:ke) :: tz
6469 real(kind_phys),
intent (out),
dimension (ks:ke) :: q_liq, q_sol, lcpk, icpk, tcpk, tcp3
6471 real (kind = r8),
intent (out),
dimension (ks:ke) :: cvm, te8
6480 q_liq(k) = ql(k) + qr(k)
6481 q_sol(k) = qi(k) + qs(k) + qg(k)
6482 cvm(k) = mhc(qv(k), q_liq(k), q_sol(k))
6483 te8(k) = cvm(k) * tz(k) + lv00 * qv(k) - li00 * q_sol(k)
6484 lcpk(k) = (lv00 + d1_vap * tz(k)) / cvm(k)
6485 icpk(k) = (li00 + d1_ice * tz(k)) / cvm(k)
6486 tcpk(k) = (li20 + (d1_vap + d1_ice) * tz(k)) / cvm(k)
6487 tcp3(k) = lcpk(k) + icpk(k) * min(1., dim(tice, tz(k)) / (tice - t_wfr))
6490end subroutine cal_mhc_lhc
6496subroutine update_qq (qv, ql, qr, qi, qs, qg, dqv, dql, dqr, dqi, dqs, dqg)
6504 real(kind_phys),
intent (in) :: dqv, dql, dqr, dqi, dqs, dqg
6506 real(kind_phys),
intent (inout) :: qv, ql, qr, qi, qs, qg
6515end subroutine update_qq
6521subroutine update_qt (qv, ql, qr, qi, qs, qg, dqv, dql, dqr, dqi, dqs, dqg, te8, &
6522 cvm, tk, lcpk, icpk, tcpk, tcp3)
6530 real(kind_phys),
intent (in) :: dqv, dql, dqr, dqi, dqs, dqg
6532 real (kind = r8),
intent (in) :: te8
6534 real(kind_phys),
intent (inout) :: qv, ql, qr, qi, qs, qg
6536 real(kind_phys),
intent (out) :: lcpk, icpk, tcpk, tcp3
6538 real (kind = r8),
intent (out) :: cvm, tk
6551 cvm = mhc(qv, ql, qr, qi, qs, qg)
6552 tk = (te8 - lv00 * qv + li00 * (qi + qs + qg)) / cvm
6554 lcpk = (lv00 + d1_vap * tk) / cvm
6555 icpk = (li00 + d1_ice * tk) / cvm
6556 tcpk = (li20 + (d1_vap + d1_ice) * tk) / cvm
6557 tcp3 = lcpk + icpk * min(1., dim(tice, tk) / (tice - t_wfr))
6559end subroutine update_qt
6567subroutine cal_pc_ed_oe_rr_tv (q, den, blin, mu, pca, pcb, pc, eda, edb, ed, &
6568 oea, oeb, oe, rra, rrb, rr, tva, tvb, tv)
6576 real(kind_phys),
intent (in) :: blin, mu
6578 real(kind_phys),
intent (in) :: q, den
6580 real (kind = r8),
intent (in),
optional :: pca, pcb, eda, edb, oea, oeb, rra, rrb, tva, tvb
6582 real(kind_phys),
intent (out),
optional :: pc, ed, oe, rr, tv
6584 if (
present (pca) .and.
present (pcb) .and.
present (pc))
then
6585 pc = pca / pcb * exp(mu / (mu + 3) * log(6 * den * q))
6587 if (
present (eda) .and.
present (edb) .and.
present (ed))
then
6588 ed = eda / edb * exp(1. / (mu + 3) * log(6 * den * q))
6590 if (
present (oea) .and.
present (oeb) .and.
present (oe))
then
6591 oe = oea / oeb * exp((mu + 2) / (mu + 3) * log(6 * den * q))
6593 if (
present (rra) .and.
present (rrb) .and.
present (rr))
then
6594 rr = rra / rrb * exp((mu + 6) / (mu + 3) * log(6 * den * q))
6596 if (
present (tva) .and.
present (tvb) .and.
present (tv))
then
6597 tv = tva / tvb * exp(blin / (mu + 3) * log(6 * den * q))
6600end subroutine cal_pc_ed_oe_rr_tv
6612 if (.not. tables_are_initialized)
then
6614 allocate (table0(length))
6615 allocate (table1(length))
6616 allocate (table2(length))
6617 allocate (table3(length))
6618 allocate (table4(length))
6620 allocate (des0(length))
6621 allocate (des1(length))
6622 allocate (des2(length))
6623 allocate (des3(length))
6624 allocate (des4(length))
6626 call qs_table0 (length)
6627 call qs_table1 (length)
6628 call qs_table2 (length)
6629 call qs_table3 (length)
6630 call qs_table4 (length)
6632 do i = 1, length - 1
6633 des0(i) = max(0., table0(i + 1) - table0(i))
6634 des1(i) = max(0., table1(i + 1) - table1(i))
6635 des2(i) = max(0., table2(i + 1) - table2(i))
6636 des3(i) = max(0., table3(i + 1) - table3(i))
6637 des4(i) = max(0., table4(i + 1) - table4(i))
6639 des0(length) = des0(length - 1)
6640 des1(length) = des1(length - 1)
6641 des2(length) = des2(length - 1)
6642 des3(length) = des3(length - 1)
6643 des4(length) = des4(length - 1)
6645 tables_are_initialized = .true.
6649end subroutine qs_init
6655subroutine qs_table_core (n, n_blend, do_smith_table, table)
6663 integer,
intent (in) :: n, n_blend
6665 logical,
intent (in) :: do_smith_table
6667 real(kind_phys),
intent (out),
dimension (n) :: table
6674 integer,
parameter :: n_min = 1600
6676 real (kind = r8) :: delt = 0.1
6677 real (kind = r8) :: tmin, tem, esh
6678 real (kind = r8) :: wice, wh2o, fac0, fac1, fac2
6679 real (kind = r8) :: esbasw, tbasw, esbasi, a, b, c, d, e
6680 real (kind = r8) :: esupc(n_blend)
6685 tmin = tice - n_min * delt
6691 if (do_smith_table)
then
6693 tem = tmin + delt * real(i - 1, kind=kind_phys)
6694 a = - 9.09718 * (tice / tem - 1.)
6695 b = - 3.56654 * log10(tice / tem)
6696 c = 0.876793 * (1. - tem / tice)
6698 table(i) = 0.1 * exp((a + b + c + e) * log(10.))
6702 tem = tmin + delt * real(i - 1, kind=kind_phys)
6703 fac0 = (tem - tice) / (tem * tice)
6705 fac2 = (d2_ice * log(tem / tice) + fac1) / rvgas
6706 table(i) = e00 * exp(fac2)
6714 if (do_smith_table)
then
6715 do i = 1, n - n_min + n_blend
6716 tem = tice + delt * (real(i - 1, kind=kind_phys) - n_blend)
6717 a = - 7.90298 * (tbasw / tem - 1.)
6718 b = 5.02808 * log10(tbasw / tem)
6719 c = - 1.3816e-7 * (exp((1. - tem / tbasw) * 11.344 * log(10.)) - 1.)
6720 d = 8.1328e-3 * (exp((tbasw / tem - 1.) * (- 3.49149) * log(10.)) - 1.)
6722 esh = 0.1 * exp((a + b + c + d + e) * log(10.))
6723 if (i .le. n_blend)
then
6726 table(i + n_min - n_blend) = esh
6730 do i = 1, n - n_min + n_blend
6731 tem = tice + delt * (real(i - 1, kind=kind_phys) - n_blend)
6732 fac0 = (tem - tice) / (tem * tice)
6734 fac2 = (dc_vap * log(tem / tice) + fac1) / rvgas
6735 esh = e00 * exp(fac2)
6736 if (i .le. n_blend)
then
6739 table(i + n_min - n_blend) = esh
6749 tem = tice + delt * (real(i - 1, kind=kind_phys) - n_blend)
6750 wice = 1.0 / (delt * n_blend) * (tice - tem)
6751 wh2o = 1.0 / (delt * n_blend) * (tem - tice + delt * n_blend)
6752 table(i + n_min - n_blend) = wice * table(i + n_min - n_blend) + wh2o * esupc(i)
6755end subroutine qs_table_core
6763subroutine qs_table0 (n)
6771 integer,
intent (in) :: n
6779 real (kind = r8) :: delt = 0.1
6780 real (kind = r8) :: tmin, tem, fac0, fac1, fac2
6789 tem = tmin + delt * real(i - 1, kind=kind_phys)
6790 fac0 = (tem - tice) / (tem * tice)
6792 fac2 = (dc_vap * log(tem / tice) + fac1) / rvgas
6793 table0(i) = e00 * exp(fac2)
6796end subroutine qs_table0
6804subroutine qs_table1 (n)
6812 integer,
intent (in) :: n
6814 call qs_table_core (n, 200, .false., table1)
6816end subroutine qs_table1
6825subroutine qs_table2 (n)
6833 integer,
intent (in) :: n
6835 call qs_table_core (n, 0, .false., table2)
6837end subroutine qs_table2
6845subroutine qs_table3 (n)
6853 integer,
intent (in) :: n
6855 call qs_table_core (n, 200, .true., table3)
6857end subroutine qs_table3
6865subroutine qs_table4 (n)
6873 integer,
intent (in) :: n
6875 call qs_table_core (n, 0, .true., table4)
6877end subroutine qs_table4
6883function es_core (length, tk, table, des)
6887 real(kind_phys) :: es_core
6893 integer,
intent (in) :: length
6895 real(kind_phys),
intent (in) :: tk
6897 real(kind_phys),
intent (in),
dimension (length) :: table, des
6905 real(kind_phys) :: ap1, tmin
6907 if (.not. tables_are_initialized)
call qs_init
6910 ap1 = 10. * dim(tk, tmin) + 1.
6911 ap1 = min(2621., ap1)
6913 es_core = table(it) + (ap1 - it) * des(it)
6921function qs_core (length, tk, den, dqdt, table, des)
6925 real(kind_phys) :: qs_core
6931 integer,
intent (in) :: length
6933 real(kind_phys),
intent (in) :: tk, den
6935 real(kind_phys),
intent (in),
dimension (length) :: table, des
6937 real(kind_phys),
intent (out) :: dqdt
6945 real(kind_phys) :: ap1, tmin
6948 ap1 = 10. * dim(tk, tmin) + 1.
6949 ap1 = min(2621., ap1)
6950 qs_core = es_core(length, tk, table, des) / (rvgas * tk * den)
6952 dqdt = 10. * (des(it) + (ap1 - it) * (des(it + 1) - des(it))) / (rvgas * tk * den)
6966 real(kind_phys) :: wes_t
6972 real(kind_phys),
intent (in) :: tk
6974 wes_t = es_core(length, tk, table0, des0)
6987 real(kind_phys) :: mes_t
6993 real(kind_phys),
intent (in) :: tk
6995 mes_t = es_core(length, tk, table1, des1)
7009 real(kind_phys) :: ies_t
7015 real(kind_phys),
intent (in) :: tk
7017 ies_t = es_core(length, tk, table2, des2)
7027function wqs_trho (tk, den, dqdt)
7031 real(kind_phys) :: wqs_trho
7037 real(kind_phys),
intent (in) :: tk, den
7039 real(kind_phys),
intent (out) :: dqdt
7041 wqs_trho = qs_core(length, tk, den, dqdt, table0, des0)
7043end function wqs_trho
7050function mqs_trho (tk, den, dqdt)
7054 real(kind_phys) :: mqs_trho
7060 real(kind_phys),
intent (in) :: tk, den
7062 real(kind_phys),
intent (out) :: dqdt
7064 mqs_trho = qs_core(length, tk, den, dqdt, table1, des1)
7066end function mqs_trho
7074function iqs_trho (tk, den, dqdt)
7078 real(kind_phys) :: iqs_trho
7084 real(kind_phys),
intent (in) :: tk, den
7086 real(kind_phys),
intent (out) :: dqdt
7088 iqs_trho = qs_core(length, tk, den, dqdt, table2, des2)
7090end function iqs_trho
7098function wqs_ptqv (tk, pa, qv, dqdt)
7102 real(kind_phys) :: wqs_ptqv
7108 real(kind_phys),
intent (in) :: tk, pa, qv
7110 real(kind_phys),
intent (out) :: dqdt
7116 real(kind_phys) :: den
7118 den = pa / (rdgas * tk * (1. + zvir * qv))
7120 wqs_ptqv =
wqs(tk, den, dqdt)
7122end function wqs_ptqv
7129function mqs_ptqv (tk, pa, qv, dqdt)
7133 real(kind_phys) :: mqs_ptqv
7139 real(kind_phys),
intent (in) :: tk, pa, qv
7141 real(kind_phys),
intent (out) :: dqdt
7147 real(kind_phys) :: den
7149 den = pa / (rdgas * tk * (1. + zvir * qv))
7151 mqs_ptqv =
mqs(tk, den, dqdt)
7153end function mqs_ptqv
7161function iqs_ptqv (tk, pa, qv, dqdt)
7165 real(kind_phys) :: iqs_ptqv
7171 real(kind_phys),
intent (in) :: tk, pa, qv
7173 real(kind_phys),
intent (out) :: dqdt
7179 real(kind_phys) :: den
7181 den = pa / (rdgas * tk * (1. + zvir * qv))
7183 iqs_ptqv = iqs(tk, den, dqdt)
7185end function iqs_ptqv
7193subroutine mqs3d (im, km, ks, tk, pa, qv, qs, dqdt)
7201 integer,
intent (in) :: im, km, ks
7203 real(kind_phys),
intent (in),
dimension (im, ks:km) :: tk, pa, qv
7205 real(kind_phys),
intent (out),
dimension (im, ks:km) :: qs
7207 real(kind_phys),
intent (out),
dimension (im, ks:km),
optional :: dqdt
7215 real(kind_phys) :: dqdt0
7217 if (
present (dqdt))
then
7220 qs(i, k) =
mqs(tk(i, k), pa(i, k), qv(i, k), dqdt(i, k))
7226 qs(i, k) =
mqs(tk(i, k), pa(i, k), qv(i, k), dqdt0)
7238function wet_bulb_core (qv, tk, den, lcp)
7242 real(kind_phys) :: wet_bulb_core
7248 real(kind_phys),
intent (in) :: qv, tk, den, lcp
7254 logical :: do_adjust = .false.
7256 real(kind_phys) :: factor = 1. / 3.
7257 real(kind_phys) :: qsat, tp, dqdt
7260 qsat =
wqs(wet_bulb_core, den, dqdt)
7261 tp = factor * (qsat - qv) / (1. + lcp * dqdt) * lcp
7262 wet_bulb_core = wet_bulb_core - tp
7264 if (do_adjust .and. tp .gt. 0.0)
then
7265 qsat =
wqs(wet_bulb_core, den, dqdt)
7266 tp = (qsat - qv) / (1. + lcp * dqdt) * lcp
7267 wet_bulb_core = wet_bulb_core - tp
7270end function wet_bulb_core
7276function wet_bulb_dry (qv, tk, den)
7280 real(kind_phys) :: wet_bulb_dry
7286 real(kind_phys),
intent (in) :: qv, tk, den
7292 real(kind_phys) :: lcp
7296 wet_bulb_dry = wet_bulb_core(qv, tk, den, lcp)
7298end function wet_bulb_dry
7304function wet_bulb_moist (qv, ql, qi, qr, qs, qg, tk, den)
7308 real(kind_phys) :: wet_bulb_moist
7314 real(kind_phys),
intent (in) :: qv, ql, qi, qr, qs, qg, tk, den
7320 real(kind_phys) :: lcp, q_liq, q_sol
7322 real (kind = r8) :: cvm
7325 q_sol = qi + qs + qg
7326 cvm = mhc(qv, q_liq, q_sol)
7327 lcp = (lv00 + d1_vap * tk) / cvm
7329 wet_bulb_moist = wet_bulb_core(qv, tk, den, lcp)
7331end function wet_bulb_moist
7333end module gfdl_cloud_microphys_v3_mod