/[MITgcm]/MITgcm/pkg/fizhi/fizhi_moist.F
ViewVC logotype

Contents of /MITgcm/pkg/fizhi/fizhi_moist.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Tue Jun 15 14:47:23 2004 UTC (20 years ago) by molod
Branch: MAIN
Add CVS header and name stuff (and rename)

1 C $Header: $
2 C $Name: $
3
4 subroutine moistio (ndmoist,istrip,npcs,pz,tz,qz,ntracer,ptracer,
5 . pkht,qqz,dumoist,dvmoist,dtmoist,dqmoist,
6 . im,jm,lm,sige,sig,dsig,ptop,
7 . iras,rainlsp,rainconv,snowfall,
8 . nswcld,cldtot_sw,cldras_sw,cldlsp_sw,nswlz,swlz,
9 . nlwcld,cldtot_lw,cldras_lw,cldlsp_lw,nlwlz,lwlz,
10 . lpnt,qdiag,nd,myid)
11
12 #include "diagnostics.h"
13
14 c Input Variables
15 c ---------------
16 integer ndmoist,istrip,npcs,nd,myid
17
18 integer im,jm,lm
19 real ptop
20 real sige(lm+1)
21 real sig(lm)
22 real dsig(lm)
23
24 integer ntracer,ptracer
25
26 real pz(im,jm)
27 real tz(im,jm,lm)
28 real qz(im,jm,lm,ntracer)
29
30 real pkht(im,jm,lm)
31
32 real qqz(im,jm,lm)
33
34 real dumoist(im,jm,lm)
35 real dvmoist(im,jm,lm)
36 real dtmoist(im,jm,lm)
37 real dqmoist(im,jm,lm,ntracer)
38
39 integer iras
40 real rainlsp(im,jm)
41 real rainconv(im,jm)
42 real snowfall(im,jm)
43
44 integer nswcld,nswlz
45 real cldlsp_sw(im,jm,lm)
46 real cldras_sw(im,jm,lm)
47 real cldtot_sw(im,jm,lm)
48 real swlz(im,jm,lm)
49
50 integer nlwcld,nlwlz
51 real cldlsp_lw(im,jm,lm)
52 real cldras_lw(im,jm,lm)
53 real cldtot_lw(im,jm,lm)
54 real lwlz(im,jm,lm)
55
56 real qdiag(im,jm,nd)
57 logical lpnt
58
59 c Local Variables
60 c ---------------
61 integer ncrnd,nsecf,nsubmax
62
63 real fracqq, rh,temp1,temp2,dum
64 integer snowcrit, lup
65 parameter (fracqq = 0.1)
66
67 real cldsr(im,jm,lm)
68 real srcld(istrip,lm)
69
70 real plev
71 real cldnow,cldlsp_mem,cldras_mem,cldras,watnow,watmin,cldmin
72 real cldprs(im,jm),cldtmp(im,jm)
73 real cldhi (im,jm),cldlow(im,jm)
74 real cldmid(im,jm),totcld(im,jm)
75 integer midlevel,lowlevel
76
77 real CLDLS(im,jm,lm) , CPEN(im,jm,lm)
78 real tmpimjm(im,jm)
79 real lsp_new(im,jm)
80 real conv_new(im,jm)
81 real snow_new(im,jm)
82
83 real qqcolmin(im,jm)
84 real qqcolmax(im,jm)
85 integer levpbl(im,jm)
86
87 c Gathered Arrays for Variable Cloud Base
88 c ---------------------------------------
89 real raincgath(im*jm)
90 real pigather(im*jm)
91 real thgather(im*jm,lm)
92 real shgather(im*jm,lm)
93 real pkzgather(im*jm,lm)
94 real pkegather(im*jm,lm)
95 real tmpgather(im*jm,lm)
96 real deltgather(im*jm,lm)
97 real delqgather(im*jm,lm)
98 real ugather(im*jm,lm,ntracer)
99 real delugather(im*jm,lm,ntracer)
100 real deltrnev(im*jm,lm)
101 real delqrnev(im*jm,lm)
102
103 integer nindeces(lm)
104 integer pblindex(im*jm)
105 integer levgather(im*jm)
106
107 c Stripped Arrays
108 c ---------------
109 real saveth (istrip,lm)
110 real saveq (istrip,lm)
111 real saveu (istrip,lm,ntracer)
112 real usubcl (istrip, ntracer)
113
114 real ple(istrip,lm+1), gam(istrip,lm)
115 real TL(ISTRIP,lm) , SHL(ISTRIP,lm)
116 real PL(ISTRIP,lm) , PLK(ISTRIP,lm)
117 real PLKE(ISTRIP,lm+1)
118 real TH(ISTRIP,lm) ,CVTH(ISTRIP,lm)
119 real SHSAT(ISTRIP,lm) , CVQ(ISTRIP,lm)
120 real UL(ISTRIP,lm,ntracer)
121 real cvu(istrip,lm,ntracer)
122 real CLMAXO(ISTRIP,lm),CLBOTH(ISTRIP,lm)
123 real CLSBTH(ISTRIP,lm)
124 real TMP1(ISTRIP,lm), TMP2(ISTRIP,lm)
125 real TMP3(ISTRIP,lm), TMP4(ISTRIP,lm+1)
126 real TMP5(ISTRIP,lm+1)
127 integer ITMP1(ISTRIP,lm), ITMP2(ISTRIP,lm)
128 integer ITMP3(ISTRIP,lm)
129
130 real PRECIP(ISTRIP), PCMID(ISTRIP), PCNET(ISTRIP)
131 real PCLOW (ISTRIP), SP(ISTRIP), PREP(ISTRIP)
132 real PCPEN (ISTRIP,lm)
133 integer pbl(istrip),depths(lm)
134
135 real cldlz(istrip,lm), cldwater(im,jm,lm)
136 real rhfrac(istrip), rhmin, pup, ppbl, rhcrit(istrip,lm)
137 real offset, alpha, rasmax
138
139 logical first
140 logical lras
141 real clfrac (istrip,lm)
142 real cldmas (istrip,lm)
143 real detrain(istrip,lm)
144 real psubcld (istrip), psubcldg (im,jm)
145 real psubcld_cnt(istrip), psubcldgc(im,jm)
146 real rnd(lm/2)
147 DATA FIRST /.TRUE./
148
149 integer imstp,nltop,nsubcl,nlras,nsubmin
150 integer i,j,iloop,index,l,nn,num,numdeps,nt
151 real tmstp,tminv,sday,grav,alhl,cp,elocp,gamfac
152 real rkappa,p0kappa,p0kinv,ptopkap,pcheck
153 real tice,getcon,pi
154
155 C **********************************************************************
156 C **** INITIALIZATION ****
157 C **********************************************************************
158
159 IMSTP = nsecf(NDMOIST)
160 TMSTP = FLOAT(IMSTP)
161 TMINV = 1. / TMSTP
162
163 C Minimum Large-Scale Cloud Fraction at rhcrit
164 alpha = 0.80
165 C Difference in fraction between SR and LS Thresshold
166 offset = 0.10
167 C Large-Scale Relative Humidity Threshold in PLB
168 rhmin = 0.90
169 C Maximum Cloud Fraction associated with RAS
170 rasmax = 1.00
171
172 nn = 3*3600.0/tmstp + 1
173 C Threshold for Cloud Fraction Memory
174 cldmin = rasmax*(1.0-tmstp/3600.)**nn
175 C Threshold for Cloud Liquid Water Memory
176 watmin = 1.0e-8
177
178 SDAY = GETCON('SDAY')
179 GRAV = GETCON('GRAVITY')
180 ALHL = GETCON('LATENT HEAT COND')
181 CP = GETCON('CP')
182 ELOCP = GETCON('LATENT HEAT COND') / GETCON('CP')
183 GAMFAC = GETCON('LATENT HEAT COND') * GETCON('EPS') * ELOCP
184 . / GETCON('RGAS')
185 RKAPPA = GETCON('KAPPA')
186 P0KAPPA = 1000.0**RKAPPA
187 P0KINV = 1. / P0KAPPA
188 PTOPKAP = PTOP**RKAPPA
189 tice = getcon('FREEZING-POINT')
190 PI = 4.*atan(1.)
191
192 c Determine Upper Level for Cumulus Convection
193 c and Total number of Random Clouds to Check
194 c ---------------------------------------------
195
196 NLTOP = 1
197 DO L=1,lm
198 PCHECK = (1000.-ptop)*SIG(L) + PTOP
199 IF (PCHECK.GE.10.) THEN
200 NLTOP = L
201 GO TO 2
202 ENDIF
203 ENDDO
204 2 CONTINUE
205 ncrnd = (lm-nltop+1)/2
206
207 c Determine Minimum Number of Levels in Sub-Cloud (50 mb) Layer
208 c -------------------------------------------------------------
209 nsubmin = lm
210 nsubmax = 1
211 DO L=lm-1,1,-1
212 PCHECK = (1000.-ptop)*SIG(L) + PTOP
213 IF( PCHECK.GE.950.0 ) nsubmin = L
214 IF( PCHECK.GE.750.0 ) nsubmax = L
215 ENDDO
216
217 if(first .and. myid.eq.0) then
218 print *
219 print *,'Top Level Allowed for Convection : ',nltop,
220 . ' (',(1000.-ptop)*SIG(nltop) + PTOP,' mb)'
221 print *,' Highest Sub-Cloud Level: ',nsubmax,
222 . ' (',(1000.-ptop)*SIG(nsubmax) + PTOP,' mb)'
223 print *,' Lowest Sub-Cloud Level: ',nsubmin,
224 . ' (',(1000.-ptop)*SIG(nsubmin) + PTOP,' mb)'
225 print *,' Total Number of Random Clouds: ',ncrnd
226 print *
227 first = .false.
228 endif
229
230 c And now find PBL depth - the level where qq = fracqq * qq at surface
231 c --------------------------------------------------------------------
232 do j = 1,jm
233 do i = 1,im
234 qqcolmin(i,j) = qqz(i,j,lm)*fracqq
235 qqcolmax(i,j) = qqz(i,j,lm)
236 levpbl(i,j) = lm+1
237 enddo
238 enddo
239
240 DO L = lm-1,1,-1
241 DO j = 1,jm
242 DO i = 1,im
243 IF((qqz(i,j,l).gt.qqcolmax(i,j))
244 1 .and.(levpbl(i,j).eq.lm+1))then
245 qqcolmax(i,j) = qqz(i,j,l)
246 qqcolmin(i,j) = fracqq*qqcolmax(i,j)
247 endif
248 if((qqz(i,j,l).lt.qqcolmin(i,j))
249 1 .and.(levpbl(i,j).eq.lm+1))levpbl(i,j)=L+1
250 enddo
251 enddo
252 enddo
253
254 do j = 1,jm
255 do i = 1,im
256 if(levpbl(i,j).gt.nsubmin) levpbl(i,j) = nsubmin
257 if(levpbl(i,j).lt.nsubmax) levpbl(i,j) = nsubmax
258 enddo
259 enddo
260
261
262 c Set up the array of indeces of subcloud levels for the gathering
263 c ----------------------------------------------------------------
264 index = 0
265 do L = nsubmin,nltop,-1
266 do j = 1,jm
267 do i = 1,im
268 if(levpbl(i,j).eq.L) then
269 index = index + 1
270 pblindex(index) = (j-1)*im + i
271 endif
272 enddo
273 enddo
274 enddo
275
276 do index = 1,im*jm
277 levgather(index) = levpbl(pblindex(index),1)
278 pigather(index) = pz(pblindex(index),1)
279 enddo
280
281 do L = 1,lm
282 do index = 1,im*jm
283 thgather(index,L) = tz(pblindex(index),1,L)
284 shgather(index,L) = qz(pblindex(index),1,L,1)
285 pkegather(index,L) = pkht(pblindex(index),1,L)
286 enddo
287 enddo
288 do nt = 1,ntracer-ptracer
289 do L = 1,lm
290 do index = 1,im*jm
291 ugather(index,L,nt) = qz(pblindex(index),1,L,nt+ptracer)
292 enddo
293 enddo
294 enddo
295
296 call pkappa(pigather,pkegather,pkzgather,ptop,sige,dsig,im,jm,lm)
297
298 c bump the counter for number of calls to convection
299 c --------------------------------------------------
300 iras = iras + 1
301 if( iras.ge.1e9 ) iras = 1
302
303 c select the 'random' cloud detrainment levels for RAS
304 c ----------------------------------------------------
305 call rndcloud(iras,ncrnd,rnd,myid)
306
307 do l=1,lm
308 do j=1,jm
309 do i=1,im
310 dtmoist(i,j,l) = 0.
311 do nt = 1,ntracer
312 dqmoist(i,j,l,nt) = 0.
313 enddo
314 enddo
315 enddo
316 enddo
317
318 C***********************************************************************
319 C **** LOOP OVER NPCS PEICES ****
320 C **********************************************************************
321
322 DO 1000 NN = 1,NPCS
323
324 C **********************************************************************
325 C **** VARIABLE INITIALIZATION ****
326 C **********************************************************************
327
328 CALL STRIP ( pigather, SP ,im*jm,ISTRIP,1 ,NN )
329 CALL STRIP ( pkzgather, PLK ,im*jm,ISTRIP,lm,NN )
330 CALL STRIP ( pkegather, PLKE ,im*jm,ISTRIP,lm,NN )
331 CALL STRIP ( thgather, TH ,im*jm,ISTRIP,lm,NN )
332 CALL STRIP ( shgather, SHL ,im*jm,ISTRIP,lm,NN )
333 CALL STRINT( levgather, pbl ,im*jm,ISTRIP,1 ,NN )
334
335 do nt = 1,ntracer-ptracer
336 call strip ( ugather(1,1,nt), ul(1,1,nt),im*jm,istrip,lm,nn )
337 enddo
338
339 do l = 1,lm
340 do i = 1,istrip
341 PL(I,L) = SIG(L)*SP(I) + PTOP
342 PLE(I,L) = SIGE(L)*SP(I) + PTOP
343 enddo
344 enddo
345
346 do i = 1,istrip
347 PLE(I,lm+1) = SP(I) + PTOP
348 enddo
349
350 C **********************************************************************
351 C **** SETUP FOR RAS CUMULUS PARAMETERIZATION ****
352 C **********************************************************************
353
354 DO L = 1,lm
355 DO I = 1,ISTRIP
356 TH(I,L) = TH(I,L) * P0KAPPA
357 CLMAXO(I,L) = 0.
358 CLBOTH(I,L) = 0.
359 cldmas(I,L) = 0.
360 detrain(I,L) = 0.
361 ENDDO
362 ENDDO
363
364 do L = 1,lm
365 depths(L) = 0
366 enddo
367
368 numdeps = 0
369 do L = nsubmin,nltop,-1
370 nindeces(L) = 0
371 do i = 1,istrip
372 if(pbl(i).eq.L) nindeces(L) = nindeces(L) + 1
373 enddo
374 if(nindeces(L).gt.0) then
375 numdeps = numdeps + 1
376 depths(numdeps) = L
377 endif
378 enddo
379
380
381 C Initiate a do-loop around RAS for the number of different
382 C sub-cloud layer depths in this strip
383 C --If all subcloud depths are the same, execute loop once
384 C Otherwise loop over different subcloud layer depths
385
386 num = 1
387 DO iloop = 1,numdeps
388
389 nsubcl = depths(iloop)
390
391 c Compute sub-cloud values for Temperature and Spec.Hum.
392 c ------------------------------------------------------
393 DO 600 I=num,num+nindeces(nsubcl)-1
394 TMP1(I,2) = 0.
395 TMP1(I,3) = 0.
396 600 CONTINUE
397
398 NLRAS = NSUBCL - NLTOP + 1
399 DO 601 L=NSUBCL,lm
400 DO 602 I=num,num+nindeces(nsubcl)-1
401 TMP1(I,2) = TMP1(I,2) + (PLE(I,L+1)-PLE(I,L))*TH (I,L)/sp(i)
402 TMP1(I,3) = TMP1(I,3) + (PLE(I,L+1)-PLE(I,L))*SHL(I,L)/sp(i)
403 602 CONTINUE
404 601 CONTINUE
405 DO 603 I=num,num+nindeces(nsubcl)-1
406 TMP1(I,4) = 1. / ( (PLE(I,lm+1)-PLE(I,NSUBCL))/sp(I) )
407 TH(I,NSUBCL) = TMP1(I,2)*TMP1(I,4)
408 SHL(I,NSUBCL) = TMP1(I,3)*TMP1(I,4)
409 603 CONTINUE
410
411 c Save initial value of tracers and compute sub-cloud value
412 c ---------------------------------------------------------
413 DO NT = 1,ntracer-ptracer
414 do L = 1,lm
415 do i = num,num+nindeces(nsubcl)-1
416 saveu(i,L,nt) = ul(i,L,nt)
417 enddo
418 enddo
419 DO I=num,num+nindeces(nsubcl)-1
420 TMP1(I,2) = 0.
421 ENDDO
422 DO L=NSUBCL,lm
423 DO I=num,num+nindeces(nsubcl)-1
424 TMP1(I,2) = TMP1(I,2)+(PLE(I,L+1)-PLE(I,L))*UL(I,L,NT)/sp(i)
425 ENDDO
426 ENDDO
427 DO I=num,num+nindeces(nsubcl)-1
428 UL(I,NSUBCL,NT) = TMP1(I,2)*TMP1(I,4)
429 usubcl(i,nt) = ul(i,nsubcl,nt)
430 ENDDO
431 ENDDO
432
433 c Compute Pressure Arrays for RAS
434 c -------------------------------
435 DO 111 L=1,lm
436 DO 112 I=num,num+nindeces(nsubcl)-1
437 TMP4(I,L) = PLE(I,L)
438 112 CONTINUE
439 111 CONTINUE
440 DO I=num,num+nindeces(nsubcl)-1
441 TMP5(I,1) = PTOPKAP / P0KAPPA
442 ENDDO
443 DO L=2,lm
444 DO I=num,num+nindeces(nsubcl)-1
445 TMP5(I,L) = PLKE(I,L-1)*P0KINV
446 ENDDO
447 ENDDO
448 DO I=num,num+nindeces(nsubcl)-1
449 TMP4(I,lm+1) = PLE (I,lm+1)
450 TMP5(I,lm+1) = PLKE(I,lm)*P0KINV
451 ENDDO
452 DO 113 I=num,num+nindeces(nsubcl)-1
453 TMP4(I,NSUBCL+1) = PLE (I,lm+1)
454 TMP5(I,NSUBCL+1) = PLKE(I,lm)*P0KINV
455 113 CONTINUE
456
457 do i=num,num+nindeces(nsubcl)-1
458 C Temperature at top of sub-cloud layer
459 tmp2(i,1) = TH(i,NSUBCL) * PLKE(i,NSUBCL)/P0KAPPA
460 C Pressure at top of sub-cloud layer
461 tmp2(i,2) = tmp4(i,nsubcl)
462 enddo
463
464 C CHANGED THIS: no RH requirement for RAS
465 c call vqsat ( tmp2(num,1),tmp2(num,2),tmp2(num,3),
466 c . dum,.false.,nindeces(nsubcl) )
467 c do i=num,num+nindeces(nsubcl)-1
468 c rh = SHL(I,NSUBCL) / tmp2(i,3)
469 c if (rh .le. 0.85) then
470 c rhfrac(i) = 0.
471 c else if (rh .ge. 0.95) then
472 c rhfrac(i) = 1.
473 c else
474 c rhfrac(i) = (rh-0.85)*10.
475 c endif
476 c enddo
477 do i=num,num+nindeces(nsubcl)-1
478 rhfrac(i) = 1.
479 enddo
480
481 C Compute RH threshold for Large-scale condensation
482 C Used in Slingo-Ritter clouds as well - define offset between SR and LS
483
484 C Top level of atan func above this rh_threshold = rhmin
485 pup = 600.
486 do i=num,num+nindeces(nsubcl)-1
487 do L = nsubcl, lm
488 rhcrit(i,L) = 1.
489 enddo
490 do L = 1, nsubcl-1
491 pcheck = (1000.-ptop)*sig(L) + ptop
492 if (pcheck .le. pup) then
493 rhcrit(i,L) = rhmin
494 else
495 ppbl = (1000.-ptop)*sig(nsubcl) + ptop
496 rhcrit(i,L) = rhmin + (1.-rhmin)/(19.) * ((
497 . atan( (2.*(pcheck-pup)/(ppbl-pup)-1.) *
498 . tan(20.*pi/21.-0.5*pi) )
499 . + 0.5*pi) * 21./pi - 1.)
500 endif
501 enddo
502 enddo
503
504 c Save Initial Values of Temperature and Specific Humidity
505 c --------------------------------------------------------
506 do L = 1,lm
507 do i = num,num+nindeces(nsubcl)-1
508 saveth(i,L) = th (i,L)
509 saveq (i,L) = shl(i,L)
510 PCPEN (i,L) = 0.
511 CLFRAC(i,L) = 0.
512 enddo
513 enddo
514
515 CALL RAS ( NN,istrip,nindeces(nsubcl),NLRAS,NLTOP,lm,TMSTP
516 1, UL(num,1,1),ntracer-ptracer,TH(num,NLTOP),SHL(num,NLTOP)
517 2, TMP4(num,NLTOP), TMP5(num,NLTOP),rnd, ncrnd, PCPEN(num,NLTOP)
518 3, CLBOTH(num,NLTOP), CLFRAC(num,NLTOP)
519 4, cldmas(num,nltop), detrain(num,nltop)
520 8, cp,grav,rkappa,alhl,rhfrac(num),rasmax )
521
522 c Compute Diagnostic CLDMAS in RAS Subcloud Layers
523 c ------------------------------------------------
524 do L=nsubcl,lm
525 dum = dsig(L)/(1.0-sige(nsubcl))
526 do I=num,num+nindeces(nsubcl)-1
527 cldmas(i,L) = cldmas(i,L-1) - dum*cldmas(i,nsubcl-1)
528 enddo
529 enddo
530
531 c Update Theta and Moisture due to RAS
532 c ------------------------------------
533 DO L=1,nsubcl
534 DO I=num,num+nindeces(nsubcl)-1
535 CVTH(I,L) = (TH (I,L) - saveth(i,l))
536 CVQ (I,L) = (SHL(I,L) - saveq (i,l))
537 ENDDO
538 ENDDO
539 DO L=nsubcl+1,lm
540 DO I=num,num+nindeces(nsubcl)-1
541 CVTH(I,L) = cvth(i,nsubcl)
542 CVQ (I,L) = cvq (i,nsubcl)
543 ENDDO
544 ENDDO
545
546 DO L=nsubcl+1,lm
547 DO I=num,num+nindeces(nsubcl)-1
548 TH (I,L) = saveth(i,l) + cvth(i,l)
549 SHL(I,L) = saveq (i,l) + cvq (i,l)
550 ENDDO
551 ENDDO
552 DO L=1,lm
553 DO I=num,num+nindeces(nsubcl)-1
554 CVTH(I,L) = CVTH(I,L) *P0KINV*SP(I)*tminv
555 CVQ (I,L) = CVQ (I,L) *SP(I)*tminv
556 ENDDO
557 ENDDO
558
559 c Compute Tracer Tendency due to RAS
560 c ----------------------------------
561 do nt = 1,ntracer-ptracer
562 DO L=1,nsubcl-1
563 DO I=num,num+nindeces(nsubcl)-1
564 CVU(I,L,nt) = ( UL(I,L,nt)-saveu(i,l,nt) )*sp(i)*tminv
565 ENDDO
566 ENDDO
567 DO L=nsubcl,lm
568 DO I=num,num+nindeces(nsubcl)-1
569 if( usubcl(i,nt).ne.0.0 ) then
570 cvu(i,L,nt) = ( ul(i,nsubcl,nt)-usubcl(i,nt) ) *
571 . ( saveu(i,L,nt)/usubcl(i,nt) )*sp(i)*tminv
572 else
573 cvu(i,L,nt) = 0.0
574 endif
575 ENDDO
576 ENDDO
577 enddo
578
579 c Compute Diagnostic PSUBCLD (Subcloud Layer Pressure)
580 c ----------------------------------------------------
581 do i=num,num+nindeces(nsubcl)-1
582 lras = .false.
583 do L=nltop,nsubcl
584 if( cvq(i,L).ne.0.0 ) lras = .true.
585 enddo
586 psubcld (i) = 0.0
587 psubcld_cnt(i) = 0.0
588 if( lras ) then
589 psubcld (i) = sp(i)+ptop-ple(i,nsubcl)
590 psubcld_cnt(i) = 1.0
591 endif
592 enddo
593
594
595 C End of subcloud layer depth loop (iloop)
596
597 num = num+nindeces(nsubcl)
598
599 ENDDO
600
601 C **********************************************************************
602 C **** TENDENCY UPDATES ****
603 C **** (Keep 'Gathered' tendencies in 'gather' arrays now) ****
604 C **********************************************************************
605
606 call paste( CVTH,deltgather,istrip,im*jm,lm,NN )
607 call paste( CVQ,delqgather,istrip,im*jm,lm,NN )
608 do nt = 1,ntracer-ptracer
609 call paste( CVU(1,1,nt),delugather(1,1,nt),istrip,im*jm,lm,NN )
610 enddo
611
612 C **********************************************************************
613 C And now paste some arrays for filling diagnostics
614 C (use pkegather to hold detrainment and tmpgather for cloud mass flux)
615 C **********************************************************************
616
617 if(icldmas .gt.0) call paste( cldmas,tmpgather,istrip,im*jm,lm,NN)
618 if(idtrain .gt.0) call paste(detrain,pkegather,istrip,im*jm,lm,NN)
619 if(ipsubcld.gt.0) then
620 call paste(psubcld ,psubcldg ,istrip,im*jm,1,NN)
621 call paste(psubcld_cnt,psubcldgc,istrip,im*jm,1,NN)
622 endif
623
624 C *********************************************************************
625 C **** RE-EVAPORATION OF PENETRATING CONVECTIVE RAIN ****
626 C *********************************************************************
627
628 CALL STRIP ( thgather,TH ,im*jm,ISTRIP,lm,NN)
629 CALL STRIP ( shgather,SHL,im*jm,ISTRIP,lm,NN)
630 DO L=1,lm
631 DO I=1,ISTRIP
632 TH(I,L) = TH(I,L) + CVTH(I,L)*tmstp/SP(I)
633 SHL(I,L) = SHL(I,L) + CVQ(I,L)*tmstp/SP(I)
634 TL(I,L) = TH(I,L)*PLK(I,L)
635 saveth(I,L) = th(I,L)
636 saveq (I,L) = SHL(I,L)
637 ENDDO
638 ENDDO
639
640 CALL RNEVP (NN,ISTRIP,lm,TL,SHL,PCPEN,PL,CLFRAC,SP,DSIG,PLKE,
641 . PLK,TH,TMP1,TMP2,TMP3,ITMP1,ITMP2,PCNET,PRECIP,
642 . CLSBTH,TMSTP,1.,cp,grav,alhl,gamfac,cldlz,rhcrit,offset,alpha)
643
644 C **********************************************************************
645 C **** TENDENCY UPDATES ****
646 C **********************************************************************
647
648 DO L=1,lm
649
650 DO I =1,ISTRIP
651 TMP1(I,L) = sp(i) * (SHL(I,L)-saveq(I,L)) * tminv
652 ENDDO
653 CALL PSTBMP(TMP1(1,L),delqgather(1,L),ISTRIP,im*jm,1,NN)
654
655 DO I =1,ISTRIP
656 TMP1(I,L) = sp(i) * ((TL(I,L)/PLK(I,L))-saveth(i,l)) * tminv
657 ENDDO
658 CALL PSTBMP(TMP1(1,L),deltgather(1,L),ISTRIP,im*jm,1,NN)
659
660 C Paste rain evap tendencies into arrays for diagnostic output
661 c ------------------------------------------------------------
662 if(idtls.gt.0)then
663 DO I =1,ISTRIP
664 TMP1(I,L) = ((TL(I,L)/PLK(I,L))-saveth(i,l))*plk(i,l)*sday*tminv
665 ENDDO
666 call paste(tmp1(1,L),deltrnev(1,L),istrip,im*jm,1,NN)
667 endif
668
669 if(idqls.gt.0)then
670 DO I =1,ISTRIP
671 TMP1(I,L) = (SHL(I,L)-saveq(I,L)) * 1000. * sday * tminv
672 ENDDO
673 call paste(tmp1(1,L),delqrnev(1,L),istrip,im*jm,1,NN)
674 endif
675
676 ENDDO
677
678 C *********************************************************************
679 C Add Non-Precipitating Clouds where the relative
680 C humidity is less than 100%
681 C Apply Cloud Top Entrainment Instability
682 C *********************************************************************
683
684 do L=1,lm
685 do i=1,istrip
686 srcld(i,L) = -clsbth(i,L)
687 enddo
688 enddo
689
690 call srclouds (saveth,saveq,plk,pl,plke,clsbth,cldlz,istrip,lm,
691 . rhcrit,offset,alpha)
692
693 do L=1,lm
694 do i=1,istrip
695 srcld(i,L) = srcld(i,L)+clsbth(i,L)
696 enddo
697 enddo
698
699 C *********************************************************************
700 C **** PASTE CLOUD AMOUNTS ****
701 C *********************************************************************
702
703 call paste ( srcld, cldsr,istrip,im*jm,lm,nn )
704 call paste ( cldlz,cldwater,istrip,im*jm,lm,nn )
705 call paste ( clsbth, cldls,istrip,im*jm,lm,nn )
706 call paste ( clboth, cpen ,istrip,im*jm,lm,nn )
707
708 c compute Total Accumulated Precip for Landsurface Model
709 c ------------------------------------------------------
710 do i = 1,istrip
711 C Initialize Rainlsp, Rainconv and Snowfall
712 tmp1(i,1) = 0.0
713 tmp1(i,2) = 0.0
714 tmp1(i,3) = 0.0
715 enddo
716
717 do i = 1,istrip
718 prep(i) = PRECIP(I) + PCNET(I)
719 tmp1(i,1) = PRECIP(I)
720 tmp1(i,2) = pcnet(i)
721 enddo
722 c
723 c check whether there is snow
724 c-------------------------------------------------------
725 c snow algorthm:
726 c if temperature profile from the surface level to 700 mb
727 c uniformaly c below zero, then precipitation (total) is
728 c snowfall. Else there is no snow.
729 c For version of level 70, the sigma level corresponding
730 c to 700mb (assume the surface pressure is 1000mb) is
731 c the 13th level from the surface
732 c Runhua Yang Aug. 24 98
733 c added pcheck for 700mb - sharon sept 18, 1998
734 c-------------------------------------------------------
735
736 pup = 700.
737 do L = lm, 1, -1
738 pcheck = (1000.-ptop)*sig(L) + ptop
739 if (pcheck .ge. pup) then
740 lup = L
741 endif
742 enddo
743 do i = 1,istrip
744 snowcrit=0
745 do l=lup,lm
746 if (saveth(i,l)*plk(i,l).le. tice ) then
747 snowcrit=snowcrit+1
748 endif
749 enddo
750 if (snowcrit .eq. (lm-lup+1)) then
751 tmp1(i,3) = prep(i)
752 tmp1(i,1)=0.0
753 tmp1(i,2)=0.0
754 endif
755 enddo
756
757 CALL paste (tmp1(1,1), lsp_new,ISTRIP,im*jm,1,NN)
758 CALL paste (tmp1(1,2),conv_new,ISTRIP,im*jm,1,NN)
759 CALL paste (tmp1(1,3),snow_new,ISTRIP,im*jm,1,NN)
760
761 if(iprecon.gt.0) then
762 CALL paste (pcnet,raincgath,ISTRIP,im*jm,1,NN)
763 endif
764
765 C *********************************************************************
766 C **** End Major Stripped Region ****
767 C *********************************************************************
768
769 1000 CONTINUE
770
771 C Large Scale Rainfall, Conv rain, and snowfall
772 c ---------------------------------------------
773 call back2grd ( lsp_new,pblindex, lsp_new,im*jm)
774 call back2grd (conv_new,pblindex,conv_new,im*jm)
775 call back2grd (snow_new,pblindex,snow_new,im*jm)
776
777 if(iprecon.gt.0) then
778 call back2grd (raincgath,pblindex,raincgath,im*jm)
779 endif
780
781 c Subcloud Layer Pressure
782 c -----------------------
783 if(ipsubcld.gt.0) then
784 call back2grd (psubcldg ,pblindex,psubcldg ,im*jm)
785 call back2grd (psubcldgc,pblindex,psubcldgc,im*jm)
786 endif
787
788 do L = 1,lm
789 C Delta theta,q, convective, max and ls clouds
790 c --------------------------------------------
791 call back2grd (deltgather(1,L),pblindex, dtmoist(1,1,L) ,im*jm)
792 call back2grd (delqgather(1,L),pblindex, dqmoist(1,1,L,1),im*jm)
793 call back2grd ( cpen(1,1,L),pblindex, cpen(1,1,L) ,im*jm)
794 call back2grd ( cldls(1,1,L),pblindex, cldls(1,1,L) ,im*jm)
795 call back2grd (cldwater(1,1,L),pblindex,cldwater(1,1,L) ,im*jm)
796 call back2grd ( pkzgather(1,L),pblindex, pkzgather(1,L) ,im*jm)
797
798 C Diagnostics:
799 c ------------
800 if(icldmas.gt.0)call back2grd(tmpgather(1,L),pblindex,
801 . tmpgather(1,L),im*jm)
802 if(idtrain.gt.0)call back2grd(pkegather(1,L),pblindex,
803 . pkegather(1,L),im*jm)
804 if(idtls.gt.0)call back2grd(deltrnev(1,L),pblindex,
805 . deltrnev(1,L),im*jm)
806 if(idqls.gt.0)call back2grd(delqrnev(1,L),pblindex,
807 . delqrnev(1,L),im*jm)
808 if(icldnp.gt.0)call back2grd(cldsr(1,1,L),pblindex,
809 . cldsr(1,1,L),im*jm)
810 enddo
811
812 c Tracers
813 c -------
814 do nt = 1,ntracer-ptracer
815 do L = 1,lm
816 call back2grd (delugather(1,L,nt),pblindex,
817 . dqmoist(1,1,L,ptracer+nt),im*jm)
818 enddo
819 enddo
820
821
822 C **********************************************************************
823 C BUMP DIAGNOSTICS
824 C **********************************************************************
825
826 c Determine Level Indices for Low-Mid-High Cloud Regions
827 c ------------------------------------------------------
828 lowlevel = lm
829 midlevel = lm
830 do L = lm-1,1,-1
831 pcheck = (1000.-ptop)*sig(l) + ptop
832 if (pcheck.gt.700.0) lowlevel = L
833 if (pcheck.gt.400.0) midlevel = L
834 enddo
835
836
837 c Clear-Sky (Above 400mb) Temperature
838 c -----------------------------------
839 if( itmpuclr.ne.0 .or. isphuclr.ne.0 ) then
840 do j = 1,jm
841 do i = 1,im
842 totcld(i,j) = 0.0
843 enddo
844 enddo
845 do L = 1,midlevel
846 do j = 1,jm
847 do i = 1,im
848 if(cldls(i,j,L).ne.0.0.or.cpen(i,j,L).ne.0.0)totcld(i,j) = 1.0
849 enddo
850 enddo
851 enddo
852 do L = 1,lm
853 if( itmpuclr.ne.0 ) then
854 do i = 1,im*jm
855 if( totcld(i,1).eq.0.0 ) then
856 qdiag(i,1,itmpuclr +L-1) = qdiag(i,1,itmpuclr +L-1) +
857 . tz(i,1,L)*pkzgather(i,L)
858 qdiag(i,1,itmpuclrc+L-1) = qdiag(i,1,itmpuclrc+L-1) + 1.0
859 endif
860 enddo
861 endif
862
863 if( isphuclr.ne.0 ) then
864 do i = 1,im*jm
865 if( totcld(i,1).eq.0.0 ) then
866 qdiag(i,1,isphuclr +L-1) = qdiag(i,1,isphuclr +L-1) +
867 . qz(i,1,L,1)*1000.0
868 qdiag(i,1,isphuclrc+L-1) = qdiag(i,1,isphuclrc+L-1) + 1.0
869 endif
870 enddo
871 endif
872 enddo
873 endif
874
875 c Sub-Cloud Layer
876 c -------------------------
877 if( ipsubcld.ne.0 ) then
878 do j = 1,jm
879 do i = 1,im
880 qdiag(i,j,ipsubcld ) = qdiag(i,j,ipsubcld ) + psubcldg (i,j)
881 qdiag(i,j,ipsubcldc) = qdiag(i,j,ipsubcldc) + psubcldgc(i,j)
882 enddo
883 enddo
884 endif
885
886 c Non-Precipitating Cloud Fraction
887 c --------------------------------
888 if( icldnp.ne.0 ) then
889 do L = 1,lm
890 do j = 1,jm
891 do i = 1,im
892 qdiag(i,j,icldnp+L-1) = qdiag(i,j,icldnp+L-1) + cldsr(i,j,L)
893 enddo
894 enddo
895 enddo
896 ncldnp = ncldnp + 1
897 endif
898
899 c Moist Processes Heating Rate
900 c ----------------------------
901 if(imoistt.gt.0) then
902 do L = 1,lm
903 do i = 1,im*jm
904 qdiag(i,1,imoistt+L-1) = qdiag(i,1,imoistt+L-1) +
905 . (dtmoist(i,1,L)*sday*pkzgather(i,L)/pz(i,1))
906 enddo
907 enddo
908 endif
909
910 c Moist Processes Moistening Rate
911 c -------------------------------
912 if(imoistq.gt.0) then
913 do L = 1,lm
914 do j = 1,jm
915 do i = 1,im
916 qdiag(i,j,imoistq+L-1) = qdiag(i,j,imoistq+L-1) +
917 . (dqmoist(i,j,L,1)*sday*1000.0/pz(i,j))
918 enddo
919 enddo
920 enddo
921 endif
922
923 c Cloud Mass Flux
924 c ---------------
925 if(icldmas.gt.0) then
926 do L = 1,lm
927 do i = 1,im*jm
928 qdiag(i,1,icldmas+L-1) = qdiag(i,1,icldmas+L-1) + tmpgather(i,L)
929 enddo
930 enddo
931 endif
932
933 c Detrained Cloud Mass Flux
934 c -------------------------
935 if(idtrain.gt.0) then
936 do L = 1,lm
937 do i = 1,im*jm
938 qdiag(i,1,idtrain+L-1) = qdiag(i,1,idtrain+L-1) + pkegather(i,L)
939 enddo
940 enddo
941 endif
942
943 c Grid-Scale Condensational Heating Rate
944 c --------------------------------------
945 if(idtls.gt.0) then
946 do L = 1,lm
947 do i = 1,im*jm
948 qdiag(i,1,idtls+L-1) = qdiag(i,1,idtls+L-1) + deltrnev(i,L)
949 enddo
950 enddo
951 endif
952
953 c Grid-Scale Condensational Moistening Rate
954 c -----------------------------------------
955 if(idqls.gt.0) then
956 do L = 1,lm
957 do i = 1,im*jm
958 qdiag(i,1,idqls+L-1) = qdiag(i,1,idqls+L-1) + delqrnev(i,L)
959 enddo
960 enddo
961 endif
962
963 c Total Precipitation
964 c -------------------
965 if(ipreacc.gt.0) then
966 do j = 1,jm
967 do i = 1,im
968 qdiag(i,j,ipreacc) = qdiag(i,j,ipreacc)
969 . + ( lsp_new(I,j)
970 . + snow_new(I,j)
971 . + conv_new(i,j) ) *sday*tminv
972 enddo
973 enddo
974 endif
975
976 c Convective Precipitation
977 c ------------------------
978 if(iprecon.gt.0) then
979 do i = 1,im*jm
980 qdiag(i,1,iprecon) = qdiag(i,1,iprecon) + raincgath(i)*sday*tminv
981 enddo
982 endif
983
984 C **********************************************************************
985 C **** Fill Rainfall and Snowfall Arrays for Land Surface Model ****
986 C **** Note: Precip Rates work when DT(turb)<DT(moist) ****
987 C **********************************************************************
988
989 do j = 1,jm
990 do i = 1,im
991 rainlsp (i,j) = rainlsp (i,j) + lsp_new(i,j)*tminv
992 rainconv(i,j) = rainconv(i,j) + conv_new(i,j)*tminv
993 snowfall(i,j) = snowfall(i,j) + snow_new(i,j)*tminv
994 enddo
995 enddo
996
997 C **********************************************************************
998 C *** Compute Time-averaged Quantities for Radiation ***
999 C *** CPEN => Cloud Fraction from RAS ***
1000 C *** CLDLS => Cloud Fraction from RNEVP ***
1001 C **********************************************************************
1002
1003 do j = 1,jm
1004 do i = 1,im
1005 cldhi (i,j) = 0.
1006 cldmid(i,j) = 0.
1007 cldlow(i,j) = 0.
1008 cldtmp(i,j) = 0.
1009 cldprs(i,j) = 0.
1010 tmpimjm(i,j) = 0.
1011 enddo
1012 enddo
1013
1014 c Set Moist-Process Memory Coefficient
1015 c ------------------------------------
1016 cldras_mem = 1.0-tmstp/ 3600.0
1017 cldlsp_mem = 1.0-tmstp/(3600.0*3)
1018
1019 do L = 1,lm
1020 do i = 1,im*jm
1021 plev = sig(L)*pz(i,1)+ptop
1022
1023 c Compute Time-averaged Cloud and Water Amounts for Longwave Radiation
1024 c --------------------------------------------------------------------
1025 watnow = cldwater(i,1,L)
1026 if( plev.le.500.0 ) then
1027 cldras = min( max( cldras_lw(i,1,L)*cldras_mem,cpen(i,1,L)),1.0)
1028 else
1029 cldras = 0.0
1030 endif
1031 cldlsp = min( max( cldlsp_lw(i,1,L)*cldlsp_mem,cldls(i,1,L)),1.0)
1032
1033 if( cldras.lt.cldmin ) cldras = 0.0
1034 if( cldlsp.lt.cldmin ) cldlsp = 0.0
1035
1036 cldnow = max( cldlsp,cldras )
1037
1038 lwlz(i,1,L) = ( nlwlz*lwlz(i,1,L) + watnow)/(nlwlz +1)
1039 cldtot_lw(i,1,L) = (nlwcld*cldtot_lw(i,1,L) + cldnow)/(nlwcld+1)
1040 cldlsp_lw(i,1,L) = (nlwcld*cldlsp_lw(i,1,L) + cldlsp)/(nlwcld+1)
1041 cldras_lw(i,1,L) = (nlwcld*cldras_lw(i,1,L) + cldras)/(nlwcld+1)
1042
1043
1044 c Compute Time-averaged Cloud and Water Amounts for Shortwave Radiation
1045 c ---------------------------------------------------------------------
1046 watnow = cldwater(i,1,L)
1047 if( plev.le.500.0 ) then
1048 cldras = min( max(cldras_sw(i,1,L)*cldras_mem, cpen(i,1,L)),1.0)
1049 else
1050 cldras = 0.0
1051 endif
1052 cldlsp = min( max(cldlsp_sw(i,1,L)*cldlsp_mem,cldls(i,1,L)),1.0)
1053
1054 if( cldras.lt.cldmin ) cldras = 0.0
1055 if( cldlsp.lt.cldmin ) cldlsp = 0.0
1056
1057 cldnow = max( cldlsp,cldras )
1058
1059 swlz(i,1,L) = ( nswlz*swlz(i,1,L) + watnow)/(nswlz +1)
1060 cldtot_sw(i,1,L) = (nswcld*cldtot_sw(i,1,L) + cldnow)/(nswcld+1)
1061 cldlsp_sw(i,1,L) = (nswcld*cldlsp_sw(i,1,L) + cldlsp)/(nswcld+1)
1062 cldras_sw(i,1,L) = (nswcld*cldras_sw(i,1,L) + cldras)/(nswcld+1)
1063
1064
1065 c Compute Instantaneous Low-Mid-High Maximum Overlap Cloud Fractions
1066 c ----------------------------------------------------------------------
1067
1068 if( L.lt.midlevel ) cldhi (i,1) = max( cldnow,cldhi (i,1) )
1069 if( L.ge.midlevel .and.
1070 . L.lt.lowlevel ) cldmid(i,1) = max( cldnow,cldmid(i,1) )
1071 if( L.ge.lowlevel ) cldlow(i,1) = max( cldnow,cldlow(i,1) )
1072
1073 c Compute Cloud-Top Temperature and Pressure
1074 c ------------------------------------------
1075 cldtmp(i,1) = cldtmp(i,1) + cldnow*pkzgather(i,L)
1076 . * ( tz(i,1,L) + dtmoist(i,1,L)*tmstp/pz(i,1) )
1077 cldprs(i,1) = cldprs(i,1) + cldnow*plev
1078 tmpimjm(i,1) = tmpimjm(i,1) + cldnow
1079
1080 enddo
1081 enddo
1082
1083 c Compute Instantanious Total 2-D Cloud Fraction
1084 c ----------------------------------------------
1085 do j = 1,jm
1086 do i = 1,im
1087 totcld(i,j) = 1.0 - (1.-cldhi (i,j))
1088 . * (1.-cldmid(i,j))
1089 . * (1.-cldlow(i,j))
1090 enddo
1091 enddo
1092
1093
1094 C **********************************************************************
1095 C *** Fill Cloud Top Pressure and Temperature Diagnostic ***
1096 C **********************************************************************
1097
1098 if(icldtmp.gt.0) then
1099 do j = 1,jm
1100 do i = 1,im
1101 if( cldtmp(i,j).gt.0.0 ) then
1102 qdiag(i,j,icldtmp) = qdiag(i,j,icldtmp) +
1103 . cldtmp(i,j)*totcld(i,j)/tmpimjm(i,j)
1104 qdiag(i,j,icttcnt) = qdiag(i,j,icttcnt) + totcld(i,j)
1105 endif
1106 enddo
1107 enddo
1108 endif
1109
1110 if(icldprs.gt.0) then
1111 do j = 1,jm
1112 do i = 1,im
1113 if( cldprs(i,j).gt.0.0 ) then
1114 qdiag(i,j,icldprs) = qdiag(i,j,icldprs) +
1115 . cldprs(i,j)*totcld(i,j)/tmpimjm(i,j)
1116 qdiag(i,j,ictpcnt) = qdiag(i,j,ictpcnt) + totcld(i,j)
1117 endif
1118 enddo
1119 enddo
1120 endif
1121
1122 C **********************************************************************
1123 C **** INCREMENT COUNTERS ****
1124 C **********************************************************************
1125
1126 nlwlz = nlwlz + 1
1127 nswlz = nswlz + 1
1128
1129 nlwcld = nlwcld + 1
1130 nswcld = nswcld + 1
1131
1132 nmoistt = nmoistt + 1
1133 nmoistq = nmoistq + 1
1134 npreacc = npreacc + 1
1135 nprecon = nprecon + 1
1136
1137 ncldmas = ncldmas + 1
1138 ndtrain = ndtrain + 1
1139
1140 ndtls = ndtls + 1
1141 ndqls = ndqls + 1
1142
1143 RETURN
1144 END
1145 SUBROUTINE RAS( NN, LEN, LENC, K, NLTOP, nlayr, DT
1146 *, UOI, ntracer, POI, QOI, PRS, PRJ, rnd, ncrnd
1147 *, RAINS, CLN, CLF, cldmas, detrain
1148 *, cp,grav,rkappa,alhl,rhfrac,rasmax )
1149 C
1150 C*********************************************************************
1151 C*********************** ARIES MODEL *******************************
1152 C********************* SUBROUTINE RAS *****************************
1153 C********************** 16 MARCH 1988 ******************************
1154 C*********************************************************************
1155 C
1156 PARAMETER (KRMIN=01)
1157 PARAMETER (ICM=1000)
1158 PARAMETER (CMB2PA=100.0)
1159 PARAMETER (rknob = 10.)
1160 C
1161 integer ntracer
1162 integer nltop,nlayr
1163 DIMENSION UOI(len,nlayr,ntracer), POI(len,K)
1164 DIMENSION QOI(len,K), PRS(len,K+1), PRJ(len,K+1)
1165 dimension rnd(ncrnd)
1166 C
1167 DIMENSION RAINS(len,K), CLN(len,K), CLF(len,K)
1168 DIMENSION cldmas(len,K), detrain(len,K)
1169 DIMENSION TCU(len,K), QCU(len,K)
1170 real ucu(len,K,ntracer)
1171 DIMENSION ALF(len,K), BET(len,K), GAM(len,K)
1172 *, ETA(len,K), HOI(len,K)
1173 *, PRH(len,K), PRI(len,K)
1174 DIMENSION HST(len,K), QOL(len,K), GMH(len,K)
1175
1176 DIMENSION TX1(len), TX2(len), TX3(len), TX4(len), TX5(len)
1177 *, TX6(len), TX7(len), TX8(len), TX9(len)
1178 *, TX11(len), TX12(len), TX13(len), TX14(len,ntracer)
1179 *, TX15(len), TX16(len)
1180 *, WFN(len), IA1(len), IA2(len), IA3(len)
1181 DIMENSION cloudn(len), pcu(len)
1182
1183 real rhfrac(len),rasmax
1184
1185 DIMENSION IC(ICM), IRND(icm)
1186 dimension cmass(len,K)
1187 LOGICAL SETRAS
1188
1189 do L = 1,k
1190 do I = 1,LENC
1191 rains(i,l) = 0.
1192 enddo
1193 enddo
1194
1195 p00 = 1000.
1196 crtmsf = 0.
1197
1198 C The numerator here is the fraction of the subcloud layer mass flux
1199 C allowed to entrain into the cloud
1200
1201 CCC FRAC = 1./dt
1202 FRAC = 0.5/dt
1203
1204 KM1 = K - 1
1205 KP1 = K + 1
1206 C we want the ras adjustment time scale to be one hour (indep of dt)
1207 RASBLF = 1./3600.
1208 C
1209 KPRV = KM1
1210 C Removed KRMAX parameter
1211 KCR = MIN(KM1,nlayr-2)
1212 KFX = KM1 - KCR
1213 NCMX = KFX + NCRND
1214 C
1215 IF (KFX .GT. 0) THEN
1216 DO NC=1,KFX
1217 IC(NC) = K - NC
1218 ENDDO
1219 ENDIF
1220 C
1221 IF (NCRND .GT. 0) THEN
1222 DO I=1,ncrnd
1223 IRND(I) = (RND(I)-0.0005)*(KCR-KRMIN+1)
1224 IRND(I) = IRND(I) + KRMIN
1225 ENDDO
1226 C
1227 DO NC=1,NCRND
1228 IC(KFX+NC) = IRND(NC)
1229 ENDDO
1230 ENDIF
1231 C
1232 DO 100 NC=1,NCMX
1233 C
1234 IF (NC .EQ. 1 ) THEN
1235 SETRAS = .TRUE.
1236 ELSE
1237 SETRAS = .FALSE.
1238 ENDIF
1239 IB = IC(NC)
1240
1241 c Initialize Cloud Fraction Array
1242 c -------------------------------
1243 do i = 1,lenc
1244 cloudn(i) = 0.0
1245 enddo
1246
1247 CALL CLOUD(nn,LEN, LENC, K, NLTOP, nlayr, IB, RASBLF,SETRAS,FRAC
1248 *, CP, ALHL, RKAPPA, GRAV, P00, CRTMSF
1249 *, POI, QOI, UOI, Ntracer, PRS, PRJ
1250 *, PCU, CLOUDN, TCU, QCU, UCU, CMASS
1251 *, ALF, BET, GAM, PRH, PRI, HOI, ETA
1252 *, HST, QOL, GMH
1253 *, TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9
1254 *, WFN, TX11, TX12, TX13, TX14, TX15
1255 *, IA1,IA2,IA3,rhfrac)
1256
1257 C Compute fraction of grid box into which rain re-evap occurs (clf)
1258 c -----------------------------------------------------------------
1259 do i = 1,lenc
1260
1261 c mass in detrainment layer
1262 c -------------------------
1263 tx1(i) = cmb2pa * (prs(i,ib+1) - prs(i,ib))/(grav*dt)
1264
1265 c ratio of detraining cloud mass to mass in detrainment layer
1266 c -----------------------------------------------------------
1267 tx1(i) = rhfrac(i)*rknob * cmass(i,ib) / tx1(i)
1268 if(cmass(i,K).gt.0.) clf(i,ib) = clf(i,ib) + tx1(i)
1269 if( clf(i,ib).gt.1.) clf(i,ib) = 1.
1270 enddo
1271
1272 c Compute Total Cloud Mass Flux
1273 c *****************************
1274 do L=ib,k
1275 do i=1,lenc
1276 cmass(i,L) = rhfrac(i)*cmass(i,L) * dt
1277 enddo
1278 enddo
1279
1280 do L=ib,k
1281 do i=1,lenc
1282 cldmas(i,L) = cldmas(i,L) + cmass(i,L)
1283 enddo
1284 enddo
1285
1286 do i=1,lenc
1287 detrain(i,ib) = detrain(i,ib) + cmass(i,ib)
1288 enddo
1289
1290 DO L=IB,K
1291 DO I=1,LENC
1292 POI(I,L) = POI(I,L) + TCU(I,L) * DT * rhfrac(i)
1293 QOI(I,L) = QOI(I,L) + QCU(I,L) * DT * rhfrac(i)
1294 ENDDO
1295 ENDDO
1296 DO NT=1,Ntracer
1297 DO L=IB,K
1298 DO I=1,LENC
1299 UOI(I,L+nltop-1,NT)=UOI(I,L+nltop-1,NT)+UCU(I,L,NT)*DT*rhfrac(i)
1300 ENDDO
1301 ENDDO
1302 ENDDO
1303 DO I=1,LENC
1304 rains(I,ib) = rains(I,ib) + PCU(I)*dt * rhfrac(i)
1305 ENDDO
1306
1307 100 CONTINUE
1308
1309 c Fill Convective Cloud Fractions based on 3-D Rain Amounts
1310 c ---------------------------------------------------------
1311 do L=k-1,1,-1
1312 do i=1,lenc
1313 tx1(i) = 100*(prs(i,L+1)-prs(i,L))/grav
1314 cln(i,L) = min(1600*rains(i,L)/tx1(i),rasmax )
1315 enddo
1316 enddo
1317
1318 RETURN
1319 END
1320
1321 subroutine rndcloud (iras,nrnd,rnd,myid)
1322 implicit none
1323 integer n,iras,nrnd,myid
1324 real random_numbx
1325 real rnd(nrnd)
1326 integer irm
1327 parameter (irm = 1000)
1328 real random(irm)
1329 integer i,mcheck,numrand,iseed,index
1330 logical first
1331 data first /.true./
1332 integer iras0
1333 data iras0 /0/
1334 save random, iras0
1335
1336 if(nrnd.eq.0.)then
1337 do i = 1,nrnd
1338 rnd(i) = 0
1339 enddo
1340 if(first .and. myid.eq.0) print *,' NO RANDOM CLOUDS IN RAS '
1341 go to 100
1342 endif
1343
1344 mcheck = mod(iras-1,irm/nrnd)
1345
1346 c First Time In From a Continuing RESTART (IRAS.GT.1) or Reading a New RESTART
1347 c ----------------------------------------------------------------------------
1348 if( first.and.(iras.gt.1) .or. iras.ne.iras0+1 )then
1349 if( myid.eq.0 ) print *, 'Recreating Rand Numb Array in RNDCLOUD'
1350 if( myid.eq.0 ) print *, 'IRAS: ',iras,' IRAS0: ',iras0
1351 numrand = mod(iras,irm/nrnd) * nrnd
1352 iseed = iras * nrnd - numrand
1353 call random_seedx(iseed)
1354 do i = 1,irm
1355 random(i) = random_numbx()
1356 enddo
1357 index = (iras-1)*nrnd
1358
1359 c Multiple Time In But have Used Up all 1000 numbers (MCHECK.EQ.0)
1360 c ----------------------------------------------------------------
1361 else if (mcheck.eq.0) then
1362 iseed = (iras-1)*nrnd
1363 call random_seedx(iseed)
1364 do i = 1,irm
1365 random(i) = random_numbx()
1366 enddo
1367 index = iseed
1368
1369 c Multiple Time In But have NOT Used Up all 1000 numbers (MCHECK.NE.0)
1370 c --------------------------------------------------------------------
1371 else
1372 index = (iras-1)*nrnd
1373 endif
1374
1375 index = mod(index,irm)
1376 if( index+nrnd.gt.1000 ) index=1000-nrnd
1377
1378 do n = 1,nrnd
1379 rnd(n) = random(index+n)
1380 enddo
1381
1382 100 continue
1383 first = .false.
1384 iras0 = iras
1385 return
1386 end
1387
1388 real function random_numbx()
1389 implicit none
1390 #if CRAY
1391 real ranf
1392 random_numbx = ranf()
1393 #endif
1394 #if SGI
1395 real rand
1396 random_numbx = rand()
1397 #endif
1398 return
1399 end
1400 subroutine random_seedx (iseed)
1401 implicit none
1402 integer iseed
1403 #if CRAY
1404 call ranset (iseed)
1405 #endif
1406 #if SGI
1407 integer*4 seed
1408 seed = iseed
1409 call srand (seed)
1410 #endif
1411 return
1412 end
1413
1414 SUBROUTINE CLOUD(nn,LEN, LENC, K, NLTOP, nlayr, IC, RASALF,
1415 *, SETRAS, FRAC
1416 *, CP, ALHL, RKAP, GRAV, P00, CRTMSF
1417 *, POI, QOI, UOI, Ntracer, PRS, PRJ
1418 *, PCU, CLN, TCU, QCU, UCU, CMASS
1419 *, ALF, BET, GAM, PRH, PRI, HOL, ETA
1420 *, HST, QOL, GMH
1421 *, TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, ALM
1422 *, WFN, AKM, QS1, CLF, UHT, WLQ
1423 *, IA, I1, I2,rhfrac)
1424 C
1425 C*********************************************************************
1426 C******************** Relaxed Arakawa-Schubert ***********************
1427 C********************* Plug Compatible Version **********************
1428 C************************ SUBROUTINE CLOUD ***************************
1429 C************************* 23 JULY 1992 ***************************
1430 C*********************************************************************
1431 C*********************************************************************
1432 C*********************************************************************
1433 C************************** Developed By *****************************
1434 C************************** *****************************
1435 C************************ Shrinivas Moorthi **************************
1436 C************************ and **************************
1437 C************************ Max J. Suarez *****************************
1438 C************************ *****************************
1439 C******************** Laboratory for Atmospheres *********************
1440 C****************** NASA/GSFC, Greenbelt, MD 20771 *******************
1441 C*********************************************************************
1442 C*********************************************************************
1443 C
1444 C The calculations of Moorthi and Suarez (1992, MWR) are
1445 C contained in the CLOUD routine.
1446 C It is probably advisable, at least initially, to treat CLOUD
1447 C as a black box that computes the single cloud adjustments. RAS,
1448 C on the other hand, can be tailored to each GCMs configuration
1449 C (ie, number and placement of levels, nature of boundary layer,
1450 C time step and frequency with which RAS is called).
1451 C
1452 C
1453 C Input:
1454 C ------
1455 C
1456 C LEN : The inner dimension of update and input arrays.
1457 C
1458 C LENC : The run: the number of soundings processes in a single call.
1459 C RAS works on the first LENC of the LEN soundings
1460 C passed. This allows working on pieces of the world
1461 C say for multitasking, without declaring temporary arrays
1462 C and copying the data to and from them. This is an f77
1463 C version. An F90 version would have to allow more
1464 C flexibility in the argument declarations. Obviously
1465 C (LENC<=LEN).
1466 C
1467 C K : Number of vertical layers (increasing downwards).
1468 C Need not be the same as the number of layers in the
1469 C GCM, since it is the outer dimension. The bottom layer
1470 C (K) is the subcloud layer.
1471 C
1472 C IC : Detrainment level to check for presence of convection
1473 C
1474 C RASALF : Relaxation parameter (< 1.) for present cloud-type
1475 C
1476 C SETRAS : Logical parameter to control re-calculation of
1477 C saturation specific humidity and mid level P**kappa
1478 C
1479 C FRAC : Fraction of the PBL (layer K) mass allowed to be used
1480 C by a cloud-type in time DT
1481 C
1482 C CP : Specific heat at constant pressure
1483 C
1484 C ALHL : Latent Heat of condensation
1485 C
1486 C RKAP : R/Cp, where R is the gas constant
1487 C
1488 C GRAV : Acceleration due to gravity
1489 C
1490 C P00 : A reference pressure in hPa, useually 1000 hPa
1491 C
1492 C CRTMSF : Critical value of mass flux above which cloudiness at
1493 C the detrainment layer of that cloud-type is assumed.
1494 C Affects only cloudiness calculation.
1495 C
1496 C POI : 2D array of dimension (LEN,K) containing potential
1497 C temperature. Updated but not initialized by RAS.
1498 C
1499 C QOI : 2D array of dimension (LEN,K) containing specific
1500 C humidity. Updated but not initialized by RAS.
1501 C
1502 C UOI : 3D array of dimension (LEN,K,NTRACER) containing tracers
1503 C Updated but not initialized by RAS.
1504 C
1505 C PRS : 2D array of dimension (LEN,K+1) containing pressure
1506 C in hPa at the interfaces of K-layers from top of the
1507 C atmosphere to the bottom. Not modified.
1508 C
1509 C PRJ : 2D array of dimension (LEN,K+1) containing (PRS/P00) **
1510 C RKAP. i.e. Exner function at layer edges. Not modified.
1511 C
1512 C rhfrac : 1D array of dimension (LEN) containing a rel.hum. scaling
1513 C fraction. Not modified.
1514 C
1515 C Output:
1516 C -------
1517 C
1518 C PCU : 1D array of length LEN containing accumulated
1519 C precipitation in mm/sec.
1520 C
1521 C CLN : 2D array of dimension (LEN,K) containing cloudiness
1522 C Note: CLN is bumped but NOT initialized
1523 C
1524 C TCU : 2D array of dimension (LEN,K) containing accumulated
1525 C convective heating (K/sec).
1526 C
1527 C QCU : 2D array of dimension (LEN,K) containing accumulated
1528 C convective drying (kg/kg/sec).
1529 C
1530 C CMASS : 2D array of dimension (LEN,K) containing the
1531 C cloud mass flux (kg/sec). Filled from cloud top
1532 C to base.
1533 C
1534 C Temporaries:
1535 C
1536 C ALF, BET, GAM, ETA, PRH, PRI, HOI, HST, QOL, GMH are temporary
1537 C 2D real arrays of dimension of at least (LENC,K) where LENC is
1538 C the horizontal dimension over which convection is invoked.
1539 C
1540 C
1541 C TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, AKM, QS1, CLF, UHT
1542 C VHT, WLQ WFN are temporary real arrays of length at least LENC
1543 C
1544 C IA, I1, and I2 are temporary integer arrays of length LENC
1545 C
1546 C
1547 C************************************************************************
1548 C
1549 C
1550
1551 PARAMETER (DAYLEN=86400.0, HALF=0.5, ONE=1.0, ZERO=0.0)
1552 PARAMETER (CMB2PA=100.0)
1553 PARAMETER (RHMAX=0.9999)
1554 C
1555 integer nltop,ntracer,nlayr
1556 DIMENSION POI(LEN,K), QOI(LEN,K), PRS(LEN,K+1)
1557 *, PRJ(LEN,K+1)
1558 *, TCU(LEN,K), QCU(LEN,K), CMASS(LEN,K), CLN(LEN)
1559 real uoi(len,nlayr,ntracer)
1560 DIMENSION ALF(LEN,K), BET(LEN,K), GAM(LEN,K)
1561 *, PRH(LEN,K), PRI(LEN,K)
1562 DIMENSION AKM(LENC), WFN(LENC)
1563 DIMENSION HOL(LENC,K), QOL(LENC,K), ETA(LENC,K), HST(LENC,K)
1564 *, GMH(LENC,K), ALM(LENC), WLQ(LENC), QS1(LENC)
1565 *, TX1(LENC), TX2(LENC), TX3(LENC), TX4(LENC)
1566 *, TX5(LENC), TX6(LENC), TX7(LENC), TX8(LENC)
1567 *, CLF(LENC), PCU(LENC)
1568 DIMENSION IA(LENC), I1(LENC), I2(LENC)
1569 real rhfrac(len)
1570 real ucu(len,k,ntracer),uht(len,ntracer)
1571 LOGICAL SETRAS
1572
1573 integer nt
1574
1575 c Explicit Inline Directives
1576 c --------------------------
1577 #if CRAY
1578 #if f77
1579 cfpp$ expand (qsat)
1580 #endif
1581 #endif
1582
1583 RKAPP1 = 1.0 + RKAP
1584 ONEBCP = 1.0 / CP
1585 ALBCP = ALHL * ONEBCP
1586 ONEBG = 1.0 / GRAV
1587 CPBG = CP * ONEBG
1588 TWOBAL = 2.0 / ALHL
1589 C
1590 KM1 = K - 1
1591 IC1 = IC + 1
1592 C
1593 C SETTIING ALF, BET, GAM, PRH, AND PRI : DONE ONLY WHEN SETRAS=.T.
1594 C
1595
1596 IF (SETRAS) THEN
1597
1598 DO 2050 L=1,K
1599 DO 2030 I=1,LENC
1600 PRH(I,L) = (PRJ(I,L+1)*PRS(I,L+1) - PRJ(I,L)*PRS(I,L))
1601 * / ((PRS(I,L+1)-PRS(I,L)) * RKAPP1)
1602 2030 CONTINUE
1603 2050 CONTINUE
1604
1605 DO 2070 L=1,K
1606 DO 2060 I=1,LENC
1607 TX5(I) = POI(I,L) * PRH(I,L)
1608 TX1(I) = (PRS(I,L) + PRS(I,L+1)) * 0.5
1609 TX3(I) = TX5(I)
1610 CALL QSAT(TX3(I), TX1(I), TX2(I), TX4(I), .TRUE.)
1611 ALF(I,L) = TX2(I) - TX4(I) * TX5(I)
1612 BET(I,L) = TX4(I) * PRH(I,L)
1613 GAM(I,L) = 1.0 / ((1.0 + TX4(I)*ALBCP) * PRH(I,L))
1614 PRI(I,L) = (CP/CMB2PA) / (PRS(I,L+1) - PRS(I,L))
1615 2060 CONTINUE
1616 2070 CONTINUE
1617
1618 ENDIF
1619 C
1620 C
1621 DO 10 L=1,K
1622 DO 10 I=1,LEN
1623 TCU(I,L) = 0.0
1624 QCU(I,L) = 0.0
1625 CMASS(I,L) = 0.0
1626 10 CONTINUE
1627
1628 do nt = 1,ntracer
1629 do L=1,K
1630 do I=1,LENC
1631 ucu(I,L,nt) = 0.0
1632 enddo
1633 enddo
1634 enddo
1635 C
1636 DO 30 I=1,LENC
1637 TX1(I) = PRJ(I,K+1) * POI(I,K)
1638 QS1(I) = ALF(I,K) + BET(I,K)*POI(I,K)
1639 QOL(I,K) = MIN(QS1(I)*RHMAX,QOI(I,K))
1640
1641 HOL(I,K) = TX1(I)*CP + QOL(I,K)*ALHL
1642 ETA(I,K) = ZERO
1643 TX2(I) = (PRJ(I,K+1) - PRJ(I,K)) * POI(I,K) * CP
1644 30 CONTINUE
1645 C
1646 IF (IC .LT. KM1) THEN
1647 DO 3703 L=KM1,IC1,-1
1648 DO 50 I=1,LENC
1649 QS1(I) = ALF(I,L) + BET(I,L)*POI(I,L)
1650 QOL(I,L) = MIN(QS1(I)*RHMAX,QOI(I,L))
1651 C
1652 TEM1 = TX2(I) + PRJ(I,L+1) * POI(I,L) * CP
1653 HOL(I,L) = TEM1 + QOL(I,L )* ALHL
1654 HST(I,L) = TEM1 + QS1(I) * ALHL
1655
1656 TX1(I) = (PRJ(I,L+1) - PRJ(I,L)) * POI(I,L)
1657 ETA(I,L) = ETA(I,L+1) + TX1(I)*CPBG
1658 TX2(I) = TX2(I) + TX1(I)*CP
1659 50 CONTINUE
1660 C
1661 3703 CONTINUE
1662 ENDIF
1663
1664
1665 DO 70 I=1,LENC
1666 HOL(I,IC) = TX2(I)
1667 QS1(I) = ALF(I,IC) + BET(I,IC)*POI(I,IC)
1668 QOL(I,IC) = MIN(QS1(I)*RHMAX,QOI(I,IC))
1669 c
1670 TEM1 = TX2(I) + PRJ(I,IC1) * POI(I,IC) * CP
1671 HOL(I,IC) = TEM1 + QOL(I,IC) * ALHL
1672 HST(I,IC) = TEM1 + QS1(I) * ALHL
1673 C
1674 TX3(I ) = (PRJ(I,IC1) - PRH(I,IC)) * POI(I,IC)
1675 ETA(I,IC) = ETA(I,IC1) + CPBG * TX3(I)
1676 70 CONTINUE
1677 C
1678 DO 130 I=1,LENC
1679 TX2(I) = HOL(I,K) - HST(I,IC)
1680 TX1(I) = ZERO
1681
1682 130 CONTINUE
1683 C
1684 C ENTRAINMENT PARAMETER
1685 C
1686 DO 160 L=IC,KM1
1687 DO 160 I=1,LENC
1688 TX1(I) = TX1(I) + (HST(I,IC) - HOL(I,L)) * (ETA(I,L) - ETA(I,L+1))
1689 160 CONTINUE
1690 C
1691 LEN1 = 0
1692 LEN2 = 0
1693 ISAV = 0
1694 DO 195 I=1,LENC
1695 IF (TX1(I) .GT. ZERO .AND. TX2(I) .GT. ZERO
1696 . .AND. rhfrac(i).ne.0.0 ) THEN
1697 LEN1 = LEN1 + 1
1698 IA(LEN1) = I
1699 ALM(LEN1) = TX2(I) / TX1(I)
1700 ENDIF
1701 195 CONTINUE
1702 C
1703 LEN2 = LEN1
1704 if (IC1 .lt. K) then
1705 DO 196 I=1,LENC
1706 IF (TX2(I) .LE. 0.0 .AND. (HOL(I,K) .GT. HST(I,IC1))
1707 . .AND. rhfrac(i).ne.0.0 ) THEN
1708 LEN2 = LEN2 + 1
1709 IA(LEN2) = I
1710 ALM(LEN2) = 0.0
1711 ENDIF
1712 196 CONTINUE
1713 endif
1714 C
1715 IF (LEN2 .EQ. 0) THEN
1716 DO 5010 I=1,LENC*K
1717 HST(I,1) = 0.0
1718 QOL(I,1) = 0.0
1719 5010 CONTINUE
1720 DO 5020 I=1,LENC
1721 PCU(I) = 0.0
1722 5020 CONTINUE
1723 RETURN
1724 ENDIF
1725 LEN11 = LEN1 + 1
1726 C
1727 C NORMALIZED MASSFLUX
1728 C
1729 DO 250 I=1,LEN2
1730 ETA(I,K) = 1.0
1731 II = IA(I)
1732 TX2(I) = 0.5 * (PRS(II,IC) + PRS(II,IC1))
1733 TX4(I) = PRS(II,K)
1734 250 CONTINUE
1735 C
1736 DO 252 I=LEN11,LEN2
1737 WFN(I) = 0.0
1738 II = IA(I)
1739 IF (HST(II,IC1) .LT. HST(II,IC)) THEN
1740 TX6(I) = (HST(II,IC1)-HOL(II,K))/(HST(II,IC1)-HST(II,IC))
1741 ELSE
1742 TX6(I) = 0.0
1743 ENDIF
1744 TX2(I) = 0.5 * (PRS(II,IC1)+PRS(II,IC1+1)) * (1.0-TX6(I))
1745 * + TX2(I) * TX6(I)
1746 252 CONTINUE
1747 C
1748 CALL ACRITN(LEN2, TX2, TX4, TX3)
1749 C
1750 DO 260 L=KM1,IC,-1
1751 DO 255 I=1,LEN2
1752 TX1(I) = ETA(IA(I),L)
1753 255 CONTINUE
1754 DO 260 I=1,LEN2
1755 ETA(I,L) = 1.0 + ALM(I) * TX1(I)
1756 260 CONTINUE
1757 C
1758 C CLOUD WORKFUNCTION
1759 C
1760 IF (LEN1 .GT. 0) THEN
1761 DO 270 I=1,LEN1
1762 II = IA(I)
1763 WFN(I) = - GAM(II,IC) * (PRJ(II,IC1) - PRH(II,IC))
1764 * * HST(II,IC) * ETA(I,IC1)
1765 270 CONTINUE
1766 ENDIF
1767 C
1768 DO 290 I=1,LEN2
1769 II = IA(I)
1770 TX1(I) = HOL(II,K)
1771 290 CONTINUE
1772 C
1773 IF (IC1 .LE. KM1) THEN
1774
1775 DO 380 L=KM1,IC1,-1
1776 DO 380 I=1,LEN2
1777 II = IA(I)
1778 TEM = TX1(I) + (ETA(I,L) - ETA(I,L+1)) * HOL(II,L)
1779 C
1780 PCU(I) = PRJ(II,L+1) - PRH(II,L)
1781 TEM1 = ETA(I,L+1) * PCU(I)
1782 TX1(I) = TX1(I)*PCU(I)
1783 C
1784 PCU(I) = PRH(II,L) - PRJ(II,L)
1785 TEM1 = (TEM1 + ETA(I,L) * PCU(I)) * HST(II,L)
1786 TX1(I) = TX1(I) + TEM*PCU(I)
1787 C
1788 WFN(I) = WFN(I) + (TX1(I) - TEM1) * GAM(II,L)
1789 TX1(I) = TEM
1790 380 CONTINUE
1791 ENDIF
1792 C
1793 LENA = 0
1794 IF (LEN1 .GT. 0) THEN
1795 DO 512 I=1,LEN1
1796 II = IA(I)
1797 WFN(I) = WFN(I) + TX1(I) * GAM(II,IC)*(PRJ(II,IC1)-PRH(II,IC))
1798 * - TX3(I)
1799 IF (WFN(I) .GT. 0.0) THEN
1800 LENA = LENA + 1
1801 I1(LENA) = IA(I)
1802 I2(LENA) = I
1803 TX1(LENA) = WFN(I)
1804 TX2(LENA) = QS1(IA(I))
1805 TX6(LENA) = 1.0
1806 ENDIF
1807 512 CONTINUE
1808 ENDIF
1809 LENB = LENA
1810 DO 515 I=LEN11,LEN2
1811 WFN(I) = WFN(I) - TX3(I)
1812 IF (WFN(I) .GT. 0.0 .AND. TX6(I) .GT. 0.0) THEN
1813 LENB = LENB + 1
1814 I1(LENB) = IA(I)
1815 I2(LENB) = I
1816 TX1(LENB) = WFN(I)
1817 TX2(LENB) = QS1(IA(I))
1818 TX4(LENB) = TX6(I)
1819 ENDIF
1820 515 CONTINUE
1821 C
1822 IF (LENB .LE. 0) THEN
1823 DO 5030 I=1,LENC*K
1824 HST(I,1) = 0.0
1825 QOL(I,1) = 0.0
1826 5030 CONTINUE
1827 DO 5040 I=1,LENC
1828 PCU(I) = 0.0
1829 5040 CONTINUE
1830 RETURN
1831 ENDIF
1832
1833 C
1834 DO 516 I=1,LENB
1835 WFN(I) = TX1(I)
1836 QS1(I) = TX2(I)
1837 516 CONTINUE
1838 C
1839 DO 520 L=IC,K
1840 DO 517 I=1,LENB
1841 TX1(I) = ETA(I2(I),L)
1842 517 CONTINUE
1843 DO 520 I=1,LENB
1844 ETA(I,L) = TX1(I)
1845 520 CONTINUE
1846 C
1847 LENA1 = LENA + 1
1848 C
1849 DO 510 I=1,LENA
1850 II = I1(I)
1851 TX8(I) = HST(II,IC) - HOL(II,IC)
1852 510 CONTINUE
1853 DO 530 I=LENA1,LENB
1854 II = I1(I)
1855 TX6(I) = TX4(I)
1856 TEM = TX6(I) * (HOL(II,IC)-HOL(II,IC1)) + HOL(II,IC1)
1857 TX8(I) = HOL(II,K) - TEM
1858
1859 TEM1 = TX6(I) * (QOL(II,IC)-QOL(II,IC1)) + QOL(II,IC1)
1860 TX5(I) = TEM - TEM1 * ALHL
1861 QS1(I) = TEM1 + TX8(I)*(ONE/ALHL)
1862 TX3(I) = HOL(II,IC)
1863 530 CONTINUE
1864 C
1865 C
1866 DO 620 I=1,LENB
1867 II = I1(I)
1868 WLQ(I) = QOL(II,K) - QS1(I) * ETA(I,IC)
1869 TX7(I) = HOL(II,K)
1870 620 CONTINUE
1871 DO NT=1,Ntracer
1872 DO 621 I=1,LENB
1873 II = I1(I)
1874 UHT(I,NT) = UOI(II,K+nltop-1,NT)-UOI(II,IC+nltop-1,NT) * ETA(I,IC)
1875 621 CONTINUE
1876 ENDDO
1877 C
1878 DO 635 L=KM1,IC,-1
1879 DO 630 I=1,LENB
1880 II = I1(I)
1881 TEM = ETA(I,L) - ETA(I,L+1)
1882 WLQ(I) = WLQ(I) + TEM * QOL(II,L)
1883 630 CONTINUE
1884 635 CONTINUE
1885 DO NT=1,Ntracer
1886 DO L=KM1,IC,-1
1887 DO I=1,LENB
1888 II = I1(I)
1889 TEM = ETA(I,L) - ETA(I,L+1)
1890 UHT(I,NT) = UHT(I,NT) + TEM * UOI(II,L+nltop-1,NT)
1891 ENDDO
1892 ENDDO
1893 ENDDO
1894 C
1895 C CALCULATE GS AND PART OF AKM (THAT REQUIRES ETA)
1896 C
1897 DO 690 I=1,LENB
1898 II = I1(I)
1899 c TX7(I) = HOL(II,K)
1900 TEM = (POI(II,KM1) - POI(II,K)) / (PRH(II,K) - PRH(II,KM1))
1901 HOL(I,K) = TEM * (PRJ(II,K)-PRH(II,KM1))*PRH(II,K)*PRI(II,K)
1902 HOL(I,KM1) = TEM * (PRH(II,K)-PRJ(II,K))*PRH(II,KM1)*PRI(II,KM1)
1903 AKM(I) = ZERO
1904 TX2(I) = 0.5 * (PRS(II,IC) + PRS(II,IC1))
1905 690 CONTINUE
1906
1907 IF (IC1 .LE. KM1) THEN
1908 DO 750 L=KM1,IC1,-1
1909 DO 750 I=1,LENB
1910 II = I1(I)
1911 TEM = (POI(II,L-1) - POI(II,L)) * ETA(I,L)
1912 * / (PRH(II,L) - PRH(II,L-1))
1913 C
1914 HOL(I,L) = TEM * (PRJ(II,L)-PRH(II,L-1)) * PRH(II,L)
1915 * * PRI(II,L) + HOL(I,L)
1916 HOL(I,L-1) = TEM * (PRH(II,L)-PRJ(II,L)) * PRH(II,L-1)
1917 * * PRI(II,L-1)
1918 C
1919 AKM(I) = AKM(I) - HOL(I,L)
1920 * * (ETA(I,L) * (PRH(II,L)-PRJ(II,L)) +
1921 * ETA(I,L+1) * (PRJ(II,L+1)-PRH(II,L))) / PRH(II,L)
1922 750 CONTINUE
1923 ENDIF
1924 C
1925 C
1926 CALL RNCL(LENB, TX2, TX1, CLF)
1927
1928 DO 770 I=1,LENB
1929 TX2(I) = (ONE - TX1(I)) * WLQ(I)
1930 WLQ(I) = TX1(I) * WLQ(I)
1931 C
1932 TX1(I) = HOL(I,IC)
1933 770 CONTINUE
1934 DO 790 I=LENA1, LENB
1935 II = I1(I)
1936 TX1(I) = TX1(I) + (TX5(I)-TX3(I)+QOL(II,IC)*ALHL)*(PRI(II,IC)/CP)
1937 790 CONTINUE
1938
1939 DO 800 I=1,LENB
1940 HOL(I,IC) = TX1(I) - TX2(I) * ALBCP * PRI(I1(I),IC)
1941 800 CONTINUE
1942
1943 IF (LENA .GT. 0) THEN
1944 DO 810 I=1,LENA
1945 II = I1(I)
1946 AKM(I) = AKM(I) - ETA(I,IC1) * (PRJ(II,IC1) - PRH(II,IC))
1947 * * TX1(I) / PRH(II,IC)
1948 810 CONTINUE
1949 ENDIF
1950 c
1951 C CALCULATE GH
1952 C
1953 DO 830 I=1,LENB
1954 II = I1(I)
1955 TX3(I) = QOL(II,KM1) - QOL(II,K)
1956 GMH(I,K) = HOL(I,K) + TX3(I) * PRI(II,K) * (ALBCP)
1957
1958 AKM(I) = AKM(I) + GAM(II,KM1)*(PRJ(II,K)-PRH(II,KM1))
1959 * * GMH(I,K)
1960 TX3(I) = zero
1961 830 CONTINUE
1962 C
1963 IF (IC1 .LE. KM1) THEN
1964 DO 840 L=KM1,IC1,-1
1965 DO 840 I=1,LENB
1966 II = I1(I)
1967 TX2(I) = TX3(I)
1968 TX3(I) = (QOL(II,L-1) - QOL(II,L)) * ETA(I,L)
1969 TX2(I) = TX2(I) + TX3(I)
1970 C
1971 GMH(I,L) = HOL(I,L) + TX2(I) * PRI(II,L) * (ALBCP*HALF)
1972 840 CONTINUE
1973 C
1974 C
1975 ENDIF
1976 DO 850 I=LENA1,LENB
1977 TX3(I) = TX3(I) + TWOBAL
1978 * * (TX7(I) - TX8(I) - TX5(I) - QOL(I1(I),IC)*ALHL)
1979 850 CONTINUE
1980 DO 860 I=1,LENB
1981 GMH(I,IC) = TX1(I) + PRI(I1(I),IC) * ONEBCP
1982 * * (TX3(I)*(ALHL*HALF) + ETA(I,IC) * TX8(I))
1983 860 CONTINUE
1984 C
1985 C CALCULATE HC PART OF AKM
1986 C
1987 IF (IC1 .LE. KM1) THEN
1988 DO 870 I=1,LENB
1989 TX1(I) = GMH(I,K)
1990 870 CONTINUE
1991 DO 3725 L=KM1,IC1,-1
1992 DO 880 I=1,LENB
1993 II = I1(I)
1994 TX1(I) = TX1(I) + (ETA(I,L) - ETA(I,L+1)) * GMH(I,L)
1995 TX2(I) = GAM(II,L-1) * (PRJ(II,L) - PRH(II,L-1))
1996 880 CONTINUE
1997 C
1998 IF (L .EQ. IC1) THEN
1999 DO 890 I=LENA1,LENB
2000 TX2(I) = ZERO
2001 890 CONTINUE
2002 ENDIF
2003 DO 900 I=1,LENB
2004 II = I1(I)
2005 AKM(I) = AKM(I) + TX1(I) *
2006 * (TX2(I) + GAM(II,L)*(PRH(II,L)-PRJ(II,L)))
2007 900 CONTINUE
2008 3725 CONTINUE
2009 ENDIF
2010 C
2011 DO 920 I=LENA1,LENB
2012 II = I1(I)
2013 TX2(I) = 0.5 * (PRS(II,IC) + PRS(II,IC1))
2014 * + 0.5*(PRS(II,IC+2) - PRS(II,IC)) * (ONE-TX6(I))
2015 c
2016 TX1(I) = PRS(II,IC1)
2017 TX5(I) = 0.5 * (PRS(II,IC1) + PRS(II,IC+2))
2018 C
2019 IF ((TX2(I) .GE. TX1(I)) .AND. (TX2(I) .LT. TX5(I))) THEN
2020 TX6(I) = ONE - (TX2(I) - TX1(I)) / (TX5(I) - TX1(I))
2021 C
2022 TEM = PRI(II,IC1) / PRI(II,IC)
2023 HOL(I,IC1) = HOL(I,IC1) + HOL(I,IC) * TEM
2024 HOL(I,IC) = ZERO
2025 C
2026 GMH(I,IC1) = GMH(I,IC1) + GMH(I,IC) * TEM
2027 GMH(I,IC) = ZERO
2028 ELSEIF (TX2(I) .LT. TX1(I)) THEN
2029 TX6(I) = 1.0
2030 ELSE
2031 TX6(I) = 0.0
2032 ENDIF
2033 920 CONTINUE
2034 C
2035 C
2036 DO I=1,LENC
2037 PCU(I) = 0.0
2038 ENDDO
2039
2040 DO 970 I=1,LENB
2041 II = I1(I)
2042 IF (AKM(I) .LT. ZERO .AND. WLQ(I) .GE. 0.0) THEN
2043 WFN(I) = - TX6(I) * WFN(I) * RASALF / AKM(I)
2044 ELSE
2045 WFN(I) = ZERO
2046 ENDIF
2047 TEM = (PRS(II,K+1)-PRS(II,K))*(CMB2PA*FRAC)
2048 WFN(I) = MIN(WFN(I), TEM)
2049 C
2050 C compute cloud amount
2051 C
2052 CC TX1(I) = CLN(II)
2053 CC IF (WFN(I) .GT. CRTMSF) TX1(I) = TX1(I) + CLF(I)
2054 CC IF (TX1(I) .GT. ONE) TX1(I) = ONE
2055 C
2056 C PRECIPITATION
2057 C
2058 PCU(II) = WLQ(I) * WFN(I) * ONEBG
2059 C
2060 C CUMULUS FRICTION AT THE BOTTOM LAYER
2061 C
2062 TX4(I) = WFN(I) * (1.0/ALHL)
2063 TX5(I) = WFN(I) * ONEBCP
2064 970 CONTINUE
2065 C
2066 C compute cloud mass flux for diagnostic output
2067 C
2068 DO L = IC,K
2069 DO I=1,LENB
2070 II = I1(I)
2071 if(L.lt.K)then
2072 CMASS(II,L) = ETA(I,L+1) * WFN(I) * ONEBG
2073 else
2074 CMASS(II,L) = WFN(I) * ONEBG
2075 endif
2076 ENDDO
2077 ENDDO
2078 C
2079 CC DO 975 I=1,LENB
2080 CC II = I1(I)
2081 CC CLN(II) = TX1(I)
2082 CC975 CONTINUE
2083 C
2084 C THETA AND Q CHANGE DUE TO CLOUD TYPE IC
2085 C
2086
2087 c TEMA = 0.0
2088 c TEMB = 0.0
2089 DO 990 L=IC,K
2090 DO 980 I=1,LENB
2091 II = I1(I)
2092 TEM = (GMH(I,L) - HOL(I,L)) * TX4(I)
2093 TEM1 = HOL(I,L) * TX5(I)
2094 C
2095 TCU(II,L) = TEM1 / PRH(II,L)
2096 QCU(II,L) = TEM
2097 980 CONTINUE
2098
2099 c I = I1(IP1)
2100 c
2101 c TEM = (PRS(I,L+1)-PRS(I,L)) * (ONEBG*100.0)
2102 c TEMA = TEMA + TCU(I,L) * PRH(I,L) * TEM * (CP/ALHL)
2103 c TEMB = TEMB + QCU(I,L) * TEM
2104 C
2105 990 CONTINUE
2106 C
2107 c Compute Tracer Tendencies
2108 c -------------------------
2109 do nt = 1,ntracer
2110
2111 c Tracer Tendency at the Bottom Layer
2112 c -----------------------------------
2113 DO 995 I=1,LENB
2114 II = I1(I)
2115 TEM = half*TX5(I) * PRI(II,K)
2116 TX1(I) = (UOI(II,KM1+nltop-1,nt) - UOI(II,K+nltop-1,nt))
2117 ucu(II,K,nt) = TEM * TX1(I)
2118 995 CONTINUE
2119
2120 c Tracer Tendency at all other Levels
2121 c -----------------------------------
2122 DO 1020 L=KM1,IC1,-1
2123 DO 1010 I=1,LENB
2124 II = I1(I)
2125 TEM = half*TX5(I) * PRI(II,L)
2126 TEM1 = TX1(I)
2127 TX1(I) = (UOI(II,L-1+nltop-1,nt)-UOI(II,L+nltop-1,nt)) * ETA(I,L)
2128 TX3(I) = (TX1(I) + TEM1) * TEM
2129 1010 CONTINUE
2130 DO 1020 I=1,LENB
2131 II = I1(I)
2132 ucu(II,L,nt) = TX3(I)
2133 1020 CONTINUE
2134
2135 DO 1030 I=1,LENB
2136 II = I1(I)
2137 IF (TX6(I) .GE. 1.0) THEN
2138 TEM = half*TX5(I) * PRI(II,IC)
2139 ELSE
2140 TEM = 0.0
2141 ENDIF
2142 TX1(I) = (TX1(I) + UHT(I,nt) + UHT(I,nt)) * TEM
2143 1030 CONTINUE
2144 DO 1040 I=1,LENB
2145 II = I1(I)
2146 ucu(II,IC,nt) = TX1(I)
2147 1040 CONTINUE
2148
2149 enddo
2150 C
2151 C PENETRATIVE CONVECTION CALCULATION OVER
2152 C
2153
2154 RETURN
2155 END
2156 SUBROUTINE RNCL(LEN, PL, RNO, CLF)
2157 C
2158 C
2159 C*********************************************************************
2160 C********************** Relaxed Arakawa-Schubert *********************
2161 C************************ SUBROUTINE RNCL ************************
2162 C**************************** 23 July 1992 ***************************
2163 C*********************************************************************
2164
2165 PARAMETER (P5=500.0, P8=800.0, PT8=0.8, PT2=0.2)
2166 PARAMETER (PFAC=PT2/(P8-P5))
2167 C
2168 PARAMETER (P4=400.0, P6=401.0)
2169 PARAMETER (P7=700.0, P9=900.0)
2170 PARAMETER (CUCLD=0.5,CFAC=CUCLD/(P6-P4))
2171 C
2172 DIMENSION PL(LEN), RNO(LEN), CLF(LEN)
2173
2174 DO 10 I=1,LEN
2175 rno(i) = 1.0
2176 ccc if( pl(i).le.400.0 ) rno(i) = max( 0.75, 1.0-0.0025*(400.0-pl(i)) )
2177
2178 ccc IF ( PL(I).GE.P7 .AND. PL(I).LE.P9 ) THEN
2179 ccc RNO(I) = ((P9-PL(I))/(P9-P7)) **2
2180 ccc ELSE IF (PL(I).GT.P9) THEN
2181 ccc RNO(I) = 0.
2182 ccc ENDIF
2183
2184 CLF(I) = CUCLD
2185 C
2186 CARIESIF (PL(I) .GE. P5 .AND. PL(I) .LE. P8) THEN
2187 CARIES RNO(I) = (P8-PL(I))*PFAC + PT8
2188 CARIESELSEIF (PL(I) .GT. P8 ) THEN
2189 CARIES RNO(I) = PT8
2190 CARIESENDIF
2191 CARIES
2192 IF (PL(I) .GE. P4 .AND. PL(I) .LE. P6) THEN
2193 CLF(I) = (P6-PL(I))*CFAC
2194 ELSEIF (PL(I) .GT. P6 ) THEN
2195 CLF(I) = 0.0
2196 ENDIF
2197 10 CONTINUE
2198 C
2199 RETURN
2200 END
2201 SUBROUTINE ACRITN ( LEN,PL,PLB,ACR )
2202
2203 C*********************************************************************
2204 C********************** Relaxed Arakawa-Schubert *********************
2205 C************************** SUBROUTINE ACRIT *********************
2206 C****************** modified August 28, 1996 L.Takacs ************
2207 C**** *****
2208 C**** Note: Data obtained from January Mean After-Analysis *****
2209 C**** from 4x5 46-layer GEOS Assimilation *****
2210 C**** *****
2211 C*********************************************************************
2212
2213 real PL(LEN), PLB(LEN), ACR(LEN)
2214
2215 parameter (lma=18)
2216 real p(lma)
2217 real a(lma)
2218
2219 data p / 93.81, 111.65, 133.46, 157.80, 186.51,
2220 . 219.88, 257.40, 301.21, 352.49, 409.76,
2221 . 471.59, 535.04, 603.33, 672.79, 741.12,
2222 . 812.52, 875.31, 930.20/
2223
2224 data a / 3.35848, 3.13645, 2.48072, 2.08277, 1.53364,
2225 . 1.01971, .65846, .45867, .38687, .31002,
2226 . .25574, .20347, .17254, .15260, .16756,
2227 . .09916, .10360, .05880/
2228
2229
2230 do L=1,lma-1
2231 do i=1,len
2232 if( pl(i).ge.p(L) .and.
2233 . pl(i).le.p(L+1)) then
2234 temp = ( pl(i)-p(L) )/( p(L+1)-p(L) )
2235 acr(i) = a(L+1)*temp + a(L)*(1-temp)
2236 endif
2237 enddo
2238 enddo
2239
2240 do i=1,len
2241 if( pl(i).lt.p(1) ) acr(i) = a(1)
2242 if( pl(i).gt.p(lma) ) acr(i) = a(lma)
2243 enddo
2244
2245 do i=1,len
2246 acr(i) = acr(i) * (plb(i)-pl(i))
2247 enddo
2248
2249 RETURN
2250 END
2251 SUBROUTINE RNEVP(NN,IRUN,NLAY,TL,QL,RAIN,PL,CLFRAC,SP,DSIG,PLKE,
2252 1 PLK,TH,TEMP1,TEMP2,TEMP3,ITMP1,ITMP2,RCON,RLAR,CLSBTH,tmscl,
2253 2 tmfrc,cp,gravity,alhl,gamfac,cldlz,RHCRIT,offset,alpha)
2254
2255 PARAMETER (ZM1P04 = -1.04E-4 )
2256 PARAMETER (ZERO = 0.)
2257 PARAMETER (TWO89= 2.89E-5)
2258 PARAMETER ( ZP44= 0.44)
2259 PARAMETER ( ZP01= 0.01)
2260 PARAMETER ( ZP1 = 0.1 )
2261 PARAMETER ( ZP001= 0.001)
2262 PARAMETER ( HALF= 0.5)
2263 PARAMETER ( ZP578 = 0.578 )
2264 PARAMETER ( ONE = 1.)
2265 PARAMETER ( THOUSAND = 1000.)
2266 PARAMETER ( Z3600 = 3600.)
2267 C
2268 DIMENSION TL(IRUN,NLAY),QL(IRUN,NLAY),RAIN(IRUN,NLAY),
2269 $ PL(IRUN,NLAY),CLFRAC(IRUN,NLAY),SP(IRUN),TEMP1(IRUN,NLAY),
2270 $ TEMP2(IRUN,NLAY),PLKE(IRUN,NLAY),
2271 $ RCON(IRUN),RLAR(IRUN),DSIG(NLAY),PLK(IRUN,NLAY),TH(IRUN,NLAY),
2272 $ TEMP3(IRUN,NLAY),ITMP1(IRUN,NLAY),
2273 $ ITMP2(IRUN,NLAY),CLSBTH(IRUN,NLAY)
2274 C
2275 DIMENSION EVP9(IRUN,NLAY)
2276 real water(irun),crystal(irun)
2277 real watevap(irun),iceevap(irun)
2278 real fracwat,fracice, tice,rh,fact,dum
2279
2280 real cldlz(irun,nlay)
2281 real rhcrit(irun,nlay), rainmax(irun)
2282 real offset, alpha
2283
2284 c Explicit Inline Directives
2285 c --------------------------
2286 #if CRAY
2287 #if f77
2288 cfpp$ expand (qsat)
2289 #endif
2290 #endif
2291
2292 tice = getcon('FREEZING-POINT')
2293
2294 fracwat = 0.70
2295 fracice = 0.01
2296
2297 NLAYM1 = NLAY - 1
2298 IRNLAY = IRUN*NLAY
2299 IRNLM1 = IRUN*(NLAY-1)
2300
2301 RPHF = Z3600/tmscl
2302
2303 ELOCP = alhl/cp
2304 CPOG = cp/gravity
2305
2306 DO I = 1,IRUN
2307 RLAR(I) = 0.
2308 water(i) = 0.
2309 crystal(i) = 0.
2310 ENDDO
2311
2312 do L = 1,nlay
2313 do i = 1,irun
2314 EVP9(i,L) = 0.
2315 TEMP1(i,L) = 0.
2316 TEMP2(i,L) = 0.
2317 TEMP3(i,L) = 0.
2318 CLSBTH(i,L) = 0.
2319 cldlz(i,L) = 0.
2320 enddo
2321 enddo
2322
2323 C RHO(ZERO) / RHO FOR TERMINAL VELOCITY APPROX.
2324 c ---------------------------------------------
2325 DO L = 1,NLAY
2326 DO I = 1,IRUN
2327 TEMP2(I,L) = PL(I,L)*ZP001
2328 TEMP2(I,L) = SQRT(TEMP2(I,L))
2329 ENDDO
2330 ENDDO
2331
2332 C INVERSE OF MASS IN EACH LAYER
2333 c -----------------------------
2334 DO L = 1,NLAY
2335 DO I = 1,IRUN
2336 TEMP3(I,L) = SP(I) * DSIG(L)
2337 TEMP3(I,L) = GRAVITY*ZP01 / TEMP3(I,L)
2338 ENDDO
2339 ENDDO
2340
2341 C DO LOOP FOR MOISTURE EVAPORATION ABILITY AND CONVEC EVAPORATION.
2342 c ----------------------------------------------------------------
2343 DO 100 L=1,NLAY
2344
2345 DO I = 1,IRUN
2346 TEMP1(I,3) = TL(I,L)
2347 TEMP1(I,4) = QL(I,L)
2348 ENDDO
2349
2350 DO 50 N=1,2
2351 IF(N.EQ.1)RELAX=HALF
2352 IF(N.GT.1)RELAX=ONE
2353
2354 DO I = 1,IRUN
2355 call qsat ( temp1(i,3),pl(i,L),temp1(i,2),temp1(i,6),.true. )
2356 TEMP1(I,5)=TEMP1(I,2)-TEMP1(I,4)
2357 TEMP1(I,6)=TEMP1(I,6)*ELOCP
2358 TEMP1(I,5)=TEMP1(I,5)/(ONE+TEMP1(I,6))
2359 TEMP1(I,4)=TEMP1(I,4)+TEMP1(I,5)*RELAX
2360 TEMP1(I,3)=TEMP1(I,3)-TEMP1(I,5)*ELOCP*RELAX
2361 ENDDO
2362 50 CONTINUE
2363
2364 DO I = 1,IRUN
2365 EVP9(I,L) = (TEMP1(I,4) - QL(I,L))/TEMP3(I,L)
2366 C convective detrained water
2367 cldlz(i,L) = rain(i,L)*temp3(i,L)
2368 if( tl(i,L).gt.tice-20.) then
2369 water(i) = water(i) + rain(i,L)
2370 else
2371 crystal(i) = crystal(i) + rain(i,L)
2372 endif
2373 ENDDO
2374
2375 C**********************************************************************
2376 C FOR CONVECTIVE PRECIP, FIND THE "EVAPORATION EFFICIENCY" USING *
2377 C KESSLERS PARAMETERIZATION *
2378 C**********************************************************************
2379
2380 DO 20 I=1,IRUN
2381
2382 iceevap(i) = 0.
2383 watevap(i) = 0.
2384
2385 if( (evp9(i,L).gt.0.) .and. (crystal(i).gt.0.) ) then
2386 iceevap(I) = EVP9(I,L)*fracice
2387 IF(iceevap(i).GE.crystal(i)) iceevap(i) = crystal(i)
2388 EVP9(I,L)=EVP9(I,L)-iceevap(I)
2389 crystal(i) = crystal(i) - iceevap(i)
2390 endif
2391
2392 C and now warm precipitate
2393 if( (evp9(i,L).gt.0.) .and. (water(i).gt.0.) ) then
2394 exparg = ZM1P04*tmscl*((water(i)*RPHF*TEMP2(I,L))**ZP578)
2395 AREARAT = ONE-(EXP(EXPARG))
2396 watevap(I) = EVP9(I,L)*AREARAT*fracwat
2397 IF(watevap(I).GE.water(i)) watevap(I) = water(i)
2398 EVP9(I,L)=EVP9(I,L)-watevap(I)
2399 water(i) = water(i) - watevap(i)
2400 endif
2401
2402 QL(I,L) = QL(I,L)+(iceevap(i)+watevap(i))*TEMP3(I,L)
2403 TL(I,L) = TL(I,L)-(iceevap(i)+watevap(i))*TEMP3(I,L)*ELOCP
2404
2405 20 CONTINUE
2406
2407 100 CONTINUE
2408
2409 do i = 1,irun
2410 rcon(i) = water(i) + crystal(i)
2411 enddo
2412
2413 C**********************************************************************
2414 C Large Scale Precip
2415 C**********************************************************************
2416
2417 DO 200 L=1,NLAY
2418 DO I = 1,IRUN
2419 rainmax(i) = rhcrit(i,L)*evp9(i,L) +
2420 . ql(i,L)*(rhcrit(i,L)-1.)/temp3(i,L)
2421
2422 if (rainmax(i).LE.0.0) then
2423 call qsat( tl(i,L),pl(i,L),rh,dum,.false.)
2424 rh = ql(i,L)/rh
2425
2426 if( rhcrit(i,L).eq.1.0 ) then
2427 fact = 1.0
2428 else
2429 fact = min( 1.0, alpha + (1.0-alpha)*( rh-rhcrit(i,L)) /
2430 1 (1.0-rhcrit(i,L)) )
2431 endif
2432
2433 C Do not allow clouds above 10 mb
2434 if( pl(i,L).ge.10.0 ) CLSBTH(I,L) = fact
2435 RLAR(I) = RLAR(I)-rainmax(I)
2436 QL(I,L) = QL(I,L)+rainmax(I)*TEMP3(I,L)
2437 TL(I,L) = TL(I,L)-rainmax(I)*TEMP3(I,L)*ELOCP
2438 C Large-scale water
2439 cldlz(i,L) = cldlz(i,L) - rainmax(i)*temp3(i,L)
2440 ENDIF
2441 ENDDO
2442
2443 DO I=1,IRUN
2444 IF((RLAR(I).GT.0.0).AND.(rainmax(I).GT.0.0))THEN
2445 RPOW=(RLAR(I)*RPHF*TEMP2(I,L))**ZP578
2446 EXPARG = ZM1P04*tmscl*RPOW
2447 AREARAT = ONE-(EXP(EXPARG))
2448 TEMP1(I,7) = rainmax(I)*AREARAT
2449 IF(TEMP1(I,7).GE.RLAR(I)) TEMP1(I,7) = RLAR(I)
2450 RLAR(I) = RLAR(I)-TEMP1(I,7)
2451 QL(I,L) = QL(I,L)+TEMP1(I,7)*TEMP3(I,L)
2452 TL(I,L) = TL(I,L)-TEMP1(I,7)*TEMP3(I,L)*ELOCP
2453 ENDIF
2454 ENDDO
2455
2456 200 CONTINUE
2457
2458 RETURN
2459 END
2460 subroutine srclouds (th,q,plk,pl,plke,cloud,cldwat,irun,irise,
2461 1 rhc,offset,alpha)
2462 C***********************************************************************
2463 C
2464 C PURPOSE:
2465 C ========
2466 C Compute non-precipitating cloud fractions
2467 C based on Slingo and Ritter (1985).
2468 C Remove cloudiness where conditionally unstable.
2469 C
2470 C INPUT:
2471 C ======
2472 C th ......... Potential Temperature (irun,irise)
2473 C q .......... Specific Humidity (irun,irise)
2474 C plk ........ P**Kappa at mid-layer (irun,irise)
2475 C pl ......... Pressure at mid-layer (irun,irise)
2476 C plke ....... P**Kappa at edge (irun,irise+1)
2477 C irun ....... Horizontal dimension
2478 C irise ...... Vertical dimension
2479 C
2480 C OUTPUT:
2481 C =======
2482 C cloud ...... Cloud Fraction (irun,irise)
2483 C
2484 C***********************************************************************
2485 C* GODDARD LABORATORY FOR ATMOSPHERES *
2486 C***********************************************************************
2487
2488 implicit none
2489 integer irun,irise
2490
2491 real th(irun,irise)
2492 real q(irun,irise)
2493 real plk(irun,irise)
2494 real pl(irun,irise)
2495 real plke(irun,irise+1)
2496
2497 real tempth(irun)
2498 real tempqs(irun)
2499 real dhstar(irun)
2500 real cloud(irun,irise)
2501 real cldwat(irun,irise)
2502 real qs(irun,irise)
2503
2504 real cp, alhl, getcon, akap, pcheck
2505 real ratio, temp, pke, elocp
2506 real rhcrit,rh,dum,pbar,tbar
2507 integer i,L,ntradesu,ntradesl
2508
2509 real factor
2510 real rhc(irun,irise)
2511 real offset,alpha
2512
2513 c Explicit Inline Directives
2514 c --------------------------
2515 #if CRAY
2516 #if f77
2517 cfpp$ expand (qsat)
2518 #endif
2519 #endif
2520
2521 cp = getcon('CP')
2522 alhl = getcon('LATENT HEAT COND')
2523 elocp = alhl/cp
2524 akap = getcon('KAPPA')
2525
2526 do L = 1,irise
2527 do i = 1,irun
2528 temp = th(i,L)*plk(i,L)
2529 call qsat ( temp,pl(i,L),qs(i,L),dum,.false. )
2530 enddo
2531 enddo
2532
2533 do L = 2,irise
2534 do i = 1,irun
2535 rh = q(i,L)/qs(i,L)
2536
2537 rhcrit = rhc(i,L) - offset
2538 ratio = alpha*(rh-rhcrit)/offset
2539
2540 if(cloud(i,L).eq. 0.0 .and. ratio.gt.0.0 ) then
2541 cloud(i,L) = min( ratio,1.0 )
2542 endif
2543
2544 enddo
2545 enddo
2546
2547 c Reduce clouds from conditionally unstable layer
2548 c -----------------------------------------------
2549 call ctei ( th,q,cloud,cldwat,pl,plk,plke,irun,irise )
2550
2551 return
2552 end
2553
2554 subroutine ctei ( th,q,cldfrc,cldwat,pl,plk,plke,im,lm )
2555 implicit none
2556 integer im,lm
2557 real th(im,lm),q(im,lm),plke(im,lm+1),cldwat(im,lm)
2558 real plk(im,lm),pl(im,lm),cldfrc(im,lm)
2559 integer i,L
2560 real getcon,cp,alhl,elocp,cpoel,t,p,s,qs,dqsdt,dq
2561 real k,krd,kmm,f
2562
2563 cp = getcon('CP')
2564 alhl = getcon('LATENT HEAT COND')
2565 cpoel = cp/alhl
2566 elocp = alhl/cp
2567
2568 do L=lm,2,-1
2569 do i=1,im
2570 dq = q(i,L)+cldwat(i,L)-q(i,L-1)-cldwat(i,L-1)
2571 if( dq.eq.0.0 ) dq = 1.0e-20
2572 k = 1.0 + cpoel*plke(i,L)*( th(i,L)-th(i,L-1) ) / dq
2573
2574 t = th(i,L)*plk(i,L)
2575 p = pl(i,L)
2576 call qsat ( t,p,qs,dqsdt,.true. )
2577
2578 krd = ( cpoel*t*(1+elocp*dqsdt) )/( 1 + 1.608*dqsdt*t )
2579
2580 kmm = ( 1+elocp*dqsdt )*( 1 + 0.392*cpoel*t )
2581 . / ( 2+(1+1.608*cpoel*t)*elocp*dqsdt )
2582
2583 s = ( (k-krd)/(kmm-krd) )
2584 f = 1.0 - min( 1.0, max(0.0,1.0-exp(-s)) )
2585
2586 cldfrc(i,L) = cldfrc(i,L)*f
2587 cldwat(i,L) = cldwat(i,L)*f
2588
2589 enddo
2590 enddo
2591
2592 return
2593 end
2594
2595 subroutine back2grd(gathered,indeces,scattered,irun)
2596 implicit none
2597 integer i,irun,indeces(irun)
2598 real gathered(irun),scattered(irun)
2599 real temp(irun)
2600 do i = 1,irun
2601 temp(indeces(i)) = gathered(i)
2602 enddo
2603 do i = 1,irun
2604 scattered(i) = temp(i)
2605 enddo
2606 return
2607 end

  ViewVC Help
Powered by ViewVC 1.1.22