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