Daily_QC
quality_control_tstations.c
Go to the documentation of this file.
1 
2 #include "prototypes_new.h"
3 
5 
6 {
7 
8 extern int isom;
9 extern int maxmin_used;
10 extern struct tdata tdata[10];
11 extern struct station tstation[1000];
12 extern int max_tstations;
13 int m,k,i,l,maxl,h;
14 double lat1,lon1,fdist,fdata,lat,lon,fvalu,distlon;
15 int good,ogood;
16 float conv=.0174;
17 int ii;
18 float dist,df,temp,fdif;
19 float a,b;
20 
21 for(k=4;k < 6;k++) {
22 
23  if(tdata[j].used[k]==0)
24  continue;
25 
26  ogood=0;
27  again:
28  good=0;
29 
30  for(m=0;m<max_tstations;m++) {
31 
32  if(tstation[m].elev <= 0)
33  continue;
34 
35  lat1=tstation[m].lat;
36  lon1=tstation[m].lon;
37 
38  if((k==4 && tstation[m].max[isom] <= -99) ||
39  (k==5 && tstation[m].min[isom] <= -99))
40  continue;
41 
42  if(tdata[j].stn[m].tlevel2[k].data == -99)
43  continue;
44 
45  fdist=0.0;
46  fdata=0.0;
47  l=0;
48 
49  for(ii=0;ii<20;ii++){
50 
51  i=tstation[m].index[ii];
52 
53  /* only use good or forced good gages to estimate others */
54 
55  if(tdata[j].stn[i].tlevel2[k].qual != 0 &&
56  tdata[j].stn[i].tlevel2[k].qual != 8 &&
57  tdata[j].stn[i].tlevel2[k].qual != 6 &&
58  tdata[j].stn[i].tlevel2[k].qual != 3 &&
59  tdata[j].stn[i].tlevel2[k].qual != 2)
60  continue;
61 
62  if(tdata[j].stn[i].tlevel2[k].data == -99)
63  continue;
64 
65  if((k==4 && tstation[i].max[isom] <= -99) ||
66  (k==5 && tstation[i].min[isom] <= -99))
67  continue;
68 
69  if(tstation[i].elev <= 0)
70  continue;
71 
72  lat=tstation[i].lat;
73  lon=tstation[i].lon;
74 
75  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
76 
77  dist= pow((double)(lat1-lat),2) +
78  pow((double)(distlon),2);
79 
80  dist=pow(dist,.5)*60;
81 
82  if(dist==0.0)
83  dist=.0001;
84 
85  df=50*abs(tstation[m].elev-tstation[i].elev)/5280;
86 
87  dist=dist+df;
88 
89  if(dist==0.0)
90  dist=.000001;
91 
92  dist=1/dist;
93 
94  if(k==4)
95  temp=(tdata[j].stn[i].tlevel2[k].data+
96  (tstation[m].max[isom]-tstation[i].max[isom]))*dist;
97 
98  if(k==5)
99  temp=(tdata[j].stn[i].tlevel2[k].data+
100  (tstation[m].min[isom]-tstation[i].min[isom]))*dist;
101 
102  l++;
103 
104 
105  fdata=fdata+temp;
106 
107  fdist=fdist+dist;
108 
109  if(l==5)
110  break;
111 
112  }
113 
114  if(l < 5) {
115 
116  fdist=0.0;
117  fdata=0.0;
118  l=0;
119 
120  for(i=0;i<max_tstations;i++){
121 
122  if(i==m)
123  continue;
124 
125  /* only use good or forced good gages to estimate others */
126 
127  if(tdata[j].stn[i].tlevel2[k].qual != 0 &&
128  tdata[j].stn[i].tlevel2[k].qual != 8 &&
129  tdata[j].stn[i].tlevel2[k].qual != 6 &&
130  tdata[j].stn[i].tlevel2[k].qual != 3 &&
131  tdata[j].stn[i].tlevel2[k].qual != 2)
132  continue;
133 
134  if(tdata[j].stn[i].tlevel2[k].data == -99)
135  continue;
136 
137  if((k==4 && tstation[i].max[isom] <= -99) ||
138  (k==5 && tstation[i].min[isom] <= -99))
139  continue;
140 
141  if(tstation[i].elev <= 0)
142  continue;
143 
144  lat=tstation[i].lat;
145  lon=tstation[i].lon;
146 
147  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
148 
149  dist= pow((double)(lat1-lat),2) +
150  pow((double)(distlon),2);
151 
152  dist=pow(dist,.5)*60;
153 
154  if(dist==0.0)
155  dist=.0001;
156 
157  df=50*abs(tstation[m].elev-tstation[i].elev)/5280;
158 
159  dist=dist+df;
160 
161  if(dist==0.0)
162  dist=.000001;
163 
164  dist=1/dist;
165 
166  if(k==4)
167  temp=(tdata[j].stn[i].tlevel2[k].data+
168  (tstation[m].max[isom]-tstation[i].max[isom]))*dist;
169 
170  if(k==5)
171  temp=(tdata[j].stn[i].tlevel2[k].data+
172  (tstation[m].min[isom]-tstation[i].min[isom]))*dist;
173 
174  fdata=fdata+temp;
175 
176  fdist=fdist+dist;
177 
178  l++;
179 
180 
181  }
182 
183  }
184 
185  if(l==0)
186  fdist=1;
187 
188  fvalu=fdata/fdist;
189 
190  tdata[j].stn[m].tlevel2[k].estimate=(short int)fvalu;
191 
192  fdif=fabs(tdata[j].stn[m].tlevel2[k].data-fvalu);
193 
194  tdata[j].stn[m].tlevel2[k].estimate=fvalu;
195 
196  if(tdata[j].stn[m].tlevel2[k].qual == 0 ||
197  tdata[j].stn[m].tlevel2[k].qual == 1 ||
198  tdata[j].stn[m].tlevel2[k].qual == 5 ||
199  tdata[j].stn[m].tlevel2[k].qual == 6 ||
200  tdata[j].stn[m].tlevel2[k].qual == 2)
201  continue;
202 
203  if(fdif > tdata[j].stddev)
204  tdata[j].stn[m].tlevel2[k].qual=3;
205 
206  else {
207 
208  good++;
209  if(tdata[j].stn[m].tlevel2[k].qual==3)
210  tdata[j].stn[m].tlevel2[k].qual=8;
211 
212  }
213 
214 
215  }
216 
217  if(good > ogood){
218 
219  ogood=good;
220 
221  goto again;
222 
223  }
224 
225 
226 }
227 
228 for(k=0;k<4;k++) {
229 
230  if(tdata[j].used[k]==0)
231  continue;
232  ogood=0;
233  again6:
234  good=0;
235 
236  for(m=0;m<max_tstations;m++) {
237 
238  if(tstation[m].elev <= 0)
239  continue;
240 
241  lat1=tstation[m].lat;
242  lon1=tstation[m].lon;
243 
244  if((tstation[m].max[isom] <= -99) ||
245  (tstation[m].min[isom] <= -99))
246  continue;
247 
248  if(tdata[j].stn[m].tlevel2[k].data==-99)
249  continue;
250 
251  if(tdata[j].stn[m].tlevel2[4].data == -99 ||
252  tdata[j].stn[m].tlevel2[5].data == -99)
253  continue;
254 
255  if(tdata[j].stn[m].tlevel2[4].qual==1 ||
256  tdata[j].stn[m].tlevel2[5].qual==1)
257  continue;
258 
259  fdist=0.0;
260  fdata=0.0;
261  l=0;
262 
263  for(ii=0;ii<20;ii++){
264 
265  i=tstation[m].index[ii];
266 
267  /* dont estimate unless good or forced good */
268 
269  if(tdata[j].stn[i].tlevel2[k].qual!=0 &&
270  tdata[j].stn[i].tlevel2[k].qual!=8 &&
271  tdata[j].stn[i].tlevel2[k].qual!=6 &&
272  tdata[j].stn[i].tlevel2[k].qual!=3 &&
273  tdata[j].stn[i].tlevel2[k].qual!=2)
274  continue;
275 
276  /*dont use missing tstations */
277 
278  if(tdata[j].stn[i].tlevel2[k].data ==-99 ||
279  tdata[j].stn[i].tlevel2[k].a < -98 )
280  continue;
281 
282  if(tstation[i].elev <= 0)
283  continue;
284 
285  lat=tstation[i].lat;
286  lon=tstation[i].lon;
287 
288  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
289 
290  dist= pow((double)(lat1-lat),2) +
291  pow((double)distlon,2);
292 
293  dist=pow(dist,.5)*60;
294 
295  if(dist==0.0)
296  dist=.0001;
297 
298  df=50*abs(tstation[m].elev-tstation[i].elev)/5280;
299 
300  dist=dist+df;
301 
302  dist=1/dist;
303 
304  temp=tdata[j].stn[i].tlevel2[k].a*dist;
305 
306  fdata=fdata+temp;
307 
308  fdist=fdist+dist;
309 
310  l++;
311 
312  if(l==5)
313  break;
314 
315  }
316 
317 
318  if(l < 5) {
319 
320  fdist=0.0;
321  fdata=0.0;
322  l=0;
323 
324  for(i=0;i<max_tstations;i++){
325 
326  if(i==m)
327  continue;
328 
329  if(tdata[j].stn[i].tlevel2[k].qual!=0 &&
330  tdata[j].stn[i].tlevel2[k].qual!=8 &&
331  tdata[j].stn[i].tlevel2[k].qual!=6 &&
332  tdata[j].stn[i].tlevel2[k].qual!=3 &&
333  tdata[j].stn[i].tlevel2[k].qual!=2)
334  continue;
335 
336  /*dont use missing tstations */
337 
338  if(tdata[j].stn[i].tlevel2[k].data ==-99 ||
339  tdata[j].stn[i].tlevel2[k].a < -98)
340  continue;
341 
342  if(tstation[i].elev <= 0)
343  continue;
344 
345  lat=tstation[i].lat;
346  lon=tstation[i].lon;
347 
348  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
349 
350  dist= pow((double)(lat1-lat),2) +
351  pow((double)distlon,2);
352 
353  if(dist==0.0)
354  dist=.0001;
355 
356  df=50*abs(tstation[m].elev-tstation[i].elev)/5280;
357 
358  dist=dist+df;
359 
360  dist=1/dist;
361 
362  temp=tdata[j].stn[i].tlevel2[k].a*dist;
363 
364  fdata=fdata+temp;
365 
366  fdist=fdist+dist;
367 
368  l++;
369 
370  }
371 
372  }
373  if(l==0)
374  fdist=1;
375 
376  a=fdata/fdist;
377 
378  b=a*(float)(tdata[j].stn[m].tlevel2[4].data -
379  tdata[j].stn[m].tlevel2[5].data)+
380  (float)tdata[j].stn[m].tlevel2[5].data;
381 
382  tdata[j].stn[m].tlevel2[k].estimate=(short int)b;
383 
384  fdif=fabs(tdata[j].stn[m].tlevel2[k].data-b);
385 
386  if(tdata[j].stn[m].tlevel2[k].qual == 0 ||
387  tdata[j].stn[m].tlevel2[k].qual == 1 ||
388  tdata[j].stn[m].tlevel2[k].qual == 5 ||
389  tdata[j].stn[m].tlevel2[k].qual == 6 ||
390  tdata[j].stn[m].tlevel2[k].qual == 2)
391  continue;
392 
393  if(fdif > tdata[j].stddev)
394  tdata[j].stn[m].tlevel2[k].qual=3;
395 
396  else {
397 
398  good++;
399  if(tdata[j].stn[m].tlevel2[k].qual==3)
400  tdata[j].stn[m].tlevel2[k].qual=8;
401 
402  }
403 
404 
405  }
406 
407  if(good > ogood){
408 
409  ogood=good;
410 
411  goto again6;
412 
413  }
414 
415 
416 }
417 
418 }
419 
struct station tstation[1000]
Definition: daily_qc.c:197
int max_tstations
Definition: daily_qc.c:46
float stddev
Definition: daily_qc.c:273
int isom
Definition: daily_qc.c:141
int maxmin_used
Definition: daily_qc.c:17
char qual[10]
Definition: display_data.c:29
void quality_control_tstations(int j)
static double b
Definition: rat.c:142
static int max
Definition: rat.c:141
Definition: misc_new.h:84
Definition: misc.h:232
float lat
Definition: misc.h:239
float lon
Definition: misc.h:240
float * min
Definition: misc_new.h:466
short int index[30]
Definition: misc.h:238
float * max
Definition: misc_new.h:465
int elev
Definition: misc.h:241
Definition: misc.h:200
struct ttn stn[1000]
Definition: misc_new.h:452
float a
Definition: misc_new.h:404
short int estimate
Definition: misc_new.h:402
char qual
Definition: misc_new.h:401
short int data
Definition: misc_new.h:400
struct tlevel * tlevel2
Definition: misc_new.h:411