1 |
guez |
185 |
module cv30_mixing_m |
2 |
guez |
47 |
|
3 |
guez |
97 |
implicit none |
4 |
guez |
47 |
|
5 |
guez |
97 |
contains |
6 |
guez |
47 |
|
7 |
guez |
198 |
SUBROUTINE cv30_mixing(icb, inb, t, rr, rs, u, v, h, lv, hp, ep, clw, m, & |
8 |
|
|
sig, ment, qent, uent, vent, nent, sij, elij, ments, qents) |
9 |
guez |
47 |
|
10 |
guez |
195 |
! MIXING |
11 |
|
|
|
12 |
guez |
97 |
! a faire: |
13 |
guez |
145 |
! - changer rr(il, 1) -> qnk(il) |
14 |
|
|
! - vectorisation de la partie normalisation des flux (do 789) |
15 |
guez |
47 |
|
16 |
guez |
195 |
use cv30_param_m, only: minorig, nl |
17 |
|
|
USE dimphy, ONLY: klev, klon |
18 |
guez |
201 |
use suphec_m, only: rcpd, rcpv, rv |
19 |
guez |
195 |
|
20 |
guez |
97 |
! inputs: |
21 |
guez |
332 |
|
22 |
|
|
integer, intent(in):: icb(:) ! (ncum) {2 <= icb <= nl - 3} |
23 |
|
|
|
24 |
|
|
integer, intent(in):: inb(:) ! (ncum) |
25 |
|
|
! first model level above the level of neutral buoyancy of the |
26 |
|
|
! parcel (1 <= inb <= nl - 1) |
27 |
|
|
|
28 |
guez |
201 |
real, intent(in):: t(klon, klev), rr(klon, klev), rs(klon, klev) |
29 |
guez |
195 |
real u(klon, klev), v(klon, klev) |
30 |
guez |
201 |
real, intent(in):: h(klon, klev) |
31 |
|
|
real, intent(in):: lv(:, :) ! (klon, klev) |
32 |
|
|
real, intent(in):: hp(klon, klev) |
33 |
guez |
195 |
real ep(klon, klev), clw(klon, klev) |
34 |
|
|
real m(klon, klev) ! input of convect3 |
35 |
|
|
real sig(klon, klev) |
36 |
guez |
47 |
|
37 |
guez |
97 |
! outputs: |
38 |
guez |
195 |
real ment(klon, klev, klev), qent(klon, klev, klev) |
39 |
|
|
real uent(klon, klev, klev), vent(klon, klev, klev) |
40 |
guez |
332 |
integer, intent(out):: nent(:, 2:) ! (ncum, 2:nl - 1) |
41 |
guez |
195 |
real sij(klon, klev, klev), elij(klon, klev, klev) |
42 |
|
|
real ments(klon, klev, klev), qents(klon, klev, klev) |
43 |
guez |
47 |
|
44 |
guez |
195 |
! Local: |
45 |
|
|
integer ncum, i, j, k, il, im, jm |
46 |
guez |
97 |
integer num1, num2 |
47 |
|
|
real rti, bf2, anum, denom, dei, altem, cwat, stemp, qp |
48 |
|
|
real alt, smid, sjmin, sjmax, delp, delm |
49 |
guez |
195 |
real asij(klon), smax(klon), scrit(klon) |
50 |
|
|
real asum(klon, klev), bsum(klon, klev), csum(klon, klev) |
51 |
guez |
97 |
real wgh |
52 |
guez |
195 |
real zm(klon, klev) |
53 |
|
|
logical lwork(klon) |
54 |
guez |
97 |
|
55 |
guez |
195 |
!------------------------------------------------------------------------- |
56 |
|
|
|
57 |
|
|
ncum = size(icb) |
58 |
|
|
|
59 |
guez |
189 |
! INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS |
60 |
guez |
97 |
|
61 |
guez |
332 |
nent = 0 |
62 |
guez |
47 |
|
63 |
guez |
195 |
do j = 1, nl |
64 |
|
|
do k = 1, nl |
65 |
|
|
do i = 1, ncum |
66 |
|
|
qent(i, k, j) = rr(i, j) |
67 |
|
|
uent(i, k, j) = u(i, j) |
68 |
|
|
vent(i, k, j) = v(i, j) |
69 |
|
|
elij(i, k, j) = 0.0 |
70 |
guez |
97 |
end do |
71 |
|
|
end do |
72 |
|
|
end do |
73 |
guez |
47 |
|
74 |
guez |
195 |
ment(1:ncum, 1:klev, 1:klev) = 0.0 |
75 |
|
|
sij(1:ncum, 1:klev, 1:klev) = 0.0 |
76 |
guez |
47 |
|
77 |
guez |
195 |
zm(:, :) = 0. |
78 |
guez |
47 |
|
79 |
guez |
189 |
! CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING |
80 |
|
|
! RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING |
81 |
|
|
! FRACTION (sij) |
82 |
guez |
47 |
|
83 |
guez |
195 |
do i = minorig + 1, nl |
84 |
guez |
47 |
|
85 |
guez |
195 |
do j = minorig, nl |
86 |
|
|
do il = 1, ncum |
87 |
guez |
145 |
if((i >= icb(il)).and.(i <= inb(il)).and. & |
88 |
guez |
195 |
(j >= (icb(il) - 1)).and.(j <= inb(il)))then |
89 |
guez |
47 |
|
90 |
guez |
195 |
rti = rr(il, 1) - ep(il, i) * clw(il, i) |
91 |
guez |
201 |
bf2 = 1. + lv(il, j) * lv(il, j) * rs(il, j) / (rv & |
92 |
|
|
* t(il, j) * t(il, j) * rcpd) |
93 |
|
|
anum = h(il, j) - hp(il, i) + (rcpv - rcpd) * t(il, j) * (rti & |
94 |
guez |
195 |
- rr(il, j)) |
95 |
guez |
201 |
denom = h(il, i) - hp(il, i) + (rcpd - rcpv) * (rr(il, i) & |
96 |
guez |
195 |
- rti) * t(il, j) |
97 |
|
|
dei = denom |
98 |
|
|
if(abs(dei) < 0.01)dei = 0.01 |
99 |
|
|
sij(il, i, j) = anum / dei |
100 |
|
|
sij(il, i, i) = 1.0 |
101 |
|
|
altem = sij(il, i, j) * rr(il, i) + (1. - sij(il, i, j)) & |
102 |
|
|
* rti - rs(il, j) |
103 |
|
|
altem = altem / bf2 |
104 |
|
|
cwat = clw(il, j) * (1. - ep(il, j)) |
105 |
|
|
stemp = sij(il, i, j) |
106 |
guez |
145 |
if((stemp < 0.0.or.stemp > 1.0.or.altem > cwat) & |
107 |
|
|
.and.j > i)then |
108 |
guez |
195 |
anum = anum - lv(il, j) * (rti - rs(il, j) - cwat * bf2) |
109 |
|
|
denom = denom + lv(il, j) * (rr(il, i) - rti) |
110 |
|
|
if(abs(denom) < 0.01)denom = 0.01 |
111 |
|
|
sij(il, i, j) = anum / denom |
112 |
|
|
altem = sij(il, i, j) * rr(il, i) + (1. - sij(il, i, j)) & |
113 |
|
|
* rti - rs(il, j) |
114 |
|
|
altem = altem - (bf2 - 1.) * cwat |
115 |
guez |
97 |
end if |
116 |
guez |
145 |
if(sij(il, i, j) > 0.0.and.sij(il, i, j) < 0.95)then |
117 |
guez |
195 |
qent(il, i, j) = sij(il, i, j) * rr(il, i) + (1. & |
118 |
|
|
- sij(il, i, j)) * rti |
119 |
|
|
uent(il, i, j) = sij(il, i, j) * u(il, i) + (1. & |
120 |
guez |
198 |
- sij(il, i, j)) * u(il, minorig) |
121 |
guez |
195 |
vent(il, i, j) = sij(il, i, j) * v(il, i) + (1. & |
122 |
guez |
198 |
- sij(il, i, j)) * v(il, minorig) |
123 |
guez |
195 |
elij(il, i, j) = altem |
124 |
|
|
elij(il, i, j) = amax1(0.0, elij(il, i, j)) |
125 |
|
|
ment(il, i, j) = m(il, i) / (1. - sij(il, i, j)) |
126 |
|
|
nent(il, i) = nent(il, i) + 1 |
127 |
guez |
97 |
end if |
128 |
guez |
195 |
sij(il, i, j) = amax1(0.0, sij(il, i, j)) |
129 |
|
|
sij(il, i, j) = amin1(1.0, sij(il, i, j)) |
130 |
guez |
332 |
endif |
131 |
guez |
97 |
end do |
132 |
|
|
end do |
133 |
guez |
47 |
|
134 |
guez |
195 |
! if no air can entrain at level i assume that updraft detrains |
135 |
|
|
! at that level and calculate detrained air flux and properties |
136 |
guez |
47 |
|
137 |
guez |
195 |
do il = 1, ncum |
138 |
guez |
332 |
if (i >= icb(il) .and. i <= inb(il)) then |
139 |
|
|
if (nent(il, i) == 0) then |
140 |
|
|
ment(il, i, i) = m(il, i) |
141 |
|
|
qent(il, i, i) = rr(il, minorig) - ep(il, i) * clw(il, i) |
142 |
|
|
uent(il, i, i) = u(il, minorig) |
143 |
|
|
vent(il, i, i) = v(il, minorig) |
144 |
|
|
elij(il, i, i) = clw(il, i) |
145 |
|
|
sij(il, i, i) = 0.0 |
146 |
|
|
end if |
147 |
guez |
97 |
end if |
148 |
|
|
end do |
149 |
|
|
end do |
150 |
guez |
47 |
|
151 |
guez |
189 |
! NORMALIZE ENTRAINED AIR MASS FLUXES |
152 |
|
|
! TO REPRESENT EQUAL PROBABILITIES OF MIXING |
153 |
guez |
47 |
|
154 |
guez |
186 |
asum = 0. |
155 |
|
|
csum = 0. |
156 |
guez |
47 |
|
157 |
guez |
195 |
do il = 1, ncum |
158 |
guez |
47 |
lwork(il) = .FALSE. |
159 |
guez |
97 |
enddo |
160 |
guez |
47 |
|
161 |
guez |
195 |
DO i = minorig + 1, nl |
162 |
guez |
47 |
|
163 |
guez |
195 |
num1 = 0 |
164 |
|
|
do il = 1, ncum |
165 |
|
|
if (i >= icb(il) .and. i <= inb(il)) num1 = num1 + 1 |
166 |
guez |
97 |
enddo |
167 |
guez |
145 |
if (num1 <= 0) cycle |
168 |
guez |
47 |
|
169 |
guez |
195 |
do il = 1, ncum |
170 |
guez |
145 |
if (i >= icb(il) .and. i <= inb(il)) then |
171 |
guez |
195 |
lwork(il) = (nent(il, i) /= 0) |
172 |
|
|
qp = rr(il, 1) - ep(il, i) * clw(il, i) |
173 |
|
|
anum = h(il, i) - hp(il, i) - lv(il, i) * (qp - rs(il, i)) & |
174 |
guez |
201 |
+ (rcpv - rcpd) * t(il, i) * (qp - rr(il, i)) |
175 |
guez |
195 |
denom = h(il, i) - hp(il, i) + lv(il, i) * (rr(il, i) - qp) & |
176 |
guez |
201 |
+ (rcpd - rcpv) * t(il, i) * (rr(il, i) - qp) |
177 |
guez |
195 |
if(abs(denom) < 0.01)denom = 0.01 |
178 |
|
|
scrit(il) = anum / denom |
179 |
|
|
alt = qp - rs(il, i) + scrit(il) * (rr(il, i) - qp) |
180 |
|
|
if(scrit(il) <= 0.0.or.alt <= 0.0)scrit(il) = 1.0 |
181 |
|
|
smax(il) = 0.0 |
182 |
|
|
asij(il) = 0.0 |
183 |
guez |
97 |
endif |
184 |
|
|
end do |
185 |
guez |
47 |
|
186 |
guez |
195 |
do j = nl, minorig, - 1 |
187 |
guez |
47 |
|
188 |
guez |
195 |
num2 = 0 |
189 |
|
|
do il = 1, ncum |
190 |
guez |
145 |
if (i >= icb(il) .and. i <= inb(il) .and. & |
191 |
guez |
195 |
j >= (icb(il) - 1) .and. j <= inb(il) & |
192 |
|
|
.and. lwork(il)) num2 = num2 + 1 |
193 |
guez |
97 |
enddo |
194 |
guez |
145 |
if (num2 <= 0) cycle |
195 |
guez |
47 |
|
196 |
guez |
195 |
do il = 1, ncum |
197 |
guez |
145 |
if (i >= icb(il) .and. i <= inb(il) .and. & |
198 |
guez |
195 |
j >= (icb(il) - 1) .and. j <= inb(il) & |
199 |
guez |
145 |
.and. lwork(il)) then |
200 |
guez |
47 |
|
201 |
guez |
145 |
if(sij(il, i, j) > 1.0e-16.and.sij(il, i, j) < 0.95)then |
202 |
guez |
195 |
wgh = 1.0 |
203 |
guez |
145 |
if(j > i)then |
204 |
guez |
195 |
sjmax = amax1(sij(il, i, j + 1), smax(il)) |
205 |
|
|
sjmax = amin1(sjmax, scrit(il)) |
206 |
|
|
smax(il) = amax1(sij(il, i, j), smax(il)) |
207 |
|
|
sjmin = amax1(sij(il, i, j - 1), smax(il)) |
208 |
|
|
sjmin = amin1(sjmin, scrit(il)) |
209 |
|
|
if(sij(il, i, j) < (smax(il) - 1.0e-16))wgh = 0.0 |
210 |
|
|
smid = amin1(sij(il, i, j), scrit(il)) |
211 |
guez |
97 |
else |
212 |
guez |
195 |
sjmax = amax1(sij(il, i, j + 1), scrit(il)) |
213 |
|
|
smid = amax1(sij(il, i, j), scrit(il)) |
214 |
|
|
sjmin = 0.0 |
215 |
|
|
if(j > 1)sjmin = sij(il, i, j - 1) |
216 |
|
|
sjmin = amax1(sjmin, scrit(il)) |
217 |
guez |
97 |
endif |
218 |
guez |
195 |
delp = abs(sjmax - smid) |
219 |
|
|
delm = abs(sjmin - smid) |
220 |
|
|
asij(il) = asij(il) + wgh * (delp + delm) |
221 |
|
|
ment(il, i, j) = ment(il, i, j) * (delp + delm) * wgh |
222 |
guez |
97 |
endif |
223 |
|
|
endif |
224 |
|
|
end do |
225 |
guez |
47 |
|
226 |
guez |
97 |
end do |
227 |
guez |
47 |
|
228 |
guez |
195 |
do il = 1, ncum |
229 |
guez |
145 |
if (i >= icb(il).and.i <= inb(il).and.lwork(il)) then |
230 |
guez |
195 |
asij(il) = amax1(1.0e-16, asij(il)) |
231 |
|
|
asij(il) = 1.0 / asij(il) |
232 |
|
|
asum(il, i) = 0.0 |
233 |
|
|
bsum(il, i) = 0.0 |
234 |
|
|
csum(il, i) = 0.0 |
235 |
guez |
97 |
endif |
236 |
guez |
47 |
enddo |
237 |
|
|
|
238 |
guez |
195 |
do j = minorig, nl |
239 |
|
|
do il = 1, ncum |
240 |
guez |
145 |
if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) & |
241 |
guez |
195 |
.and. j >= (icb(il) - 1) .and. j <= inb(il)) then |
242 |
|
|
ment(il, i, j) = ment(il, i, j) * asij(il) |
243 |
guez |
97 |
endif |
244 |
|
|
enddo |
245 |
|
|
end do |
246 |
guez |
47 |
|
247 |
guez |
195 |
do j = minorig, nl |
248 |
|
|
do il = 1, ncum |
249 |
guez |
145 |
if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) & |
250 |
guez |
195 |
.and. j >= (icb(il) - 1) .and. j <= inb(il)) then |
251 |
|
|
asum(il, i) = asum(il, i) + ment(il, i, j) |
252 |
|
|
ment(il, i, j) = ment(il, i, j) * sig(il, j) |
253 |
|
|
bsum(il, i) = bsum(il, i) + ment(il, i, j) |
254 |
guez |
97 |
endif |
255 |
|
|
enddo |
256 |
|
|
end do |
257 |
guez |
47 |
|
258 |
guez |
195 |
do il = 1, ncum |
259 |
guez |
145 |
if (i >= icb(il).and.i <= inb(il).and.lwork(il)) then |
260 |
guez |
195 |
bsum(il, i) = amax1(bsum(il, i), 1.0e-16) |
261 |
|
|
bsum(il, i) = 1.0 / bsum(il, i) |
262 |
guez |
97 |
endif |
263 |
guez |
47 |
enddo |
264 |
|
|
|
265 |
guez |
195 |
do j = minorig, nl |
266 |
|
|
do il = 1, ncum |
267 |
guez |
145 |
if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) & |
268 |
guez |
195 |
.and. j >= (icb(il) - 1) .and. j <= inb(il)) then |
269 |
|
|
ment(il, i, j) = ment(il, i, j) * asum(il, i) * bsum(il, i) |
270 |
guez |
97 |
endif |
271 |
|
|
enddo |
272 |
|
|
end do |
273 |
|
|
|
274 |
guez |
195 |
do j = minorig, nl |
275 |
|
|
do il = 1, ncum |
276 |
guez |
145 |
if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) & |
277 |
guez |
195 |
.and. j >= (icb(il) - 1) .and. j <= inb(il)) then |
278 |
|
|
csum(il, i) = csum(il, i) + ment(il, i, j) |
279 |
guez |
97 |
endif |
280 |
|
|
enddo |
281 |
|
|
end do |
282 |
|
|
|
283 |
guez |
195 |
do il = 1, ncum |
284 |
guez |
145 |
if (i >= icb(il) .and. i <= inb(il) .and. lwork(il) & |
285 |
|
|
.and. csum(il, i) < m(il, i)) then |
286 |
guez |
195 |
nent(il, i) = 0 |
287 |
|
|
ment(il, i, i) = m(il, i) |
288 |
|
|
qent(il, i, i) = rr(il, 1) - ep(il, i) * clw(il, i) |
289 |
guez |
198 |
uent(il, i, i) = u(il, minorig) |
290 |
|
|
vent(il, i, i) = v(il, minorig) |
291 |
guez |
195 |
elij(il, i, i) = clw(il, i) |
292 |
|
|
sij(il, i, i) = 0.0 |
293 |
guez |
97 |
endif |
294 |
|
|
enddo ! il |
295 |
guez |
47 |
|
296 |
guez |
97 |
end DO |
297 |
guez |
145 |
|
298 |
guez |
97 |
! MAF: renormalisation de MENT |
299 |
guez |
195 |
do jm = 1, klev |
300 |
|
|
do im = 1, klev |
301 |
|
|
do il = 1, ncum |
302 |
|
|
zm(il, im) = zm(il, im) + (1. - sij(il, im, jm)) * ment(il, im, jm) |
303 |
guez |
97 |
end do |
304 |
|
|
end do |
305 |
|
|
end do |
306 |
guez |
145 |
|
307 |
guez |
195 |
do jm = 1, klev |
308 |
|
|
do im = 1, klev |
309 |
|
|
do il = 1, ncum |
310 |
guez |
145 |
if(zm(il, im) /= 0.) then |
311 |
guez |
195 |
ment(il, im, jm) = ment(il, im, jm) * m(il, im) / zm(il, im) |
312 |
guez |
97 |
endif |
313 |
|
|
end do |
314 |
guez |
47 |
end do |
315 |
guez |
97 |
end do |
316 |
guez |
145 |
|
317 |
guez |
195 |
do jm = 1, klev |
318 |
|
|
do im = 1, klev |
319 |
|
|
do il = 1, ncum |
320 |
|
|
qents(il, im, jm) = qent(il, im, jm) |
321 |
|
|
ments(il, im, jm) = ment(il, im, jm) |
322 |
guez |
97 |
end do |
323 |
guez |
47 |
enddo |
324 |
guez |
97 |
enddo |
325 |
guez |
47 |
|
326 |
guez |
185 |
end SUBROUTINE cv30_mixing |
327 |
guez |
97 |
|
328 |
guez |
185 |
end module cv30_mixing_m |