Daily_QC
get_frzlvl_data.c
Go to the documentation of this file.
1 #include "prototypes_new.h"
2 
3 int maxi,maxj;
4 float latitude[50][50],longitude[50][50],frzlvl[50][50],top[50][50];
5 void get_elev(float,float,float *, float *);
6 
7 
8 void get_frzlvl_data(int ii)
9 
10 {
11 
12 extern struct pdata pdata[10];
13 extern struct station station[3000];
14 extern int max_stations;
15 extern char freezing_level_directory[100];
16 FILE *fp;
17 char ibuf[150],*sname[3],*p;
18 float tval[50][50],val[50];
19 int j,k,m,iflag,ier;
20 char hb5[10],parm[10];
21 int tip,elev;
22 float lat,lon;
23 float conv;
24 char fbuf[50],savebuf[50];
25 time_t tget;
26 struct tm *gmtim;
27 int i;
28 float temp,felev,diff,tempo;
29 float lapse=3.3;
30 
31 for(k=0;k<max_stations;k++) {
32 
33  for(m=0;m<5;m++)
34  pdata[ii].stn[k].frzlvl[m]=-99;
35 
36  }
37 
38 conv=360/(2*3.14159);
39 
40 sname[0]="latitude";
41 sname[1]="longitude";
42 sname[2]="topo";
43 
44 for(m=0;m<3;m++) {
45 
46  strcpy(fbuf,freezing_level_directory);
47  strcat(fbuf,"/");
48  strcat(fbuf,sname[m]);
49  fp=fopen(fbuf,"r");
50 
51  if(fp==NULL) {
52 
53  printf("could not open %s\n",fbuf);
54  return;
55 
56  }
57 
58  j=-1;
59  iflag=0;
60  maxi=0;
61  maxj=0;
62 
63  for(;;) {
64 
65  p=fgets(ibuf,100,fp);
66 
67  if(p==NULL)
68  break;
69 
70  if(strstr(ibuf,"ROW ")!=NULL) {
71 
72  iflag=1;
73  p=p+8;
74  k=0;
75  j++;
76 
77  }
78 
79  if(iflag==1) {
80 
81 
82  ier=sscanf(p,"%f %f %f %f %f %f %f %f",
83  &val[0],&val[1],&val[2],&val[3],
84  &val[4],&val[5],&val[6],&val[7]);
85 
86  for(i=0;i<ier;i++) {
87 
88  tval[j][i+k]=val[i];
89 
90  if(m==0)
91  tval[j][i+k]=tval[j][i+k]*conv/100;
92 
93  if(m==1)
94  tval[j][i+k]=-tval[j][i+k]*conv/10;
95 
96  if(m==2)
97  tval[j][i+k]=tval[j][i+k];
98 
99  }
100 
101  k=k+ier;
102 
103  if(k > maxi)
104  maxi=k;
105 
106  }
107 
108  }
109 
110  maxj=j;
111 
112  if(m==0)
113  memcpy(latitude,tval,2500*sizeof(float));
114 
115  if(m==1)
116  memcpy(longitude,tval,2500*sizeof(float));
117 
118  if(m==2)
119  memcpy(top,tval,2500*sizeof(float));
120 
121  fclose(fp);
122 
123  }
124 
125 for(m=0;m<4;m++) {
126 
127 /* get correct date */
128 
129  tget=pdata[ii].data_time;
130 
131  if(m < 2)
132  tget=tget-86400;
133 
134  gmtim=gmtime(&tget);
135 
136  sprintf(fbuf,"%s/sfctemp.%02d-%02d-%02d.",
138  gmtim->tm_mon+1,gmtim->tm_mday,gmtim->tm_year);
139 
140  if(m==0)
141  strcat(fbuf,"15");
142 
143  else if(m==1)
144  strcat(fbuf,"21");
145 
146  else if(m==2)
147  strcat(fbuf,"03");
148 
149  else if(m==3)
150  strcat(fbuf,"09");
151 
152  fp=fopen(fbuf,"r");
153 
154  if(fp==NULL) {
155 
156  printf("%s not found\n",fbuf);
157 
158  continue;
159 
160  }
161 
162 
163  j=-1;
164  iflag=0;
165 
166  for(;;) {
167 
168  p=fgets(ibuf,100,fp);
169 
170  if(p==NULL)
171  break;
172 
173  if(strstr(ibuf,"ROW ")!=NULL) {
174 
175  iflag=1;
176  p=p+8;
177  k=0;
178  j++;
179 
180  }
181 
182  if(iflag==1) {
183 
184 
185  ier=sscanf(p,"%f %f %f %f %f %f %f %f",
186  &val[0],&val[1],&val[2],&val[3],
187  &val[4],&val[5],&val[6],&val[7]);
188 
189  for(i=0;i<ier;i++) {
190 
191  tval[j][i+k]=val[i];
192 
193  }
194 
195  k=k+ier;
196 
197  }
198 
199  }
200 
201  memcpy(frzlvl,tval,2500*sizeof(float));
202 
203  for(k=0;k<max_stations;k++) {
204 
205  if(station[k].tip==1)
206  continue;
207 
208  get_elev(station[k].lat,station[k].lon,&felev,&temp);
209 
210  diff=felev - station[k].elev;
211 
212  tempo=temp+diff*lapse/1000;
213  tempo= tempo* 9./5. + 32.;
214  pdata[ii].stn[k].frzlvl[m]=(int)tempo;
215 
216  }
217 
218  fclose(fp);
219 
220  }
221 
222 }
223 
224 void get_elev(float lat, float lon,float *felev, float *temp)
225 
226 {
227 
228 int i,j;
229 double pgon[4][2],point[2];
230 double distance,value;
231 int ii,jj;
232 double dist, dist1,dist2;
233 int flag,elev;
234 double value2,felev2;
235 
236 point[0]=lat;
237 point[1]=lon;
238 
239 for(j=0;j<maxj;j++) {
240 for(i=0;i<maxi;i++) {
241 
242  pgon[0][0]=latitude[j][i];
243  pgon[0][1]=longitude[j][i];
244  pgon[1][0]=latitude[j][i+1];
245  pgon[1][1]=longitude[j][i+1];
246  pgon[2][0]=latitude[j+1][i+1];
247  pgon[2][1]=longitude[j+1][i+1];
248  pgon[3][0]=latitude[j+1][i];
249  pgon[3][1]=longitude[j+1][i];
250 
251  flag=macmartintest(pgon,4,point);
252 
253  if(flag==1)
254  goto cont;
255 
256 
257 }
258 
259 }
260 
261 printf("not found\n");
262 return;
263 
264 cont:
265 
266 distance=0.0;
267 value=0.0;
268 value2=0.0;
269 
270 for(jj=j;jj<=j+1;jj++) {
271 
272 for(ii=i;ii<=i+1;ii++) {
273 
274  dist1=point[0]-latitude[jj][ii];
275  dist2=point[1]-longitude[jj][ii];
276 
277  dist=pow(dist1,2)+pow(dist2,2);
278 
279  if(dist==0.0)
280  dist=1.0;
281 
282  dist=1/dist;
283 
284  value=value+frzlvl[jj][ii]*dist;
285  value2=value2+top[jj][ii]*dist;
286 
287  distance=distance+dist;
288 
289  }
290  }
291 
292 *temp=value/distance;
293 *felev=value2/distance * 3.048;
294 
295 return;
296 
297 }
298 
299 
300 
301 
302 
303 
304 
305 
306 
307 
308 
309 
310 
311 
312 
313 
314 
315 
316 
317 
318 
319 
320 
int max_stations
Definition: daily_qc.c:199
float frzlvl[50][50]
float latitude[50][50]
int maxj
int maxi
void get_elev(float, float, float *, float *)
float longitude[50][50]
void get_frzlvl_data(int ii)
printf("pcp %d\n", pcp_in_use[103])
freezing_level_directory[100]
Definition: jnk.c:7
int macmartintest(double[500][2], int, double *)
Definition: misc.h:216
time_t data_time
Definition: misc.h:218
struct stn stn[1500]
Definition: misc.h:222
Definition: misc.h:232
float lat
Definition: misc.h:239
int tip
Definition: misc.h:242
float lon
Definition: misc.h:240
char parm[10]
Definition: misc.h:237
int elev
Definition: misc.h:241
char hb5[10]
Definition: misc.h:235
Definition: misc.h:200
int frzlvl[5]
Definition: misc.h:204
Definition: misc.h:436