File: C:\NOAA\NEMS_11731\src\atmos\phys\calpreciptype.f
1 SUBROUTINE CALPRECIPTYPE(kdt,nrcm,im,ix,lm,lp1,randomno, &
2 xlat,xlon, &
3 gt0,gq0,prsl,prsi,PREC, &
4 ,num_p3d,TSKIN,SR,phy_f3d, &
5 ,DOMZR,DOMIP,DOMS)
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 USE FUNCPHYS, ONLY : fpvs,FTDP,fpkap,ftlcl,stma,fthe
28 USE PHYSCONS
29
30 implicit none
31
32
33
34
35
36
37
38
39
40
41 real,PARAMETER :: PTHRESH = 0.0
42
43
44 integer,PARAMETER :: NALG = 5
45
46
47
48 integer,intent(in) :: kdt,nrcm,im,ix,lm,lp1,num_p3d
49 real,intent(in) :: xlat(im),xlon(im)
50 real(kind=kind_phys),dimension(im),intent(in) :: PREC,SR,TSKIN
51 real,intent(in) :: randomno(ix,nrcm)
52 real(kind=kind_phys),dimension(ix,LM),intent(in) :: gt0,gq0,prsl,phy_f3d
53 real(kind=kind_phys),dimension(ix,lp1),intent(in) :: prsi,phii
54
55
56
57 real(kind=kind_phys),dimension(im),intent(out) :: DOMR,DOMZR,DOMIP,DOMS
58
59 INTEGER IWX1,IWX4,IWX5
60 REAL IWX2,IWX3
61 REAL(kind=kind_phys) ES,QC,PV
62 REAL SLEET(NALG),RAIN(NALG),FREEZR(NALG),SNOW(NALG)
63 real(kind=kind_phys),dimension(LM) :: T,Q,PMID,F_RimeF
64 real(kind=kind_phys),dimension(lp1) :: pint,zint
65 REAL(kind=kind_phys), ALLOCATABLE :: TWET(:),RH(:),TD(:)
66
67
68 integer I,J,L,IWX,ISNO,IIP,IZR,IRAIN,k,k1
69 real(kind=kind_phys) tdpd,pr,tr,pk,tlcl,thelcl,qwet, &
70 time_vert,time_ncep,time_ramer,time_bourg,time_revised,time_dominant &
71 ,btim,timef
72
73
74
75
76
77
78
79
80
81
82
83 ALLOCATE ( TWET(LM),RH(LM),TD(LM) )
84
85
86
87 = 0.
88 time_ncep = 0.
89 time_ramer = 0.
90 time_bourg = 0.
91 time_revised = 0.
92
93 do i=1,im
94
95 do k=1,lm
96 k1 = lm-k+1
97 t(k1) = gt0(i,k)
98 q(k1) = gq0(i,k)
99 pmid(k1) = prsl(i,k) * 1000.0
100 f_rimef(k1) = phy_f3d(i,k)
101
102
103
104 = pmid(k1)*q(k1)/(con_eps-con_epsm1*q(k1))
105 td(k1) = ftdp(pv)
106 tdpd = t(k1)-td(k1)
107 if(pmid(k1)>=50000.)then
108 if(tdpd.gt.0.) then
109 pr = pmid(k1)
110 tr = t(k1)
111 pk = fpkap(pr)
112 tlcl = ftlcl(tr,tdpd)
113 thelcl = fthe(tlcl,pk*tlcl/tr)
114 call stma(thelcl,pk,twet(k1),qwet)
115 else
116 twet(k1)=t(k1)
117 endif
118 endif
119 ES = FPVS(T(k1))
120 ES = MIN(ES,PMID(k1))
121 QC = CON_EPS*ES/(PMID(k1)+CON_EPSM1*ES)
122 RH(k1) = MAX(con_epsq,Q(k1))/QC
123
124 k1 = lp1-k+1
125 pint(k1) = prsi(i,k) * 1000.0
126 zint(k1) = phii(i,k)/con_g
127
128 enddo
129 pint(1) = prsi(i,lp1) * 1000.0
130 zint(1) = phii(i,lp1)/con_g
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 CALL CALWXT(lm,lp1,T(1),Q(1),PMID(1),PINT(1),PREC(i), &
152 PTHRESH,con_fvirt,con_rog,con_epsq, &
153 ZINT(1),IWX1,TWET(1))
154
155 = IWX1
156 ISNO = MOD(IWX,2)
157 IIP = MOD(IWX,4)/2
158 IZR = MOD(IWX,8)/4
159 IRAIN = IWX/8
160 SNOW(1) = ISNO*1.0
161 SLEET(1) = IIP*1.0
162 FREEZR(1) = IZR*1.0
163 RAIN(1) = IRAIN*1.0
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184 CALL CALWXT_RAMER(lm,lp1,T(1),Q(1),PMID(1),RH(1),TD(1), &
185 PINT(1),PREC(i),PTHRESH,IWX2)
186
187
188
189
190
191
192 = NINT(IWX2)
193 ISNO = MOD(IWX,2)
194 IIP = MOD(IWX,4)/2
195 IZR = MOD(IWX,8)/4
196 IRAIN = IWX/8
197 SNOW(2) = ISNO*1.0
198 SLEET(2) = IIP*1.0
199 FREEZR(2) = IZR*1.0
200 RAIN(2) = IRAIN*1.0
201
202
203
204
205
206 CALL CALWXT_BOURG(LM,LP1,randomno(i,1),con_g,PTHRESH, &
207 & T(1),Q(1),PMID(1),PINT(1),PREC(i),ZINT(1),IWX3)
208
209
210
211
212
213 = NINT(IWX3)
214 ISNO = MOD(IWX,2)
215 IIP = MOD(IWX,4)/2
216 IZR = MOD(IWX,8)/4
217 IRAIN = IWX/8
218 SNOW(3) = ISNO*1.0
219 SLEET(3) = IIP*1.0
220 FREEZR(3) = IZR*1.0
221 RAIN(3) = IRAIN*1.0
222
223
224
225
226
227
228 CALL CALWXT_REVISED(LM,LP1,T(1),Q(1),PMID(1),PINT(1),PREC(i),PTHRESH, &
229 con_fvirt,con_rog,con_epsq,ZINT(1),TWET(1),IWX4)
230
231
232
233
234
235
236 = IWX4
237 ISNO = MOD(IWX,2)
238 IIP = MOD(IWX,4)/2
239 IZR = MOD(IWX,8)/4
240 IRAIN = IWX/8
241 SNOW(4) = ISNO*1.0
242 SLEET(4) = IIP*1.0
243 FREEZR(4) = IZR*1.0
244 RAIN(4) = IRAIN*1.0
245
246
247
248
249 IF(num_p3d == 3) then
250 CALL CALWXT_EXPLICIT(LM,PTHRESH, &
251 TSKIN(i),PREC(i),SR(i),F_RimeF(1),IWX5)
252 else
253 IWX5 = 0
254 endif
255
256
257 = IWX5
258 ISNO = MOD(IWX,2)
259 IIP = MOD(IWX,4)/2
260 IZR = MOD(IWX,8)/4
261 IRAIN = IWX/8
262 SNOW(5) = ISNO*1.0
263 SLEET(5) = IIP*1.0
264 FREEZR(5) = IZR*1.0
265 RAIN(5) = IRAIN*1.0
266
267
268
269 CALL CALWXT_DOMINANT(NALG,PREC(i),PTHRESH,RAIN(1),FREEZR(1),SLEET(1), &
270 SNOW(1),DOMR(i),DOMZR(i),DOMIP(i),DOMS(i))
271
272
273
274
275
276
277
278
279
280 enddo
281
282
283
284
285
286 DEALLOCATE (TWET,RH,TD)
287 RETURN
288 END
289
290
291
292 SUBROUTINE CALWXT(lm,lp1,T,Q,PMID,PINT,PREC, &
293 PTHRESH,D608,ROG,EPSQ, &
294 ZINT,IWX,TWET)
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316 implicit none
317
318
319
320
321 integer,intent(in):: lm,lp1
322
323 real,dimension(LM),intent(in) :: T,Q,PMID,TWET
324 real,dimension(LP1),intent(in) :: ZINT,PINT
325 integer,intent(out) :: IWX
326 real,intent(in) :: PREC,PTHRESH,D608,ROG,EPSQ
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342 real, parameter :: D00=0.0
343 integer KARR,LICEE
344 real TCOLD,TWARM
345
346
347
348
349
350
351
352
353
354
355
356
357
358 integer I,J,L,LMHK,LICE,IFREL,IWRML,IFRZL
359 real PSFCK,TDCHK,A,TDKL,TDPRE,TLMHK,TWRMK,AREAS8,AREAP4, &
360 SURFW,SURFC,DZKL,AREA1,PINTK1,PINTK2,PM150,PKL,TKL,QKL
361
362
363
364
365 = 0
366
367
368
369
370
371
372
373
374 IF (PREC.LE.PTHRESH) GOTO 800
375
376
377
378
379
380
381 =PINT(LM+1)
382
383 =2.0
384 760 TCOLD=T(LM)
385 TWARM=T(LM)
386 LICEE=LM
387
388 DO 775 L=1,LM
389 QKL=Q(L)
390 QKL=AMAX1(EPSQ,QKL)
391 TKL=T(L)
392 PKL=PMID(L)
393
394
395
396
397 IF (PKL.LT.50000.0.OR.PKL.GT.PSFCK-7000.0) GOTO 775
398 A=ALOG(QKL*PKL/(6.1078*(0.378*QKL+0.622)))
399 TDKL=(237.3*A)/(17.269-A)+273.15
400 TDPRE=TKL-TDKL
401 IF (TDPRE.LT.TDCHK.AND.TKL.LT.TCOLD) TCOLD=TKL
402 IF (TDPRE.LT.TDCHK.AND.TKL.GT.TWARM) TWARM=TKL
403 IF (TDPRE.LT.TDCHK.AND.L.LT.LICEE) LICEE=L
404 775 CONTINUE
405
406
407
408
409 IF (TCOLD==T(LM).AND.TDCHK<6.0) THEN
410 TDCHK=TDCHK+2.0
411 GOTO 760
412 ENDIF
413 800 CONTINUE
414
415
416
417 =0
418 IF (PREC.LE.PTHRESH) GOTO 850
419 TLMHK=T(LM)
420
421
422
423 IF (TCOLD>269.15) THEN
424 IF (TLMHK.LE.273.15) THEN
425
426
427
428
429
430 =IWX+4
431 GOTO 850
432 ELSE
433
434
435
436
437
438 =IWX+8
439 GOTO 850
440 ENDIF
441 ENDIF
442 KARR=1
443 850 CONTINUE
444
445
446
447
448
449
450
451
452
453
454
455 IF(KARR.GT.0)THEN
456 LICE=LICEE
457
458 =PINT(LM+1)
459
460 =T(LM)
461 TWRMK=TWARM
462
463
464
465
466
467
468
469
470
471
472
473
474 =D00
475 AREAP4=D00
476 SURFW =D00
477 SURFC =D00
478
479 DO 1945 L=LM,LICE,-1
480 DZKL=ZINT(L)-ZINT(L+1)
481 AREA1=(TWET(L)-269.15)*DZKL
482 IF (TWET(L).GE.269.15) AREAP4=AREAP4+AREA1
483 1945 CONTINUE
484
485 IF (AREAP4.LT.3000.0) THEN
486
487
488
489
490
491 =IWX+1
492 GO TO 1900
493 ENDIF
494
495
496
497 =PSFCK
498 PM150=PSFCK-15000.
499
500 DO 1955 L=LM,1,-1
501 PINTK2=PINT(L)
502 IF(PINTK1.LT.PM150)GO TO 1950
503 DZKL=ZINT(L)-ZINT(L+1)
504
505
506
507 IF(PINTK2.LT.PM150) &
508 DZKL=T(L)*(Q(L)*D608+1.0)*ROG*ALOG(PINTK1/PM150)
509 AREA1=(TWET(L)-273.15)*DZKL
510 AREAS8=AREAS8+AREA1
511 1950 PINTK1=PINTK2
512 1955 CONTINUE
513
514
515
516
517
518
519 =0
520 IWRML=0
521
522 DO 2050 L=LM,1,-1
523 IF (IFRZL.EQ.0.AND.T(L).LT.273.15) IFRZL=1
524 IF (IWRML.EQ.0.AND.T(L).GE.TWRMK) IWRML=1
525
526 IF (IWRML.EQ.0.OR.IFRZL.EQ.0) THEN
527
528 =ZINT(L)-ZINT(L+1)
529 AREA1=(TWET(L)-273.15)*DZKL
530 IF(IFRZL.EQ.0.AND.TWET(L).GE.273.15)SURFW=SURFW+AREA1
531 IF(IWRML.EQ.0.AND.TWET(L).LE.273.15)SURFC=SURFC+AREA1
532 ENDIF
533 2050 CONTINUE
534 IF(SURFC.LT.-3000.0.OR. &
535 (AREAS8.LT.-3000.0.AND.SURFW.LT.50.0)) THEN
536
537
538
539
540
541 =IWX+2
542 GOTO 1900
543 ENDIF
544
545 IF(TLMHK.LT.273.15) THEN
546
547
548
549
550
551 =IWX+4
552 ELSE
553
554
555
556
557
558 =IWX+8
559 ENDIF
560 ENDIF
561 1900 CONTINUE
562
563
564
565 RETURN
566 END
567
568
569
570
571
572
573
574
575
576
577
578
579
580 SUBROUTINE CALWXT_RAMER(lm,lp1, &
581 T,Q,PMID,RH,TD,PINT,PREC,PTHRESH,PTYP)
582
583
584
585
586
587
588
589
590
591
592
593
594
595 implicit none
596
597 real,PARAMETER :: LECP=1572.5
598 real,PARAMETER :: twice=266.55,rhprcp=0.80,deltag=1.02,prcpmin=0.3, &
599 & emelt=0.045,rlim=0.04,slim=0.85
600 real,PARAMETER :: twmelt=273.15,tz=273.15,efac=1.0
601
602 INTEGER*4 i, k1, lll, k2, toodry
603
604 REAL xxx ,mye, icefrac,flg
605 integer,intent(in) :: lm,lp1
606 real,DIMENSION(LM),intent(in) :: T,Q,PMID,RH,TD
607 real,DIMENSION(LP1),intent(in) :: PINT
608 real,intent(in) :: PREC,PTHRESH
609 real,intent(out) :: PTYP
610
611 real,DIMENSION(LM) :: P,TQ,QQ,PQ,RHQ
612 real,DIMENSION(LM) :: tqtmp,pqtmp,rhqtmp
613 real,DIMENSION(LM) :: TWQ
614
615 integer J,L,LEV,LNQ,ii
616 real RHMAX,TWMAX,PTOP,dpdrh,twtop,rhtop,wgt1,wgt2, &
617 rhavg,dtavg,dpk,ptw,rate,pbot,qc, b,qtmp
618 real,external :: xmytw
619
620
621 = -9999.
622
623
624 = 0
625 DO 88 L = 1,LM
626 LEV=LM-L+1
627
628
629
630
631
632
633 (LEV)=RH(L)
634 PQ(LEV)=PMID(L)/100.
635 TQ(LEV)=T(L)
636 88 CONTINUE
637
638
639
640
641
642
643
644
645
646
647
648
649
650 IF (PREC.LE.PTHRESH) GOTO 800
651
652
653
654
655
656
657 = -999.0
658 rhmax = 0.0
659 k1 = 0
660 = 0
661
662 IF (rhq(1).lt.rhprcp) THEN
663 toodry = 1
664 ELSE
665 toodry = 0
666 END IF
667
668 = pq(1)
669
670 DO 10 L = 1, lm
671
672 = td(l)
673 if (xxx .lt. -500.) goto 800
674 twq(L) = xmytw(tq(L),xxx,pq(L))
675 twmax = amax1(twq(L),twmax)
676 IF (pq(L).ge.400.0) THEN
677 IF (rhq(L).gt.rhmax) THEN
678 rhmax = rhq(L)
679 k2 = i
680 END IF
681
682 IF (L.ne.1) THEN
683 IF (rhq(L).ge.rhprcp.or.toodry.eq.0) THEN
684 IF (toodry.ne.0) THEN
685 dpdrh = alog(pq(L)/pq(L-1)) / &
686 (rhq(L)-RHQ(L-1))
687 pbot = exp(alog(pq(L))+(rhprcp-rhq(L))*dpdrh)
688
689 = pq(L)
690 toodry = 0
691 ELSE IF (rhq(L).ge.rhprcp) THEN
692 ptw = pq(L)
693 ELSE
694 toodry = 1
695 dpdrh = alog(pq(L)/pq(L-1)) / &
696 (rhq(L)-rhq(L-1))
697 ptw = exp(alog(pq(L))+(rhprcp-rhq(L))*dpdrh)
698
699
700
701 END IF
702
703 IF (pbot/ptw.ge.deltag) THEN
704
705 = L
706 ptop = ptw
707 END IF
708 END IF
709 END IF
710 END IF
711
712 CONTINUE
713
714
715
716
717 IF (twq(1).ge.273.15+2.0) THEN
718 ptyp = 8
719 = 0.0
720 goto 800
721 END IF
722
723 IF (twmax.le.twice) THEN
724 icefrac = 1.0
725 ptyp = 1
726 goto 800
727 END IF
728
729
730
731 IF (k1.eq.0) goto 800
732
733 IF (ptop.eq.pq(k1)) THEN
734 twtop = twq(k1)
735 rhtop = rhq(k1)
736 k2 = k1
737 k1 = k1 - 1
738 ELSE
739 k2 = k1
740 k1 = k1 - 1
741 wgt1 = alog(ptop/pq(k2)) / alog(pq(k1)/pq(k2))
742 wgt2 = 1.0 - wgt1
743 twtop = twq(k1) * wgt1 + twq(k2) * wgt2
744 rhtop = rhq(k1) * wgt1 + rhq(k2) * wgt2
745 END IF
746
747
748
749 DO 20 L = 1, k1
750 twmax = amax1(twq(l),twmax)
751 20 CONTINUE
752
753
754 IF (i.eq.1.and.j.eq.1) WRITE (*,*) 'twmax=',twmax,twice,'twtop=',twtop
755 IF (twtop.le.twice) THEN
756 icefrac = 1.0
757 IF (twmax.le.twmelt) THEN
758 = 1
759 goto 800
760 END IF
761 lll = 0
762 ELSE
763 icefrac = 0.0
764 lll = 1
765 END IF
766
767
768 CONTINUE
769
770 IF (icefrac.ge.1.0) THEN
771 IF (twq(k1).lt.twmelt) GO TO 40
772 IF (twq(k1).eq.twtop) GO TO 40
773 = (twmelt-twq(k1)) / (twtop-twq(k1))
774 rhavg = rhq(k1) + wgt1 * (rhtop-rhq(k1)) / 2
775 dtavg = (twmelt-twq(k1)) / 2
776 dpk = wgt1 * alog(pq(k1)/ptop)
777
778 = emelt * rhavg ** efac
779 icefrac = icefrac + dpk * dtavg / mye
780 ELSE IF (icefrac.le.0.0) THEN
781 = 1
782
783 IF (twq(k1).gt.twice) GO TO 40
784 IF (twq(k1).eq.twtop) THEN
785 wgt1 = 0.5
786 ELSE
787 wgt1 = (twice-twq(k1)) / (twtop-twq(k1))
788 END IF
789 rhavg = rhq(k1) + wgt1 * (rhtop-rhq(k1)) / 2
790 dtavg = twmelt - (twq(k1)+twice) / 2
791 dpk = wgt1 * alog(pq(k1)/ptop)
792
793 = emelt * rhavg ** efac
794 icefrac = icefrac + dpk * dtavg / mye
795 ELSE IF ((twq(k1).le.twmelt).and.(twq(k1).lt.twmelt)) THEN
796 = (rhq(k1)+rhtop) / 2
797 dtavg = twmelt - (twq(k1)+twtop) / 2
798 dpk = alog(pq(k1)/ptop)
799
800 = emelt * rhavg ** efac
801 icefrac = icefrac + dpk * dtavg / mye
802 ELSE
803 IF (twq(k1).eq.twtop) GO TO 40
804 = (twmelt-twq(k1)) / (twtop-twq(k1))
805 wgt2 = 1.0 - wgt1
806 rhavg = rhtop + wgt2 * (rhq(k1)-rhtop) / 2
807 dtavg = (twmelt-twtop) / 2
808 dpk = wgt2 * alog(pq(k1)/ptop)
809
810 = emelt * rhavg ** efac
811 icefrac = icefrac + dpk * dtavg / mye
812 icefrac = amin1(1.0,amax1(icefrac,0.0))
813 IF (icefrac.le.0.0) THEN
814
815 IF (twq(k1).gt.twice) GO TO 40
816 = (twice-twq(k1)) / (twtop-twq(k1))
817 dtavg = twmelt - (twq(k1)+twice) / 2
818 ELSE
819 dtavg = (twmelt-twq(k1)) / 2
820 END IF
821 rhavg = rhq(k1) + wgt1 * (rhtop-rhq(k1)) / 2
822 dpk = wgt1 * alog(pq(k1)/ptop)
823
824 = emelt * rhavg ** efac
825 icefrac = icefrac + dpk * dtavg / mye
826 END IF
827
828 = amin1(1.0,amax1(icefrac,0.0))
829 IF (i.eq.1.and.j.eq.1) WRITE (*,*) 'NEW ICEFRAC:', icefrac, icefrac
830
831
832 IF (k1.gt.1) THEN
833 twtop = twq(k1)
834 ptop = pq(k1)
835 rhtop = rhq(k1)
836 k1 = k1 - 1
837 GO TO 30
838 END IF
839
840
841
842
843
844 IF (icefrac.ge.slim) THEN
845 IF (lll.ne.0) THEN
846 ptyp = 2
847 ELSE
848 ptyp = 1
849 END IF
850 ELSE IF (icefrac.le.rlim) THEN
851 IF (twq(1).lt.tz) THEN
852 ptyp = 4
853 ELSE
854 ptyp = 8
855 END IF
856 ELSE
857 IF (twq(1).lt.tz) THEN
858
859
860
861
862
863
864
865 = 0
866
867 ELSE
868
869 = 0
870 END IF
871 END IF
872 800 CONTINUE
873
874 RETURN
875
876 END
877
878
879
880
881 FUNCTION xmytw(t,td,p)
882
883 IMPLICIT NONE
884
885 INTEGER*4 cflag, l
886
887 REAL f, c0, c1, c2, k, kd, kw, ew, t, td, p, ed, fp, s, &
888 & de, xmytw
889 DATA f, c0, c1, c2 /0.0006355, 26.66082, 0.0091379024, 6106.3960/
890
891
892 = (t+td) / 2
893 IF (td.ge.t) RETURN
894
895 IF (t.lt.100.0) THEN
896 k = t + 273.15
897 kd = td + 273.15
898 IF (kd.ge.k) RETURN
899 cflag = 1
900 ELSE
901 k = t
902 kd = td
903 cflag = 0
904 END IF
905
906 = c0 - c1 * kd - c2 / kd
907 IF (ed.lt.-14.0.or.ed.gt.7.0) RETURN
908 ed = exp(ed)
909 ew = c0 - c1 * k - c2 / k
910 IF (ew.lt.-14.0.or.ew.gt.7.0) RETURN
911 ew = exp(ew)
912 fp = p * f
913 s = (ew-ed) / (k-kd)
914 kw = (k*fp+kd*s) / (fp+s)
915
916 DO 10 l = 1, 5
917 ew = c0 - c1 * kw - c2 / kw
918 IF (ew.lt.-14.0.or.ew.gt.7.0) RETURN
919 ew = exp(ew)
920 de = fp * (k-kw) + ed - ew
921 IF (abs(de/ew).lt.1E-5) GO TO 20
922 s = ew * (c1-c2/(kw*kw)) - fp
923 kw = kw - de / s
924 10 CONTINUE
925 20 CONTINUE
926
927
928 IF (cflag.ne.0) THEN
929 xmytw = kw - 273.15
930 ELSE
931 xmytw = kw
932 END IF
933
934 RETURN
935 END
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005 subroutine calwxt_bourg(lm,lp1,rn,g,pthresh, &
1006 & t,q,pmid,pint,prec,zint,ptype)
1007
1008 implicit none
1009
1010
1011 integer,intent(in):: lm,lp1
1012
1013 real,intent(in):: g,pthresh,rn(2)
1014 real,intent(in):: t(lm)
1015 real,intent(in):: q(lm)
1016 real,intent(in):: pmid(lm)
1017 real,intent(in):: pint(lp1)
1018 real,intent(in):: prec
1019 real,intent(in):: zint(lp1)
1020
1021
1022 real,intent(out):: ptype
1023
1024 integer ifrzl,iwrml,l,lhiwrm,lmhk
1025 real pintk1,areane,tlmhk,areape,pintk2,surfw,area1,dzkl,psfck
1026 real r1,r2
1027
1028
1029
1030
1031
1032
1033
1034 = 0
1035
1036
1037
1038
1039
1040
1041
1042
1043 =pint(lm+1)
1044
1045
1046
1047 if (prec.le.pthresh) return
1048
1049
1050
1051
1052
1053
1054
1055 = t(lm)
1056 iwrml = lm + 1
1057 if (tlmhk.ge.273.15) then
1058 do l = lm, 2, -1
1059 if (t(l).ge.273.15.and.t(l-1).lt.273.15.and. &
1060 & iwrml.eq.lm+1) iwrml = l
1061 end do
1062 end if
1063
1064
1065
1066 = lm + 1
1067 do l = lm, 1, -1
1068
1069
1070 if (t(l).ge.273.15 .and. pmid(l).gt.25000.) lhiwrm = l
1071 end do
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089 = psfck
1090 ifrzl = 0
1091 areane = 0.0
1092 areape = 0.0
1093 surfw = 0.0
1094
1095 do l = lm, 1, -1
1096 if (ifrzl.eq.0.and.t(l).le.273.15) ifrzl = 1
1097 pintk2=pint(l)
1098 dzkl=zint(l)-zint(l+1)
1099 area1 = alog(t(l)/273.15) * g * dzkl
1100 if (t(l).ge.273.15.and. pmid(l).gt.25000.) then
1101 if (l.lt.iwrml) areape = areape + area1
1102 if (l.ge.iwrml) surfw = surfw + area1
1103 else
1104 if (l.gt.lhiwrm) areane = areane + abs(area1)
1105 end if
1106 pintk1 = pintk2
1107 end do
1108
1109
1110
1111
1112 if (areape.lt.2.0) then
1113
1114
1115 if (surfw.lt.5.6) then
1116
1117
1118 = 1
1119 else if (surfw.gt.13.2) then
1120
1121
1122 = 8
1123 else
1124
1125
1126 = rn(1)
1127 if (r1.le.0.5) then
1128
1129 = 1
1130 else
1131
1132 = 8
1133 end if
1134 end if
1135
1136 else
1137
1138
1139 if (areane.gt.66.0+0.66*areape) then
1140
1141
1142
1143 if (surfw.lt.5.6) then
1144
1145
1146 = 2
1147 else if (surfw.gt.13.2) then
1148
1149
1150 = 8
1151 else
1152
1153
1154 = rn(1)
1155 if (r1.le.0.5) then
1156
1157 = 2
1158 else
1159
1160 = 8
1161 end if
1162 end if
1163 else if (areane.lt.46.0+0.66*areape) then
1164
1165
1166 if (tlmhk.lt.273.15) then
1167
1168 = 4
1169 else
1170
1171 = 8
1172 end if
1173 else
1174
1175
1176 = rn(1)
1177 if (r1.le.0.5) then
1178
1179
1180 if (surfw.lt.5.6) then
1181
1182 = 2
1183 else if (surfw.gt.13.2) then
1184
1185 = 8
1186 else
1187
1188
1189 = rn(2)
1190 if (r2.le.0.5) then
1191
1192 = 2
1193 else
1194
1195 = 8
1196 end if
1197 end if
1198 else
1199
1200
1201 if (tlmhk.lt.273.15) then
1202
1203 = 4
1204 else
1205
1206 = 8
1207 end if
1208 end if
1209 end if
1210 end if
1211
1212
1213 return
1214 end
1215
1216
1217 SUBROUTINE CALWXT_REVISED(LM,LP1,T,Q,PMID,PINT,PREC, &
1218 PTHRESH,D608,ROG,EPSQ, &
1219 & ZINT,TWET,IWX)
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248 implicit none
1249
1250
1251
1252
1253
1254
1255
1256
1257 integer,intent(in):: lm,lp1
1258 REAL,dimension(LM),intent(in) :: T,Q,PMID,TWET
1259 REAL,dimension(LP1),intent(in) :: PINT,ZINT
1260 REAL,intent(in) :: PREC,PTHRESH,D608,ROG,EPSQ
1261
1262
1263
1264
1265
1266
1267
1268
1269 integer, intent(out) :: IWX
1270
1271
1272 real, parameter :: D00=0.0
1273 integer KARR,LICEE
1274 real TCOLD,TWARM
1275
1276 integer I,J,L,LMHK,LICE,IFREL,IWRML,IFRZL
1277 real PSFCK,TDCHK,A,TDKL,TDPRE,TLMHK,TWRMK,AREAS8,AREAP4,AREA1, &
1278 SURFW,SURFC,DZKL,PINTK1,PINTK2,PM150,QKL,TKL,PKL,AREA0, &
1279 AREAP0
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294 = 0
1295
1296
1297
1298
1299 =LM
1300
1301
1302
1303 IF (PREC.LE.PTHRESH) GOTO 800
1304
1305
1306
1307
1308
1309
1310 =PINT(LP1)
1311
1312 =2.0
1313 760 TCOLD=T(LMHK)
1314 TWARM=T(LMHK)
1315 LICEE=LMHK
1316
1317 DO 775 L=1,LMHK
1318 QKL=Q(L)
1319 QKL=AMAX1(EPSQ,QKL)
1320 TKL=T(L)
1321 PKL=PMID(L)
1322
1323
1324
1325
1326 IF (PKL.LT.50000.0.OR.PKL.GT.PSFCK-7000.0) GOTO 775
1327 A=ALOG(QKL*PKL/(6.1078*(0.378*QKL+0.622)))
1328 TDKL=(237.3*A)/(17.269-A)+273.15
1329 TDPRE=TKL-TDKL
1330 IF (TDPRE.LT.TDCHK.AND.TKL.LT.TCOLD) TCOLD=TKL
1331 IF (TDPRE.LT.TDCHK.AND.TKL.GT.TWARM) TWARM=TKL
1332 IF (TDPRE.LT.TDCHK.AND.L.LT.LICEE) LICEE=L
1333 775 CONTINUE
1334
1335
1336
1337
1338 IF (TCOLD.EQ.T(LMHK).AND.TDCHK.LT.6.0) THEN
1339 TDCHK=TDCHK+2.0
1340 GOTO 760
1341 ENDIF
1342 800 CONTINUE
1343
1344
1345
1346 =0
1347 IF (PREC.LE.PTHRESH) GOTO 850
1348 LMHK=LM
1349 TLMHK=T(LMHK)
1350
1351
1352
1353 IF (TCOLD.GT.269.15) THEN
1354 IF (TLMHK.LE.273.15) THEN
1355
1356
1357
1358
1359
1360 =IWX+4
1361 GOTO 850
1362 ELSE
1363
1364
1365
1366
1367
1368 =IWX+8
1369 GOTO 850
1370 ENDIF
1371 ENDIF
1372 KARR=1
1373 850 CONTINUE
1374
1375
1376
1377
1378
1379
1380 IF(KARR.GT.0)THEN
1381 LMHK=LM
1382 LICE=LICEE
1383
1384 =PINT(LP1)
1385
1386 =T(LMHK)
1387 TWRMK=TWARM
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401 =D00
1402 AREAP4=D00
1403 AREAP0=D00
1404 SURFW =D00
1405 SURFC =D00
1406
1407
1408 DO 1945 L=LMHK,LICE,-1
1409 DZKL=ZINT(L)-ZINT(L+1)
1410 AREA1=(TWET(L)-269.15)*DZKL
1411 AREA0=(TWET(L)-273.15)*DZKL
1412 IF (TWET(L).GE.269.15) AREAP4=AREAP4+AREA1
1413 IF (TWET(L).GE.273.15) AREAP0=AREAP0+AREA0
1414 1945 CONTINUE
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425 IF (AREAP0.LT.350.0) THEN
1426
1427
1428 =IWX+1
1429 GOTO 1900
1430 ENDIF
1431
1432
1433
1434 =PSFCK
1435 PM150=PSFCK-15000.
1436
1437 DO 1955 L=LMHK,1,-1
1438 PINTK2=PINT(L)
1439 IF(PINTK1.LT.PM150)GO TO 1950
1440 DZKL=ZINT(L)-ZINT(L+1)
1441
1442
1443
1444 IF(PINTK2.LT.PM150) &
1445 DZKL=T(L)*(Q(L)*D608+1.0)*ROG* &
1446 ALOG(PINTK1/PM150)
1447 AREA1=(TWET(L)-273.15)*DZKL
1448 AREAS8=AREAS8+AREA1
1449 1950 PINTK1=PINTK2
1450 1955 CONTINUE
1451
1452
1453
1454
1455
1456
1457 =0
1458 IWRML=0
1459
1460 DO 2050 L=LMHK,1,-1
1461 IF (IFRZL.EQ.0.AND.T(L).LT.273.15) IFRZL=1
1462 IF (IWRML.EQ.0.AND.T(L).GE.TWRMK) IWRML=1
1463
1464 IF (IWRML.EQ.0.OR.IFRZL.EQ.0) THEN
1465
1466 =ZINT(L)-ZINT(L+1)
1467 AREA1=(TWET(L)-273.15)*DZKL
1468 IF(IFRZL.EQ.0.AND.TWET(L).GE.273.15)SURFW=SURFW+AREA1
1469 IF(IWRML.EQ.0.AND.TWET(L).LE.273.15)SURFC=SURFC+AREA1
1470 ENDIF
1471 2050 CONTINUE
1472 IF(SURFC.LT.-3000.0.OR. &
1473 & (AREAS8.LT.-3000.0.AND.SURFW.LT.50.0)) THEN
1474
1475
1476
1477
1478
1479 =IWX+2
1480 GOTO 1900
1481 ENDIF
1482
1483 IF(TLMHK.LT.273.15) THEN
1484
1485
1486
1487
1488
1489 =IWX+4
1490 ELSE
1491
1492
1493
1494
1495
1496 =IWX+8
1497 ENDIF
1498 ENDIF
1499 1900 CONTINUE
1500
1501
1502 RETURN
1503 END
1504
1505
1506 SUBROUTINE CALWXT_EXPLICIT(LM,PTHRESH,TSKIN,PREC,SR,F_RIMEF,IWX)
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517 implicit none
1518
1519
1520
1521
1522
1523 integer, intent(in):: lm
1524 real,intent(in):: TSKIN, PREC, SR,PTHRESH
1525 REAL,intent(in):: F_RimeF(LM)
1526 integer,intent(out) :: IWX
1527 integer I,J,LMHK
1528 real PSFC,SNOW
1529
1530
1531
1532
1533 = 0
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544 IF (PREC.LE.PTHRESH) GOTO 800
1545
1546
1547
1548
1549
1550
1551 IF (SR.LT.0.5) THEN
1552
1553
1554
1555
1556 IF (TSKIN.LT.273.15) THEN
1557
1558 =IWX+4
1559 ELSE
1560
1561 =IWX+8
1562 ENDIF
1563 ELSE
1564
1565
1566
1567 IF(F_RimeF(LM).GE.10) THEN
1568
1569 =IWX+2
1570 ELSE
1571 SNOW = 1
1572 IWX=IWX+1
1573 ENDIF
1574 ENDIF
1575 800 CONTINUE
1576 810 RETURN
1577 END
1578
1579
1580 SUBROUTINE CALWXT_DOMINANT(NALG,PREC,PTHRESH,RAIN,FREEZR,SLEET,SNOW, &
1581 & DOMR,DOMZR,DOMIP,DOMS)
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591 implicit none
1592
1593
1594 integer,intent(in) :: NALG
1595 REAL, intent(in) :: PREC,PTHRESH
1596 real,intent(out) :: DOMS,DOMR,DOMZR,DOMIP
1597 real,DIMENSION(NALG),intent(in) :: RAIN,SNOW,SLEET,FREEZR
1598 integer I,J,L
1599 real TOTSN,TOTIP,TOTR,TOTZR
1600
1601
1602
1603 = 0.
1604 DOMS = 0.
1605 DOMZR = 0.
1606 DOMIP = 0.
1607
1608
1609
1610
1611 IF (PREC.LE.PTHRESH) GOTO 800
1612 TOTSN = 0
1613 TOTIP = 0
1614 TOTR = 0
1615 TOTZR = 0
1616
1617 DO 820 L = 1, NALG
1618 IF (RAIN(L).GT. 0) THEN
1619 TOTR = TOTR + 1
1620 GOTO 830
1621 ENDIF
1622
1623 IF (SNOW(L).GT. 0) THEN
1624 TOTSN = TOTSN + 1
1625 GOTO 830
1626 ENDIF
1627
1628 IF (SLEET(L).GT. 0) THEN
1629 TOTIP = TOTIP + 1
1630 GOTO 830
1631 ENDIF
1632
1633 IF (FREEZR(L).GT. 0) THEN
1634 TOTZR = TOTZR + 1
1635 GOTO 830
1636 ENDIF
1637 830 CONTINUE
1638 820 CONTINUE
1639
1640
1641
1642 IF (TOTSN .GT. TOTIP) THEN
1643 IF (TOTSN .GT. TOTZR) THEN
1644 IF (TOTSN .GE. TOTR) THEN
1645 DOMS = 1
1646 GOTO 800
1647 ELSE
1648 DOMR = 1
1649 GOTO 800
1650 ENDIF
1651 ELSE IF (TOTZR .GE. TOTR) THEN
1652 DOMZR = 1
1653 GOTO 800
1654 ELSE
1655 DOMR = 1
1656 GOTO 800
1657 ENDIF
1658 ELSE IF (TOTIP .GT. TOTZR) THEN
1659 IF (TOTIP .GE. TOTR) THEN
1660 DOMIP = 1
1661 GOTO 800
1662 ELSE
1663 DOMR = 1
1664 GOTO 800
1665 ENDIF
1666 ELSE IF (TOTZR .GE. TOTR) THEN
1667 DOMZR = 1
1668 GOTO 800
1669 ELSE
1670 DOMR = 1
1671 GOTO 800
1672 ENDIF
1673 800 CONTINUE
1674 RETURN
1675 END
1676
1677
1678
1679
1680
1681