GCC Code Coverage Report


Directory: ./
File: phys/cv_routines.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 721 0.0%
Branches: 0 576 0.0%

Line Branch Exec Source
1
2 ! $Id: cv_routines.F90 2311 2015-06-25 07:45:24Z emillour $
3
4 ✗ SUBROUTINE cv_param(nd)
5 IMPLICIT NONE
6
7 ! ------------------------------------------------------------
8 ! Set parameters for convectL
9 ! (includes microphysical parameters and parameters that
10 ! control the rate of approach to quasi-equilibrium)
11 ! ------------------------------------------------------------
12
13 ! *** ELCRIT IS THE AUTOCONVERSION THERSHOLD WATER CONTENT (gm/gm) ***
14 ! *** TLCRIT IS CRITICAL TEMPERATURE BELOW WHICH THE AUTO- ***
15 ! *** CONVERSION THRESHOLD IS ASSUMED TO BE ZERO ***
16 ! *** (THE AUTOCONVERSION THRESHOLD VARIES LINEARLY ***
17 ! *** BETWEEN 0 C AND TLCRIT) ***
18 ! *** ENTP IS THE COEFFICIENT OF MIXING IN THE ENTRAINMENT ***
19 ! *** FORMULATION ***
20 ! *** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT ***
21 ! *** SIGS IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***
22 ! *** OF CLOUD ***
23 ! *** OMTRAIN IS THE ASSUMED FALL SPEED (P/s) OF RAIN ***
24 ! *** OMTSNOW IS THE ASSUMED FALL SPEED (P/s) OF SNOW ***
25 ! *** COEFFR IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION ***
26 ! *** OF RAIN ***
27 ! *** COEFFS IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION ***
28 ! *** OF SNOW ***
29 ! *** CU IS THE COEFFICIENT GOVERNING CONVECTIVE MOMENTUM ***
30 ! *** TRANSPORT ***
31 ! *** DTMAX IS THE MAXIMUM NEGATIVE TEMPERATURE PERTURBATION ***
32 ! *** A LIFTED PARCEL IS ALLOWED TO HAVE BELOW ITS LFC ***
33 ! *** ALPHA AND DAMP ARE PARAMETERS THAT CONTROL THE RATE OF ***
34 ! *** APPROACH TO QUASI-EQUILIBRIUM ***
35 ! *** (THEIR STANDARD VALUES ARE 0.20 AND 0.1, RESPECTIVELY) ***
36 ! *** (DAMP MUST BE LESS THAN 1) ***
37
38 include "cvparam.h"
39 INTEGER nd
40 CHARACTER (LEN=20) :: modname = 'cv_routines'
41 CHARACTER (LEN=80) :: abort_message
42
43 ! noff: integer limit for convection (nd-noff)
44 ! minorig: First level of convection
45
46 ✗ noff = 2
47 ✗ minorig = 2
48
49 ✗ nl = nd - noff
50 ✗ nlp = nl + 1
51 ✗ nlm = nl - 1
52
53 ✗ elcrit = 0.0011
54 ✗ tlcrit = -55.0
55 ✗ entp = 1.5
56 ✗ sigs = 0.12
57 ✗ sigd = 0.05
58 ✗ omtrain = 50.0
59 ✗ omtsnow = 5.5
60 ✗ coeffr = 1.0
61 ✗ coeffs = 0.8
62 ✗ dtmax = 0.9
63
64 ✗ cu = 0.70
65
66 ✗ betad = 10.0
67
68 ✗ damp = 0.1
69 ✗ alpha = 0.2
70
71 ✗ delta = 0.01 ! cld
72
73 ✗ RETURN
74 END SUBROUTINE cv_param
75
76 ✗ SUBROUTINE cv_prelim(len, nd, ndp1, t, q, p, ph, lv, cpn, tv, gz, h, hm)
77 IMPLICIT NONE
78
79 ! =====================================================================
80 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY
81 ! =====================================================================
82
83 ! inputs:
84 INTEGER len, nd, ndp1
85 REAL t(len, nd), q(len, nd), p(len, nd), ph(len, ndp1)
86
87 ! outputs:
88 REAL lv(len, nd), cpn(len, nd), tv(len, nd)
89 REAL gz(len, nd), h(len, nd), hm(len, nd)
90
91 ! local variables:
92 INTEGER k, i
93 ✗ REAL cpx(len, nd)
94
95 include "cvthermo.h"
96 include "cvparam.h"
97
98
99 ✗ DO k = 1, nlp
100 ✗ DO i = 1, len
101 ✗ lv(i, k) = lv0 - clmcpv*(t(i,k)-t0)
102 ✗ cpn(i, k) = cpd*(1.0-q(i,k)) + cpv*q(i, k)
103 ✗ cpx(i, k) = cpd*(1.0-q(i,k)) + cl*q(i, k)
104 ✗ tv(i, k) = t(i, k)*(1.0+q(i,k)*epsim1)
105 END DO
106 END DO
107
108 ! gz = phi at the full levels (same as p).
109
110 ✗ DO i = 1, len
111 ✗ gz(i, 1) = 0.0
112 END DO
113 ✗ DO k = 2, nlp
114 ✗ DO i = 1, len
115 gz(i, k) = gz(i, k-1) + hrd*(tv(i,k-1)+tv(i,k))*(p(i,k-1)-p(i,k))/ph(i, &
116 ✗ k)
117 END DO
118 END DO
119
120 ! h = phi + cpT (dry static energy).
121 ! hm = phi + cp(T-Tbase)+Lq
122
123 ✗ DO k = 1, nlp
124 ✗ DO i = 1, len
125 ✗ h(i, k) = gz(i, k) + cpn(i, k)*t(i, k)
126 ✗ hm(i, k) = gz(i, k) + cpx(i, k)*(t(i,k)-t(i,1)) + lv(i, k)*q(i, k)
127 END DO
128 END DO
129
130 ✗ RETURN
131 END SUBROUTINE cv_prelim
132
133 ✗ SUBROUTINE cv_feed(len, nd, t, q, qs, p, hm, gz, nk, icb, icbmax, iflag, tnk, &
134 qnk, gznk, plcl)
135 IMPLICIT NONE
136
137 ! ================================================================
138 ! Purpose: CONVECTIVE FEED
139 ! ================================================================
140
141 include "cvparam.h"
142
143 ! inputs:
144 INTEGER len, nd
145 REAL t(len, nd), q(len, nd), qs(len, nd), p(len, nd)
146 REAL hm(len, nd), gz(len, nd)
147
148 ! outputs:
149 INTEGER iflag(len), nk(len), icb(len), icbmax
150 REAL tnk(len), qnk(len), gznk(len), plcl(len)
151
152 ! local variables:
153 INTEGER i, k
154 ✗ INTEGER ihmin(len)
155 ✗ REAL work(len)
156 ✗ REAL pnk(len), qsnk(len), rh(len), chi(len)
157
158 ! -------------------------------------------------------------------
159 ! --- Find level of minimum moist static energy
160 ! --- If level of minimum moist static energy coincides with
161 ! --- or is lower than minimum allowable parcel origin level,
162 ! --- set iflag to 6.
163 ! -------------------------------------------------------------------
164
165 ✗ DO i = 1, len
166 ✗ work(i) = 1.0E12
167 ✗ ihmin(i) = nl
168 END DO
169 ✗ DO k = 2, nlp
170 ✗ DO i = 1, len
171 ✗ IF ((hm(i,k)<work(i)) .AND. (hm(i,k)<hm(i,k-1))) THEN
172 ✗ work(i) = hm(i, k)
173 ✗ ihmin(i) = k
174 END IF
175 END DO
176 END DO
177 ✗ DO i = 1, len
178 ✗ ihmin(i) = min(ihmin(i), nlm)
179 ✗ IF (ihmin(i)<=minorig) THEN
180 ✗ iflag(i) = 6
181 END IF
182 END DO
183
184 ! -------------------------------------------------------------------
185 ! --- Find that model level below the level of minimum moist static
186 ! --- energy that has the maximum value of moist static energy
187 ! -------------------------------------------------------------------
188
189 ✗ DO i = 1, len
190 ✗ work(i) = hm(i, minorig)
191 ✗ nk(i) = minorig
192 END DO
193 ✗ DO k = minorig + 1, nl
194 ✗ DO i = 1, len
195 ✗ IF ((hm(i,k)>work(i)) .AND. (k<=ihmin(i))) THEN
196 ✗ work(i) = hm(i, k)
197 ✗ nk(i) = k
198 END IF
199 END DO
200 END DO
201 ! -------------------------------------------------------------------
202 ! --- Check whether parcel level temperature and specific humidity
203 ! --- are reasonable
204 ! -------------------------------------------------------------------
205 ✗ DO i = 1, len
206 IF (((t(i,nk(i))<250.0) .OR. (q(i,nk(i))<=0.0) .OR. (p(i,ihmin(i))< &
207 ✗ 400.0)) .AND. (iflag(i)==0)) iflag(i) = 7
208 END DO
209 ! -------------------------------------------------------------------
210 ! --- Calculate lifted condensation level of air at parcel origin level
211 ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV.,1980)
212 ! -------------------------------------------------------------------
213 ✗ DO i = 1, len
214 ✗ tnk(i) = t(i, nk(i))
215 ✗ qnk(i) = q(i, nk(i))
216 ✗ gznk(i) = gz(i, nk(i))
217 ✗ pnk(i) = p(i, nk(i))
218 ✗ qsnk(i) = qs(i, nk(i))
219
220 ✗ rh(i) = qnk(i)/qsnk(i)
221 ✗ rh(i) = min(1.0, rh(i))
222 ✗ chi(i) = tnk(i)/(1669.0-122.0*rh(i)-tnk(i))
223 ✗ plcl(i) = pnk(i)*(rh(i)**chi(i))
224 ✗ IF (((plcl(i)<200.0) .OR. (plcl(i)>=2000.0)) .AND. (iflag(i)==0)) iflag(i &
225 ✗ ) = 8
226 END DO
227 ! -------------------------------------------------------------------
228 ! --- Calculate first level above lcl (=icb)
229 ! -------------------------------------------------------------------
230 ✗ DO i = 1, len
231 ✗ icb(i) = nlm
232 END DO
233
234 ✗ DO k = minorig, nl
235 ✗ DO i = 1, len
236 ✗ IF ((k>=(nk(i)+1)) .AND. (p(i,k)<plcl(i))) icb(i) = min(icb(i), k)
237 END DO
238 END DO
239
240 ✗ DO i = 1, len
241 ✗ IF ((icb(i)>=nlm) .AND. (iflag(i)==0)) iflag(i) = 9
242 END DO
243
244 ! Compute icbmax.
245
246 ✗ icbmax = 2
247 ✗ DO i = 1, len
248 ✗ icbmax = max(icbmax, icb(i))
249 END DO
250
251 ✗ RETURN
252 END SUBROUTINE cv_feed
253
254 ✗ SUBROUTINE cv_undilute1(len, nd, t, q, qs, gz, p, nk, icb, icbmax, tp, tvp, &
255 clw)
256 IMPLICIT NONE
257
258 include "cvthermo.h"
259 include "cvparam.h"
260
261 ! inputs:
262 INTEGER len, nd
263 INTEGER nk(len), icb(len), icbmax
264 REAL t(len, nd), q(len, nd), qs(len, nd), gz(len, nd)
265 REAL p(len, nd)
266
267 ! outputs:
268 REAL tp(len, nd), tvp(len, nd), clw(len, nd)
269
270 ! local variables:
271 INTEGER i, k
272 REAL tg, qg, alv, s, ahg, tc, denom, es, rg
273 ✗ REAL ah0(len), cpp(len)
274 ✗ REAL tnk(len), qnk(len), gznk(len), ticb(len), gzicb(len)
275
276 ! -------------------------------------------------------------------
277 ! --- Calculates the lifted parcel virtual temperature at nk,
278 ! --- the actual temperature, and the adiabatic
279 ! --- liquid water content. The procedure is to solve the equation.
280 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
281 ! -------------------------------------------------------------------
282
283 ✗ DO i = 1, len
284 ✗ tnk(i) = t(i, nk(i))
285 ✗ qnk(i) = q(i, nk(i))
286 ✗ gznk(i) = gz(i, nk(i))
287 ✗ ticb(i) = t(i, icb(i))
288 ✗ gzicb(i) = gz(i, icb(i))
289 END DO
290
291 ! *** Calculate certain parcel quantities, including static energy ***
292
293 ✗ DO i = 1, len
294 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)- &
295 ✗ 273.15)) + gznk(i)
296 ✗ cpp(i) = cpd*(1.-qnk(i)) + qnk(i)*cpv
297 END DO
298
299 ! *** Calculate lifted parcel quantities below cloud base ***
300
301 ✗ DO k = minorig, icbmax - 1
302 ✗ DO i = 1, len
303 ✗ tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))/cpp(i)
304 ✗ tvp(i, k) = tp(i, k)*(1.+qnk(i)*epsi)
305 END DO
306 END DO
307
308 ! *** Find lifted parcel quantities above cloud base ***
309
310 ✗ DO i = 1, len
311 ✗ tg = ticb(i)
312 ✗ qg = qs(i, icb(i))
313 ✗ alv = lv0 - clmcpv*(ticb(i)-t0)
314
315 ! First iteration.
316
317 ✗ s = cpd + alv*alv*qg/(rrv*ticb(i)*ticb(i))
318 ✗ s = 1./s
319 ✗ ahg = cpd*tg + (cl-cpd)*qnk(i)*ticb(i) + alv*qg + gzicb(i)
320 ✗ tg = tg + s*(ah0(i)-ahg)
321 ✗ tg = max(tg, 35.0)
322 ✗ tc = tg - t0
323 ✗ denom = 243.5 + tc
324 ✗ IF (tc>=0.0) THEN
325 ✗ es = 6.112*exp(17.67*tc/denom)
326 ELSE
327 ✗ es = exp(23.33086-6111.72784/tg+0.15215*log(tg))
328 END IF
329 ✗ qg = eps*es/(p(i,icb(i))-es*(1.-eps))
330
331 ! Second iteration.
332
333 ✗ s = cpd + alv*alv*qg/(rrv*ticb(i)*ticb(i))
334 ✗ s = 1./s
335 ✗ ahg = cpd*tg + (cl-cpd)*qnk(i)*ticb(i) + alv*qg + gzicb(i)
336 ✗ tg = tg + s*(ah0(i)-ahg)
337 ✗ tg = max(tg, 35.0)
338 ✗ tc = tg - t0
339 ✗ denom = 243.5 + tc
340 ✗ IF (tc>=0.0) THEN
341 ✗ es = 6.112*exp(17.67*tc/denom)
342 ELSE
343 ✗ es = exp(23.33086-6111.72784/tg+0.15215*log(tg))
344 END IF
345 ✗ qg = eps*es/(p(i,icb(i))-es*(1.-eps))
346
347 ✗ alv = lv0 - clmcpv*(ticb(i)-273.15)
348 ✗ tp(i, icb(i)) = (ah0(i)-(cl-cpd)*qnk(i)*ticb(i)-gz(i,icb(i))-alv*qg)/cpd
349 ✗ clw(i, icb(i)) = qnk(i) - qg
350 ✗ clw(i, icb(i)) = max(0.0, clw(i,icb(i)))
351 ✗ rg = qg/(1.-qnk(i))
352 ✗ tvp(i, icb(i)) = tp(i, icb(i))*(1.+rg*epsi)
353 END DO
354
355 ✗ DO k = minorig, icbmax
356 ✗ DO i = 1, len
357 ✗ tvp(i, k) = tvp(i, k) - tp(i, k)*qnk(i)
358 END DO
359 END DO
360
361 ✗ RETURN
362 END SUBROUTINE cv_undilute1
363
364 ✗ SUBROUTINE cv_trigger(len, nd, icb, cbmf, tv, tvp, iflag)
365 IMPLICIT NONE
366
367 ! -------------------------------------------------------------------
368 ! --- Test for instability.
369 ! --- If there was no convection at last time step and parcel
370 ! --- is stable at icb, then set iflag to 4.
371 ! -------------------------------------------------------------------
372
373 include "cvparam.h"
374
375 ! inputs:
376 INTEGER len, nd, icb(len)
377 REAL cbmf(len), tv(len, nd), tvp(len, nd)
378
379 ! outputs:
380 INTEGER iflag(len) ! also an input
381
382 ! local variables:
383 INTEGER i
384
385
386 ✗ DO i = 1, len
387 ✗ IF ((cbmf(i)==0.0) .AND. (iflag(i)==0) .AND. (tvp(i, &
388 ✗ icb(i))<=(tv(i,icb(i))-dtmax))) iflag(i) = 4
389 END DO
390
391 ✗ RETURN
392 END SUBROUTINE cv_trigger
393
394 ✗ SUBROUTINE cv_compress(len, nloc, ncum, nd, iflag1, nk1, icb1, cbmf1, plcl1, &
395 ✗ tnk1, qnk1, gznk1, t1, q1, qs1, u1, v1, gz1, h1, lv1, cpn1, p1, ph1, tv1, &
396 ✗ tp1, tvp1, clw1, iflag, nk, icb, cbmf, plcl, tnk, qnk, gznk, t, q, qs, u, &
397 v, gz, h, lv, cpn, p, ph, tv, tp, tvp, clw, dph)
398 USE print_control_mod, ONLY: lunout
399 IMPLICIT NONE
400
401 include "cvparam.h"
402
403 ! inputs:
404 INTEGER len, ncum, nd, nloc
405 INTEGER iflag1(len), nk1(len), icb1(len)
406 REAL cbmf1(len), plcl1(len), tnk1(len), qnk1(len), gznk1(len)
407 REAL t1(len, nd), q1(len, nd), qs1(len, nd), u1(len, nd), v1(len, nd)
408 REAL gz1(len, nd), h1(len, nd), lv1(len, nd), cpn1(len, nd)
409 REAL p1(len, nd), ph1(len, nd+1), tv1(len, nd), tp1(len, nd)
410 REAL tvp1(len, nd), clw1(len, nd)
411
412 ! outputs:
413 INTEGER iflag(nloc), nk(nloc), icb(nloc)
414 REAL cbmf(nloc), plcl(nloc), tnk(nloc), qnk(nloc), gznk(nloc)
415 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd), u(nloc, nd), v(nloc, nd)
416 REAL gz(nloc, nd), h(nloc, nd), lv(nloc, nd), cpn(nloc, nd)
417 REAL p(nloc, nd), ph(nloc, nd+1), tv(nloc, nd), tp(nloc, nd)
418 REAL tvp(nloc, nd), clw(nloc, nd)
419 REAL dph(nloc, nd)
420
421 ! local variables:
422 INTEGER i, k, nn
423 CHARACTER (LEN=20) :: modname = 'cv_compress'
424 CHARACTER (LEN=80) :: abort_message
425
426
427 ✗ DO k = 1, nl + 1
428 ✗ nn = 0
429 ✗ DO i = 1, len
430 ✗ IF (iflag1(i)==0) THEN
431 ✗ nn = nn + 1
432 ✗ t(nn, k) = t1(i, k)
433 ✗ q(nn, k) = q1(i, k)
434 ✗ qs(nn, k) = qs1(i, k)
435 ✗ u(nn, k) = u1(i, k)
436 ✗ v(nn, k) = v1(i, k)
437 ✗ gz(nn, k) = gz1(i, k)
438 ✗ h(nn, k) = h1(i, k)
439 ✗ lv(nn, k) = lv1(i, k)
440 ✗ cpn(nn, k) = cpn1(i, k)
441 ✗ p(nn, k) = p1(i, k)
442 ✗ ph(nn, k) = ph1(i, k)
443 ✗ tv(nn, k) = tv1(i, k)
444 ✗ tp(nn, k) = tp1(i, k)
445 ✗ tvp(nn, k) = tvp1(i, k)
446 ✗ clw(nn, k) = clw1(i, k)
447 END IF
448 END DO
449 END DO
450
451 ✗ IF (nn/=ncum) THEN
452 ✗ WRITE (lunout, *) 'strange! nn not equal to ncum: ', nn, ncum
453 ✗ abort_message = ''
454 ✗ CALL abort_physic(modname, abort_message, 1)
455 END IF
456
457 ✗ nn = 0
458 ✗ DO i = 1, len
459 ✗ IF (iflag1(i)==0) THEN
460 ✗ nn = nn + 1
461 ✗ cbmf(nn) = cbmf1(i)
462 ✗ plcl(nn) = plcl1(i)
463 ✗ tnk(nn) = tnk1(i)
464 ✗ qnk(nn) = qnk1(i)
465 ✗ gznk(nn) = gznk1(i)
466 ✗ nk(nn) = nk1(i)
467 ✗ icb(nn) = icb1(i)
468 ✗ iflag(nn) = iflag1(i)
469 END IF
470 END DO
471
472 ✗ DO k = 1, nl
473 ✗ DO i = 1, ncum
474 ✗ dph(i, k) = ph(i, k) - ph(i, k+1)
475 END DO
476 END DO
477
478 ✗ RETURN
479 END SUBROUTINE cv_compress
480
481 ✗ SUBROUTINE cv_undilute2(nloc, ncum, nd, icb, nk, tnk, qnk, gznk, t, q, qs, &
482 ✗ gz, p, dph, h, tv, lv, inb, inb1, tp, tvp, clw, hp, ep, sigp, frac)
483 IMPLICIT NONE
484
485 ! ---------------------------------------------------------------------
486 ! Purpose:
487 ! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
488 ! &
489 ! COMPUTE THE PRECIPITATION EFFICIENCIES AND THE
490 ! FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD
491 ! &
492 ! FIND THE LEVEL OF NEUTRAL BUOYANCY
493 ! ---------------------------------------------------------------------
494
495 include "cvthermo.h"
496 include "cvparam.h"
497
498 ! inputs:
499 INTEGER ncum, nd, nloc
500 INTEGER icb(nloc), nk(nloc)
501 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd), gz(nloc, nd)
502 REAL p(nloc, nd), dph(nloc, nd)
503 REAL tnk(nloc), qnk(nloc), gznk(nloc)
504 REAL lv(nloc, nd), tv(nloc, nd), h(nloc, nd)
505
506 ! outputs:
507 INTEGER inb(nloc), inb1(nloc)
508 REAL tp(nloc, nd), tvp(nloc, nd), clw(nloc, nd)
509 REAL ep(nloc, nd), sigp(nloc, nd), hp(nloc, nd)
510 REAL frac(nloc)
511
512 ! local variables:
513 INTEGER i, k
514 REAL tg, qg, ahg, alv, s, tc, es, denom, rg, tca, elacrit
515 REAL by, defrac
516 ✗ REAL ah0(nloc), cape(nloc), capem(nloc), byp(nloc)
517 ✗ LOGICAL lcape(nloc)
518
519 ! =====================================================================
520 ! --- SOME INITIALIZATIONS
521 ! =====================================================================
522
523 ✗ DO k = 1, nl
524 ✗ DO i = 1, ncum
525 ✗ ep(i, k) = 0.0
526 ✗ sigp(i, k) = sigs
527 END DO
528 END DO
529
530 ! =====================================================================
531 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
532 ! =====================================================================
533
534 ! --- The procedure is to solve the equation.
535 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
536
537 ! *** Calculate certain parcel quantities, including static energy ***
538
539
540 ✗ DO i = 1, ncum
541 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)- &
542 ✗ t0)) + gznk(i)
543 END DO
544
545
546 ! *** Find lifted parcel quantities above cloud base ***
547
548
549 ✗ DO k = minorig + 1, nl
550 ✗ DO i = 1, ncum
551 ✗ IF (k>=(icb(i)+1)) THEN
552 ✗ tg = t(i, k)
553 ✗ qg = qs(i, k)
554 ✗ alv = lv0 - clmcpv*(t(i,k)-t0)
555
556 ! First iteration.
557
558 ✗ s = cpd + alv*alv*qg/(rrv*t(i,k)*t(i,k))
559 ✗ s = 1./s
560 ✗ ahg = cpd*tg + (cl-cpd)*qnk(i)*t(i, k) + alv*qg + gz(i, k)
561 ✗ tg = tg + s*(ah0(i)-ahg)
562 ✗ tg = max(tg, 35.0)
563 ✗ tc = tg - t0
564 ✗ denom = 243.5 + tc
565 ✗ IF (tc>=0.0) THEN
566 ✗ es = 6.112*exp(17.67*tc/denom)
567 ELSE
568 ✗ es = exp(23.33086-6111.72784/tg+0.15215*log(tg))
569 END IF
570 ✗ qg = eps*es/(p(i,k)-es*(1.-eps))
571
572 ! Second iteration.
573
574 ✗ s = cpd + alv*alv*qg/(rrv*t(i,k)*t(i,k))
575 ✗ s = 1./s
576 ✗ ahg = cpd*tg + (cl-cpd)*qnk(i)*t(i, k) + alv*qg + gz(i, k)
577 ✗ tg = tg + s*(ah0(i)-ahg)
578 ✗ tg = max(tg, 35.0)
579 ✗ tc = tg - t0
580 ✗ denom = 243.5 + tc
581 ✗ IF (tc>=0.0) THEN
582 ✗ es = 6.112*exp(17.67*tc/denom)
583 ELSE
584 ✗ es = exp(23.33086-6111.72784/tg+0.15215*log(tg))
585 END IF
586 ✗ qg = eps*es/(p(i,k)-es*(1.-eps))
587
588 alv = lv0 - clmcpv*(t(i,k)-t0)
589 ! print*,'cpd dans convect2 ',cpd
590 ! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd'
591 ! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd
592 ✗ tp(i, k) = (ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd
593 ! if (.not.cpd.gt.1000.) then
594 ! print*,'CPD=',cpd
595 ! stop
596 ! endif
597 ✗ clw(i, k) = qnk(i) - qg
598 ✗ clw(i, k) = max(0.0, clw(i,k))
599 ✗ rg = qg/(1.-qnk(i))
600 ✗ tvp(i, k) = tp(i, k)*(1.+rg*epsi)
601 END IF
602 END DO
603 END DO
604
605 ! =====================================================================
606 ! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF
607 ! --- PRECIPITATION FALLING OUTSIDE OF CLOUD
608 ! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I)
609 ! =====================================================================
610
611 ✗ DO k = minorig + 1, nl
612 ✗ DO i = 1, ncum
613 ✗ IF (k>=(nk(i)+1)) THEN
614 ✗ tca = tp(i, k) - t0
615 ✗ IF (tca>=0.0) THEN
616 ✗ elacrit = elcrit
617 ELSE
618 ✗ elacrit = elcrit*(1.0-tca/tlcrit)
619 END IF
620 ✗ elacrit = max(elacrit, 0.0)
621 ✗ ep(i, k) = 1.0 - elacrit/max(clw(i,k), 1.0E-8)
622 ✗ ep(i, k) = max(ep(i,k), 0.0)
623 ✗ ep(i, k) = min(ep(i,k), 1.0)
624 ✗ sigp(i, k) = sigs
625 END IF
626 END DO
627 END DO
628
629 ! =====================================================================
630 ! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL
631 ! --- VIRTUAL TEMPERATURE
632 ! =====================================================================
633
634 ✗ DO k = minorig + 1, nl
635 ✗ DO i = 1, ncum
636 ✗ IF (k>=(icb(i)+1)) THEN
637 ✗ tvp(i, k) = tvp(i, k)*(1.0-qnk(i)+ep(i,k)*clw(i,k))
638 ! print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)'
639 ! print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)
640 END IF
641 END DO
642 END DO
643 ✗ DO i = 1, ncum
644 ✗ tvp(i, nlp) = tvp(i, nl) - (gz(i,nlp)-gz(i,nl))/cpd
645 END DO
646
647 ! =====================================================================
648 ! --- FIND THE FIRST MODEL LEVEL (INB1) ABOVE THE PARCEL'S
649 ! --- HIGHEST LEVEL OF NEUTRAL BUOYANCY
650 ! --- AND THE HIGHEST LEVEL OF POSITIVE CAPE (INB)
651 ! =====================================================================
652
653 ✗ DO i = 1, ncum
654 ✗ cape(i) = 0.0
655 ✗ capem(i) = 0.0
656 ✗ inb(i) = icb(i) + 1
657 ✗ inb1(i) = inb(i)
658 END DO
659
660 ! Originial Code
661
662 ! do 530 k=minorig+1,nl-1
663 ! do 520 i=1,ncum
664 ! if(k.ge.(icb(i)+1))then
665 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
666 ! byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
667 ! cape(i)=cape(i)+by
668 ! if(by.ge.0.0)inb1(i)=k+1
669 ! if(cape(i).gt.0.0)then
670 ! inb(i)=k+1
671 ! capem(i)=cape(i)
672 ! endif
673 ! endif
674 ! 520 continue
675 ! 530 continue
676 ! do 540 i=1,ncum
677 ! byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl)
678 ! cape(i)=capem(i)+byp
679 ! defrac=capem(i)-cape(i)
680 ! defrac=max(defrac,0.001)
681 ! frac(i)=-cape(i)/defrac
682 ! frac(i)=min(frac(i),1.0)
683 ! frac(i)=max(frac(i),0.0)
684 ! 540 continue
685
686 ! K Emanuel fix
687
688 ! call zilch(byp,ncum)
689 ! do 530 k=minorig+1,nl-1
690 ! do 520 i=1,ncum
691 ! if(k.ge.(icb(i)+1))then
692 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
693 ! cape(i)=cape(i)+by
694 ! if(by.ge.0.0)inb1(i)=k+1
695 ! if(cape(i).gt.0.0)then
696 ! inb(i)=k+1
697 ! capem(i)=cape(i)
698 ! byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
699 ! endif
700 ! endif
701 ! 520 continue
702 ! 530 continue
703 ! do 540 i=1,ncum
704 ! inb(i)=max(inb(i),inb1(i))
705 ! cape(i)=capem(i)+byp(i)
706 ! defrac=capem(i)-cape(i)
707 ! defrac=max(defrac,0.001)
708 ! frac(i)=-cape(i)/defrac
709 ! frac(i)=min(frac(i),1.0)
710 ! frac(i)=max(frac(i),0.0)
711 ! 540 continue
712
713 ! J Teixeira fix
714
715 ✗ CALL zilch(byp, ncum)
716 ✗ DO i = 1, ncum
717 ✗ lcape(i) = .TRUE.
718 END DO
719 ✗ DO k = minorig + 1, nl - 1
720 ✗ DO i = 1, ncum
721 ✗ IF (cape(i)<0.0) lcape(i) = .FALSE.
722 ✗ IF ((k>=(icb(i)+1)) .AND. lcape(i)) THEN
723 ✗ by = (tvp(i,k)-tv(i,k))*dph(i, k)/p(i, k)
724 ✗ byp(i) = (tvp(i,k+1)-tv(i,k+1))*dph(i, k+1)/p(i, k+1)
725 ✗ cape(i) = cape(i) + by
726 ✗ IF (by>=0.0) inb1(i) = k + 1
727 ✗ IF (cape(i)>0.0) THEN
728 ✗ inb(i) = k + 1
729 ✗ capem(i) = cape(i)
730 END IF
731 END IF
732 END DO
733 END DO
734 ✗ DO i = 1, ncum
735 ✗ cape(i) = capem(i) + byp(i)
736 ✗ defrac = capem(i) - cape(i)
737 ✗ defrac = max(defrac, 0.001)
738 ✗ frac(i) = -cape(i)/defrac
739 ✗ frac(i) = min(frac(i), 1.0)
740 ✗ frac(i) = max(frac(i), 0.0)
741 END DO
742
743 ! =====================================================================
744 ! --- CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL
745 ! =====================================================================
746
747 ! initialization:
748 ✗ DO i = 1, ncum*nlp
749 ✗ hp(i, 1) = h(i, 1)
750 END DO
751
752 ✗ DO k = minorig + 1, nl
753 ✗ DO i = 1, ncum
754 ✗ IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
755 hp(i, k) = h(i, nk(i)) + (lv(i,k)+(cpd-cpv)*t(i,k))*ep(i, k)*clw(i, k &
756 ✗ )
757 END IF
758 END DO
759 END DO
760
761 ✗ RETURN
762 END SUBROUTINE cv_undilute2
763
764 ✗ SUBROUTINE cv_closure(nloc, ncum, nd, nk, icb, tv, tvp, p, ph, dph, plcl, &
765 cpn, iflag, cbmf)
766 IMPLICIT NONE
767
768 ! inputs:
769 INTEGER ncum, nd, nloc
770 INTEGER nk(nloc), icb(nloc)
771 REAL tv(nloc, nd), tvp(nloc, nd), p(nloc, nd), dph(nloc, nd)
772 REAL ph(nloc, nd+1) ! caution nd instead ndp1 to be consistent...
773 REAL plcl(nloc), cpn(nloc, nd)
774
775 ! outputs:
776 INTEGER iflag(nloc)
777 REAL cbmf(nloc) ! also an input
778
779 ! local variables:
780 INTEGER i, k, icbmax
781 ✗ REAL dtpbl(nloc), dtmin(nloc), tvpplcl(nloc), tvaplcl(nloc)
782 ✗ REAL work(nloc)
783
784 include "cvthermo.h"
785 include "cvparam.h"
786
787 ! -------------------------------------------------------------------
788 ! Compute icbmax.
789 ! -------------------------------------------------------------------
790
791 icbmax = 2
792 ✗ DO i = 1, ncum
793 ✗ icbmax = max(icbmax, icb(i))
794 END DO
795
796 ! =====================================================================
797 ! --- CALCULATE CLOUD BASE MASS FLUX
798 ! =====================================================================
799
800 ! tvpplcl = parcel temperature lifted adiabatically from level
801 ! icb-1 to the LCL.
802 ! tvaplcl = virtual temperature at the LCL.
803
804 ✗ DO i = 1, ncum
805 ✗ dtpbl(i) = 0.0
806 tvpplcl(i) = tvp(i, icb(i)-1) - rrd*tvp(i, icb(i)-1)*(p(i,icb(i)-1)-plcl( &
807 ✗ i))/(cpn(i,icb(i)-1)*p(i,icb(i)-1))
808 tvaplcl(i) = tv(i, icb(i)) + (tvp(i,icb(i))-tvp(i,icb(i)+1))*(plcl(i)-p(i &
809 ✗ ,icb(i)))/(p(i,icb(i))-p(i,icb(i)+1))
810 END DO
811
812 ! -------------------------------------------------------------------
813 ! --- Interpolate difference between lifted parcel and
814 ! --- environmental temperatures to lifted condensation level
815 ! -------------------------------------------------------------------
816
817 ! dtpbl = average of tvp-tv in the PBL (k=nk to icb-1).
818
819 ✗ DO k = minorig, icbmax
820 ✗ DO i = 1, ncum
821 ✗ IF ((k>=nk(i)) .AND. (k<=(icb(i)-1))) THEN
822 ✗ dtpbl(i) = dtpbl(i) + (tvp(i,k)-tv(i,k))*dph(i, k)
823 END IF
824 END DO
825 END DO
826 ✗ DO i = 1, ncum
827 ✗ dtpbl(i) = dtpbl(i)/(ph(i,nk(i))-ph(i,icb(i)))
828 ✗ dtmin(i) = tvpplcl(i) - tvaplcl(i) + dtmax + dtpbl(i)
829 END DO
830
831 ! -------------------------------------------------------------------
832 ! --- Adjust cloud base mass flux
833 ! -------------------------------------------------------------------
834
835 ✗ DO i = 1, ncum
836 ✗ work(i) = cbmf(i)
837 ✗ cbmf(i) = max(0.0, (1.0-damp)*cbmf(i)+0.1*alpha*dtmin(i))
838 ✗ IF ((work(i)==0.0) .AND. (cbmf(i)==0.0)) THEN
839 ✗ iflag(i) = 3
840 END IF
841 END DO
842
843 ✗ RETURN
844 END SUBROUTINE cv_closure
845
846 ✗ SUBROUTINE cv_mixing(nloc, ncum, nd, icb, nk, inb, inb1, ph, t, q, qs, u, v, &
847 ✗ h, lv, qnk, hp, tv, tvp, ep, clw, cbmf, m, ment, qent, uent, vent, nent, &
848 sij, elij)
849 IMPLICIT NONE
850
851 include "cvthermo.h"
852 include "cvparam.h"
853
854 ! inputs:
855 INTEGER ncum, nd, nloc
856 INTEGER icb(nloc), inb(nloc), inb1(nloc), nk(nloc)
857 REAL cbmf(nloc), qnk(nloc)
858 REAL ph(nloc, nd+1)
859 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd), lv(nloc, nd)
860 REAL u(nloc, nd), v(nloc, nd), h(nloc, nd), hp(nloc, nd)
861 REAL tv(nloc, nd), tvp(nloc, nd), ep(nloc, nd), clw(nloc, nd)
862
863 ! outputs:
864 INTEGER nent(nloc, nd)
865 REAL m(nloc, nd), ment(nloc, nd, nd), qent(nloc, nd, nd)
866 REAL uent(nloc, nd, nd), vent(nloc, nd, nd)
867 REAL sij(nloc, nd, nd), elij(nloc, nd, nd)
868
869 ! local variables:
870 INTEGER i, j, k, ij
871 INTEGER num1, num2
872 REAL dbo, qti, bf2, anum, denom, dei, altem, cwat, stemp
873 REAL alt, qp1, smid, sjmin, sjmax, delp, delm
874 ✗ REAL work(nloc), asij(nloc), smin(nloc), scrit(nloc)
875 ✗ REAL bsum(nloc, nd)
876 ✗ LOGICAL lwork(nloc)
877
878 ! =====================================================================
879 ! --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS
880 ! =====================================================================
881
882 ✗ DO i = 1, ncum*nlp
883 ✗ nent(i, 1) = 0
884 ✗ m(i, 1) = 0.0
885 END DO
886
887 ✗ DO k = 1, nlp
888 ✗ DO j = 1, nlp
889 ✗ DO i = 1, ncum
890 ✗ qent(i, k, j) = q(i, j)
891 ✗ uent(i, k, j) = u(i, j)
892 ✗ vent(i, k, j) = v(i, j)
893 ✗ elij(i, k, j) = 0.0
894 ✗ ment(i, k, j) = 0.0
895 ✗ sij(i, k, j) = 0.0
896 END DO
897 END DO
898 END DO
899
900 ! -------------------------------------------------------------------
901 ! --- Calculate rates of mixing, m(i)
902 ! -------------------------------------------------------------------
903
904 ✗ CALL zilch(work, ncum)
905
906 ✗ DO j = minorig + 1, nl
907 ✗ DO i = 1, ncum
908 ✗ IF ((j>=(icb(i)+1)) .AND. (j<=inb(i))) THEN
909 ✗ k = min(j, inb1(i))
910 dbo = abs(tv(i,k+1)-tvp(i,k+1)-tv(i,k-1)+tvp(i,k-1)) + &
911 ✗ entp*0.04*(ph(i,k)-ph(i,k+1))
912 ✗ work(i) = work(i) + dbo
913 ✗ m(i, j) = cbmf(i)*dbo
914 END IF
915 END DO
916 END DO
917 ✗ DO k = minorig + 1, nl
918 ✗ DO i = 1, ncum
919 ✗ IF ((k>=(icb(i)+1)) .AND. (k<=inb(i))) THEN
920 ✗ m(i, k) = m(i, k)/work(i)
921 END IF
922 END DO
923 END DO
924
925
926 ! =====================================================================
927 ! --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING
928 ! --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING
929 ! --- FRACTION (sij)
930 ! =====================================================================
931
932
933 ✗ DO i = minorig + 1, nl
934 ✗ DO j = minorig + 1, nl
935 ✗ DO ij = 1, ncum
936 ✗ IF ((i>=(icb(ij)+1)) .AND. (j>=icb(ij)) .AND. (i<=inb(ij)) .AND. (j<= &
937 ✗ inb(ij))) THEN
938 ✗ qti = qnk(ij) - ep(ij, i)*clw(ij, i)
939 ✗ bf2 = 1. + lv(ij, j)*lv(ij, j)*qs(ij, j)/(rrv*t(ij,j)*t(ij,j)*cpd)
940 ✗ anum = h(ij, j) - hp(ij, i) + (cpv-cpd)*t(ij, j)*(qti-q(ij,j))
941 ✗ denom = h(ij, i) - hp(ij, i) + (cpd-cpv)*(q(ij,i)-qti)*t(ij, j)
942 dei = denom
943 ✗ IF (abs(dei)<0.01) dei = 0.01
944 ✗ sij(ij, i, j) = anum/dei
945 ✗ sij(ij, i, i) = 1.0
946 ✗ altem = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti - qs(ij, j)
947 ✗ altem = altem/bf2
948 ✗ cwat = clw(ij, j)*(1.-ep(ij,j))
949 stemp = sij(ij, i, j)
950 ✗ IF ((stemp<0.0 .OR. stemp>1.0 .OR. altem>cwat) .AND. j>i) THEN
951 ✗ anum = anum - lv(ij, j)*(qti-qs(ij,j)-cwat*bf2)
952 ✗ denom = denom + lv(ij, j)*(q(ij,i)-qti)
953 ✗ IF (abs(denom)<0.01) denom = 0.01
954 ✗ sij(ij, i, j) = anum/denom
955 ✗ altem = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti - qs(ij, j)
956 ✗ altem = altem - (bf2-1.)*cwat
957 END IF
958 ✗ IF (sij(ij,i,j)>0.0 .AND. sij(ij,i,j)<0.9) THEN
959 ✗ qent(ij, i, j) = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti
960 uent(ij, i, j) = sij(ij, i, j)*u(ij, i) + &
961 ✗ (1.-sij(ij,i,j))*u(ij, nk(ij))
962 vent(ij, i, j) = sij(ij, i, j)*v(ij, i) + &
963 ✗ (1.-sij(ij,i,j))*v(ij, nk(ij))
964 elij(ij, i, j) = altem
965 ✗ elij(ij, i, j) = max(0.0, elij(ij,i,j))
966 ✗ ment(ij, i, j) = m(ij, i)/(1.-sij(ij,i,j))
967 ✗ nent(ij, i) = nent(ij, i) + 1
968 END IF
969 ✗ sij(ij, i, j) = max(0.0, sij(ij,i,j))
970 ✗ sij(ij, i, j) = min(1.0, sij(ij,i,j))
971 END IF
972 END DO
973 END DO
974
975 ! *** If no air can entrain at level i assume that updraft detrains
976 ! ***
977 ! *** at that level and calculate detrained air flux and properties
978 ! ***
979
980 ✗ DO ij = 1, ncum
981 ✗ IF ((i>=(icb(ij)+1)) .AND. (i<=inb(ij)) .AND. (nent(ij,i)==0)) THEN
982 ✗ ment(ij, i, i) = m(ij, i)
983 ✗ qent(ij, i, i) = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i)
984 ✗ uent(ij, i, i) = u(ij, nk(ij))
985 ✗ vent(ij, i, i) = v(ij, nk(ij))
986 ✗ elij(ij, i, i) = clw(ij, i)
987 ✗ sij(ij, i, i) = 1.0
988 END IF
989 END DO
990 END DO
991
992 ✗ DO i = 1, ncum
993 ✗ sij(i, inb(i), inb(i)) = 1.0
994 END DO
995
996 ! =====================================================================
997 ! --- NORMALIZE ENTRAINED AIR MASS FLUXES
998 ! --- TO REPRESENT EQUAL PROBABILITIES OF MIXING
999 ! =====================================================================
1000
1001 ✗ CALL zilch(bsum, ncum*nlp)
1002 ✗ DO ij = 1, ncum
1003 ✗ lwork(ij) = .FALSE.
1004 END DO
1005 ✗ DO i = minorig + 1, nl
1006
1007 num1 = 0
1008 ✗ DO ij = 1, ncum
1009 ✗ IF ((i>=icb(ij)+1) .AND. (i<=inb(ij))) num1 = num1 + 1
1010 END DO
1011 ✗ IF (num1<=0) GO TO 789
1012
1013 ✗ DO ij = 1, ncum
1014 ✗ IF ((i>=icb(ij)+1) .AND. (i<=inb(ij))) THEN
1015 ✗ lwork(ij) = (nent(ij,i)/=0)
1016 ✗ qp1 = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i)
1017 ✗ anum = h(ij, i) - hp(ij, i) - lv(ij, i)*(qp1-qs(ij,i))
1018 ✗ denom = h(ij, i) - hp(ij, i) + lv(ij, i)*(q(ij,i)-qp1)
1019 ✗ IF (abs(denom)<0.01) denom = 0.01
1020 ✗ scrit(ij) = anum/denom
1021 ✗ alt = qp1 - qs(ij, i) + scrit(ij)*(q(ij,i)-qp1)
1022 ✗ IF (scrit(ij)<0.0 .OR. alt<0.0) scrit(ij) = 1.0
1023 ✗ asij(ij) = 0.0
1024 ✗ smin(ij) = 1.0
1025 END IF
1026 END DO
1027 ✗ DO j = minorig, nl
1028
1029 num2 = 0
1030 ✗ DO ij = 1, ncum
1031 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( &
1032 ✗ ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) num2 = num2 + 1
1033 END DO
1034 ✗ IF (num2<=0) GO TO 783
1035
1036 ✗ DO ij = 1, ncum
1037 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( &
1038 ✗ ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) THEN
1039 ✗ IF (sij(ij,i,j)>0.0 .AND. sij(ij,i,j)<0.9) THEN
1040 ✗ IF (j>i) THEN
1041 ✗ smid = min(sij(ij,i,j), scrit(ij))
1042 sjmax = smid
1043 sjmin = smid
1044 ✗ IF (smid<smin(ij) .AND. sij(ij,i,j+1)<smid) THEN
1045 ✗ smin(ij) = smid
1046 ✗ sjmax = min(sij(ij,i,j+1), sij(ij,i,j), scrit(ij))
1047 ✗ sjmin = max(sij(ij,i,j-1), sij(ij,i,j))
1048 ✗ sjmin = min(sjmin, scrit(ij))
1049 END IF
1050 ELSE
1051 ✗ sjmax = max(sij(ij,i,j+1), scrit(ij))
1052 ✗ smid = max(sij(ij,i,j), scrit(ij))
1053 sjmin = 0.0
1054 ✗ IF (j>1) sjmin = sij(ij, i, j-1)
1055 ✗ sjmin = max(sjmin, scrit(ij))
1056 END IF
1057 ✗ delp = abs(sjmax-smid)
1058 ✗ delm = abs(sjmin-smid)
1059 ✗ asij(ij) = asij(ij) + (delp+delm)*(ph(ij,j)-ph(ij,j+1))
1060 ✗ ment(ij, i, j) = ment(ij, i, j)*(delp+delm)*(ph(ij,j)-ph(ij,j+1))
1061 END IF
1062 END IF
1063 END DO
1064 ✗ 783 END DO
1065 ✗ DO ij = 1, ncum
1066 ✗ IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. lwork(ij)) THEN
1067 ✗ asij(ij) = max(1.0E-21, asij(ij))
1068 ✗ asij(ij) = 1.0/asij(ij)
1069 ✗ bsum(ij, i) = 0.0
1070 END IF
1071 END DO
1072 ✗ DO j = minorig, nl + 1
1073 ✗ DO ij = 1, ncum
1074 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( &
1075 ✗ ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) THEN
1076 ✗ ment(ij, i, j) = ment(ij, i, j)*asij(ij)
1077 ✗ bsum(ij, i) = bsum(ij, i) + ment(ij, i, j)
1078 END IF
1079 END DO
1080 END DO
1081 ✗ DO ij = 1, ncum
1082 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (bsum(ij, &
1083 ✗ i)<1.0E-18) .AND. lwork(ij)) THEN
1084 ✗ nent(ij, i) = 0
1085 ✗ ment(ij, i, i) = m(ij, i)
1086 ✗ qent(ij, i, i) = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i)
1087 ✗ uent(ij, i, i) = u(ij, nk(ij))
1088 ✗ vent(ij, i, i) = v(ij, nk(ij))
1089 ✗ elij(ij, i, i) = clw(ij, i)
1090 ✗ sij(ij, i, i) = 1.0
1091 END IF
1092 END DO
1093 ✗ 789 END DO
1094
1095 ✗ RETURN
1096 END SUBROUTINE cv_mixing
1097
1098 ✗ SUBROUTINE cv_unsat(nloc, ncum, nd, inb, t, q, qs, gz, u, v, p, ph, h, lv, &
1099 ✗ ep, sigp, clw, m, ment, elij, iflag, mp, qp, up, vp, wt, water, evap)
1100 IMPLICIT NONE
1101
1102
1103 include "cvthermo.h"
1104 include "cvparam.h"
1105
1106 ! inputs:
1107 INTEGER ncum, nd, nloc
1108 INTEGER inb(nloc)
1109 REAL t(nloc, nd), q(nloc, nd), qs(nloc, nd)
1110 REAL gz(nloc, nd), u(nloc, nd), v(nloc, nd)
1111 REAL p(nloc, nd), ph(nloc, nd+1), h(nloc, nd)
1112 REAL lv(nloc, nd), ep(nloc, nd), sigp(nloc, nd), clw(nloc, nd)
1113 REAL m(nloc, nd), ment(nloc, nd, nd), elij(nloc, nd, nd)
1114
1115 ! outputs:
1116 INTEGER iflag(nloc) ! also an input
1117 REAL mp(nloc, nd), qp(nloc, nd), up(nloc, nd), vp(nloc, nd)
1118 REAL water(nloc, nd), evap(nloc, nd), wt(nloc, nd)
1119
1120 ! local variables:
1121 INTEGER i, j, k, ij, num1
1122 ✗ INTEGER jtt(nloc)
1123 REAL awat, coeff, qsm, afac, sigt, b6, c6, revap
1124 REAL dhdp, fac, qstm, rat
1125 ✗ REAL wdtrain(nloc)
1126 ✗ LOGICAL lwork(nloc)
1127
1128 ! =====================================================================
1129 ! --- PRECIPITATING DOWNDRAFT CALCULATION
1130 ! =====================================================================
1131
1132 ! Initializations:
1133
1134 ✗ DO i = 1, ncum
1135 ✗ DO k = 1, nl + 1
1136 ✗ wt(i, k) = omtsnow
1137 ✗ mp(i, k) = 0.0
1138 ✗ evap(i, k) = 0.0
1139 ✗ water(i, k) = 0.0
1140 END DO
1141 END DO
1142
1143 ✗ DO i = 1, ncum
1144 ✗ qp(i, 1) = q(i, 1)
1145 ✗ up(i, 1) = u(i, 1)
1146 ✗ vp(i, 1) = v(i, 1)
1147 END DO
1148
1149 ✗ DO k = 2, nl + 1
1150 ✗ DO i = 1, ncum
1151 ✗ qp(i, k) = q(i, k-1)
1152 ✗ up(i, k) = u(i, k-1)
1153 ✗ vp(i, k) = v(i, k-1)
1154 END DO
1155 END DO
1156
1157
1158 ! *** Check whether ep(inb)=0, if so, skip precipitating ***
1159 ! *** downdraft calculation ***
1160
1161
1162 ! *** Integrate liquid water equation to find condensed water ***
1163 ! *** and condensed water flux ***
1164
1165
1166 ✗ DO i = 1, ncum
1167 ✗ jtt(i) = 2
1168 ✗ IF (ep(i,inb(i))<=0.0001) iflag(i) = 2
1169 ✗ IF (iflag(i)==0) THEN
1170 ✗ lwork(i) = .TRUE.
1171 ELSE
1172 ✗ lwork(i) = .FALSE.
1173 END IF
1174 END DO
1175
1176 ! *** Begin downdraft loop ***
1177
1178
1179 ✗ CALL zilch(wdtrain, ncum)
1180 ✗ DO i = nl + 1, 1, -1
1181
1182 num1 = 0
1183 ✗ DO ij = 1, ncum
1184 ✗ IF ((i<=inb(ij)) .AND. lwork(ij)) num1 = num1 + 1
1185 END DO
1186 ✗ IF (num1<=0) GO TO 899
1187
1188
1189 ! *** Calculate detrained precipitation ***
1190
1191 ✗ DO ij = 1, ncum
1192 ✗ IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN
1193 ✗ wdtrain(ij) = g*ep(ij, i)*m(ij, i)*clw(ij, i)
1194 END IF
1195 END DO
1196
1197 ✗ IF (i>1) THEN
1198 ✗ DO j = 1, i - 1
1199 ✗ DO ij = 1, ncum
1200 ✗ IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN
1201 ✗ awat = elij(ij, j, i) - (1.-ep(ij,i))*clw(ij, i)
1202 ✗ awat = max(0.0, awat)
1203 ✗ wdtrain(ij) = wdtrain(ij) + g*awat*ment(ij, j, i)
1204 END IF
1205 END DO
1206 END DO
1207 END IF
1208
1209 ! *** Find rain water and evaporation using provisional ***
1210 ! *** estimates of qp(i)and qp(i-1) ***
1211
1212
1213 ! *** Value of terminal velocity and coeffecient of evaporation for snow
1214 ! ***
1215
1216 ✗ DO ij = 1, ncum
1217 ✗ IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN
1218 ✗ coeff = coeffs
1219 ✗ wt(ij, i) = omtsnow
1220
1221 ! *** Value of terminal velocity and coeffecient of evaporation for
1222 ! rain ***
1223
1224 ✗ IF (t(ij,i)>273.0) THEN
1225 ✗ coeff = coeffr
1226 ✗ wt(ij, i) = omtrain
1227 END IF
1228 ✗ qsm = 0.5*(q(ij,i)+qp(ij,i+1))
1229 ✗ afac = coeff*ph(ij, i)*(qs(ij,i)-qsm)/(1.0E4+2.0E3*ph(ij,i)*qs(ij,i))
1230 ✗ afac = max(afac, 0.0)
1231 ✗ sigt = sigp(ij, i)
1232 ✗ sigt = max(0.0, sigt)
1233 ✗ sigt = min(1.0, sigt)
1234 ✗ b6 = 100.*(ph(ij,i)-ph(ij,i+1))*sigt*afac/wt(ij, i)
1235 ✗ c6 = (water(ij,i+1)*wt(ij,i+1)+wdtrain(ij)/sigd)/wt(ij, i)
1236 ✗ revap = 0.5*(-b6+sqrt(b6*b6+4.*c6))
1237 ✗ evap(ij, i) = sigt*afac*revap
1238 ✗ water(ij, i) = revap*revap
1239
1240 ! *** Calculate precipitating downdraft mass flux under ***
1241 ! *** hydrostatic approximation ***
1242
1243 ✗ IF (i>1) THEN
1244 ✗ dhdp = (h(ij,i)-h(ij,i-1))/(p(ij,i-1)-p(ij,i))
1245 ✗ dhdp = max(dhdp, 10.0)
1246 ✗ mp(ij, i) = 100.*ginv*lv(ij, i)*sigd*evap(ij, i)/dhdp
1247 ✗ mp(ij, i) = max(mp(ij,i), 0.0)
1248
1249 ! *** Add small amount of inertia to downdraft ***
1250
1251 ✗ fac = 20.0/(ph(ij,i-1)-ph(ij,i))
1252 ✗ mp(ij, i) = (fac*mp(ij,i+1)+mp(ij,i))/(1.+fac)
1253
1254 ! *** Force mp to decrease linearly to zero
1255 ! ***
1256 ! *** between about 950 mb and the surface
1257 ! ***
1258
1259 ✗ IF (p(ij,i)>(0.949*p(ij,1))) THEN
1260 ✗ jtt(ij) = max(jtt(ij), i)
1261 mp(ij, i) = mp(ij, jtt(ij))*(p(ij,1)-p(ij,i))/ &
1262 ✗ (p(ij,1)-p(ij,jtt(ij)))
1263 END IF
1264 END IF
1265
1266 ! *** Find mixing ratio of precipitating downdraft ***
1267
1268 ✗ IF (i/=inb(ij)) THEN
1269 ✗ IF (i==1) THEN
1270 ✗ qstm = qs(ij, 1)
1271 ELSE
1272 ✗ qstm = qs(ij, i-1)
1273 END IF
1274 ✗ IF (mp(ij,i)>mp(ij,i+1)) THEN
1275 ✗ rat = mp(ij, i+1)/mp(ij, i)
1276 qp(ij, i) = qp(ij, i+1)*rat + q(ij, i)*(1.0-rat) + &
1277 ✗ 100.*ginv*sigd*(ph(ij,i)-ph(ij,i+1))*(evap(ij,i)/mp(ij,i))
1278 ✗ up(ij, i) = up(ij, i+1)*rat + u(ij, i)*(1.-rat)
1279 ✗ vp(ij, i) = vp(ij, i+1)*rat + v(ij, i)*(1.-rat)
1280 ELSE
1281 ✗ IF (mp(ij,i+1)>0.0) THEN
1282 qp(ij, i) = (gz(ij,i+1)-gz(ij,i)+qp(ij,i+1)*(lv(ij,i+1)+t(ij, &
1283 i+1)*(cl-cpd))+cpd*(t(ij,i+1)-t(ij, &
1284 ✗ i)))/(lv(ij,i)+t(ij,i)*(cl-cpd))
1285 ✗ up(ij, i) = up(ij, i+1)
1286 ✗ vp(ij, i) = vp(ij, i+1)
1287 END IF
1288 END IF
1289 ✗ qp(ij, i) = min(qp(ij,i), qstm)
1290 ✗ qp(ij, i) = max(qp(ij,i), 0.0)
1291 END IF
1292 END IF
1293 END DO
1294 ✗ 899 END DO
1295
1296 ✗ RETURN
1297 END SUBROUTINE cv_unsat
1298
1299 ✗ SUBROUTINE cv_yield(nloc, ncum, nd, nk, icb, inb, delt, t, q, u, v, gz, p, &
1300 ph, h, hp, lv, cpn, ep, clw, frac, m, mp, qp, up, vp, wt, water, evap, &
1301 ✗ ment, qent, uent, vent, nent, elij, tv, tvp, iflag, wd, qprime, tprime, &
1302 ✗ precip, cbmf, ft, fq, fu, fv, ma, qcondc)
1303 IMPLICIT NONE
1304
1305 include "cvthermo.h"
1306 include "cvparam.h"
1307
1308 ! inputs
1309 INTEGER ncum, nd, nloc
1310 INTEGER nk(nloc), icb(nloc), inb(nloc)
1311 INTEGER nent(nloc, nd)
1312 REAL delt
1313 REAL t(nloc, nd), q(nloc, nd), u(nloc, nd), v(nloc, nd)
1314 REAL gz(nloc, nd)
1315 REAL p(nloc, nd), ph(nloc, nd+1), h(nloc, nd)
1316 REAL hp(nloc, nd), lv(nloc, nd)
1317 REAL cpn(nloc, nd), ep(nloc, nd), clw(nloc, nd), frac(nloc)
1318 REAL m(nloc, nd), mp(nloc, nd), qp(nloc, nd)
1319 REAL up(nloc, nd), vp(nloc, nd)
1320 REAL wt(nloc, nd), water(nloc, nd), evap(nloc, nd)
1321 REAL ment(nloc, nd, nd), qent(nloc, nd, nd), elij(nloc, nd, nd)
1322 REAL uent(nloc, nd, nd), vent(nloc, nd, nd)
1323 REAL tv(nloc, nd), tvp(nloc, nd)
1324
1325 ! outputs
1326 INTEGER iflag(nloc) ! also an input
1327 REAL cbmf(nloc) ! also an input
1328 REAL wd(nloc), tprime(nloc), qprime(nloc)
1329 REAL precip(nloc)
1330 REAL ft(nloc, nd), fq(nloc, nd), fu(nloc, nd), fv(nloc, nd)
1331 REAL ma(nloc, nd)
1332 REAL qcondc(nloc, nd)
1333
1334 ! local variables
1335 INTEGER i, j, ij, k, num1
1336 REAL dpinv, cpinv, awat, fqold, ftold, fuold, fvold, delti
1337 ✗ REAL work(nloc), am(nloc), amp1(nloc), ad(nloc)
1338 ✗ REAL ents(nloc), uav(nloc), vav(nloc), lvcp(nloc, nd)
1339 ✗ REAL qcond(nloc, nd), nqcond(nloc, nd), wa(nloc, nd) ! cld
1340 ✗ REAL siga(nloc, nd), ax(nloc, nd), mac(nloc, nd) ! cld
1341
1342
1343 ! -- initializations:
1344
1345 ✗ delti = 1.0/delt
1346
1347 ✗ DO i = 1, ncum
1348 ✗ precip(i) = 0.0
1349 ✗ wd(i) = 0.0
1350 ✗ tprime(i) = 0.0
1351 ✗ qprime(i) = 0.0
1352 ✗ DO k = 1, nl + 1
1353 ✗ ft(i, k) = 0.0
1354 ✗ fu(i, k) = 0.0
1355 ✗ fv(i, k) = 0.0
1356 ✗ fq(i, k) = 0.0
1357 ✗ lvcp(i, k) = lv(i, k)/cpn(i, k)
1358 ✗ qcondc(i, k) = 0.0 ! cld
1359 ✗ qcond(i, k) = 0.0 ! cld
1360 ✗ nqcond(i, k) = 0.0 ! cld
1361 END DO
1362 END DO
1363
1364
1365 ! *** Calculate surface precipitation in mm/day ***
1366
1367 ✗ DO i = 1, ncum
1368 ✗ IF (iflag(i)<=1) THEN
1369 ! c precip(i)=precip(i)+wt(i,1)*sigd*water(i,1)*3600.*24000.
1370 ! c & /(rowl*g)
1371 ! c precip(i)=precip(i)*delt/86400.
1372 ✗ precip(i) = wt(i, 1)*sigd*water(i, 1)*86400/g
1373 END IF
1374 END DO
1375
1376
1377 ! *** Calculate downdraft velocity scale and surface temperature and ***
1378 ! *** water vapor fluctuations ***
1379
1380 ✗ DO i = 1, ncum
1381 ✗ wd(i) = betad*abs(mp(i,icb(i)))*0.01*rrd*t(i, icb(i))/(sigd*p(i,icb(i)))
1382 ✗ qprime(i) = 0.5*(qp(i,1)-q(i,1))
1383 ✗ tprime(i) = lv0*qprime(i)/cpd
1384 END DO
1385
1386 ! *** Calculate tendencies of lowest level potential temperature ***
1387 ! *** and mixing ratio ***
1388
1389 ✗ DO i = 1, ncum
1390 ✗ work(i) = 0.01/(ph(i,1)-ph(i,2))
1391 ✗ am(i) = 0.0
1392 END DO
1393 ✗ DO k = 2, nl
1394 ✗ DO i = 1, ncum
1395 ✗ IF ((nk(i)==1) .AND. (k<=inb(i)) .AND. (nk(i)==1)) THEN
1396 ✗ am(i) = am(i) + m(i, k)
1397 END IF
1398 END DO
1399 END DO
1400 ✗ DO i = 1, ncum
1401 ✗ IF ((g*work(i)*am(i))>=delti) iflag(i) = 1
1402 ft(i, 1) = ft(i, 1) + g*work(i)*am(i)*(t(i,2)-t(i,1)+(gz(i,2)-gz(i, &
1403 ✗ 1))/cpn(i,1))
1404 ✗ ft(i, 1) = ft(i, 1) - lvcp(i, 1)*sigd*evap(i, 1)
1405 ft(i, 1) = ft(i, 1) + sigd*wt(i, 2)*(cl-cpd)*water(i, 2)*(t(i,2)-t(i,1))* &
1406 ✗ work(i)/cpn(i, 1)
1407 fq(i, 1) = fq(i, 1) + g*mp(i, 2)*(qp(i,2)-q(i,1))*work(i) + &
1408 ✗ sigd*evap(i, 1)
1409 ✗ fq(i, 1) = fq(i, 1) + g*am(i)*(q(i,2)-q(i,1))*work(i)
1410 fu(i, 1) = fu(i, 1) + g*work(i)*(mp(i,2)*(up(i,2)-u(i,1))+am(i)*(u(i, &
1411 ✗ 2)-u(i,1)))
1412 fv(i, 1) = fv(i, 1) + g*work(i)*(mp(i,2)*(vp(i,2)-v(i,1))+am(i)*(v(i, &
1413 ✗ 2)-v(i,1)))
1414 END DO
1415 ✗ DO j = 2, nl
1416 ✗ DO i = 1, ncum
1417 ✗ IF (j<=inb(i)) THEN
1418 ✗ fq(i, 1) = fq(i, 1) + g*work(i)*ment(i, j, 1)*(qent(i,j,1)-q(i,1))
1419 ✗ fu(i, 1) = fu(i, 1) + g*work(i)*ment(i, j, 1)*(uent(i,j,1)-u(i,1))
1420 ✗ fv(i, 1) = fv(i, 1) + g*work(i)*ment(i, j, 1)*(vent(i,j,1)-v(i,1))
1421 END IF
1422 END DO
1423 END DO
1424
1425 ! *** Calculate tendencies of potential temperature and mixing ratio ***
1426 ! *** at levels above the lowest level ***
1427
1428 ! *** First find the net saturated updraft and downdraft mass fluxes ***
1429 ! *** through each level ***
1430
1431 ✗ DO i = 2, nl + 1
1432
1433 num1 = 0
1434 ✗ DO ij = 1, ncum
1435 ✗ IF (i<=inb(ij)) num1 = num1 + 1
1436 END DO
1437 ✗ IF (num1<=0) GO TO 1500
1438
1439 ✗ CALL zilch(amp1, ncum)
1440 ✗ CALL zilch(ad, ncum)
1441
1442 ✗ DO k = i + 1, nl + 1
1443 ✗ DO ij = 1, ncum
1444 ✗ IF ((i>=nk(ij)) .AND. (i<=inb(ij)) .AND. (k<=(inb(ij)+1))) THEN
1445 ✗ amp1(ij) = amp1(ij) + m(ij, k)
1446 END IF
1447 END DO
1448 END DO
1449
1450 ✗ DO k = 1, i
1451 ✗ DO j = i + 1, nl + 1
1452 ✗ DO ij = 1, ncum
1453 ✗ IF ((j<=(inb(ij)+1)) .AND. (i<=inb(ij))) THEN
1454 ✗ amp1(ij) = amp1(ij) + ment(ij, k, j)
1455 END IF
1456 END DO
1457 END DO
1458 END DO
1459 ✗ DO k = 1, i - 1
1460 ✗ DO j = i, nl + 1
1461 ✗ DO ij = 1, ncum
1462 ✗ IF ((i<=inb(ij)) .AND. (j<=inb(ij))) THEN
1463 ✗ ad(ij) = ad(ij) + ment(ij, j, k)
1464 END IF
1465 END DO
1466 END DO
1467 END DO
1468
1469 ✗ DO ij = 1, ncum
1470 ✗ IF (i<=inb(ij)) THEN
1471 ✗ dpinv = 0.01/(ph(ij,i)-ph(ij,i+1))
1472 ✗ cpinv = 1.0/cpn(ij, i)
1473
1474 ft(ij, i) = ft(ij, i) + g*dpinv*(amp1(ij)*(t(ij,i+1)-t(ij, &
1475 i)+(gz(ij,i+1)-gz(ij,i))*cpinv)-ad(ij)*(t(ij,i)-t(ij, &
1476 ✗ i-1)+(gz(ij,i)-gz(ij,i-1))*cpinv)) - sigd*lvcp(ij, i)*evap(ij, i)
1477 ft(ij, i) = ft(ij, i) + g*dpinv*ment(ij, i, i)*(hp(ij,i)-h(ij,i)+t(ij &
1478 ✗ ,i)*(cpv-cpd)*(q(ij,i)-qent(ij,i,i)))*cpinv
1479 ft(ij, i) = ft(ij, i) + sigd*wt(ij, i+1)*(cl-cpd)*water(ij, i+1)*(t( &
1480 ✗ ij,i+1)-t(ij,i))*dpinv*cpinv
1481 fq(ij, i) = fq(ij, i) + g*dpinv*(amp1(ij)*(q(ij,i+1)-q(ij, &
1482 ✗ i))-ad(ij)*(q(ij,i)-q(ij,i-1)))
1483 fu(ij, i) = fu(ij, i) + g*dpinv*(amp1(ij)*(u(ij,i+1)-u(ij, &
1484 ✗ i))-ad(ij)*(u(ij,i)-u(ij,i-1)))
1485 fv(ij, i) = fv(ij, i) + g*dpinv*(amp1(ij)*(v(ij,i+1)-v(ij, &
1486 ✗ i))-ad(ij)*(v(ij,i)-v(ij,i-1)))
1487 END IF
1488 END DO
1489 ✗ DO k = 1, i - 1
1490 ✗ DO ij = 1, ncum
1491 ✗ IF (i<=inb(ij)) THEN
1492 ✗ awat = elij(ij, k, i) - (1.-ep(ij,i))*clw(ij, i)
1493 ✗ awat = max(awat, 0.0)
1494 fq(ij, i) = fq(ij, i) + g*dpinv*ment(ij, k, i)*(qent(ij,k,i)-awat-q &
1495 ✗ (ij,i))
1496 fu(ij, i) = fu(ij, i) + g*dpinv*ment(ij, k, i)*(uent(ij,k,i)-u(ij,i &
1497 ✗ ))
1498 fv(ij, i) = fv(ij, i) + g*dpinv*ment(ij, k, i)*(vent(ij,k,i)-v(ij,i &
1499 ✗ ))
1500 ! (saturated updrafts resulting from mixing) ! cld
1501 ✗ qcond(ij, i) = qcond(ij, i) + (elij(ij,k,i)-awat) ! cld
1502 ✗ nqcond(ij, i) = nqcond(ij, i) + 1. ! cld
1503 END IF
1504 END DO
1505 END DO
1506 ✗ DO k = i, nl + 1
1507 ✗ DO ij = 1, ncum
1508 ✗ IF ((i<=inb(ij)) .AND. (k<=inb(ij))) THEN
1509 fq(ij, i) = fq(ij, i) + g*dpinv*ment(ij, k, i)*(qent(ij,k,i)-q(ij,i &
1510 ✗ ))
1511 fu(ij, i) = fu(ij, i) + g*dpinv*ment(ij, k, i)*(uent(ij,k,i)-u(ij,i &
1512 ✗ ))
1513 fv(ij, i) = fv(ij, i) + g*dpinv*ment(ij, k, i)*(vent(ij,k,i)-v(ij,i &
1514 ✗ ))
1515 END IF
1516 END DO
1517 END DO
1518 ✗ DO ij = 1, ncum
1519 ✗ IF (i<=inb(ij)) THEN
1520 fq(ij, i) = fq(ij, i) + sigd*evap(ij, i) + g*(mp(ij,i+1)*(qp(ij, &
1521 ✗ i+1)-q(ij,i))-mp(ij,i)*(qp(ij,i)-q(ij,i-1)))*dpinv
1522 fu(ij, i) = fu(ij, i) + g*(mp(ij,i+1)*(up(ij,i+1)-u(ij, &
1523 ✗ i))-mp(ij,i)*(up(ij,i)-u(ij,i-1)))*dpinv
1524 fv(ij, i) = fv(ij, i) + g*(mp(ij,i+1)*(vp(ij,i+1)-v(ij, &
1525 ✗ i))-mp(ij,i)*(vp(ij,i)-v(ij,i-1)))*dpinv
1526 ! (saturated downdrafts resulting from mixing) ! cld
1527 ✗ DO k = i + 1, inb(ij) ! cld
1528 ✗ qcond(ij, i) = qcond(ij, i) + elij(ij, k, i) ! cld
1529 ✗ nqcond(ij, i) = nqcond(ij, i) + 1. ! cld
1530 END DO ! cld
1531 ! (particular case: no detraining level is found) ! cld
1532 ✗ IF (nent(ij,i)==0) THEN ! cld
1533 ✗ qcond(ij, i) = qcond(ij, i) + (1.-ep(ij,i))*clw(ij, i) ! cld
1534 ✗ nqcond(ij, i) = nqcond(ij, i) + 1. ! cld
1535 END IF ! cld
1536 ✗ IF (nqcond(ij,i)/=0.) THEN ! cld
1537 ✗ qcond(ij, i) = qcond(ij, i)/nqcond(ij, i) ! cld
1538 END IF ! cld
1539 END IF
1540 END DO
1541 ✗ 1500 END DO
1542
1543 ! *** Adjust tendencies at top of convection layer to reflect ***
1544 ! *** actual position of the level zero cape ***
1545
1546 ✗ DO ij = 1, ncum
1547 ✗ fqold = fq(ij, inb(ij))
1548 ✗ fq(ij, inb(ij)) = fq(ij, inb(ij))*(1.-frac(ij))
1549 fq(ij, inb(ij)-1) = fq(ij, inb(ij)-1) + frac(ij)*fqold*((ph(ij, &
1550 inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij, &
1551 ✗ inb(ij))))*lv(ij, inb(ij))/lv(ij, inb(ij)-1)
1552 ✗ ftold = ft(ij, inb(ij))
1553 ✗ ft(ij, inb(ij)) = ft(ij, inb(ij))*(1.-frac(ij))
1554 ft(ij, inb(ij)-1) = ft(ij, inb(ij)-1) + frac(ij)*ftold*((ph(ij, &
1555 inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij, &
1556 ✗ inb(ij))))*cpn(ij, inb(ij))/cpn(ij, inb(ij)-1)
1557 ✗ fuold = fu(ij, inb(ij))
1558 ✗ fu(ij, inb(ij)) = fu(ij, inb(ij))*(1.-frac(ij))
1559 fu(ij, inb(ij)-1) = fu(ij, inb(ij)-1) + frac(ij)*fuold*((ph(ij, &
1560 ✗ inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij,inb(ij))))
1561 ✗ fvold = fv(ij, inb(ij))
1562 ✗ fv(ij, inb(ij)) = fv(ij, inb(ij))*(1.-frac(ij))
1563 fv(ij, inb(ij)-1) = fv(ij, inb(ij)-1) + frac(ij)*fvold*((ph(ij, &
1564 ✗ inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij,inb(ij))))
1565 END DO
1566
1567 ! *** Very slightly adjust tendencies to force exact ***
1568 ! *** enthalpy, momentum and tracer conservation ***
1569
1570 ✗ DO ij = 1, ncum
1571 ✗ ents(ij) = 0.0
1572 ✗ uav(ij) = 0.0
1573 ✗ vav(ij) = 0.0
1574 ✗ DO i = 1, inb(ij)
1575 ents(ij) = ents(ij) + (cpn(ij,i)*ft(ij,i)+lv(ij,i)*fq(ij,i))*(ph(ij,i)- &
1576 ✗ ph(ij,i+1))
1577 ✗ uav(ij) = uav(ij) + fu(ij, i)*(ph(ij,i)-ph(ij,i+1))
1578 ✗ vav(ij) = vav(ij) + fv(ij, i)*(ph(ij,i)-ph(ij,i+1))
1579 END DO
1580 END DO
1581 ✗ DO ij = 1, ncum
1582 ✗ ents(ij) = ents(ij)/(ph(ij,1)-ph(ij,inb(ij)+1))
1583 ✗ uav(ij) = uav(ij)/(ph(ij,1)-ph(ij,inb(ij)+1))
1584 ✗ vav(ij) = vav(ij)/(ph(ij,1)-ph(ij,inb(ij)+1))
1585 END DO
1586 ✗ DO ij = 1, ncum
1587 ✗ DO i = 1, inb(ij)
1588 ✗ ft(ij, i) = ft(ij, i) - ents(ij)/cpn(ij, i)
1589 ✗ fu(ij, i) = (1.-cu)*(fu(ij,i)-uav(ij))
1590 ✗ fv(ij, i) = (1.-cu)*(fv(ij,i)-vav(ij))
1591 END DO
1592 END DO
1593
1594 ✗ DO k = 1, nl + 1
1595 ✗ DO i = 1, ncum
1596 ✗ IF ((q(i,k)+delt*fq(i,k))<0.0) iflag(i) = 10
1597 END DO
1598 END DO
1599
1600
1601 ✗ DO i = 1, ncum
1602 ✗ IF (iflag(i)>2) THEN
1603 ✗ precip(i) = 0.0
1604 ✗ cbmf(i) = 0.0
1605 END IF
1606 END DO
1607 ✗ DO k = 1, nl
1608 ✗ DO i = 1, ncum
1609 ✗ IF (iflag(i)>2) THEN
1610 ✗ ft(i, k) = 0.0
1611 ✗ fq(i, k) = 0.0
1612 ✗ fu(i, k) = 0.0
1613 ✗ fv(i, k) = 0.0
1614 ✗ qcondc(i, k) = 0.0 ! cld
1615 END IF
1616 END DO
1617 END DO
1618
1619 ✗ DO k = 1, nl + 1
1620 ✗ DO i = 1, ncum
1621 ✗ ma(i, k) = 0.
1622 END DO
1623 END DO
1624 ✗ DO k = nl, 1, -1
1625 ✗ DO i = 1, ncum
1626 ✗ ma(i, k) = ma(i, k+1) + m(i, k)
1627 END DO
1628 END DO
1629
1630
1631 ! *** diagnose the in-cloud mixing ratio *** ! cld
1632 ! *** of condensed water *** ! cld
1633 ! ! cld
1634 ✗ DO ij = 1, ncum ! cld
1635 ✗ DO i = 1, nd ! cld
1636 ✗ mac(ij, i) = 0.0 ! cld
1637 ✗ wa(ij, i) = 0.0 ! cld
1638 ✗ siga(ij, i) = 0.0 ! cld
1639 END DO ! cld
1640 ✗ DO i = nk(ij), inb(ij) ! cld
1641 ✗ DO k = i + 1, inb(ij) + 1 ! cld
1642 ✗ mac(ij, i) = mac(ij, i) + m(ij, k) ! cld
1643 END DO ! cld
1644 END DO ! cld
1645 ✗ DO i = icb(ij), inb(ij) - 1 ! cld
1646 ✗ ax(ij, i) = 0. ! cld
1647 ✗ DO j = icb(ij), i ! cld
1648 ax(ij, i) = ax(ij, i) + rrd*(tvp(ij,j)-tv(ij,j)) & ! cld
1649 ✗ *(ph(ij,j)-ph(ij,j+1))/p(ij, j) ! cld
1650 END DO ! cld
1651 ✗ IF (ax(ij,i)>0.0) THEN ! cld
1652 ✗ wa(ij, i) = sqrt(2.*ax(ij,i)) ! cld
1653 END IF ! cld
1654 END DO ! cld
1655 ✗ DO i = 1, nl ! cld
1656 ✗ IF (wa(ij,i)>0.0) & ! cld
1657 siga(ij, i) = mac(ij, i)/wa(ij, i) & ! cld
1658 ✗ *rrd*tvp(ij, i)/p(ij, i)/100./delta ! cld
1659 ✗ siga(ij, i) = min(siga(ij,i), 1.0) ! cld
1660 qcondc(ij, i) = siga(ij, i)*clw(ij, i)*(1.-ep(ij,i)) & ! cld
1661 ✗ +(1.-siga(ij,i))*qcond(ij, i) ! cld
1662 END DO ! cld
1663 END DO ! cld
1664
1665 ✗ RETURN
1666 END SUBROUTINE cv_yield
1667
1668 ✗ SUBROUTINE cv_uncompress(nloc, len, ncum, nd, idcum, iflag, precip, cbmf, ft, &
1669 ✗ fq, fu, fv, ma, qcondc, iflag1, precip1, cbmf1, ft1, fq1, fu1, fv1, ma1, &
1670 qcondc1)
1671 IMPLICIT NONE
1672
1673 include "cvparam.h"
1674
1675 ! inputs:
1676 INTEGER len, ncum, nd, nloc
1677 INTEGER idcum(nloc)
1678 INTEGER iflag(nloc)
1679 REAL precip(nloc), cbmf(nloc)
1680 REAL ft(nloc, nd), fq(nloc, nd), fu(nloc, nd), fv(nloc, nd)
1681 REAL ma(nloc, nd)
1682 REAL qcondc(nloc, nd) !cld
1683
1684 ! outputs:
1685 INTEGER iflag1(len)
1686 REAL precip1(len), cbmf1(len)
1687 REAL ft1(len, nd), fq1(len, nd), fu1(len, nd), fv1(len, nd)
1688 REAL ma1(len, nd)
1689 REAL qcondc1(len, nd) !cld
1690
1691 ! local variables:
1692 INTEGER i, k
1693
1694 ✗ DO i = 1, ncum
1695 ✗ precip1(idcum(i)) = precip(i)
1696 ✗ cbmf1(idcum(i)) = cbmf(i)
1697 ✗ iflag1(idcum(i)) = iflag(i)
1698 END DO
1699
1700 ✗ DO k = 1, nl
1701 ✗ DO i = 1, ncum
1702 ✗ ft1(idcum(i), k) = ft(i, k)
1703 ✗ fq1(idcum(i), k) = fq(i, k)
1704 ✗ fu1(idcum(i), k) = fu(i, k)
1705 ✗ fv1(idcum(i), k) = fv(i, k)
1706 ✗ ma1(idcum(i), k) = ma(i, k)
1707 ✗ qcondc1(idcum(i), k) = qcondc(i, k)
1708 END DO
1709 END DO
1710
1711 ✗ RETURN
1712 END SUBROUTINE cv_uncompress
1713
1714