45 use module_gfdlmp_param,
only: read_gfdlmp_nml, mp_time, t_min, t_sub, &
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)
498 call refl10cm_gfdl (qv1d, qr1d, qs1d, qg1d, &
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))
989end subroutine sedi_heat
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
1042 call check_column (ktop, kbot, qr, no_fall)
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
1102 call lagrangian_fall_ppm (ktop, kbot, zs, ze, zt, dp, qr, r1, m1_rain, mono_prof)
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
1209end subroutine warm_rain
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
1309end subroutine revap_racc
1318subroutine linear_prof (km, q, dm, z_var, h_var)
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))
1371end subroutine linear_prof
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)
1864end subroutine icloud
1870subroutine subgrid_z_proc (ktop, kbot, p1, den, denfac, dts, rh_adj, tz, qv, &
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)
2285end subroutine subgrid_z_proc
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
2377end subroutine revap_rac1
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)
2494 call check_column (ktop, kbot, qi, no_fall)
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))
2535 call lagrangian_fall_ppm (ktop, kbot, zs, ze, zt, dp, qi, i1, m1_sol, mono_prof)
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))
2556 call check_column (ktop, kbot, qs, no_fall)
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))
2602 call lagrangian_fall_ppm (ktop, kbot, zs, ze, zt, dp, qs, s1, m1, mono_prof)
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))
2625 call check_column (ktop, kbot, qg, no_fall)
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))
2670 call lagrangian_fall_ppm (ktop, kbot, zs, ze, zt, dp, qg, g1, m1, mono_prof)
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))
2689end subroutine terminal_fall
2695subroutine check_column (ktop, kbot, q, no_fall)
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
2716end subroutine check_column
2723subroutine implicit_fall (dt, ktop, kbot, ze, vt, dp, q, precip, m1)
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)
2786end subroutine implicit_fall
2792subroutine lagrangian_fall_ppm (ktop, kbot, zs, ze, zt, dp, q, precip, m1, mono)
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)
2840 n_loop:
do n = k0, kbot
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)))
2875 m1(ktop) = q(ktop) - qm(ktop)
2876 do k = ktop + 1, kbot
2877 m1(k) = m1(k - 1) + q(k) - qm(k)
2885 q(k) = qm(k) / dp(k)
2888end subroutine lagrangian_fall_ppm
2891subroutine cs_profile (a4, del, km, do_mono)
2895 integer,
intent (in) :: km
2897 real,
intent (in) :: del (km)
2899 logical,
intent (in) :: do_mono
2901 real,
intent (inout) :: a4 (4, km)
2903 real,
parameter :: qp_min = 1.e-6
2907 real :: d4, bet, a_bot, grat, pmp, lac
2908 real :: pmp_1, lac_1, pmp_2, lac_2
2909 real :: da1, da2, a6da
2915 grat = del(2) / del(1)
2916 bet = grat * (grat + 0.5)
2917 q(1) = (2. * grat * (grat + 1.) * a4(1, 1) + a4(1, 2)) / bet
2918 gam(1) = (1. + grat * (grat + 1.5)) / bet
2921 d4 = del(k - 1) / del(k)
2922 bet = 2. + 2. * d4 - gam(k - 1)
2923 q(k) = (3. * (a4(1, k - 1) + d4 * a4(1, k)) - q(k - 1)) / bet
2927 a_bot = 1. + d4 * (d4 + 1.5)
2928 q(km + 1) = (2. * d4 * (d4 + 1.) * a4(1, km) + a4(1, km - 1) - a_bot * q(km)) &
2929 / (d4 * (d4 + 0.5) - a_bot * gam(km))
2932 q(k) = q(k) - gam(k) * q(k + 1)
2940 gam(k) = a4(1, k) - a4(1, k - 1)
2951 q(1) = max(q(1), 0.)
2952 q(2) = min(q(2), max(a4(1, 1), a4(1, 2)))
2953 q(2) = max(q(2), min(a4(1, 1), a4(1, 2)), 0.)
2960 if (gam(k - 1) * gam(k + 1) > 0.)
then
2961 q(k) = min(q(k), max(a4(1, k - 1), a4(1, k)))
2962 q(k) = max(q(k), min(a4(1, k - 1), a4(1, k)))
2964 if (gam(k - 1) > 0.)
then
2966 q(k) = max(q(k), min(a4(1, k - 1), a4(1, k)))
2969 q(k) = min(q(k), max(a4(1, k - 1), a4(1, k)))
2970 q(k) = max(q(k), 0.0)
2979 q(km) = min(q(km), max(a4(1, km - 1), a4(1, km)))
2980 q(km) = max(q(km), min(a4(1, km - 1), a4(1, km)), 0.)
2993 if (gam(k) * gam(k + 1) > 0.0)
then
3004 if (a4(1, k) < qp_min .or. extm(k - 1) .or. extm(k + 1))
then
3009 a4(4, k) = 6. * a4(1, k) - 3. * (a4(2, k) + a4(3, k))
3010 if (abs(a4(4, k)) > abs(a4(2, k) - a4(3, k)))
then
3012 pmp_1 = a4(1, k) - 2.0 * gam(k + 1)
3013 lac_1 = pmp_1 + 1.5 * gam(k + 2)
3014 a4(2, k) = min(max(a4(2, k), min(a4(1, k), pmp_1, lac_1)), &
3015 max(a4(1, k), pmp_1, lac_1))
3016 pmp_2 = a4(1, k) + 2.0 * gam(k)
3017 lac_2 = pmp_2 - 1.5 * gam(k - 1)
3018 a4(3, k) = min(max(a4(3, k), min(a4(1, k), pmp_2, lac_2)), &
3019 max(a4(1, k), pmp_2, lac_2))
3026 if (a4(1, k) < qp_min .or. extm(k - 1) .or. extm(k + 1))
then
3035 a4(4, k) = 6. * a4(1, k) - 3. * (a4(2, k) + a4(3, k))
3044 da1 = a4(3, k) - a4(2, k)
3046 a6da = a4(4, k) * da1
3047 if (a6da < - da2)
then
3048 a4(4, k) = 3. * (a4(2, k) - a4(1, k))
3049 a4(3, k) = a4(2, k) - a4(4, k)
3050 elseif (a6da > da2)
then
3051 a4(4, k) = 3. * (a4(3, k) - a4(1, k))
3052 a4(2, k) = a4(3, k) - a4(4, k)
3056 call cs_limiters (km - 1, a4)
3062 a4(2, km) = a4(1, km)
3063 a4(3, km) = a4(1, km)
3066end subroutine cs_profile
3070subroutine cs_limiters (km, a4)
3074 integer,
intent (in) :: km
3076 real,
intent (inout) :: a4 (4, km)
3078 real,
parameter :: r12 = 1. / 12.
3087 if (abs(a4(3, k) - a4(2, k)) < - a4(4, k))
then
3088 if ((a4(1, k) + 0.25 * (a4(3, k) - a4(2, k)) ** 2 / a4(4, k) + a4(4, k) * r12) < 0.)
then
3089 if (a4(1, k) < a4(3, k) .and. a4(1, k) < a4(2, k))
then
3093 elseif (a4(3, k) > a4(2, k))
then
3094 a4(4, k) = 3. * (a4(2, k) - a4(1, k))
3095 a4(3, k) = a4(2, k) - a4(4, k)
3097 a4(4, k) = 3. * (a4(3, k) - a4(1, k))
3098 a4(2, k) = a4(3, k) - a4(4, k)
3104end subroutine cs_limiters
3109subroutine fall_speed (ktop, kbot, den, qs, qi, qg, ql, tk, vts, vti, vtg)
3113 integer,
intent (in) :: ktop, kbot
3115 real,
intent (in),
dimension (ktop:kbot) :: den, qs, qi, qg, ql, tk
3116 real,
intent (out),
dimension (ktop:kbot) :: vts, vti, vtg
3120 real,
parameter :: thi = 1.0e-8
3121 real,
parameter :: thg = 1.0e-8
3122 real,
parameter :: ths = 1.0e-8
3127 real,
parameter :: aa = - 4.14122e-5
3128 real,
parameter :: bb = - 0.00538922
3129 real,
parameter :: cc = - 0.0516344
3130 real,
parameter :: dd = 0.00216078
3131 real,
parameter :: ee = 1.9714
3135 real,
parameter :: vcons = 6.6280504
3136 real,
parameter :: vcong = 87.2382675
3137 real,
parameter :: vconh = vcong * sqrt(rhoh / rhog)
3138 real,
parameter :: norms = 942477796.076938
3139 real,
parameter :: normg = 5026548245.74367
3140 real,
parameter :: normh = pi * rhoh * rnzh
3142 real,
dimension (ktop:kbot) :: qden, tc, rhof
3158 rhof(k) = sqrt(min(10., sfcrho / den(k)))
3174 if (qi(k) < thi)
then
3177 tc(k) = tk(k) - tice
3178 vti(k) = (3. + log10(qi(k) * den(k))) * (tc(k) * (aa * tc(k) + bb) + cc) + dd * tc(k) + ee
3179 vti(k) = vi0 * exp(log_10 * vti(k)) * 0.9
3180 vti(k) = min(vi_max, max(vf_min, vti(k)))
3193 if (qs(k) < ths)
then
3196 vts(k) = vs_fac * vcons * rhof(k) * exp(0.0625 * log(qs(k) * den(k) / norms))
3197 vts(k) = min(vs_max, max(vf_min, vts(k)))
3210 if (qg(k) < thg)
then
3213 vtg(k) = vg_fac * vconh * rhof(k) * sqrt(sqrt(sqrt(qg(k) * den(k) / normh)))
3214 vtg(k) = min(vg_max, max(vf_min, vtg(k)))
3219 if (qg(k) < thg)
then
3222 vtg(k) = vg_fac * vcong * rhof(k) * sqrt(sqrt(sqrt(qg(k) * den(k) / normg)))
3223 vtg(k) = min(vg_max, max(vf_min, vtg(k)))
3229end subroutine fall_speed
3238 real :: gcon, cd, scm3, pisq, act (8)
3239 real :: vdifu, tcond
3242 real :: hlts, hltc, ri50
3244 real,
parameter :: gam263 = 1.456943, gam275 = 1.608355, gam290 = 1.827363, &
3245 gam325 = 2.54925, gam350 = 3.323363, gam380 = 4.694155, &
3246 gam425 = 8.285063, gam450 = 11.631769, gam480 = 17.837789, &
3247 gam625 = 184.860962, gam680 = 496.604067
3259 real,
parameter :: acc (3) = (/ 5.0, 2.0, 0.5 /)
3265 pie = 4. * atan(1.0)
3269 fac_rc = (4. / 3.) * pie * rhor * rthresh ** 3
3274 den_rc = fac_rc * ccn_o * 1.e6
3276 den_rc = fac_rc * ccn_l * 1.e6
3292 scm3 = (visk / vdifu) ** (1. / 3.)
3294 cracs = pisq * rnzr * rnzs * rhos
3295 csacr = pisq * rnzr * rnzs * rhor
3297 cgacr = pisq * rnzr * rnzh * rhor
3298 cgacs = pisq * rnzh * rnzs * rhos
3300 cgacr = pisq * rnzr * rnzg * rhor
3301 cgacs = pisq * rnzg * rnzs * rhos
3303 cgacs = cgacs * c_pgacs
3308 act(1) = pie * rnzs * rhos
3309 act(2) = pie * rnzr * rhor
3311 act(6) = pie * rnzh * rhoh
3313 act(6) = pie * rnzg * rhog
3323 acco(i, k) = acc(i) / (act(2 * k - 1) ** ((7 - i) * 0.25) * act(2 * k) ** (i * 0.25))
3327 gcon = 40.74 * sqrt(sfcrho)
3329 csacw = pie * rnzs * clin * gam325 / (4. * act(1) ** 0.8125)
3332 craci = pie * rnzr * alin * gam380 / (4. * act(2) ** 0.95)
3333 csaci = csacw * c_psaci
3336 cgacw = pie * rnzh * gam350 * gcon / (4. * act(6) ** 0.875)
3338 cgacw = pie * rnzg * gam350 * gcon / (4. * act(6) ** 0.875)
3343 cgaci = cgacw * 0.05
3347 cracw = c_cracw * cracw
3351 cssub(1) = 2. * pie * vdifu * tcond * rvgas * rnzs
3353 cgsub(1) = 2. * pie * vdifu * tcond * rvgas * rnzh
3355 cgsub(1) = 2. * pie * vdifu * tcond * rvgas * rnzg
3357 crevp(1) = 2. * pie * vdifu * tcond * rvgas * rnzr
3358 cssub(2) = 0.78 / sqrt(act(1))
3359 cgsub(2) = 0.78 / sqrt(act(6))
3360 crevp(2) = 0.78 / sqrt(act(2))
3361 cssub(3) = 0.31 * scm3 * gam263 * sqrt(clin / visk) / act(1) ** 0.65625
3362 cgsub(3) = 0.31 * scm3 * gam275 * sqrt(gcon / visk) / act(6) ** 0.6875
3363 crevp(3) = 0.31 * scm3 * gam290 * sqrt(alin / visk) / act(2) ** 0.725
3364 cssub(4) = tcond * rvgas
3365 cssub(5) = hlts ** 2 * vdifu
3369 crevp(5) = hltc ** 2 * vdifu
3371 cgfr(1) = 20.e2 * pisq * rnzr * rhor / act(2) ** 1.75
3376 csmlt(1) = 2. * pie * tcond * rnzs / hltf
3377 csmlt(2) = 2. * pie * vdifu * rnzs * hltc / hltf
3380 csmlt(5) = ch2o / hltf
3385 cgmlt(1) = 2. * pie * tcond * rnzh / hltf
3386 cgmlt(2) = 2. * pie * vdifu * rnzh * hltc / hltf
3388 cgmlt(1) = 2. * pie * tcond * rnzg / hltf
3389 cgmlt(2) = 2. * pie * vdifu * rnzg * hltc / hltf
3393 cgmlt(5) = ch2o / hltf
3398end subroutine setupm
3406 fn_nml, errmsg, errflg)
3410 integer,
intent (in) :: me
3411 integer,
intent (in) :: master
3412 integer,
intent (in) :: nlunit
3413 integer,
intent (in) :: logunit
3415 character (len = 64),
intent (in) :: fn_nml
3416 character (len = *),
intent (in) :: input_nml_file(:)
3417 character(len=*),
intent(out) :: errmsg
3418 integer,
intent(out) :: errflg
3440 call read_gfdlmp_nml(errmsg = errmsg, errflg = errflg, unit = nlunit, &
3441 input_nml_file = input_nml_file, fn_nml = fn_nml, version=1, &
3443 if(errflg/=0)
return
3446 if (me == master)
then
3447 write (logunit, *)
" ================================================================== "
3448 write (logunit, *)
"gfdl_cloud_microphysics_nml"
3514 module_is_initialized = .true.
3553 tables_are_initialized = .false.
3569 if (.not. qsmith_tables_initialized)
call qsmith_init
3571 qsmith_tables_initialized = .true.
3573end subroutine setup_con
3581real function acr3d (v1, v2, q1, q2, c, cac, rho)
3585 real,
intent (in) :: v1, v2, c, rho
3586 real,
intent (in) :: q1, q2
3587 real,
intent (in) :: cac (3)
3606 acr3d = c * abs(v1 - v2) * q1 * s2 * (cac(1) * t1 + cac(2) * sqrt(t1) * s2 + cac(3) * s1)
3616real function smlt (tc, dqs, qsrho, psacw, psacr, c, rho, rhofac)
3620 real,
intent (in) :: tc, dqs, qsrho, psacw, psacr, c (5), rho, rhofac
3622 smlt = (c(1) * tc / rho - c(2) * dqs) * (c(3) * sqrt(qsrho) + &
3623 c(4) * qsrho ** 0.65625 * sqrt(rhofac)) + c(5) * tc * (psacw + psacr)
3632real function gmlt (tc, dqs, qgrho, pgacw, pgacr, c, rho)
3636 real,
intent (in) :: tc, dqs, qgrho, pgacw, pgacr, c (5), rho
3638 gmlt = (c(1) * tc / rho - c(2) * dqs) * (c(3) * sqrt(qgrho) + &
3639 c(4) * qgrho ** 0.6875 / rho ** 0.25) + c(5) * tc * (pgacw + pgacr)
3654subroutine qsmith_init
3658 integer,
parameter :: length = 2621
3662 if (.not. tables_are_initialized)
then
3675 allocate (table(length))
3676 allocate (table2(length))
3677 allocate (table3(length))
3678 allocate (tablew(length))
3679 allocate (des(length))
3680 allocate (des2(length))
3681 allocate (des3(length))
3682 allocate (desw(length))
3684 call qs_table (length)
3685 call qs_table2 (length)
3686 call qs_table3 (length)
3687 call qs_tablew (length)
3689 do i = 1, length - 1
3690 des(i) = max(0., table(i + 1) - table(i))
3691 des2(i) = max(0., table2(i + 1) - table2(i))
3692 des3(i) = max(0., table3(i + 1) - table3(i))
3693 desw(i) = max(0., tablew(i + 1) - tablew(i))
3695 des(length) = des(length - 1)
3696 des2(length) = des2(length - 1)
3697 des3(length) = des3(length - 1)
3698 desw(length) = desw(length - 1)
3700 tables_are_initialized = .true.
3704end subroutine qsmith_init
3711real function wqs1 (ta, den)
3718 real,
intent (in) :: ta, den
3720 real :: es, ap1, tmin
3724 tmin = table_ice - 160.
3725 ap1 = 10. * dim(ta, tmin) + 1.
3726 ap1 = min(2621., ap1)
3728 es = tablew(it) + (ap1 - it) * desw(it)
3729 wqs1 = es / (rvgas * ta * den)
3740real function wqs2 (ta, den, dqdt)
3747 real,
intent (in) :: ta, den
3749 real,
intent (out) :: dqdt
3751 real :: es, ap1, tmin
3755 tmin = table_ice - 160.
3757 if (.not. tables_are_initialized)
call qsmith_init
3759 ap1 = 10. * dim(ta, tmin) + 1.
3760 ap1 = min(2621., ap1)
3762 es = tablew(it) + (ap1 - it) * desw(it)
3763 wqs2 = es / (rvgas * ta * den)
3766 dqdt = 10. * (desw(it) + (ap1 - it) * (desw(it + 1) - desw(it))) / (rvgas * ta * den)
3776real function wet_bulb (q, t, den)
3780 real,
intent (in) :: t, q, den
3782 real :: qs, tp, dqdt
3785 qs = wqs2(wet_bulb, den, dqdt)
3786 tp = 0.5 * (qs - q) / (1. + lcp * dqdt) * lcp
3787 wet_bulb = wet_bulb - tp
3791 qs = wqs2(wet_bulb, den, dqdt)
3792 tp = (qs - q) / (1. + lcp * dqdt) * lcp
3793 wet_bulb = wet_bulb - tp
3796end function wet_bulb
3803real function iqs1 (ta, den)
3810 real,
intent (in) :: ta, den
3812 real :: es, ap1, tmin
3816 tmin = table_ice - 160.
3817 ap1 = 10. * dim(ta, tmin) + 1.
3818 ap1 = min(2621., ap1)
3820 es = table2(it) + (ap1 - it) * des2(it)
3821 iqs1 = es / (rvgas * ta * den)
3830real function iqs2 (ta, den, dqdt)
3837 real,
intent (in) :: ta, den
3839 real,
intent (out) :: dqdt
3841 real :: es, ap1, tmin
3845 tmin = table_ice - 160.
3846 ap1 = 10. * dim(ta, tmin) + 1.
3847 ap1 = min(2621., ap1)
3849 es = table2(it) + (ap1 - it) * des2(it)
3850 iqs2 = es / (rvgas * ta * den)
3852 dqdt = 10. * (des2(it) + (ap1 - it) * (des2(it + 1) - des2(it))) / (rvgas * ta * den)
3861real function qs1d_moist (ta, qv, pa, dqdt)
3865 real,
intent (in) :: ta, pa, qv
3867 real,
intent (out) :: dqdt
3869 real :: es, ap1, tmin, eps10
3873 tmin = table_ice - 160.
3875 ap1 = 10. * dim(ta, tmin) + 1.
3876 ap1 = min(2621., ap1)
3878 es = table2(it) + (ap1 - it) * des2(it)
3879 qs1d_moist = eps * es * (1. + zvir * qv) / pa
3881 dqdt = eps10 * (des2(it) + (ap1 - it) * (des2(it + 1) - des2(it))) * (1. + zvir * qv) / pa
3883end function qs1d_moist
3891real function wqsat2_moist (ta, qv, pa, dqdt)
3895 real,
intent (in) :: ta, pa, qv
3897 real,
intent (out) :: dqdt
3899 real :: es, ap1, tmin, eps10
3903 tmin = table_ice - 160.
3905 ap1 = 10. * dim(ta, tmin) + 1.
3906 ap1 = min(2621., ap1)
3908 es = tablew(it) + (ap1 - it) * desw(it)
3909 wqsat2_moist = eps * es * (1. + zvir * qv) / pa
3911 dqdt = eps10 * (desw(it) + (ap1 - it) * (desw(it + 1) - desw(it))) * (1. + zvir * qv) / pa
3913end function wqsat2_moist
3921real function wqsat_moist (ta, qv, pa)
3925 real,
intent (in) :: ta, pa, qv
3927 real :: es, ap1, tmin
3931 tmin = table_ice - 160.
3932 ap1 = 10. * dim(ta, tmin) + 1.
3933 ap1 = min(2621., ap1)
3935 es = tablew(it) + (ap1 - it) * desw(it)
3936 wqsat_moist = eps * es * (1. + zvir * qv) / pa
3938end function wqsat_moist
3945real function qs1d_m (ta, qv, pa)
3949 real,
intent (in) :: ta, pa, qv
3951 real :: es, ap1, tmin
3955 tmin = table_ice - 160.
3956 ap1 = 10. * dim(ta, tmin) + 1.
3957 ap1 = min(2621., ap1)
3959 es = table2(it) + (ap1 - it) * des2(it)
3960 qs1d_m = eps * es * (1. + zvir * qv) / pa
3969real function d_sat (ta, den)
3973 real,
intent (in) :: ta, den
3975 real :: es_w, es_i, ap1, tmin
3979 tmin = table_ice - 160.
3980 ap1 = 10. * dim(ta, tmin) + 1.
3981 ap1 = min(2621., ap1)
3983 es_w = tablew(it) + (ap1 - it) * desw(it)
3984 es_i = table2(it) + (ap1 - it) * des2(it)
3985 d_sat = dim(es_w, es_i) / (rvgas * ta * den)
3994real function esw_table (ta)
3998 real,
intent (in) :: ta
4004 tmin = table_ice - 160.
4005 ap1 = 10. * dim(ta, tmin) + 1.
4006 ap1 = min(2621., ap1)
4008 esw_table = tablew(it) + (ap1 - it) * desw(it)
4010end function esw_table
4017real function es2_table (ta)
4021 real,
intent (in) :: ta
4027 tmin = table_ice - 160.
4028 ap1 = 10. * dim(ta, tmin) + 1.
4029 ap1 = min(2621., ap1)
4031 es2_table = table2(it) + (ap1 - it) * des2(it)
4033end function es2_table
4039subroutine esw_table1d (ta, es, n)
4043 integer,
intent (in) :: n
4045 real,
intent (in) :: ta (n)
4047 real,
intent (out) :: es (n)
4053 tmin = table_ice - 160.
4056 ap1 = 10. * dim(ta(i), tmin) + 1.
4057 ap1 = min(2621., ap1)
4059 es(i) = tablew(it) + (ap1 - it) * desw(it)
4062end subroutine esw_table1d
4068subroutine es2_table1d (ta, es, n)
4072 integer,
intent (in) :: n
4074 real,
intent (in) :: ta (n)
4076 real,
intent (out) :: es (n)
4082 tmin = table_ice - 160.
4085 ap1 = 10. * dim(ta(i), tmin) + 1.
4086 ap1 = min(2621., ap1)
4088 es(i) = table2(it) + (ap1 - it) * des2(it)
4091end subroutine es2_table1d
4097subroutine es3_table1d (ta, es, n)
4101 integer,
intent (in) :: n
4103 real,
intent (in) :: ta (n)
4105 real,
intent (out) :: es (n)
4111 tmin = table_ice - 160.
4114 ap1 = 10. * dim(ta(i), tmin) + 1.
4115 ap1 = min(2621., ap1)
4117 es(i) = table3(it) + (ap1 - it) * des3(it)
4120end subroutine es3_table1d
4126subroutine qs_tablew (n)
4130 integer,
intent (in) :: n
4133 real :: tmin, tem, fac0, fac1, fac2
4137 tmin = table_ice - 160.
4144 tem = tmin + delt * real(i - 1)
4145 fac0 = (tem - t_ice) / (tem * t_ice)
4147 fac2 = (dc_vap * log(tem / t_ice) + fac1) / rvgas
4148 tablew(i) = e00 * exp(fac2)
4151end subroutine qs_tablew
4157subroutine qs_table2 (n)
4161 integer,
intent (in) :: n
4164 real :: tmin, tem0, tem1, fac0, fac1, fac2
4166 integer :: i, i0, i1
4168 tmin = table_ice - 160.
4171 tem0 = tmin + delt * real(i - 1)
4172 fac0 = (tem0 - t_ice) / (tem0 * t_ice)
4178 fac2 = (d2ice * log(tem0 / t_ice) + fac1) / rvgas
4184 fac2 = (dc_vap * log(tem0 / t_ice) + fac1) / rvgas
4186 table2(i) = e00 * exp(fac2)
4195 tem0 = 0.25 * (table2(i0 - 1) + 2. * table(i0) + table2(i0 + 1))
4196 tem1 = 0.25 * (table2(i1 - 1) + 2. * table(i1) + table2(i1 + 1))
4200end subroutine qs_table2
4206subroutine qs_table3 (n)
4210 integer,
intent (in) :: n
4213 real :: esbasw, tbasw, esbasi, tmin, tem, aa, b, c, d, e
4216 integer :: i, i0, i1
4219 tbasw = table_ice + 100.
4221 tmin = table_ice - 160.
4224 tem = tmin + delt * real(i - 1)
4231 aa = - 9.09718 * (table_ice / tem - 1.)
4232 b = - 3.56654 * alog10(table_ice / tem)
4233 c = 0.876793 * (1. - tem / table_ice)
4235 table3(i) = 0.1 * 10 ** (aa + b + c + e)
4241 aa = - 7.90298 * (tbasw / tem - 1.)
4242 b = 5.02808 * alog10(tbasw / tem)
4243 c = - 1.3816e-7 * (10 ** ((1. - tem / tbasw) * 11.344) - 1.)
4244 d = 8.1328e-3 * (10 ** ((tbasw / tem - 1.) * (- 3.49149)) - 1.)
4246 table3(i) = 0.1 * 10 ** (aa + b + c + d + e)
4256 tem0 = 0.25 * (table3(i0 - 1) + 2. * table(i0) + table3(i0 + 1))
4257 tem1 = 0.25 * (table3(i1 - 1) + 2. * table(i1) + table3(i1 + 1))
4261end subroutine qs_table3
4269real function qs_blend (t, p, q)
4273 real,
intent (in) :: t, p, q
4275 real :: es, ap1, tmin
4279 tmin = table_ice - 160.
4280 ap1 = 10. * dim(t, tmin) + 1.
4281 ap1 = min(2621., ap1)
4283 es = table(it) + (ap1 - it) * des(it)
4284 qs_blend = eps * es * (1. + zvir * q) / p
4286end function qs_blend
4292subroutine qs_table (n)
4296 integer,
intent (in) :: n
4299 real :: tmin, tem, esh20
4300 real :: wice, wh2o, fac0, fac1, fac2
4305 tmin = table_ice - 160.
4312 tem = tmin + delt * real(i - 1)
4313 fac0 = (tem - t_ice) / (tem * t_ice)
4315 fac2 = (d2ice * log(tem / t_ice) + fac1) / rvgas
4316 table(i) = e00 * exp(fac2)
4324 tem = 253.16 + delt * real(i - 1)
4325 fac0 = (tem - t_ice) / (tem * t_ice)
4327 fac2 = (dc_vap * log(tem / t_ice) + fac1) / rvgas
4328 esh20 = e00 * exp(fac2)
4332 table(i + 1400) = esh20
4341 tem = 253.16 + delt * real(i - 1)
4342 wice = 0.05 * (table_ice - tem)
4343 wh2o = 0.05 * (tem - 253.16)
4344 table(i + 1400) = wice * table(i + 1400) + wh2o * esupc(i)
4347end subroutine qs_table
4356subroutine qsmith (im, km, ks, t, p, q, qs, dqdt)
4360 integer,
intent (in) :: im, km, ks
4362 real,
intent (in),
dimension (im, km) :: t, p, q
4364 real,
intent (out),
dimension (im, km) :: qs
4366 real,
intent (out),
dimension (im, km),
optional :: dqdt
4368 real :: eps10, ap1, tmin
4370 real,
dimension (im, km) :: es
4374 tmin = table_ice - 160.
4377 if (.not. tables_are_initialized)
then
4383 ap1 = 10. * dim(t(i, k), tmin) + 1.
4384 ap1 = min(2621., ap1)
4386 es(i, k) = table(it) + (ap1 - it) * des(it)
4387 qs(i, k) = eps * es(i, k) * (1. + zvir * q(i, k)) / p(i, k)
4391 if (
present (dqdt))
then
4394 ap1 = 10. * dim(t(i, k), tmin) + 1.
4395 ap1 = min(2621., ap1) - 0.5
4397 dqdt(i, k) = eps10 * (des(it) + (ap1 - it) * (des(it + 1) - des(it))) * (1. + zvir * q(i, k)) / p(i, k)
4402end subroutine qsmith
4408subroutine neg_adj (ktop, kbot, pt, dp, qv, ql, qr, qi, qs, qg)
4412 integer,
intent (in) :: ktop, kbot
4414 real,
intent (in),
dimension (ktop:kbot) :: dp
4416 real,
intent (inout),
dimension (ktop:kbot) :: pt, qv, ql, qr, qi, qs, qg
4418 real,
dimension (ktop:kbot) :: lcpk, icpk
4429 cvm = c_air + qv(k) * c_vap + (qr(k) + ql(k)) * c_liq + (qi(k) + qs(k) + qg(k)) * c_ice
4430 lcpk(k) = (lv00 + d0_vap * pt(k)) / cvm
4431 icpk(k) = (li00 + dc_ice * pt(k)) / cvm
4441 if (qi(k) < 0.)
then
4442 qs(k) = qs(k) + qi(k)
4446 if (qs(k) < 0.)
then
4447 qg(k) = qg(k) + qs(k)
4451 if (qg(k) < 0.)
then
4452 qr(k) = qr(k) + qg(k)
4453 pt(k) = pt(k) - qg(k) * icpk(k)
4462 if (qr(k) < 0.)
then
4463 ql(k) = ql(k) + qr(k)
4467 if (ql(k) < 0.)
then
4468 qv(k) = qv(k) + ql(k)
4469 pt(k) = pt(k) - ql(k) * lcpk(k)
4479 do k = ktop, kbot - 1
4480 if (qv(k) < 0.)
then
4481 qv(k + 1) = qv(k + 1) + qv(k) * dp(k) / dp(k + 1)
4490 if (qv(kbot) < 0. .and. qv(kbot - 1) > 0.)
then
4491 dq = min(- qv(kbot) * dp(kbot), qv(kbot - 1) * dp(kbot - 1))
4492 qv(kbot - 1) = qv(kbot - 1) - dq / dp(kbot - 1)
4493 qv(kbot) = qv(kbot) + dq / dp(kbot)
4496end subroutine neg_adj
4547subroutine interpolate_z (is, ie, js, je, km, zl, hgt, a3, a2)
4551 integer,
intent (in) :: is, ie, js, je, km
4553 real,
intent (in),
dimension (is:ie, js:je, km) :: a3
4555 real,
intent (in),
dimension (is:ie, js:je, km + 1) :: hgt
4557 real,
intent (in) :: zl
4559 real,
intent (out),
dimension (is:ie, js:je) :: a2
4561 real,
dimension (km) :: zm
4570 zm(k) = 0.5 * (hgt(i, j, k) + hgt(i, j, k + 1))
4572 if (zl >= zm(1))
then
4573 a2(i, j) = a3(i, j, 1)
4574 elseif (zl <= zm(km))
then
4575 a2(i, j) = a3(i, j, km)
4578 if (zl <= zm(k) .and. zl >= zm(k + 1))
then
4579 a2(i, j) = a3(i, j, k) + (a3(i, j, k + 1) - a3(i, j, k)) * (zm(k) - zl) / (zm(k) - zm(k + 1))
4587end subroutine interpolate_z
4595subroutine cloud_diagnosis (is, ie, ks, ke, den, delp, lsm, qmw, qmi, qmr, qms, qmg, t, &
4596 rew, rei, rer, res, reg)
4600 integer,
intent (in) :: is, ie, ks, ke
4601 integer,
intent (in),
dimension (is:ie) :: lsm
4603 real,
intent (in),
dimension (is:ie, ks:ke) :: den, delp, t
4604 real,
intent (in),
dimension (is:ie, ks:ke) :: qmw, qmi, qmr, qms, qmg
4606 real,
intent (out),
dimension (is:ie, ks:ke) :: rew, rei, rer, res, reg
4608 real,
dimension (is:ie, ks:ke) :: qcw, qci, qcr, qcs, qcg
4612 real :: lambdar, lambdas, lambdag
4613 real :: dpg, rei_fac, mask, ccn, bw
4614 real,
parameter :: rho_0 = 50.e-3
4616 real :: rhow = 1.0e3, rhor = 1.0e3, rhos = 1.0e2, rhog = 4.0e2
4617 real :: n0r = 8.0e6, n0s = 3.0e6, n0g = 4.0e6
4618 real :: alphar = 0.8, alphas = 0.25, alphag = 0.5
4619 real :: gammar = 17.837789, gammas = 8.2850630, gammag = 11.631769
4620 real :: qmin = 1.0e-12, beta = 1.22, qmin1 = 9.e-6
4625 dpg = abs(delp(i, k)) / grav
4626 mask = min(max(real(lsm(i)), 0.0), 2.0)
4632 ccn = 0.80 * (- 1.15e-3 * (ccn_o ** 2) + 0.963 * ccn_o + 5.30) * abs(mask - 1.0) + &
4633 0.67 * (- 2.10e-4 * (ccn_l ** 2) + 0.568 * ccn_l - 27.9) * (1.0 - abs(mask - 1.0))
4635 if (qmw(i, k) .gt. qmin)
then
4636 qcw(i, k) = dpg * qmw(i, k) * 1.0e3
4637 rew(i, k) = exp(1.0 / 3.0 * log((3.0 * den(i, k) * qmw(i, k)) / (4.0 * pi * rhow * ccn))) * 1.0e4
4638 rew(i, k) = max(rewmin, min(rewmax, rew(i, k)))
4644 if (reiflag .eq. 1)
then
4650 if (qmi(i, k) .gt. qmin1)
then
4651 qci(i, k) = dpg * qmi(i, k) * 1.0e3
4652 rei_fac = log(1.0e3 * qmi(i, k) * den(i, k))
4653 if (t(i, k) - tice .lt. - 50)
then
4654 rei(i, k) = beta / 9.917 * exp(0.109 * rei_fac) * 1.0e3
4655 elseif (t(i, k) - tice .lt. - 40)
then
4656 rei(i, k) = beta / 9.337 * exp(0.080 * rei_fac) * 1.0e3
4657 elseif (t(i, k) - tice .lt. - 30)
then
4658 rei(i, k) = beta / 9.208 * exp(0.055 * rei_fac) * 1.0e3
4660 rei(i, k) = beta / 9.387 * exp(0.031 * rei_fac) * 1.0e3
4662 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
4670 if (reiflag .eq. 2)
then
4676 if (qmi(i, k) .gt. qmin1)
then
4677 qci(i, k) = dpg * qmi(i, k) * 1.0e3
4678 bw = - 2. + 1.e-3 * log10(den(i, k) * qmi(i, k) / rho_0) * max(0.0, tice - t(i, k)) ** 1.5
4679 rei(i, k) = 377.4 + bw * (203.3 + bw * (37.91 + 2.3696 * bw))
4680 rei(i, k) = max(reimin, min(reimax, rei(i, k)))
4692 if (qmr(i, k) .gt. qmin)
then
4693 qcr(i, k) = dpg * qmr(i, k) * 1.0e3
4694 lambdar = exp(0.25 * log(pi * rhor * n0r / qmr(i, k) / den(i, k)))
4695 rer(i, k) = 0.5 * exp(log(gammar / 6) / alphar) / lambdar * 1.0e6
4696 rer(i, k) = max(rermin, min(rermax, rer(i, k)))
4706 if (qms(i, k) .gt. qmin1)
then
4707 qcs(i, k) = dpg * qms(i, k) * 1.0e3
4708 lambdas = exp(0.25 * log(pi * rhos * n0s / qms(i, k) / den(i, k)))
4709 res(i, k) = 0.5 * exp(log(gammas / 6) / alphas) / lambdas * 1.0e6
4710 res(i, k) = max(resmin, min(resmax, res(i, k)))
4720 if (qmg(i, k) .gt. qmin)
then
4721 qcg(i, k) = dpg * qmg(i, k) * 1.0e3
4722 lambdag = exp(0.25 * log(pi * rhog * n0g / qmg(i, k) / den(i, k)))
4723 reg(i, k) = 0.5 * exp(log(gammag / 6) / alphag) / lambdag * 1.0e6
4724 reg(i, k) = max(regmin, min(regmax, reg(i, k)))
4738 subroutine refl10cm_gfdl (qv1d, qr1d, qs1d, qg1d, &
4739 t1d, p1d, dBZ, kts, kte, ii, jj, melti)
4744 INTEGER,
INTENT(IN):: kts, kte, ii,jj
4745 REAL,
DIMENSION(kts:kte),
INTENT(IN):: &
4746 qv1d, qr1d, qs1d, qg1d, t1d, p1d
4747 REAL,
DIMENSION(kts:kte),
INTENT(INOUT):: dbz
4750 REAL,
DIMENSION(kts:kte):: temp, pres, qv, rho
4751 REAL,
DIMENSION(kts:kte):: rr, rs, rg
4754 DOUBLE PRECISION,
DIMENSION(kts:kte):: ilamr, ilams, ilamg
4755 DOUBLE PRECISION,
DIMENSION(kts:kte):: n0_r, n0_s, n0_g
4756 DOUBLE PRECISION:: lamr, lams, lamg
4757 LOGICAL,
DIMENSION(kts:kte):: l_qr, l_qs, l_qg
4759 REAL,
DIMENSION(kts:kte):: ze_rain, ze_snow, ze_graupel
4760 DOUBLE PRECISION:: fmelt_s, fmelt_g
4762 INTEGER:: i, k, k_0, kbot, n
4763 LOGICAL,
INTENT(IN):: melti
4764 DOUBLE PRECISION:: cback, x, eta, f_d
4777 qv(k) = max(1.e-10, qv1d(k))
4779 rho(k) = 0.622*pres(k)/(rdgas*temp(k)*(qv(k)+0.622))
4781 if (qr1d(k) .gt. 1.e-9)
then
4782 rr(k) = qr1d(k)*rho(k)
4784 lamr = (xam_r*xcrg(3)*n0_r(k)/rr(k))**(1./xcre(1))
4792 if (qs1d(k) .gt. 1.e-9)
then
4793 rs(k) = qs1d(k)*rho(k)
4795 lams = (xam_s*xcsg(3)*n0_s(k)/rs(k))**(1./xcse(1))
4803 if (qg1d(k) .gt. 1.e-9)
then
4804 rg(k) = qg1d(k)*rho(k)
4806 lamg = (xam_g*xcgg(3)*n0_g(k)/rg(k))**(1./xcge(1))
4819 k_loop:
do k = kte-1, kts, -1
4820 if ( melti .and. (temp(k).gt.273.15) .and. l_qr(k) &
4821 .and. (l_qs(k+1).or.l_qg(k+1)) )
then
4834 ze_graupel(k) = 1.e-22
4835 if (l_qr(k)) ze_rain(k) = n0_r(k)*xcrg(4)*ilamr(k)**xcre(4)
4836 if (l_qs(k)) ze_snow(k) = (0.176/0.93) * (6.0/pi)*(6.0/pi) &
4837 * (xam_s/900.0)*(xam_s/900.0) &
4838 * n0_s(k)*xcsg(4)*ilams(k)**xcse(4)
4839 if (l_qg(k)) ze_graupel(k) = (0.176/0.93) * (6.0/pi)*(6.0/pi) &
4840 * (xam_g/900.0)*(xam_g/900.0) &
4841 * n0_g(k)*xcgg(4)*ilamg(k)**xcge(4)
4853 if (melti .and. k_0.ge.kts+1)
then
4854 do k = k_0-1, kts, -1
4857 if (l_qs(k) .and. l_qs(k_0) )
then
4858 fmelt_s = max(0.005d0, min(1.0d0-rs(k)/rs(k_0), 0.99d0))
4862 x = xam_s * xxds(n)**xbm_s
4863 call rayleigh_soak_wetgraupel (x,dble(xocms),dble(xobms), &
4864 fmelt_s, melt_outside_s, m_w_0, m_i_0, lamda_radar, &
4865 cback, mixingrulestring_s, matrixstring_s, &
4866 inclusionstring_s, hoststring_s, &
4867 hostmatrixstring_s, hostinclusionstring_s)
4868 f_d = n0_s(k)*xxds(n)**xmu_s * dexp(-lams*xxds(n))
4869 eta = eta + f_d * cback * simpson(n) * xdts(n)
4871 ze_snow(k) = sngl(lamda4 / (pi5 * k_w) * eta)
4877 if (l_qg(k) .and. l_qg(k_0) )
then
4878 fmelt_g = max(0.005d0, min(1.0d0-rg(k)/rg(k_0), 0.99d0))
4882 x = xam_g * xxdg(n)**xbm_g
4883 call rayleigh_soak_wetgraupel (x,dble(xocmg),dble(xobmg), &
4884 fmelt_g, melt_outside_g, m_w_0, m_i_0, lamda_radar, &
4885 cback, mixingrulestring_g, matrixstring_g, &
4886 inclusionstring_g, hoststring_g, &
4887 hostmatrixstring_g, hostinclusionstring_g)
4888 f_d = n0_g(k)*xxdg(n)**xmu_g * dexp(-lamg*xxdg(n))
4889 eta = eta + f_d * cback * simpson(n) * xdtg(n)
4891 ze_graupel(k) = sngl(lamda4 / (pi5 * k_w) * eta)
4898 dbz(k) = 10.*log10((ze_rain(k)+ze_snow(k)+ze_graupel(k))*1.d18)
4902 end subroutine refl10cm_gfdl
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, 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, 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.
This module contains the column GFDL Cloud microphysics scheme.
This module is more library code whereas the individual microphysics schemes contains specific detail...