GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/cv_routines.F90 Lines: 0 721 0.0 %
Date: 2023-06-30 12:51:15 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