4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE cv30_unsat(ncum, icb, inb, t, rr, rs, gz, u, v, p, ph, th, tv, & |
SUBROUTINE cv30_unsat(icb, inb, t, q, qs, gz, u, v, p, ph, th, tv, lv, cpn, & |
8 |
lv, 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: |
! inputs: |
|
integer, intent(in):: ncum |
|
16 |
integer, intent(in):: icb(:), inb(:) ! (ncum) |
integer, intent(in):: icb(:), inb(:) ! (ncum) |
17 |
real t(klon, klev), rr(klon, klev), rs(klon, klev) |
real, intent(in):: t(:, :), q(:, :), qs(:, :) ! (klon, klev) |
18 |
real gz(klon, klev) |
real, intent(in):: gz(:, :) ! (klon, klev) |
19 |
real u(klon, klev), v(klon, klev) |
real, intent(in):: u(:, :), v(:, :) ! (klon, klev) |
20 |
real p(klon, klev), ph(klon, klev + 1) |
real p(klon, klev), ph(klon, klev + 1) |
21 |
real th(klon, klev) |
real th(klon, klev) |
22 |
real tv(klon, klev) |
real tv(klon, klev) |
28 |
real plcl(klon) |
real plcl(klon) |
29 |
|
|
30 |
! outputs: |
! outputs: |
31 |
real mp(klon, klev), rp(klon, klev), up(klon, klev), vp(klon, klev) |
real, intent(out):: mp(klon, klev) |
32 |
|
real, intent(out):: qp(:, :), up(:, :), vp(:, :) ! (ncum, nl) |
33 |
real wt(klon, klev), water(klon, klev), evap(klon, klev) |
real wt(klon, klev), water(klon, klev), evap(klon, klev) |
34 |
real b(:, :) ! (ncum, klev) |
real, intent(out):: b(:, :) ! (ncum, nl - 1) |
35 |
|
|
36 |
! Local: |
! Local: |
37 |
|
integer ncum |
38 |
integer i, j, il, num1 |
integer i, j, il, num1 |
39 |
real tinv, delti |
real tinv, delti |
40 |
real awat, afac, afac1, afac2, bfac |
real awat, afac, afac1, afac2, bfac |
42 |
real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf |
real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf |
43 |
real ampmax |
real ampmax |
44 |
real lvcp(klon, klev) |
real lvcp(klon, klev) |
45 |
real wdtrain(ncum) |
real wdtrain(size(icb)) |
46 |
logical lwork(ncum) |
logical lwork(size(icb)) |
47 |
|
|
48 |
!------------------------------------------------------ |
!------------------------------------------------------ |
49 |
|
|
50 |
|
ncum = size(icb) |
51 |
delti = 1. / delt |
delti = 1. / delt |
52 |
tinv = 1. / 3. |
tinv = 1. / 3. |
53 |
mp = 0. |
mp = 0. |
54 |
|
b = 0. |
55 |
|
|
56 |
do i = 1, nl |
do i = 1, nl |
57 |
do il = 1, ncum |
do il = 1, ncum |
58 |
mp(il, i) = 0. |
qp(il, i) = q(il, i) |
|
rp(il, i) = rr(il, i) |
|
59 |
up(il, i) = u(il, i) |
up(il, i) = u(il, i) |
60 |
vp(il, i) = v(il, i) |
vp(il, i) = v(il, i) |
61 |
wt(il, i) = 0.001 |
wt(il, i) = 0.001 |
62 |
water(il, i) = 0. |
water(il, i) = 0. |
63 |
evap(il, i) = 0. |
evap(il, i) = 0. |
|
b(il, i) = 0. |
|
64 |
lvcp(il, i) = lv(il, i) / cpn(il, i) |
lvcp(il, i) = lv(il, i) / cpn(il, i) |
65 |
enddo |
enddo |
66 |
enddo |
enddo |
95 |
do il = 1, ncum |
do il = 1, ncum |
96 |
if (i <= inb(il) .and. lwork(il)) then |
if (i <= inb(il) .and. lwork(il)) then |
97 |
awat = elij(il, j, i) - (1. - ep(il, i)) * clw(il, i) |
awat = elij(il, j, i) - (1. - ep(il, i)) * clw(il, i) |
98 |
awat = amax1(awat, 0.) |
awat = max(awat, 0.) |
99 |
wdtrain(il) = wdtrain(il) + grav * awat & |
wdtrain(il) = wdtrain(il) + grav * awat * ment(il, j, i) |
|
* ment(il, j, i) |
|
100 |
endif |
endif |
101 |
enddo |
enddo |
102 |
end do |
end do |
103 |
endif |
endif |
104 |
|
|
105 |
! find rain water and evaporation using provisional |
! find rain water and evaporation using provisional |
106 |
! estimates of rp(i)and rp(i - 1) |
! estimates of qp(i) and qp(i - 1) |
107 |
|
|
108 |
do il = 1, ncum |
do il = 1, ncum |
109 |
if (i <= inb(il) .and. lwork(il)) then |
if (i <= inb(il) .and. lwork(il)) then |
110 |
wt(il, i) = 45. |
wt(il, i) = 45. |
111 |
|
|
112 |
if (i < inb(il)) then |
if (i < inb(il)) then |
113 |
rp(il, i) = rp(il, i + 1) + (cpd * (t(il, i + 1) & |
qp(il, i) = qp(il, i + 1) + (cpd * (t(il, i + 1) & |
114 |
- 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) |
115 |
rp(il, i) = 0.5 * (rp(il, i) + rr(il, i)) |
qp(il, i) = 0.5 * (qp(il, i) + q(il, i)) |
116 |
endif |
endif |
117 |
rp(il, i) = amax1(rp(il, i), 0.) |
|
118 |
rp(il, i) = amin1(rp(il, i), rs(il, i)) |
qp(il, i) = max(qp(il, i), 0.) |
119 |
rp(il, inb(il)) = rr(il, inb(il)) |
qp(il, i) = min(qp(il, i), qs(il, i)) |
120 |
|
qp(il, inb(il)) = q(il, inb(il)) |
121 |
|
|
122 |
if (i == 1) then |
if (i == 1) then |
123 |
afac = p(il, 1) * (rs(il, 1) - rp(il, 1)) & |
afac = p(il, 1) * (qs(il, 1) - qp(il, 1)) & |
124 |
/ (1e4 + 2000. * p(il, 1) * rs(il, 1)) |
/ (1e4 + 2000. * p(il, 1) * qs(il, 1)) |
125 |
else |
else |
126 |
rp(il, i - 1) = rp(il, i) + (cpd * (t(il, i) & |
qp(il, i - 1) = qp(il, i) + (cpd * (t(il, i) & |
127 |
- 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) |
128 |
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)) |
129 |
rp(il, i - 1) = amin1(rp(il, i - 1), rs(il, i - 1)) |
qp(il, i - 1) = min(qp(il, i - 1), qs(il, i - 1)) |
130 |
rp(il, i - 1) = amax1(rp(il, i - 1), 0.) |
qp(il, i - 1) = max(qp(il, i - 1), 0.) |
131 |
afac1 = p(il, i) * (rs(il, i) - rp(il, i)) & |
afac1 = p(il, i) * (qs(il, i) - qp(il, i)) & |
132 |
/ (1e4 + 2000. * p(il, i) * rs(il, i)) |
/ (1e4 + 2000. * p(il, i) * qs(il, i)) |
133 |
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)) & |
134 |
/ (1e4 + 2000. * p(il, i - 1) * rs(il, i - 1)) |
/ (1e4 + 2000. * p(il, i - 1) * qs(il, i - 1)) |
135 |
afac = 0.5 * (afac1 + afac2) |
afac = 0.5 * (afac1 + afac2) |
136 |
endif |
endif |
137 |
if (i == inb(il))afac = 0. |
|
138 |
afac = amax1(afac, 0.) |
if (i == inb(il)) afac = 0. |
139 |
|
afac = max(afac, 0.) |
140 |
bfac = 1. / (sigd * wt(il, i)) |
bfac = 1. / (sigd * wt(il, i)) |
141 |
|
|
142 |
! prise en compte de la variation progressive de sigt dans |
! prise en compte de la variation progressive de sigt dans |
170 |
! hydrostatic approximation |
! hydrostatic approximation |
171 |
|
|
172 |
if (i /= 1) then |
if (i /= 1) then |
173 |
tevap = amax1(0., evap(il, i)) |
tevap = max(0., evap(il, i)) |
174 |
delth = amax1(0.001, (th(il, i) - th(il, i - 1))) |
delth = max(0.001, (th(il, i) - th(il, i - 1))) |
175 |
mp(il, i) = 100. * ginv * lvcp(il, i) * sigd * tevap & |
mp(il, i) = 100. * ginv * lvcp(il, i) * sigd * tevap & |
176 |
* (p(il, i - 1) - p(il, i)) / delth |
* (p(il, i - 1) - p(il, i)) / delth |
177 |
|
|
178 |
! if hydrostatic assumption fails, |
! If hydrostatic assumption fails, solve cubic |
179 |
! solve cubic difference equation for downdraft theta |
! difference equation for downdraft theta and mass |
180 |
! and mass flux from two simultaneous differential eqns |
! flux from two simultaneous differential equations |
181 |
|
|
182 |
amfac = sigd * sigd * 70. * ph(il, i) & |
amfac = sigd * sigd * 70. * ph(il, i) & |
183 |
* (p(il, i - 1) - p(il, i)) & |
* (p(il, i - 1) - p(il, i)) & |
184 |
* (th(il, i) - th(il, i - 1)) / (tv(il, i) * th(il, i)) |
* (th(il, i) - th(il, i - 1)) / (tv(il, i) * th(il, i)) |
185 |
amp2 = abs(mp(il, i + 1) * mp(il, i + 1) - mp(il, i) & |
amp2 = abs(mp(il, i + 1) * mp(il, i + 1) - mp(il, i) & |
186 |
* mp(il, i)) |
* mp(il, i)) |
187 |
if (amp2 > (0.1 * amfac)) then |
|
188 |
|
if (amp2 > 0.1 * amfac) then |
189 |
xf = 100. * sigd * sigd * sigd * (ph(il, i) & |
xf = 100. * sigd * sigd * sigd * (ph(il, i) & |
190 |
- ph(il, i + 1)) |
- ph(il, i + 1)) |
191 |
tf = b(il, i) - 5. * (th(il, i) - th(il, i - 1)) & |
tf = b(il, i) - 5. * (th(il, i) - th(il, i - 1)) & |
195 |
* mp(il, i + 1) * xf * tf + 50. * (p(il, i - 1) & |
* mp(il, i + 1) * xf * tf + 50. * (p(il, i - 1) & |
196 |
- p(il, i)) * xf * tevap |
- p(il, i)) * xf * tevap |
197 |
fac2 = 1. |
fac2 = 1. |
198 |
if (bf < 0.)fac2 = - 1. |
if (bf < 0.) fac2 = - 1. |
199 |
bf = abs(bf) |
bf = abs(bf) |
200 |
ur = 0.25 * bf * bf - af * af * af * tinv * tinv * tinv |
ur = 0.25 * bf * bf - af * af * af * tinv * tinv * tinv |
201 |
|
|
202 |
if (ur >= 0.) then |
if (ur >= 0.) then |
203 |
sru = sqrt(ur) |
sru = sqrt(ur) |
204 |
fac = 1. |
fac = 1. |
205 |
if ((0.5 * bf - sru) < 0.)fac = - 1. |
if ((0.5 * bf - sru) < 0.) fac = - 1. |
206 |
mp(il, i) = mp(il, i + 1) * tinv & |
mp(il, i) = mp(il, i + 1) * tinv & |
207 |
+ (0.5 * bf + sru)**tinv & |
+ (0.5 * bf + sru)**tinv & |
208 |
+ fac * (abs(0.5 * bf - sru))**tinv |
+ fac * (abs(0.5 * bf - sru))**tinv |
212 |
mp(il, i) = mp(il, i + 1) * tinv + 2. & |
mp(il, i) = mp(il, i + 1) * tinv + 2. & |
213 |
* sqrt(af * tinv) * cos(d * tinv) |
* sqrt(af * tinv) * cos(d * tinv) |
214 |
endif |
endif |
215 |
mp(il, i) = amax1(0., mp(il, i)) |
|
216 |
|
mp(il, i) = max(0., mp(il, i)) |
217 |
|
|
218 |
! Il y a vraisemblablement une erreur dans la |
! Il y a vraisemblablement une erreur dans la |
219 |
! ligne 2 suivante: il faut diviser par (mp(il, |
! ligne suivante : il faut diviser par (mp(il, |
220 |
! i) * sigd * grav) et non par (mp(il, i) + sigd |
! i) * sigd * grav) et non par (mp(il, i) + sigd |
221 |
! * 0.1). Et il faut bien revoir les facteurs |
! * 0.1). Et il faut bien revoir les facteurs |
222 |
! 100. |
! 100. |
224 |
- p(il, i)) * tevap / (mp(il, i) + sigd * 0.1) & |
- p(il, i)) * tevap / (mp(il, i) + sigd * 0.1) & |
225 |
- 10. * (th(il, i) - th(il, i - 1)) * t(il, i) & |
- 10. * (th(il, i) - th(il, i - 1)) * t(il, i) & |
226 |
/ (lvcp(il, i) * sigd * th(il, i)) |
/ (lvcp(il, i) * sigd * th(il, i)) |
227 |
b(il, i - 1) = amax1(b(il, i - 1), 0.) |
b(il, i - 1) = max(b(il, i - 1), 0.) |
228 |
endif |
endif |
229 |
|
|
230 |
! limit magnitude of mp(i) to meet cfl condition |
! limit magnitude of mp(i) to meet cfl condition |
|
|
|
231 |
ampmax = 2. * (ph(il, i) - ph(il, i + 1)) * delti |
ampmax = 2. * (ph(il, i) - ph(il, i + 1)) * delti |
232 |
amp2 = 2. * (ph(il, i - 1) - ph(il, i)) * delti |
amp2 = 2. * (ph(il, i - 1) - ph(il, i)) * delti |
233 |
ampmax = amin1(ampmax, amp2) |
ampmax = min(ampmax, amp2) |
234 |
mp(il, i) = amin1(mp(il, i), ampmax) |
mp(il, i) = min(mp(il, i), ampmax) |
235 |
|
|
236 |
! force mp to decrease linearly to zero |
! force mp to decrease linearly to zero |
237 |
! between cloud base and the surface |
! between cloud base and the surface |
238 |
|
if (p(il, i) > p(il, icb(il))) mp(il, i) = mp(il, icb(il)) & |
239 |
if (p(il, i) > p(il, icb(il))) then |
* (p(il, 1) - p(il, i)) / (p(il, 1) - p(il, icb(il))) |
|
mp(il, i) = mp(il, icb(il)) * (p(il, 1) - p(il, i)) & |
|
|
/ (p(il, 1) - p(il, icb(il))) |
|
|
endif |
|
240 |
endif ! i == 1 |
endif ! i == 1 |
241 |
|
|
242 |
! find mixing ratio of precipitating downdraft |
! find mixing ratio of precipitating downdraft |
243 |
|
|
244 |
if (i /= inb(il)) then |
if (i /= inb(il)) then |
245 |
rp(il, i) = rr(il, i) |
qp(il, i) = q(il, i) |
246 |
|
|
247 |
if (mp(il, i) > mp(il, i + 1)) then |
if (mp(il, i) > mp(il, i + 1)) then |
248 |
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) & |
249 |
* (mp(il, i) - mp(il, i + 1)) + 100. * ginv & |
* (mp(il, i) - mp(il, i + 1)) + 100. * ginv & |
250 |
* 0.5 * sigd * (ph(il, i) - ph(il, i + 1)) & |
* 0.5 * sigd * (ph(il, i) - ph(il, i + 1)) & |
251 |
* (evap(il, i + 1) + evap(il, i)) |
* (evap(il, i + 1) + evap(il, i)) |
252 |
rp(il, i) = rp(il, i) / mp(il, i) |
qp(il, i) = qp(il, i) / mp(il, i) |
253 |
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) & |
254 |
* (mp(il, i) - mp(il, i + 1)) |
* (mp(il, i) - mp(il, i + 1)) |
255 |
up(il, i) = up(il, i) / mp(il, i) |
up(il, i) = up(il, i) / mp(il, i) |
258 |
vp(il, i) = vp(il, i) / mp(il, i) |
vp(il, i) = vp(il, i) / mp(il, i) |
259 |
else |
else |
260 |
if (mp(il, i + 1) > 1e-16) then |
if (mp(il, i + 1) > 1e-16) then |
261 |
rp(il, i) = rp(il, i + 1) & |
qp(il, i) = qp(il, i + 1) + 100. * ginv * 0.5 * sigd & |
262 |
+ 100. * ginv * 0.5 * sigd * (ph(il, i) & |
* (ph(il, i) - ph(il, i + 1)) & |
263 |
- ph(il, i + 1)) & |
* (evap(il, i + 1) + evap(il, i)) / mp(il, i + 1) |
|
* (evap(il, i + 1) + evap(il, i)) & |
|
|
/ mp(il, i + 1) |
|
264 |
up(il, i) = up(il, i + 1) |
up(il, i) = up(il, i + 1) |
265 |
vp(il, i) = vp(il, i + 1) |
vp(il, i) = vp(il, i + 1) |
266 |
endif |
endif |
267 |
endif |
endif |
268 |
rp(il, i) = amin1(rp(il, i), rs(il, i)) |
|
269 |
rp(il, i) = amax1(rp(il, i), 0.) |
qp(il, i) = min(qp(il, i), qs(il, i)) |
270 |
|
qp(il, i) = max(qp(il, i), 0.) |
271 |
endif |
endif |
272 |
endif |
endif |
273 |
end do |
end do |