Daily_QC
estimate_daily_stations.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,ii;
15 double lat1,lon1,fdist,fdata,fvalue[4],lat,lon,testdist,fmult,ftotal,isoh,isoh1,padj,stotal;
16 int num_missing;
17 
18 if(pdata[j].data_time==0)
19  return;
20 
21 /* this routine will estimate 6 hourly periods when 24 hour rain exists */
22 
23 for(m=0;m<max_stations;m++) {
24 
25  /* dont estimate missing 24 hour stations */
26 
27  if(pdata[j].stn[m].frain[4].data < 0 ||
28  pdata[j].stn[m].frain[4].qual==4)
29  continue;
30 
31 
32  /* search for a missing 6 hourly period */
33 
34  for(k=0;k<4;k++) {
35 
36  if(pdata[j].stn[m].frain[k].data >= 0
37  && pdata[j].stn[m].frain[k].qual==2)
38  continue;
39 
40  if(pdata[j].stn[m].frain[k].qual==1)
41  break;
42 
43  if(pdata[j].stn[m].rain[k].data < 0)
44  break;
45 
46  }
47 
48  if(k==4)
49  continue;
50 
51  /* dont estimate stations forced good, bad or estimated */
52 
53  if(pdata[j].stn[m].frain[4].qual==1 ||
54  pdata[j].stn[m].frain[4].qual==5)
55  continue;
56 
57  /* at least one missing 6 hourly period found */
58 
59  lat1=station[m].lat;
60  lon1=station[m].lon;
61 
62  /*get isohyet */
63 
64  if(isohyets_used!=0)
65  isoh1=station[m].isoh[isom];
66 
67  /* first */ for(k=0;k<4;k++) {
68 
69  fdist=0.0;
70  fdata=0.0;
71 
72  l=0;
73 
74  for(ii=0;ii<30;ii++){
75 
76  i=station[m].index[ii];
77 
78  /* dont estimate unless good or forced good */
79 
80  if(pdata[j].stn[i].frain[k].qual!=0 &&
81  pdata[j].stn[i].frain[k].qual!=8 &&
82  pdata[j].stn[i].frain[k].qual!=3 &&
83  pdata[j].stn[i].frain[k].qual!=2)
84  continue;
85 
86  /*dont use missing stations */
87 
88  if(pdata[j].stn[i].frain[k].data < 0)
89  continue;
90 
91  lat=station[i].lat;
92  lon=station[i].lon;
93 
94  if(isohyets_used != 0)
95  isoh=station[i].isoh[isom];
96 
97  testdist= pow((double)(lat1-lat),2) +
98  pow((double)(lon1-lon),2);
99 
100  if(testdist==0.0)
101  testdist=.000001;
102 
103  if(method==2 && isoh > 0 && isoh1 > 0)
104  padj=pdata[j].stn[i].frain[k].data*isoh1/isoh;
105 
106  else
107  padj=pdata[j].stn[i].frain[k].data;
108 
109  fdist=1/testdist+fdist;
110  fdata=padj/testdist + fdata;
111  l++;
112 
113 
114 
115  }
116 
117 
118  if(l < 5) {
119 
120  fdist=0.0;
121  fdata=0.0;
122 
123  l=0;
124 
125  for(i=0;i<max_stations;i++){
126 
127  if(i==m)
128  continue;
129 
130  if(pdata[j].stn[i].frain[k].qual!=0 &&
131  pdata[j].stn[i].frain[k].qual!=8 &&
132  pdata[j].stn[i].frain[k].qual!=3 &&
133  pdata[j].stn[i].frain[k].qual!=2)
134  continue;
135 
136 
137 
138  if(pdata[j].stn[i].frain[k].data < 0)
139  continue;
140 
141  lat=station[i].lat;
142  lon=station[i].lon;
143 
144  if(isohyets_used != 0)
145  isoh=station[i].isoh[isom];
146 
147  testdist= pow((double)(lat1-lat),2) +
148  pow((double)(lon1-lon),2);
149 
150  if(testdist==0.0)
151  testdist=.0001;
152 
153  if(method==2 && isoh > 0 && isoh1 > 0)
154  padj=pdata[j].stn[i].frain[k].data*isoh1/isoh;
155 
156  else
157  padj=pdata[j].stn[i].frain[k].data;
158 
159  fdist=1/testdist+fdist;
160  fdata=padj/testdist + fdata;
161  l++;
162  }
163 
164  }
165 
166  if(l != 0)
167  fvalue[k]=fdata/fdist;
168 
169  else
170  fvalue[k]=-9999;
171 
172  }
173 
174 
175  if(fvalue[0]==-9999 ||
176  fvalue[1]==-9999 ||
177  fvalue[2]==-9999 ||
178  fvalue[3]==-9999) {
179 
180  for(k=0;k<4;k++) {
181 
182  pdata[j].stn[m].frain[k].qual=6;
183  pdata[j].stn[m].frain[k].data=pdata[j].stn[m].frain[4].data/4;
184 
185  }
186 
187  continue;
188 
189  }
190 
191 
192  ftotal=0.0;
193  stotal=0.0;
194  num_missing=0;
195 
196  for(k=0;k<4;k++) {
197 
198  if(pdata[j].stn[m].rain[k].data >= 0 &&
199  pdata[j].stn[m].frain[k].qual!=1)
200  stotal=stotal+pdata[j].stn[m].frain[k].data;
201 
202  else {
203 
204  num_missing++;
205 
206  ftotal=ftotal+fvalue[k];
207 
208  }
209 
210  }
211 
212  stotal=pdata[j].stn[m].frain[4].data-stotal;
213 
214  if(stotal < 0)
215  stotal=0;
216 
217  if(ftotal==0.0)
218  fmult=0;
219 
220  else
221  fmult=stotal/ftotal;
222 
223  for(k=0;k<4;k++) {
224 
225  if(pdata[j].stn[m].rain[k].data >= 0 &&
226  pdata[j].stn[m].frain[k].qual!=1)
227  continue;
228 
229  if(ftotal != 0) {
230 
231  pdata[j].stn[m].frain[k].data=fvalue[k]*fmult;
232  pdata[j].stn[m].frain[k].qual=6;
233 
234 
235  }
236 
237  else {
238 
239  pdata[j].stn[m].frain[k].data=stotal/(float)num_missing;
240  pdata[j].stn[m].frain[k].qual=6;
241 
242  }
243 
244 
245 
246 }
247 
248 
249 }
250 }
251 
int max_stations
Definition: daily_qc.c:199
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
void estimate_daily_stations(int j)
Definition: misc_new.h:84
Definition: misc.h:465
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
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