1 | 'reinit' |
---|
2 | 'open foo.ctl' |
---|
3 | |
---|
4 | 'set t 1' |
---|
5 | 'q dims' |
---|
6 | rec=sublin(result,5) |
---|
7 | _analysis=subwrd(rec,6) |
---|
8 | say 'Initial Time is ' _analysis |
---|
9 | |
---|
10 | say 'Create gif images as well (1=yes ; 0=no)' |
---|
11 | pull ans |
---|
12 | frame = 1 |
---|
13 | |
---|
14 | 'q file' |
---|
15 | rec=sublin(result,5) |
---|
16 | _endtime=subwrd(rec,12) |
---|
17 | 'q dims' |
---|
18 | rec=sublin(result,2) |
---|
19 | _alon1=subwrd(rec,6) |
---|
20 | _alon2=subwrd(rec,8) |
---|
21 | rec=sublin(result,3) |
---|
22 | _alat1=subwrd(rec,6) |
---|
23 | _alat2=subwrd(rec,8) |
---|
24 | |
---|
25 | BigRun = 1 |
---|
26 | while (BigRun) |
---|
27 | |
---|
28 | irun = 1 |
---|
29 | |
---|
30 | * loc ( 38.58, -77.0 ) |
---|
31 | say 'Please enter coordinated for sounding' |
---|
32 | say ' ' |
---|
33 | |
---|
34 | say 'Latitude values between: ' _alat1 ' and ' _alat2 |
---|
35 | say 'Enter Latitude' |
---|
36 | pull lat1 |
---|
37 | say ' ' |
---|
38 | say 'Longitude values between: ' _alon1 ' and ' _alon2 |
---|
39 | say 'Enter Longitude' |
---|
40 | pull lon1 |
---|
41 | |
---|
42 | say ' ' |
---|
43 | say 'Overlay two time periods 1=yes ; 0=no' |
---|
44 | pull olans |
---|
45 | overlay = 1 |
---|
46 | |
---|
47 | while(irun) |
---|
48 | say ' ' |
---|
49 | say 'Please enter time to plot' |
---|
50 | say 'Available times: 1 to ' _endtime |
---|
51 | pull ans |
---|
52 | 'set t 'ans |
---|
53 | 'set lon 'lon1 |
---|
54 | 'set lat 'lat1 |
---|
55 | 'set lev 1000 100' |
---|
56 | 'define wspd=(sqrt(u*u + v*v))*1.89' |
---|
57 | 'define dir=(atan2(u,v))*57.2957795+180.0' |
---|
58 | if (overlay = 1) |
---|
59 | SCol = 1 |
---|
60 | HCol = 5 |
---|
61 | BCol = -1 |
---|
62 | endif |
---|
63 | if (overlay = 2) |
---|
64 | SCol = 3 |
---|
65 | HCol = 11 |
---|
66 | BCol = 1 |
---|
67 | endif |
---|
68 | |
---|
69 | rc=plotskew(tc,td,wspd,dir,0,SCol,SCol,SCol,HCol,overlay,BCol) |
---|
70 | |
---|
71 | if (olans) |
---|
72 | overlay = 2 |
---|
73 | olans = 0 |
---|
74 | else |
---|
75 | irun = 0 |
---|
76 | endif |
---|
77 | |
---|
78 | endwhile |
---|
79 | |
---|
80 | if(ans) |
---|
81 | 'printim skew'frame'.gif gif' |
---|
82 | frame=frame+1 |
---|
83 | endif |
---|
84 | |
---|
85 | say ' ' |
---|
86 | say 'Continue with another sounding 1=yes ; 0=no' |
---|
87 | pull BigRun |
---|
88 | |
---|
89 | 'reset' |
---|
90 | |
---|
91 | endwhile |
---|
92 | |
---|
93 | |
---|
94 | ************************************************************************* |
---|
95 | function plotskew(sndtemp,snddewp,sndspd,snddir,ClrScrn,TSndCol,DSndCol,PrclCol,RHCol,OL,BarbCol) |
---|
96 | ************************************************************************* |
---|
97 | * |
---|
98 | * GrADS Script to Plot a SkewT/LogP Diagram |
---|
99 | * |
---|
100 | * Bob Hart |
---|
101 | * Penn State University / Dept of Meteorology |
---|
102 | * Last Update: November 10, 1999 |
---|
103 | * |
---|
104 | * Recent Changes: |
---|
105 | * |
---|
106 | * 11/10/99 - Change in calculation method for CAPE/CIN. Trapezoid |
---|
107 | * integration method is now used. Speeds up execution |
---|
108 | * by 25%, and increases accuracy by 5-10%. |
---|
109 | * |
---|
110 | * 10/18/99 - Minor glitch fixed that occasionally caused crash. |
---|
111 | * |
---|
112 | * 8/26/99 - Datasets with missing data can now be used. |
---|
113 | * |
---|
114 | * Features: |
---|
115 | * - All features of standard skewt/logp plot |
---|
116 | * - RH sounding |
---|
117 | * - LCL location |
---|
118 | * - Parcel trajectory for both sfc based convection and elevated from |
---|
119 | * most unstable level (highest theta-e level reported) |
---|
120 | * - Stability indices and precipitable water calculations |
---|
121 | * - CAPE & CIN Calculations |
---|
122 | * - Wind Profile |
---|
123 | * - Hodograph / Hodograph scaling |
---|
124 | * - Helicity and SR Helicity Calculations and Display |
---|
125 | * - Color aspects of output |
---|
126 | * - Line Thickness, style aspects of output |
---|
127 | * - Can be run in either PORTRAIT or LANDSCAPE mode. |
---|
128 | * |
---|
129 | * There are numerous tunable parameters below to change the structure |
---|
130 | * and output for the diagram. |
---|
131 | * |
---|
132 | * Function Arguments: |
---|
133 | * sndtemp - temperature data (Celsius) as a function of pressure |
---|
134 | * snddewp - dewpoint data (Celsius) as a function of pressure |
---|
135 | * sndspd - wind speed data (knots) as a function of pressure |
---|
136 | * snddir - wind direction data as a function of pressure |
---|
137 | * |
---|
138 | * Use '-1' for any of the above 4 arguments to indicate that you |
---|
139 | * are not passing that variable. The appropriate options will |
---|
140 | * be ignored based on your specifying '-1' for that variable. |
---|
141 | * |
---|
142 | * NOTE: Make sure to set the vertical range of the plot before running. |
---|
143 | * I.e., "SET LEV 1050 150", for example. This does not have to |
---|
144 | * be limited to the pressure range of your data. |
---|
145 | * |
---|
146 | * Labelling: Pressure/Height is labelled along left side. Temperature is |
---|
147 | * labelled along bottom. Mixing ratio is labelled along right |
---|
148 | * side/top. |
---|
149 | * |
---|
150 | * |
---|
151 | * PROBLEMS: First check out the web page for the script (which also |
---|
152 | * has a link to a FAQ with answers to many common questions |
---|
153 | * about using the script): |
---|
154 | * http://www.ems.psu.edu/~hart/skew.html |
---|
155 | * |
---|
156 | * Please send any further problems, comments, or suggestions to |
---|
157 | * <hart@ems.psu.edu> |
---|
158 | * |
---|
159 | * ACKNOWLEDGMENTS: Thanks go to the innumerable users who have helped |
---|
160 | * fine tune the script from the horrible mess from which it began. |
---|
161 | * In particular, thanks go out to Steve Lord (NCEP), Mike Fiorino (ECMWF), |
---|
162 | * George Bryan (PSU), Davide Sacchetti (CMIRL), and Enrico Minguzzi (CMIRL). |
---|
163 | * |
---|
164 | ************************************************************************** |
---|
165 | * !!!!! BEGINNING OF USER-SPECIFIED OPTIONS !!!!!! |
---|
166 | ************************************************************************** |
---|
167 | * |
---|
168 | * --------------------- Initialization options ---------------------- |
---|
169 | * |
---|
170 | * ClrScrn = Whether to clear the screen before drawing diagram |
---|
171 | * [1 = yes, 0 = no] |
---|
172 | |
---|
173 | *ClrScrn = 1 |
---|
174 | |
---|
175 | * |
---|
176 | * ------------------- Define Skew-T Diagram Shape/Slope----------------- |
---|
177 | * |
---|
178 | * (P1,T1) = Pres, Temp of some point on left-most side |
---|
179 | * (P2,T2) = Pres, Temp of some point on right-most side |
---|
180 | * (P3,T3) = Pres, Temp of some point in diagram which is mid-point |
---|
181 | * in the horizontal between 1 and 2. |
---|
182 | * |
---|
183 | * P1, P2, P3 are in mb ; T1, T2, T3 are in Celsius |
---|
184 | * |
---|
185 | * These define the SLOPE and WIDTH of the diagram as you see it but DO NOT |
---|
186 | * DEFINE THE HEIGHT of the diagram as you see it. In other words, |
---|
187 | * 1 and 2 do NOT necessarily need to be at the bottom of the diagram and |
---|
188 | * 3 does NOT necessarily need to be at the top. THE VERTICAL PRESSURE |
---|
189 | * RANGE OF THE SKEWT AS YOU SEE IT IS DETERMINED BY YOUR 'SET Z ...' |
---|
190 | * COMMAND OR THE 'SET LEV ...' COMMAND BEFORE RUNNING THIS SCRIPT. |
---|
191 | * |
---|
192 | * _______________________ |
---|
193 | * | | |
---|
194 | * | | |
---|
195 | * | 3 | |
---|
196 | * | | |
---|
197 | * | | |
---|
198 | * | | |
---|
199 | * | | |
---|
200 | * | | |
---|
201 | * | | |
---|
202 | * | | |
---|
203 | * | | |
---|
204 | * |1 2| |
---|
205 | * | | |
---|
206 | * |_______________________| |
---|
207 | * |
---|
208 | * |
---|
209 | * A good set of defining points are given below. Feel free |
---|
210 | * to experiment with variations. |
---|
211 | |
---|
212 | |
---|
213 | P1 = 1000 |
---|
214 | T1 = -40 |
---|
215 | |
---|
216 | P2 = 1000 |
---|
217 | T2 = 40 |
---|
218 | |
---|
219 | P3 = 200 |
---|
220 | T3 = -50 |
---|
221 | |
---|
222 | * Another good set of defining points suggested by George Bryan (PSU) |
---|
223 | * are: |
---|
224 | * |
---|
225 | * P1 = 1000 |
---|
226 | * T1 = -30 |
---|
227 | * |
---|
228 | * P2 = 1000 |
---|
229 | * T2 = 40 |
---|
230 | * |
---|
231 | * P3 = 500 |
---|
232 | * T3 = -18 |
---|
233 | |
---|
234 | * ------------------- Contour Intervals / Levels -------------------------- |
---|
235 | * |
---|
236 | * All variables below are contour intervals/levels for diagram |
---|
237 | * |
---|
238 | * Thetaint = interval for potential temperature lines |
---|
239 | * Thetwint = interval for moist pseudo adiabats |
---|
240 | * tempint = interval for temperature lines |
---|
241 | * wsclevs = contour LEVELS for mixing ratio lines |
---|
242 | * |
---|
243 | * |
---|
244 | thetaint= 10 |
---|
245 | thetwint= 5 |
---|
246 | tempint = 10 |
---|
247 | wsclevs = "1 2 3 4 6 8 10 15 20 25 30 35 40" |
---|
248 | * |
---|
249 | * |
---|
250 | * ------------------------ Output Options -------------------------------- |
---|
251 | * |
---|
252 | * All variables below are logical .. 1=yes, 0=no, unless otherwise |
---|
253 | * specified. |
---|
254 | * |
---|
255 | * DrawBarb = Draw wind barbs along right side of plot |
---|
256 | * DrawThet = Draw dry adiabats |
---|
257 | * DrawThtw = Draw moist pseudo-adiabats |
---|
258 | * DrawTemp = Draw temperature lines |
---|
259 | * DrawMix = Draw mixing ratio lines |
---|
260 | * DrawTSnd = Draw temperature sounding |
---|
261 | * DrawDSnd = Draw dewpoint sounding |
---|
262 | * DrawRH = Draw relative humidity sounding |
---|
263 | * DrawPrcl = Draw parcel path from surface upward |
---|
264 | * DrawPMax = Draw parcel path from most unstable level upward |
---|
265 | * DrawIndx = Display stability indices & CAPE |
---|
266 | * DrawHeli = Calculate and display absolute and storm-relative helicity |
---|
267 | * DrawHodo = Draw hodograph |
---|
268 | * DrawPLev = Draw Pressure Levels |
---|
269 | * DrawZLev = Draw height levels and lines |
---|
270 | * 0 = no lines |
---|
271 | * 1 = above ground level (AGL) |
---|
272 | * 2 = above sea level (ASL) |
---|
273 | * DrawZSTD = Draw Height levels using standard atm lapse rate |
---|
274 | * LblAxes = Label the x,y axes (temperature, pressure,mixing ratio) |
---|
275 | * |
---|
276 | * ThtwStop = Pressure level at which to stop drawing Theta-w lines |
---|
277 | * MixStop = Pressure level at which to stop drawing Mixratio lines |
---|
278 | |
---|
279 | DrawBarb= 1 |
---|
280 | DrawThet= 1 |
---|
281 | DrawThtw= 0 |
---|
282 | DrawTemp= 1 |
---|
283 | DrawMix = 1 |
---|
284 | DrawTSnd= 1 |
---|
285 | DrawDSnd= 1 |
---|
286 | DrawRH = 1 |
---|
287 | DrawPrcl= 1 |
---|
288 | DrawPMax= 0 |
---|
289 | DrawIndx= 1 |
---|
290 | DrawHeli= 1 |
---|
291 | DrawHodo= 1 |
---|
292 | DrawPLev= 1 |
---|
293 | DrawZLev= 0 |
---|
294 | DrawZSTD= 0 |
---|
295 | LblAxes = 1 |
---|
296 | |
---|
297 | ThtwStop = 200 |
---|
298 | MixStop = 600 |
---|
299 | |
---|
300 | |
---|
301 | * |
---|
302 | * ----------------- Sounding Geography options ------------------------ |
---|
303 | * |
---|
304 | * SfcElev = Elevation above sea-level (meters) of lowest level reported |
---|
305 | * in sounding. Used only if DrawZLev = 2 |
---|
306 | |
---|
307 | SfcElev = 0 |
---|
308 | |
---|
309 | |
---|
310 | * |
---|
311 | * ------------------ Thermodynamic Index Options -------------------- |
---|
312 | * |
---|
313 | * All variables here are in inches. Use -1 for the default values. |
---|
314 | * |
---|
315 | * Text1XC = X-location of midpoint of K,TT,PW output box |
---|
316 | * Text1YC = Y-location of midpoint of K,TT,PW output box |
---|
317 | * Text2XC = X-Location of midpoint of surface indices output box |
---|
318 | * Text2YC = Y-location of midpoint of surface indices output box |
---|
319 | * Text3XC = X-Location of midpoint of most unstable level-based indices |
---|
320 | * output box |
---|
321 | * Text3YC = Y-location of midpoint of most unstable level-based indices |
---|
322 | * output box |
---|
323 | |
---|
324 | Text1XC = -1 |
---|
325 | Text1YC = -1 |
---|
326 | Text2XC = -1 |
---|
327 | Text2YC = -1 |
---|
328 | Text3XC = -1 |
---|
329 | Text3YC = -1 |
---|
330 | |
---|
331 | * |
---|
332 | * ----------------- Wind Barb Profile Options ---------------------------- |
---|
333 | * |
---|
334 | * All variables here are in units of inches, unless otherwise specified |
---|
335 | * |
---|
336 | * barbint = Interval for plotting barbs (in units of levels) |
---|
337 | * poleloc = X-Location of profile. Choose -1 for the default. |
---|
338 | * polelen = Length of wind-barb pole |
---|
339 | * Len05 = Length of each 5-knot barb |
---|
340 | * Len10 = Length of each 10-knot barb |
---|
341 | * Len50 = Length of each 50-knot flag |
---|
342 | * Wid50 = Width of base of 50-knot flag |
---|
343 | * Spac50 = Spacing between 50-knot flag and next barb/flag |
---|
344 | * Spac10 = Spacing between 10-knot flag and next flag |
---|
345 | * Spac05 = Spacing between 5-knot flag and next flag |
---|
346 | * Flagbase= Draw flagbase (filled circle) for each windbarb [1=yes, 0 =no] |
---|
347 | * Fill50 = Solid-fill 50-knot flag [1=yes, 0=no] |
---|
348 | * barbline= Draw a vertical line connecting all the wind barbs [1=yes, 0=no] |
---|
349 | * |
---|
350 | barbint = 1 |
---|
351 | poleloc = -1 |
---|
352 | polelen = 0.35 |
---|
353 | len05 = 0.07 |
---|
354 | len10 = 0.15 |
---|
355 | len50 = 0.15 |
---|
356 | wid50 = 0.06 |
---|
357 | spac50 = 0.07 |
---|
358 | spac10 = 0.05 |
---|
359 | spac05 = 0.05 |
---|
360 | Fill50 = 1 |
---|
361 | flagbase= 1 |
---|
362 | barbline= 1 |
---|
363 | |
---|
364 | * |
---|
365 | * |
---|
366 | *---------------- Hodograph Options ------------------------------------- |
---|
367 | * |
---|
368 | * All variables here are in units of inches, unless otherwise specified |
---|
369 | * |
---|
370 | * HodXcent= x-location of hodograph center. Use -1 for default location. |
---|
371 | * HodYcent= y-location of hodograph center. Use -1 for default location. |
---|
372 | * HodSize = Size of hodograph in inches |
---|
373 | * NumRing = Number of rings to place in hodograph (must be at least 1) |
---|
374 | * HodRing = Wind speed increment of each hodograph ring |
---|
375 | * HodoDep = Depth (above lowest level in mb) of end of hodograph trace |
---|
376 | * TickInt = Interval (in kts) at which tick marks are drawn along the axes |
---|
377 | * Use 0 for no tick marks. |
---|
378 | * TickSize= Size of tick mark in inches |
---|
379 | * Text4XC = X-location of midpoint of hodograph text output. Use -1 for default. |
---|
380 | * Text4YC = Y-location of midpoint of hodograph text output. Use -1 for default. |
---|
381 | |
---|
382 | HodXcent= -1 |
---|
383 | HodYcent= -1 |
---|
384 | HodSize = 2 |
---|
385 | NumRing = 4 |
---|
386 | HodRing = 10 |
---|
387 | HodoDep = 300 |
---|
388 | TickInt = 5 |
---|
389 | TickSize= 0.05 |
---|
390 | Text4XC = -1 |
---|
391 | Text4YC = -1 |
---|
392 | |
---|
393 | *--------------- Helicity Options --------------------------------------- |
---|
394 | * |
---|
395 | * MeanVTop = Top pressure level (mb) of mean-wind calculation |
---|
396 | * MeanVBot = Bottom pressure level (mb) of mean-wind calculation |
---|
397 | * HelicDep = Depth in mb (above ground) of helicity integration |
---|
398 | * StormMot = Type of storm motion estimation scheme. Use following: |
---|
399 | * 0 = No departure from mean wind. |
---|
400 | * 1 = Davies-Jones (1990) approach |
---|
401 | * FillArrw = Whether to fill the arrowhead of the storm motion vector |
---|
402 | * [1 = yes, 0 = no] |
---|
403 | |
---|
404 | MeanVTop= 300 |
---|
405 | MeanVBot= 850 |
---|
406 | HelicDep= 300 |
---|
407 | StormMot= 1 |
---|
408 | FillArrw= 1 |
---|
409 | |
---|
410 | * |
---|
411 | *---------------- Color Options ------------------------------------------ |
---|
412 | * |
---|
413 | * ThetCol = Color of dry adiabats |
---|
414 | * TempCol = Color of temperature lines |
---|
415 | * MixCol = Color of mixing ratio lines |
---|
416 | * ThtwCol = Color of moist adiabats |
---|
417 | * TSndCol = Color of Temperature Sounding |
---|
418 | * DSndCol = Color of Dewpoint Sounding |
---|
419 | * RHCol = Color of RH Sounding |
---|
420 | * PrclCol = Color of parcel trace |
---|
421 | * BarbCol = Color of wind barbs (choose -1 for color according to speed) |
---|
422 | * HodoCol = Color of hodograph trace |
---|
423 | |
---|
424 | ThetCol = 2 |
---|
425 | TempCol = 4 |
---|
426 | MixCol = 7 |
---|
427 | ThtwCol = 3 |
---|
428 | *TSndCol = 1 |
---|
429 | *DSndCol = 1 |
---|
430 | *RHCol = 10 |
---|
431 | *PrclCol = 5 |
---|
432 | *BarbCol = -1 |
---|
433 | HodoCol = 1 |
---|
434 | |
---|
435 | * |
---|
436 | *-------------------- Line Style Options ------------------------------------ |
---|
437 | * |
---|
438 | * GrADS Styles: 1=solid;2=long dash;3=short dash;4=long,short dashed; |
---|
439 | * 5=dotted;6=dot dash;7=dot dot dash |
---|
440 | * |
---|
441 | * ThetLine = Line Style of dry adiabats |
---|
442 | * TempLine = Line Style of temperature lines |
---|
443 | * MixLine = Line Style of mixing ratio lines |
---|
444 | * ThtwLine = Line Style of moist adiabats |
---|
445 | * TSndLine = Line Style of Temperature Sounding |
---|
446 | * DSndLine = Line Style of Dewpoint Sounding |
---|
447 | * RHLine = Line Style of RH sounding |
---|
448 | * PrclLine = Line Style of parcel trace |
---|
449 | * HodoLine = Line Style of hodograph trace |
---|
450 | * |
---|
451 | |
---|
452 | ThetLine = 1 |
---|
453 | TempLine = 1 |
---|
454 | MixLine = 5 |
---|
455 | ThtwLine = 3 |
---|
456 | TSndLine = 1 |
---|
457 | DSndLine = 1 |
---|
458 | RHLine = 1 |
---|
459 | PrclLine = 3 |
---|
460 | HodoLine = 1 |
---|
461 | |
---|
462 | * |
---|
463 | *------------------- Line Thickness Options--------------------------------- |
---|
464 | * GrADS Line Thickness: increases with increasing number. Influences |
---|
465 | * hardcopy output more strongly than screen output. |
---|
466 | * |
---|
467 | * |
---|
468 | * ThetThk = Line Thickness of dry adiabats |
---|
469 | * TempThk = Line Thickness of temperature lines |
---|
470 | * MixThk = Line Thickness of mixing ratio lines |
---|
471 | * ThtwThk = Line Thickness of moist adiabats |
---|
472 | * TSndThk = Line Thickness of temperature sounding |
---|
473 | * DSndThk = Line thickness of dewpoint sounding |
---|
474 | * RHThk = Line thickness of RH sounding |
---|
475 | * PrclThk = Line thickness of parcel trace |
---|
476 | * HodoThk = Line thickness of hodograph trace |
---|
477 | * BarbThk = Line thickness of wind barbs |
---|
478 | |
---|
479 | ThetThk = 3 |
---|
480 | TempThk = 3 |
---|
481 | MixThk = 3 |
---|
482 | ThtwThk = 3 |
---|
483 | TSndThk = 8 |
---|
484 | DSndThk = 8 |
---|
485 | RHThk = 8 |
---|
486 | PrclThk = 6 |
---|
487 | HodoThk = 3 |
---|
488 | BarbThk = 2 |
---|
489 | |
---|
490 | * |
---|
491 | *------------------- Data Point Marker Options ----------------------------- |
---|
492 | * GrADS Marker Types: 0 = none ; 1 = cross ; 2 = open circle ; |
---|
493 | * 3 = closed circle ; 4 = open square ; 5 = closed square |
---|
494 | * 6 = X ; 7 = diamond ; 8 = triangle ; 9 = none |
---|
495 | * 10 = open circle with vertical line ; 11 = open oval |
---|
496 | * |
---|
497 | * TSndMrk = Mark type of data point marker for temperature sounding |
---|
498 | * DSndMrk = Mark type of data point marker for dewpoint sounding |
---|
499 | * RHMrk = Mark type of data point marker for relative humidity sounding |
---|
500 | * MrkSize = Mark size (inches) of each data marker |
---|
501 | |
---|
502 | TSndMrk = 0 |
---|
503 | DSndMrk = 0 |
---|
504 | RHMrk = 0 |
---|
505 | MrkSize = 0.1 |
---|
506 | |
---|
507 | |
---|
508 | * !!!!! YOU SHOULD NOT NEED TO CHANGE ANYTHING BELOW HERE !!!!! |
---|
509 | **************************************************************************** |
---|
510 | |
---|
511 | *------------------------------------------- |
---|
512 | * grab user-specified environment dimensions |
---|
513 | *------------------------------------------- |
---|
514 | |
---|
515 | "q dims" |
---|
516 | rec=sublin(result,2) |
---|
517 | _xtype=subwrd(rec,3) |
---|
518 | _xlon=subwrd(rec,6) |
---|
519 | _xval=subwrd(rec,9) |
---|
520 | rec=sublin(result,3) |
---|
521 | _yval=subwrd(rec,9) |
---|
522 | _ylat=subwrd(rec,6) |
---|
523 | _ytype=subwrd(rec,3) |
---|
524 | rec=sublin(result,4) |
---|
525 | _ptype=subwrd(rec,3) |
---|
526 | _pmax=subwrd(rec,6) |
---|
527 | _pmin=subwrd(rec,8) |
---|
528 | _zmin=subwrd(rec,11) |
---|
529 | _zmax=subwrd(rec,13) |
---|
530 | rec=sublin(result,5) |
---|
531 | _ttype=subwrd(rec,3) |
---|
532 | _ttime=subwrd(rec,6) |
---|
533 | _tval=subwrd(rec,9) |
---|
534 | |
---|
535 | "q file" |
---|
536 | rec=sublin(result,5) |
---|
537 | _zmaxfile=subwrd(rec,9) |
---|
538 | |
---|
539 | *------------------------------------------------------------- |
---|
540 | * Check to ensure that dimensions are valid. Warn & exit if not. |
---|
541 | *-------------------------------------------------------------- |
---|
542 | |
---|
543 | dimrc=0 |
---|
544 | If (_xtype != "fixed") |
---|
545 | say "X-Dims Error: Not fixed. Use 'set lon' or 'set x' to specify a value." |
---|
546 | dimrc=-1 |
---|
547 | Endif |
---|
548 | |
---|
549 | If (_ytype != "fixed") |
---|
550 | say "Y-Dims Error: Not fixed. Use 'set lat' or 'set y' to specify a value" |
---|
551 | dimrc=-1 |
---|
552 | Endif |
---|
553 | |
---|
554 | If (_ptype != "varying") |
---|
555 | say "Z-Dims Error: Not varying. Use 'set lev' or 'set z' to specify a range." |
---|
556 | dimrc=-1 |
---|
557 | Endif |
---|
558 | |
---|
559 | If (_ttype != "fixed") |
---|
560 | say "Time Error: Not fixed. Use 'set time' or 'set t' to specify a value" |
---|
561 | dimrc=-1 |
---|
562 | Endif |
---|
563 | |
---|
564 | |
---|
565 | If (dimrc < 0) |
---|
566 | Return(-1) |
---|
567 | Endif |
---|
568 | |
---|
569 | |
---|
570 | * |
---|
571 | * A few global variables used in units conversion |
---|
572 | * |
---|
573 | |
---|
574 | _pi=3.14159265 |
---|
575 | _dtr=_pi/180 |
---|
576 | _rtd=1/_dtr |
---|
577 | _ktm=0.514444 |
---|
578 | _mtk=1/_ktm |
---|
579 | |
---|
580 | * A few global constants used in thermo calcs |
---|
581 | |
---|
582 | _C0=0.99999683 |
---|
583 | _C1=-0.90826951/100 |
---|
584 | _C2= 0.78736169/10000 |
---|
585 | _C3=-0.61117958/1000000 |
---|
586 | _C4= 0.43884187/pow(10,8) |
---|
587 | _C5=-0.29883885/pow(10,10) |
---|
588 | _C6= 0.21874425/pow(10,12) |
---|
589 | _C7=-0.17892321/pow(10,14) |
---|
590 | _C8= 0.11112018/pow(10,16) |
---|
591 | _C9=-0.30994571/pow(10,19) |
---|
592 | |
---|
593 | * A pressure array of power calculations which should be performed |
---|
594 | * only once to reduce execution time. |
---|
595 | |
---|
596 | zz=1100 |
---|
597 | while (zz > 10) |
---|
598 | subscr=zz/10 |
---|
599 | _powpres.subscr=pow(zz,0.286) |
---|
600 | zz=zz-10 |
---|
601 | endwhile |
---|
602 | |
---|
603 | * |
---|
604 | * Turn off options not available due to user data limitations |
---|
605 | * |
---|
606 | |
---|
607 | If (ClrScrn = 1) |
---|
608 | "clear" |
---|
609 | Endif |
---|
610 | |
---|
611 | If (sndspd = -1 | snddir = -1) |
---|
612 | DrawBarb = 0 |
---|
613 | DrawHodo = 0 |
---|
614 | DrawHeli = 0 |
---|
615 | Endif |
---|
616 | |
---|
617 | If (snddewp = -1) |
---|
618 | DrawDSnd = 0 |
---|
619 | DrawRH = 0 |
---|
620 | DrawPrcl = 0 |
---|
621 | DrawPMax = 0 |
---|
622 | DrawIndx = 0 |
---|
623 | Endif |
---|
624 | |
---|
625 | If (sndtemp = -1) |
---|
626 | DrawTSnd = 0 |
---|
627 | DrawRH = 0 |
---|
628 | DrawPrcl = 0 |
---|
629 | DrawPMax = 0 |
---|
630 | DrawIndx = 0 |
---|
631 | DrawZLev = 0 |
---|
632 | Endif |
---|
633 | |
---|
634 | If (NumRing < 1) |
---|
635 | DrawHodo = 0 |
---|
636 | Endif |
---|
637 | |
---|
638 | "q gxinfo" |
---|
639 | rec=sublin(result,2) |
---|
640 | xsize=subwrd(rec,4) |
---|
641 | |
---|
642 | If (xsize = 11) |
---|
643 | PageType = "Landscape" |
---|
644 | Else |
---|
645 | PageType = "Portrait" |
---|
646 | Endif |
---|
647 | |
---|
648 | *------------------------------------------------------ |
---|
649 | * calculate constants determining slope/shape of diagram |
---|
650 | * based on temp/pressure values given by user |
---|
651 | *------------------------------------------------------- |
---|
652 | |
---|
653 | "set x 1" |
---|
654 | "set y 1" |
---|
655 | "set z 1" |
---|
656 | "set t 1" |
---|
657 | _m1=(T1+T2-2*T3)/(2*log10(P2/P3)) |
---|
658 | _m2=(T2-T3-_m1*log10(P2/P3))/50 |
---|
659 | _m3=(T1-_m1*log10(P1)) |
---|
660 | |
---|
661 | "set z "_zmin" "_zmax |
---|
662 | "set zlog on" |
---|
663 | "set xlab off" |
---|
664 | |
---|
665 | *------------------------------------------------- |
---|
666 | * perform coordinate transformation to Skew-T/LogP |
---|
667 | *------------------------------------------------- |
---|
668 | |
---|
669 | "set gxout stat" |
---|
670 | "set x "_xval |
---|
671 | "set y "_yval |
---|
672 | "set t "_tval |
---|
673 | "define tempx=("sndtemp"-"_m1"*log10(lev)-"_m3")/"_m2 |
---|
674 | "define dewpx=("snddewp"-"_m1"*log10(lev)-"_m3")/"_m2 |
---|
675 | |
---|
676 | If (PageType = "Portrait") |
---|
677 | "set parea 0.7 7 0.75 10.5" |
---|
678 | Else |
---|
679 | "set parea 0.7 6.5 0.5 8" |
---|
680 | Endif |
---|
681 | |
---|
682 | "set axlim 0 100" |
---|
683 | "set lon 0 100" |
---|
684 | "set grid on 1 1" |
---|
685 | |
---|
686 | "set z "_zmin " " _zmax |
---|
687 | "set lon 0 100" |
---|
688 | "set clevs -900" |
---|
689 | "set gxout contour" |
---|
690 | |
---|
691 | *------------------------------------- |
---|
692 | * Draw pressure lines |
---|
693 | *------------------------------------- |
---|
694 | |
---|
695 | If (DrawPLev = 0) |
---|
696 | "set ylab off" |
---|
697 | Else |
---|
698 | "set ylab on" |
---|
699 | "set ylopts 1 3 0.10" |
---|
700 | "set xlopts 1 3 0.125" |
---|
701 | Endif |
---|
702 | |
---|
703 | "d lon" |
---|
704 | |
---|
705 | *-------------------------------------- |
---|
706 | * Determine corners of skewt/logp frame |
---|
707 | *-------------------------------------- |
---|
708 | |
---|
709 | "q w2xy 100 "_pmin |
---|
710 | rxloc=subwrd(result,3) |
---|
711 | tyloc=subwrd(result,6) |
---|
712 | "q w2xy 0 "_pmax |
---|
713 | lxloc=subwrd(result,3) |
---|
714 | byloc=subwrd(result,6) |
---|
715 | |
---|
716 | If (DrawPLev = 1 & LblAxes = 1) |
---|
717 | "set strsiz 0.10" |
---|
718 | "set string 1 c 3 0" |
---|
719 | If (PageType = "Portrait") |
---|
720 | "draw string 0.5 10.85 mb" |
---|
721 | Else |
---|
722 | "draw string 0.5 8.35 mb" |
---|
723 | Endif |
---|
724 | Endif |
---|
725 | |
---|
726 | *--------------------------------------------------- |
---|
727 | * Calculate & draw actual height lines using temp data |
---|
728 | *--------------------------------------------------- |
---|
729 | |
---|
730 | If (DrawZLev > 0) |
---|
731 | say "Calculating observed height levels from temp/pressure data." |
---|
732 | zz=1 |
---|
733 | "set gxout stat" |
---|
734 | "set x "_xval |
---|
735 | "set y "_yval |
---|
736 | "set t "_tval |
---|
737 | count=0 |
---|
738 | while (zz < _zmax) |
---|
739 | "set z "zz |
---|
740 | pp.zz=subwrd(result,4) |
---|
741 | lpp.zz=log(pp.zz) |
---|
742 | "d "sndtemp |
---|
743 | rec=sublin(result,1) |
---|
744 | check=substr(rec,1,6) |
---|
745 | If (check = "Notice") |
---|
746 | rec=sublin(result,9) |
---|
747 | Else |
---|
748 | rec=sublin(result,8) |
---|
749 | Endif |
---|
750 | tt=subwrd(rec,4) |
---|
751 | if (tt > -900) |
---|
752 | tk=tt+273.15 |
---|
753 | count=count+1 |
---|
754 | zzm=zz-1 |
---|
755 | If (count = 1) |
---|
756 | If (DrawZLev = 2) |
---|
757 | htlb="ASL" |
---|
758 | height.zz=SfcElev |
---|
759 | Else |
---|
760 | htlb="AGL" |
---|
761 | height.zz=0 |
---|
762 | Endif |
---|
763 | sfcz=height.zz |
---|
764 | Else |
---|
765 | DZ=29.2857*(lpp.zzm-lpp.zz)*(lpp.zz*tk+lpp.zzm*tkold)/(lpp.zz+lpp.zzm) |
---|
766 | height.zz=height.zzm+DZ |
---|
767 | highz=height.zz |
---|
768 | Endif |
---|
769 | else |
---|
770 | height.zz = -9999 |
---|
771 | endif |
---|
772 | tkold=tk |
---|
773 | zz=zz+1 |
---|
774 | endwhile |
---|
775 | |
---|
776 | maxht=int(highz/1000) |
---|
777 | if (int(sfcz/1000) = sfcz/1000) |
---|
778 | minht=int(sfcz/1000) |
---|
779 | else |
---|
780 | minht=1+int(sfcz/1000) |
---|
781 | endif |
---|
782 | |
---|
783 | ht=minht |
---|
784 | "set line 1 3 1" |
---|
785 | "set strsiz 0.10" |
---|
786 | "set string 1 l 3 0" |
---|
787 | while (ht <= maxht) |
---|
788 | zz=1 |
---|
789 | while (height.zz/1000 <= ht) |
---|
790 | zz=zz+1 |
---|
791 | endwhile |
---|
792 | zzm=zz-1 |
---|
793 | PBelow=pp.zzm |
---|
794 | PAbove=pp.zz |
---|
795 | HBelow=height.zzm |
---|
796 | HAbove=height.zz |
---|
797 | DZ=HAbove-HBelow |
---|
798 | DP=PAbove-PBelow |
---|
799 | Del=ht*1000-HBelow |
---|
800 | Est=PBelow+Del*DP/DZ |
---|
801 | If (Est >= _pmin & Est <= _pmax) |
---|
802 | "q w2xy 1 " Est |
---|
803 | yloc=subwrd(result,6) |
---|
804 | "draw line " lxloc " " yloc " " rxloc " " yloc |
---|
805 | "draw string 0.22 "yloc-0.05" "ht |
---|
806 | Endif |
---|
807 | ht=ht+1 |
---|
808 | endwhile |
---|
809 | "set strsiz 0.10" |
---|
810 | "set string 1" |
---|
811 | If (LblAxes = 1) |
---|
812 | If (PageType = "Portrait") |
---|
813 | "draw string 0.25 10.85 km" |
---|
814 | "draw string 0.25 10.75 "htlb |
---|
815 | "draw string 0.25 10.65 OBS" |
---|
816 | Else |
---|
817 | "draw string 0.25 8.35 km" |
---|
818 | "draw string 0.25 8.25 "htlb |
---|
819 | "draw string 0.25 8.15 OBS" |
---|
820 | Endif |
---|
821 | Endif |
---|
822 | Endif |
---|
823 | |
---|
824 | |
---|
825 | *--------------------------------------------------- |
---|
826 | * Draw height levels (height above MSL using Std Atm) |
---|
827 | *--------------------------------------------------- |
---|
828 | |
---|
829 | If (DrawZSTD = 1) |
---|
830 | "set strsiz 0.10" |
---|
831 | minht=30.735*(1-pow(_pmax/1013.26,0.287)) |
---|
832 | minht=int(minht+0.5) |
---|
833 | maxht=30.735*(1-pow(_pmin/1013.26,0.287)) |
---|
834 | maxht=int(maxht) |
---|
835 | "set gxout stat" |
---|
836 | zcount=minht |
---|
837 | while (zcount <= maxht) |
---|
838 | plev=1013.26*pow((1-zcount/30.735),3.4843) |
---|
839 | "q w2xy 0 "plev |
---|
840 | yloc=subwrd(result,6) |
---|
841 | "draw string 0 "yloc-0.05" "zcount |
---|
842 | zcount=zcount+1 |
---|
843 | endwhile |
---|
844 | "set strsiz 0.10" |
---|
845 | If (LblAxes = 1) |
---|
846 | If (PageType = "Portrait") |
---|
847 | "draw string 0 10.85 km" |
---|
848 | "draw string 0 10.75 ASL" |
---|
849 | "draw string 0 10.65 STD" |
---|
850 | Else |
---|
851 | "draw string 0 8.35 km" |
---|
852 | "draw string 0 8.25 ASL" |
---|
853 | "draw string 0 8.15 STD" |
---|
854 | Endif |
---|
855 | Endif |
---|
856 | Endif |
---|
857 | |
---|
858 | |
---|
859 | *----------------------- |
---|
860 | * Plot temperature lines |
---|
861 | *----------------------- |
---|
862 | |
---|
863 | If (DrawTemp = 1) |
---|
864 | "set strsiz 0.1" |
---|
865 | "set z "_zmin " " _zmax |
---|
866 | "set line "TempCol " " TempLine " "TempThk |
---|
867 | "set string 1 c 3 0" |
---|
868 | "set gxout stat" |
---|
869 | maxtline=GetTemp(100,_pmax) |
---|
870 | mintline=GetTemp(0,_pmin) |
---|
871 | |
---|
872 | maxtline=tempint*int(maxtline/tempint) |
---|
873 | mintline=tempint*int(mintline/tempint) |
---|
874 | |
---|
875 | tloop=mintline |
---|
876 | While (tloop <= maxtline) |
---|
877 | Botxtemp=GetXLoc(tloop,_pmax) |
---|
878 | "q w2xy "Botxtemp " " _pmax |
---|
879 | Botxloc=subwrd(result,3) |
---|
880 | Botyloc=byloc |
---|
881 | Topxtemp=GetXLoc(tloop,_pmin) |
---|
882 | "q w2xy "Topxtemp " " _pmin |
---|
883 | Topxloc=subwrd(result,3) |
---|
884 | Topyloc=tyloc |
---|
885 | If (Botxtemp <= 100 | Topxtemp <= 100) |
---|
886 | If (Topxtemp > 100) |
---|
887 | Slope=(Topyloc-Botyloc)/(Topxtemp-Botxtemp) |
---|
888 | b=Topyloc-Slope*Topxtemp |
---|
889 | Topyloc=Slope*100+b |
---|
890 | Topxloc=rxloc |
---|
891 | Endif |
---|
892 | If (Botxtemp < 0) |
---|
893 | Slope=(Topyloc-Botyloc)/(Topxtemp-Botxtemp) |
---|
894 | b=Botyloc-Slope*Botxtemp |
---|
895 | Botyloc=b |
---|
896 | Botxloc=lxloc |
---|
897 | Else |
---|
898 | "draw string " Botxloc-0.05 " " Botyloc-0.15 " " tloop |
---|
899 | Endif |
---|
900 | "draw line "Botxloc " " Botyloc " " Topxloc " " Topyloc |
---|
901 | Endif |
---|
902 | tloop=tloop+tempint |
---|
903 | EndWhile |
---|
904 | If (LblAxes = 1) |
---|
905 | "set strsiz 0.15" |
---|
906 | "set string 1 c" |
---|
907 | If (PageType = "Portrait") |
---|
908 | "draw string 4.0 0.35 Temperature (`3.`0C)" |
---|
909 | Else |
---|
910 | "draw string 3.5 0.15 Temperature (`3.`0C)" |
---|
911 | Endif |
---|
912 | Endif |
---|
913 | Endif |
---|
914 | |
---|
915 | |
---|
916 | *------------------ |
---|
917 | * Plot dry adiabats |
---|
918 | *------------------ |
---|
919 | |
---|
920 | If (DrawThet = 1) |
---|
921 | temp=GetTemp(100,_pmin) |
---|
922 | maxtheta=GetThet2(temp,-100,_pmin) |
---|
923 | maxtheta=thetaint*int(maxtheta/thetaint) |
---|
924 | temp=GetTemp(0,_pmax) |
---|
925 | mintheta=GetThet2(temp,-100,_pmax) |
---|
926 | mintheta=thetaint*int(mintheta/thetaint) |
---|
927 | |
---|
928 | "set lon 0 100" |
---|
929 | "set y 1" |
---|
930 | "set z 1" |
---|
931 | tloop=mintheta |
---|
932 | "set line "ThetCol" "ThetLine " "ThetThk |
---|
933 | While (tloop <= maxtheta) |
---|
934 | PTemp=LiftDry(tloop,1000,_pmin,1,_pmin,_pmax) |
---|
935 | tloop=tloop+thetaint |
---|
936 | Endwhile |
---|
937 | Endif |
---|
938 | |
---|
939 | *------------------------ |
---|
940 | * Plot mixing ratio lines |
---|
941 | *------------------------ |
---|
942 | |
---|
943 | If (DrawMix = 1) |
---|
944 | If (MixStop < _pmin) |
---|
945 | MixStop = _pmin |
---|
946 | Endif |
---|
947 | "set string 1 l" |
---|
948 | "set z "_zmin " " _zmax |
---|
949 | "set cint 1" |
---|
950 | "set line "MixCol" " MixLine " "MixThk |
---|
951 | cont = 1 |
---|
952 | mloop=subwrd(wsclevs,1) |
---|
953 | count = 1 |
---|
954 | While (cont = 1) |
---|
955 | BotCoef=log(mloop*_pmax/3801.66) |
---|
956 | BotTval=-245.5*BotCoef/(BotCoef-17.67) |
---|
957 | Botxtemp=GetXLoc(BotTval,_pmax) |
---|
958 | "q w2xy "Botxtemp " " _pmax |
---|
959 | Botxloc=subwrd(result,3) |
---|
960 | Botyloc=byloc |
---|
961 | TopCoef=log(mloop*MixStop/3801.66) |
---|
962 | TopTval=-245.5*TopCoef/(TopCoef-17.67) |
---|
963 | Topxtemp=GetXLoc(TopTval,MixStop) |
---|
964 | "q w2xy "Topxtemp " " MixStop |
---|
965 | Topxloc=subwrd(result,3) |
---|
966 | Topyloc=subwrd(result,6) |
---|
967 | "set string "MixCol" l 3" |
---|
968 | "set strsiz 0.09" |
---|
969 | If (Botxtemp <= 100 | Topxtemp <= 100) |
---|
970 | If (Topxtemp > 100) |
---|
971 | Slope=(Topyloc-Botyloc)/(Topxtemp-Botxtemp) |
---|
972 | b=Topyloc-Slope*Topxtemp |
---|
973 | Topyloc=Slope*100+b |
---|
974 | Topxloc=rxloc |
---|
975 | "draw string " Topxloc+0.05 " " Topyloc " " mloop |
---|
976 | Else |
---|
977 | "draw string " Topxloc " " Topyloc+0.1 " " mloop |
---|
978 | Endif |
---|
979 | If (Botxtemp < 0) |
---|
980 | Slope=(Topyloc-Botyloc)/(Topxtemp-Botxtemp) |
---|
981 | b=Botyloc-Slope*Botxtemp |
---|
982 | Botyloc=b |
---|
983 | Botxloc=lxloc |
---|
984 | Endif |
---|
985 | "draw line "Botxloc " " Botyloc " " Topxloc " " Topyloc |
---|
986 | Endif |
---|
987 | count=count+1 |
---|
988 | mloop=subwrd(wsclevs,count) |
---|
989 | If (mloop = "" | count > 50) |
---|
990 | cont = 0 |
---|
991 | Endif |
---|
992 | EndWhile |
---|
993 | If (LblAxes = 1) |
---|
994 | "set strsiz 0.15" |
---|
995 | "set string 1 c 3 90" |
---|
996 | If (PageType = "Portrait") |
---|
997 | "draw string 7.40 4.75 Mixing Ratio (g/kg)" |
---|
998 | Else |
---|
999 | "draw string 6.90 4.25 Mixing Ratio (g/kg)" |
---|
1000 | Endif |
---|
1001 | "set string 1 c 3 0" |
---|
1002 | Endif |
---|
1003 | Endif |
---|
1004 | |
---|
1005 | *----------------------------- |
---|
1006 | * Plot moist (pseudo) adiabats |
---|
1007 | *----------------------------- |
---|
1008 | |
---|
1009 | If (DrawThtw = 1) |
---|
1010 | "set lon 0 100" |
---|
1011 | "set y 1" |
---|
1012 | "set z 1" |
---|
1013 | "set gxout stat" |
---|
1014 | tloop=80 |
---|
1015 | "set line "ThtwCol" "ThtwLine " "ThtwThk |
---|
1016 | While (tloop > -80) |
---|
1017 | PTemp=LiftWet(tloop,1000,ThtwStop,1,_pmin,_pmax) |
---|
1018 | tloop=tloop-thetwint |
---|
1019 | Endwhile |
---|
1020 | Endif |
---|
1021 | |
---|
1022 | |
---|
1023 | *----------------------------------------------------- |
---|
1024 | * Plot transformed user-specified temperature sounding |
---|
1025 | *----------------------------------------------------- |
---|
1026 | |
---|
1027 | If (DrawTSnd = 1) |
---|
1028 | say "Drawing temperature sounding." |
---|
1029 | "set gxout line" |
---|
1030 | "set x "_xval |
---|
1031 | "set y "_yval |
---|
1032 | "set z "_zmin" "_zmax |
---|
1033 | "set ccolor "TSndCol |
---|
1034 | "set cstyle "TSndLine |
---|
1035 | "set cmark "TSndMrk |
---|
1036 | "set digsiz "MrkSize |
---|
1037 | "set cthick "TSndThk |
---|
1038 | "set missconn on" |
---|
1039 | "d tempx" |
---|
1040 | Endif |
---|
1041 | |
---|
1042 | *--------------------------------------------------- |
---|
1043 | * Plot transformed user-specified dewpoint sounding |
---|
1044 | *--------------------------------------------------- |
---|
1045 | |
---|
1046 | If (DrawDSnd = 1) |
---|
1047 | say "Drawing dewpoint sounding." |
---|
1048 | "set gxout line" |
---|
1049 | "set x "_xval |
---|
1050 | "set y "_yval |
---|
1051 | "set z "_zmin" "_zmax |
---|
1052 | "set cmark "DSndMrk |
---|
1053 | "set digsiz "MrkSize |
---|
1054 | "set ccolor "DSndCol |
---|
1055 | "set cstyle "DSndLine |
---|
1056 | "set cthick "DSndThk |
---|
1057 | "set missconn on" |
---|
1058 | "d dewpx" |
---|
1059 | Endif |
---|
1060 | |
---|
1061 | *---------------------------------------- |
---|
1062 | * Determine lowest level of reported data |
---|
1063 | *---------------------------------------- |
---|
1064 | |
---|
1065 | If (DrawTSnd = 1) |
---|
1066 | field=sndtemp |
---|
1067 | Else |
---|
1068 | field=sndspd |
---|
1069 | Endif |
---|
1070 | |
---|
1071 | "set gxout stat" |
---|
1072 | "set x "_xval |
---|
1073 | "set y "_yval |
---|
1074 | "set t "_tval |
---|
1075 | "set lev " _pmax " " _pmin |
---|
1076 | "d maskout(lev,"field"+300)" |
---|
1077 | rec=sublin(result,1) |
---|
1078 | check=substr(rec,1,6) |
---|
1079 | If (check = "Notice") |
---|
1080 | rec=sublin(result,9) |
---|
1081 | Else |
---|
1082 | rec=sublin(result,8) |
---|
1083 | Endif |
---|
1084 | SfcPlev=subwrd(rec,5) |
---|
1085 | |
---|
1086 | If (DrawTSnd = 1 & DrawDSnd = 1) |
---|
1087 | "set lev "SfcPlev |
---|
1088 | "d "sndtemp |
---|
1089 | rec=sublin(result,1) |
---|
1090 | check=substr(rec,1,6) |
---|
1091 | If (check = "Notice") |
---|
1092 | rec=sublin(result,9) |
---|
1093 | Else |
---|
1094 | rec=sublin(result,8) |
---|
1095 | Endif |
---|
1096 | Sfctemp=subwrd(rec,4) |
---|
1097 | "d "snddewp |
---|
1098 | rec=sublin(result,1) |
---|
1099 | check=substr(rec,1,6) |
---|
1100 | If (check = "Notice") |
---|
1101 | rec=sublin(result,9) |
---|
1102 | Else |
---|
1103 | rec=sublin(result,8) |
---|
1104 | Endif |
---|
1105 | Sfcdewp=subwrd(rec,4) |
---|
1106 | SfcThee=Thetae(Sfctemp,Sfcdewp,SfcPlev) |
---|
1107 | |
---|
1108 | *------------------------------------------ |
---|
1109 | * Calculate temperature and pressure of LCL |
---|
1110 | *------------------------------------------ |
---|
1111 | |
---|
1112 | TLcl=Templcl(Sfctemp,Sfcdewp) |
---|
1113 | PLcl=Preslcl(Sfctemp,Sfcdewp,SfcPlev) |
---|
1114 | Endif |
---|
1115 | |
---|
1116 | *---------------------------------------------------------- |
---|
1117 | * Plot parcel path from surface to LCL and up moist adiabat |
---|
1118 | *---------------------------------------------------------- |
---|
1119 | |
---|
1120 | If (DrawPrcl = 1) |
---|
1121 | say "Drawing parcel path from surface upward." |
---|
1122 | If (PageType = "Portrait") |
---|
1123 | xloc=7.15 |
---|
1124 | Else |
---|
1125 | xloc=6.65 |
---|
1126 | Endif |
---|
1127 | "q w2xy 1 "PLcl |
---|
1128 | rec=sublin(result,1) |
---|
1129 | yloc=subwrd(rec,6) |
---|
1130 | "set strsiz 0.1" |
---|
1131 | If (PLcl < _pmax) |
---|
1132 | "set string 1 l" |
---|
1133 | "draw string "xloc" "yloc" LCL" |
---|
1134 | "set line 1 1 1" |
---|
1135 | "draw line "xloc-0.15" "yloc" "xloc-0.05" "yloc |
---|
1136 | Endif |
---|
1137 | "set lon 0 100" |
---|
1138 | "set gxout stat" |
---|
1139 | "set line "PrclCol" "PrclLine " " PrclThk |
---|
1140 | PTemp=LiftDry(Sfctemp,SfcPlev,PLcl,1,_pmin,_pmax) |
---|
1141 | Ptemp=LiftWet(TLcl,PLcl,_pmin,1,_pmin,_pmax) |
---|
1142 | Endif |
---|
1143 | |
---|
1144 | *------------------------------------------------------- |
---|
1145 | * Determine level within lowest 250mb having highest |
---|
1146 | * theta-e value |
---|
1147 | *------------------------------------------------------- |
---|
1148 | |
---|
1149 | If (DrawTSnd = 1 & DrawDSnd = 1) |
---|
1150 | "set x "_xval |
---|
1151 | "set y "_yval |
---|
1152 | "set t "_tval |
---|
1153 | zz=1 |
---|
1154 | MaxThee=-999 |
---|
1155 | "set gxout stat" |
---|
1156 | while (zz <= _zmax & pp > _pmax-250) |
---|
1157 | "set z "zz |
---|
1158 | pp=subwrd(result,4) |
---|
1159 | "d "sndtemp |
---|
1160 | rec=sublin(result,1) |
---|
1161 | check=substr(rec,1,6) |
---|
1162 | If (check = "Notice") |
---|
1163 | rec=sublin(result,9) |
---|
1164 | Else |
---|
1165 | rec=sublin(result,8) |
---|
1166 | Endif |
---|
1167 | tt=subwrd(rec,4) |
---|
1168 | "d "snddewp |
---|
1169 | rec=sublin(result,1) |
---|
1170 | check=substr(rec,1,6) |
---|
1171 | If (check = "Notice") |
---|
1172 | rec=sublin(result,9) |
---|
1173 | Else |
---|
1174 | rec=sublin(result,8) |
---|
1175 | Endif |
---|
1176 | dd=subwrd(rec,4) |
---|
1177 | If (abs(tt) < 130 & abs(dd) < 130) |
---|
1178 | Thee=Thetae(tt,dd,pp) |
---|
1179 | If (Thee > MaxThee) |
---|
1180 | MaxThee=Thee |
---|
1181 | TMaxThee=tt |
---|
1182 | DMaxThee=dd |
---|
1183 | PMaxThee=pp |
---|
1184 | Endif |
---|
1185 | endif |
---|
1186 | zz=zz+1 |
---|
1187 | Endwhile |
---|
1188 | If (PMaxThee = SfcPlev-250) |
---|
1189 | PMaxThee = SfcPlev |
---|
1190 | Endif |
---|
1191 | *------------------------------------------------------ |
---|
1192 | * Calculate temperature and pressure of LCL from highest |
---|
1193 | * theta-e level |
---|
1194 | *------------------------------------------------------ |
---|
1195 | If (SfcPlev != PMaxThee) |
---|
1196 | TLclMax=Templcl(TMaxThee,DMaxThee) |
---|
1197 | PLclMax=Preslcl(TMaxThee,DMaxThee,PMaxThee) |
---|
1198 | Endif |
---|
1199 | Endif |
---|
1200 | |
---|
1201 | *---------------------------------------------------------- |
---|
1202 | * Plot parcel path from highest theta-e level to LCL and up |
---|
1203 | * moist adiabat |
---|
1204 | *---------------------------------------------------------- |
---|
1205 | |
---|
1206 | If (DrawPMax = 1 & SfcPlev != PMaxThee) |
---|
1207 | say "Drawing parcel path from most unstable level upward." |
---|
1208 | If (PageType = "Portrait") |
---|
1209 | xloc=7.15 |
---|
1210 | Else |
---|
1211 | xloc=6.65 |
---|
1212 | Endif |
---|
1213 | "q w2xy 1 "PLclMax |
---|
1214 | rec=sublin(result,1) |
---|
1215 | yloc=subwrd(rec,6) |
---|
1216 | "set strsiz 0.1" |
---|
1217 | If (PLclMax < _pmax) |
---|
1218 | "set string 1 l" |
---|
1219 | "draw string "xloc" "yloc" LCL" |
---|
1220 | "set line 1 1 1" |
---|
1221 | "draw line "xloc-0.15" "yloc" "xloc-0.05" "yloc |
---|
1222 | Endif |
---|
1223 | "set lon 0 100" |
---|
1224 | "set gxout stat" |
---|
1225 | "set line "PrclCol" "PrclLine " " PrclThk |
---|
1226 | PTemp=LiftDry(TMaxThee,PMaxThee,PLclMax,1,_pmin,_pmax) |
---|
1227 | Ptemp=LiftWet(TLclMax,PLclMax,_pmin,1,_pmin,_pmax) |
---|
1228 | Endif |
---|
1229 | |
---|
1230 | *-------------------------------- |
---|
1231 | * Draw thermodynamic indices |
---|
1232 | *-------------------------------- |
---|
1233 | |
---|
1234 | If (DrawIndx = 1) |
---|
1235 | "set string 1 l" |
---|
1236 | "set strsiz 0.10" |
---|
1237 | "set x "_xval |
---|
1238 | "set y "_yval |
---|
1239 | "set t "_tval |
---|
1240 | say "Calculating precipitable water." |
---|
1241 | pw=precipw(sndtemp,snddewp,_pmax,_pmin) |
---|
1242 | say "Calculating thermodynamic indices." |
---|
1243 | Temp850=interp(sndtemp,850) |
---|
1244 | Temp700=interp(sndtemp,700) |
---|
1245 | Temp500=interp(sndtemp,500) |
---|
1246 | Dewp850=interp(snddewp,850) |
---|
1247 | Dewp700=interp(snddewp,700) |
---|
1248 | Dewp500=interp(snddewp,500) |
---|
1249 | If (Temp850>-900 & Dewp850>-900 & Dewp700>-900 & Temp700>-900 & Temp500>-900) |
---|
1250 | K=Temp850+Dewp850+Dewp700-Temp700-Temp500 |
---|
1251 | Else |
---|
1252 | K=-999 |
---|
1253 | Endif |
---|
1254 | If (Temp850 > -900 & Dewp850 > -900 & Temp500 > -900) |
---|
1255 | tt=Temp850+Dewp850-2*Temp500 |
---|
1256 | Else |
---|
1257 | tt=-999 |
---|
1258 | Endif |
---|
1259 | Temp500V=virtual2(Temp500+273.15,Dewp500+273.15,500)-273.15 |
---|
1260 | PclTemp=LiftWet(TLcl,PLcl,500,0) |
---|
1261 | PclTempV=virtual2(PclTemp+273.15,PclTemp+273.15,500)-273.15 |
---|
1262 | SLI=Temp500V-PclTempV |
---|
1263 | rec=CAPE(TLcl,PLcl,100,sndtemp,snddewp) |
---|
1264 | Pos=subwrd(rec,1) |
---|
1265 | CIN=subwrd(rec,2) |
---|
1266 | |
---|
1267 | If (SfcPlev != PMaxThee) |
---|
1268 | PclTemp=LiftWet(TLclMax,PLclMax,500,0) |
---|
1269 | PclTempV=virtual2(PclTemp+273.15,PclTemp+273.15,500)-273.15 |
---|
1270 | LIMax=Temp500V-PclTempV |
---|
1271 | rec=CAPE(TLclMax,PLclMax,100,sndtemp,snddewp) |
---|
1272 | PosMax=subwrd(rec,1) |
---|
1273 | CINMax=subwrd(rec,2) |
---|
1274 | Else |
---|
1275 | LIMax=SLI |
---|
1276 | PosMax=Pos |
---|
1277 | CINMax=CIN |
---|
1278 | MaxThee=SfcThee |
---|
1279 | Endif |
---|
1280 | |
---|
1281 | If (PageType = "Portrait") |
---|
1282 | If (Text1XC = -1) |
---|
1283 | Text1XC=rxloc-0.75 |
---|
1284 | Endif |
---|
1285 | If (Text1YC = -1) |
---|
1286 | Text1YC=tyloc-2.25 |
---|
1287 | Endif |
---|
1288 | If (Text2XC = -1) |
---|
1289 | Text2XC=rxloc-0.75 |
---|
1290 | Endif |
---|
1291 | If (Text2YC = -1) |
---|
1292 | Text2YC=tyloc-3.25 |
---|
1293 | Endif |
---|
1294 | If (Text3XC = -1) |
---|
1295 | Text3XC=rxloc-0.75 |
---|
1296 | Endif |
---|
1297 | If (Text3YC = -1) |
---|
1298 | Text3YC=tyloc-4.40 |
---|
1299 | Endif |
---|
1300 | Else |
---|
1301 | If (Text1XC = -1) |
---|
1302 | Text1XC=rxloc+2.50 |
---|
1303 | Endif |
---|
1304 | If (Text1YC = -1) |
---|
1305 | Text1YC=tyloc-3.00 |
---|
1306 | Endif |
---|
1307 | If (Text2XC = -1) |
---|
1308 | Text2XC=rxloc+2.50 |
---|
1309 | Endif |
---|
1310 | If (Text2YC = -1) |
---|
1311 | Text2YC=tyloc-4.00 |
---|
1312 | Endif |
---|
1313 | If (Text3XC = -1) |
---|
1314 | Text3XC=rxloc+2.50 |
---|
1315 | Endif |
---|
1316 | If (Text3YC = -1) |
---|
1317 | Text3YC=tyloc-5.10 |
---|
1318 | Endif |
---|
1319 | Endif |
---|
1320 | "set string 1 l 3" |
---|
1321 | "set line 0 1 3" |
---|
1322 | "draw recf "Text1XC-0.75 " " Text1YC-0.40 " " Text1XC+0.75 " " Text1YC+0.25 |
---|
1323 | "set line 1 1 3" |
---|
1324 | "draw rec "Text1XC-0.75 " " Text1YC-0.40 " " Text1XC+0.75 " " Text1YC+0.25 |
---|
1325 | "draw string "Text1XC-0.70 " " Text1YC+0.10" K" |
---|
1326 | "draw string "Text1XC+0.25 " " Text1YC+0.10" " int(K) |
---|
1327 | "draw string "Text1XC-0.70 " " Text1YC-0.10 " TT" |
---|
1328 | "draw string "Text1XC+0.25 " " Text1YC-0.10 " " int(tt) |
---|
1329 | "draw string "Text1XC-0.70 " " Text1YC-0.25 " PW(cm)" |
---|
1330 | "draw string "Text1XC+0.25 " " Text1YC-0.25 " " int(pw*100)/100 |
---|
1331 | "set line 0 1 3" |
---|
1332 | "draw recf "Text2XC-0.75 " " Text2YC-0.60 " " Text2XC+0.75 " " Text2YC+0.60 |
---|
1333 | "set line 1 1 3" |
---|
1334 | "draw rec "Text2XC-0.75 " " Text2YC-0.60 " " Text2XC+0.75 " " Text2YC+0.60 |
---|
1335 | "draw string "Text2XC-0.35 " " Text2YC+0.50 " Surface" |
---|
1336 | "draw string "Text2XC-0.70 " " Text2YC+0.30 " Temp(`3.`0C)" |
---|
1337 | "draw string "Text2XC+0.25 " " Text2YC+0.30 " " int(Sfctemp*10)/10 |
---|
1338 | "draw string "Text2XC-0.70 " " Text2YC+0.15 " Dewp(`3.`0C)" |
---|
1339 | "draw string "Text2XC+0.25 " " Text2YC+0.15 " " int(Sfcdewp*10)/10 |
---|
1340 | "draw string "Text2XC-0.70 " " Text2YC " `3z`0`bE`n(K)" |
---|
1341 | "draw string "Text2XC+0.25 " " Text2YC " " int(SfcThee) |
---|
1342 | "draw string "Text2XC-0.70 " " Text2YC-0.15 " LI" |
---|
1343 | "draw string "Text2XC+0.25 " " Text2YC-0.15 " " round(SLI) |
---|
1344 | "draw string "Text2XC-0.70 " " Text2YC-0.30 " CAPE(J)" |
---|
1345 | "draw string "Text2XC+0.25 " " Text2YC-0.30 " " int(Pos) |
---|
1346 | "draw string "Text2XC-0.70 " " Text2YC-0.45 " CIN(J)" |
---|
1347 | "draw string "Text2XC+0.25 " " Text2YC-0.45 " " int(CIN) |
---|
1348 | "set line 0 1 3" |
---|
1349 | "draw recf "Text3XC-0.75 " " Text3YC-0.55 " " Text3XC+0.75 " " Text3YC+0.55 |
---|
1350 | "set line 1 1 3" |
---|
1351 | "draw rec "Text3XC-0.75 " " Text3YC-0.55 " " Text3XC+0.75 " " Text3YC+0.55 |
---|
1352 | "draw string "Text3XC-0.60 " " Text3YC+0.45 " Most Unstable" |
---|
1353 | "draw string "Text3XC-0.70 " " Text3YC+0.20 " Press(mb)" |
---|
1354 | "draw string "Text3XC+0.25 " " Text3YC+0.20 " " int(PMaxThee) |
---|
1355 | "draw string "Text3XC-0.70 " " Text3YC+0.05 " `3z`0`bE`n(K)" |
---|
1356 | "draw string "Text3XC+0.25 " " Text3YC+0.05 " " int(MaxThee) |
---|
1357 | "draw string "Text3XC-0.70 " " Text3YC-0.10 " LI" |
---|
1358 | "draw string "Text3XC+0.25 " " Text3YC-0.10 " "round(LIMax) |
---|
1359 | "draw string "Text3XC-0.70 " " Text3YC-0.25 " CAPE(J)" |
---|
1360 | "draw string "Text3XC+0.25 " " Text3YC-0.25 " "int(PosMax) |
---|
1361 | "draw string "Text3XC-0.70 " " Text3YC-0.40 " CIN(J)" |
---|
1362 | "draw string "Text3XC+0.25 " " Text3YC-0.40 " " int(CINMax) |
---|
1363 | Endif |
---|
1364 | |
---|
1365 | *----------------------------- |
---|
1366 | * Draw wind profile along side |
---|
1367 | *----------------------------- |
---|
1368 | |
---|
1369 | If (DrawBarb = 1) |
---|
1370 | say "Drawing Wind Profile." |
---|
1371 | If (poleloc = -1) |
---|
1372 | If (PageType = "Portrait") |
---|
1373 | poleloc = 8.0 |
---|
1374 | Else |
---|
1375 | poleloc = 7.5 |
---|
1376 | Endif |
---|
1377 | Endif |
---|
1378 | If (barbline = 1) |
---|
1379 | "set line 1 1 3" |
---|
1380 | "draw line "poleloc " " byloc " " poleloc " " tyloc |
---|
1381 | Endif |
---|
1382 | If (BarbCol = -1) |
---|
1383 | 'set rgb 41 255 0 132' |
---|
1384 | 'set rgb 42 255 0 168' |
---|
1385 | 'set rgb 43 255 0 204' |
---|
1386 | 'set rgb 44 255 0 240' |
---|
1387 | 'set rgb 45 255 0 255' |
---|
1388 | 'set rgb 46 204 0 255' |
---|
1389 | 'set rgb 47 174 0 255' |
---|
1390 | 'set rgb 48 138 0 255' |
---|
1391 | 'set rgb 49 108 0 255' |
---|
1392 | 'set rgb 50 84 0 255' |
---|
1393 | 'set rgb 51 40 0 255' |
---|
1394 | 'set rgb 52 0 0 255' |
---|
1395 | 'set rgb 53 0 42 255' |
---|
1396 | 'set rgb 54 0 84 255' |
---|
1397 | 'set rgb 55 0 120 255' |
---|
1398 | 'set rgb 56 0 150 255' |
---|
1399 | 'set rgb 57 0 192 255' |
---|
1400 | 'set rgb 58 0 240 255' |
---|
1401 | 'set rgb 59 0 255 210' |
---|
1402 | 'set rgb 60 0 255 160' |
---|
1403 | 'set rgb 61 0 255 126' |
---|
1404 | 'set rgb 62 0 255 78' |
---|
1405 | 'set rgb 63 84 255 0' |
---|
1406 | 'set rgb 64 138 255 0' |
---|
1407 | 'set rgb 65 188 255 0' |
---|
1408 | 'set rgb 66 236 255 0' |
---|
1409 | 'set rgb 67 255 255 0' |
---|
1410 | 'set rgb 68 255 222 0' |
---|
1411 | 'set rgb 69 255 192 0' |
---|
1412 | 'set rgb 70 255 162 0' |
---|
1413 | 'set rgb 71 255 138 0' |
---|
1414 | 'set rgb 72 255 108 0' |
---|
1415 | 'set rgb 73 255 84 0' |
---|
1416 | 'set rgb 74 255 54 0' |
---|
1417 | 'set rgb 75 255 12 0' |
---|
1418 | 'set rgb 76 255 0 34' |
---|
1419 | 'set rgb 77 255 0 70' |
---|
1420 | 'set rgb 78 255 0 105' |
---|
1421 | 'set rgb 79 255 0 140' |
---|
1422 | 'set rgb 80 255 0 175' |
---|
1423 | 'set rgb 81 255 0 215' |
---|
1424 | 'set rgb 82 255 0 255' |
---|
1425 | 'set rgb 83 255 255 255' |
---|
1426 | |
---|
1427 | col1='83 83 83 83 83 83 83 83 83 83 82 81 80 79 78' |
---|
1428 | col2='77 76 75 74 73 72 71 70 69 68 67 66 65 64 63' |
---|
1429 | col3='62 61 60 59 58 57 56 55 54 53 52 51 50 49 48' |
---|
1430 | 'set rbcols 'col1' 'col2' 'col3 |
---|
1431 | Endif |
---|
1432 | "set z "_zmin" "_zmax |
---|
1433 | "set gxout stat" |
---|
1434 | zz=1 |
---|
1435 | wspd=-999 |
---|
1436 | cont=1 |
---|
1437 | While (cont = 1 & zz < _zmax) |
---|
1438 | "set z "zz |
---|
1439 | pres=subwrd(result,4) |
---|
1440 | "d "sndspd |
---|
1441 | rec=sublin(result,1) |
---|
1442 | check=substr(rec,1,6) |
---|
1443 | If (check = "Notice") |
---|
1444 | rec=sublin(result,9) |
---|
1445 | Else |
---|
1446 | rec=sublin(result,8) |
---|
1447 | Endif |
---|
1448 | wspd=subwrd(rec,4) |
---|
1449 | if (wspd < 0 | pres > _pmax) |
---|
1450 | zz=zz+1 |
---|
1451 | else |
---|
1452 | cont=0 |
---|
1453 | Endif |
---|
1454 | Endwhile |
---|
1455 | While (zz <= _zmax) |
---|
1456 | "d "sndspd"(z="zz")" |
---|
1457 | rec=sublin(result,1) |
---|
1458 | check=substr(rec,1,6) |
---|
1459 | If (check = "Notice") |
---|
1460 | rec=sublin(result,9) |
---|
1461 | Else |
---|
1462 | rec=sublin(result,8) |
---|
1463 | Endif |
---|
1464 | wspd=subwrd(rec,4) |
---|
1465 | If (BarbCol >= 0) |
---|
1466 | "set line "BarbCol " 1 "BarbThk |
---|
1467 | Else |
---|
1468 | tempbcol=55+wspd/5 |
---|
1469 | If (tempbcol > 83) |
---|
1470 | tempbcol = 83 |
---|
1471 | Endif |
---|
1472 | "set line "tempbcol " 1 "BarbThk |
---|
1473 | Endif |
---|
1474 | "d "snddir"(z="zz")" |
---|
1475 | rec=sublin(result,1) |
---|
1476 | check=substr(rec,1,6) |
---|
1477 | If (check = "Notice") |
---|
1478 | rec=sublin(result,9) |
---|
1479 | Else |
---|
1480 | rec=sublin(result,8) |
---|
1481 | Endif |
---|
1482 | wdir=subwrd(rec,4) |
---|
1483 | xwind=GetUWnd(wspd,wdir) |
---|
1484 | ywind=GetVWnd(wspd,wdir) |
---|
1485 | "query gr2xy 5 "zz |
---|
1486 | y1=subwrd(result,6) |
---|
1487 | if (wspd > 0) |
---|
1488 | cc=polelen/wspd |
---|
1489 | xendpole=poleloc-xwind*cc |
---|
1490 | yendpole=y1-ywind*cc |
---|
1491 | endif |
---|
1492 | if (xendpole>0 & wspd >= 0.5) |
---|
1493 | if (flagbase = 1) |
---|
1494 | "draw mark 3 "poleloc " " y1 " 0.05" |
---|
1495 | endif |
---|
1496 | "draw line " poleloc " " y1 " " xendpole " " yendpole |
---|
1497 | flagloop=wspd/10 |
---|
1498 | windcount=wspd |
---|
1499 | flagcount=0 |
---|
1500 | xflagstart=xendpole |
---|
1501 | yflagstart=yendpole |
---|
1502 | dx=cos((180-wdir)*_dtr) |
---|
1503 | dy=sin((180-wdir)*_dtr) |
---|
1504 | while (windcount > 47.5) |
---|
1505 | flagcount=flagcount+1 |
---|
1506 | dxflag=-len50*dx |
---|
1507 | dyflag=-len50*dy |
---|
1508 | xflagend=xflagstart+dxflag |
---|
1509 | yflagend=yflagstart+dyflag |
---|
1510 | windcount=windcount-50 |
---|
1511 | x1=xflagstart+0.5*wid50*xwind/wspd |
---|
1512 | y1=yflagstart+0.5*wid50*ywind/wspd |
---|
1513 | x2=xflagstart-0.5*wid50*xwind/wspd |
---|
1514 | y2=yflagstart-0.5*wid50*ywind/wspd |
---|
1515 | If (Fill50 = 1) |
---|
1516 | "draw polyf "x1" "y1" "x2" "y2" "xflagend" "yflagend" "x1" "y1 |
---|
1517 | Else |
---|
1518 | "draw line "x1 " "y1 " " xflagend " " yflagend " " |
---|
1519 | "draw line "x2 " "y2 " " xflagend " " yflagend |
---|
1520 | "draw line "x1 " "y1 " " x2 " " y2 |
---|
1521 | Endif |
---|
1522 | xflagstart=xflagstart+spac50*xwind/wspd |
---|
1523 | yflagstart=yflagstart+spac50*ywind/wspd |
---|
1524 | endwhile |
---|
1525 | while (windcount > 7.5 ) |
---|
1526 | flagcount=flagcount+1 |
---|
1527 | dxflag=-len10*dx |
---|
1528 | dyflag=-len10*dy |
---|
1529 | xflagend=xflagstart+dxflag |
---|
1530 | yflagend=yflagstart+dyflag |
---|
1531 | windcount=windcount-10 |
---|
1532 | "draw line " xflagstart " " yflagstart " " xflagend " " yflagend |
---|
1533 | xflagstart=xflagstart+spac10*xwind/wspd |
---|
1534 | yflagstart=yflagstart+spac10*ywind/wspd |
---|
1535 | endwhile |
---|
1536 | if (windcount > 2.5) |
---|
1537 | flagcount=flagcount+1 |
---|
1538 | if (flagcount = 1) |
---|
1539 | xflagstart=xflagstart+spac05*xwind/wspd |
---|
1540 | yflagstart=yflagstart+spac05*ywind/wspd |
---|
1541 | endif |
---|
1542 | dxflag=-len05*dx |
---|
1543 | dyflag=-len05*dy |
---|
1544 | xflagend=xflagstart+dxflag |
---|
1545 | yflagend=yflagstart+dyflag |
---|
1546 | windcount=windcount-5 |
---|
1547 | "draw line " xflagstart " " yflagstart " " xflagend " " yflagend |
---|
1548 | endif |
---|
1549 | else |
---|
1550 | if (wspd < 0.5 & wspd >= 0) |
---|
1551 | "draw mark 2 " poleloc " " y1 " 0.08" |
---|
1552 | endif |
---|
1553 | endif |
---|
1554 | zz=zz+barbint |
---|
1555 | endwhile |
---|
1556 | Endif |
---|
1557 | |
---|
1558 | *---------------- |
---|
1559 | * Draw Hodograph |
---|
1560 | *---------------- |
---|
1561 | |
---|
1562 | If (DrawHodo = 1) |
---|
1563 | say "Drawing Hodograph." |
---|
1564 | |
---|
1565 | If (HodXcent = -1 | HodYcent = -1) |
---|
1566 | If (PageType = "Portrait") |
---|
1567 | HodXcent=6 |
---|
1568 | HodYcent=9.5 |
---|
1569 | Else |
---|
1570 | HodXcent=9 |
---|
1571 | HodYcent=7.0 |
---|
1572 | Endif |
---|
1573 | Endif |
---|
1574 | HodL=HodXcent-HodSize/2.0 |
---|
1575 | HodR=HodXcent+HodSize/2.0 |
---|
1576 | HodT=HodYcent+HodSize/2.0 |
---|
1577 | HodB=HodYcent-HodSize/2.0 |
---|
1578 | RingSpac=HodSize/(NumRing*2) |
---|
1579 | "set line 0" |
---|
1580 | "draw recf "HodL" "HodB" "HodR" "HodT |
---|
1581 | "set line "HodoCol" 1 6" |
---|
1582 | "draw rec "HodL" "HodB" "HodR" "HodT |
---|
1583 | "set line 1 1 3" |
---|
1584 | "set string 1 c" |
---|
1585 | "draw mark 1 "HodXcent " "HodYcent " " HodSize |
---|
1586 | i=1 |
---|
1587 | While (i <= NumRing) |
---|
1588 | "set strsiz 0.10" |
---|
1589 | "set string 1 c 3 45" |
---|
1590 | uwnd=-i*HodRing*cos(45*_dtr) |
---|
1591 | xloc=HodXcent+uwnd*RingSpac/HodRing |
---|
1592 | yloc=HodYcent+uwnd*RingSpac/HodRing |
---|
1593 | |
---|
1594 | "draw mark 2 "HodXcent " " HodYcent " " i*HodSize/NumRing |
---|
1595 | "draw string "xloc " " yloc " " HodRing*i |
---|
1596 | i=i+1 |
---|
1597 | Endwhile |
---|
1598 | "set string 1 l 3 0" |
---|
1599 | If (TickInt > 0) |
---|
1600 | i=0 |
---|
1601 | while (i < HodRing*NumRing) |
---|
1602 | dist=i*RingSpac/HodRing |
---|
1603 | hrxloc=HodXcent+dist |
---|
1604 | hlxloc=HodXcent-dist |
---|
1605 | htyloc=HodYcent+dist |
---|
1606 | hbyloc=HodYcent-dist |
---|
1607 | "set line 1 1 3" |
---|
1608 | "draw line "hrxloc " " HodYcent-TickSize/2 " " hrxloc " " HodYcent+TickSize/2 |
---|
1609 | "draw line "hlxloc " " HodYcent-TickSize/2 " " hlxloc " " HodYcent+TickSize/2 |
---|
1610 | "draw line "HodXcent+TickSize/2 " " htyloc " " HodXcent-TickSize/2 " " htyloc |
---|
1611 | "draw line "HodXcent+TickSize/2 " " hbyloc " " HodXcent-TickSize/2 " " hbyloc |
---|
1612 | i=i+TickInt |
---|
1613 | endwhile |
---|
1614 | Endif |
---|
1615 | "set line "HodoCol " " HodoLine " "HodoThk |
---|
1616 | "draw string "HodL+0.05 " " HodT-0.1 " knots" |
---|
1617 | zloop=_zmin |
---|
1618 | xold=-999 |
---|
1619 | yold=-999 |
---|
1620 | count=0 |
---|
1621 | Depth=0 |
---|
1622 | While (zloop < _zmax & Depth < HodoDep) |
---|
1623 | "set z "zloop |
---|
1624 | pres=subwrd(result,4) |
---|
1625 | "d "sndspd |
---|
1626 | rec=sublin(result,1) |
---|
1627 | check=substr(rec,1,6) |
---|
1628 | If (check = "Notice") |
---|
1629 | rec=sublin(result,9) |
---|
1630 | Else |
---|
1631 | rec=sublin(result,8) |
---|
1632 | Endif |
---|
1633 | wspd=subwrd(rec,4) |
---|
1634 | "d "snddir |
---|
1635 | rec=sublin(result,1) |
---|
1636 | check=substr(rec,1,6) |
---|
1637 | If (check = "Notice") |
---|
1638 | rec=sublin(result,9) |
---|
1639 | Else |
---|
1640 | rec=sublin(result,8) |
---|
1641 | Endif |
---|
1642 | wdir=subwrd(rec,4) |
---|
1643 | uwnd=GetUWnd(wspd,wdir) |
---|
1644 | vwnd=GetVWnd(wspd,wdir) |
---|
1645 | If (wspd >= 0) |
---|
1646 | xloc=HodXcent+uwnd*RingSpac/HodRing |
---|
1647 | yloc=HodYcent+vwnd*RingSpac/HodRing |
---|
1648 | If (xloc > 0 & yloc > 0 & xold > 0 & yold > 0) |
---|
1649 | Depth=Depth+pold-pres |
---|
1650 | count=count+1 |
---|
1651 | If (count = 1) |
---|
1652 | "draw mark 3 "xold " " yold " 0.05" |
---|
1653 | Endif |
---|
1654 | "draw line "xold" "yold" "xloc" "yloc |
---|
1655 | Endif |
---|
1656 | xold=xloc |
---|
1657 | yold=yloc |
---|
1658 | Endif |
---|
1659 | zloop=zloop+1 |
---|
1660 | pold=pres |
---|
1661 | EndWhile |
---|
1662 | |
---|
1663 | If (count > 0) |
---|
1664 | "draw mark 3 "xold " " yold " 0.05" |
---|
1665 | Endif |
---|
1666 | Endif |
---|
1667 | |
---|
1668 | *---------------------------------------------- |
---|
1669 | * Calculate and Display Absolute & S-R Helicity |
---|
1670 | *---------------------------------------------- |
---|
1671 | |
---|
1672 | If (DrawHeli = 1) |
---|
1673 | say "Calculating Helicity & SR Helicity." |
---|
1674 | delp=10 |
---|
1675 | UTotal=0 |
---|
1676 | VTotal=0 |
---|
1677 | |
---|
1678 | * First, calculate mass-weighted mean wind |
---|
1679 | * Since delp is a constant, and mass is proportional to |
---|
1680 | * delp, this is a simple sum. |
---|
1681 | |
---|
1682 | "set lev "_pmax " " _pmin |
---|
1683 | "define uwndarr="sndspd"*cos((270-"snddir")*"_dtr")" |
---|
1684 | "define vwndarr="sndspd"*sin((270-"snddir")*"_dtr")" |
---|
1685 | |
---|
1686 | pres=MeanVBot |
---|
1687 | While (pres >= MeanVTop) |
---|
1688 | uwnd=interp(uwndarr,pres)*_ktm |
---|
1689 | vwnd=interp(vwndarr,pres)*_ktm |
---|
1690 | If (uwnd > -900 & vwnd > -900) |
---|
1691 | UTotal=UTotal+uwnd |
---|
1692 | VTotal=VTotal+vwnd |
---|
1693 | Endif |
---|
1694 | pres=pres-delp |
---|
1695 | EndWhile |
---|
1696 | vcount=1+(MeanVBot-MeanVTop)/delp |
---|
1697 | Umean=UTotal/vcount |
---|
1698 | Vmean=VTotal/vcount |
---|
1699 | Spdmean=GetWSpd(Umean,Vmean) |
---|
1700 | MeanDir=GetWDir(Umean,Vmean) |
---|
1701 | |
---|
1702 | * Now, rotate and reduce mean wind to get storm motion |
---|
1703 | |
---|
1704 | If (StormMot = 1) |
---|
1705 | If (Spdmean < 15) |
---|
1706 | Reduct=0.25 |
---|
1707 | Rotate=30 |
---|
1708 | Else |
---|
1709 | Reduct=0.20 |
---|
1710 | Rotate=20 |
---|
1711 | Endif |
---|
1712 | Else |
---|
1713 | Reduct=0.0 |
---|
1714 | Rotate=0.0 |
---|
1715 | Endif |
---|
1716 | |
---|
1717 | UReduce=(1-Reduct)*Umean |
---|
1718 | VReduce=(1-Reduct)*Vmean |
---|
1719 | StormSpd=GetWSpd(UReduce,VReduce) |
---|
1720 | |
---|
1721 | StormDir=GetWDir(UReduce,VReduce)+Rotate |
---|
1722 | If (StormDir >= 360) |
---|
1723 | StormDir=StormDir-360 |
---|
1724 | Endif |
---|
1725 | |
---|
1726 | StormU=GetUWnd(StormSpd,StormDir) |
---|
1727 | StormV=GetVWnd(StormSpd,StormDir) |
---|
1728 | |
---|
1729 | * Draw Storm Motion Vector |
---|
1730 | |
---|
1731 | xloc=HodXcent+_mtk*StormU*RingSpac/HodRing |
---|
1732 | yloc=HodYcent+_mtk*StormV*RingSpac/HodRing |
---|
1733 | |
---|
1734 | "set line 1 1 4" |
---|
1735 | "draw line "HodXcent " " HodYcent " " xloc " " yloc |
---|
1736 | Arr1U=GetUWnd(HodRing/10,StormDir+30) |
---|
1737 | Arr1V=GetVWnd(HodRing/10,StormDir+30) |
---|
1738 | Arr2U=GetUWnd(HodRing/10,StormDir-30) |
---|
1739 | Arr2V=GetVWnd(HodRing/10,StormDir-30) |
---|
1740 | |
---|
1741 | xloc2=xloc-Arr1U/HodRing |
---|
1742 | xloc3=xloc-Arr2U/HodRing |
---|
1743 | yloc2=yloc-Arr1V/HodRing |
---|
1744 | yloc3=yloc-Arr2V/HodRing |
---|
1745 | |
---|
1746 | "set line 1 1 3" |
---|
1747 | |
---|
1748 | If (FillArrw = 0) |
---|
1749 | "draw line "xloc" "yloc" "xloc2" "yloc2 |
---|
1750 | "draw line "xloc" "yloc" "xloc3" "yloc3 |
---|
1751 | Else |
---|
1752 | "draw polyf "xloc" "yloc" "xloc2" "yloc2" "xloc3" "yloc3" "xloc" "yloc |
---|
1753 | Endif |
---|
1754 | |
---|
1755 | |
---|
1756 | * Now, calculate SR and Environmental Helicity |
---|
1757 | |
---|
1758 | helic=0 |
---|
1759 | SRhelic=0 |
---|
1760 | MinP=SfcPlev-HelicDep |
---|
1761 | pres=SfcPlev |
---|
1762 | uwndold=-999 |
---|
1763 | vwndold=-999 |
---|
1764 | While (pres >= MinP) |
---|
1765 | uwnd=interp(uwndarr,pres)*_ktm |
---|
1766 | vwnd=interp(vwndarr,pres)*_ktm |
---|
1767 | If (uwnd > -900 & uwndold > -900) |
---|
1768 | du=uwnd-uwndold |
---|
1769 | dv=vwnd-vwndold |
---|
1770 | ubar=0.5*(uwnd+uwndold) |
---|
1771 | vbar=0.5*(vwnd+vwndold) |
---|
1772 | uhelic=-dv*ubar |
---|
1773 | vhelic=du*vbar |
---|
1774 | SRuhelic=-dv*(ubar-StormU) |
---|
1775 | SRvhelic=du*(vbar-StormV) |
---|
1776 | SRhelic=SRhelic+SRuhelic+SRvhelic |
---|
1777 | helic=helic+uhelic+vhelic |
---|
1778 | Endif |
---|
1779 | uwndold=uwnd |
---|
1780 | vwndold=vwnd |
---|
1781 | pres=pres-delp |
---|
1782 | EndWhile |
---|
1783 | |
---|
1784 | "set strsiz 0.1" |
---|
1785 | "set string 1 l 3" |
---|
1786 | If (PageType = "Portrait") |
---|
1787 | If (Text4XC = -1) |
---|
1788 | Text4XC=rxloc-0.75 |
---|
1789 | Endif |
---|
1790 | If (Text4YC = -1) |
---|
1791 | Text4YC=tyloc-5.45 |
---|
1792 | Endif |
---|
1793 | Else |
---|
1794 | If (Text4XC = -1) |
---|
1795 | Text4XC=rxloc+2.50 |
---|
1796 | Endif |
---|
1797 | If (Text4YC = -1) |
---|
1798 | Text4YC=tyloc-6.10 |
---|
1799 | Endif |
---|
1800 | Endif |
---|
1801 | "set line 0 1 3" |
---|
1802 | "draw recf "Text4XC-0.75 " "Text4YC-0.5 " " Text4XC+0.75 " " Text4YC+0.5 |
---|
1803 | "set line 1 1 3" |
---|
1804 | "draw rec "Text4XC-0.75 " "Text4YC-0.5 " " Text4XC+0.75 " " Text4YC+0.5 |
---|
1805 | "draw string "Text4XC-0.45 " " Text4YC+0.40 " Hodograph" |
---|
1806 | "draw string "Text4XC-0.70 " " Text4YC+0.20 " EH" |
---|
1807 | "draw string "Text4XC+0.25 " " Text4YC+0.20 " "int(helic) |
---|
1808 | "draw string "Text4XC-0.70 " " Text4YC+0.05 " SREH" |
---|
1809 | "draw string "Text4XC+0.25 " " Text4YC+0.05 " " int(SRhelic) |
---|
1810 | "draw string "Text4XC-0.70 " " Text4YC-0.20 " StmDir" |
---|
1811 | "draw string "Text4XC+0.25 " " Text4YC-0.20 " " int(StormDir)"`3.`0" |
---|
1812 | "draw string "Text4XC-0.70 " " Text4YC-0.35 " StmSpd(kt)" |
---|
1813 | "draw string "Text4XC+0.25 " " Text4YC-0.35 " " int(_mtk*StormSpd) |
---|
1814 | Endif |
---|
1815 | |
---|
1816 | "draw string "Text4XC-0.70 " " Text4YC-0.80 " Longitude" |
---|
1817 | "draw string "Text4XC+0.25 " " Text4YC-0.80 " " _xlon |
---|
1818 | "draw string "Text4XC-0.70 " " Text4YC-1.00 " Latitude" |
---|
1819 | "draw string "Text4XC+0.25 " " Text4YC-1.00 " " _ylat |
---|
1820 | if (OL = 1) |
---|
1821 | "draw string "Text4XC-0.70 " " Text4YC-1.20 " Time" |
---|
1822 | "draw string "Text4XC+0.25 " " Text4YC-1.20 " " _ttime |
---|
1823 | endif |
---|
1824 | if (OL = 2) |
---|
1825 | "set string 3" |
---|
1826 | "draw string "Text4XC+0.25 " " Text4YC-1.40 " " _ttime |
---|
1827 | "set string 1" |
---|
1828 | endif |
---|
1829 | "set string 7" |
---|
1830 | "draw string "Text4XC-0.99 " " Text4YC-1.70 " Initial Time" |
---|
1831 | "draw string "Text4XC+0.25 " " Text4YC-1.70 " " _analysis |
---|
1832 | "set string 1" |
---|
1833 | |
---|
1834 | *--------------------------------------------------- |
---|
1835 | * Plot RH profile. |
---|
1836 | *--------------------------------------------------- |
---|
1837 | |
---|
1838 | If (DrawRH = 1) |
---|
1839 | "set z "_zmin" "_zmax |
---|
1840 | "set x "_xval |
---|
1841 | "set y "_yval |
---|
1842 | "set t "_tval |
---|
1843 | "set zlog on" |
---|
1844 | "set gxout line" |
---|
1845 | "set ccolor "RHCol |
---|
1846 | "set cstyle "RHLine |
---|
1847 | "set cmark "RHMrk |
---|
1848 | "set digsiz "MrkSize |
---|
1849 | "set missconn on" |
---|
1850 | "set xlab on" |
---|
1851 | "set frame off" |
---|
1852 | "set vrange 0 350" |
---|
1853 | "set xlpos 0 t" |
---|
1854 | "set xlevs 25 50 75 100" |
---|
1855 | "set grid vertical 5" |
---|
1856 | "define rh=100*exp((17.2694*"snddewp")/("snddewp"+237.3)-(17.2694*"sndtemp")/("sndtemp"+237.3))" |
---|
1857 | "d rh" |
---|
1858 | If (LblAxes = 1) |
---|
1859 | "set string 1 c 3 0" |
---|
1860 | "set strsiz 0.125" |
---|
1861 | If (PageType = "Portrait") |
---|
1862 | "draw string 1.5 10.85 RH (%)" |
---|
1863 | Else |
---|
1864 | "draw string 1.75 8.35 RH (%)" |
---|
1865 | Endif |
---|
1866 | Endif |
---|
1867 | Endif |
---|
1868 | |
---|
1869 | *------------------------------------------ |
---|
1870 | * Reset environment to original dimensions |
---|
1871 | *------------------------------------------ |
---|
1872 | |
---|
1873 | "set t "_tval |
---|
1874 | "set x "_xval |
---|
1875 | "set y "_yval |
---|
1876 | "set z "_zmin " "_zmax |
---|
1877 | |
---|
1878 | say "Done." |
---|
1879 | |
---|
1880 | Return(0) |
---|
1881 | |
---|
1882 | ************************************************************************* |
---|
1883 | function Templcl(temp,dewp) |
---|
1884 | |
---|
1885 | *------------------------------------------------------ |
---|
1886 | * Calculate the temp at the LCL given temp & dewp in C |
---|
1887 | *------------------------------------------------------ |
---|
1888 | |
---|
1889 | tempk=temp+273.15 |
---|
1890 | dewpk=dewp+273.15 |
---|
1891 | Parta=1/(dewpk-56) |
---|
1892 | Partb=log(tempk/dewpk)/800 |
---|
1893 | Tlcl=1/(Parta+Partb)+56 |
---|
1894 | return(Tlcl-273.15) |
---|
1895 | |
---|
1896 | ************************************************************************** |
---|
1897 | |
---|
1898 | function Preslcl(temp,dewp,pres) |
---|
1899 | |
---|
1900 | *------------------------------------------------------- |
---|
1901 | * Calculate press of LCL given temp & dewp in C and pressure |
---|
1902 | *------------------------------------------------------- |
---|
1903 | |
---|
1904 | Tlclk=Templcl(temp,dewp)+273.15 |
---|
1905 | tempk=temp+273.15 |
---|
1906 | theta=tempk*pow(1000/pres,0.286) |
---|
1907 | plcl=1000*pow(Tlclk/theta,3.48) |
---|
1908 | return(plcl) |
---|
1909 | |
---|
1910 | ************************************************************************** |
---|
1911 | function LiftWet(startt,startp,endp,display,Pmin,Pmax) |
---|
1912 | |
---|
1913 | *-------------------------------------------------------------------- |
---|
1914 | * Lift a parcel moist adiabatically from startp to endp. |
---|
1915 | * Init temp is startt in C. If you wish to see the parcel's |
---|
1916 | * path plotted, display should be 1. Returns temp of parcel at endp. |
---|
1917 | *-------------------------------------------------------------------- |
---|
1918 | |
---|
1919 | temp=startt |
---|
1920 | pres=startp |
---|
1921 | cont = 1 |
---|
1922 | delp=10 |
---|
1923 | While (pres >= endp & cont = 1) |
---|
1924 | If (display = 1) |
---|
1925 | xtemp=GetXLoc(temp,pres) |
---|
1926 | "q w2xy "xtemp" "pres |
---|
1927 | xloc=subwrd(result,3) |
---|
1928 | yloc=subwrd(result,6) |
---|
1929 | If (xtemp < 0 | xtemp > 100) |
---|
1930 | cont=0 |
---|
1931 | Else |
---|
1932 | If (pres >= Pmin & pres < Pmax & pres < startp) |
---|
1933 | "draw line "xold" "yold" "xloc" "yloc |
---|
1934 | Endif |
---|
1935 | Endif |
---|
1936 | Endif |
---|
1937 | xold=xloc |
---|
1938 | yold=yloc |
---|
1939 | temp=temp-100*delp*gammaw(temp,pres-delp/2,100) |
---|
1940 | pres=pres-delp |
---|
1941 | EndWhile |
---|
1942 | return(temp) |
---|
1943 | |
---|
1944 | |
---|
1945 | ************************************************************************** |
---|
1946 | function LiftDry(startt,startp,endp,display,Pmin,Pmax) |
---|
1947 | |
---|
1948 | *-------------------------------------------------------------------- |
---|
1949 | * Lift a parcel dry adiabatically from startp to endp. |
---|
1950 | * Init temp is startt in C. If you wish to see the parcel's |
---|
1951 | * path plotted, display should be 1. Returns temp of parcel at endp. |
---|
1952 | *-------------------------------------------------------------------- |
---|
1953 | |
---|
1954 | starttk=startt+273.15 |
---|
1955 | cont = 1 |
---|
1956 | delp=10 |
---|
1957 | round=int(startp/10)*10 |
---|
1958 | subscr=0.1*round |
---|
1959 | powstart=pow(startp,-0.286) |
---|
1960 | temp=starttk*_powpres.subscr*powstart-273.15 |
---|
1961 | pres=round-10 |
---|
1962 | While (pres >= endp & cont = 1) |
---|
1963 | subscr=0.1*pres |
---|
1964 | temp=starttk*_powpres.subscr*powstart-273.15 |
---|
1965 | If (display = 1) |
---|
1966 | xtemp=GetXLoc(temp,pres) |
---|
1967 | "q w2xy "xtemp" "pres |
---|
1968 | xloc=subwrd(result,3) |
---|
1969 | yloc=subwrd(result,6) |
---|
1970 | If (xtempold > 0 & xtempold < 100 & xtemp > 0 & xtemp < 100) |
---|
1971 | If (pres >= Pmin & pres < Pmax & pres < startp) |
---|
1972 | "draw line "xold" "yold" "xloc" "yloc |
---|
1973 | Endif |
---|
1974 | Endif |
---|
1975 | Endif |
---|
1976 | xold=xloc |
---|
1977 | xtempold=xtemp |
---|
1978 | yold=yloc |
---|
1979 | pres=pres-delp |
---|
1980 | EndWhile |
---|
1981 | return(temp) |
---|
1982 | |
---|
1983 | ************************************************************************** |
---|
1984 | function CAPE(startt,startp,endp,sndtemp,snddewp) |
---|
1985 | |
---|
1986 | *--------------------------------------------------------------------- |
---|
1987 | * Returns all postive area and convective inhibition above LCL. |
---|
1988 | * Parcel is lifted from LCL at startt,startp and is halted |
---|
1989 | * at endp. Integration method used is trapezoid method. |
---|
1990 | *--------------------------------------------------------------------- |
---|
1991 | |
---|
1992 | pres=startp |
---|
1993 | PclTemp=startt |
---|
1994 | PclTempV=virtual2(PclTemp+273.15,PclTemp+273.15,pres)-273.15 |
---|
1995 | delp=10 |
---|
1996 | Pos=0 |
---|
1997 | Neg=0 |
---|
1998 | Neg2=0 |
---|
1999 | |
---|
2000 | count=0 |
---|
2001 | While (pres >= endp) |
---|
2002 | EnvTemp=interp(sndtemp,pres) |
---|
2003 | EnvDewp=interp(snddewp,pres) |
---|
2004 | EnvTempV=virtual2(EnvTemp+273.15,EnvDewp+273.15,pres)-273.15 |
---|
2005 | DelT=PclTempV-EnvTempV |
---|
2006 | If (abs(EnvTempV) < 130 & abs(PclTempV) < 130) |
---|
2007 | count=count+1 |
---|
2008 | If (count > 1) |
---|
2009 | Val=DelT/pres+Prev |
---|
2010 | If (Val > 0) |
---|
2011 | Pos=Pos+Val |
---|
2012 | Neg2=0 |
---|
2013 | Else |
---|
2014 | Neg=Neg+abs(Val) |
---|
2015 | Neg2=Neg2+abs(Val) |
---|
2016 | Endif |
---|
2017 | Endif |
---|
2018 | Prev=DelT/pres |
---|
2019 | Endif |
---|
2020 | pres=pres-delp |
---|
2021 | PclTemp=PclTemp-100*delp*gammaw(PclTemp,pres,100) |
---|
2022 | PclTempV=virtual2(PclTemp+273.15,PclTemp+273.15,pres)-273.15 |
---|
2023 | Endwhile |
---|
2024 | |
---|
2025 | Pos=0.5*Pos*287*delp |
---|
2026 | CIN=0.5*(Neg-Neg2)*287*delp |
---|
2027 | |
---|
2028 | return(Pos" "CIN) |
---|
2029 | |
---|
2030 | *************************************************************************** |
---|
2031 | function gammaw(tempc,pres,rh) |
---|
2032 | |
---|
2033 | *----------------------------------------------------------------------- |
---|
2034 | * Function to calculate the moist adiabatic lapse rate (deg C/Pa) based |
---|
2035 | * on the temperature, pressure, and rh of the environment. |
---|
2036 | *---------------------------------------------------------------------- |
---|
2037 | |
---|
2038 | tempk=tempc+273.15 |
---|
2039 | es=satvap2(tempc) |
---|
2040 | ws=mixratio(es,pres) |
---|
2041 | w=rh*ws/100 |
---|
2042 | tempv=virtual(tempk,w) |
---|
2043 | latent=latentc(tempc) |
---|
2044 | |
---|
2045 | A=1.0+latent*ws/(287*tempk) |
---|
2046 | B=1.0+0.622*latent*latent*ws/(1005*287*tempk*tempk) |
---|
2047 | Density=100*pres/(287*tempv) |
---|
2048 | lapse=(A/B)/(1005*Density) |
---|
2049 | return(lapse) |
---|
2050 | |
---|
2051 | ************************************************************************* |
---|
2052 | function latentc(tempc) |
---|
2053 | |
---|
2054 | *----------------------------------------------------------------------- |
---|
2055 | * Function to return the latent heat of condensation in J/kg given |
---|
2056 | * temperature in degrees Celsius. |
---|
2057 | *----------------------------------------------------------------------- |
---|
2058 | |
---|
2059 | val=2502.2-2.43089*tempc |
---|
2060 | |
---|
2061 | return(val*1000) |
---|
2062 | |
---|
2063 | ************************************************************************* |
---|
2064 | function precipw(sndtemp,snddewp,startp,endp) |
---|
2065 | |
---|
2066 | *----------------------------------------------------------------------- |
---|
2067 | * Function to calculate the precipitable water (cm) in a sounding |
---|
2068 | * starting at pressure level startp and ending at pressure level endp. |
---|
2069 | *----------------------------------------------------------------------- |
---|
2070 | |
---|
2071 | ppold=-999 |
---|
2072 | ttold=-999 |
---|
2073 | ddold=-999 |
---|
2074 | delp=10 |
---|
2075 | Int=0 |
---|
2076 | mix=0 |
---|
2077 | pres=startp |
---|
2078 | logpp=log(pres) |
---|
2079 | logppm=log(pres-delp) |
---|
2080 | while (pres >= endp) |
---|
2081 | tt=interp(sndtemp,pres) |
---|
2082 | dd=interp(snddewp,pres) |
---|
2083 | if (tt>-900 & ttold>-900 & dd>-900 & ddold>-900) |
---|
2084 | e=satvap2(dd) |
---|
2085 | mix=mixratio(e,pres) |
---|
2086 | mixavg=(logpp*mix+logppm*mixold)/(logpp+logppm) |
---|
2087 | Int=Int+1.020408*mixavg*delp |
---|
2088 | endif |
---|
2089 | ttold=tt |
---|
2090 | ddold=dd |
---|
2091 | ppold=pp |
---|
2092 | mixold=mix |
---|
2093 | pres=pres-delp |
---|
2094 | logpp=logppm |
---|
2095 | logppm=log(pres-delp) |
---|
2096 | endwhile |
---|
2097 | |
---|
2098 | return(Int) |
---|
2099 | |
---|
2100 | ************************************************************************* |
---|
2101 | |
---|
2102 | function virtual(temp,mix) |
---|
2103 | |
---|
2104 | *------------------------------------------------------------ |
---|
2105 | * Function to return virtual temperature given temperature in |
---|
2106 | * kelvin and mixing ratio in g/g. |
---|
2107 | *------------------------------------------------------------- |
---|
2108 | |
---|
2109 | tempv=temp*(1.0+0.6*mix) |
---|
2110 | |
---|
2111 | return (tempv) |
---|
2112 | |
---|
2113 | ************************************************************************ |
---|
2114 | |
---|
2115 | function virtual2(temp,dewp,pres) |
---|
2116 | |
---|
2117 | *------------------------------------------------------------ |
---|
2118 | * Function to return virtual temperature in kelvin given temperature in |
---|
2119 | * kelvin and dewpoint in kelvin and pressure in mb |
---|
2120 | *------------------------------------------------------------- |
---|
2121 | |
---|
2122 | if (temp > 0 & dewp > 0) |
---|
2123 | vap=satvap2(dewp-273.15) |
---|
2124 | mix=mixratio(vap,pres) |
---|
2125 | tempv=virtual(temp,mix) |
---|
2126 | else |
---|
2127 | tempv=-9999 |
---|
2128 | endif |
---|
2129 | |
---|
2130 | return (tempv) |
---|
2131 | |
---|
2132 | ************************************************************************ |
---|
2133 | |
---|
2134 | function satvapor(temp) |
---|
2135 | |
---|
2136 | *--------------------------------------------------------------- |
---|
2137 | * Given temp in Celsius, returns saturation vapor pressure in mb |
---|
2138 | *--------------------------------------------------------------- |
---|
2139 | |
---|
2140 | pol=_C0+temp*(_C1+temp*(_C2+temp*(_C3+temp*(_C4+temp*(_C5+temp*(_C6+temp*(_C7+temp*(_C8+temp*(_C9))))))))) |
---|
2141 | |
---|
2142 | return(6.1078/pow(pol,8)) |
---|
2143 | |
---|
2144 | ************************************************************************ |
---|
2145 | |
---|
2146 | function satvap2(temp) |
---|
2147 | |
---|
2148 | *--------------------------------------------------------------- |
---|
2149 | * Given temp in Celsius, returns saturation vapor pressure in mb |
---|
2150 | *--------------------------------------------------------------- |
---|
2151 | |
---|
2152 | es=6.112*exp(17.67*temp/(temp+243.5)) |
---|
2153 | |
---|
2154 | return(es) |
---|
2155 | |
---|
2156 | ************************************************************************* |
---|
2157 | |
---|
2158 | function mixratio(e,p) |
---|
2159 | |
---|
2160 | *------------------------------------------------------ |
---|
2161 | * Given vapor pressure and pressure, return mixing ratio |
---|
2162 | *------------------------------------------------------- |
---|
2163 | |
---|
2164 | mix=0.622*e/(p-e) |
---|
2165 | |
---|
2166 | return(mix) |
---|
2167 | |
---|
2168 | ************************************************************************ |
---|
2169 | |
---|
2170 | function getrh(temp,dewp,pres) |
---|
2171 | |
---|
2172 | tempk=temp+273.15 |
---|
2173 | dewpk=dewp+273.15 |
---|
2174 | |
---|
2175 | es=satvap2(temp) |
---|
2176 | |
---|
2177 | If (temp > 0) |
---|
2178 | A=2.53*pow(10,9) |
---|
2179 | B=5420 |
---|
2180 | Else |
---|
2181 | A=3.41*pow(10,10) |
---|
2182 | B=6130 |
---|
2183 | Endif |
---|
2184 | |
---|
2185 | w=A*0.622*exp(-B/dewpk)/pres |
---|
2186 | ws=mixratio(es,pres) |
---|
2187 | |
---|
2188 | return(100*w/ws) |
---|
2189 | |
---|
2190 | ************************************************************************ |
---|
2191 | function interp(array,pres) |
---|
2192 | |
---|
2193 | *------------------------------------------------------------------------ |
---|
2194 | * Interpolate inside array for pressure level pres. |
---|
2195 | * Returns estimated value of array at pressure pres. |
---|
2196 | *------------------------------------------------------------------------ |
---|
2197 | |
---|
2198 | "set gxout stat" |
---|
2199 | "set lev "pres |
---|
2200 | altpres=subwrd(result,4) |
---|
2201 | "q dims" |
---|
2202 | rec=sublin(result,4) |
---|
2203 | zlev=subwrd(rec,9) |
---|
2204 | |
---|
2205 | If (zlev < 2 | zlev > _zmaxfile) |
---|
2206 | Vest = -9999.0 |
---|
2207 | Else |
---|
2208 | If (altpres > pres) |
---|
2209 | zlev=zlev+1 |
---|
2210 | Endif |
---|
2211 | "set z "zlev |
---|
2212 | PAbove=subwrd(result,4) |
---|
2213 | "d "array"(lev="PAbove")" |
---|
2214 | rec=sublin(result,1) |
---|
2215 | check=substr(rec,1,6) |
---|
2216 | If (check = "Notice") |
---|
2217 | rec=sublin(result,9) |
---|
2218 | Else |
---|
2219 | rec=sublin(result,8) |
---|
2220 | Endif |
---|
2221 | VAbove=subwrd(rec,4) |
---|
2222 | "set z "zlev-1 |
---|
2223 | PBelow=subwrd(result,4) |
---|
2224 | "d "array"(lev="PBelow")" |
---|
2225 | rec=sublin(result,1) |
---|
2226 | check=substr(rec,1,6) |
---|
2227 | If (check = "Notice") |
---|
2228 | rec=sublin(result,9) |
---|
2229 | Else |
---|
2230 | rec=sublin(result,8) |
---|
2231 | Endif |
---|
2232 | VBelow=subwrd(rec,4) |
---|
2233 | |
---|
2234 | * Now if we are in a region of missing data, find next good level. |
---|
2235 | |
---|
2236 | If (abs(VAbove) > 130 & zlev > 1 & zlev < _zmaxfile) |
---|
2237 | zz=zlev |
---|
2238 | While (abs(VAbove) > 130 & zz < _zmaxfile) |
---|
2239 | zz=zz+1 |
---|
2240 | "set z "zz |
---|
2241 | PAbove=subwrd(result,4) |
---|
2242 | "d "array"(lev="PAbove")" |
---|
2243 | rec=sublin(result,1) |
---|
2244 | check=substr(rec,1,6) |
---|
2245 | If (check = "Notice") |
---|
2246 | rec=sublin(result,9) |
---|
2247 | Else |
---|
2248 | rec=sublin(result,8) |
---|
2249 | Endif |
---|
2250 | VAbove=subwrd(rec,4) |
---|
2251 | EndWhile |
---|
2252 | Endif |
---|
2253 | |
---|
2254 | If (abs(VBelow) > 130 & zlev > 1 & zlev < _zmaxfile) |
---|
2255 | zz=zlev-1 |
---|
2256 | While (abs(VBelow) > 130 & zz > 1) |
---|
2257 | zz=zz-1 |
---|
2258 | "set z "zz |
---|
2259 | PBelow=subwrd(result,4) |
---|
2260 | "d "array"(lev="PBelow")" |
---|
2261 | rec=sublin(result,1) |
---|
2262 | check=substr(rec,1,6) |
---|
2263 | If (check = "Notice") |
---|
2264 | rec=sublin(result,9) |
---|
2265 | Else |
---|
2266 | rec=sublin(result,8) |
---|
2267 | Endif |
---|
2268 | VBelow=subwrd(rec,4) |
---|
2269 | EndWhile |
---|
2270 | Endif |
---|
2271 | |
---|
2272 | If (abs(VAbove) < 130 & abs(VBelow) < 130) |
---|
2273 | Vest=VBelow+log(PBelow/pres)*(VAbove-VBelow)/log(PBelow/PAbove) |
---|
2274 | Else |
---|
2275 | Vest=-9999.0 |
---|
2276 | Endif |
---|
2277 | |
---|
2278 | Endif |
---|
2279 | |
---|
2280 | Return(Vest) |
---|
2281 | |
---|
2282 | **************************************************************************** |
---|
2283 | |
---|
2284 | function GetUWnd(wspd,wdir) |
---|
2285 | |
---|
2286 | *------------------------ |
---|
2287 | * Get x-component of wind. |
---|
2288 | *------------------------ |
---|
2289 | |
---|
2290 | |
---|
2291 | If (wspd >= 0) |
---|
2292 | xwind=wspd*cos((270-wdir)*_dtr) |
---|
2293 | Else |
---|
2294 | xwind = -9999.0 |
---|
2295 | Endif |
---|
2296 | return(xwind) |
---|
2297 | |
---|
2298 | ************************************************************************** |
---|
2299 | |
---|
2300 | function GetVWnd(wspd,wdir) |
---|
2301 | |
---|
2302 | *----------------------- |
---|
2303 | * Get y-component of wind |
---|
2304 | *------------------------ |
---|
2305 | |
---|
2306 | If (wspd >= 0) |
---|
2307 | ywind=wspd*sin((270-wdir)*_dtr) |
---|
2308 | Else |
---|
2309 | ywind = -9999.0 |
---|
2310 | Endif |
---|
2311 | return(ywind) |
---|
2312 | |
---|
2313 | |
---|
2314 | ************************************************************************* |
---|
2315 | |
---|
2316 | function GetWSpd(xwind,ywind) |
---|
2317 | |
---|
2318 | |
---|
2319 | "set gxout stat" |
---|
2320 | "d mag("xwind","ywind")" |
---|
2321 | rec=sublin(result,1) |
---|
2322 | check=substr(rec,1,6) |
---|
2323 | If (check = "Notice") |
---|
2324 | rec=sublin(result,9) |
---|
2325 | Else |
---|
2326 | rec=sublin(result,8) |
---|
2327 | Endif |
---|
2328 | val=subwrd(rec,4) |
---|
2329 | |
---|
2330 | return (val) |
---|
2331 | |
---|
2332 | ************************************************************************* |
---|
2333 | |
---|
2334 | function GetWDir(xwind,ywind) |
---|
2335 | |
---|
2336 | * Return wind direction given x and y components |
---|
2337 | |
---|
2338 | "set gxout stat" |
---|
2339 | "define theta=270-"_rtd"*atan2("ywind","xwind")" |
---|
2340 | "d theta" |
---|
2341 | rec=sublin(result,1) |
---|
2342 | check=substr(rec,1,6) |
---|
2343 | If (check = "Notice") |
---|
2344 | rec=sublin(result,9) |
---|
2345 | Else |
---|
2346 | rec=sublin(result,8) |
---|
2347 | Endif |
---|
2348 | Dir=subwrd(rec,4) |
---|
2349 | |
---|
2350 | If (Dir > 360) |
---|
2351 | Dir=Dir-360 |
---|
2352 | Endif |
---|
2353 | |
---|
2354 | If (Dir < 0) |
---|
2355 | Dir=360+Dir |
---|
2356 | Endif |
---|
2357 | |
---|
2358 | return(Dir) |
---|
2359 | |
---|
2360 | ************************************************************************* |
---|
2361 | |
---|
2362 | function GetXLoc(temp,pres) |
---|
2363 | |
---|
2364 | *------------------------------------------------- |
---|
2365 | * Get x-location on skew-t based on temp, pressure |
---|
2366 | *------------------------------------------------- |
---|
2367 | |
---|
2368 | xloc=(temp-_m1*log10(pres)-_m3)/_m2 |
---|
2369 | return(xloc) |
---|
2370 | |
---|
2371 | ************************************************************************* |
---|
2372 | |
---|
2373 | function GetTemp(xloc,pres) |
---|
2374 | |
---|
2375 | *------------------------------------------------- |
---|
2376 | * Return temperature at location given by xloc,pres |
---|
2377 | *------------------------------------------------- |
---|
2378 | |
---|
2379 | tempval=_m1*log10(pres)+_m2*xloc+_m3 |
---|
2380 | return(tempval) |
---|
2381 | |
---|
2382 | ************************************************************************** |
---|
2383 | |
---|
2384 | function GetTheta(temp,pres) |
---|
2385 | |
---|
2386 | *--------------------------------------------------- |
---|
2387 | * Calculate theta for a given temperature and pressure |
---|
2388 | *--------------------------------------------------- |
---|
2389 | |
---|
2390 | theta=(temp+273.15)*pow(1000/pres,0.286)-273.15 |
---|
2391 | return(theta) |
---|
2392 | |
---|
2393 | |
---|
2394 | ************************************************************************* |
---|
2395 | |
---|
2396 | function GetThet2(temp,dewp,pres) |
---|
2397 | |
---|
2398 | *--------------------------------------------------- |
---|
2399 | * Calculate theta for a given temperature,dewp, and pressure |
---|
2400 | *--------------------------------------------------- |
---|
2401 | |
---|
2402 | tempk=273.15+temp |
---|
2403 | dewpk=273.15+dewp |
---|
2404 | |
---|
2405 | es=satvap2(temp) |
---|
2406 | ws=mixratio(es,pres) |
---|
2407 | |
---|
2408 | mix=10*getrh(temp,dewp,pres)*ws |
---|
2409 | |
---|
2410 | exponent=0.2854*(1.0-0.00028*mix) |
---|
2411 | theta=(temp+273.15)*pow(1000/pres,exponent)-273.15 |
---|
2412 | return(theta) |
---|
2413 | |
---|
2414 | ************************************************************************* |
---|
2415 | |
---|
2416 | function Thetae(temp,dewp,pres) |
---|
2417 | |
---|
2418 | *-------------------------------------------------------------- |
---|
2419 | * Return equiv. pot. temp in Kelvin given temp, dewp in celsius |
---|
2420 | *-------------------------------------------------------------- |
---|
2421 | |
---|
2422 | es=satvap2(temp) |
---|
2423 | ws=mixratio(es,pres) |
---|
2424 | mix=10*getrh(temp,dewp,pres)*ws |
---|
2425 | theta=GetThet2(temp,dewp,pres)+273.15 |
---|
2426 | TLcl=Templcl(temp,dewp)+273.15 |
---|
2427 | thetae=theta*exp((3.376/TLcl-0.00254)*mix*1.0+0.00081*mix) |
---|
2428 | |
---|
2429 | return(thetae) |
---|
2430 | |
---|
2431 | ************************************************************************** |
---|
2432 | |
---|
2433 | |
---|
2434 | function int(i0) |
---|
2435 | |
---|
2436 | *-------------------------- |
---|
2437 | * Return integer of i0 |
---|
2438 | *-------------------------- |
---|
2439 | i=0 |
---|
2440 | while(i<12) |
---|
2441 | i=i+1 |
---|
2442 | if(substr(i0,i,1)='.') |
---|
2443 | i0=substr(i0,1,i-1) |
---|
2444 | break |
---|
2445 | endif |
---|
2446 | endwhile |
---|
2447 | return(i0) |
---|
2448 | |
---|
2449 | ************************************************************************* |
---|
2450 | |
---|
2451 | function abs(i) |
---|
2452 | |
---|
2453 | *---------------------------- |
---|
2454 | * return absolute value of i |
---|
2455 | *---------------------------- |
---|
2456 | |
---|
2457 | if (i < 0) |
---|
2458 | absval=-i |
---|
2459 | else |
---|
2460 | absval=i |
---|
2461 | endif |
---|
2462 | |
---|
2463 | return(absval) |
---|
2464 | |
---|
2465 | ************************************************************************* |
---|
2466 | |
---|
2467 | function log(i) |
---|
2468 | |
---|
2469 | *--------------------------- |
---|
2470 | * return natural log of i |
---|
2471 | *--------------------------- |
---|
2472 | |
---|
2473 | "set gxout stat" |
---|
2474 | "d log("i")" |
---|
2475 | rec=sublin(result,1) |
---|
2476 | check=substr(rec,1,6) |
---|
2477 | If (check = "Notice") |
---|
2478 | rec=sublin(result,9) |
---|
2479 | Else |
---|
2480 | rec=sublin(result,8) |
---|
2481 | Endif |
---|
2482 | val=subwrd(rec,4) |
---|
2483 | return(val) |
---|
2484 | |
---|
2485 | ************************************************************************* |
---|
2486 | |
---|
2487 | function log10(i) |
---|
2488 | |
---|
2489 | *-------------------------- |
---|
2490 | * return log base 10 of i |
---|
2491 | *-------------------------- |
---|
2492 | |
---|
2493 | "set gxout stat" |
---|
2494 | "d log10("i")" |
---|
2495 | rec=sublin(result,1) |
---|
2496 | check=substr(rec,1,6) |
---|
2497 | If (check = "Notice") |
---|
2498 | rec=sublin(result,9) |
---|
2499 | Else |
---|
2500 | rec=sublin(result,8) |
---|
2501 | Endif |
---|
2502 | val=subwrd(rec,4) |
---|
2503 | return(val) |
---|
2504 | |
---|
2505 | ************************************************************************* |
---|
2506 | |
---|
2507 | function pow(i,j) |
---|
2508 | |
---|
2509 | *------------------------------- |
---|
2510 | * return power of i raised to j |
---|
2511 | *------------------------------- |
---|
2512 | |
---|
2513 | "set gxout stat" |
---|
2514 | "d pow("i","j")" |
---|
2515 | rec=sublin(result,1) |
---|
2516 | check=substr(rec,1,6) |
---|
2517 | If (check = "Notice") |
---|
2518 | rec=sublin(result,9) |
---|
2519 | Else |
---|
2520 | rec=sublin(result,8) |
---|
2521 | Endif |
---|
2522 | val=subwrd(rec,4) |
---|
2523 | return(val) |
---|
2524 | |
---|
2525 | ************************************************************************ |
---|
2526 | |
---|
2527 | function cos(i) |
---|
2528 | |
---|
2529 | *----------------------------------------- |
---|
2530 | * return cosine of i, where i is in radians |
---|
2531 | *------------------------------------------ |
---|
2532 | |
---|
2533 | "set gxout stat" |
---|
2534 | "d cos("i")" |
---|
2535 | rec=sublin(result,1) |
---|
2536 | check=substr(rec,1,6) |
---|
2537 | If (check = "Notice") |
---|
2538 | rec=sublin(result,9) |
---|
2539 | Else |
---|
2540 | rec=sublin(result,8) |
---|
2541 | Endif |
---|
2542 | val=subwrd(rec,4) |
---|
2543 | return(val) |
---|
2544 | |
---|
2545 | ************************************************************************ |
---|
2546 | |
---|
2547 | function sin(i) |
---|
2548 | |
---|
2549 | *------------------------------------------ |
---|
2550 | * return sine of i, where i is in radians |
---|
2551 | *------------------------------------------ |
---|
2552 | |
---|
2553 | "set gxout stat" |
---|
2554 | "d sin("i")" |
---|
2555 | rec=sublin(result,1) |
---|
2556 | check=substr(rec,1,6) |
---|
2557 | If (check = "Notice") |
---|
2558 | rec=sublin(result,9) |
---|
2559 | Else |
---|
2560 | rec=sublin(result,8) |
---|
2561 | Endif |
---|
2562 | val=subwrd(rec,4) |
---|
2563 | return(val) |
---|
2564 | |
---|
2565 | ************************************************************************ |
---|
2566 | |
---|
2567 | function exp(i) |
---|
2568 | |
---|
2569 | *------------------------------------------ |
---|
2570 | * return exponential of i |
---|
2571 | *------------------------------------------ |
---|
2572 | |
---|
2573 | "set gxout stat" |
---|
2574 | "d exp("i")" |
---|
2575 | rec=sublin(result,1) |
---|
2576 | check=substr(rec,1,6) |
---|
2577 | If (check = "Notice") |
---|
2578 | rec=sublin(result,9) |
---|
2579 | Else |
---|
2580 | rec=sublin(result,8) |
---|
2581 | Endif |
---|
2582 | val=subwrd(rec,4) |
---|
2583 | return(val) |
---|
2584 | |
---|
2585 | *********************************************************************** |
---|
2586 | function round(i) |
---|
2587 | |
---|
2588 | rr=abs(1.0*i) |
---|
2589 | rr=int(rr+0.5) |
---|
2590 | if (i < 0) |
---|
2591 | rr=-1*rr |
---|
2592 | endif |
---|
2593 | return(rr) |
---|