Daily_QC
estimate_daily_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,k,i,l,ii;
13 double lat1,lon1,fdist,fdata,fvalue[4],lat,lon,testdist,fmult,ftotal,isoh,isoh1,padj,stotal;
14 int num_missing;
15 double distlon,dist,df;
16 float conv=.0174;
17 int h;
18 
19 if(tdata[j].data_time==0)
20  return;
21 
22 for(m=0;m<max_tstations;m++) {
23 
24  /* dont estimate missing 24 hour tstations */
25 
26  for(h=0;h<4;h++)
27  tdata[j].stn[m].tlevel2[h].a=-99;
28 
29  for(h=0;h<6;h++)
30  if(tdata[j].stn[m].tlevel2[h].data == -99 ||
31  (tdata[j].stn[m].tlevel2[h].qual!=0 &&
32  tdata[j].stn[m].tlevel2[h].qual!=8 &&
33  tdata[j].stn[m].tlevel2[h].qual!=3 &&
34  tdata[j].stn[m].tlevel2[h].qual!=2))
35  break;
36 
37  if(h!=6)
38  continue;
39 
40  for(h=0;h<4;h++) {
41 
42  tdata[j].stn[m].tlevel2[h].a=
43  (float)(tdata[j].stn[m].tlevel2[h].data-tdata[j].stn[m].tlevel2[5].data)/
44  (float)(tdata[j].stn[m].tlevel2[4].data-tdata[j].stn[m].tlevel2[5].data);
45 
46 
47  }
48 
49  }
50 
51 for(m=0;m<max_tstations;m++) {
52 
53  for(k=0;k<4;k++)
54  if(tdata[j].stn[m].tlevel2[k].data != -99 &&
55  tdata[j].stn[m].tlevel2[k].qual != 6)
56  break;
57 
58  if(k != 4)
59  continue;
60 
61  for(k=0;k<4;k++)
62  tdata[j].stn[m].tlevel2[k].data = -99;
63 
64  if(tdata[j].stn[m].tlevel2[4].data == -99 ||
65  tdata[j].stn[m].tlevel2[5].data == -99)
66  continue;
67 
68  if(tdata[j].stn[m].tlevel2[4].qual==1 ||
69  tdata[j].stn[m].tlevel2[4].qual==5 ||
70  tdata[j].stn[m].tlevel2[5].qual==1 ||
71  tdata[j].stn[m].tlevel2[5].qual==5)
72  continue;
73 
74  lat1=tstation[m].lat;
75  lon1=tstation[m].lon;
76 
77  /*get isohyet */
78 
79  for(k=0;k<4;k++) {
80 
81  fdist=0.0;
82  fdata=0.0;
83 
84  l=0;
85 
86  for(ii=0;ii<20;ii++){
87 
88  i=tstation[m].index[ii];
89 
90  /* dont estimate unless good or forced good */
91 
92  if(tdata[j].stn[i].tlevel2[k].qual!=0 &&
93  tdata[j].stn[i].tlevel2[k].qual!=8 &&
94  tdata[j].stn[i].tlevel2[k].qual!=3 &&
95  tdata[j].stn[i].tlevel2[k].qual!=2)
96  continue;
97 
98  /*dont use missing tstations */
99 
100  if(tdata[j].stn[i].tlevel2[k].data ==-99 ||
101  tdata[j].stn[i].tlevel2[k].a < -98)
102  continue;
103 
104  lat=tstation[i].lat;
105  lon=tstation[i].lon;
106 
107  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
108 
109  dist= pow((double)(lat1-lat),2) +
110  pow((double)(distlon),2);
111 
112  dist=pow(dist,.5)*60;
113 
114  df=50*abs(tstation[m].elev-tstation[i].elev)/5280;
115 
116  dist=dist+df;
117 
118  if(dist==0.0)
119  dist=.000001;
120  dist=1/dist;
121 
122  fdata=fdata+tdata[j].stn[i].tlevel2[k].a*dist;
123  fdist=fdist+dist;
124 
125  l++;
126 
127  if(l==5)
128  break;
129 
130  }
131 
132 
133  if(l < 5) {
134 
135  fdist=0.0;
136  fdata=0.0;
137 
138  l=0;
139 
140  for(i=0;i<max_tstations;i++){
141 
142  if(i==m)
143  continue;
144 
145  if(tdata[j].stn[i].tlevel2[k].qual!=0 &&
146  tdata[j].stn[i].tlevel2[k].qual!=8 &&
147  tdata[j].stn[i].tlevel2[k].qual!=3 &&
148  tdata[j].stn[i].tlevel2[k].qual!=2)
149  continue;
150 
151  if(tdata[j].stn[i].tlevel2[k].data == -99 ||
152  tdata[j].stn[i].tlevel2[k].a < -98)
153  continue;
154 
155  lat=tstation[i].lat;
156  lon=tstation[i].lon;
157 
158  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
159 
160  dist= pow((double)(lat1-lat),2) +
161  pow((double)(distlon),2);
162 
163  dist=pow(dist,.5)*60;
164 
165  df=50*abs(tstation[m].elev-tstation[i].elev)/5280;
166 
167  dist=dist+df;
168 
169  if(dist==0.0)
170  dist=.000001;
171 
172  dist=1/dist;
173 
174  fdata=fdata+tdata[j].stn[i].tlevel2[k].a*dist;
175  fdist=fdist+dist;
176 
177  l++;
178 
179  }
180 
181  }
182 
183  if(l != 0){
184 
185  tdata[j].stn[m].tlevel2[k].a=fdata/fdist;
186  tdata[j].stn[m].tlevel2[k].data=tdata[j].stn[m].tlevel2[k].a*
187  (tdata[j].stn[m].tlevel2[4].data-tdata[j].stn[m].tlevel2[5].data) +
188  tdata[j].stn[m].tlevel2[5].data;
189  tdata[j].stn[m].tlevel2[k].qual=6;
190 
191  }
192 
193 
194 
195  }
196 
197 
198 }
199 }
200 
struct station tstation[1000]
Definition: daily_qc.c:197
int max_tstations
Definition: daily_qc.c:46
struct isoh * isoh
Definition: daily_qc.c:287
int isom
Definition: daily_qc.c:141
char qual[10]
Definition: display_data.c:29
void estimate_daily_tstations(int j)
Definition: misc_new.h:84
Definition: misc.h:232
float lat
Definition: misc.h:239
float lon
Definition: misc.h:240
short int index[30]
Definition: misc.h:238
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