UPP  001
All Data Structures Files Functions Pages
CALWXT_REVISED.f
1  SUBROUTINE calwxt_revised_post(T,Q,PMID,PINT,HTM,LMH,PREC,ZINT,IWX)
2 !
3 ! FILE: CALWXT.f
4 ! WRITTEN: 11 NOVEMBER 1993, MICHAEL BALDWIN
5 ! REVISIONS:
6 ! 30 SEPT 1994-SETUP NEW DECISION TREE (M BALDWIN)
7 ! 12 JUNE 1998-CONVERSION TO 2-D (T BLACK)
8 ! 01-10-25 H CHUANG - MODIFIED TO PROCESS HYBRID MODEL OUTPUT
9 ! 02-01-15 MIKE BALDWIN - WRF VERSION
10 ! 05-07-07 BINBIN ZHOU - ADD PREC FOR RSM
11 ! 05-08-24 GEOFF MANIKIN - MODIFIED THE AREA REQUIREMENTS
12 ! TO MAKE AN ALTERNATE ALGORITHM
13 ! 19-10-30 Bo CUI - REMOVE "GOTO" STATEMENT
14 !
15 !
16 ! ROUTINE TO COMPUTE PRECIPITATION TYPE USING A DECISION TREE
17 ! APPROACH THAT USES VARIABLES SUCH AS INTEGRATED WET BULB TEMP
18 ! BELOW FREEZING AND LOWEST LAYER TEMPERATURE
19 !
20 ! SEE BALDWIN AND CONTORNO PREPRINT FROM 13TH WEATHER ANALYSIS
21 ! AND FORECASTING CONFERENCE FOR MORE DETAILS
22 ! (OR BALDWIN ET AL, 10TH NWP CONFERENCE PREPRINT)
23 !
24 ! SINCE THE ORIGINAL VERSION OF THE ALGORITHM HAS A HIGH BIAS
25 ! FOR FREEZING RAIN AND SLEET, THE GOAL IS TO BALANCE THAT BIAS
26 ! WITH A VERSION MORE LIKELY TO PREDICT SNOW
27 !
28  use params_mod, only: h1m12, d00, d608, h1, rog
29  use ctlblk_mod, only: jsta, jend, modelname, pthresh, im, jsta_2l, jend_2u, lm,&
30  lp1, spval
31 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32  implicit none
33 !
34 ! LIST OF VARIABLES NEEDED
35 ! PARAMETERS:
36 ! D608,ROG,H1,D00
37 !HC PARAMETER(D608=0.608,ROG=287.04/9.8,H1=1.0,D00=0.0)
38 !
39 ! INPUT:
40 ! T,Q,PMID,HTM,LMH,PREC,ZINT
41  REAL,dimension(IM,jsta_2l:jend_2u,LM), intent(in) :: t,q,pmid,htm
42  REAL,dimension(IM,jsta_2l:jend_2u,LP1),intent(in) :: pint,zint
43  REAL,dimension(IM,jsta_2l:jend_2u), intent(in) :: lmh
44  REAL,dimension(IM,jsta_2l:jend_2u), intent(in) :: prec
45 ! OUTPUT:
46 ! IWX - INSTANTANEOUS WEATHER TYPE.
47 ! ACTS LIKE A 4 BIT BINARY
48 ! 1111 = RAIN/FREEZING RAIN/ICE PELLETS/SNOW
49 ! WHERE THE ONE'S DIGIT IS FOR SNOW
50 ! THE TWO'S DIGIT IS FOR ICE PELLETS
51 ! THE FOUR'S DIGIT IS FOR FREEZING RAIN
52 ! AND THE EIGHT'S DIGIT IS FOR RAIN
53  integer, DIMENSION(IM,jsta:jend),intent(inout) :: iwx
54 ! INTERNAL:
55 !
56  REAL, ALLOCATABLE :: twet(:,:,:)
57  integer,DIMENSION(IM,jsta:jend) :: karr,licee
58  real, dimension(IM,jsta:jend) :: tcold,twarm
59 !
60  integer i,j,l,lmhk,lice,ifrel,iwrml,ifrzl
61  real psfck,tdchk,a,tdkl,tdpre,tlmhk,twrmk,areas8,areap4,area1, &
62  surfw,surfc,dzkl,pintk1,pintk2,pm150,qkl,tkl,pkl,area0, &
63  areap0
64 
65  logical :: jcontinue=.true.
66 
67 ! SUBROUTINES CALLED:
68 ! WETBULB
69 !
70 !
71 ! INITIALIZE WEATHER TYPE ARRAY TO ZERO (IE, OFF).
72 ! WE DO THIS SINCE WE WANT IWX TO REPRESENT THE
73 ! INSTANTANEOUS WEATHER TYPE ON RETURN.
74 !
75 !
76 ! ALLOCATE LOCAL STORAGE
77 !
78  ALLOCATE ( twet(im,jsta_2l:jend_2u,lm) )
79 !
80 !$omp parallel do
81  DO j=jsta,jend
82  DO i=1,im
83  iwx(i,j) = 0
84  ENDDO
85  ENDDO
86 
87 !
88 !!$omp parallel do
89 !!$omp& private(a,lmhk,pkl,psfck,qkl,tdchk,tdkl,tdpre,tkl)
90  DO 800 j=jsta,jend
91  DO 800 i=1,im
92  lmhk=nint(lmh(i,j))
93 !
94 ! SKIP THIS POINT IF NO PRECIP THIS TIME STEP
95 !
96  IF (prec(i,j)<=pthresh) cycle
97 !
98 ! FIND COLDEST AND WARMEST TEMPS IN SATURATED LAYER BETWEEN
99 ! 70 MB ABOVE GROUND AND 500 MB
100 ! ALSO FIND HIGHEST SATURATED LAYER IN THAT RANGE
101 !
102 !meb
103  psfck=pint(i,j,lmhk+1)
104 !meb
105  tdchk=2.0
106 
107  jcontinue=.true.
108  do while (jcontinue)
109 
110  760 tcold(i,j)=t(i,j,lmhk)
111  twarm(i,j)=t(i,j,lmhk)
112  licee(i,j)=lmhk
113 !
114  DO 775 l=1,lmhk
115  qkl=q(i,j,l)
116  qkl=amax1(h1m12,qkl)
117  tkl=t(i,j,l)
118  pkl=pmid(i,j,l)
119 !
120 ! SKIP PAST THIS IF THE LAYER IS NOT BETWEEN 70 MB ABOVE GROUND
121 ! AND 500 MB
122 !
123  IF (pkl<50000.0.OR.pkl>psfck-7000.0) cycle
124  IF(qkl<spval)THEN
125  a=alog(qkl*pkl/(610.78*(0.378*qkl+0.622)))
126  tdkl=(237.3*a)/(17.269-a)+273.15
127  tdpre=tkl-tdkl
128  IF (tdpre<tdchk.AND.tkl<tcold(i,j)) tcold(i,j)=tkl
129  IF (tdpre<tdchk.AND.tkl>twarm(i,j)) twarm(i,j)=tkl
130  IF (tdpre<tdchk.AND.l<licee(i,j)) licee(i,j)=l
131  ENDIF
132  775 CONTINUE
133 !
134 ! IF NO SAT LAYER AT DEW POINT DEP=TDCHK, INCREASE TDCHK
135 ! AND START AGAIN (BUT DON'T MAKE TDCHK > 6)
136 !
137  IF (tcold(i,j)==t(i,j,lmhk).AND.tdchk<6.0) THEN
138  tdchk=tdchk+2.0
139  ELSE
140  jcontinue=.false.
141  ENDIF
142  enddo ! enddo jcontinue
143  800 CONTINUE
144 !
145 ! LOWEST LAYER T
146 !
147  DO 850 j=jsta,jend
148  DO 850 i=1,im
149  karr(i,j)=0
150  IF (prec(i,j)<=pthresh) cycle
151  lmhk=nint(lmh(i,j))
152  tlmhk=t(i,j,lmhk)
153 !
154 ! DECISION TREE TIME
155 !
156  IF (tcold(i,j)>269.15) THEN
157  IF (tlmhk<=273.15) THEN
158 ! TURN ON THE FLAG FOR
159 ! FREEZING RAIN = 4
160 ! IF ITS NOT ON ALREADY
161 ! IZR=MOD(IWX(I,J),8)/4
162 ! IF (IZR<1) IWX(I,J)=IWX(I,J)+4
163  iwx(i,j)=iwx(i,j)+4
164  cycle
165  ELSE
166 ! TURN ON THE FLAG FOR
167 ! RAIN = 8
168 ! IF ITS NOT ON ALREADY
169 ! IRAIN=IWX(I,J)/8
170 ! IF (IRAIN<1) IWX(I,J)=IWX(I,J)+8
171  iwx(i,j)=iwx(i,j)+8
172  cycle
173  ENDIF
174  ENDIF
175  karr(i,j)=1
176  850 CONTINUE
177 !
178 ! COMPUTE WET BULB ONLY AT POINTS THAT NEED IT
179 !
180  CALL wetbulb(t,q,pmid,htm,karr,twet)
181 !
182 !!$omp parallel do
183 !!$omp& private(area1,areap4,areap0,areas8,dzkl,ifrzl,iwrml,lice,
184 !!$omp& lmhk,pintk1,pintk2,pm150,psfck,surfc,surfw,
185 !!$omp& tlmhk,twrmk)
186  DO 1900 j=jsta,jend
187  DO 1900 i=1,im
188  IF(karr(i,j)>0)THEN
189  lmhk=nint(lmh(i,j))
190  lice=licee(i,j)
191 !meb
192  psfck=pint(i,j,lmhk+1)
193 !meb
194  tlmhk=t(i,j,lmhk)
195  twrmk=twarm(i,j)
196 !
197 ! TWET AREA VARIABLES
198 ! CALCULATE ONLY WHAT IS NEEDED
199 ! FROM GROUND TO 150 MB ABOVE SURFACE
200 ! FROM GROUND TO TCOLD LAYER
201 ! AND FROM GROUND TO 1ST LAYER WHERE WET BULB T < 0.0
202 !
203 ! PINTK1 IS THE PRESSURE AT THE BOTTOM OF THE LAYER
204 ! PINTK2 IS THE PRESSURE AT THE TOP OF THE LAYER
205 !
206 ! AREAP4 IS THE AREA OF TWET ABOVE -4 C BELOW HIGHEST SAT LYR
207 ! AREAP0 IS THE AREA OF TWET ABOVE 0 C BELOW HIGHEST SAT LYR
208 !
209  areas8=d00
210  areap4=d00
211  areap0=d00
212  surfw =d00
213  surfc =d00
214 
215 !
216  DO 1945 l=lmhk,lice,-1
217  dzkl=zint(i,j,l)-zint(i,j,l+1)
218  area1=(twet(i,j,l)-269.15)*dzkl
219  area0=(twet(i,j,l)-273.15)*dzkl
220  IF (twet(i,j,l)>=269.15) areap4=areap4+area1
221  IF (twet(i,j,l)>=273.15) areap0=areap0+area0
222  1945 CONTINUE
223 !
224 ! IF (AREAP4<3000.0) THEN
225 ! TURN ON THE FLAG FOR
226 ! SNOW = 1
227 ! IF ITS NOT ON ALREADY
228 ! ISNO=MOD(IWX(I,J),2)
229 ! IF (ISNO<1) IWX(I,J)=IWX(I,J)+1
230 ! IWX(I,J)=IWX(I,J)+1
231 ! GO TO 1900
232 ! ENDIF
233  IF (areap0<350.0) THEN
234 ! TURN ON THE FLAG FOR
235 ! SNOW = 1
236  iwx(i,j)=iwx(i,j)+1
237  cycle
238  ENDIF
239 !
240 ! AREAS8 IS THE NET AREA OF TWET W.R.T. FREEZING IN LOWEST 150MB
241 !
242  pintk1=psfck
243  pm150=psfck-15000.
244 !
245  DO 1955 l=lmhk,1,-1
246  pintk2=pint(i,j,l)
247  IF(pintk1<pm150) THEN
248  pintk1=pintk2
249  ELSE
250  dzkl=zint(i,j,l)-zint(i,j,l+1)
251 !
252 ! SUM PARTIAL LAYER IF IN 150 MB AGL LAYER
253 !
254  IF(pintk2<pm150) &
255  dzkl=t(i,j,l)*(q(i,j,l)*d608+h1)*rog* &
256  alog(pintk1/pm150)
257  area1=(twet(i,j,l)-273.15)*dzkl
258  areas8=areas8+area1
259  pintk1=pintk2
260  ENDIF
261  1955 CONTINUE
262 !
263 ! SURFW IS THE AREA OF TWET ABOVE FREEZING BETWEEN THE GROUND
264 ! AND THE FIRST LAYER ABOVE GROUND BELOW FREEZING
265 ! SURFC IS THE AREA OF TWET BELOW FREEZING BETWEEN THE GROUND
266 ! AND THE WARMEST SAT LAYER
267 !
268  ifrzl=0
269  iwrml=0
270 !
271  DO 2050 l=lmhk,1,-1
272  IF (ifrzl==0.AND.t(i,j,l)<273.15) ifrzl=1
273  IF (iwrml==0.AND.t(i,j,l)>=twrmk) iwrml=1
274 !
275  IF (iwrml==0.OR.ifrzl==0) THEN
276  dzkl=zint(i,j,l)-zint(i,j,l+1)
277  area1=(twet(i,j,l)-273.15)*dzkl
278  IF(ifrzl==0.AND.twet(i,j,l)>=273.15)surfw=surfw+area1
279  IF(iwrml==0.AND.twet(i,j,l)<=273.15)surfc=surfc+area1
280  ENDIF
281  2050 CONTINUE
282  IF(surfc<-3000.0.OR. &
283  & (areas8<-3000.0.AND.surfw<50.0)) THEN
284 ! TURN ON THE FLAG FOR
285 ! ICE PELLETS = 2
286 ! IF ITS NOT ON ALREADY
287 ! IIP=MOD(IWX(I,J),4)/2
288 ! IF (IIP<1) IWX(I,J)=IWX(I,J)+2
289  iwx(i,j)=iwx(i,j)+2
290  cycle
291  ENDIF
292 !
293  IF(tlmhk<273.15) THEN
294 ! TURN ON THE FLAG FOR
295 ! FREEZING RAIN = 4
296 ! IF ITS NOT ON ALREADY
297 ! IZR=MOD(IWX(K),8)/4
298 ! IF (IZR<1) IWX(K)=IWX(K)+4
299  iwx(i,j)=iwx(i,j)+4
300  ELSE
301 ! TURN ON THE FLAG FOR
302 ! RAIN = 8
303 ! IF ITS NOT ON ALREADY
304 ! IRAIN=IWX(K)/8
305 ! IF (IRAIN<1) IWX(K)=IWX(K)+8
306  iwx(i,j)=iwx(i,j)+8
307  ENDIF
308  ENDIF
309  1900 CONTINUE
310 ! print *, 'revised check ', IWX(500,800)
311 
312 !---------------------------------------------------------
313  DEALLOCATE (twet)
314 
315 
316  RETURN
317  END