/[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.10 - (show annotations) (download)
Fri Jul 16 20:08:08 2004 UTC (19 years, 11 months ago) by molod
Branch: MAIN
Changes since 1.9: +11 -11 lines
Cleaning

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

  ViewVC Help
Powered by ViewVC 1.1.22