Daily_QC
bu.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 isohyets_used;
10 extern struct pdata pdata[10];
11 extern struct station station[3000];
12 extern int max_stations;
13 extern int method;
14 int m,k,i,l,maxl,h;
15 double lat1,lon1,fdist,fdata,lat,lon,testdist[3000],isoh,padj[3000],fvalu,fstd,fdif,distlon;
16 int good,ogood;
17 float conv=.0174;
18 float valdif,isoh1;
19 int ii;
20 float pcnt;
21 
22 for(k=4;k>=0;k--) {
23 
24  if(pdata[j].used[k]==0)
25  continue;
26 
27  ogood=0;
28  again:
29  good=0;
30 
31  for(m=0;m<max_stations;m++) {
32 
33  lat1=station[m].lat;
34  lon1=station[m].lon;
35 
36  /*get isohyet */
37 
38  if(isohyets_used != 0)
39  isoh1=station[m].isoh[isom];
40 
41  /* if data is missing dont quality control */
42 
43  if(pdata[j].stn[m].frain[k].data < 0)
44  continue;
45 
46  l=0;
47  for(ii=0;ii<30;ii++){
48 
49  i=station[m].index[ii];
50 
51  /* only use good or forced good gages to estimate others */
52 
53  if(pdata[j].stn[i].frain[k].qual != 0 &&
54  pdata[j].stn[i].frain[k].qual != 8 &&
55  pdata[j].stn[i].frain[k].qual != 6 &&
56  pdata[j].stn[i].frain[k].qual != 3 &&
57  pdata[j].stn[i].frain[k].qual != 4)
58  continue;
59 
60  if(pdata[j].stn[i].frain[k].data < 0)
61  continue;
62 
63  lat=station[i].lat;
64  lon=station[i].lon;
65 
66  if(isohyets_used != 0)
67  isoh=station[i].isoh[isom];
68 
69  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
70 
71  testdist[l]= pow((double)(lat1-lat),2) +
72  pow((double)(distlon),2);
73 
74  if(testdist[l]==0.0)
75  testdist[l]=.000001;
76 
77  if(method==2 && isoh > 0 && isoh1 > 0)
78  padj[l]=pdata[j].stn[i].frain[k].data*isoh1/isoh;
79 
80  else
81  padj[l]=pdata[j].stn[i].frain[k].data;
82 
83  l++;
84 
85  }
86 
87  if(l < 5) {
88 
89  for(i=0;i<max_stations;i++){
90 
91  if(i==m)
92  continue;
93 
94  /* only use good or forced good gages to estimate others */
95 
96  if(pdata[j].stn[i].frain[k].qual != 0 &&
97  pdata[j].stn[i].frain[k].qual != 8 &&
98  pdata[j].stn[i].frain[k].qual != 6 &&
99  pdata[j].stn[i].frain[k].qual != 3 &&
100  pdata[j].stn[i].frain[k].qual != 4)
101  continue;
102 
103  if(pdata[j].stn[i].frain[k].data < 0)
104  continue;
105 
106  lat=station[i].lat;
107  lon=station[i].lon;
108 
109  if(isohyets_used != 0)
110  isoh=station[i].isoh[isom];
111 
112  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
113 
114  testdist[l]= pow((double)(lat1-lat),2) +
115  pow((double)(distlon),2);
116 
117  if(testdist[l]==0.0)
118  testdist[l]=.000001;
119 
120  if(method==2 && isoh > 0 && isoh1 > 0)
121  padj[l]=pdata[j].stn[i].frain[k].data*isoh1/isoh;
122 
123  else
124  padj[l]=pdata[j].stn[i].frain[k].data;
125 
126  l++;
127  }
128 
129  }
130 
131  /* get weighted mean */
132 
133  maxl=l;
134 
135  fdata=0;
136  fdist=0;
137 
138  for(l=0;l<maxl;l++) {
139 
140  fdata=fdata + padj[l]/testdist[l];
141  fdist=fdist + 1/testdist[l];
142 
143  }
144 
145  /* fvalu is estimated number */
146 
147  if(maxl==0)
148  fdist=1;
149 
150  fvalu=fdata/fdist;
151 
152  pdata[j].stn[m].frain[k].estimate=fvalu;
153 
154  fstd=0.0;
155 
156  for(l=0;l<maxl;l++) {
157 
158  fstd=fstd + fabs(padj[l]-fvalu)/testdist[l];
159 
160  }
161 
162  fstd=fstd/fdist;
163 
164  /* if estimated data 0 */
165 
166  if(fstd==0.0 &&
167  (pdata[j].stn[m].frain[k].qual == 0 ||
168  pdata[j].stn[m].frain[k].qual == 1 ||
169  pdata[j].stn[m].frain[k].qual == 5 ||
170  pdata[j].stn[m].frain[k].qual == 6 ||
171  pdata[j].stn[m].frain[k].qual == 4 ||
172  pdata[j].stn[m].frain[k].qual == 2)) {
173 
174  pdata[j].stn[m].frain[k].stddev=-9999;
175  continue;
176 
177  }
178 
179  else if(fstd==0.0 && pdata[j].stn[m].frain[k].data <= .1) {
180 
181  pdata[j].stn[m].frain[k].stddev=0;
182  pdata[j].stn[m].frain[k].qual=8;
183 
184  good++;
185 
186  continue;
187 
188  }
189 
190  else if(fstd==0.0){
191 
192  pdata[j].stn[m].frain[k].stddev=-9999;
193 
194  pdata[j].stn[m].frain[k].qual=3;
195 
196  if(k==4) {
197 
198  for(h=0;h<4;h++)
199 
200  if( pdata[j].stn[m].frain[h].qual != 6)
201  pdata[j].stn[m].frain[h].qual=3;
202 
203  }
204 
205  continue;
206 
207  }
208 
209  /* perhaps change this to be more robust */
210 
211  if(fstd < .05)
212  fstd=.05;
213 
214  else if(fstd > .20)
215  fstd=.20;
216 
217  fdif= fabs(pdata[j].stn[m].frain[k].data-fvalu);
218  fdif=fdif/fstd;
219 
220  valdif=fabs(pdata[j].stn[m].frain[k].data-fvalu);
221 
222  /* standard deviation check */
223  /* check only if difference between actual and estimated > .1 */
224 
225  pdata[j].stn[m].frain[k].estimate=fvalu;
226  pdata[j].stn[m].frain[k].stddev=fdif;
227 
228  if(pdata[j].stn[m].frain[k].qual == 0 ||
229  pdata[j].stn[m].frain[k].qual == 1 ||
230  pdata[j].stn[m].frain[k].qual == 5 ||
231  pdata[j].stn[m].frain[k].qual == 6 ||
232  pdata[j].stn[m].frain[k].qual == 4 ||
233  pdata[j].stn[m].frain[k].qual == 2)
234  continue;
235 
236 
237 
238  if(fdif > pdata[j].stddev && valdif > .10) {
239 
240 
241 
242  pdata[j].stn[m].frain[k].qual=3;
243 /*
244  if(k==4) {
245 
246  for(h=0;h<4;h++)
247  pdata[j].stn[m].frain[h].qual=3;
248 
249  }
250 */
251  }
252 
253  else {
254 
255  good++;
256  if(pdata[j].stn[m].frain[k].qual==3)
257  pdata[j].stn[m].frain[k].qual=8;
258 
259  }
260 
261  }
262 
263  if(good > ogood){
264 
265  ogood=good;
266 
267  goto again;
268 
269  }
270 
271 
272  }
273 
274 }
275 
int max_stations
Definition: daily_qc.c:199
void quality_control_stations(int j)
Definition: bu.c:4
float stddev
Definition: daily_qc.c:273
int isohyets_used
Definition: daily_qc.c:192
struct isoh * isoh
Definition: daily_qc.c:287
int isom
Definition: daily_qc.c:141
int method
Definition: daily_qc.c:254
char qual[10]
Definition: display_data.c:29
Definition: misc_new.h:84
Definition: misc.h:465
Definition: misc.h:216
struct stn stn[1500]
Definition: misc.h:222
float data
Definition: misc.h:193
short int qual
Definition: misc.h:194
float estimate
Definition: misc.h:195
float stddev
Definition: misc.h:196
Definition: misc.h:232
float lat
Definition: misc.h:239
float isoh
Definition: misc.h:234
float lon
Definition: misc.h:240
short int index[30]
Definition: misc.h:238
Definition: misc.h:200
struct rain frain[5]
Definition: misc.h:203