Daily_QC
read_precip_b.c
Go to the documentation of this file.
1 
2 #include "prototypes_new.h"
3 
4 int read_precip_b(char *fname,time_t tget,int i)
5 
6 {
7  extern struct dval dval;
8  extern struct pdata pdata[10];
9  extern struct station station[3000];
10  extern int max_stations;
11  FILE *fr;
12  int j,k,ier,m,qual;
13  char kbuf[100],*p,*q,*r,buf[100],hb5[10];
14  long t,u;
15  float conv=.0174;
16  double lat,lon;
17  int type;
18  int maxk,startk;
19  int rier;
20  char pc,datbuf[50],parmbuf[50];
21  int number_found[5];
22  struct tm *gm;
23  int reset_flag;
24 
25  reset_flag=0;
26 
27  rier=-1;
28 
29  fr=fopen(fname,"r");
30  pdata[i].data_time=tget;
31 
32  gm=gmtime(&tget);
33 
34  pdata[i].ztime=(gm->tm_year+1900)*10000+(gm->tm_mon+1)*100+gm->tm_mday;
35 
36  for(j=0;j<5;j++)
37  number_found[j]=0;
38 
39  for(k=0;k<max_stations;k++) {
40 
41  for(m=0;m<5;m++) {
42 
43  pdata[i].stn[k].frain[m].data=-1;
44  pdata[i].stn[k].frain[m].qual=-1;
45 
46  }
47 
48  }
49 
50  if(fr==NULL) {
51 
52  reset:
53 
54  pdata[i].level=1;
55 
56  for(k=0;k<max_stations;k++) {
57 
58  for(m=0;m<5;m++) {
59 
60  if(pdata[i].stn[k].sflag[m] != 1) {
61 
62  if(pdata[i].stn[k].frain[m].qual!=2) {
63 
64  pdata[i].stn[k].frain[m].data=
65  pdata[i].stn[k].rain[m].data;
66  pdata[i].stn[k].frain[m].qual=
67  pdata[i].stn[k].rain[m].qual;
68 
69  }
70 
71  if(pdata[i].stn[k].frain[m].data >= 0)
72  number_found[m]++;
73 
74  }
75 
76  else {
77 
78  pdata[i].stn[k].frain[m].data=
79  pdata[i].stn[k].srain[m].data;
80  pdata[i].stn[k].frain[m].qual=8;
81 
82 
83  if(pdata[i].stn[k].frain[m].data >= 0)
84  number_found[m]++;
85 
86  }
87 
88 
89 
90  }
91 
92  }
93 
94 
95  for(j=0;j<5;j++) {
96 
97  if(number_found[j] == 0)
98  pdata[i].used[j]=0;
99 
100  }
101 
102 
103  post_bad_values(i);
104 
105  return(rier);
106 
107  }
108 
109  for(k=0;k<5;k++)
110  pdata[i].used[k]=1;
111 
112 
113  pdata[i].level=2;
114 
115 /* initialize structure */
116 
117  for(;;) {
118 
119  bad:
120  p=fgets(kbuf,100,fr);
121  if(p==NULL)
122  break;
123 
124  if(kbuf[0]==':')
125  continue;
126 
127  if(kbuf[0]=='.' && kbuf[1]=='E')
128  type=1;
129 
130  if(kbuf[0]=='.' && kbuf[1]=='A')
131  type=0;
132 
133  ier=sscanf(&kbuf[3],"%s %s %s",hb5,datbuf,parmbuf);
134  if(ier==0)
135  continue;
136 
137  p=strchr(parmbuf,'/');
138  if(p==NULL)
139  continue;
140 
141  pc=*(p+5);
142  for(j=0;j<max_stations;j++) {
143 
144  if(strcmp(hb5,station[j].hb5)==0 &&
145  pc==station[j].parm[4]) {
146 
147  break;
148 
149  }
150 
151  }
152 
153  if(j==max_stations) {
154 
155  continue;
156 
157  }
158 
159  if(type==0) {
160 
161  p=strchr(kbuf,'/');
162  if(p==NULL)
163  continue;
164 
165  q=strchr(p,' ');
166  if(p==NULL)
167  continue;
168 
169  maxk=5;
170  startk=4;
171 
172  }
173 
174  else if(type==1) {
175 
176  q=kbuf;
177  for(k=0;k<3;k++) {
178 
179  p=strchr(q,'/');
180  if(p==NULL)
181  break;
182 
183  q=p+1;
184 
185  }
186 
187  if(k!=3)
188  continue; /* missing */
189 
190  maxk=4;
191  startk=0;
192 
193  }
194 
195  for(k=startk;k<maxk;k++) {
196 
197  pdata[i].stn[j].frain[k].qual=0;
198 
199  if((p=strchr(q,'/'))==NULL &&
200  (p=strchr(q,'\n'))==NULL)
201  goto bad;
202 
203  *p=0;
204 
205  strcpy(buf,q);
206 
207  if((p=strchr(buf,'.'))==NULL) {
208 
209  if(pdata[i].stn[j].rain[k].data >= 0)
210  reset_flag=1;
211 
212  else {
213 
214  pdata[i].stn[j].frain[k].data=-1;
215 
216  pdata[i].stn[j].frain[k].qual=-1;
217 
218 
219  }
220 
221  }
222 
223 
224 
225  else {
226 
227 
228  number_found[k]++;
229 
230  pdata[i].stn[j].frain[k].data=atof(buf);
231 
232  r=p+3;
233  qual=8;
234  while(*r != 0) {
235 
236  if(*r != ' '){
237 
238  if(*r=='S')
239  qual=0;
240 
241  else if(*r=='F')
242  qual=1;
243 
244  else if(*r=='W')
245  qual=2;
246 
247  else if(*r=='Q')
248  qual=3;
249 
250  else if(*r=='D')
251  qual=4;
252 
253  else if(*r=='V')
254  qual=8;
255 
256  else if(*r=='E')
257  qual=5;
258 
259  else if(*r=='L')
260  qual=6;
261 
262  else if(*r=='A') {
263 
264  pdata[i].stn[j].sflag[k]=1;
265  qual=8;
266 
267  }
268 
269  else if(*r=='B'){
270 
271  pdata[i].stn[j].sflag[k]=1;
272  qual=0;
273 
274  }
275 
276  else if(*r=='C') {
277 
278  pdata[i].stn[j].sflag[k]=1;
279  qual=3;
280 
281  }
282 
283  pdata[i].stn[j].frain[k].qual=qual;
284 
285  if((qual==5 || qual==4) &&
286  pdata[i].stn[j].rain[k].data >= 0) {
287 
288  ier=is_bad(i,k,station[j].hb5,
289  station[j].parm);
290 
291  if(ier==0) {
292 
293  printf("new data overwriting missing %s %s %f\n",
294  station[j].hb5,station[j].parm,pdata[i].stn[j].rain[k].data);
295 
296  rier=-2;
297  reset_flag=1;
298 
299  }
300 
301  }
302 
303 
304 
305  if(pdata[i].stn[j].sflag[k] != 1) {
306 
307  if((qual!=5 && qual != 4 && qual != 2)
308  && pdata[i].stn[j].rain[k].data >= 0
309  && pdata[i].stn[j].rain[k].data !=
310  pdata[i].stn[j].frain[k].data) {
311 
312  printf("new data overwriting old %s %s %f\n",
313  station[j].hb5,station[j].parm,pdata[i].stn[j].rain[k].data);
314 
315  rier=-2;
316  reset_flag=1;
317 
318  }
319 
320  if(qual!=5 && qual != 6 && qual != 4 &&
321  qual != 2
322  && pdata[i].stn[j].rain[k].data < 0
323  && pdata[i].stn[j].frain[k].data >=0) {
324 
325  printf("data set bad level 1 overwriting level 2 %s %s %f\n",
326  station[j].hb5,station[j].parm,pdata[i].stn[j].rain[k].data);
327 
328  rier=-2;
329  reset_flag=1;
330 
331  }
332 
333 
334  }
335 
336 
337  else {
338 
339  if(qual!=5
340  && pdata[i].stn[j].srain[k].data >= 0
341  && pdata[i].stn[j].srain[k].data !=
342  pdata[i].stn[j].frain[k].data) {
343 
344  printf("new data overwriting old %s %s %f\n",
345  station[j].hb5,station[j].parm,pdata[i].stn[j].rain[k].data);
346 
347  rier=-2;
348  reset_flag=1;
349 
350  }
351 
352  if(qual!=5 && qual != 6
353  && pdata[i].stn[j].srain[k].data < 0
354  && pdata[i].stn[j].frain[k].data >=0) {
355 
356  printf("data set bad level 1 overwriting level 2 %s %s %f\n",
357  station[j].hb5,station[j].parm,pdata[i].stn[j].rain[k].data);
358 
359  rier=-2;
360  reset_flag=1;
361 
362  }
363 
364 
365  }
366 
367  break;
368 
369  }
370 
371  else
372  r++;
373 
374  }
375 
376 
377  }
378 
379  p=strchr(q,0);
380  q=p+1;
381 
382  }
383 
384  }
385 
386 
387 if(reset_flag==1)
388  goto reset;
389 
390 fclose(fr);
391 
392 /* check if new data not avbl on level 2 comes in on level 1 */
393 
394 for(k=0;k<5;k++) {
395 
396 for(j=0;j<max_stations;j++) {
397 
398  if(pdata[i].stn[j].rain[k].data >= 0 &&
399  pdata[i].stn[j].frain[k].data < 0) {
400 
401  printf("new level 1 data %s %d\n",station[j].hb5,m);
402  goto reset;
403 
404  }
405 
406  }
407 
408  }
409 
410 
411 /* check for new data overwriting bad data */
412 
413 for(m=0;m<5;m++) {
414 
415  if(number_found[m]==0)
416  pdata[i].used[m]=0;
417 
418  ier=get_bad_values(i,m);
419  if(ier==1) {
420 
421  printf("new data overwriting old bad data\n");
422  goto reset;
423 
424  }
425 
426 }
427 
428  return(1);
429 
430 }
431 
432 
433 
434 
435 
436 
437 
438 
439 
440 
441 
442 
443 
444 
445 
446 
447 
448 
449 
450 
451 
452 
453 
int get_bad_values(int iday, int iquart)
Definition: bad_values.c:78
int max_stations
Definition: daily_qc.c:199
void post_bad_values(int iday)
Definition: bad_values.c:325
int is_bad(int iday, int iquart, char *hb5, char *parm)
Definition: bad_values.c:294
char t
Definition: build_list.c:122
char type[5]
Definition: daily_qc.c:98
char qual[10]
Definition: display_data.c:29
fr
Definition: jnk.c:17
printf("pcp %d\n", pcp_in_use[103])
int read_precip_b(char *fname, time_t tget, int i)
Definition: read_precip_b.c:4
Definition: misc.h:397
Definition: misc.h:216
time_t data_time
Definition: misc.h:218
int ztime
Definition: misc_new.h:427
int used[5]
Definition: misc.h:219
struct stn stn[1500]
Definition: misc.h:222
int level
Definition: misc.h:221
Definition: misc.h:191
float data
Definition: misc.h:193
short int qual
Definition: misc.h:194
Definition: misc.h:232
float lat
Definition: misc.h:239
float lon
Definition: misc.h:240
char parm[10]
Definition: misc.h:237
char hb5[10]
Definition: misc.h:235
Definition: misc.h:200
struct rain rain[5]
Definition: misc.h:202
struct rain frain[5]
Definition: misc.h:203
short int * sflag
Definition: misc_new.h:385
struct rain * srain
Definition: misc_new.h:386