11 extern struct save_rec2
save_rec[20];
18 extern unsigned long mmap[16];
28 void display_data(
char *hb5,
char *pc,
int dmonth,
int dday,
int dyear,
int dhour,
29 int ddays,
char *
fname)
76 etime.
year=gmtim->tm_year+1900;
77 etime.
month=gmtim->tm_mon+1;
78 etime.
day=gmtim->tm_mday;
79 etime.
hour=gmtim->tm_hour;
91 int j,inum,
i,ier,ierr,qflow,len,
k;
92 char *
text,
buf[300],sbuf[150],hbuf[10];
98 XmString cancel,file_string,print_string;
111 file_string=XmStringCreateLocalized(
"file");
112 print_string=XmStringCreateLocalized(
"print");
113 cancel=XmStringCreateLocalized(
"quit");
136 XtSetArg(
args[argcount],XmNdeleteResponse,XmDO_NOTHING);argcount++;
142 XmDIALOG_OK_BUTTON));
144 XmDIALOG_HELP_BUTTON));
146 XmDIALOG_CANCEL_BUTTON));
148 XmDIALOG_SEPARATOR));
153 XtSetArg(
args[argcount],XmNbackground,0);argcount++;
160 XtSetArg(
args[argcount],XmNbackground,
mmap[1]);argcount++;
161 XtSetArg(
args[argcount],XmNforeground,
mmap[0]);argcount++;
168 XtSetArg(
args[argcount],XmNresizePolicy,XmRESIZE_ANY);argcount++;
169 XtSetArg(
args[argcount],XmNbackground,0);argcount++;
178 items[0].
label=
"Quit";
186 items[0].
label=
"Linear stage";
189 items[1].
label=
"Linear flow";
192 items[2].
label=
"Scale to data";
195 items[3].
label=
"Scale to flood";
211 sprintf(sbuf,
"get_data %s %s %d %d %d %d %d %s",
225 fread(&inum,
sizeof(
int),1,
fp);
230 fread(&ier,
sizeof(
int),1,
fp);
284 sprintf(sbuf,
"get_data %s %s %d %d %d %d %d %s",
297 fread(&inum,
sizeof(
int),1,
fp);
303 fread(&ier,
sizeof(
int),1,
fp);
313 memcpy(&
save_rec[
j].qarm,
"SWIRMZZ\0\0\0",10);
353 XmStringFree(file_string);
354 XmStringFree(print_string);
355 XmStringFree(cancel);
374 int xparm1,yparm1,xparm2,yparm2;
377 time_t lbtim,letim,
stim,otim;
378 char abuf[100],tbuf[100];
383 int deltat,
i,text_width,
j,h,qflag,ier;
385 float fxvalue,fyvalue,svalue,dxvalue;
386 int maxv,minv,smaxv,sminv,dvalue;
387 int xvalue,oday,yvalue,xvalue1,yvalue1,totlin,totdays,
hour,ierr,flow,ilinear;
389 char buf[200],ubuf[50],xbuf[50];
390 int inum,merr,ybegin,len;
392 double stage,wrn,fld,abs1,abs2;
398 int line_width,line_style,cap_style,join_style,lines;
432 XSetClipRectangles(
display,
gc1,0,0,rect,1,Unsorted);
510 strcpy(
buf,
"NO DATA");
546 lbtim=
ouptime(tm.tm_year,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
555 letim=
ouptime(tm.tm_year,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
561 totlin=(lbtim-letim)/(24L*3600L)+1;
563 totyears=(lbtim-letim)/(24L*3600L*365L)+1;
594 maxtimes=(lbtim-letim)/(deltat*3600L);
596 totdays=(lbtim-letim)/(24L*3600L)+1;
598 totlin=totdays*24/deltat+4;
607 for(
i=0;
i<=totlin;
i++) {
609 stim=letim+((
i-4)*deltat*3600L) +
hour*3600L;
616 if(xvalue >
width-xparm1)
619 if(xvalue < xs+xparm1)
626 if(gm->tm_mday==1 && gm->tm_mon==0) {
632 sprintf(
buf,
"%d/%d",gm->tm_mon+1,gm->tm_year);
644 else if(gm->tm_mday==1 && totyears < 2) {
663 if(oday != gm->tm_mday) {
665 if(gm->tm_hour==0 || htflag==1) {
667 sprintf(
buf,
"%d/%d",gm->tm_mon+1,gm->tm_mday);
684 if(h==0 || h==2 || h==4 || h==6 || h==8 ||
685 h==10 || h==12 || h==14 || h==16 ||
686 h==18 || h==20 || h==22)
691 else if(deltat==3 && totdays <= 2) {
694 if(h==0 || h==3 || h==6 || h==9 || h==12 ||
695 h==15 || h==18 || h==21)
702 if(h==0 || h==6 || h==12 || h==18)
714 else if(deltat==24) {
739 maxv=max_min2.
max + 1;
741 if(maxv-max_min2.
max < .4)
759 minv=max_min2.
min - 1;
761 if(minv-max_min2.
min > .4)
785 if(ierr >= 0 && ierr <= 2)
816 values[0].zdate,(
double)minv,
820 values[0].zdate,(
double)maxv,
823 if(ierr == 3 || merr == 3) {
835 maxvalues=(maxv-minv)/(deltav);
839 for(
i=0;
i<=maxvalues+2;
i++) {
841 svalue=(float)minv+(
i*deltav);
843 (float)(svalue-minv);
846 if(yvalue < ys+yparm1 || yvalue >
height-yparm2)
859 width-xparm1,yvalue);
861 if(ilinear==0 || (ilinear==1 &&
867 xvalue=
width-xparm1+2;
879 xvalue=xs+xparm1-text_width;
895 if(ilinear==0 || (ilinear==1 &&
899 values[0].zdate,(
double)svalue,
919 xvalue=
width-xparm1+2;
927 xvalue=xs+xparm1-text_width;
943 line_style=LineOnOffDash;
945 join_style=JoinRound;
947 XSetLineAttributes(
display,
gc1,line_width,line_style,
948 cap_style,join_style);
973 if(yvalue > ys+yparm1 &&
976 width-xparm1,yvalue);
1007 line_style=LineOnOffDash;
1009 join_style=JoinRound;
1011 XSetLineAttributes(
display,
gc1,line_width,line_style,
1012 cap_style,join_style);
1014 if(yvalue > ys+yparm1 &&
1017 width-xparm1,yvalue);
1046 if(yvalue > ys+yparm1 &&
1049 width-xparm1,yvalue);
1055 line_style=LineSolid;
1057 join_style=JoinRound;
1059 XSetLineAttributes(
display,
gc1,line_width,line_style,
1060 cap_style,join_style);
1078 for(
i=0;
i<len;
i++) {
1085 yvalue,xbuf,strlen(xbuf));
1110 for(
i=0;
i<len;
i++) {
1117 yvalue,xbuf,strlen(xbuf));
1127 for(
i=0;
i<inum;
i++) {
1129 tm.tm_year=
values[
i].zdate/10000-1900;
1130 tm.tm_mon=(
values[
i].zdate-(tm.tm_year+1900)*10000)/100;
1131 tm.tm_mday=
values[
i].zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1132 tm.tm_hour=
values[
i].ztime/10000;
1133 tm.tm_min=(
values[
i].ztime-tm.tm_hour*10000)/100;
1135 tm.tm_mon=tm.tm_mon;
1136 stim=
ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,
1137 tm.tm_hour,tm.tm_min,0);
1140 (float)(letim-
stim);
1145 (float)(svalue-minv);
1151 dxvalue=-(float)(
xmax-
xmin)/(float)(letim-lbtim)*
1159 if(
ymax - yvalue == 0 &&
i > 0) {
1162 if(oqual ==
'S' || oqual ==
'V' ||
1163 oqual ==
'A' || oqual ==
'B')
1166 else if(oqual ==
'F' || oqual ==
'X')
1169 else if(oqual ==
'D' || oqual ==
'E' || oqual==
'O')
1172 else if(oqual ==
'Q' || oqual ==
'C' )
1188 else if(oqual ==
'S' || oqual ==
'V' ||
1189 oqual ==
'A' || oqual ==
'B')
1192 else if(oqual ==
'F' || oqual ==
'X')
1195 else if(oqual ==
'D' || oqual ==
'E' || oqual==
'O')
1198 else if(oqual ==
'Q' || oqual ==
'C' )
1206 if(xvalue >= oxvalue)
1212 xvalue-dvalue,yvalue,
1213 dvalue-1,
ymax-yvalue+1);
1215 oxvalue=xvalue-dvalue;
1230 for(
i=0;
i<inum;
i++) {
1232 tm.tm_year=
values[
i].zdate/10000-1900;
1233 tm.tm_mon=(
values[
i].zdate-(tm.tm_year+1900)*10000)/100;
1234 tm.tm_mday=
values[
i].zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1235 tm.tm_hour=
values[
i].ztime/10000;
1236 tm.tm_min=(
values[
i].ztime-tm.tm_hour*10000)/100;
1238 tm.tm_mon=tm.tm_mon;
1239 stim=
ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
1242 (float)(letim-
stim);
1253 svalue=(double)flow;
1258 (float)(svalue-minv);
1263 if(oqual ==
'S' || oqual ==
'V' ||
1264 oqual ==
'A' || oqual ==
'B')
1267 else if(oqual ==
'F' || oqual ==
'X')
1270 else if(oqual ==
'D' || oqual ==
'E' || oqual==
'O')
1273 else if(oqual ==
'Q' || oqual ==
'C' )
1281 if(otim-
stim < 7200L)
1308 for(
i=0;
i<qnum;
i++) {
1310 tm.tm_year=qalues[
i].
zdate/10000-1900;
1311 tm.tm_mon=(qalues[
i].
zdate-(tm.tm_year+1900)*10000)/100;
1312 tm.tm_mday=qalues[
i].
zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1313 tm.tm_hour=qalues[
i].
ztime/10000;
1314 tm.tm_min=(qalues[
i].
ztime-tm.tm_hour*10000)/100;
1316 tm.tm_mon=tm.tm_mon;
1317 stim=
ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,
1318 tm.tm_hour,tm.tm_min,0);
1321 (float)(letim-
stim);
1326 (float)(svalue-minv);
1331 dxvalue=-(float)(
xmax-
xmin)/(float)(letim-lbtim)*
1339 if(
ymax - yvalue == 0 &&
i > 0) {
1341 if(oqual !=
'S' && oqual !=
'V')
1361 xvalue-dvalue,yvalue,
1362 dvalue-1,
ymax-yvalue+1);
1369 oqual=qalues[
i].
qual;
1377 for(
i=0;
i<qnum;
i++) {
1379 tm.tm_year=qalues[
i].
zdate/10000-1900;
1380 tm.tm_mon=(qalues[
i].
zdate-(tm.tm_year+1900)*10000)/100;
1381 tm.tm_mday=qalues[
i].
zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1382 tm.tm_hour=qalues[
i].
ztime/10000;
1383 tm.tm_min=(qalues[
i].
ztime-tm.tm_hour*10000)/100;
1385 tm.tm_mon=tm.tm_mon;
1386 stim=
ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
1389 (float)(letim-
stim);
1400 svalue=(double)flow;
1405 (float)(svalue-minv);
1410 if(oqual !=
'S' && oqual !=
'V')
1418 if(otim-
stim < 7200L)
1435 oqual=qalues[
i].
qual;
1458 sprintf(abuf,
" at %02d/%02d/%02d %02dZ",
1483 sprintf(abuf,
" at %02d/%02d/%02d %02dZ",
1498 (
double)max_min2.
max,
1510 sprintf(abuf,
" at %02d/%02d/%02d %02dZ",
1511 max_min2.
tmx.tm_mon,max_min2.
tmx.tm_mday,max_min2.
tmx.tm_year,
1512 max_min2.
tmx.tm_hour);
1523 (
double)max_min2.
min,
1535 sprintf(abuf,
" at %02d/%02d/%02d %02dZ",
1536 max_min2.
tmn.tm_mon,max_min2.
tmn.tm_mday,max_min2.
tmn.tm_year,
1537 max_min2.
tmn.tm_hour);
1554 int i,xdate,
xtime,ndate,ntime;
1560 for(
i=0;
i<inum;
i++) {
1605 hours=(lbtim-letim)/3600L;
1613 else if(hours < 144)
1616 else if(hours < 288)
1619 else if(hours < 576)
1622 else if(hours < 1152)
1625 else if(hours < 2304)
1628 else if(hours < 4608)
1668 else if(diff < 1000)
1671 else if(diff < 2000)
1674 else if(diff < 4000)
1677 else if(diff < 10000)
1680 else if(diff < 20000)
1683 else if(diff < 40000)
1686 else if(diff < 100000)
1689 else if(diff < 200000)
1692 else if(diff < 400000)
1695 else if(diff < 1000000)
1698 else if(diff < 2000000)
1701 else if(diff < 4000000)
1712 void options_draw(Widget w,XtPointer data,XmDrawingAreaCallbackStruct *call_data)
1749 void quit_draw(Widget w,XtPointer data,XmDrawingAreaCallbackStruct *call_data)
1797 if(strncasecmp(
"P",ibuf,1)==0 ||
1798 strncasecmp(
"S",ibuf,1)==0)
1799 strcpy(sbuf,
"INCHES");
1801 else if(strncasecmp(
"T",ibuf,1)==0)
1802 strcpy(sbuf,
"DEGREES F");
1804 else if(strncasecmp(
"X",ibuf,1)==0)
1805 strcpy(sbuf,
"PERCENT");
1807 else if(strncasecmp(
"H",ibuf,1)==0)
1808 strcpy(sbuf,
"FEET");
1810 else if(strncasecmp(
"L",ibuf,1)==0)
1811 strcpy(sbuf,
"KAC-FT");
1813 else if(strncasecmp(
"Q",ibuf,1)==0 && strlen(ibuf) > 3 &&
1814 strncasecmp(
"M",&ibuf[2],1)==0)
1815 strcpy(sbuf,
"KAC-FT");
1817 else if(strncasecmp(
"Q",ibuf,1)==0 && strlen(ibuf) > 3 &&
1818 strncasecmp(
"D",&ibuf[2],1)==0)
1819 strcpy(sbuf,
"KAC-FT");
1821 else if(strncasecmp(
"QRD1Z",ibuf,5)==0)
1822 strcpy(sbuf,
"KCFS");
1824 else if(strncasecmp(
"Q",ibuf,1)==0)
1827 else if(strncasecmp(
"US",ibuf,2)==0)
1828 strcpy(sbuf,
"MILES PER HOUR");
1830 else if(strncasecmp(
"UD",ibuf,2)==0)
1831 strcpy(sbuf,
"DEGREES");
1835 strcpy(sbuf,
"VALUE");
1845 if(strncasecmp(
"HG",ibuf,2)==0)
1846 strcat(sbuf,
"RIVER STAGE");
1848 else if(strncasecmp(
"HP",ibuf,2)==0)
1849 strcat(sbuf,
"RESERVOIR POOL ELEVATION");
1851 else if(strncasecmp(
"LS",ibuf,2)==0)
1852 strcat(sbuf,
"LAKE STORAGE");
1854 else if(strncasecmp(
"PC",ibuf,2)==0)
1855 strcat(sbuf,
"PRECIPITATION ACCUMULATION");
1857 else if(strncasecmp(
"PP",ibuf,2)==0)
1858 strcat(sbuf,
"PRECIPITATION INCREMENTAL");
1860 else if(strncasecmp(
"QC",ibuf,2)==0)
1861 strcat(sbuf,
"RUNOFF VOLUME");
1863 else if(strncasecmp(
"QD",ibuf,2)==0)
1864 strcat(sbuf,
"DISCHARGE-DIVERSION");
1866 else if(strncasecmp(
"QI",ibuf,2)==0)
1867 strcat(sbuf,
"DISCHARGE-INFLOW");
1869 else if(strncasecmp(
"QR",ibuf,2)==0)
1870 strcat(sbuf,
"DISCHARGE-RIVER");
1872 else if(strncasecmp(
"QT",ibuf,2)==0)
1873 strcat(sbuf,
"DISCHARGE-OUTFLOW");
1875 else if(strncasecmp(
"SD",ibuf,2)==0)
1876 strcat(sbuf,
"SNOW DEPTH");
1878 else if(strncasecmp(
"SW",ibuf,2)==0)
1879 strcat(sbuf,
"SNOW WATER EQUIVALENT");
1881 else if(strncasecmp(
"TA",ibuf,2)==0)
1882 strcat(sbuf,
"AIR TEMPERATURE");
1884 else if(strncasecmp(
"US",ibuf,2)==0)
1885 strcat(sbuf,
"WIND SPEED");
1887 else if(strncasecmp(
"UD",ibuf,2)==0)
1888 strcat(sbuf,
"WIND DIRECTION");
1890 else if(strncasecmp(
"UQ",ibuf,2)==0)
1891 strcat(sbuf,
"WIND SPEED/DIRECTION");
1893 else if(strncasecmp(
"XR",ibuf,2)==0)
1894 strcat(sbuf,
"RELATIVE HUMIDITY");
1897 strcat(sbuf,
"UNKNOWN");
1901 if(strncasecmp(
"I",&ibuf[2],1)==0)
1902 strcat(sbuf,
"INSTANTANEOUS");
1904 else if(strncasecmp(
"D",&ibuf[2],1)==0)
1905 strcat(sbuf,
"DAILY");
1907 else if(strncasecmp(
"Q",&ibuf[2],1)==0)
1908 strcat(sbuf,
"SIX HOURLY");
1910 else if(strncasecmp(
"M",&ibuf[2],1)==0)
1911 strcat(sbuf,
"MONTHLY");
1914 strcat(sbuf,
"UNKNOWN");
1918 if(strncasecmp(
"R",&ibuf[3],1)==0)
1919 strcat(sbuf,
"OBSERVED");
1921 else if(strncasecmp(
"P",&ibuf[3],1)==0)
1922 strcat(sbuf,
"PROCESSED");
1924 else if(strncasecmp(
"1",&ibuf[3],1)==0)
1925 strcat(sbuf,
"PROCESSED LEVEL 1");
1927 else if(strncasecmp(
"2",&ibuf[3],1)==0)
1928 strcat(sbuf,
"PROCESSED LEVEL 2");
1930 else if(strncasecmp(
"F",&ibuf[3],1)==0)
1931 strcat(sbuf,
"FORECAST");
1934 strcat(sbuf,
"UNKNOWN");
1938 if(strncasecmp(
"Z",&ibuf[4],1)==0)
1939 strcat(sbuf,
"STP/SAO");
1941 else if(strncasecmp(
"G",&ibuf[4],1)==0)
1942 strcat(sbuf,
"GOES");
1944 else if(strncasecmp(
"M",&ibuf[4],1)==0)
1945 strcat(sbuf,
"METEOR");
1947 else if(strncasecmp(
"P",&ibuf[4],1)==0)
1948 strcat(sbuf,
"PHONE");
1950 else if(strncasecmp(
"R",&ibuf[4],1)==0)
1951 strcat(sbuf,
"RADIO");
1954 strcat(sbuf,
"UNKNOWN");
1956 if(strncasecmp(
"Z",&ibuf[5],1)!=0)
1959 if(strncasecmp(
"X",&ibuf[5],1)==0)
1960 strcat(sbuf,
"MAXIMUM:DAILY");
1962 else if(strncasecmp(
"N",&ibuf[5],1)==0)
1963 strcat(sbuf,
"MINIMUM:DAILY");
1965 if(strncasecmp(
"Z",&ibuf[6],1)!=0)
1968 if(strncasecmp(
"F",&ibuf[6],1)==0)
1971 else if(strncasecmp(
"N",&ibuf[6],1)==0)
int get_delta_time(time_t lbtim, time_t letim)
XFontStruct * info_font[10]
struct max_min get_max_min(struct stn_values *stn_values, int inum)
struct stn_values * stn_values
void draw_area(int k, int m, int xs, int ys, int xz, int yz)
void get_units(char *ibuf, char *sbuf)
void get_acronym(char *ibuf, char *sbuf)
float get_delta_valu(int diff)
void display_data(char *hb5, char *pc, int dmonth, int dday, int dyear, int dhour, int ddays, char *fname)
void berror(Widget widget, char *string)
long ouptime(int year, int month, int day, int hour, int minute, int second)
Widget AttachToCascade(Widget, char *, Widget)
Widget BuildPulldownPushMenu(Widget, char *, char, struct MenuItem *)
int GetFlow(char *, char, char, int, double, int *)
double GetStage(char *, char, char, int, int, int *)
static RatingTable rate_table
sprintf(fbuf,"/usr/mapper/nexrad/ngrid.%02d-%02d-%02d-%02d", year, month, day, hour)