4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE cv30_unsat(icb, inb, t, rr, rs, gz, u, v, p, ph, th, tv, lv, & |
SUBROUTINE cv30_unsat(icb, inb, t, q, qs, gz, u, v, p, ph, th, tv, lv, cpn, & |
8 |
cpn, ep, sigp, clw, m, ment, elij, delt, plcl, mp, rp, up, vp, wt, & |
ep, sigp, clw, m, ment, elij, delt, plcl, mp, qp, up, vp, wt, water, & |
9 |
water, evap, b) |
evap, b) |
10 |
|
|
11 |
use cv30_param_m, only: nl, sigd |
use cv30_param_m, only: nl, sigd |
12 |
use cvthermo, only: cpd, ginv, grav |
use cv_thermo_m, only: cpd, ginv, grav |
13 |
USE dimphy, ONLY: klon, klev |
USE dimphy, ONLY: klon, klev |
14 |
|
|
15 |
! inputs: |
integer, intent(in):: icb(:) ! (ncum) |
16 |
integer, intent(in):: icb(:), inb(:) ! (ncum) |
|
17 |
real t(klon, klev), rr(klon, klev), rs(klon, klev) |
integer, intent(in):: inb(:) ! (ncum) |
18 |
real gz(klon, klev) |
! first model level above the level of neutral buoyancy of the |
19 |
real u(klon, klev), v(klon, klev) |
! parcel (1 <= inb <= nl - 1) |
20 |
real p(klon, klev), ph(klon, klev + 1) |
|
21 |
real th(klon, klev) |
real, intent(in):: t(:, :), q(:, :), qs(:, :) ! (klon, klev) |
22 |
real tv(klon, klev) |
real, intent(in):: gz(:, :) ! (klon, klev) |
23 |
real lv(klon, klev) |
real, intent(in):: u(:, :), v(:, :) ! (klon, klev) |
24 |
real cpn(klon, klev) |
real, intent(in):: p(klon, klev), ph(klon, klev + 1) |
25 |
real, intent(in):: ep(klon, klev), sigp(klon, klev), clw(klon, klev) |
real, intent(in):: th(klon, klev) |
26 |
real m(klon, klev), ment(klon, klev, klev), elij(klon, klev, klev) |
real, intent(in):: tv(klon, klev) |
27 |
|
real, intent(in):: lv(klon, klev) |
28 |
|
real, intent(in):: cpn(klon, klev) |
29 |
|
real, intent(in):: ep(:, :), sigp(:, :), clw(:, :) ! (ncum, klev) |
30 |
|
real, intent(in):: m(:, :) ! (ncum, klev) |
31 |
|
real, intent(in):: ment(:, :, :) ! (ncum, klev, klev) |
32 |
|
real, intent(in):: elij(:, :, :) ! (ncum, klev, klev) |
33 |
real, intent(in):: delt |
real, intent(in):: delt |
34 |
real plcl(klon) |
real, intent(in):: plcl(klon) |
35 |
|
|
36 |
! outputs: |
! outputs: |
37 |
real mp(klon, klev), rp(klon, klev), up(klon, klev), vp(klon, klev) |
real, intent(out):: mp(klon, klev) |
38 |
|
real, intent(out):: qp(:, :), up(:, :), vp(:, :) ! (ncum, nl) |
39 |
real wt(klon, klev), water(klon, klev), evap(klon, klev) |
real wt(klon, klev), water(klon, klev), evap(klon, klev) |
40 |
real, intent(out):: b(:, :) ! (ncum, nl) |
real, intent(out):: b(:, :) ! (ncum, nl - 1) |
41 |
|
|
42 |
! Local: |
! Local: |
43 |
integer ncum |
integer ncum |
57 |
delti = 1. / delt |
delti = 1. / delt |
58 |
tinv = 1. / 3. |
tinv = 1. / 3. |
59 |
mp = 0. |
mp = 0. |
60 |
|
b = 0. |
61 |
|
|
62 |
do i = 1, nl |
do i = 1, nl |
63 |
do il = 1, ncum |
do il = 1, ncum |
64 |
mp(il, i) = 0. |
qp(il, i) = q(il, i) |
|
rp(il, i) = rr(il, i) |
|
65 |
up(il, i) = u(il, i) |
up(il, i) = u(il, i) |
66 |
vp(il, i) = v(il, i) |
vp(il, i) = v(il, i) |
67 |
wt(il, i) = 0.001 |
wt(il, i) = 0.001 |
68 |
water(il, i) = 0. |
water(il, i) = 0. |
69 |
evap(il, i) = 0. |
evap(il, i) = 0. |
|
b(il, i) = 0. |
|
70 |
lvcp(il, i) = lv(il, i) / cpn(il, i) |
lvcp(il, i) = lv(il, i) / cpn(il, i) |
71 |
enddo |
enddo |
72 |
enddo |
enddo |
109 |
endif |
endif |
110 |
|
|
111 |
! find rain water and evaporation using provisional |
! find rain water and evaporation using provisional |
112 |
! estimates of rp(i) and rp(i - 1) |
! estimates of qp(i) and qp(i - 1) |
113 |
|
|
114 |
do il = 1, ncum |
do il = 1, ncum |
115 |
if (i <= inb(il) .and. lwork(il)) then |
if (i <= inb(il) .and. lwork(il)) then |
116 |
wt(il, i) = 45. |
wt(il, i) = 45. |
117 |
|
|
118 |
if (i < inb(il)) then |
if (i < inb(il)) then |
119 |
rp(il, i) = rp(il, i + 1) + (cpd * (t(il, i + 1) & |
qp(il, i) = qp(il, i + 1) + (cpd * (t(il, i + 1) & |
120 |
- t(il, i)) + gz(il, i + 1) - gz(il, i)) / lv(il, i) |
- t(il, i)) + gz(il, i + 1) - gz(il, i)) / lv(il, i) |
121 |
rp(il, i) = 0.5 * (rp(il, i) + rr(il, i)) |
qp(il, i) = 0.5 * (qp(il, i) + q(il, i)) |
122 |
endif |
endif |
123 |
|
|
124 |
rp(il, i) = max(rp(il, i), 0.) |
qp(il, i) = max(qp(il, i), 0.) |
125 |
rp(il, i) = min(rp(il, i), rs(il, i)) |
qp(il, i) = min(qp(il, i), qs(il, i)) |
126 |
rp(il, inb(il)) = rr(il, inb(il)) |
qp(il, inb(il)) = q(il, inb(il)) |
127 |
|
|
128 |
if (i == 1) then |
if (i == 1) then |
129 |
afac = p(il, 1) * (rs(il, 1) - rp(il, 1)) & |
afac = p(il, 1) * (qs(il, 1) - qp(il, 1)) & |
130 |
/ (1e4 + 2000. * p(il, 1) * rs(il, 1)) |
/ (1e4 + 2000. * p(il, 1) * qs(il, 1)) |
131 |
else |
else |
132 |
rp(il, i - 1) = rp(il, i) + (cpd * (t(il, i) & |
qp(il, i - 1) = qp(il, i) + (cpd * (t(il, i) & |
133 |
- t(il, i - 1)) + gz(il, i) - gz(il, i - 1)) / lv(il, i) |
- t(il, i - 1)) + gz(il, i) - gz(il, i - 1)) / lv(il, i) |
134 |
rp(il, i - 1) = 0.5 * (rp(il, i - 1) + rr(il, i - 1)) |
qp(il, i - 1) = 0.5 * (qp(il, i - 1) + q(il, i - 1)) |
135 |
rp(il, i - 1) = min(rp(il, i - 1), rs(il, i - 1)) |
qp(il, i - 1) = min(qp(il, i - 1), qs(il, i - 1)) |
136 |
rp(il, i - 1) = max(rp(il, i - 1), 0.) |
qp(il, i - 1) = max(qp(il, i - 1), 0.) |
137 |
afac1 = p(il, i) * (rs(il, i) - rp(il, i)) & |
afac1 = p(il, i) * (qs(il, i) - qp(il, i)) & |
138 |
/ (1e4 + 2000. * p(il, i) * rs(il, i)) |
/ (1e4 + 2000. * p(il, i) * qs(il, i)) |
139 |
afac2 = p(il, i - 1) * (rs(il, i - 1) - rp(il, i - 1)) & |
afac2 = p(il, i - 1) * (qs(il, i - 1) - qp(il, i - 1)) & |
140 |
/ (1e4 + 2000. * p(il, i - 1) * rs(il, i - 1)) |
/ (1e4 + 2000. * p(il, i - 1) * qs(il, i - 1)) |
141 |
afac = 0.5 * (afac1 + afac2) |
afac = 0.5 * (afac1 + afac2) |
142 |
endif |
endif |
143 |
|
|
248 |
! find mixing ratio of precipitating downdraft |
! find mixing ratio of precipitating downdraft |
249 |
|
|
250 |
if (i /= inb(il)) then |
if (i /= inb(il)) then |
251 |
rp(il, i) = rr(il, i) |
qp(il, i) = q(il, i) |
252 |
|
|
253 |
if (mp(il, i) > mp(il, i + 1)) then |
if (mp(il, i) > mp(il, i + 1)) then |
254 |
rp(il, i) = rp(il, i + 1) * mp(il, i + 1) + rr(il, i) & |
qp(il, i) = qp(il, i + 1) * mp(il, i + 1) + q(il, i) & |
255 |
* (mp(il, i) - mp(il, i + 1)) + 100. * ginv & |
* (mp(il, i) - mp(il, i + 1)) + 100. * ginv & |
256 |
* 0.5 * sigd * (ph(il, i) - ph(il, i + 1)) & |
* 0.5 * sigd * (ph(il, i) - ph(il, i + 1)) & |
257 |
* (evap(il, i + 1) + evap(il, i)) |
* (evap(il, i + 1) + evap(il, i)) |
258 |
rp(il, i) = rp(il, i) / mp(il, i) |
qp(il, i) = qp(il, i) / mp(il, i) |
259 |
up(il, i) = up(il, i + 1) * mp(il, i + 1) + u(il, i) & |
up(il, i) = up(il, i + 1) * mp(il, i + 1) + u(il, i) & |
260 |
* (mp(il, i) - mp(il, i + 1)) |
* (mp(il, i) - mp(il, i + 1)) |
261 |
up(il, i) = up(il, i) / mp(il, i) |
up(il, i) = up(il, i) / mp(il, i) |
264 |
vp(il, i) = vp(il, i) / mp(il, i) |
vp(il, i) = vp(il, i) / mp(il, i) |
265 |
else |
else |
266 |
if (mp(il, i + 1) > 1e-16) then |
if (mp(il, i + 1) > 1e-16) then |
267 |
rp(il, i) = rp(il, i + 1) + 100. * ginv * 0.5 * sigd & |
qp(il, i) = qp(il, i + 1) + 100. * ginv * 0.5 * sigd & |
268 |
* (ph(il, i) - ph(il, i + 1)) & |
* (ph(il, i) - ph(il, i + 1)) & |
269 |
* (evap(il, i + 1) + evap(il, i)) / mp(il, i + 1) |
* (evap(il, i + 1) + evap(il, i)) / mp(il, i + 1) |
270 |
up(il, i) = up(il, i + 1) |
up(il, i) = up(il, i + 1) |
272 |
endif |
endif |
273 |
endif |
endif |
274 |
|
|
275 |
rp(il, i) = min(rp(il, i), rs(il, i)) |
qp(il, i) = min(qp(il, i), qs(il, i)) |
276 |
rp(il, i) = max(rp(il, i), 0.) |
qp(il, i) = max(qp(il, i), 0.) |
277 |
endif |
endif |
278 |
endif |
endif |
279 |
end do |
end do |