19 {
20
21 FILE *out;
22
24
25 const int ai_low_nu1 = 341, ai_low_nu2 = 499, ai_high_nu1 =
26 40, ai_high_nu2 = 698, ai_old_nu1 = 295, ai_old_nu2 = 499, ci_nu =
27 36, si_low_nu1 = 326, si_low_nu2 = 260, si_high_nu1 = 328, si_high_nu2 =
28 282, si_old_nu1 = 318, si_old_nu2 = 260, si_oper_nu1 = 359, si_oper_nu2 =
29 244;
30
31
32 if (argc < 4)
33 ERRMSG(
"Give parameters: <ctl> <out.tab> <l1b_file1> [<l1b_file2> ...]");
34
35
36 const int apo = (int)
scan_ctl(argc, argv,
"APO", -1,
"0", NULL);
37
38
39 printf("Write volcanic emission data: %s\n", argv[2]);
40 if (!(out = fopen(argv[2], "w")))
41 ERRMSG(
"Cannot create file!");
42
43
44 for (int iarg = 3; iarg < argc; iarg++) {
45
46
48 continue;
49
50
51 if (iarg == 3) {
52 fprintf(out,
53 "# $1 = time [s]\n"
54 "# $2 = footprint longitude [deg]\n"
55 "# $3 = footprint latitude [deg]\n"
56 "# $4 = satellite altitude [km]\n"
57 "# $5 = satellite longitude [deg]\n"
58 "# $6 = satellite latitude [deg]\n");
59 fprintf(out,
60 "# $7 = cloud index, BT(%.4f/cm) [K]\n"
61 "# $8 = cloud index error [K]\n"
62 "# $9 = ash index (low wavenumbers),"
63 " BT(%.4f/cm) - BT(%.4f/cm) [K]\n"
64 "# $10 = ash index (low wavenumbers) error [K]\n"
65 "# $11 = ash index (high wavenumbers),"
66 " BT(%.4f/cm) - BT(%.4f/cm) [K]\n"
67 "# $12 = ash index (high wavenumbers) error [K]\n"
68 "# $13 = ash index (Hoffmann et al., 2014),"
69 " BT(%.4f/cm) - BT(%.4f/cm) [K]\n"
70 "# $14 = ash index (Hoffmann et al., 2014) error [K]\n",
75 fprintf(out,
76 "# $15 = SO2 index (low concentrations),"
77 " BT(%.4f/cm) - BT(%.4f/cm) [K]\n"
78 "# $16 = SO2 index (low concentrations) error [K]\n"
79 "# $17 = SO2 index (high concentrations),"
80 " BT(%.4f/cm) - BT(%.4f/cm) [K]\n"
81 "# $18 = SO2 index (high concentrations) error [K]\n"
82 "# $19 = SO2 index (operational),"
83 " BT(%.4f/cm) - BT(%.4f/cm) [K]\n"
84 "# $20 = SO2 index (operational) error [K]\n"
85 "# $21 = SO2 index (Hoffmann et al., 2014),"
86 " BT(%.4f/cm) - BT(%.4f/cm) [K]\n"
87 "# $22 = SO2 index (Hoffmann et al., 2014) error [K]\n\n",
92 }
93
94
95 for (
int track = 0; track <
L1_NTRACK; track++)
96 for (
int xtrack = 0; xtrack <
L1_NXTRACK; xtrack++)
97 for (
int ifov = 0; ifov <
L1_NFOV; ifov++) {
98
99
100 double ci =
BRIGHT(l1.
rad_mw[track][xtrack][ifov][ci_nu] * 0.001,
102 double ci_err =
104 l1.
nedn_mw[ifov][ci_nu] * 0.001,
106
107
108 double ai_low_bt1 =
110 0.001, l1.
nu_lw[ai_low_nu1]);
111 double ai_low_bt2 =
113 0.001, l1.
nu_lw[ai_low_nu2]);
114 double ai_low = ai_low_bt1 - ai_low_bt2;
115 double ai_low_err =
116 sqrt(gsl_pow_2
118 (l1.
rad_lw[track][xtrack][ifov][ai_low_nu1] * 0.001,
119 l1.
nedn_lw[ifov][ai_low_nu1] * 0.001,
120 l1.
nu_lw[ai_low_nu1]))
121 +
123 (l1.
rad_lw[track][xtrack][ifov][ai_low_nu2] *
124 0.001, l1.
nedn_lw[ifov][ai_low_nu2] * 0.001,
125 l1.
nu_lw[ai_low_nu2])));
126
127
128 double ai_high_bt1 =
130 0.001, l1.
nu_mw[ai_high_nu1]);
131 double ai_high_bt2 =
133 0.001, l1.
nu_lw[ai_high_nu2]);
134 double ai_high = ai_high_bt1 - ai_high_bt2;
135 double ai_high_err =
136 sqrt(gsl_pow_2
138 (l1.
rad_mw[track][xtrack][ifov][ai_high_nu1] * 0.001,
139 l1.
nedn_mw[ifov][ai_high_nu1] * 0.001,
140 l1.
nu_mw[ai_high_nu1]))
141 +
143 (l1.
rad_lw[track][xtrack][ifov][ai_high_nu2] *
144 0.001, l1.
nedn_lw[ifov][ai_high_nu2] * 0.001,
145 l1.
nu_lw[ai_high_nu1])));
146
147
148 double ai_old_bt1 =
150 0.001, l1.
nu_lw[ai_old_nu1]);
151 double ai_old_bt2 =
153 0.001, l1.
nu_lw[ai_old_nu2]);
154 double ai_old = ai_old_bt1 - ai_old_bt2;
155 double ai_old_err =
156 sqrt(gsl_pow_2
158 (l1.
rad_lw[track][xtrack][ifov][ai_old_nu1] * 0.001,
159 l1.
nedn_lw[ifov][ai_old_nu1] * 0.001,
160 l1.
nu_lw[ai_old_nu1]))
161 +
163 (l1.
rad_lw[track][xtrack][ifov][ai_old_nu2] *
164 0.001, l1.
nedn_lw[ifov][ai_old_nu2] * 0.001,
165 l1.
nu_lw[ai_old_nu2])));
166
167
168 double si_low_bt1 =
170 0.001, l1.
nu_mw[si_low_nu1]);
171 double si_low_bt2 =
173 0.001, l1.
nu_mw[si_low_nu2]);
174 double si_low = si_low_bt1 - si_low_bt2;
175 double si_low_err =
176 sqrt(gsl_pow_2
178 (l1.
rad_mw[track][xtrack][ifov][si_low_nu1] * 0.001,
179 l1.
nedn_mw[ifov][si_low_nu1] * 0.001,
180 l1.
nu_mw[si_low_nu1]))
181 +
183 (l1.
rad_mw[track][xtrack][ifov][si_low_nu2] *
184 0.001, l1.
nedn_mw[ifov][si_low_nu2] * 0.001,
185 l1.
nu_mw[si_low_nu2])));
186
187
188 double si_high_bt1 =
190 0.001, l1.
nu_mw[si_high_nu1]);
191 double si_high_bt2 =
193 0.001, l1.
nu_mw[si_high_nu2]);
194 double si_high = si_high_bt1 - si_high_bt2;
195 double si_high_err =
196 sqrt(gsl_pow_2
198 (l1.
rad_mw[track][xtrack][ifov][si_high_nu1] * 0.001,
199 l1.
nedn_mw[ifov][si_high_nu1] * 0.001,
200 l1.
nu_mw[si_high_nu1]))
201 +
203 (l1.
rad_mw[track][xtrack][ifov][si_high_nu2] *
204 0.001, l1.
nedn_mw[ifov][si_high_nu2] * 0.001,
205 l1.
nu_mw[si_high_nu2])));
206
207
208 double si_oper_bt1 =
210 0.001, l1.
nu_mw[si_oper_nu1]);
211 double si_oper_bt2 =
213 0.001, l1.
nu_mw[si_oper_nu2]);
214 double si_oper = si_oper_bt1 - si_oper_bt2;
215 double si_oper_err =
216 sqrt(gsl_pow_2
218 (l1.
rad_mw[track][xtrack][ifov][si_oper_nu1] * 0.001,
219 l1.
nedn_mw[ifov][si_oper_nu1] * 0.001,
220 l1.
nu_mw[si_oper_nu1]))
221 +
223 (l1.
rad_mw[track][xtrack][ifov][si_oper_nu2] *
224 0.001, l1.
nedn_mw[ifov][si_oper_nu2] * 0.001,
225 l1.
nu_mw[si_oper_nu2])));
226
227
228 double si_old_bt1 =
230 0.001, l1.
nu_mw[si_old_nu1]);
231 double si_old_bt2 =
233 0.001, l1.
nu_mw[si_old_nu2]);
234 double si_old = si_old_bt1 - si_old_bt2;
235 double si_old_err =
236 sqrt(gsl_pow_2
238 (l1.
rad_mw[track][xtrack][ifov][si_old_nu1] * 0.001,
239 l1.
nedn_mw[ifov][si_old_nu1] * 0.001,
240 l1.
nu_mw[si_old_nu1]))
241 +
243 (l1.
rad_mw[track][xtrack][ifov][si_old_nu2] *
244 0.001, l1.
nedn_mw[ifov][si_old_nu2] * 0.001,
245 l1.
nu_mw[si_old_nu2])));
246
247
248 fprintf(out,
249 "%.2f %.4f %.4f %.3f %.4f %.4f %.2f %.2f %.2f %.2f %.2f %.2f "
250 "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n",
251 l1.
time[track][xtrack] - 220838400,
252 l1.
lon[track][xtrack][ifov],
253 l1.
lat[track][xtrack][ifov],
257 ci, ci_err, ai_low, ai_low_err, ai_high, ai_high_err,
258 ai_old, ai_old_err, si_low, si_low_err, si_high,
259 si_high_err, si_oper, si_oper_err, si_old, si_old_err);
260 }
261 }
262
263
264 fclose(out);
265
266 return EXIT_SUCCESS;
267}
double scan_ctl(int argc, char *argv[], const char *varname, int arridx, const char *defvalue, char *value)
Search control parameter file for variable entry.
#define ERRMSG(...)
Print error message and quit program.
int read_cris_l1(char *filename, cris_l1_t *l1, int apo)
Read CrIS Level-1 data.
#define L1_NXTRACK
Across-track size of CrIS radiance granule.
#define L1_NTRACK
Along-track size of CrIS radiance granule.
#define L1_NFOV
Number of field of views of CrIS radiance granule.
double sat_z[L1_NTRACK]
Satellite altitude [km].
float rad_mw[L1_NTRACK][L1_NXTRACK][L1_NFOV][L1_NCHAN_MW]
Midwave radiance [W/(m^2 sr cm^-1)].
float nedn_mw[L1_NFOV][L1_NCHAN_MW]
Midwave radiance noise [W/(m^2 sr cm^-1)].
double nu_mw[L1_NCHAN_MW]
Midwave channel frequencies [cm^-1].
float nedn_lw[L1_NFOV][L1_NCHAN_LW]
Longwave radiance noise [W/(m^2 sr cm^-1)].
double lon[L1_NTRACK][L1_NXTRACK][L1_NFOV]
Footprint longitude [deg].
float rad_lw[L1_NTRACK][L1_NXTRACK][L1_NFOV][L1_NCHAN_LW]
Longwave radiance [W/(m^2 sr cm^-1)].
double sat_lat[L1_NTRACK]
Satellite latitude [deg].
double time[L1_NTRACK][L1_NXTRACK]
Time (seconds since 2000-01-01T00:00Z).
double sat_lon[L1_NTRACK]
Satellite longitude [deg].
double nu_lw[L1_NCHAN_LW]
Longwave channel frequencies [cm^-1].
double lat[L1_NTRACK][L1_NXTRACK][L1_NFOV]
Footprint latitude [deg].
double get_noise(double rad, double nesr, double nu)