Daily_QC
bad_values.c
Go to the documentation of this file.
1 
2 #include "prototypes_new.h"
3 
4 void read_bad_values(char *fname,int m)
5 
6 {
7 extern struct pdata pdata[10];
8 extern struct bad_daily_values bad_values[6000];
9 FILE *fp;
10 char bfile[100],hb5[10],pc[10],ibuf[100];
11 float fvalue;
12 int i,ier,iquart;
13 char *p;
14 
15 strcpy(bfile,fname);
16 
17 fp=fopen(bfile,"r");
18 
19 if(fp==NULL)
20  return;
21 
22 for(i=0;i<6000;i++) {
23 
24  if(bad_values[i].used==1)
25  continue;
26 
27  p=fgets(ibuf,80,fp);
28 
29  if(p==NULL)
30  break;
31 
32  ier=sscanf(ibuf,"%s %s %d %f",hb5,pc,&iquart,&fvalue);
33 
34  bad_values[i].used=1;
35  strcpy(bad_values[i].hb5,hb5);
36  strcpy(bad_values[i].parm,pc);
37  bad_values[i].day=m;
38  bad_values[i].quart=iquart;
40 
41  }
42 
43 fclose(fp);
44 
45 return;
46 
47 }
48 
49 void purge_bad_values(int iday)
50 
51 {
52 
53 extern struct bad_daily_values bad_values[6000];
54 int i,k;
55 
56 for(k=0;k<5;k++) {
57 
58 for(i=0;i<6000;i++) {
59 
60  if(bad_values[i].used==1 &&
61  bad_values[i].day==iday &&
62  bad_values[i].quart==k)
63  bad_values[i].used=0;
64 
65  }
66 
67 }
68 
69 return;
70 
71 }
72 
73 extern struct bad_daily_values bad_values[6000];
74 extern struct pdata pdata[10];
75 extern struct station station[3000];
76 extern int max_stations;
77 
78 int get_bad_values(int iday,int iquart)
79 
80 {
81 
82 int i,j,h;
83 
84 for(i=0;i<6000;i++) {
85 
86  if(bad_values[i].used==0)
87  continue;
88 
89  if(bad_values[i].day != iday ||
90  bad_values[i].quart != iquart)
91  continue;
92 
93  for(j=0;j<max_stations;j++) {
94 
95  if(strcmp(bad_values[i].hb5,station[j].hb5)==0 &&
96  bad_values[i].parm[4]==station[j].parm[4]) {
97 
98  if(pdata[iday].stn[j].frain[iquart].qual == 5 &&
99  bad_values[i].fvalue != pdata[iday].stn[j].rain[iquart].data &&
100  pdata[iday].stn[j].rain[iquart].data >= 0) {
101 
102  /* eliminate all bad values for current month */
103  for(h=0;h<6000;h++) {
104 
105  if(bad_values[i].used==0)
106  continue;
107 
108  if(bad_values[i].day != iday ||
109  bad_values[i].quart != iquart)
110  continue;
111 
112  bad_values[h].used=0;
113 
114  }
115 
116  /* swap in level 1 data */
117 
118  return(1);
119 
120  }
121 
122  else {
123 
124  pdata[iday].stn[j].frain[iquart].qual=1;
125  pdata[iday].stn[j].frain[iquart].data=bad_values[i].fvalue;
126 
127  }
128 
129  }
130 
131  }
132 
133  }
134 
135 return(0);
136 
137 }
138 
139 extern struct bad_daily_values bad_values[6000];
140 
141 void write_bad_values(char *fname,int iday)
142 
143 {
144 
145 FILE *fp;
146 char bfile[100],ibuf[100];
147 int i,ier;
148 
149 strcpy(bfile,fname);
150 
151 fp=fopen(bfile,"w");
152 
153 for(i=0;i<6000;i++) {
154 
155  if(bad_values[i].used==0)
156  continue;
157 
158  if(iday==bad_values[i].day) {
159 
160  if(bad_values[i].fvalue < 0) {
161 
162  printf("attempt to write value < 0\n");
163  continue;
164  }
165 
166 
167 
168  ier=sprintf(ibuf,"%s %s %d %f\n",bad_values[i].hb5,bad_values[i].parm,
170 
171  fputs(ibuf,fp);
172 
173  }
174 
175  }
176 
177 fclose(fp);
178 
179 return;
180 
181 }
182 
183 
184 extern struct bad_daily_values bad_values[6000];
185 
186 void update_bad_values(int iday)
187 
188 {
189 
190 int i,j,h,k;
191 
192 for(i=0;i<6000;i++) {
193 
194  if(bad_values[i].used==0)
195  continue;
196 
197  if(bad_values[i].day != iday)
198  continue;
199 
200  bad_values[i].used=0;
201 
202  }
203 
204 for(j=0;j<max_stations;j++) {
205 
206  for(k=0;k<5;k++) {
207 
208  if(pdata[iday].stn[j].frain[k].qual != 1)
209  continue;
210 
211  for(h=0;h<6000;h++) {
212 
213  if(bad_values[h].used!=0)
214  continue;
215 
216  bad_values[h].used=1;
217  /*
218  bad_values[h].fvalue=pdata[iday].stn[j].frain[k].data;
219  */
220 
221  bad_values[h].fvalue=pdata[iday].stn[j].rain[k].data;
222 
223  strcpy(bad_values[h].hb5,station[j].hb5);
224  strcpy(bad_values[h].parm,station[j].parm);
225  bad_values[h].day=iday;
226  bad_values[h].quart=k;
227 
228  break;
229 
230  }
231  }
232 
233  }
234 
235 return;
236 
237 }
238 
239 
240 extern struct bad_daily_values bad_values[6000];
241 
242 void restore_bad_values(int iday)
243 
244 {
245 
246 int i,j,h,k;
247 
248 for(k=0;k<5;k++) {
249 
250 for(i=0;i<6000;i++) {
251 
252  if(bad_values[i].used==0)
253  continue;
254 
255  if(bad_values[i].day != iday ||
256  bad_values[i].quart != k)
257  continue;
258 
259  for(j=0;j<max_stations;j++) {
260 
261  if(strcmp(bad_values[i].hb5,station[j].hb5)==0 &&
262  bad_values[i].parm[4]==station[j].parm[4]) {
263 
264  pdata[iday].stn[j].frain[k].data=bad_values[i].fvalue;
265  pdata[iday].stn[j].frain[k].qual=1;
266 
267  /* fix for 6 hourly bad but 24 hour good */
268 
269  if(k >=0 && k <=3 &&
270  pdata[iday].stn[j].rain[4].data >= 0) {
271 
272  printf("auto set bad\n");
273 
274  pdata[iday].stn[j].frain[4].qual=1;
275 
276  }
277 
278  break;
279 
280  }
281 
282  }
283  }
284 
285 
286 }
287 
288 return;
289 
290 }
291 
292 extern struct bad_daily_values bad_values[6000];
293 
294 int is_bad(int iday,int iquart,char *hb5,char *parm)
295 
296 {
297 
298 int i,j;
299 
300 for(i=0;i<6000;i++) {
301 
302  if(bad_values[i].used==0)
303  continue;
304 
305  if(bad_values[i].day != iday ||
306  bad_values[i].quart != iquart)
307  continue;
308 
309  for(j=0;j<max_stations;j++) {
310 
311  if(strcmp(bad_values[i].hb5,hb5)==0 &&
312  bad_values[i].parm[4]==parm[4])
313  return(1);
314 
315  }
316  }
317 
318 return(0);
319 
320 }
321 
322 
323 extern struct bad_daily_values bad_daily_values[6000];
324 
325 void post_bad_values(int iday)
326 
327 {
328 
329 int i,j,h,k;
330 
331 for(k=0;k<5;k++) {
332 
333 for(i=0;i<6000;i++) {
334 
335  if(bad_values[i].used==0)
336  continue;
337 
338  if(bad_values[i].day != iday ||
339  bad_values[i].quart != k)
340  continue;
341 
342  for(j=0;j<max_stations;j++) {
343 
344  if(strcmp(bad_values[i].hb5,station[j].hb5)==0 &&
345  bad_values[i].parm[4]==station[j].parm[4]) {
346 
347  if(pdata[iday].stn[j].frain[k].data==bad_values[i].fvalue){
348 
349  pdata[iday].stn[j].frain[k].data=
350  bad_values[i].fvalue;
351 
352  pdata[iday].stn[j].frain[k].qual=1;
353 
354  }
355 
356  break;
357 
358  }
359 
360  }
361  }
362 
363 }
364 return;
365 
366 }
367 
368 
369 
370 
371 
372 
373 
374 
375 
376 
void write_bad_values(char *fname, int iday)
Definition: bad_values.c:141
void purge_bad_values(int iday)
Definition: bad_values.c:49
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
void restore_bad_values(int iday)
Definition: bad_values.c:242
void read_bad_values(char *fname, int m)
Definition: bad_values.c:4
int is_bad(int iday, int iquart, char *hb5, char *parm)
Definition: bad_values.c:294
void update_bad_values(int iday)
Definition: bad_values.c:186
char qual[10]
Definition: display_data.c:29
int day
Definition: display_data.c:30
printf("pcp %d\n", pcp_in_use[103])
char parm[10]
Definition: misc.h:16
char hb5[10]
Definition: misc.h:15
float fvalue
Definition: misc.h:19
Definition: misc.h:2
float fvalue
Definition: misc.h:8
int used
Definition: misc.h:4
Definition: misc.h:216
struct stn stn[1500]
Definition: misc.h:222
Definition: misc.h:191
float data
Definition: misc.h:193
short int qual
Definition: misc.h:194
Definition: misc.h:232
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