GCC Code Coverage Report


Directory: ./
File: phys/convect2.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 572 0.0%
Branches: 0 438 0.0%

Line Branch Exec Source
1
2 ! $Id: convect2.F90 2346 2015-08-21 15:13:46Z emillour $
3
4 ✗ SUBROUTINE convect2(ncum, idcum, len, nd, ndp1, nl, minorig, nk1, icb1, t1, &
5 q1, qs1, u1, v1, gz1, tv1, tp1, tvp1, clw1, h1, lv1, cpn1, p1, ph1, ft1, &
6 ✗ fq1, fu1, fv1, tnk1, qnk1, gznk1, plcl1, precip1, cbmf1, iflag1, delt, &
7 cpd, cpv, cl, rv, rd, lv0, g, sigs, sigd, elcrit, tlcrit, omtsnow, dtmax, &
8 damp, alpha, entp, coeffs, coeffr, omtrain, cu, ma)
9 ! .............................START PROLOGUE............................
10
11 ! SCCS IDENTIFICATION: @(#)convect2.f 1.2 05/18/00
12 ! 22:06:22 /h/cm/library/nogaps4/src/sub/fcst/convect2.f_v
13
14 ! CONFIGURATION IDENTIFICATION: None
15
16 ! MODULE NAME: convect2
17
18 ! DESCRIPTION:
19
20 ! convect1 The Emanuel Cumulus Convection Scheme - compute tendencies
21
22 ! CONTRACT NUMBER AND TITLE: None
23
24 ! REFERENCES: Programmers K. Emanuel (MIT), Timothy F. Hogan, M. Peng
25 ! (NRL)
26
27 ! CLASSIFICATION: Unclassified
28
29 ! RESTRICTIONS: None
30
31 ! COMPILER DEPENDENCIES: FORTRAN 77, FORTRAN 90
32
33 ! COMPILE OPTIONS: Fortran 77: -Zu -Wf"-ei -o aggress"
34 ! Fortran 90: -O vector3,scalar3,task1,aggress,overindex -ei -r 2
35
36 ! LIBRARIES OF RESIDENCE: /a/ops/lib/libfcst159.a
37
38 ! USAGE: call convect2(ncum,idcum,len,nd,nl,minorig,
39 ! & nk1,icb1,
40 ! & t1,q1,qs1,u1,v1,gz1,tv1,tp1,tvp1,clw1,h1,
41 ! & lv1,cpn1,p1,ph1,ft1,fq1,fu1,fv1,
42 ! & tnk1,qnk1,gznk1,plcl1,
43 ! & precip1,cbmf1,iflag1,
44 ! & delt,cpd,cpv,cl,rv,rd,lv0,g,
45 ! & sigs,sigd,elcrit,tlcrit,omtsnow,dtmax,damp,
46 ! & alpha,entp,coeffs,coeffr,omtrain,cu)
47
48 ! PARAMETERS:
49 ! Name Type Usage Description
50 ! ---------- ---------- ------- ----------------------------
51
52 ! ncum Integer Input number of cumulus points
53 ! idcum Integer Input index of cumulus point
54 ! len Integer Input first dimension
55 ! nd Integer Input total vertical dimension
56 ! ndp1 Integer Input nd + 1
57 ! nl Integer Input vertical dimension for
58 ! convection
59 ! minorig Integer Input First level where convection is
60 ! allow to begin
61 ! nk1 Integer Input First level of convection
62 ! ncb1 Integer Input Level of free convection
63 ! t1 Real Input temperature
64 ! q1 Real Input specific hum
65 ! qs1 Real Input sat specific hum
66 ! u1 Real Input u-wind
67 ! v1 Real Input v-wind
68 ! gz1 Real Inout geop
69 ! tv1 Real Input virtual temp
70 ! tp1 Real Input
71 ! clw1 Real Inout cloud liquid water
72 ! h1 Real Inout
73 ! lv1 Real Inout
74 ! cpn1 Real Inout
75 ! p1 Real Input full level pressure
76 ! ph1 Real Input half level pressure
77 ! ft1 Real Output temp tend
78 ! fq1 Real Output spec hum tend
79 ! fu1 Real Output u-wind tend
80 ! fv1 Real Output v-wind tend
81 ! precip1 Real Output prec
82 ! cbmf1 Real In/Out cumulus mass flux
83 ! iflag1 Integer Output iflag on latitude strip
84 ! delt Real Input time step
85 ! cpd Integer Input See description below
86 ! cpv Integer Input See description below
87 ! cl Integer Input See description below
88 ! rv Integer Input See description below
89 ! rd Integer Input See description below
90 ! lv0 Integer Input See description below
91 ! g Integer Input See description below
92 ! sigs Integer Input See description below
93 ! sigd Integer Input See description below
94 ! elcrit Integer Input See description below
95 ! tlcrit Integer Input See description below
96 ! omtsnow Integer Input See description below
97 ! dtmax Integer Input See description below
98 ! damp Integer Input See description below
99 ! alpha Integer Input See description below
100 ! ent Integer Input See description below
101 ! coeffs Integer Input See description below
102 ! coeffr Integer Input See description below
103 ! omtrain Integer Input See description below
104 ! cu Integer Input See description below
105
106 ! COMMON BLOCKS:
107 ! Block Name Type Usage Notes
108 ! -------- -------- ---- ------ ------------------------
109
110 ! FILES: None
111
112 ! DATA BASES: None
113
114 ! NON-FILE INPUT/OUTPUT: None
115
116 ! ERROR CONDITIONS: None
117
118 ! ADDITIONAL COMMENTS: None
119
120 ! .................MAINTENANCE SECTION................................
121
122 ! MODULES CALLED:
123 ! Name Description
124 ! zilch Zero out an array
125 ! ------- ----------------------
126 ! LOCAL VARIABLES AND
127 ! STRUCTURES:
128 ! Name Type Description
129 ! ------- ------ -----------
130 ! See Comments Below
131
132 ! i Integer loop index
133 ! k Integer loop index
134
135 ! METHOD:
136
137 ! See Emanuel, K. and M. Zivkovic-Rothman, 2000: Development and evaluation
138 ! of a
139 ! convective scheme for use in climate models.
140
141 ! FILES: None
142
143 ! INCLUDE FILES: None
144
145 ! MAKEFILE: /a/ops/met/nogaps/src/sub/fcst/fcst159lib.mak
146
147 ! ..............................END PROLOGUE.............................
148
149
150 USE dimphy
151 IMPLICIT NONE
152
153 INTEGER kmax2, imax2, kmin2, imin2
154 REAL ftmax2, ftmin2
155 INTEGER kmax, imax, kmin, imin
156 REAL ftmax, ftmin
157
158 INTEGER ncum
159 INTEGER len
160 INTEGER idcum(len)
161 INTEGER nd
162 INTEGER ndp1
163 INTEGER nl
164 INTEGER minorig
165 INTEGER nk1(len)
166 INTEGER icb1(len)
167 REAL t1(len, nd)
168 REAL q1(len, nd)
169 REAL qs1(len, nd)
170 REAL u1(len, nd)
171 REAL v1(len, nd)
172 REAL gz1(len, nd)
173 REAL tv1(len, nd)
174 REAL tp1(len, nd)
175 REAL tvp1(len, nd)
176 REAL clw1(len, nd)
177 REAL h1(len, nd)
178 REAL lv1(len, nd)
179 REAL cpn1(len, nd)
180 REAL p1(len, nd)
181 REAL ph1(len, ndp1)
182 REAL ft1(len, nd)
183 REAL fq1(len, nd)
184 REAL fu1(len, nd)
185 REAL fv1(len, nd)
186 REAL tnk1(len)
187 REAL qnk1(len)
188 REAL gznk1(len)
189 REAL precip1(len)
190 REAL cbmf1(len)
191 REAL plcl1(len)
192 INTEGER iflag1(len)
193 REAL delt
194 REAL cpd
195 REAL cpv
196 REAL cl
197 REAL rv
198 REAL rd
199 REAL lv0
200 REAL g
201 REAL sigs ! SIGS IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE
202 REAL sigd ! SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT
203 REAL elcrit ! ELCRIT IS THE AUTOCONVERSION THERSHOLD WATER CONTENT (gm/gm)
204 REAL tlcrit ! TLCRIT IS CRITICAL TEMPERATURE BELOW WHICH THE AUTO-
205 ! CONVERSION THRESHOLD IS ASSUMED TO BE ZERO
206 REAL omtsnow ! OMTSNOW IS THE ASSUMED FALL SPEED (P/s) OF SNOW
207 REAL dtmax ! DTMAX IS THE MAXIMUM NEGATIVE TEMPERATURE PERTURBATION
208 ! A LIFTED PARCEL IS ALLOWED TO HAVE BELOW ITS LFC.
209 REAL damp
210 REAL alpha
211 REAL entp ! ENTP IS THE COEFFICIENT OF MIXING IN THE ENTRAINMENT FORMULATION
212 REAL coeffs ! COEFFS IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION OF
213 ! SNOW
214 REAL coeffr ! COEFFR IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION OF
215 ! RAIN
216 REAL omtrain ! OMTRAIN IS THE ASSUMED FALL SPEED (P/s) OF RAIN
217 REAL cu ! CU IS THE COEFFICIENT GOVERNING CONVECTIVE MOMENTUM TRANSPORT
218
219 REAL ma(len, nd)
220
221
222 ! *** ELCRIT IS THE AUTOCONVERSION THERSHOLD WATER CONTENT (gm/gm) ***
223 ! *** TLCRIT IS CRITICAL TEMPERATURE BELOW WHICH THE AUTO- ***
224 ! *** CONVERSION THRESHOLD IS ASSUMED TO BE ZERO ***
225 ! *** (THE AUTOCONVERSION THRESHOLD VARIES LINEARLY ***
226 ! *** BETWEEN 0 C AND TLCRIT) ***
227 ! *** ENTP IS THE COEFFICIENT OF MIXING IN THE ENTRAINMENT ***
228 ! *** FORMULATION ***
229 ! *** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT ***
230 ! *** SIGS IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***
231 ! *** OF CLOUD ***
232 ! *** OMTRAIN IS THE ASSUMED FALL SPEED (P/s) OF RAIN ***
233 ! *** OMTSNOW IS THE ASSUMED FALL SPEED (P/s) OF SNOW ***
234 ! *** COEFFR IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION ***
235 ! *** OF RAIN ***
236 ! *** COEFFS IS A COEFFICIENT GOVERNING THE RATE OF EVAPORATION ***
237 ! *** OF SNOW ***
238 ! *** CU IS THE COEFFICIENT GOVERNING CONVECTIVE MOMENTUM ***
239 ! *** TRANSPORT ***
240 ! *** DTMAX IS THE MAXIMUM NEGATIVE TEMPERATURE PERTURBATION ***
241 ! *** A LIFTED PARCEL IS ALLOWED TO HAVE BELOW ITS LFC ***
242 ! *** ALPHA AND DAMP ARE PARAMETERS THAT CONTROL THE RATE OF ***
243 ! *** APPROACH TO QUASI-EQUILIBRIUM ***
244 ! *** (THEIR STANDARD VALUES ARE 0.20 AND 0.1, RESPECTIVELY) ***
245 ! *** (DAMP MUST BE LESS THAN 1) ***
246
247 ! Local arrays.
248
249 ✗ REAL work(ncum)
250 ✗ REAL t(ncum, klev)
251 ✗ REAL q(ncum, klev)
252 ✗ REAL qs(ncum, klev)
253 ✗ REAL u(ncum, klev)
254 ✗ REAL v(ncum, klev)
255 ✗ REAL gz(ncum, klev)
256 ✗ REAL h(ncum, klev)
257 ✗ REAL lv(ncum, klev)
258 ✗ REAL cpn(ncum, klev)
259 ✗ REAL p(ncum, klev)
260 ✗ REAL ph(ncum, klev)
261 ✗ REAL ft(ncum, klev)
262 ✗ REAL fq(ncum, klev)
263 ✗ REAL fu(ncum, klev)
264 ✗ REAL fv(ncum, klev)
265 ✗ REAL precip(ncum)
266 ✗ REAL cbmf(ncum)
267 ✗ REAL plcl(ncum)
268 ✗ REAL tnk(ncum)
269 ✗ REAL qnk(ncum)
270 ✗ REAL gznk(ncum)
271 ✗ REAL tv(ncum, klev)
272 ✗ REAL tp(ncum, klev)
273 ✗ REAL tvp(ncum, klev)
274 ✗ REAL clw(ncum, klev)
275 ! real det(ncum,klev)
276 ✗ REAL dph(ncum, klev)
277 ! real wd(ncum)
278 ! real tprime(ncum)
279 ! real qprime(ncum)
280 ✗ REAL ah0(ncum)
281 ✗ REAL ep(ncum, klev)
282 ✗ REAL sigp(ncum, klev)
283 ✗ INTEGER nent(ncum, klev)
284 ✗ REAL water(ncum, klev)
285 ✗ REAL evap(ncum, klev)
286 ✗ REAL mp(ncum, klev)
287 ✗ REAL m(ncum, klev)
288 REAL qti
289 ✗ REAL wt(ncum, klev)
290 ✗ REAL hp(ncum, klev)
291 ✗ REAL lvcp(ncum, klev)
292 ✗ REAL elij(ncum, klev, klev)
293 ✗ REAL ment(ncum, klev, klev)
294 ✗ REAL sij(ncum, klev, klev)
295 ✗ REAL qent(ncum, klev, klev)
296 ✗ REAL uent(ncum, klev, klev)
297 ✗ REAL vent(ncum, klev, klev)
298 ✗ REAL qp(ncum, klev)
299 ✗ REAL up(ncum, klev)
300 ✗ REAL vp(ncum, klev)
301 ✗ REAL cape(ncum)
302 ✗ REAL capem(ncum)
303 ✗ REAL frac(ncum)
304 ✗ REAL dtpbl(ncum)
305 ✗ REAL tvpplcl(ncum)
306 ✗ REAL tvaplcl(ncum)
307 ✗ REAL dtmin(ncum)
308 REAL w3d(ncum, klev)
309 ✗ REAL am(ncum)
310 ✗ REAL ents(ncum)
311 ✗ REAL uav(ncum)
312 ✗ REAL vav(ncum)
313
314 ✗ INTEGER iflag(ncum)
315 ✗ INTEGER nk(ncum)
316 ✗ INTEGER icb(ncum)
317 ✗ INTEGER inb(ncum)
318 ✗ INTEGER inb1(ncum)
319 ✗ INTEGER jtt(ncum)
320
321 INTEGER nn, i, k, n, icbmax, nlp, j
322 INTEGER ij
323 INTEGER nn2, nn3
324 REAL clmcpv
325 REAL clmcpd
326 REAL cpdmcp
327 REAL cpvmcpd
328 REAL eps
329 REAL epsi
330 REAL epsim1
331 REAL tg, qg, s, alv, tc, ahg, denom, es, rg, ginv, rowl
332 REAL delti
333 REAL tca, elacrit
334 REAL by, defrac
335 ! real byp
336 ✗ REAL byp(ncum)
337 ✗ LOGICAL lcape(ncum)
338 REAL dbo
339 REAL bf2, anum, dei, altem, cwat, stemp
340 REAL alt, qp1, smid, sjmax, sjmin
341 REAL delp, delm
342 REAL awat, coeff, afac, revap, dhdp, fac, qstm, rat
343 REAL qsm, sigt, b6, c6
344 REAL dpinv, cpinv
345 REAL fqold, ftold, fuold, fvold
346 ✗ REAL wdtrain(ncum), xxx
347 ✗ REAL bsum(ncum, klev)
348 ✗ REAL asij(ncum)
349 ✗ REAL smin(ncum)
350 ✗ REAL scrit(ncum)
351 ! real amp1,ad
352 ✗ REAL amp1(ncum), ad(ncum)
353 ✗ LOGICAL lwork(ncum)
354 INTEGER num1, num2
355
356 ! print*,'cpd en entree de convect2 ',cpd
357 ✗ nlp = nl + 1
358
359 rowl = 1000.0
360 ✗ ginv = 1.0/g
361 ✗ delti = 1.0/delt
362
363 ! Define some thermodynamic variables.
364
365 ✗ clmcpv = cl - cpv
366 ✗ clmcpd = cl - cpd
367 cpdmcp = cpd - cpv
368 cpvmcpd = cpv - cpd
369 ✗ eps = rd/rv
370 ✗ epsi = 1.0/eps
371 epsim1 = epsi - 1.0
372
373 ! Compress the fields.
374
375 ✗ DO k = 1, nl + 1
376 nn = 0
377 ✗ DO i = 1, len
378 ✗ IF (iflag1(i)==0) THEN
379 ✗ nn = nn + 1
380 ✗ t(nn, k) = t1(i, k)
381 ✗ q(nn, k) = q1(i, k)
382 ✗ qs(nn, k) = qs1(i, k)
383 ✗ u(nn, k) = u1(i, k)
384 ✗ v(nn, k) = v1(i, k)
385 ✗ gz(nn, k) = gz1(i, k)
386 ✗ h(nn, k) = h1(i, k)
387 ✗ lv(nn, k) = lv1(i, k)
388 ✗ cpn(nn, k) = cpn1(i, k)
389 ✗ p(nn, k) = p1(i, k)
390 ✗ ph(nn, k) = ph1(i, k)
391 ✗ tv(nn, k) = tv1(i, k)
392 ✗ tp(nn, k) = tp1(i, k)
393 ✗ tvp(nn, k) = tvp1(i, k)
394 ✗ clw(nn, k) = clw1(i, k)
395 END IF
396 END DO
397 ! print*,'100 ncum,nn',ncum,nn
398 END DO
399 nn = 0
400 ✗ DO i = 1, len
401 ✗ IF (iflag1(i)==0) THEN
402 ✗ nn = nn + 1
403 ✗ cbmf(nn) = cbmf1(i)
404 ✗ plcl(nn) = plcl1(i)
405 ✗ tnk(nn) = tnk1(i)
406 ✗ qnk(nn) = qnk1(i)
407 ✗ gznk(nn) = gznk1(i)
408 ✗ nk(nn) = nk1(i)
409 ✗ icb(nn) = icb1(i)
410 ✗ iflag(nn) = iflag1(i)
411 END IF
412 END DO
413 ! print*,'150 ncum,nn',ncum,nn
414
415 ! Initialize the tendencies, det, wd, tprime, qprime.
416
417 ✗ DO k = 1, nl
418 ✗ DO i = 1, ncum
419 ! det(i,k)=0.0
420 ✗ ft(i, k) = 0.0
421 ✗ fu(i, k) = 0.0
422 ✗ fv(i, k) = 0.0
423 ✗ fq(i, k) = 0.0
424 ✗ dph(i, k) = ph(i, k) - ph(i, k+1)
425 ✗ ep(i, k) = 0.0
426 ✗ sigp(i, k) = sigs
427 END DO
428 END DO
429 ✗ DO i = 1, ncum
430 ! wd(i)=0.0
431 ! tprime(i)=0.0
432 ! qprime(i)=0.0
433 ✗ precip(i) = 0.0
434 ✗ ft(i, nl+1) = 0.0
435 ✗ fu(i, nl+1) = 0.0
436 ✗ fv(i, nl+1) = 0.0
437 ✗ fq(i, nl+1) = 0.0
438 END DO
439
440 ! Compute icbmax.
441
442 icbmax = 2
443 ✗ DO i = 1, ncum
444 ✗ icbmax = max(icbmax, icb(i))
445 END DO
446
447
448 ! =====================================================================
449 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
450 ! =====================================================================
451
452 ! --- The procedure is to solve the equation.
453 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.
454
455 ! *** Calculate certain parcel quantities, including static energy ***
456
457
458 ✗ DO i = 1, ncum
459 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)- &
460 ✗ 273.15)) + gznk(i)
461 END DO
462
463
464 ! *** Find lifted parcel quantities above cloud base ***
465
466
467 ✗ DO k = minorig + 1, nl
468 ✗ DO i = 1, ncum
469 ✗ IF (k>=(icb(i)+1)) THEN
470 ✗ tg = t(i, k)
471 ✗ qg = qs(i, k)
472 ✗ alv = lv0 - clmcpv*(t(i,k)-273.15)
473
474 ! First iteration.
475
476 ✗ s = cpd + alv*alv*qg/(rv*t(i,k)*t(i,k))
477 ✗ s = 1./s
478 ✗ ahg = cpd*tg + (cl-cpd)*qnk(i)*t(i, k) + alv*qg + gz(i, k)
479 ✗ tg = tg + s*(ah0(i)-ahg)
480 ✗ tg = max(tg, 35.0)
481 ✗ tc = tg - 273.15
482 ✗ denom = 243.5 + tc
483 ✗ IF (tc>=0.0) THEN
484 ✗ es = 6.112*exp(17.67*tc/denom)
485 ELSE
486 ✗ es = exp(23.33086-6111.72784/tg+0.15215*log(tg))
487 END IF
488 ✗ qg = eps*es/(p(i,k)-es*(1.-eps))
489
490 ! Second iteration.
491
492 ✗ s = cpd + alv*alv*qg/(rv*t(i,k)*t(i,k))
493 ✗ s = 1./s
494 ✗ ahg = cpd*tg + (cl-cpd)*qnk(i)*t(i, k) + alv*qg + gz(i, k)
495 ✗ tg = tg + s*(ah0(i)-ahg)
496 ✗ tg = max(tg, 35.0)
497 ✗ tc = tg - 273.15
498 ✗ denom = 243.5 + tc
499 ✗ IF (tc>=0.0) THEN
500 ✗ es = 6.112*exp(17.67*tc/denom)
501 ELSE
502 ✗ es = exp(23.33086-6111.72784/tg+0.15215*log(tg))
503 END IF
504 ✗ qg = eps*es/(p(i,k)-es*(1.-eps))
505
506 alv = lv0 - clmcpv*(t(i,k)-273.15)
507 ! print*,'cpd dans convect2 ',cpd
508 ! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd'
509 ! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd
510 ✗ tp(i, k) = (ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd
511 ! if (.not.cpd.gt.1000.) then
512 ! print*,'CPD=',cpd
513 ! stop
514 ! endif
515 ✗ clw(i, k) = qnk(i) - qg
516 ✗ clw(i, k) = max(0.0, clw(i,k))
517 ✗ rg = qg/(1.-qnk(i))
518 ✗ tvp(i, k) = tp(i, k)*(1.+rg*epsi)
519 END IF
520 END DO
521 END DO
522
523 ! =====================================================================
524 ! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF
525 ! --- PRECIPITATION FALLING OUTSIDE OF CLOUD
526 ! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I)
527 ! =====================================================================
528
529 ✗ DO k = minorig + 1, nl
530 ✗ DO i = 1, ncum
531 ✗ IF (k>=(nk(i)+1)) THEN
532 ✗ tca = tp(i, k) - 273.15
533 ✗ IF (tca>=0.0) THEN
534 ✗ elacrit = elcrit
535 ELSE
536 ✗ elacrit = elcrit*(1.0-tca/tlcrit)
537 END IF
538 ✗ elacrit = max(elacrit, 0.0)
539 ✗ ep(i, k) = 1.0 - elacrit/max(clw(i,k), 1.0E-8)
540 ✗ ep(i, k) = max(ep(i,k), 0.0)
541 ✗ ep(i, k) = min(ep(i,k), 1.0)
542 ✗ sigp(i, k) = sigs
543 END IF
544 END DO
545 END DO
546
547 ! =====================================================================
548 ! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL
549 ! --- VIRTUAL TEMPERATURE
550 ! =====================================================================
551
552 ✗ DO k = minorig + 1, nl
553 ✗ DO i = 1, ncum
554 ✗ IF (k>=(icb(i)+1)) THEN
555 ✗ tvp(i, k) = tvp(i, k)*(1.0-qnk(i)+ep(i,k)*clw(i,k))
556 ! print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)'
557 ! print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)
558 END IF
559 END DO
560 END DO
561 ✗ DO i = 1, ncum
562 ✗ tvp(i, nlp) = tvp(i, nl) - (gz(i,nlp)-gz(i,nl))/cpd
563 END DO
564
565
566 ! =====================================================================
567 ! --- NOW INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS
568 ! =====================================================================
569
570 ✗ DO i = 1, ncum*nlp
571 ✗ nent(i, 1) = 0
572 ✗ water(i, 1) = 0.0
573 ✗ evap(i, 1) = 0.0
574 ✗ mp(i, 1) = 0.0
575 ✗ m(i, 1) = 0.0
576 ✗ wt(i, 1) = omtsnow
577 ✗ hp(i, 1) = h(i, 1)
578 ! if(.not.cpn(i,1).gt.900.) then
579 ! print*,'i,lv(i,1),cpn(i,1)'
580 ! print*, i,lv(i,1),cpn(i,1)
581 ! k=(i-1)/ncum+1
582 ! print*,'i,k',mod(i,ncum),k,' cpn',cpn(mod(i,ncum),k)
583 ! stop
584 ! endif
585 ✗ lvcp(i, 1) = lv(i, 1)/cpn(i, 1)
586 END DO
587
588 ✗ DO i = 1, ncum*nlp*nlp
589 ✗ elij(i, 1, 1) = 0.0
590 ✗ ment(i, 1, 1) = 0.0
591 ✗ sij(i, 1, 1) = 0.0
592 END DO
593
594 ✗ DO k = 1, nlp
595 ✗ DO j = 1, nlp
596 ✗ DO i = 1, ncum
597 ✗ qent(i, k, j) = q(i, j)
598 ✗ uent(i, k, j) = u(i, j)
599 ✗ vent(i, k, j) = v(i, j)
600 END DO
601 END DO
602 END DO
603
604 ✗ DO i = 1, ncum
605 ✗ qp(i, 1) = q(i, 1)
606 ✗ up(i, 1) = u(i, 1)
607 ✗ vp(i, 1) = v(i, 1)
608 END DO
609 ✗ DO k = 2, nlp
610 ✗ DO i = 1, ncum
611 ✗ qp(i, k) = q(i, k-1)
612 ✗ up(i, k) = u(i, k-1)
613 ✗ vp(i, k) = v(i, k-1)
614 END DO
615 END DO
616
617 ! =====================================================================
618 ! --- FIND THE FIRST MODEL LEVEL (INB1) ABOVE THE PARCEL'S
619 ! --- HIGHEST LEVEL OF NEUTRAL BUOYANCY
620 ! --- AND THE HIGHEST LEVEL OF POSITIVE CAPE (INB)
621 ! =====================================================================
622
623 ✗ DO i = 1, ncum
624 ✗ cape(i) = 0.0
625 ✗ capem(i) = 0.0
626 ✗ inb(i) = icb(i) + 1
627 ✗ inb1(i) = inb(i)
628 END DO
629
630 ! Originial Code
631
632 ! do 530 k=minorig+1,nl-1
633 ! do 520 i=1,ncum
634 ! if(k.ge.(icb(i)+1))then
635 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
636 ! byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
637 ! cape(i)=cape(i)+by
638 ! if(by.ge.0.0)inb1(i)=k+1
639 ! if(cape(i).gt.0.0)then
640 ! inb(i)=k+1
641 ! capem(i)=cape(i)
642 ! endif
643 ! endif
644 ! 520 continue
645 ! 530 continue
646 ! do 540 i=1,ncum
647 ! byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl)
648 ! cape(i)=capem(i)+byp
649 ! defrac=capem(i)-cape(i)
650 ! defrac=max(defrac,0.001)
651 ! frac(i)=-cape(i)/defrac
652 ! frac(i)=min(frac(i),1.0)
653 ! frac(i)=max(frac(i),0.0)
654 ! 540 continue
655
656 ! K Emanuel fix
657
658 ! call zilch(byp,ncum)
659 ! do 530 k=minorig+1,nl-1
660 ! do 520 i=1,ncum
661 ! if(k.ge.(icb(i)+1))then
662 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)
663 ! cape(i)=cape(i)+by
664 ! if(by.ge.0.0)inb1(i)=k+1
665 ! if(cape(i).gt.0.0)then
666 ! inb(i)=k+1
667 ! capem(i)=cape(i)
668 ! byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)
669 ! endif
670 ! endif
671 ! 520 continue
672 ! 530 continue
673 ! do 540 i=1,ncum
674 ! inb(i)=max(inb(i),inb1(i))
675 ! cape(i)=capem(i)+byp(i)
676 ! defrac=capem(i)-cape(i)
677 ! defrac=max(defrac,0.001)
678 ! frac(i)=-cape(i)/defrac
679 ! frac(i)=min(frac(i),1.0)
680 ! frac(i)=max(frac(i),0.0)
681 ! 540 continue
682
683 ! J Teixeira fix
684
685 ✗ CALL zilch(byp, ncum)
686 ✗ DO i = 1, ncum
687 ✗ lcape(i) = .TRUE.
688 END DO
689 ✗ DO k = minorig + 1, nl - 1
690 ✗ DO i = 1, ncum
691 ✗ IF (cape(i)<0.0) lcape(i) = .FALSE.
692 ✗ IF ((k>=(icb(i)+1)) .AND. lcape(i)) THEN
693 ✗ by = (tvp(i,k)-tv(i,k))*dph(i, k)/p(i, k)
694 ✗ byp(i) = (tvp(i,k+1)-tv(i,k+1))*dph(i, k+1)/p(i, k+1)
695 ✗ cape(i) = cape(i) + by
696 ✗ IF (by>=0.0) inb1(i) = k + 1
697 ✗ IF (cape(i)>0.0) THEN
698 ✗ inb(i) = k + 1
699 ✗ capem(i) = cape(i)
700 END IF
701 END IF
702 END DO
703 END DO
704 ✗ DO i = 1, ncum
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 END DO
712
713 ! =====================================================================
714 ! --- CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL
715 ! =====================================================================
716
717 ✗ DO k = minorig + 1, nl
718 ✗ DO i = 1, ncum
719 ✗ IF ((k>=icb(i)) .AND. (k<=inb(i))) THEN
720 hp(i, k) = h(i, nk(i)) + (lv(i,k)+(cpd-cpv)*t(i,k))*ep(i, k)*clw(i, k &
721 ✗ )
722 END IF
723 END DO
724 END DO
725
726 ! =====================================================================
727 ! --- CALCULATE CLOUD BASE MASS FLUX AND RATES OF MIXING, M(I),
728 ! --- AT EACH MODEL LEVEL
729 ! =====================================================================
730
731 ! tvpplcl = parcel temperature lifted adiabatically from level
732 ! icb-1 to the LCL.
733 ! tvaplcl = virtual temperature at the LCL.
734
735 ✗ DO i = 1, ncum
736 ✗ dtpbl(i) = 0.0
737 tvpplcl(i) = tvp(i, icb(i)-1) - rd*tvp(i, icb(i)-1)*(p(i,icb(i)-1)-plcl(i &
738 ✗ ))/(cpn(i,icb(i)-1)*p(i,icb(i)-1))
739 tvaplcl(i) = tv(i, icb(i)) + (tvp(i,icb(i))-tvp(i,icb(i)+1))*(plcl(i)-p(i &
740 ✗ ,icb(i)))/(p(i,icb(i))-p(i,icb(i)+1))
741 END DO
742
743 ! -------------------------------------------------------------------
744 ! --- Interpolate difference between lifted parcel and
745 ! --- environmental temperatures to lifted condensation level
746 ! -------------------------------------------------------------------
747
748 ! dtpbl = average of tvp-tv in the PBL (k=nk to icb-1).
749
750 ✗ DO k = minorig, icbmax
751 ✗ DO i = 1, ncum
752 ✗ IF ((k>=nk(i)) .AND. (k<=(icb(i)-1))) THEN
753 ✗ dtpbl(i) = dtpbl(i) + (tvp(i,k)-tv(i,k))*dph(i, k)
754 END IF
755 END DO
756 END DO
757 ✗ DO i = 1, ncum
758 ✗ dtpbl(i) = dtpbl(i)/(ph(i,nk(i))-ph(i,icb(i)))
759 ✗ dtmin(i) = tvpplcl(i) - tvaplcl(i) + dtmax + dtpbl(i)
760 END DO
761
762 ! -------------------------------------------------------------------
763 ! --- Adjust cloud base mass flux
764 ! -------------------------------------------------------------------
765
766 ✗ DO i = 1, ncum
767 ✗ work(i) = cbmf(i)
768 ✗ cbmf(i) = max(0.0, (1.0-damp)*cbmf(i)+0.1*alpha*dtmin(i))
769 ✗ IF ((work(i)==0.0) .AND. (cbmf(i)==0.0)) THEN
770 ✗ iflag(i) = 3
771 END IF
772 END DO
773
774 ! -------------------------------------------------------------------
775 ! --- Calculate rates of mixing, m(i)
776 ! -------------------------------------------------------------------
777
778 ✗ CALL zilch(work, ncum)
779
780 ✗ DO j = minorig + 1, nl
781 ✗ DO i = 1, ncum
782 ✗ IF ((j>=(icb(i)+1)) .AND. (j<=inb(i))) THEN
783 ✗ k = min(j, inb1(i))
784 dbo = abs(tv(i,k+1)-tvp(i,k+1)-tv(i,k-1)+tvp(i,k-1)) + &
785 ✗ entp*0.04*(ph(i,k)-ph(i,k+1))
786 ✗ work(i) = work(i) + dbo
787 ✗ m(i, j) = cbmf(i)*dbo
788 END IF
789 END DO
790 END DO
791 ✗ DO k = minorig + 1, nl
792 ✗ DO i = 1, ncum
793 ✗ IF ((k>=(icb(i)+1)) .AND. (k<=inb(i))) THEN
794 ✗ m(i, k) = m(i, k)/work(i)
795 END IF
796 END DO
797 END DO
798
799
800 ! =====================================================================
801 ! --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING
802 ! --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING
803 ! --- FRACTION (sij)
804 ! =====================================================================
805
806
807 ✗ DO i = minorig + 1, nl
808 ✗ DO j = minorig + 1, nl
809 ✗ DO ij = 1, ncum
810 ✗ IF ((i>=(icb(ij)+1)) .AND. (j>=icb(ij)) .AND. (i<=inb(ij)) .AND. (j<= &
811 ✗ inb(ij))) THEN
812 ✗ qti = qnk(ij) - ep(ij, i)*clw(ij, i)
813 ✗ bf2 = 1. + lv(ij, j)*lv(ij, j)*qs(ij, j)/(rv*t(ij,j)*t(ij,j)*cpd)
814 ✗ anum = h(ij, j) - hp(ij, i) + (cpv-cpd)*t(ij, j)*(qti-q(ij,j))
815 ✗ denom = h(ij, i) - hp(ij, i) + (cpd-cpv)*(q(ij,i)-qti)*t(ij, j)
816 dei = denom
817 ✗ IF (abs(dei)<0.01) dei = 0.01
818 ✗ sij(ij, i, j) = anum/dei
819 ✗ sij(ij, i, i) = 1.0
820 ✗ altem = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti - qs(ij, j)
821 ✗ altem = altem/bf2
822 ✗ cwat = clw(ij, j)*(1.-ep(ij,j))
823 stemp = sij(ij, i, j)
824 ✗ IF ((stemp<0.0 .OR. stemp>1.0 .OR. altem>cwat) .AND. j>i) THEN
825 ✗ anum = anum - lv(ij, j)*(qti-qs(ij,j)-cwat*bf2)
826 ✗ denom = denom + lv(ij, j)*(q(ij,i)-qti)
827 ✗ IF (abs(denom)<0.01) denom = 0.01
828 ✗ sij(ij, i, j) = anum/denom
829 ✗ altem = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti - qs(ij, j)
830 ✗ altem = altem - (bf2-1.)*cwat
831 END IF
832 ✗ IF (sij(ij,i,j)>0.0 .AND. sij(ij,i,j)<0.9) THEN
833 ✗ qent(ij, i, j) = sij(ij, i, j)*q(ij, i) + (1.-sij(ij,i,j))*qti
834 uent(ij, i, j) = sij(ij, i, j)*u(ij, i) + &
835 ✗ (1.-sij(ij,i,j))*u(ij, nk(ij))
836 vent(ij, i, j) = sij(ij, i, j)*v(ij, i) + &
837 ✗ (1.-sij(ij,i,j))*v(ij, nk(ij))
838 elij(ij, i, j) = altem
839 ✗ elij(ij, i, j) = max(0.0, elij(ij,i,j))
840 ✗ ment(ij, i, j) = m(ij, i)/(1.-sij(ij,i,j))
841 ✗ nent(ij, i) = nent(ij, i) + 1
842 END IF
843 ✗ sij(ij, i, j) = max(0.0, sij(ij,i,j))
844 ✗ sij(ij, i, j) = min(1.0, sij(ij,i,j))
845 END IF
846 END DO
847 END DO
848
849 ! *** If no air can entrain at level i assume that updraft detrains
850 ! ***
851 ! *** at that level and calculate detrained air flux and properties
852 ! ***
853
854 ✗ DO ij = 1, ncum
855 ✗ IF ((i>=(icb(ij)+1)) .AND. (i<=inb(ij)) .AND. (nent(ij,i)==0)) THEN
856 ✗ ment(ij, i, i) = m(ij, i)
857 ✗ qent(ij, i, i) = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i)
858 ✗ uent(ij, i, i) = u(ij, nk(ij))
859 ✗ vent(ij, i, i) = v(ij, nk(ij))
860 ✗ elij(ij, i, i) = clw(ij, i)
861 ✗ sij(ij, i, i) = 1.0
862 END IF
863 END DO
864 END DO
865
866 ✗ DO i = 1, ncum
867 ✗ sij(i, inb(i), inb(i)) = 1.0
868 END DO
869
870 ! =====================================================================
871 ! --- NORMALIZE ENTRAINED AIR MASS FLUXES
872 ! --- TO REPRESENT EQUAL PROBABILITIES OF MIXING
873 ! =====================================================================
874
875
876 ✗ CALL zilch(bsum, ncum*nlp)
877 ✗ DO ij = 1, ncum
878 ✗ lwork(ij) = .FALSE.
879 END DO
880 ✗ DO i = minorig + 1, nl
881
882 num1 = 0
883 ✗ DO ij = 1, ncum
884 ✗ IF ((i>=icb(ij)+1) .AND. (i<=inb(ij))) num1 = num1 + 1
885 END DO
886 ✗ IF (num1<=0) GO TO 789
887
888 ✗ DO ij = 1, ncum
889 ✗ IF ((i>=icb(ij)+1) .AND. (i<=inb(ij))) THEN
890 ✗ lwork(ij) = (nent(ij,i)/=0)
891 ✗ qp1 = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i)
892 ✗ anum = h(ij, i) - hp(ij, i) - lv(ij, i)*(qp1-qs(ij,i))
893 ✗ denom = h(ij, i) - hp(ij, i) + lv(ij, i)*(q(ij,i)-qp1)
894 ✗ IF (abs(denom)<0.01) denom = 0.01
895 ✗ scrit(ij) = anum/denom
896 ✗ alt = qp1 - qs(ij, i) + scrit(ij)*(q(ij,i)-qp1)
897 ✗ IF (scrit(ij)<0.0 .OR. alt<0.0) scrit(ij) = 1.0
898 ✗ asij(ij) = 0.0
899 ✗ smin(ij) = 1.0
900 END IF
901 END DO
902 ✗ DO j = minorig, nl
903
904 num2 = 0
905 ✗ DO ij = 1, ncum
906 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( &
907 ✗ ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) num2 = num2 + 1
908 END DO
909 ✗ IF (num2<=0) GO TO 783
910
911 ✗ DO ij = 1, ncum
912 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( &
913 ✗ ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) THEN
914 ✗ IF (sij(ij,i,j)>0.0 .AND. sij(ij,i,j)<0.9) THEN
915 ✗ IF (j>i) THEN
916 ✗ smid = min(sij(ij,i,j), scrit(ij))
917 sjmax = smid
918 sjmin = smid
919 ✗ IF (smid<smin(ij) .AND. sij(ij,i,j+1)<smid) THEN
920 ✗ smin(ij) = smid
921 ✗ sjmax = min(sij(ij,i,j+1), sij(ij,i,j), scrit(ij))
922 ✗ sjmin = max(sij(ij,i,j-1), sij(ij,i,j))
923 ✗ sjmin = min(sjmin, scrit(ij))
924 END IF
925 ELSE
926 ✗ sjmax = max(sij(ij,i,j+1), scrit(ij))
927 ✗ smid = max(sij(ij,i,j), scrit(ij))
928 sjmin = 0.0
929 ✗ IF (j>1) sjmin = sij(ij, i, j-1)
930 ✗ sjmin = max(sjmin, scrit(ij))
931 END IF
932 ✗ delp = abs(sjmax-smid)
933 ✗ delm = abs(sjmin-smid)
934 ✗ asij(ij) = asij(ij) + (delp+delm)*(ph(ij,j)-ph(ij,j+1))
935 ✗ ment(ij, i, j) = ment(ij, i, j)*(delp+delm)*(ph(ij,j)-ph(ij,j+1))
936 END IF
937 END IF
938 END DO
939 ✗ 783 END DO
940 ✗ DO ij = 1, ncum
941 ✗ IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. lwork(ij)) THEN
942 ✗ asij(ij) = max(1.0E-21, asij(ij))
943 ✗ asij(ij) = 1.0/asij(ij)
944 ✗ bsum(ij, i) = 0.0
945 END IF
946 END DO
947 ✗ DO j = minorig, nl + 1
948 ✗ DO ij = 1, ncum
949 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (j>=icb( &
950 ✗ ij)) .AND. (j<=inb(ij)) .AND. lwork(ij)) THEN
951 ✗ ment(ij, i, j) = ment(ij, i, j)*asij(ij)
952 ✗ bsum(ij, i) = bsum(ij, i) + ment(ij, i, j)
953 END IF
954 END DO
955 END DO
956 ✗ DO ij = 1, ncum
957 IF ((i>=icb(ij)+1) .AND. (i<=inb(ij)) .AND. (bsum(ij, &
958 ✗ i)<1.0E-18) .AND. lwork(ij)) THEN
959 ✗ nent(ij, i) = 0
960 ✗ ment(ij, i, i) = m(ij, i)
961 ✗ qent(ij, i, i) = q(ij, nk(ij)) - ep(ij, i)*clw(ij, i)
962 ✗ uent(ij, i, i) = u(ij, nk(ij))
963 ✗ vent(ij, i, i) = v(ij, nk(ij))
964 ✗ elij(ij, i, i) = clw(ij, i)
965 ✗ sij(ij, i, i) = 1.0
966 END IF
967 END DO
968 ✗ 789 END DO
969
970 ! =====================================================================
971 ! --- PRECIPITATING DOWNDRAFT CALCULATION
972 ! =====================================================================
973
974 ! *** Check whether ep(inb)=0, if so, skip precipitating ***
975 ! *** downdraft calculation ***
976
977
978 ! *** Integrate liquid water equation to find condensed water ***
979 ! *** and condensed water flux ***
980
981
982 ✗ DO i = 1, ncum
983 ✗ jtt(i) = 2
984 ✗ IF (ep(i,inb(i))<=0.0001) iflag(i) = 2
985 ✗ IF (iflag(i)==0) THEN
986 ✗ lwork(i) = .TRUE.
987 ELSE
988 ✗ lwork(i) = .FALSE.
989 END IF
990 END DO
991
992 ! *** Begin downdraft loop ***
993
994
995 ✗ CALL zilch(wdtrain, ncum)
996 ✗ DO i = nl + 1, 1, -1
997
998 num1 = 0
999 ✗ DO ij = 1, ncum
1000 ✗ IF ((i<=inb(ij)) .AND. lwork(ij)) num1 = num1 + 1
1001 END DO
1002 ✗ IF (num1<=0) GO TO 899
1003
1004
1005 ! *** Calculate detrained precipitation ***
1006
1007 ✗ DO ij = 1, ncum
1008 ✗ IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN
1009 ✗ wdtrain(ij) = g*ep(ij, i)*m(ij, i)*clw(ij, i)
1010 END IF
1011 END DO
1012
1013 ✗ IF (i>1) THEN
1014 ✗ DO j = 1, i - 1
1015 ✗ DO ij = 1, ncum
1016 ✗ IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN
1017 ✗ awat = elij(ij, j, i) - (1.-ep(ij,i))*clw(ij, i)
1018 ✗ awat = max(0.0, awat)
1019 ✗ wdtrain(ij) = wdtrain(ij) + g*awat*ment(ij, j, i)
1020 END IF
1021 END DO
1022 END DO
1023 END IF
1024
1025 ! *** Find rain water and evaporation using provisional ***
1026 ! *** estimates of qp(i)and qp(i-1) ***
1027
1028
1029 ! *** Value of terminal velocity and coeffecient of evaporation for snow
1030 ! ***
1031
1032 ✗ DO ij = 1, ncum
1033 ✗ IF ((i<=inb(ij)) .AND. (lwork(ij))) THEN
1034 ✗ coeff = coeffs
1035 ✗ wt(ij, i) = omtsnow
1036
1037 ! *** Value of terminal velocity and coeffecient of evaporation for
1038 ! rain ***
1039
1040 ✗ IF (t(ij,i)>273.0) THEN
1041 ✗ coeff = coeffr
1042 ✗ wt(ij, i) = omtrain
1043 END IF
1044 ✗ qsm = 0.5*(q(ij,i)+qp(ij,i+1))
1045 ✗ afac = coeff*ph(ij, i)*(qs(ij,i)-qsm)/(1.0E4+2.0E3*ph(ij,i)*qs(ij,i))
1046 ✗ afac = max(afac, 0.0)
1047 ✗ sigt = sigp(ij, i)
1048 ✗ sigt = max(0.0, sigt)
1049 ✗ sigt = min(1.0, sigt)
1050 ✗ b6 = 100.*(ph(ij,i)-ph(ij,i+1))*sigt*afac/wt(ij, i)
1051 ✗ c6 = (water(ij,i+1)*wt(ij,i+1)+wdtrain(ij)/sigd)/wt(ij, i)
1052 ✗ revap = 0.5*(-b6+sqrt(b6*b6+4.*c6))
1053 ✗ evap(ij, i) = sigt*afac*revap
1054 ✗ water(ij, i) = revap*revap
1055
1056 ! *** Calculate precipitating downdraft mass flux under ***
1057 ! *** hydrostatic approximation ***
1058
1059 ✗ IF (i>1) THEN
1060 ✗ dhdp = (h(ij,i)-h(ij,i-1))/(p(ij,i-1)-p(ij,i))
1061 ✗ dhdp = max(dhdp, 10.0)
1062 ✗ mp(ij, i) = 100.*ginv*lv(ij, i)*sigd*evap(ij, i)/dhdp
1063 ✗ mp(ij, i) = max(mp(ij,i), 0.0)
1064
1065 ! *** Add small amount of inertia to downdraft ***
1066
1067 ✗ fac = 20.0/(ph(ij,i-1)-ph(ij,i))
1068 ✗ mp(ij, i) = (fac*mp(ij,i+1)+mp(ij,i))/(1.+fac)
1069
1070 ! *** Force mp to decrease linearly to zero
1071 ! ***
1072 ! *** between about 950 mb and the surface
1073 ! ***
1074
1075 ✗ IF (p(ij,i)>(0.949*p(ij,1))) THEN
1076 ✗ jtt(ij) = max(jtt(ij), i)
1077 mp(ij, i) = mp(ij, jtt(ij))*(p(ij,1)-p(ij,i))/ &
1078 ✗ (p(ij,1)-p(ij,jtt(ij)))
1079 END IF
1080 END IF
1081
1082 ! *** Find mixing ratio of precipitating downdraft ***
1083
1084 ✗ IF (i/=inb(ij)) THEN
1085 ✗ IF (i==1) THEN
1086 ✗ qstm = qs(ij, 1)
1087 ELSE
1088 ✗ qstm = qs(ij, i-1)
1089 END IF
1090 ✗ IF (mp(ij,i)>mp(ij,i+1)) THEN
1091 ✗ rat = mp(ij, i+1)/mp(ij, i)
1092 qp(ij, i) = qp(ij, i+1)*rat + q(ij, i)*(1.0-rat) + &
1093 ✗ 100.*ginv*sigd*(ph(ij,i)-ph(ij,i+1))*(evap(ij,i)/mp(ij,i))
1094 ✗ up(ij, i) = up(ij, i+1)*rat + u(ij, i)*(1.-rat)
1095 ✗ vp(ij, i) = vp(ij, i+1)*rat + v(ij, i)*(1.-rat)
1096 ELSE
1097 ✗ IF (mp(ij,i+1)>0.0) THEN
1098 qp(ij, i) = (gz(ij,i+1)-gz(ij,i)+qp(ij,i+1)*(lv(ij,i+1)+t(ij, &
1099 i+1)*(cl-cpd))+cpd*(t(ij,i+1)-t(ij, &
1100 ✗ i)))/(lv(ij,i)+t(ij,i)*(cl-cpd))
1101 ✗ up(ij, i) = up(ij, i+1)
1102 ✗ vp(ij, i) = vp(ij, i+1)
1103 END IF
1104 END IF
1105 ✗ qp(ij, i) = min(qp(ij,i), qstm)
1106 ✗ qp(ij, i) = max(qp(ij,i), 0.0)
1107 END IF
1108 END IF
1109 END DO
1110 ✗ 899 END DO
1111
1112 ! *** Calculate surface precipitation in mm/day ***
1113
1114 ✗ DO i = 1, ncum
1115 ✗ IF (iflag(i)<=1) THEN
1116 ! c precip(i)=precip(i)+wt(i,1)*sigd*water(i,1)*3600.*24000.
1117 ! c & /(rowl*g)
1118 ! c precip(i)=precip(i)*delt/86400.
1119 ✗ precip(i) = wt(i, 1)*sigd*water(i, 1)*86400/g
1120 END IF
1121 END DO
1122
1123
1124 ! *** Calculate downdraft velocity scale and surface temperature and ***
1125 ! *** water vapor fluctuations ***
1126
1127 ! wd=beta*abs(mp(icb))*0.01*rd*t(icb)/(sigd*p(icb))
1128 ! qprime=0.5*(qp(1)-q(1))
1129 ! tprime=lv0*qprime/cpd
1130
1131 ! *** Calculate tendencies of lowest level potential temperature ***
1132 ! *** and mixing ratio ***
1133
1134 ✗ DO i = 1, ncum
1135 ✗ work(i) = 0.01/(ph(i,1)-ph(i,2))
1136 ✗ am(i) = 0.0
1137 END DO
1138 ✗ DO k = 2, nl
1139 ✗ DO i = 1, ncum
1140 ✗ IF ((nk(i)==1) .AND. (k<=inb(i)) .AND. (nk(i)==1)) THEN
1141 ✗ am(i) = am(i) + m(i, k)
1142 END IF
1143 END DO
1144 END DO
1145 ✗ DO i = 1, ncum
1146 ✗ IF ((g*work(i)*am(i))>=delti) iflag(i) = 1
1147 ft(i, 1) = ft(i, 1) + g*work(i)*am(i)*(t(i,2)-t(i,1)+(gz(i,2)-gz(i, &
1148 ✗ 1))/cpn(i,1))
1149 ✗ ft(i, 1) = ft(i, 1) - lvcp(i, 1)*sigd*evap(i, 1)
1150 ft(i, 1) = ft(i, 1) + sigd*wt(i, 2)*(cl-cpd)*water(i, 2)*(t(i,2)-t(i,1))* &
1151 ✗ work(i)/cpn(i, 1)
1152 fq(i, 1) = fq(i, 1) + g*mp(i, 2)*(qp(i,2)-q(i,1))*work(i) + &
1153 ✗ sigd*evap(i, 1)
1154 ✗ fq(i, 1) = fq(i, 1) + g*am(i)*(q(i,2)-q(i,1))*work(i)
1155 fu(i, 1) = fu(i, 1) + g*work(i)*(mp(i,2)*(up(i,2)-u(i,1))+am(i)*(u(i, &
1156 ✗ 2)-u(i,1)))
1157 fv(i, 1) = fv(i, 1) + g*work(i)*(mp(i,2)*(vp(i,2)-v(i,1))+am(i)*(v(i, &
1158 ✗ 2)-v(i,1)))
1159 END DO
1160 ✗ DO j = 2, nl
1161 ✗ DO i = 1, ncum
1162 ✗ IF (j<=inb(i)) THEN
1163 ✗ fq(i, 1) = fq(i, 1) + g*work(i)*ment(i, j, 1)*(qent(i,j,1)-q(i,1))
1164 ✗ fu(i, 1) = fu(i, 1) + g*work(i)*ment(i, j, 1)*(uent(i,j,1)-u(i,1))
1165 ✗ fv(i, 1) = fv(i, 1) + g*work(i)*ment(i, j, 1)*(vent(i,j,1)-v(i,1))
1166 END IF
1167 END DO
1168 END DO
1169
1170 ! *** Calculate tendencies of potential temperature and mixing ratio ***
1171 ! *** at levels above the lowest level ***
1172
1173 ! *** First find the net saturated updraft and downdraft mass fluxes ***
1174 ! *** through each level ***
1175
1176 ✗ DO i = 2, nl + 1
1177
1178 num1 = 0
1179 ✗ DO ij = 1, ncum
1180 ✗ IF (i<=inb(ij)) num1 = num1 + 1
1181 END DO
1182 ✗ IF (num1<=0) GO TO 1500
1183
1184 ✗ CALL zilch(amp1, ncum)
1185 ✗ CALL zilch(ad, ncum)
1186
1187 ✗ DO k = i + 1, nl + 1
1188 ✗ DO ij = 1, ncum
1189 ✗ IF ((i>=nk(ij)) .AND. (i<=inb(ij)) .AND. (k<=(inb(ij)+1))) THEN
1190 ✗ amp1(ij) = amp1(ij) + m(ij, k)
1191 END IF
1192 END DO
1193 END DO
1194
1195 ✗ DO k = 1, i
1196 ✗ DO j = i + 1, nl + 1
1197 ✗ DO ij = 1, ncum
1198 ✗ IF ((j<=(inb(ij)+1)) .AND. (i<=inb(ij))) THEN
1199 ✗ amp1(ij) = amp1(ij) + ment(ij, k, j)
1200 END IF
1201 END DO
1202 END DO
1203 END DO
1204 ✗ DO k = 1, i - 1
1205 ✗ DO j = i, nl + 1
1206 ✗ DO ij = 1, ncum
1207 ✗ IF ((i<=inb(ij)) .AND. (j<=inb(ij))) THEN
1208 ✗ ad(ij) = ad(ij) + ment(ij, j, k)
1209 END IF
1210 END DO
1211 END DO
1212 END DO
1213
1214 ✗ DO ij = 1, ncum
1215 ✗ IF (i<=inb(ij)) THEN
1216 ✗ dpinv = 0.01/(ph(ij,i)-ph(ij,i+1))
1217 ✗ cpinv = 1.0/cpn(ij, i)
1218
1219 ft(ij, i) = ft(ij, i) + g*dpinv*(amp1(ij)*(t(ij,i+1)-t(ij, &
1220 i)+(gz(ij,i+1)-gz(ij,i))*cpinv)-ad(ij)*(t(ij,i)-t(ij, &
1221 ✗ i-1)+(gz(ij,i)-gz(ij,i-1))*cpinv)) - sigd*lvcp(ij, i)*evap(ij, i)
1222 ft(ij, i) = ft(ij, i) + g*dpinv*ment(ij, i, i)*(hp(ij,i)-h(ij,i)+t(ij &
1223 ✗ ,i)*(cpv-cpd)*(q(ij,i)-qent(ij,i,i)))*cpinv
1224 ft(ij, i) = ft(ij, i) + sigd*wt(ij, i+1)*(cl-cpd)*water(ij, i+1)*(t( &
1225 ✗ ij,i+1)-t(ij,i))*dpinv*cpinv
1226 fq(ij, i) = fq(ij, i) + g*dpinv*(amp1(ij)*(q(ij,i+1)-q(ij, &
1227 ✗ i))-ad(ij)*(q(ij,i)-q(ij,i-1)))
1228 fu(ij, i) = fu(ij, i) + g*dpinv*(amp1(ij)*(u(ij,i+1)-u(ij, &
1229 ✗ i))-ad(ij)*(u(ij,i)-u(ij,i-1)))
1230 fv(ij, i) = fv(ij, i) + g*dpinv*(amp1(ij)*(v(ij,i+1)-v(ij, &
1231 ✗ i))-ad(ij)*(v(ij,i)-v(ij,i-1)))
1232 END IF
1233 END DO
1234 ✗ DO k = 1, i - 1
1235 ✗ DO ij = 1, ncum
1236 ✗ IF (i<=inb(ij)) THEN
1237 ✗ awat = elij(ij, k, i) - (1.-ep(ij,i))*clw(ij, i)
1238 ✗ awat = max(awat, 0.0)
1239 fq(ij, i) = fq(ij, i) + g*dpinv*ment(ij, k, i)*(qent(ij,k,i)-awat-q &
1240 ✗ (ij,i))
1241 fu(ij, i) = fu(ij, i) + g*dpinv*ment(ij, k, i)*(uent(ij,k,i)-u(ij,i &
1242 ✗ ))
1243 fv(ij, i) = fv(ij, i) + g*dpinv*ment(ij, k, i)*(vent(ij,k,i)-v(ij,i &
1244 ✗ ))
1245 END IF
1246 END DO
1247 END DO
1248 ✗ DO k = i, nl + 1
1249 ✗ DO ij = 1, ncum
1250 ✗ IF ((i<=inb(ij)) .AND. (k<=inb(ij))) THEN
1251 fq(ij, i) = fq(ij, i) + g*dpinv*ment(ij, k, i)*(qent(ij,k,i)-q(ij,i &
1252 ✗ ))
1253 fu(ij, i) = fu(ij, i) + g*dpinv*ment(ij, k, i)*(uent(ij,k,i)-u(ij,i &
1254 ✗ ))
1255 fv(ij, i) = fv(ij, i) + g*dpinv*ment(ij, k, i)*(vent(ij,k,i)-v(ij,i &
1256 ✗ ))
1257 END IF
1258 END DO
1259 END DO
1260 ✗ DO ij = 1, ncum
1261 ✗ IF (i<=inb(ij)) THEN
1262 fq(ij, i) = fq(ij, i) + sigd*evap(ij, i) + g*(mp(ij,i+1)*(qp(ij, &
1263 ✗ i+1)-q(ij,i))-mp(ij,i)*(qp(ij,i)-q(ij,i-1)))*dpinv
1264 fu(ij, i) = fu(ij, i) + g*(mp(ij,i+1)*(up(ij,i+1)-u(ij, &
1265 ✗ i))-mp(ij,i)*(up(ij,i)-u(ij,i-1)))*dpinv
1266 fv(ij, i) = fv(ij, i) + g*(mp(ij,i+1)*(vp(ij,i+1)-v(ij, &
1267 ✗ i))-mp(ij,i)*(vp(ij,i)-v(ij,i-1)))*dpinv
1268 END IF
1269 END DO
1270 ✗ 1500 END DO
1271
1272 ! *** Adjust tendencies at top of convection layer to reflect ***
1273 ! *** actual position of the level zero cape ***
1274
1275 ✗ DO ij = 1, ncum
1276 ✗ fqold = fq(ij, inb(ij))
1277 ✗ fq(ij, inb(ij)) = fq(ij, inb(ij))*(1.-frac(ij))
1278 fq(ij, inb(ij)-1) = fq(ij, inb(ij)-1) + frac(ij)*fqold*((ph(ij, &
1279 inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij, &
1280 ✗ inb(ij))))*lv(ij, inb(ij))/lv(ij, inb(ij)-1)
1281 ✗ ftold = ft(ij, inb(ij))
1282 ✗ ft(ij, inb(ij)) = ft(ij, inb(ij))*(1.-frac(ij))
1283 ft(ij, inb(ij)-1) = ft(ij, inb(ij)-1) + frac(ij)*ftold*((ph(ij, &
1284 inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij, &
1285 ✗ inb(ij))))*cpn(ij, inb(ij))/cpn(ij, inb(ij)-1)
1286 ✗ fuold = fu(ij, inb(ij))
1287 ✗ fu(ij, inb(ij)) = fu(ij, inb(ij))*(1.-frac(ij))
1288 fu(ij, inb(ij)-1) = fu(ij, inb(ij)-1) + frac(ij)*fuold*((ph(ij, &
1289 ✗ inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij,inb(ij))))
1290 ✗ fvold = fv(ij, inb(ij))
1291 ✗ fv(ij, inb(ij)) = fv(ij, inb(ij))*(1.-frac(ij))
1292 fv(ij, inb(ij)-1) = fv(ij, inb(ij)-1) + frac(ij)*fvold*((ph(ij, &
1293 ✗ inb(ij))-ph(ij,inb(ij)+1))/(ph(ij,inb(ij)-1)-ph(ij,inb(ij))))
1294 END DO
1295
1296 ! *** Very slightly adjust tendencies to force exact ***
1297 ! *** enthalpy, momentum and tracer conservation ***
1298
1299 ✗ DO ij = 1, ncum
1300 ✗ ents(ij) = 0.0
1301 ✗ uav(ij) = 0.0
1302 ✗ vav(ij) = 0.0
1303 ✗ DO i = 1, inb(ij)
1304 ents(ij) = ents(ij) + (cpn(ij,i)*ft(ij,i)+lv(ij,i)*fq(ij,i))*(ph(ij,i)- &
1305 ✗ ph(ij,i+1))
1306 ✗ uav(ij) = uav(ij) + fu(ij, i)*(ph(ij,i)-ph(ij,i+1))
1307 ✗ vav(ij) = vav(ij) + fv(ij, i)*(ph(ij,i)-ph(ij,i+1))
1308 END DO
1309 END DO
1310 ✗ DO ij = 1, ncum
1311 ✗ ents(ij) = ents(ij)/(ph(ij,1)-ph(ij,inb(ij)+1))
1312 ✗ uav(ij) = uav(ij)/(ph(ij,1)-ph(ij,inb(ij)+1))
1313 ✗ vav(ij) = vav(ij)/(ph(ij,1)-ph(ij,inb(ij)+1))
1314 END DO
1315 ✗ DO ij = 1, ncum
1316 ✗ DO i = 1, inb(ij)
1317 ✗ ft(ij, i) = ft(ij, i) - ents(ij)/cpn(ij, i)
1318 ✗ fu(ij, i) = (1.-cu)*(fu(ij,i)-uav(ij))
1319 ✗ fv(ij, i) = (1.-cu)*(fv(ij,i)-vav(ij))
1320 END DO
1321 END DO
1322
1323 ✗ DO k = 1, nl + 1
1324 ✗ DO i = 1, ncum
1325 ✗ IF ((q(i,k)+delt*fq(i,k))<0.0) iflag(i) = 10
1326 END DO
1327 END DO
1328
1329
1330 ✗ DO i = 1, ncum
1331 ✗ IF (iflag(i)>2) THEN
1332 ✗ precip(i) = 0.0
1333 ✗ cbmf(i) = 0.0
1334 END IF
1335 END DO
1336 ✗ DO k = 1, nl
1337 ✗ DO i = 1, ncum
1338 ✗ IF (iflag(i)>2) THEN
1339 ✗ ft(i, k) = 0.0
1340 ✗ fq(i, k) = 0.0
1341 ✗ fu(i, k) = 0.0
1342 ✗ fv(i, k) = 0.0
1343 END IF
1344 END DO
1345 END DO
1346 ✗ DO i = 1, ncum
1347 ✗ precip1(idcum(i)) = precip(i)
1348 ✗ cbmf1(idcum(i)) = cbmf(i)
1349 ✗ iflag1(idcum(i)) = iflag(i)
1350 END DO
1351 ✗ DO k = 1, nl
1352 ✗ DO i = 1, ncum
1353 ✗ ft1(idcum(i), k) = ft(i, k)
1354 ✗ fq1(idcum(i), k) = fq(i, k)
1355 ✗ fu1(idcum(i), k) = fu(i, k)
1356 ✗ fv1(idcum(i), k) = fv(i, k)
1357 END DO
1358 END DO
1359
1360 ✗ DO k = 1, nd
1361 ✗ DO i = 1, len
1362 ✗ ma(i, k) = 0.
1363 END DO
1364 END DO
1365 ✗ DO k = nl, 1, -1
1366 ✗ DO i = 1, ncum
1367 ✗ ma(i, k) = ma(i, k+1) + m(i, k)
1368 END DO
1369 END DO
1370
1371 ✗ RETURN
1372 END SUBROUTINE convect2
1373
1374