Daily_QC
get_zlevel.c
Go to the documentation of this file.
1 
2 #include "prototypes_new.h"
3 
4 void get_zlevel(int j)
5 
6 {
7 
8 extern struct pdata pdata[10];
9 extern struct zdata zdata[10];
10 extern struct station station[3000];
11 extern struct station zstation[500];
12 extern int max_stations;
13 extern int max_zstations;
14 int m,i,h,l,ii;
15 double lat1,lon1,fdist,fdata,fvalue,lat,lon,testdist,padj,distlon;
16 float conv=.0174;
17 int h1,h2,j1,j2;
18 
19 if(max_zstations==0){
20 
21  for(m=0;m<max_stations;m++) {
22 
23  for(h=0;h<4;h++) {
24 
25  pdata[j].stn[m].frzlvl[h]=-99;
26 
27  }
28  }
29 
30  return;
31 
32  }
33 
34 for(m=0;m<max_stations;m++) {
35 
36  /* only estimate missing data */
37 
38  for(h=0;h<4;h++) {
39 
40  if(h==3) {
41 
42  if(j==0) {
43 
44 
45  j1=j;
46  j2=j;
47 
48  h1=h;
49  h2=h;
50 
51 
52  }
53 
54  else {
55 
56 
57  j1=j;
58  j2=j-1;
59 
60  h1=h;
61  h2=0;
62 
63 
64  }
65 
66 
67  }
68 
69  else {
70 
71  j1=j;
72  j2=j;
73 
74  h1=h;
75  h2=h+1;
76 
77  }
78 
79  lat1=station[m].lat;
80  lon1=station[m].lon;
81 
82  fdist=0.0;
83  fdata=0.0;
84  l=0;
85 
86  for(ii=0;ii<5;ii++){
87 
88  i=station[m].zindex[ii];
89 
90  /* dont estimate unless good or forced good */
91 
92  if(zdata[j1].stn[i].zlevel2[h1].qual!=0 &&
93  zdata[j1].stn[i].zlevel2[h1].qual!=8 &&
94  zdata[j1].stn[i].zlevel2[h1].qual!=3 &&
95  zdata[j2].stn[i].zlevel2[h2].qual!=0 &&
96  zdata[j2].stn[i].zlevel2[h2].qual!=8 &&
97  zdata[j2].stn[i].zlevel2[h2].qual!=3)
98  continue;
99 
100  /*dont use missing stations */
101 
102  if(zdata[j1].stn[i].zlevel2[h1].data < 0 ||
103  zdata[j2].stn[i].zlevel2[h2].data < 0)
104  continue;
105 
106  lat=zstation[i].lat;
107  lon=zstation[i].lon;
108 
109  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
110 
111  testdist= pow((double)(lat1-lat),2) +
112  pow((double)distlon,2);
113 
114  if(testdist==0.0)
115  testdist=.0001;
116 
117  padj=(zdata[j1].stn[i].zlevel2[h1].data+
118  zdata[j2].stn[i].zlevel2[h2].data)/2;
119 
120  fdist=1/testdist+fdist;
121  fdata=padj/testdist + fdata;
122 
123  l++;
124 
125  }
126 
127 
128  if(l < 5) {
129 
130  fdist=0.0;
131  fdata=0.0;
132  l=0;
133 
134  for(i=0;i<max_zstations;i++){
135 
136  if(zdata[j1].stn[i].zlevel2[h1].qual!=0 &&
137  zdata[j1].stn[i].zlevel2[h1].qual!=8 &&
138  zdata[j1].stn[i].zlevel2[h1].qual!=3 &&
139  zdata[j2].stn[i].zlevel2[h2].qual!=0 &&
140  zdata[j2].stn[i].zlevel2[h2].qual!=8 &&
141  zdata[j2].stn[i].zlevel2[h2].qual!=3)
142  continue;
143 
144  /*dont use missing stations */
145 
146  if(zdata[j1].stn[i].zlevel2[h1].data < 0 ||
147  zdata[j2].stn[i].zlevel2[h2].data < 0)
148  continue;
149 
150  lat=zstation[i].lat;
151  lon=zstation[i].lon;
152 
153  distlon=(lon1-lon)*cos((lat1+lat)/2*conv);
154 
155  testdist= pow((double)(lat1-lat),2) +
156  pow((double)distlon,2);
157 
158  if(testdist==0.0)
159  testdist=.0001;
160 
161  padj=(zdata[j1].stn[i].zlevel2[h1].data+
162  zdata[j2].stn[i].zlevel2[h2].data)/2;
163 
164  fdist=1/testdist+fdist;
165  fdata=padj/testdist + fdata;
166 
167  l++;
168 
169  }
170 
171  }
172 
173  if(l==0)
174  fvalue=-99;
175 
176 
177  else
178  fvalue=fdata/fdist*1000;
179 
180  pdata[j].stn[m].frzlvl[h]=(int)fvalue;
181 
182 
183 
184  }
185 
186 
187 }
188 
189 }
190 
int max_stations
Definition: daily_qc.c:199
struct station zstation[500]
Definition: daily_qc.c:196
int max_zstations
Definition: daily_qc.c:45
char qual[10]
Definition: display_data.c:29
void get_zlevel(int j)
Definition: get_zlevel.c:4
Definition: misc_new.h:84
Definition: misc.h:216
struct stn stn[1500]
Definition: misc.h:222
Definition: misc.h:232
float lat
Definition: misc.h:239
float lon
Definition: misc.h:240
short int * zindex
Definition: misc_new.h:473
Definition: misc.h:200
int frzlvl[5]
Definition: misc.h:204
struct ztn stn[500]
Definition: misc_new.h:442
float data
Definition: misc_new.h:357
struct zlevel * zlevel2
Definition: misc_new.h:394