46 tau_r2g, tau_smlt, tau_g2r, dw_land, dw_ocean, vi_fac, vr_fac, &
47 vs_fac, vg_fac, ql_mlt, do_qa, fix_negative, vi_max, vs_max, &
48 vg_max, vr_max, qs_mlt, qs0_crt, qi_gen, ql0_max, qi0_max, &
49 qi0_crt, qr0_crt, fast_sat_adj, rh_inc, rh_ins, rh_inr, const_vi, &
50 const_vs, const_vg, const_vr, use_ccn, rthresh, ccn_l, ccn_o, &
51 qc_crt, tau_g2v, tau_v2g, sat_adj0, c_piacr, tau_imlt, tau_v2l, &
52 tau_l2v, tau_i2s, tau_l2r, qi_lim, ql_gen, c_paut, c_psaci, &
53 c_pgacs, z_slope_liq, z_slope_ice, prog_ccn, c_cracw, alin, clin, &
54 tice, rad_snow, rad_graupel, rad_rain, cld_min, use_ppm, &
55 mono_prof, do_sedi_heat, sedi_transport, do_sedi_w, de_ice, &
56 icloud_f, irain_f, mp_print, reiflag, rewmin, rewmax, reimin, &
57 reimax, rermin, rermax, resmin, resmax, regmin, regmax, tintqs, &
70 real :: missing_value = - 1.e10
72 logical :: module_is_initialized = .false.
73 logical :: qsmith_tables_initialized = .false.
75 character (len = 20) :: mod_name =
'gfdl_cloud_microphys'
77 real,
parameter :: n0r = 8.0e6, n0s = 3.0e6, n0g = 4.0e6
78 real,
parameter :: rhos = 0.1e3, rhog = 0.4e3
79 real,
parameter :: grav = 9.80665
80 real,
parameter :: rdgas = 287.05
81 real,
parameter :: rvgas = 461.50
82 real,
parameter :: cp_air = 1004.6
83 real,
parameter :: hlv = 2.5e6
84 real,
parameter :: hlf = 3.3358e5
85 real,
parameter :: pi = 3.1415926535897931
90 real,
parameter :: cp_vap = 4.0 * rvgas
92 real,
parameter :: cv_air = cp_air - rdgas
94 real,
parameter :: cv_vap = 3.0 * rvgas
100 real,
parameter :: c_ice = 1972.0
101 real,
parameter :: c_liq = 4185.5
104 real,
parameter :: eps = rdgas / rvgas
105 real,
parameter :: zvir = rvgas / rdgas - 1.
107 real,
parameter :: t_ice = 273.16
108 real,
parameter :: table_ice = 273.16
111 real,
parameter :: e00 = 611.21
113 real,
parameter :: dc_vap = cp_vap - c_liq
114 real,
parameter :: dc_ice = c_liq - c_ice
116 real,
parameter :: hlv0 = hlv
118 real,
parameter :: hlf0 = hlf
121 real,
parameter :: lv0 = hlv0 - dc_vap * t_ice
122 real,
parameter :: li00 = hlf0 - dc_ice * t_ice
124 real,
parameter :: d2ice = dc_vap + dc_ice
125 real,
parameter :: li2 = lv0 + li00
127 real,
parameter :: qrmin = 1.e-8
128 real,
parameter :: qvmin = 1.e-20
129 real,
parameter :: qcmin = 1.e-12
131 real,
parameter :: vr_min = 1.e-3
132 real,
parameter :: vf_min = 1.e-5
134 real,
parameter :: dz_min = 1.e-2
136 real,
parameter :: sfcrho = 1.2
137 real,
parameter :: rhor = 1.e3
140 real,
parameter :: rnzr = 8.0e6
141 real,
parameter :: rnzs = 3.0e6
142 real,
parameter :: rnzg = 4.0e6
143 real,
parameter :: rnzh = 4.0e4
147 real,
parameter :: rhoh = 0.917e3
149 public rhor, rhos, rhog, rhoh, rnzr, rnzs, rnzg, rnzh
150 real :: cracs, csacr, cgacr, cgacs, csacw, craci, csaci, cgacw, cgaci, cracw
152 real :: cssub (5), cgsub (5), crevp (5), cgfr (2), csmlt (5), cgmlt (5)
155 real :: pie, rgrav, fac_rc
158 real :: lati, latv, lats, lat2, lcp, icp, tcp
164 logical :: do_setup = .true.
165 logical :: p_nonhydro = .false.
167 real,
allocatable :: table (:), table2 (:), table3 (:), tablew (:)
168 real,
allocatable :: des (:), des2 (:), des3 (:), desw (:)
170 logical :: tables_are_initialized = .false.
175 real,
parameter :: dt_fr = 8.
188 real :: log_10, tice0, t_wfr
199 iis, iie, jjs, jje, kks, kke, ktop, kbot, &
200 qv, ql, qr, qi, qs, qg, qa, qn, &
201 qv_dt, ql_dt, qr_dt, qi_dt, qs_dt, qg_dt, qa_dt, pt_dt, pt, w, &
202 uin, vin, udt, vdt, dz, delp, area, dt_in, land, &
203 rain, snow, ice, graupel, hydrostatic, phys_hydrostatic, &
204 p, lradar, refl_10cm, reset, pfils, pflls)
209 integer,
intent (in) :: iis, iie, jjs, jje
210 integer,
intent (in) :: kks, kke
211 integer,
intent (in) :: ktop, kbot
213 real,
intent (in) :: dt_in
215 real,
intent (in),
dimension (iis:iie, jjs:jje) :: area
216 real,
intent (in),
dimension (iis:iie, jjs:jje) :: land
218 real,
intent (in),
dimension (iis:iie, jjs:jje, kks:kke) :: delp, dz, uin, vin
219 real,
intent (in),
dimension (iis:iie, jjs:jje, kks:kke) :: pt, qv, ql, qr, qg, qa, qn
221 real,
intent (inout),
dimension (iis:iie, jjs:jje, kks:kke) :: qi, qs
222 real,
intent (inout),
dimension (iis:iie, jjs:jje, kks:kke) :: pt_dt, qa_dt, udt, vdt, w
223 real,
intent (inout),
dimension (iis:iie, jjs:jje, kks:kke) :: qv_dt, ql_dt, qr_dt
224 real,
intent (inout),
dimension (iis:iie, jjs:jje, kks:kke) :: qi_dt, qs_dt, qg_dt
226 real,
intent (out),
dimension (iis:iie, jjs:jje) :: rain, snow, ice, graupel
228 logical,
intent (in) :: hydrostatic, phys_hydrostatic
231 real,
intent (in),
dimension (iis:iie, jjs:jje, kks:kke) :: p
232 logical,
intent (in) :: lradar
233 real,
intent (out),
dimension (iis:iie, jjs:jje, kks:kke) :: refl_10cm
234 logical,
intent (in) :: reset
235 real,
intent (out),
dimension (iis:iie, jjs:jje, kks:kke) :: pfils, pflls
238 logical :: melti = .false.
240 real :: mpdt, rdt, dts, convt, tot_prec
243 integer :: is, ie, js, je
245 integer :: days, ntimes, kflip
247 real,
dimension (iie-iis+1, jje-jjs+1) :: prec_mp, prec1, cond, w_var, rh0
249 real,
dimension (iie-iis+1, jje-jjs+1,kke-kks+1) :: vt_r, vt_s, vt_g, vt_i, qn2
251 real,
dimension (size(pt,1), size(pt,3)) :: m2_rain, m2_sol
256 real,
dimension(ktop:kbot):: qv1d, t1d, p1d, qr1d, qs1d, qg1d, dbz
271 if (phys_hydrostatic .or. hydrostatic)
then
280 d0_vap = c_vap - c_liq
281 lv00 = hlv0 - d0_vap * t_ice
283 if (hydrostatic) do_sedi_w = .false.
296 tcp = (latv + lati) / cp_air
304 mpdt = min(dt_in, mp_time)
306 ntimes = nint(dt_in / mpdt)
309 dts = dt_in / real(ntimes)
335 call mpdrv (hydrostatic, uin, vin, w, delp, pt, qv, ql, qr, qi, qs, qg,&
336 qa, qn, dz, is, ie, js, je, ks, ke, ktop, kbot, j, dt_in, ntimes, &
337 rain(:, j), snow(:, j), graupel(:, j), ice(:, j), m2_rain, &
338 m2_sol, cond(:, j), area(:, j), land(:, j), udt, vdt, pt_dt, &
339 qv_dt, ql_dt, qr_dt, qi_dt, qs_dt, qg_dt, qa_dt, w_var, vt_r, &
340 vt_s, vt_g, vt_i, qn2)
343 pfils(i, j, k) = m2_sol(i, k)
344 pflls(i, j, k) = m2_rain(i, k)
402 convt = 86400. * rdt * rgrav
405 rain(i, j) = rain(i, j) * convt
406 snow(i, j) = snow(i, j) * convt
407 ice(i, j) = ice(i, j) * convt
408 graupel(i, j) = graupel(i, j) * convt
409 prec_mp(i, j) = rain(i, j) + snow(i, j) + ice(i, j) + graupel(i, j)
490 kflip = kbot-ktop+1-k+1
491 t1d(k) = pt(i,j,kflip)
492 p1d(k) = p(i,j,kflip)
493 qv1d(k) = qv(i,j,kflip)/(1-qv(i,j,kflip))
494 qr1d(k) = qr(i,j,kflip)
495 qs1d(k) = qs(i,j,kflip)
496 qg1d(k) = qg(i,j,kflip)
499 t1d, p1d, dbz, ktop, kbot, i, j, melti)
501 kflip = kbot-ktop+1-k+1
502 refl_10cm(i,j,kflip) = max(-35., dbz(k))
517subroutine mpdrv (hydrostatic, uin, vin, w, delp, pt, qv, ql, qr, qi, qs, &
518 qg, qa, qn, dz, is, ie, js, je, ks, ke, ktop, kbot, j, dt_in, ntimes, &
519 rain, snow, graupel, ice, m2_rain, m2_sol, cond, area1, land, &
520 u_dt, v_dt, pt_dt, qv_dt, ql_dt, qr_dt, qi_dt, qs_dt, qg_dt, qa_dt, &
521 w_var, vt_r, vt_s, vt_g, vt_i, qn2)
525 logical,
intent (in) :: hydrostatic
527 integer,
intent (in) :: j, is, ie, js, je, ks, ke
528 integer,
intent (in) :: ntimes, ktop, kbot
530 real,
intent (in) :: dt_in
532 real,
intent (in),
dimension (is:) :: area1, land
534 real,
intent (in),
dimension (is:, js:, ks:) :: uin, vin, delp, pt, dz
535 real,
intent (in),
dimension (is:, js:, ks:) :: qv, ql, qr, qg, qa, qn
537 real,
intent (inout),
dimension (is:, js:, ks:) :: qi, qs
538 real,
intent (inout),
dimension (is:, js:, ks:) :: u_dt, v_dt, w, pt_dt, qa_dt
539 real,
intent (inout),
dimension (is:, js:, ks:) :: qv_dt, ql_dt, qr_dt, qi_dt, qs_dt, qg_dt
541 real,
intent (inout),
dimension (is:) :: rain, snow, ice, graupel, cond
543 real,
intent (out),
dimension (is:, js:) :: w_var
545 real,
intent (out),
dimension (is:, js:, ks:) :: vt_r, vt_s, vt_g, vt_i, qn2
547 real,
intent (out),
dimension (is:, ks:) :: m2_rain, m2_sol
549 real,
dimension (ktop:kbot) :: qvz, qlz, qrz, qiz, qsz, qgz, qaz
550 real,
dimension (ktop:kbot) :: vtiz, vtsz, vtgz, vtrz
551 real,
dimension (ktop:kbot) :: dp0, dp1, dz0, dz1
552 real,
dimension (ktop:kbot) :: qv0, ql0, qr0, qi0, qs0, qg0, qa0
553 real,
dimension (ktop:kbot) :: t0, den, den0, tz, p1, denfac
554 real,
dimension (ktop:kbot) :: ccn, c_praut, m1_rain, m1_sol, m1
555 real,
dimension (ktop:kbot) :: u0, v0, u1, v1, w1
557 real :: cpaut, rh_adj, rh_rain
558 real :: r1, s1, i1, g1, rdt, ccn0
560 real :: s_leng, t_land, t_ocean, h_var
561 real :: cvm, tmp, omq
562 real :: dqi, qio, qin
566 dts = dt_in / real(ntimes)
596 qio = qiz(k) - dt_in * qi_dt(i, j, k)
597 qin = max(qio, qi0_max)
598 if (qiz(k) > qin)
then
599 qsz(k) = qsz(k) + qiz(k) - qin
601 dqi = (qin - qio) * rdt
602 qs_dt(i, j, k) = qs_dt(i, j, k) + qi_dt(i, j, k) - dqi
614 dp1(k) = delp(i, j, k)
628 dp1(k) = dp1(k) * (1. - qvz(k))
629 omq = dp0(k) / dp1(k)
631 qvz(k) = qvz(k) * omq
632 qlz(k) = qlz(k) * omq
633 qrz(k) = qrz(k) * omq
634 qiz(k) = qiz(k) * omq
635 qsz(k) = qsz(k) * omq
636 qgz(k) = qgz(k) * omq
642 den0(k) = - dp1(k) / (grav * dz0(k))
643 p1(k) = den0(k) * rdgas * t0(k)
682 cpaut = c_paut * 0.104 * grav / 1.717e-5
687 ccn(k) = qn(i, j, k) * 1.e6
688 c_praut(k) = cpaut * (ccn(k) * rhor) ** (- 1. / 3.)
692 ccn0 = (ccn_l * land(i) + ccn_o * (1. - land(i))) * 1.e6
697 ccn0 = ccn0 * rdgas * tz(kbot) / p1(kbot)
699 tmp = cpaut * (ccn0 * rhor) ** (- 1. / 3.)
732 s_leng = sqrt(sqrt(area1(i) / 1.e10))
733 t_land = dw_land * s_leng
734 t_ocean = dw_ocean * s_leng
735 h_var = t_land * land(i) + t_ocean * (1. - land(i))
736 h_var = min(0.20, max(0.01, h_var))
743 rh_adj = 1. - h_var - rh_inc
744 rh_rain = max(0.35, rh_adj - rh_inr)
751 call neg_adj (ktop, kbot, tz, dp1, qvz, qlz, qrz, qiz, qsz, qgz)
767 denfac(k) = sqrt(sfcrho / den(k))
771 dz1(k) = dz0(k) * tz(k) / t0(k)
772 den(k) = den0(k) * dz0(k) / dz1(k)
773 denfac(k) = sqrt(sfcrho / den(k))
781 call warm_rain (dt_rain, ktop, kbot, dp1, dz1, tz, qvz, qlz, qrz, qiz, qsz, &
782 qgz, den, denfac, ccn, c_praut, rh_rain, vtrz, r1, m1_rain, w1, h_var)
784 rain(i) = rain(i) + r1
787 m2_rain(i, k) = m2_rain(i, k) + m1_rain(k)
788 m1(k) = m1(k) + m1_rain(k)
797 call fall_speed (ktop, kbot, den, qsz, qiz, qgz, qlz, tz, vtsz, vtiz, vtgz)
800 call terminal_fall (dts, ktop, kbot, tz, qvz, qlz, qrz, qgz, qsz, qiz, &
801 dz1, dp1, den, vtgz, vtsz, vtiz, r1, g1, s1, i1, m1_sol, w1)
803 rain(i) = rain(i) + r1
804 snow(i) = snow(i) + s1
805 graupel(i) = graupel(i) + g1
813 call sedi_heat (ktop, kbot, dp1, m1_sol, dz1, tz, qvz, qlz, qrz, qiz, &
820 call warm_rain (dt_rain, ktop, kbot, dp1, dz1, tz, qvz, qlz, qrz, qiz, qsz, &
821 qgz, den, denfac, ccn, c_praut, rh_rain, vtrz, r1, m1_rain, w1, h_var)
823 rain(i) = rain(i) + r1
826 m2_rain(i, k) = m2_rain(i, k) + m1_rain(k)
827 m2_sol(i, k) = m2_sol(i, k) + m1_sol(k)
828 m1(k) = m1(k) + m1_rain(k) + m1_sol(k)
835 call icloud (ktop, kbot, tz, p1, qvz, qlz, qrz, qiz, qsz, qgz, dp1, den, &
836 denfac, vtsz, vtgz, vtrz, qaz, rh_adj, rh_rain, dts, h_var)
841 m2_rain(i, :) = m2_rain(i, :) * rdt * rgrav
842 m2_sol(i, :) = m2_sol(i, :) * rdt * rgrav
849 if (sedi_transport)
then
850 do k = ktop + 1, kbot
851 u1(k) = (dp0(k) * u1(k) + m1(k - 1) * u1(k - 1)) / (dp0(k) + m1(k - 1))
852 v1(k) = (dp0(k) * v1(k) + m1(k - 1) * v1(k - 1)) / (dp0(k) + m1(k - 1))
853 u_dt(i, j, k) = u_dt(i, j, k) + (u1(k) - u0(k)) * rdt
854 v_dt(i, j, k) = v_dt(i, j, k) + (v1(k) - v0(k)) * rdt
870 omq = dp1(k) / dp0(k)
871 qv_dt(i, j, k) = qv_dt(i, j, k) + rdt * (qvz(k) - qv0(k)) * omq
872 ql_dt(i, j, k) = ql_dt(i, j, k) + rdt * (qlz(k) - ql0(k)) * omq
873 qr_dt(i, j, k) = qr_dt(i, j, k) + rdt * (qrz(k) - qr0(k)) * omq
874 qi_dt(i, j, k) = qi_dt(i, j, k) + rdt * (qiz(k) - qi0(k)) * omq
875 qs_dt(i, j, k) = qs_dt(i, j, k) + rdt * (qsz(k) - qs0(k)) * omq
876 qg_dt(i, j, k) = qg_dt(i, j, k) + rdt * (qgz(k) - qg0(k)) * omq
877 cvm = c_air + qvz(k) * c_vap + (qrz(k) + qlz(k)) * c_liq + (qiz(k) + qsz(k) + qgz(k)) * c_ice
878 pt_dt(i, j, k) = pt_dt(i, j, k) + rdt * (tz(k) - t0(k)) * cvm / cp_air
889 qa_dt(i, j, k) = qa_dt(i, j, k) + rdt * (qaz(k) / real(ntimes) - qa0(k))
940subroutine sedi_heat (ktop, kbot, dm, m1, dz, tz, qv, ql, qr, qi, qs, qg, cw)
946 integer,
intent (in) :: ktop, kbot
948 real,
intent (in),
dimension (ktop:kbot) :: dm, m1, dz, qv, ql, qr, qi, qs, qg
950 real,
intent (inout),
dimension (ktop:kbot) :: tz
952 real,
intent (in) :: cw
954 real,
dimension (ktop:kbot) :: dgz, cvn
961 dgz(k) = - 0.5 * grav * dz(k)
962 cvn(k) = dm(k) * (cv_air + qv(k) * cv_vap + (qr(k) + ql(k)) * &
963 c_liq + (qi(k) + qs(k) + qg(k)) * c_ice)
976 tmp = cvn(k) + m1(k) * cw
977 tz(k) = (tmp * tz(k) + m1(k) * dgz(k)) / tmp
984 do k = ktop + 1, kbot
985 tz(k) = ((cvn(k) + cw * (m1(k) - m1(k - 1))) * tz(k) + m1(k - 1) * &
986 cw * tz(k - 1) + dgz(k) * (m1(k - 1) + m1(k))) / (cvn(k) + cw * m1(k))
995subroutine warm_rain (dt, ktop, kbot, dp, dz, tz, qv, ql, qr, qi, qs, qg, &
996 den, denfac, ccn, c_praut, rh_rain, vtr, r1, m1_rain, w1, h_var)
1000 integer,
intent (in) :: ktop, kbot
1002 real,
intent (in) :: dt
1003 real,
intent (in) :: rh_rain, h_var
1005 real,
intent (in),
dimension (ktop:kbot) :: dp, dz, den
1006 real,
intent (in),
dimension (ktop:kbot) :: denfac, ccn, c_praut
1008 real,
intent (inout),
dimension (ktop:kbot) :: tz, vtr
1009 real,
intent (inout),
dimension (ktop:kbot) :: qv, ql, qr, qi, qs, qg
1010 real,
intent (inout),
dimension (ktop:kbot) :: m1_rain, w1
1012 real,
intent (out) :: r1
1014 real,
parameter :: so3 = 7. / 3.
1016 real,
dimension (ktop:kbot) :: dl, dm
1017 real,
dimension (ktop:kbot + 1) :: ze, zt
1019 real :: sink, dq, qc0, qc
1028 real,
parameter :: vconr = 2503.23638966667
1029 real,
parameter :: normr = 25132741228.7183
1030 real,
parameter :: thr = 1.e-8
1057 qden = qr(k) * den(k)
1058 if (qr(k) < thr)
then
1061 vtr(k) = vr_fac * vconr * sqrt(min(10., sfcrho / den(k))) * &
1062 exp(0.2 * log(qden / normr))
1063 vtr(k) = min(vr_max, max(vr_min, vtr(k)))
1069 do k = kbot, ktop, - 1
1070 ze(k) = ze(k + 1) - dz(k)
1079 call revap_racc (ktop, kbot, dt5, tz, qv, ql, qr, qi, qs, qg, den, denfac, rh_rain, h_var)
1083 dm(k) = dp(k) * (1. + qv(k) + ql(k) + qr(k) + qi(k) + qs(k) + qg(k))
1094 do k = ktop + 1, kbot
1095 zt(k) = ze(k) - dt5 * (vtr(k - 1) + vtr(k))
1097 zt(kbot + 1) = zs - dt * vtr(kbot)
1100 if (zt(k + 1) >= zt(k)) zt(k + 1) = zt(k) - dz_min
1104 call implicit_fall (dt, ktop, kbot, ze, vtr, dp, qr, r1, m1_rain)
1114 w1(ktop) = (dm(ktop) * w1(ktop) + m1_rain(ktop) * vtr(ktop)) / (dm(ktop) - m1_rain(ktop))
1115 do k = ktop + 1, kbot
1116 w1(k) = (dm(k) * w1(k) - m1_rain(k - 1) * vtr(k - 1) + m1_rain(k) * vtr(k)) &
1117 / (dm(k) + m1_rain(k - 1) - m1_rain(k))
1126 call sedi_heat (ktop, kbot, dp, m1_rain, dz, tz, qv, ql, qr, qi, qs, qg, c_liq)
1133 call revap_racc (ktop, kbot, dt5, tz, qv, ql, qr, qi, qs, qg, den, denfac, rh_rain, h_var)
1143 if (irain_f /= 0)
then
1150 qc0 = fac_rc * ccn(k)
1151 if (tz(k) > t_wfr)
then
1162 sink = min(dq, dt * c_praut(k) * den(k) * exp(so3 * log(ql(k))))
1163 ql(k) = ql(k) - sink
1164 qr(k) = qr(k) + sink
1175 call linear_prof (kbot - ktop + 1, ql(ktop), dl(ktop), z_slope_liq, h_var)
1178 qc0 = fac_rc * ccn(k)
1179 if (tz(k) > t_wfr + dt_fr)
then
1180 dl(k) = min(max(1.e-6, dl(k)), 0.5 * ql(k))
1192 dq = 0.5 * (ql(k) + dl(k) - qc)
1201 sink = min(1., dq / dl(k)) * dt * c_praut(k) * den(k) * exp(so3 * log(ql(k)))
1202 ql(k) = ql(k) - sink
1203 qr(k) = qr(k) + sink
1215subroutine revap_racc (ktop, kbot, dt, tz, qv, ql, qr, qi, qs, qg, den, denfac, rh_rain, h_var)
1219 integer,
intent (in) :: ktop, kbot
1221 real,
intent (in) :: dt
1222 real,
intent (in) :: rh_rain, h_var
1224 real,
intent (in),
dimension (ktop:kbot) :: den, denfac
1226 real,
intent (inout),
dimension (ktop:kbot) :: tz, qv, qr, ql, qi, qs, qg
1228 real,
dimension (ktop:kbot) :: lhl, cvm, q_liq, q_sol, lcpk
1230 real :: dqv, qsat, dqsdt, evap, t2, qden, q_plus, q_minus, sink
1231 real :: qpz, dq, dqh, tin
1237 if (tz(k) > t_wfr .and. qr(k) > qrmin)
then
1243 lhl(k) = lv00 + d0_vap * tz(k)
1244 q_liq(k) = ql(k) + qr(k)
1245 q_sol(k) = qi(k) + qs(k) + qg(k)
1246 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1247 lcpk(k) = lhl(k) / cvm(k)
1249 tin = tz(k) - lcpk(k) * ql(k)
1251 qsat = wqs2(tin, den(k), dqsdt)
1252 dqh = max(ql(k), h_var * max(qpz, qcmin))
1253 dqh = min(dqh, 0.2 * qpz)
1267 if (dqv > qvmin .and. qsat > q_minus)
then
1268 if (qsat > q_plus)
then
1275 dq = 0.25 * (q_minus - qsat) ** 2 / dqh
1277 qden = qr(k) * den(k)
1279 evap = crevp(1) * t2 * dq * (crevp(2) * sqrt(qden) + crevp(3) * &
1280 exp(0.725 * log(qden))) / (crevp(4) * t2 + crevp(5) * qsat * den(k))
1281 evap = min(qr(k), dt * evap, dqv / (1. + lcpk(k) * dqsdt))
1287 qr(k) = qr(k) - evap
1288 qv(k) = qv(k) + evap
1289 q_liq(k) = q_liq(k) - evap
1290 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1291 tz(k) = tz(k) - evap * lhl(k) / cvm(k)
1299 if (qr(k) > qrmin .and. ql(k) > 1.e-6 .and. qsat < q_minus)
then
1300 sink = dt * denfac(k) * cracw * exp(0.95 * log(qr(k) * den(k)))
1301 sink = sink / (1. + sink) * ql(k)
1302 ql(k) = ql(k) - sink
1303 qr(k) = qr(k) + sink
1322 integer,
intent (in) :: km
1324 real,
intent (in) :: q (km), h_var
1326 real,
intent (out) :: dm (km)
1328 logical,
intent (in) :: z_var
1336 dq(k) = 0.5 * (q(k) - q(k - 1))
1346 dm(k) = 0.5 * min(abs(dq(k) + dq(k + 1)), 0.5 * q(k))
1347 if (dq(k) * dq(k + 1) <= 0.)
then
1348 if (dq(k) > 0.)
then
1349 dm(k) = min(dm(k), dq(k), - dq(k + 1))
1363 dm(k) = max(dm(k), qvmin, h_var * q(k))
1367 dm(k) = max(qvmin, h_var * q(k))
1383subroutine icloud (ktop, kbot, tzk, p1, qvk, qlk, qrk, qik, qsk, qgk, dp1, &
1384 den, denfac, vts, vtg, vtr, qak, rh_adj, rh_rain, dts, h_var)
1388 integer,
intent (in) :: ktop, kbot
1390 real,
intent (in),
dimension (ktop:kbot) :: p1, dp1, den, denfac, vts, vtg, vtr
1392 real,
intent (inout),
dimension (ktop:kbot) :: tzk, qvk, qlk, qrk, qik, qsk, qgk, qak
1394 real,
intent (in) :: rh_adj, rh_rain, dts, h_var
1396 real,
dimension (ktop:kbot) :: lcpk, icpk, tcpk, di, lhl, lhi
1397 real,
dimension (ktop:kbot) :: cvm, q_liq, q_sol
1399 real :: rdts, fac_g2v, fac_v2g, fac_i2s, fac_imlt
1400 real :: tz, qv, ql, qr, qi, qs, qg, melt
1401 real :: pracs, psacw, pgacw, psacr, pgacr, pgaci, praci, psaci
1402 real :: pgmlt, psmlt, pgfr, pgaut, psaut, pgsub
1403 real :: tc, tsq, dqs0, qden, qim, qsm
1404 real :: dt5, factor, sink, qi_crt
1405 real :: tmp, qsw, qsi, dqsdt, dq
1406 real :: dtmp, qc, q_plus, q_minus
1418 fac_i2s = 1. - exp(- dts / tau_i2s)
1419 fac_g2v = 1. - exp(- dts / tau_g2v)
1420 fac_v2g = 1. - exp(- dts / tau_v2g)
1422 fac_imlt = 1. - exp(- dt5 / tau_imlt)
1429 lhi(k) = li00 + dc_ice * tzk(k)
1430 q_liq(k) = qlk(k) + qrk(k)
1431 q_sol(k) = qik(k) + qsk(k) + qgk(k)
1432 cvm(k) = c_air + qvk(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1433 icpk(k) = lhi(k) / cvm(k)
1444 if (tzk(k) > tice .and. qik(k) > qcmin)
then
1450 melt = min(qik(k), fac_imlt * (tzk(k) - tice) / icpk(k))
1451 tmp = min(melt, dim(ql_mlt, qlk(k)))
1452 qlk(k) = qlk(k) + tmp
1453 qrk(k) = qrk(k) + melt - tmp
1454 qik(k) = qik(k) - melt
1455 q_liq(k) = q_liq(k) + melt
1456 q_sol(k) = q_sol(k) - melt
1457 cvm(k) = c_air + qvk(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1458 tzk(k) = tzk(k) - melt * lhi(k) / cvm(k)
1460 elseif (tzk(k) < t_wfr .and. qlk(k) > qcmin)
then
1467 dtmp = t_wfr - tzk(k)
1468 factor = min(1., dtmp / dt_fr)
1469 sink = min(qlk(k) * factor, dtmp / icpk(k))
1470 qi_crt = qi_gen * min(qi_lim, 0.1 * (tice - tzk(k))) / den(k)
1471 tmp = min(sink, dim(qi_crt, qik(k)))
1472 qlk(k) = qlk(k) - sink
1473 qsk(k) = qsk(k) + sink - tmp
1474 qik(k) = qik(k) + tmp
1475 q_liq(k) = q_liq(k) - sink
1476 q_sol(k) = q_sol(k) + sink
1477 cvm(k) = c_air + qvk(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1478 tzk(k) = tzk(k) + sink * lhi(k) / cvm(k)
1487 call linear_prof (kbot - ktop + 1, qik(ktop), di(ktop), z_slope_ice, h_var)
1494 lhl(k) = lv00 + d0_vap * tzk(k)
1495 lhi(k) = li00 + dc_ice * tzk(k)
1496 lcpk(k) = lhl(k) / cvm(k)
1497 icpk(k) = lhi(k) / cvm(k)
1498 tcpk(k) = lcpk(k) + icpk(k)
1507 if (p1(k) < p_min) cycle
1521 if (tc .ge. 0.)
then
1527 dqs0 = ces0 / p1(k) - qv
1529 if (qs > qcmin)
then
1536 if (ql > qrmin)
then
1537 factor = denfac(k) * csacw * exp(0.8125 * log(qs * den(k)))
1538 psacw = factor / (1. + dts * factor) * ql
1548 if (qr > qrmin)
then
1549 psacr = min(
acr3d(vts(k), vtr(k), qr, qs, csacr, acco(1, 2), &
1551 pracs =
acr3d(vtr(k), vts(k), qs, qr, cracs, acco(1, 1), den(k))
1562 psmlt = max(0.,
smlt(tc, dqs0, qs * den(k), psacw, psacr, csmlt, &
1564 sink = min(qs, dts * (psmlt + pracs), tc / icpk(k))
1567 tmp = min(sink, dim(qs_mlt, ql))
1569 qr = qr + sink - tmp
1572 q_liq(k) = q_liq(k) + sink
1573 q_sol(k) = q_sol(k) - sink
1574 cvm(k) = c_air + qv * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1575 tz = tz - sink * lhi(k) / cvm(k)
1584 lhi(k) = li00 + dc_ice * tz
1585 icpk(k) = lhi(k) / cvm(k)
1591 if (qg > qcmin .and. tc > 0.)
then
1598 pgacr = min(
acr3d(vtg(k), vtr(k), qr, qg, cgacr, acco(1, 3), &
1606 if (ql > qrmin)
then
1607 factor = cgacw * qden / sqrt(den(k) * sqrt(sqrt(qden)))
1608 pgacw = factor / (1. + dts * factor) * ql
1615 pgmlt = dts * gmlt(tc, dqs0, qden, pgacw, pgacr, cgmlt, den(k))
1616 pgmlt = min(max(0., pgmlt), qg, tc / icpk(k))
1619 q_liq(k) = q_liq(k) + pgmlt
1620 q_sol(k) = q_sol(k) - pgmlt
1621 cvm(k) = c_air + qv * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1622 tz = tz - pgmlt * lhi(k) / cvm(k)
1636 if (qi > 3.e-7)
then
1638 if (qs > 1.e-7)
then
1643 factor = dts * denfac(k) * csaci * exp(0.05 * tc + 0.8125 * log(qs * den(k)))
1644 psaci = factor / (1. + factor) * qi
1655 if (qi0_crt < 0.)
then
1658 qim = qi0_crt / den(k)
1668 tmp = fac_i2s * exp(0.025 * tc)
1671 di(k) = max(di(k), qrmin)
1673 if (q_plus > (qim + qrmin))
then
1674 if (qim > (qi - di(k)))
then
1675 dq = (0.25 * (q_plus - qim) ** 2) / di(k)
1686 sink = min(0.75 * qi, psaci + psaut)
1694 if (qg > 1.e-6)
then
1699 factor = dts * cgaci * sqrt(den(k)) * qg
1700 pgaci = factor / (1. + factor) * qi
1717 if (qr > 1.e-7 .and. tc < 0.)
then
1729 if (qs > 1.e-7)
then
1730 psacr = dts *
acr3d(vts(k), vtr(k), qr, qs, csacr, acco(1, 2), den(k))
1739 pgfr = dts * cgfr(1) / den(k) * (exp(- cgfr(2) * tc) - 1.) * &
1740 exp(1.75 * log(qr * den(k)))
1750 factor = min(sink, qr, - tc / icpk(k)) / max(sink, qrmin)
1752 psacr = factor * psacr
1753 pgfr = factor * pgfr
1759 q_liq(k) = q_liq(k) - sink
1760 q_sol(k) = q_sol(k) + sink
1761 cvm(k) = c_air + qv * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1762 tz = tz + sink * lhi(k) / cvm(k)
1770 lhi(k) = li00 + dc_ice * tz
1771 icpk(k) = lhi(k) / cvm(k)
1777 if (qs > 1.e-7)
then
1783 if (qg > qrmin)
then
1784 sink = dts *
acr3d(vtg(k), vts(k), qs, qg, cgacs, acco(1, 4), den(k))
1793 qsm = qs0_crt / den(k)
1795 factor = dts * 1.e-3 * exp(0.09 * (tz - tice))
1796 sink = sink + factor / (1. + factor) * (qs - qsm)
1798 sink = min(qs, sink)
1804 if (qg > 1.e-7 .and. tz < tice0)
then
1810 if (ql > 1.e-6)
then
1812 factor = dts * cgacw * qden / sqrt(den(k) * sqrt(sqrt(qden)))
1813 pgacw = factor / (1. + factor) * ql
1822 if (qr > 1.e-6)
then
1823 pgacr = min(dts *
acr3d(vtg(k), vtr(k), qr, qg, cgacr, acco(1, 3), &
1829 sink = pgacr + pgacw
1830 factor = min(sink, dim(tice, tz) / icpk(k)) / max(sink, qrmin)
1831 pgacr = factor * pgacr
1832 pgacw = factor * pgacw
1834 sink = pgacr + pgacw
1838 q_liq(k) = q_liq(k) - sink
1839 q_sol(k) = q_sol(k) + sink
1840 cvm(k) = c_air + qv * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1841 tz = tz + sink * lhi(k) / cvm(k)
1861 call subgrid_z_proc (ktop, kbot, p1, den, denfac, dts, rh_adj, tzk, qvk, &
1862 qlk, qrk, qik, qsk, qgk, qak, h_var, rh_rain)
1871 ql, qr, qi, qs, qg, qa, h_var, rh_rain)
1875 integer,
intent (in) :: ktop, kbot
1877 real,
intent (in),
dimension (ktop:kbot) :: p1, den, denfac
1879 real,
intent (in) :: dts, rh_adj, h_var, rh_rain
1881 real,
intent (inout),
dimension (ktop:kbot) :: tz, qv, ql, qr, qi, qs, qg, qa
1883 real,
dimension (ktop:kbot) :: lcpk, icpk, tcpk, tcp3, lhl, lhi
1884 real,
dimension (ktop:kbot) :: cvm, q_liq, q_sol, q_cond
1886 real :: fac_v2l, fac_l2v
1888 real :: pidep, qi_crt
1895 real :: rh, rqi, tin, qsw, qsi, qpz, qstar
1896 real :: dqsdt, dwsdt, dq, dq0, factor, tmp
1897 real :: q_plus, q_minus, dt_evap, dt_pisub
1898 real :: evap, sink, tc, pisub, q_adj, dtmp
1899 real :: pssub, pgsub, tsq, qden, fac_g2v, fac_v2g
1903 if (fast_sat_adj)
then
1913 fac_v2l = 1. - exp(- dt_evap / tau_v2l)
1914 fac_l2v = 1. - exp(- dt_evap / tau_l2v)
1916 fac_g2v = 1. - exp(- dts / tau_g2v)
1917 fac_v2g = 1. - exp(- dts / tau_v2g)
1924 lhl(k) = lv00 + d0_vap * tz(k)
1925 lhi(k) = li00 + dc_ice * tz(k)
1926 q_liq(k) = ql(k) + qr(k)
1927 q_sol(k) = qi(k) + qs(k) + qg(k)
1928 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1929 lcpk(k) = lhl(k) / cvm(k)
1930 icpk(k) = lhi(k) / cvm(k)
1931 tcpk(k) = lcpk(k) + icpk(k)
1932 tcp3(k) = lcpk(k) + icpk(k) * min(1., dim(tice, tz(k)) / (tice - t_wfr))
1937 if (p1(k) < p_min) cycle
1943 if (tz(k) < t_min)
then
1944 sink = dim(qv(k), 1.e-7)
1945 qv(k) = qv(k) - sink
1946 qi(k) = qi(k) + sink
1947 q_sol(k) = q_sol(k) + sink
1948 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
1949 tz(k) = tz(k) + sink * (lhl(k) + lhi(k)) / cvm(k)
1950 if (.not. do_qa) qa(k) = qa(k) + 1.
1958 lhl(k) = lv00 + d0_vap * tz(k)
1959 lhi(k) = li00 + dc_ice * tz(k)
1960 lcpk(k) = lhl(k) / cvm(k)
1961 icpk(k) = lhi(k) / cvm(k)
1962 tcpk(k) = lcpk(k) + icpk(k)
1963 tcp3(k) = lcpk(k) + icpk(k) * min(1., dim(tice, tz(k)) / (tice - t_wfr))
1969 qpz = qv(k) + ql(k) + qi(k)
1970 tin = tz(k) - (lhl(k) * (ql(k) + qi(k)) + lhi(k) * qi(k)) / (c_air + &
1971 qpz * c_vap + qr(k) * c_liq + (qs(k) + qg(k)) * c_ice)
1972 if (tin > t_sub + 6.)
then
1973 rh = qpz / iqs1(tin, den(k))
1974 if (rh < rh_adj)
then
1987 qsw = wqs2(tz(k), den(k), dwsdt)
1994 factor = min(1., fac_l2v * (10. * dq0 / qsw))
1995 evap = min(ql(k), factor * dq0 / (1. + tcp3(k) * dwsdt))
2001 evap = dq0 / (1. + tcp3(k) * dwsdt)
2003 qv(k) = qv(k) + evap
2004 ql(k) = ql(k) - evap
2005 q_liq(k) = q_liq(k) - evap
2006 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2007 tz(k) = tz(k) - evap * lhl(k) / cvm(k)
2013 lhi(k) = li00 + dc_ice * tz(k)
2014 icpk(k) = lhi(k) / cvm(k)
2020 dtmp = t_wfr - tz(k)
2021 if (dtmp > 0. .and. ql(k) > qcmin)
then
2022 sink = min(ql(k), ql(k) * dtmp * 0.125, dtmp / icpk(k))
2023 ql(k) = ql(k) - sink
2024 qi(k) = qi(k) + sink
2025 q_liq(k) = q_liq(k) - sink
2026 q_sol(k) = q_sol(k) + sink
2027 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2028 tz(k) = tz(k) + sink * lhi(k) / cvm(k)
2035 lhi(k) = li00 + dc_ice * tz(k)
2036 icpk(k) = lhi(k) / cvm(k)
2042 if (fast_sat_adj)
then
2043 dt_pisub = 0.5 * dts
2047 if (ql(k) > qrmin .and. tc > 0.)
then
2048 sink = 3.3333e-10 * dts * (exp(0.66 * tc) - 1.) * den(k) * ql(k) * ql(k)
2049 sink = min(ql(k), tc / icpk(k), sink)
2050 ql(k) = ql(k) - sink
2051 qi(k) = qi(k) + sink
2052 q_liq(k) = q_liq(k) - sink
2053 q_sol(k) = q_sol(k) + sink
2054 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2055 tz(k) = tz(k) + sink * lhi(k) / cvm(k)
2063 lhl(k) = lv00 + d0_vap * tz(k)
2064 lhi(k) = li00 + dc_ice * tz(k)
2065 lcpk(k) = lhl(k) / cvm(k)
2066 icpk(k) = lhi(k) / cvm(k)
2067 tcpk(k) = lcpk(k) + icpk(k)
2073 if (tz(k) < tice)
then
2074 qsi = iqs2(tz(k), den(k), dqsdt)
2076 sink = dq / (1. + tcpk(k) * dqsdt)
2077 if (qi(k) > qrmin)
then
2080 pidep = dt_pisub * dq * 349138.78 * exp(0.875 * log(qi(k) * den(k))) &
2081 / (qsi * den(k) * lat2 / (0.0243 * rvgas * tz(k) ** 2) + 4.42478e4)
2089 qi_crt = qi_gen * min(qi_lim, 0.1 * tmp) / den(k)
2090 sink = min(sink, max(qi_crt - qi(k), pidep), tmp / tcpk(k))
2092 pidep = pidep * min(1., dim(tz(k), t_sub) * 0.2)
2093 sink = max(pidep, sink, - qi(k))
2095 qv(k) = qv(k) - sink
2096 qi(k) = qi(k) + sink
2097 q_sol(k) = q_sol(k) + sink
2098 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2099 tz(k) = tz(k) + sink * (lhl(k) + lhi(k)) / cvm(k)
2106 lhl(k) = lv00 + d0_vap * tz(k)
2107 lhi(k) = li00 + dc_ice * tz(k)
2108 lcpk(k) = lhl(k) / cvm(k)
2109 icpk(k) = lhi(k) / cvm(k)
2110 tcpk(k) = lcpk(k) + icpk(k)
2117 if (qs(k) > qrmin)
then
2118 qsi = iqs2(tz(k), den(k), dqsdt)
2119 qden = qs(k) * den(k)
2120 tmp = exp(0.65625 * log(qden))
2122 dq = (qsi - qv(k)) / (1. + tcpk(k) * dqsdt)
2123 pssub = cssub(1) * tsq * (cssub(2) * sqrt(qden) + cssub(3) * tmp * &
2124 sqrt(denfac(k))) / (cssub(4) * tsq + cssub(5) * qsi * den(k))
2125 pssub = (qsi - qv(k)) * dts * pssub
2126 if (pssub > 0.)
then
2127 pssub = min(pssub * min(1., dim(tz(k), t_sub) * 0.2), qs(k))
2129 if (tz(k) > tice)
then
2132 pssub = max(pssub, dq, (tz(k) - tice) / tcpk(k))
2135 qs(k) = qs(k) - pssub
2136 qv(k) = qv(k) + pssub
2137 q_sol(k) = q_sol(k) - pssub
2138 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2139 tz(k) = tz(k) - pssub * (lhl(k) + lhi(k)) / cvm(k)
2146 lhl(k) = lv00 + d0_vap * tz(k)
2147 lhi(k) = li00 + dc_ice * tz(k)
2148 lcpk(k) = lhl(k) / cvm(k)
2149 icpk(k) = lhi(k) / cvm(k)
2150 tcpk(k) = lcpk(k) + icpk(k)
2156 if (qg(k) > qrmin)
then
2157 qsi = iqs2(tz(k), den(k), dqsdt)
2158 dq = (qv(k) - qsi) / (1. + tcpk(k) * dqsdt)
2159 pgsub = (qv(k) / qsi - 1.) * qg(k)
2160 if (pgsub > 0.)
then
2161 if (tz(k) > tice)
then
2164 pgsub = min(fac_v2g * pgsub, 0.2 * dq, ql(k) + qr(k), &
2165 (tice - tz(k)) / tcpk(k))
2168 pgsub = max(fac_g2v * pgsub, dq) * min(1., dim(tz(k), t_sub) * 0.1)
2170 qg(k) = qg(k) + pgsub
2171 qv(k) = qv(k) - pgsub
2172 q_sol(k) = q_sol(k) + pgsub
2173 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2174 tz(k) = tz(k) + pgsub * (lhl(k) + lhi(k)) / cvm(k)
2182 lhl(k) = lv00 + d0_vap * tz(k)
2183 lcpk(k) = lhl(k) / cvm(k)
2189 if (qr(k) > qcmin)
then
2190 qsw = wqs2(tz(k), den(k), dqsdt)
2191 sink = min(qr(k), dim(rh_rain * qsw, qv(k)) / (1. + lcpk(k) * dqsdt))
2192 qv(k) = qv(k) + sink
2193 qr(k) = qr(k) - sink
2194 q_liq(k) = q_liq(k) - sink
2195 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2196 tz(k) = tz(k) - sink * lhl(k) / cvm(k)
2204 lhl(k) = lv00 + d0_vap * tz(k)
2205 cvm(k) = c_air + (qv(k) + q_liq(k) + q_sol(k)) * c_vap
2206 lcpk(k) = lhl(k) / cvm(k)
2219 q_sol(k) = qi(k) + qs(k)
2224 q_liq(k) = ql(k) + qr(k)
2228 q_cond(k) = q_liq(k) + q_sol(k)
2230 qpz = qv(k) + q_cond(k)
2236 tin = tz(k) - (lcpk(k) * q_cond(k) + icpk(k) * q_sol(k))
2244 if (tin <= t_wfr)
then
2246 qstar = iqs1(tin, den(k))
2247 elseif (tin >= tice)
then
2249 qstar =
wqs1(tin, den(k))
2252 qsi = iqs1(tin, den(k))
2253 qsw =
wqs1(tin, den(k))
2254 if (q_cond(k) > 3.e-6)
then
2255 rqi = q_sol(k) / q_cond(k)
2260 rqi = (tice - tin) / (tice - t_wfr)
2262 qstar = rqi * qsi + (1. - rqi) * qsw
2270 if (qpz > qrmin)
then
2272 dq = max(qcmin, h_var * qpz)
2275 if (qstar < q_minus)
then
2277 elseif (qstar < q_plus .and. q_cond(k) > qc_crt)
then
2278 qa(k) = qa(k) + (q_plus - qstar) / (dq + dq)
2290subroutine revap_rac1 (hydrostatic, is, ie, dt, tz, qv, ql, qr, qi, qs, qg, den, hvar)
2294 logical,
intent (in) :: hydrostatic
2296 integer,
intent (in) :: is, ie
2298 real,
intent (in) :: dt
2300 real,
intent (in),
dimension (is:ie) :: den, hvar, qi, qs, qg
2302 real,
intent (inout),
dimension (is:ie) :: tz, qv, qr, ql
2304 real,
dimension (is:ie) :: lcp2, denfac, q_liq, q_sol, cvm, lhl
2306 real :: dqv, qsat, dqsdt, evap, qden, q_plus, q_minus, sink
2307 real :: tin, t2, qpz, dq, dqh
2316 lhl(i) = lv00 + d0_vap * tz(i)
2317 q_liq(i) = ql(i) + qr(i)
2318 q_sol(i) = qi(i) + qs(i) + qg(i)
2319 cvm(i) = c_air + qv(i) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
2320 lcp2(i) = lhl(i) / cvm(i)
2325 if (qr(i) > qrmin .and. tz(i) > t_wfr)
then
2327 tin = tz(i) - lcp2(i) * ql(i)
2328 qsat = wqs2(tin, den(i), dqsdt)
2329 dqh = max(ql(i), hvar(i) * max(qpz, qcmin))
2343 if (dqv > qvmin .and. qsat > q_minus)
then
2344 if (qsat > q_plus)
then
2349 dq = 0.25 * (q_minus - qsat) ** 2 / dqh
2351 qden = qr(i) * den(i)
2353 evap = crevp(1) * t2 * dq * (crevp(2) * sqrt(qden) + crevp(3) * exp(0.725 * log(qden))) &
2354 / (crevp(4) * t2 + crevp(5) * qsat * den(i))
2355 evap = min(qr(i), dt * evap, dqv / (1. + lcp2(i) * dqsdt))
2356 qr(i) = qr(i) - evap
2357 qv(i) = qv(i) + evap
2358 q_liq(i) = q_liq(i) - evap
2359 cvm(i) = c_air + qv(i) * c_vap + q_liq(i) * c_liq + q_sol(i) * c_ice
2360 tz(i) = tz(i) - evap * lhl(i) / cvm(i)
2367 if (qr(i) > qrmin .and. ql(i) > 1.e-8 .and. qsat < q_plus)
then
2368 denfac(i) = sqrt(sfcrho / den(i))
2369 sink = dt * denfac(i) * cracw * exp(0.95 * log(qr(i) * den(i)))
2370 sink = sink / (1. + sink) * ql(i)
2371 ql(i) = ql(i) - sink
2372 qr(i) = qr(i) + sink
2383subroutine terminal_fall (dtm, ktop, kbot, tz, qv, ql, qr, qg, qs, qi, dz, dp, &
2384 den, vtg, vts, vti, r1, g1, s1, i1, m1_sol, w1)
2388 integer,
intent (in) :: ktop, kbot
2390 real,
intent (in) :: dtm
2392 real,
intent (in),
dimension (ktop:kbot) :: vtg, vts, vti, den, dp, dz
2394 real,
intent (inout),
dimension (ktop:kbot) :: qv, ql, qr, qg, qs, qi, tz, m1_sol, w1
2396 real,
intent (out) :: r1, g1, s1, i1
2398 real,
dimension (ktop:kbot + 1) :: ze, zt
2400 real :: qsat, dqsdt, dt5, evap, dtime
2401 real :: factor, frac
2402 real :: tmp, precip, tc, sink
2404 real,
dimension (ktop:kbot) :: lcpk, icpk, cvm, q_liq, q_sol, lhl, lhi
2405 real,
dimension (ktop:kbot) :: m1, dm
2415 fac_imlt = 1. - exp(- dt5 / tau_imlt)
2423 lhl(k) = lv00 + d0_vap * tz(k)
2424 lhi(k) = li00 + dc_ice * tz(k)
2425 q_liq(k) = ql(k) + qr(k)
2426 q_sol(k) = qi(k) + qs(k) + qg(k)
2427 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2428 lcpk(k) = lhl(k) / cvm(k)
2429 icpk(k) = lhi(k) / cvm(k)
2437 do k = ktop, kbot - 1
2438 if (tz(k) > tice)
then
2450 if (qi(k) > qcmin .and. tc > 0.)
then
2451 sink = min(qi(k), fac_imlt * tc / icpk(k))
2452 tmp = min(sink, dim(ql_mlt, ql(k)))
2454 qr(k) = qr(k) + sink - tmp
2455 qi(k) = qi(k) - sink
2456 q_liq(k) = q_liq(k) + sink
2457 q_sol(k) = q_sol(k) - sink
2458 cvm(k) = c_air + qv(k) * c_vap + q_liq(k) * c_liq + q_sol(k) * c_ice
2459 tz(k) = tz(k) - sink * lhi(k) / cvm(k)
2468 if (dtm < 60.) k0 = kbot
2475 do k = kbot, ktop, - 1
2476 ze(k) = ze(k + 1) - dz(k)
2486 lhi(k) = li00 + dc_ice * tz(k)
2487 icpk(k) = lhi(k) / cvm(k)
2496 if (vi_fac < 1.e-5 .or. no_fall)
then
2500 do k = ktop + 1, kbot
2501 zt(k) = ze(k) - dt5 * (vti(k - 1) + vti(k))
2503 zt(kbot + 1) = zs - dtm * vti(kbot)
2506 if (zt(k + 1) >= zt(k)) zt(k + 1) = zt(k) - dz_min
2510 do k = kbot - 1, k0, - 1
2511 if (qi(k) > qrmin)
then
2513 if (zt(k + 1) >= ze(m))
exit
2514 if (zt(k) < ze(m + 1) .and. tz(m) > tice)
then
2515 dtime = min(1.0, (ze(m) - ze(m + 1)) / (max(vr_min, vti(k)) * tau_imlt))
2516 sink = min(qi(k) * dp(k) / dp(m), dtime * (tz(m) - tice) / icpk(m))
2517 tmp = min(sink, dim(ql_mlt, ql(m)))
2519 qr(m) = qr(m) - tmp + sink
2520 tz(m) = tz(m) - sink * icpk(m)
2521 qi(k) = qi(k) - sink * dp(m) / dp(k)
2530 dm(k) = dp(k) * (1. + qv(k) + ql(k) + qr(k) + qi(k) + qs(k) + qg(k))
2537 call implicit_fall (dtm, ktop, kbot, ze, vti, dp, qi, i1, m1_sol)
2541 w1(ktop) = (dm(ktop) * w1(ktop) + m1_sol(ktop) * vti(ktop)) / (dm(ktop) - m1_sol(ktop))
2542 do k = ktop + 1, kbot
2543 w1(k) = (dm(k) * w1(k) - m1_sol(k - 1) * vti(k - 1) + m1_sol(k) * vti(k)) &
2544 / (dm(k) + m1_sol(k - 1) - m1_sol(k))
2562 do k = ktop + 1, kbot
2563 zt(k) = ze(k) - dt5 * (vts(k - 1) + vts(k))
2565 zt(kbot + 1) = zs - dtm * vts(kbot)
2568 if (zt(k + 1) >= zt(k)) zt(k + 1) = zt(k) - dz_min
2572 do k = kbot - 1, k0, - 1
2573 if (qs(k) > qrmin)
then
2575 if (zt(k + 1) >= ze(m))
exit
2576 dtime = min(dtm, (ze(m) - ze(m + 1)) / (vr_min + vts(k)))
2577 if (zt(k) < ze(m + 1) .and. tz(m) > tice)
then
2578 dtime = min(1.0, dtime / tau_smlt)
2579 sink = min(qs(k) * dp(k) / dp(m), dtime * (tz(m) - tice) / icpk(m))
2580 tz(m) = tz(m) - sink * icpk(m)
2581 qs(k) = qs(k) - sink * dp(m) / dp(k)
2582 if (zt(k) < zs)
then
2583 r1 = r1 + sink * dp(m)
2586 qr(m) = qr(m) + sink
2589 if (qs(k) < qrmin)
exit
2597 dm(k) = dp(k) * (1. + qv(k) + ql(k) + qr(k) + qi(k) + qs(k) + qg(k))
2604 call implicit_fall (dtm, ktop, kbot, ze, vts, dp, qs, s1, m1)
2608 m1_sol(k) = m1_sol(k) + m1(k)
2612 w1(ktop) = (dm(ktop) * w1(ktop) + m1(ktop) * vts(ktop)) / (dm(ktop) - m1(ktop))
2613 do k = ktop + 1, kbot
2614 w1(k) = (dm(k) * w1(k) - m1(k - 1) * vts(k - 1) + m1(k) * vts(k)) &
2615 / (dm(k) + m1(k - 1) - m1(k))
2631 do k = ktop + 1, kbot
2632 zt(k) = ze(k) - dt5 * (vtg(k - 1) + vtg(k))
2634 zt(kbot + 1) = zs - dtm * vtg(kbot)
2637 if (zt(k + 1) >= zt(k)) zt(k + 1) = zt(k) - dz_min
2641 do k = kbot - 1, k0, - 1
2642 if (qg(k) > qrmin)
then
2644 if (zt(k + 1) >= ze(m))
exit
2645 dtime = min(dtm, (ze(m) - ze(m + 1)) / vtg(k))
2646 if (zt(k) < ze(m + 1) .and. tz(m) > tice)
then
2647 dtime = min(1., dtime / tau_g2r)
2648 sink = min(qg(k) * dp(k) / dp(m), dtime * (tz(m) - tice) / icpk(m))
2649 tz(m) = tz(m) - sink * icpk(m)
2650 qg(k) = qg(k) - sink * dp(m) / dp(k)
2651 if (zt(k) < zs)
then
2652 r1 = r1 + sink * dp(m)
2654 qr(m) = qr(m) + sink
2657 if (qg(k) < qrmin)
exit
2665 dm(k) = dp(k) * (1. + qv(k) + ql(k) + qr(k) + qi(k) + qs(k) + qg(k))
2672 call implicit_fall (dtm, ktop, kbot, ze, vtg, dp, qg, g1, m1)
2676 m1_sol(k) = m1_sol(k) + m1(k)
2680 w1(ktop) = (dm(ktop) * w1(ktop) + m1(ktop) * vtg(ktop)) / (dm(ktop) - m1(ktop))
2681 do k = ktop + 1, kbot
2682 w1(k) = (dm(k) * w1(k) - m1(k - 1) * vtg(k - 1) + m1(k) * vtg(k)) &
2683 / (dm(k) + m1(k - 1) - m1(k))
2699 integer,
intent (in) :: ktop, kbot
2701 real,
intent (in) :: q (ktop:kbot)
2703 logical,
intent (out) :: no_fall
2710 if (q(k) > qrmin)
then
2727 integer,
intent (in) :: ktop, kbot
2729 real,
intent (in) :: dt
2731 real,
intent (in),
dimension (ktop:kbot + 1) :: ze
2733 real,
intent (in),
dimension (ktop:kbot) :: vt, dp
2735 real,
intent (inout),
dimension (ktop:kbot) :: q
2737 real,
intent (out),
dimension (ktop:kbot) :: m1
2739 real,
intent (out) :: precip
2741 real,
dimension (ktop:kbot) :: dz, qm, dd
2746 dz(k) = ze(k) - ze(k + 1)
2755 qm(ktop) = q(ktop) / (dz(ktop) + dd(ktop))
2756 do k = ktop + 1, kbot
2757 qm(k) = (q(k) + dd(k - 1) * qm(k - 1)) / (dz(k) + dd(k))
2765 qm(k) = qm(k) * dz(k)
2772 m1(ktop) = q(ktop) - qm(ktop)
2773 do k = ktop + 1, kbot
2774 m1(k) = m1(k - 1) + q(k) - qm(k)
2783 q(k) = qm(k) / dp(k)
2796 integer,
intent (in) :: ktop, kbot
2798 real,
intent (in) :: zs
2800 logical,
intent (in) :: mono
2802 real,
intent (in),
dimension (ktop:kbot + 1) :: ze, zt
2804 real,
intent (in),
dimension (ktop:kbot) :: dp
2807 real,
intent (inout),
dimension (ktop:kbot) :: q, m1
2809 real,
intent (out) :: precip
2811 real,
dimension (ktop:kbot) :: qm, dz
2813 real :: a4 (4, ktop:kbot)
2815 real :: pl, pr, delz, esl
2817 integer :: k, k0, n, m
2819 real,
parameter :: r3 = 1. / 3., r23 = 2. / 3.
2826 dz(k) = zt(k) - zt(k + 1)
2828 a4(1, k) = q(k) / dz(k)
2836 call cs_profile (a4(1, ktop), dz(ktop), kbot - ktop + 1, mono)
2841 if (ze(k) <= zt(n) .and. ze(k) >= zt(n + 1))
then
2842 pl = (zt(n) - ze(k)) / dz(n)
2843 if (zt(n + 1) <= ze(k + 1))
then
2845 pr = (zt(n) - ze(k + 1)) / dz(n)
2846 qm(k) = a4(2, n) + 0.5 * (a4(4, n) + a4(3, n) - a4(2, n)) * (pr + pl) - &
2847 a4(4, n) * r3 * (pr * (pr + pl) + pl ** 2)
2848 qm(k) = qm(k) * (ze(k) - ze(k + 1))
2852 qm(k) = (ze(k) - zt(n + 1)) * (a4(2, n) + 0.5 * (a4(4, n) + &
2853 a4(3, n) - a4(2, n)) * (1. + pl) - a4(4, n) * (r3 * (1. + pl * (1. + pl))))
2857 if (ze(k + 1) < zt(m + 1))
then
2858 qm(k) = qm(k) + q(m)
2860 delz = zt(m) - ze(k + 1)
2862 qm(k) = qm(k) + delz * (a4(2, m) + 0.5 * esl * &
2863 (a4(3, m) - a4(2, m) + a4(4, m) * (1. - r23 * esl)))
2876 m1(ktop) = q(ktop) - qm(ktop)
2877 do k = ktop + 1, kbot
2878 m1(k) = m1(k - 1) + q(k) - qm(k)
2886 q(k) = qm(k) / dp(k)
2896 integer,
intent (in) :: km
2898 real,
intent (in) :: del (km)
2900 logical,
intent (in) :: do_mono
2902 real,
intent (inout) :: a4 (4, km)
2904 real,
parameter :: qp_min = 1.e-6
2908 real :: d4, bet, a_bot, grat, pmp, lac
2909 real :: pmp_1, lac_1, pmp_2, lac_2
2910 real :: da1, da2, a6da
2916 grat = del(2) / del(1)
2917 bet = grat * (grat + 0.5)
2918 q(1) = (2. * grat * (grat + 1.) * a4(1, 1) + a4(1, 2)) / bet
2919 gam(1) = (1. + grat * (grat + 1.5)) / bet
2922 d4 = del(k - 1) / del(k)
2923 bet = 2. + 2. * d4 - gam(k - 1)
2924 q(k) = (3. * (a4(1, k - 1) + d4 * a4(1, k)) - q(k - 1)) / bet
2928 a_bot = 1. + d4 * (d4 + 1.5)
2929 q(km + 1) = (2. * d4 * (d4 + 1.) * a4(1, km) + a4(1, km - 1) - a_bot * q(km)) &
2930 / (d4 * (d4 + 0.5) - a_bot * gam(km))
2933 q(k) = q(k) - gam(k) * q(k + 1)
2941 gam(k) = a4(1, k) - a4(1, k - 1)
2952 q(1) = max(q(1), 0.)
2953 q(2) = min(q(2), max(a4(1, 1), a4(1, 2)))
2954 q(2) = max(q(2), min(a4(1, 1), a4(1, 2)), 0.)
2961 if (gam(k - 1) * gam(k + 1) > 0.)
then
2962 q(k) = min(q(k), max(a4(1, k - 1), a4(1, k)))
2963 q(k) = max(q(k), min(a4(1, k - 1), a4(1, k)))
2965 if (gam(k - 1) > 0.)
then
2967 q(k) = max(q(k), min(a4(1, k - 1), a4(1, k)))
2970 q(k) = min(q(k), max(a4(1, k - 1), a4(1, k)))
2971 q(k) = max(q(k), 0.0)
2980 q(km) = min(q(km), max(a4(1, km - 1), a4(1, km)))
2981 q(km) = max(q(km), min(a4(1, km - 1), a4(1, km)), 0.)
2994 if (gam(k) * gam(k + 1) > 0.0)
then
3005 if (a4(1, k) < qp_min .or. extm(k - 1) .or. extm(k + 1))
then
3010 a4(4, k) = 6. * a4(1, k) - 3. * (a4(2, k) + a4(3, k))
3011 if (abs(a4(4, k)) > abs(a4(2, k) - a4(3, k)))
then
3013 pmp_1 = a4(1, k) - 2.0 * gam(k + 1)
3014 lac_1 = pmp_1 + 1.5 * gam(k + 2)
3015 a4(2, k) = min(max(a4(2, k), min(a4(1, k), pmp_1, lac_1)), &
3016 max(a4(1, k), pmp_1, lac_1))
3017 pmp_2 = a4(1, k) + 2.0 * gam(k)
3018 lac_2 = pmp_2 - 1.5 * gam(k - 1)
3019 a4(3, k) = min(max(a4(3, k), min(a4(1, k), pmp_2, lac_2)), &
3020 max(a4(1, k), pmp_2, lac_2))
3027 if (a4(1, k) < qp_min .or. extm(k - 1) .or. extm(k + 1))
then
3036 a4(4, k) = 6. * a4(1, k) - 3. * (a4(2, k) + a4(3, k))
3045 da1 = a4(3, k) - a4(2, k)
3047 a6da = a4(4, k) * da1
3048 if (a6da < - da2)
then
3049 a4(4, k) = 3. * (a4(2, k) - a4(1, k))
3050 a4(3, k) = a4(2, k) - a4(4, k)
3051 elseif (a6da > da2)
then
3052 a4(4, k) = 3. * (a4(3, k) - a4(1, k))
3053 a4(2, k) = a4(3, k) - a4(4, k)
3063 a4(2, km) = a4(1, km)
3064 a4(3, km) = a4(1, km)
3075 integer,
intent (in) :: km
3077 real,
intent (inout) :: a4 (4, km)
3079 real,
parameter :: r12 = 1. / 12.
3088 if (abs(a4(3, k) - a4(2, k)) < - a4(4, k))
then
3089 if ((a4(1, k) + 0.25 * (a4(3, k) - a4(2, k)) ** 2 / a4(4, k) + a4(4, k) * r12) < 0.)
then
3090 if (a4(1, k) < a4(3, k) .and. a4(1, k) < a4(2, k))
then
3094 elseif (a4(3, k) > a4(2, k))
then
3095 a4(4, k) = 3. * (a4(2, k) - a4(1, k))
3096 a4(3, k) = a4(2, k) - a4(4, k)
3098 a4(4, k) = 3. * (a4(3, k) - a4(1, k))
3099 a4(2, k) = a4(3, k) - a4(4, k)
3110subroutine fall_speed (ktop, kbot, den, qs, qi, qg, ql, tk, vts, vti, vtg)
3114 integer,
intent (in) :: ktop, kbot
3116 real,
intent (in),
dimension (ktop:kbot) :: den, qs, qi, qg, ql, tk
3117 real,
intent (out),
dimension (ktop:kbot) :: vts, vti, vtg
3121 real,
parameter :: thi = 1.0e-8
3122 real,
parameter :: thg = 1.0e-8
3123 real,
parameter :: ths = 1.0e-8
3128 real,
parameter :: aa = - 4.14122e-5
3129 real,
parameter :: bb = - 0.00538922
3130 real,
parameter :: cc = - 0.0516344
3131 real,
parameter :: dd = 0.00216078
3132 real,
parameter :: ee = 1.9714
3136 real,
parameter :: vcons = 6.6280504
3137 real,
parameter :: vcong = 87.2382675
3138 real,
parameter :: vconh = vcong * sqrt(rhoh / rhog)
3139 real,
parameter :: norms = 942477796.076938
3140 real,
parameter :: normg = 5026548245.74367
3141 real,
parameter :: normh = pi * rhoh * rnzh
3143 real,
dimension (ktop:kbot) :: qden, tc, rhof
3159 rhof(k) = sqrt(min(10., sfcrho / den(k)))
3175 if (qi(k) < thi)
then
3178 tc(k) = tk(k) - tice
3179 vti(k) = (3. + log10(qi(k) * den(k))) * (tc(k) * (aa * tc(k) + bb) + cc) + dd * tc(k) + ee
3180 vti(k) = vi0 * exp(log_10 * vti(k)) * 0.9
3181 vti(k) = min(vi_max, max(vf_min, vti(k)))
3194 if (qs(k) < ths)
then
3197 vts(k) = vs_fac * vcons * rhof(k) * exp(0.0625 * log(qs(k) * den(k) / norms))
3198 vts(k) = min(vs_max, max(vf_min, vts(k)))
3211 if (qg(k) < thg)
then
3214 vtg(k) = vg_fac * vconh * rhof(k) * sqrt(sqrt(sqrt(qg(k) * den(k) / normh)))
3215 vtg(k) = min(vg_max, max(vf_min, vtg(k)))
3220 if (qg(k) < thg)
then
3223 vtg(k) = vg_fac * vcong * rhof(k) * sqrt(sqrt(sqrt(qg(k) * den(k) / normg)))
3224 vtg(k) = min(vg_max, max(vf_min, vtg(k)))
3239 real :: gcon, cd, scm3, pisq, act (8)
3240 real :: vdifu, tcond
3243 real :: hlts, hltc, ri50
3245 real,
parameter :: gam263 = 1.456943, gam275 = 1.608355, gam290 = 1.827363, &
3246 gam325 = 2.54925, gam350 = 3.323363, gam380 = 4.694155, &
3247 gam425 = 8.285063, gam450 = 11.631769, gam480 = 17.837789, &
3248 gam625 = 184.860962, gam680 = 496.604067
3260 real,
parameter :: acc (3) = (/ 5.0, 2.0, 0.5 /)
3266 pie = 4. * atan(1.0)
3270 fac_rc = (4. / 3.) * pie * rhor * rthresh ** 3
3275 den_rc = fac_rc * ccn_o * 1.e6
3277 den_rc = fac_rc * ccn_l * 1.e6
3293 scm3 = (visk / vdifu) ** (1. / 3.)
3295 cracs = pisq * rnzr * rnzs * rhos
3296 csacr = pisq * rnzr * rnzs * rhor
3298 cgacr = pisq * rnzr * rnzh * rhor
3299 cgacs = pisq * rnzh * rnzs * rhos
3301 cgacr = pisq * rnzr * rnzg * rhor
3302 cgacs = pisq * rnzg * rnzs * rhos
3304 cgacs = cgacs * c_pgacs
3309 act(1) = pie * rnzs * rhos
3310 act(2) = pie * rnzr * rhor
3312 act(6) = pie * rnzh * rhoh
3314 act(6) = pie * rnzg * rhog
3324 acco(i, k) = acc(i) / (act(2 * k - 1) ** ((7 - i) * 0.25) * act(2 * k) ** (i * 0.25))
3328 gcon = 40.74 * sqrt(sfcrho)
3330 csacw = pie * rnzs * clin * gam325 / (4. * act(1) ** 0.8125)
3333 craci = pie * rnzr * alin * gam380 / (4. * act(2) ** 0.95)
3334 csaci = csacw * c_psaci
3337 cgacw = pie * rnzh * gam350 * gcon / (4. * act(6) ** 0.875)
3339 cgacw = pie * rnzg * gam350 * gcon / (4. * act(6) ** 0.875)
3344 cgaci = cgacw * 0.05
3348 cracw = c_cracw * cracw
3352 cssub(1) = 2. * pie * vdifu * tcond * rvgas * rnzs
3354 cgsub(1) = 2. * pie * vdifu * tcond * rvgas * rnzh
3356 cgsub(1) = 2. * pie * vdifu * tcond * rvgas * rnzg
3358 crevp(1) = 2. * pie * vdifu * tcond * rvgas * rnzr
3359 cssub(2) = 0.78 / sqrt(act(1))
3360 cgsub(2) = 0.78 / sqrt(act(6))
3361 crevp(2) = 0.78 / sqrt(act(2))
3362 cssub(3) = 0.31 * scm3 * gam263 * sqrt(clin / visk) / act(1) ** 0.65625
3363 cgsub(3) = 0.31 * scm3 * gam275 * sqrt(gcon / visk) / act(6) ** 0.6875
3364 crevp(3) = 0.31 * scm3 * gam290 * sqrt(alin / visk) / act(2) ** 0.725
3365 cssub(4) = tcond * rvgas
3366 cssub(5) = hlts ** 2 * vdifu
3370 crevp(5) = hltc ** 2 * vdifu
3372 cgfr(1) = 20.e2 * pisq * rnzr * rhor / act(2) ** 1.75
3377 csmlt(1) = 2. * pie * tcond * rnzs / hltf
3378 csmlt(2) = 2. * pie * vdifu * rnzs * hltc / hltf
3381 csmlt(5) = ch2o / hltf
3386 cgmlt(1) = 2. * pie * tcond * rnzh / hltf
3387 cgmlt(2) = 2. * pie * vdifu * rnzh * hltc / hltf
3389 cgmlt(1) = 2. * pie * tcond * rnzg / hltf
3390 cgmlt(2) = 2. * pie * vdifu * rnzg * hltc / hltf
3394 cgmlt(5) = ch2o / hltf
3407 fn_nml, errmsg, errflg)
3411 integer,
intent (in) :: me
3412 integer,
intent (in) :: master
3413 integer,
intent (in) :: nlunit
3414 integer,
intent (in) :: logunit
3416 character (len = 64),
intent (in) :: fn_nml
3417 character (len = *),
intent (in) :: input_nml_file(:)
3418 character(len=*),
intent(out) :: errmsg
3419 integer,
intent(out) :: errflg
3441 call read_gfdlmp_nml(errmsg = errmsg, errflg = errflg, unit = nlunit, &
3442 input_nml_file = input_nml_file, fn_nml = fn_nml, version=1, &
3444 if(errflg/=0)
return
3447 if (me == master)
then
3448 write (logunit, *)
" ================================================================== "
3449 write (logunit, *)
"gfdl_cloud_microphysics_nml"
3515 module_is_initialized = .true.
3554 tables_are_initialized = .false.
3570 if (.not. qsmith_tables_initialized)
call qsmith_init
3572 qsmith_tables_initialized = .true.
3582real function acr3d (v1, v2, q1, q2, c, cac, rho)
3586 real,
intent (in) :: v1, v2, c, rho
3587 real,
intent (in) :: q1, q2
3588 real,
intent (in) :: cac (3)
3607 acr3d = c * abs(v1 - v2) * q1 * s2 * (cac(1) * t1 + cac(2) * sqrt(t1) * s2 + cac(3) * s1)
3617real function smlt (tc, dqs, qsrho, psacw, psacr, c, rho, rhofac)
3621 real,
intent (in) :: tc, dqs, qsrho, psacw, psacr, c (5), rho, rhofac
3623 smlt = (c(1) * tc / rho - c(2) * dqs) * (c(3) * sqrt(qsrho) + &
3624 c(4) * qsrho ** 0.65625 * sqrt(rhofac)) + c(5) * tc * (psacw + psacr)
3633real function gmlt (tc, dqs, qgrho, pgacw, pgacr, c, rho)
3637 real,
intent (in) :: tc, dqs, qgrho, pgacw, pgacr, c (5), rho
3639 gmlt = (c(1) * tc / rho - c(2) * dqs) * (c(3) * sqrt(qgrho) + &
3640 c(4) * qgrho ** 0.6875 / rho ** 0.25) + c(5) * tc * (pgacw + pgacr)
3659 integer,
parameter :: length = 2621
3663 if (.not. tables_are_initialized)
then
3676 allocate (table(length))
3677 allocate (table2(length))
3678 allocate (table3(length))
3679 allocate (tablew(length))
3680 allocate (des(length))
3681 allocate (des2(length))
3682 allocate (des3(length))
3683 allocate (desw(length))
3690 do i = 1, length - 1
3691 des(i) = max(0., table(i + 1) - table(i))
3692 des2(i) = max(0., table2(i + 1) - table2(i))
3693 des3(i) = max(0., table3(i + 1) - table3(i))
3694 desw(i) = max(0., tablew(i + 1) - tablew(i))
3696 des(length) = des(length - 1)
3697 des2(length) = des2(length - 1)
3698 des3(length) = des3(length - 1)
3699 desw(length) = desw(length - 1)
3701 tables_are_initialized = .true.
3719 real,
intent (in) :: ta, den
3721 real :: es, ap1, tmin
3725 tmin = table_ice - 160.
3726 ap1 = 10. * dim(ta, tmin) + 1.
3727 ap1 = min(2621., ap1)
3729 es = tablew(it) + (ap1 - it) * desw(it)
3730 wqs1 = es / (rvgas * ta * den)
3741real function wqs2 (ta, den, dqdt)
3748 real,
intent (in) :: ta, den
3750 real,
intent (out) :: dqdt
3752 real :: es, ap1, tmin
3756 tmin = table_ice - 160.
3758 if (.not. tables_are_initialized)
call qsmith_init
3760 ap1 = 10. * dim(ta, tmin) + 1.
3761 ap1 = min(2621., ap1)
3763 es = tablew(it) + (ap1 - it) * desw(it)
3764 wqs2 = es / (rvgas * ta * den)
3767 dqdt = 10. * (desw(it) + (ap1 - it) * (desw(it + 1) - desw(it))) / (rvgas * ta * den)
3777real function wet_bulb (q, t, den)
3781 real,
intent (in) :: t, q, den
3783 real :: qs, tp, dqdt
3786 qs = wqs2(wet_bulb, den, dqdt)
3787 tp = 0.5 * (qs - q) / (1. + lcp * dqdt) * lcp
3788 wet_bulb = wet_bulb - tp
3792 qs = wqs2(wet_bulb, den, dqdt)
3793 tp = (qs - q) / (1. + lcp * dqdt) * lcp
3794 wet_bulb = wet_bulb - tp
3797end function wet_bulb
3804real function iqs1 (ta, den)
3811 real,
intent (in) :: ta, den
3813 real :: es, ap1, tmin
3817 tmin = table_ice - 160.
3818 ap1 = 10. * dim(ta, tmin) + 1.
3819 ap1 = min(2621., ap1)
3821 es = table2(it) + (ap1 - it) * des2(it)
3822 iqs1 = es / (rvgas * ta * den)
3831real function iqs2 (ta, den, dqdt)
3838 real,
intent (in) :: ta, den
3840 real,
intent (out) :: dqdt
3842 real :: es, ap1, tmin
3846 tmin = table_ice - 160.
3847 ap1 = 10. * dim(ta, tmin) + 1.
3848 ap1 = min(2621., ap1)
3850 es = table2(it) + (ap1 - it) * des2(it)
3851 iqs2 = es / (rvgas * ta * den)
3853 dqdt = 10. * (des2(it) + (ap1 - it) * (des2(it + 1) - des2(it))) / (rvgas * ta * den)
3862real function qs1d_moist (ta, qv, pa, dqdt)
3866 real,
intent (in) :: ta, pa, qv
3868 real,
intent (out) :: dqdt
3870 real :: es, ap1, tmin, eps10
3874 tmin = table_ice - 160.
3876 ap1 = 10. * dim(ta, tmin) + 1.
3877 ap1 = min(2621., ap1)
3879 es = table2(it) + (ap1 - it) * des2(it)
3880 qs1d_moist = eps * es * (1. + zvir * qv) / pa
3882 dqdt = eps10 * (des2(it) + (ap1 - it) * (des2(it + 1) - des2(it))) * (1. + zvir * qv) / pa
3884end function qs1d_moist
3892real function wqsat2_moist (ta, qv, pa, dqdt)
3896 real,
intent (in) :: ta, pa, qv
3898 real,
intent (out) :: dqdt
3900 real :: es, ap1, tmin, eps10
3904 tmin = table_ice - 160.
3906 ap1 = 10. * dim(ta, tmin) + 1.
3907 ap1 = min(2621., ap1)
3909 es = tablew(it) + (ap1 - it) * desw(it)
3910 wqsat2_moist = eps * es * (1. + zvir * qv) / pa
3912 dqdt = eps10 * (desw(it) + (ap1 - it) * (desw(it + 1) - desw(it))) * (1. + zvir * qv) / pa
3914end function wqsat2_moist
3922real function wqsat_moist (ta, qv, pa)
3926 real,
intent (in) :: ta, pa, qv
3928 real :: es, ap1, tmin
3932 tmin = table_ice - 160.
3933 ap1 = 10. * dim(ta, tmin) + 1.
3934 ap1 = min(2621., ap1)
3936 es = tablew(it) + (ap1 - it) * desw(it)
3937 wqsat_moist = eps * es * (1. + zvir * qv) / pa
3939end function wqsat_moist
3946real function qs1d_m (ta, qv, pa)
3950 real,
intent (in) :: ta, pa, qv
3952 real :: es, ap1, tmin
3956 tmin = table_ice - 160.
3957 ap1 = 10. * dim(ta, tmin) + 1.
3958 ap1 = min(2621., ap1)
3960 es = table2(it) + (ap1 - it) * des2(it)
3961 qs1d_m = eps * es * (1. + zvir * qv) / pa
3970real function d_sat (ta, den)
3974 real,
intent (in) :: ta, den
3976 real :: es_w, es_i, ap1, tmin
3980 tmin = table_ice - 160.
3981 ap1 = 10. * dim(ta, tmin) + 1.
3982 ap1 = min(2621., ap1)
3984 es_w = tablew(it) + (ap1 - it) * desw(it)
3985 es_i = table2(it) + (ap1 - it) * des2(it)
3986 d_sat = dim(es_w, es_i) / (rvgas * ta * den)
3995real function esw_table (ta)
3999 real,
intent (in) :: ta
4005 tmin = table_ice - 160.
4006 ap1 = 10. * dim(ta, tmin) + 1.
4007 ap1 = min(2621., ap1)
4009 esw_table = tablew(it) + (ap1 - it) * desw(it)
4011end function esw_table
4018real function es2_table (ta)
4022 real,
intent (in) :: ta
4028 tmin = table_ice - 160.
4029 ap1 = 10. * dim(ta, tmin) + 1.
4030 ap1 = min(2621., ap1)
4032 es2_table = table2(it) + (ap1 - it) * des2(it)
4034end function es2_table
4044 integer,
intent (in) :: n
4046 real,
intent (in) :: ta (n)
4048 real,
intent (out) :: es (n)
4054 tmin = table_ice - 160.
4057 ap1 = 10. * dim(ta(i), tmin) + 1.
4058 ap1 = min(2621., ap1)
4060 es(i) = tablew(it) + (ap1 - it) * desw(it)
4073 integer,
intent (in) :: n
4075 real,
intent (in) :: ta (n)
4077 real,
intent (out) :: es (n)
4083 tmin = table_ice - 160.
4086 ap1 = 10. * dim(ta(i), tmin) + 1.
4087 ap1 = min(2621., ap1)
4089 es(i) = table2(it) + (ap1 - it) * des2(it)
4102 integer,
intent (in) :: n
4104 real,
intent (in) :: ta (n)
4106 real,
intent (out) :: es (n)
4112 tmin = table_ice - 160.
4115 ap1 = 10. * dim(ta(i), tmin) + 1.
4116 ap1 = min(2621., ap1)
4118 es(i) = table3(it) + (ap1 - it) * des3(it)
4131 integer,
intent (in) :: n
4134 real :: tmin, tem, fac0, fac1, fac2
4138 tmin = table_ice - 160.
4145 tem = tmin + delt * real(i - 1)
4146 fac0 = (tem - t_ice) / (tem * t_ice)
4148 fac2 = (dc_vap * log(tem / t_ice) + fac1) / rvgas
4149 tablew(i) = e00 * exp(fac2)
4162 integer,
intent (in) :: n
4165 real :: tmin, tem0, tem1, fac0, fac1, fac2
4167 integer :: i, i0, i1
4169 tmin = table_ice - 160.
4172 tem0 = tmin + delt * real(i - 1)
4173 fac0 = (tem0 - t_ice) / (tem0 * t_ice)
4179 fac2 = (d2ice * log(tem0 / t_ice) + fac1) / rvgas
4185 fac2 = (dc_vap * log(tem0 / t_ice) + fac1) / rvgas
4187 table2(i) = e00 * exp(fac2)
4196 tem0 = 0.25 * (table2(i0 - 1) + 2. * table(i0) + table2(i0 + 1))
4197 tem1 = 0.25 * (table2(i1 - 1) + 2. * table(i1) + table2(i1 + 1))
4211 integer,
intent (in) :: n
4214 real :: esbasw, tbasw, esbasi, tmin, tem, aa, b, c, d, e
4217 integer :: i, i0, i1
4220 tbasw = table_ice + 100.
4222 tmin = table_ice - 160.
4225 tem = tmin + delt * real(i - 1)
4232 aa = - 9.09718 * (table_ice / tem - 1.)
4233 b = - 3.56654 * alog10(table_ice / tem)
4234 c = 0.876793 * (1. - tem / table_ice)
4236 table3(i) = 0.1 * 10 ** (aa + b + c + e)
4242 aa = - 7.90298 * (tbasw / tem - 1.)
4243 b = 5.02808 * alog10(tbasw / tem)
4244 c = - 1.3816e-7 * (10 ** ((1. - tem / tbasw) * 11.344) - 1.)
4245 d = 8.1328e-3 * (10 ** ((tbasw / tem - 1.) * (- 3.49149)) - 1.)
4247 table3(i) = 0.1 * 10 ** (aa + b + c + d + e)
4257 tem0 = 0.25 * (table3(i0 - 1) + 2. * table(i0) + table3(i0 + 1))
4258 tem1 = 0.25 * (table3(i1 - 1) + 2. * table(i1) + table3(i1 + 1))
4274 real,
intent (in) :: t, p, q
4276 real :: es, ap1, tmin
4280 tmin = table_ice - 160.
4281 ap1 = 10. * dim(t, tmin) + 1.
4282 ap1 = min(2621., ap1)
4284 es = table(it) + (ap1 - it) * des(it)
4285 qs_blend = eps * es * (1. + zvir * q) / p
4297 integer,
intent (in) :: n
4300 real :: tmin, tem, esh20
4301 real :: wice, wh2o, fac0, fac1, fac2
4306 tmin = table_ice - 160.
4313 tem = tmin + delt * real(i - 1)
4314 fac0 = (tem - t_ice) / (tem * t_ice)
4316 fac2 = (d2ice * log(tem / t_ice) + fac1) / rvgas
4317 table(i) = e00 * exp(fac2)
4325 tem = 253.16 + delt * real(i - 1)
4326 fac0 = (tem - t_ice) / (tem * t_ice)
4328 fac2 = (dc_vap * log(tem / t_ice) + fac1) / rvgas
4329 esh20 = e00 * exp(fac2)
4333 table(i + 1400) = esh20
4342 tem = 253.16 + delt * real(i - 1)
4343 wice = 0.05 * (table_ice - tem)
4344 wh2o = 0.05 * (tem - 253.16)
4345 table(i + 1400) = wice * table(i + 1400) + wh2o * esupc(i)
4357subroutine qsmith (im, km, ks, t, p, q, qs, dqdt)
4361 integer,
intent (in) :: im, km, ks
4363 real,
intent (in),
dimension (im, km) :: t, p, q
4365 real,
intent (out),
dimension (im, km) :: qs
4367 real,
intent (out),
dimension (im, km),
optional :: dqdt
4369 real :: eps10, ap1, tmin
4371 real,
dimension (im, km) :: es
4375 tmin = table_ice - 160.
4378 if (.not. tables_are_initialized)
then
4384 ap1 = 10. * dim(t(i, k), tmin) + 1.
4385 ap1 = min(2621., ap1)
4387 es(i, k) = table(it) + (ap1 - it) * des(it)
4388 qs(i, k) = eps * es(i, k) * (1. + zvir * q(i, k)) / p(i, k)
4392 if (
present (dqdt))
then
4395 ap1 = 10. * dim(t(i, k), tmin) + 1.
4396 ap1 = min(2621., ap1) - 0.5
4398 dqdt(i, k) = eps10 * (des(it) + (ap1 - it) * (des(it + 1) - des(it))) * (1. + zvir * q(i, k)) / p(i, k)
4409subroutine neg_adj (ktop, kbot, pt, dp, qv, ql, qr, qi, qs, qg)
4413 integer,
intent (in) :: ktop, kbot
4415 real,
intent (in),
dimension (ktop:kbot) :: dp
4417 real,
intent (inout),
dimension (ktop:kbot) :: pt, qv, ql, qr, qi, qs, qg
4419 real,
dimension (ktop:kbot) :: lcpk, icpk
4430 cvm = c_air + qv(k) * c_vap + (qr(k) + ql(k)) * c_liq + (qi(k) + qs(k) + qg(k)) * c_ice
4431 lcpk(k) = (lv00 + d0_vap * pt(k)) / cvm
4432 icpk(k) = (li00 + dc_ice * pt(k)) / cvm
4442 if (qi(k) < 0.)
then
4443 qs(k) = qs(k) + qi(k)
4447 if (qs(k) < 0.)
then
4448 qg(k) = qg(k) + qs(k)
4452 if (qg(k) < 0.)
then
4453 qr(k) = qr(k) + qg(k)
4454 pt(k) = pt(k) - qg(k) * icpk(k)
4463 if (qr(k) < 0.)
then
4464 ql(k) = ql(k) + qr(k)
4468 if (ql(k) < 0.)
then
4469 qv(k) = qv(k) + ql(k)
4470 pt(k) = pt(k) - ql(k) * lcpk(k)
4480 do k = ktop, kbot - 1
4481 if (qv(k) < 0.)
then
4482 qv(k + 1) = qv(k + 1) + qv(k) * dp(k) / dp(k + 1)
4491 if (qv(kbot) < 0. .and. qv(kbot - 1) > 0.)
then
4492 dq = min(- qv(kbot) * dp(kbot), qv(kbot - 1) * dp(kbot - 1))
4493 qv(kbot - 1) = qv(kbot - 1) - dq / dp(kbot - 1)
4494 qv(kbot) = qv(kbot) + dq / dp(kbot)
4552 integer,
intent (in) :: is, ie, js, je, km
4554 real,
intent (in),
dimension (is:ie, js:je, km) :: a3
4556 real,
intent (in),
dimension (is:ie, js:je, km + 1) :: hgt
4558 real,
intent (in) :: zl
4560 real,
intent (out),
dimension (is:ie, js:je) :: a2
4562 real,
dimension (km) :: zm
4571 zm(k) = 0.5 * (hgt(i, j, k) + hgt(i, j, k + 1))
4573 if (zl >= zm(1))
then
4574 a2(i, j) = a3(i, j, 1)
4575 elseif (zl <= zm(km))
then
4576 a2(i, j) = a3(i, j, km)
4579 if (zl <= zm(k) .and. zl >= zm(k + 1))
then
4580 a2(i, j) = a3(i, j, k) + (a3(i, j, k + 1) - a3(i, j, k)) * (zm(k) - zl) / (zm(k) - zm(k + 1))
4596subroutine cloud_diagnosis (is, ie, ks, ke, den, delp, lsm, qmw, qmi, qmr, qms, qmg, t, &
4597 rew, rei, rer, res, reg)
4601 integer,
intent (in) :: is, ie, ks, ke
4602 integer,
intent (in),
dimension (is:ie) :: lsm
4604 real,
intent (in),
dimension (is:ie, ks:ke) :: den, delp, t
4605 real,
intent (in),
dimension (is:ie, ks:ke) :: qmw, qmi, qmr, qms, qmg
4607 real,
intent (out),
dimension (is:ie, ks:ke) :: rew, rei, rer, res, reg
4609 real,
dimension (is:ie, ks:ke) :: qcw, qci, qcr, qcs, qcg
4613 real :: lambdar, lambdas, lambdag
4614 real :: dpg, rei_fac, mask, ccn, bw
4615 real,
parameter :: rho_0 = 50.e-3
4617 real :: rhow = 1.0e3, rhor = 1.0e3, rhos = 1.0e2, rhog = 4.0e2
4618 real :: n0r = 8.0e6, n0s = 3.0e6, n0g = 4.0e6
4619 real :: alphar = 0.8, alphas = 0.25, alphag = 0.5
4620 real :: gammar = 17.837789, gammas = 8.2850630, gammag = 11.631769
4621 real :: qmin = 1.0e-12, beta = 1.22, qmin1 = 9.e-6
4626 dpg = abs(delp(i, k)) / grav
4627 mask = min(max(real(lsm(i)), 0.0), 2.0)
4633 ccn = 0.80 * (- 1.15e-3 * (ccn_o ** 2) + 0.963 * ccn_o + 5.30) * abs(mask - 1.0) + &
4634 0.67 * (- 2.10e-4 * (ccn_l ** 2) + 0.568 * ccn_l - 27.9) * (1.0 - abs(mask - 1.0))
4636 if (qmw(i, k) .gt. qmin)
then
4637 qcw(i, k) = dpg * qmw(i, k) * 1.0e3
4638 rew(i, k) = exp(1.0 / 3.0 * log((3.0 * den(i, k) * qmw(i, k)) / (4.0 * pi * rhow * ccn))) * 1.0e4
4639 rew(i, k) = max(rewmin, min(rewmax, rew(i, k)))
4645 if (reiflag .eq. 1)
then
4651 if (qmi(i, k) .gt. qmin1)
then
4652 qci(i, k) = dpg * qmi(i, k) * 1.0e3
4653 rei_fac = log(1.0e3 * qmi(i, k) * den(i, k))
4654 if (t(i, k) - tice .lt. - 50)
then
4655 rei(i, k) = beta / 9.917 * exp(0.109 * rei_fac) * 1.0e3
4656 elseif (t(i, k) - tice .lt. - 40)
then
4657 rei(i, k) = beta / 9.337 * exp(0.080 * rei_fac) * 1.0e3
4658 elseif (t(i, k) - tice .lt. - 30)
then
4659 rei(i, k) = beta / 9.208 * exp(0.055 * rei_fac) * 1.0e3
4661 rei(i, k) = beta / 9.387 * exp(0.031 * rei_fac) * 1.0e3
4663 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
4671 if (reiflag .eq. 2)
then
4677 if (qmi(i, k) .gt. qmin1)
then
4678 qci(i, k) = dpg * qmi(i, k) * 1.0e3
4679 bw = - 2. + 1.e-3 * log10(den(i, k) * qmi(i, k) / rho_0) * max(0.0, tice - t(i, k)) ** 1.5
4680 rei(i, k) = 377.4 + bw * (203.3 + bw * (37.91 + 2.3696 * bw))
4681 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
4693 if (qmr(i, k) .gt. qmin)
then
4694 qcr(i, k) = dpg * qmr(i, k) * 1.0e3
4695 lambdar = exp(0.25 * log(pi * rhor * n0r / qmr(i, k) / den(i, k)))
4696 rer(i, k) = 0.5 * exp(log(gammar / 6) / alphar) / lambdar * 1.0e6
4697 rer(i, k) = max(rermin, min(rermax, rer(i, k)))
4707 if (qms(i, k) .gt. qmin1)
then
4708 qcs(i, k) = dpg * qms(i, k) * 1.0e3
4709 lambdas = exp(0.25 * log(pi * rhos * n0s / qms(i, k) / den(i, k)))
4710 res(i, k) = 0.5 * exp(log(gammas / 6) / alphas) / lambdas * 1.0e6
4711 res(i, k) = max(resmin, min(resmax, res(i, k)))
4721 if (qmg(i, k) .gt. qmin)
then
4722 qcg(i, k) = dpg * qmg(i, k) * 1.0e3
4723 lambdag = exp(0.25 * log(pi * rhog * n0g / qmg(i, k) / den(i, k)))
4724 reg(i, k) = 0.5 * exp(log(gammag / 6) / alphag) / lambdag * 1.0e6
4725 reg(i, k) = max(regmin, min(regmax, reg(i, k)))
4740 t1d, p1d, dBZ, kts, kte, ii, jj, melti)
4745 INTEGER,
INTENT(IN):: kts, kte, ii,jj
4746 REAL,
DIMENSION(kts:kte),
INTENT(IN):: &
4747 qv1d, qr1d, qs1d, qg1d, t1d, p1d
4748 REAL,
DIMENSION(kts:kte),
INTENT(INOUT):: dBZ
4751 REAL,
DIMENSION(kts:kte):: temp, pres, qv, rho
4752 REAL,
DIMENSION(kts:kte):: rr, rs, rg
4755 DOUBLE PRECISION,
DIMENSION(kts:kte):: ilamr, ilams, ilamg
4756 DOUBLE PRECISION,
DIMENSION(kts:kte):: N0_r, N0_s, N0_g
4757 DOUBLE PRECISION:: lamr, lams, lamg
4758 LOGICAL,
DIMENSION(kts:kte):: L_qr, L_qs, L_qg
4760 REAL,
DIMENSION(kts:kte):: ze_rain, ze_snow, ze_graupel
4761 DOUBLE PRECISION:: fmelt_s, fmelt_g
4763 INTEGER:: i, k, k_0, kbot, n
4764 LOGICAL,
INTENT(IN):: melti
4765 DOUBLE PRECISION:: cback, x, eta, f_d
4778 qv(k) = max(1.e-10, qv1d(k))
4780 rho(k) = 0.622*pres(k)/(rdgas*temp(k)*(qv(k)+0.622))
4782 if (qr1d(k) .gt. 1.e-9)
then
4783 rr(k) = qr1d(k)*rho(k)
4785 lamr = (xam_r*xcrg(3)*n0_r(k)/rr(k))**(1./xcre(1))
4793 if (qs1d(k) .gt. 1.e-9)
then
4794 rs(k) = qs1d(k)*rho(k)
4796 lams = (xam_s*xcsg(3)*n0_s(k)/rs(k))**(1./xcse(1))
4804 if (qg1d(k) .gt. 1.e-9)
then
4805 rg(k) = qg1d(k)*rho(k)
4807 lamg = (xam_g*xcgg(3)*n0_g(k)/rg(k))**(1./xcge(1))
4820 k_loop:
do k = kte-1, kts, -1
4821 if ( melti .and. (temp(k).gt.273.15) .and. l_qr(k) &
4822 .and. (l_qs(k+1).or.l_qg(k+1)) )
then
4835 ze_graupel(k) = 1.e-22
4836 if (l_qr(k)) ze_rain(k) = n0_r(k)*xcrg(4)*ilamr(k)**xcre(4)
4837 if (l_qs(k)) ze_snow(k) = (0.176/0.93) * (6.0/pi)*(6.0/pi) &
4838 * (xam_s/900.0)*(xam_s/900.0) &
4839 * n0_s(k)*xcsg(4)*ilams(k)**xcse(4)
4840 if (l_qg(k)) ze_graupel(k) = (0.176/0.93) * (6.0/pi)*(6.0/pi) &
4841 * (xam_g/900.0)*(xam_g/900.0) &
4842 * n0_g(k)*xcgg(4)*ilamg(k)**xcge(4)
4854 if (melti .and. k_0.ge.kts+1)
then
4855 do k = k_0-1, kts, -1
4858 if (l_qs(k) .and. l_qs(k_0) )
then
4859 fmelt_s = max(0.005d0, min(1.0d0-rs(k)/rs(k_0), 0.99d0))
4863 x = xam_s * xxds(n)**xbm_s
4864 call rayleigh_soak_wetgraupel (x,dble(xocms),dble(xobms), &
4865 fmelt_s, melt_outside_s, m_w_0, m_i_0, lamda_radar, &
4866 cback, mixingrulestring_s, matrixstring_s, &
4867 inclusionstring_s, hoststring_s, &
4868 hostmatrixstring_s, hostinclusionstring_s)
4869 f_d = n0_s(k)*xxds(n)**xmu_s * dexp(-lams*xxds(n))
4870 eta = eta + f_d * cback * simpson(n) * xdts(n)
4872 ze_snow(k) = sngl(lamda4 / (pi5 * k_w) * eta)
4878 if (l_qg(k) .and. l_qg(k_0) )
then
4879 fmelt_g = max(0.005d0, min(1.0d0-rg(k)/rg(k_0), 0.99d0))
4883 x = xam_g * xxdg(n)**xbm_g
4884 call rayleigh_soak_wetgraupel (x,dble(xocmg),dble(xobmg), &
4885 fmelt_g, melt_outside_g, m_w_0, m_i_0, lamda_radar, &
4886 cback, mixingrulestring_g, matrixstring_g, &
4887 inclusionstring_g, hoststring_g, &
4888 hostmatrixstring_g, hostinclusionstring_g)
4889 f_d = n0_g(k)*xxdg(n)**xmu_g * dexp(-lamg*xxdg(n))
4890 eta = eta + f_d * cback * simpson(n) * xdtg(n)
4892 ze_graupel(k) = sngl(lamda4 / (pi5 * k_w) * eta)
4899 dbz(k) = 10.*log10((ze_rain(k)+ze_snow(k)+ze_graupel(k))*1.d18)
real function acr3d(v1, v2, q1, q2, c, cac, rho)
The function is an accretion function (Lin et al.(1983) )
real function smlt(tc, dqs, qsrho, psacw, psacr, c, rho, rhofac)
Melting of snow function (Lin et al.(1983) ) note: psacw and psacr must be calc before smlt is called...
subroutine esw_table1d(ta, es, n)
The subroutine 'esw_table1d' computes the saturated water vapor pressure for table ii.
subroutine interpolate_z(is, ie, js, je, km, zl, hgt, a3, a2)
quick local sum algorithm
subroutine qs_table(n)
saturation water vapor pressure table i
subroutine qs_table3(n)
saturation water vapor pressure table iv
subroutine refl10cm_gfdl(qv1d, qr1d, qs1d, qg1d, t1d, p1d, dbz, kts, kte, ii, jj, melti)
This subroutine calculates radar reflectivity.
subroutine implicit_fall(dt, ktop, kbot, ze, vt, dp, q, precip, m1)
The subroutine computes the time-implicit monotonic fall scheme.
subroutine qsmith(im, km, ks, t, p, q, qs, dqdt)
The function 'qsmith' computes the saturated specific humidity with a blend of water and ice dependin...
subroutine, public cloud_diagnosis(is, ie, ks, ke, den, delp, lsm, qmw, qmi, qmr, qms, qmg, t, rew, rei, rer, res, reg)
The subroutine 'cloud_diagnosis' diagnoses the radius of cloud species.
subroutine cs_limiters(km, a4)
This subroutine perform positive definite constraint.
subroutine linear_prof(km, q, dm, z_var, h_var)
Definition of vertical subgrid variability used for cloud ice and cloud water autoconversion.
subroutine qs_table2(n)
saturation water vapor pressure table iii
subroutine fall_speed(ktop, kbot, den, qs, qi, qg, ql, tk, vts, vti, vtg)
The subroutine calculates vertical fall speed of snow/ice/graupel.
subroutine check_column(ktop, kbot, q, no_fall)
The subroutine 'check_column' checks if the water species is large enough to fall.
subroutine revap_racc(ktop, kbot, dt, tz, qv, ql, qr, qi, qs, qg, den, denfac, rh_rain, h_var)
This subroutine calculates evaporation of rain and accretion of rain.
subroutine icloud(ktop, kbot, tzk, p1, qvk, qlk, qrk, qik, qsk, qgk, dp1, den, denfac, vts, vtg, vtr, qak, rh_adj, rh_rain, dts, h_var)
This subroutine includes cloud ice microphysics processes.
real function wqs1(ta, den)
The function 'wqs1' returns the saturation vapor pressure over pure liquid water for a given temperat...
subroutine revap_rac1(hydrostatic, is, ie, dt, tz, qv, ql, qr, qi, qs, qg, den, hvar)
This subroutine calculates rain evaporation.
subroutine terminal_fall(dtm, ktop, kbot, tz, qv, ql, qr, qg, qs, qi, dz, dp, den, vtg, vts, vti, r1, g1, s1, i1, m1_sol, w1)
The subroutine 'terminal_fall' computes terminal fall speed.
subroutine neg_adj(ktop, kbot, pt, dp, qv, ql, qr, qi, qs, qg)
The subroutine 'neg_adj' fixes negative water species.
subroutine mpdrv(hydrostatic, uin, vin, w, delp, pt, qv, ql, qr, qi, qs, qg, qa, qn, dz, is, ie, js, je, ks, ke, ktop, kbot, j, dt_in, ntimes, rain, snow, graupel, ice, m2_rain, m2_sol, cond, area1, land, u_dt, v_dt, pt_dt, qv_dt, ql_dt, qr_dt, qi_dt, qs_dt, qg_dt, qa_dt, w_var, vt_r, vt_s, vt_g, vt_i, qn2)
GFDL cloud microphysics, major program, and is based on Lin et al.(1983) and Rutledge and Hobbs (198...
subroutine setupm
The subroutine sets up gfdl cloud microphysics parameters.
subroutine es3_table1d(ta, es, n)
The subroutine 'es3_table1d' computes the saturated water vapor pressure for table iv.
subroutine, public gfdl_cloud_microphys_mod_end()
The subroutine 'gfdl_cloud_microphys_init' terminates the GFDL cloud microphysics.
subroutine, public gfdl_cloud_microphys_mod_driver(iis, iie, jjs, jje, kks, kke, ktop, kbot, qv, ql, qr, qi, qs, qg, qa, qn, qv_dt, ql_dt, qr_dt, qi_dt, qs_dt, qg_dt, qa_dt, pt_dt, pt, w, uin, vin, udt, vdt, dz, delp, area, dt_in, land, rain, snow, ice, graupel, hydrostatic, phys_hydrostatic, p, lradar, refl_10cm, reset, pfils, pflls)
This subroutine is the driver of the GFDL cloud microphysics.
subroutine lagrangian_fall_ppm(ktop, kbot, zs, ze, zt, dp, q, precip, m1, mono)
Lagrangian scheme.
subroutine qsmith_init
The subroutine 'qsmith_init' initializes lookup tables for saturation water vapor pressure for the fo...
subroutine, public gfdl_cloud_microphys_mod_init(me, master, nlunit, input_nml_file, logunit, fn_nml, errmsg, errflg)
The subroutine 'gfdl_cloud_microphys_init' initializes the GFDL cloud microphysics.
subroutine warm_rain(dt, ktop, kbot, dp, dz, tz, qv, ql, qr, qi, qs, qg, den, denfac, ccn, c_praut, rh_rain, vtr, r1, m1_rain, w1, h_var)
This subroutine includes warm rain cloud microphysics.
subroutine qs_tablew(n)
saturation water vapor pressure table ii
subroutine sedi_heat(ktop, kbot, dm, m1, dz, tz, qv, ql, qr, qi, qs, qg, cw)
This subroutine calculates sedimentation of heat.
real function qs_blend(t, p, q)
The function 'qs_blend' computes the saturated specific humidity with a blend of water and ice depend...
subroutine setup_con
The subroutine 'setup_con' sets up constants and calls 'qsmith_init'.
subroutine cs_profile(a4, del, km, do_mono)
subroutine subgrid_z_proc(ktop, kbot, p1, den, denfac, dts, rh_adj, tz, qv, ql, qr, qi, qs, qg, qa, h_var, rh_rain)
This subroutine calculates temperature sentive high vertical resolution processes.
subroutine es2_table1d(ta, es, n)
The subroutine 'es3_table1d' computes the saturated water vapor pressure for table iii.
This module contains the column GFDL Cloud microphysics scheme.
This module is more library code whereas the individual microphysics schemes contains specific detail...