58 {
59
61
62 static pert_t *pert_4mu, *pert_15mu_low, *pert_15mu_high;
63
65
66 static double numean, radmean, var_dh = 100.;
67
68 static int list_4mu[
N4]
69 = { 6711, 6712, 6713, 6714, 6715, 6716, 6717, 6718, 6719, 6720,
70 6721, 6722, 6723, 6724, 6725, 6726, 6727, 6728, 6729, 6730, 6731,
71 6732, 6733, 6734, 6735, 6736, 6737, 6738, 6739, 6740, 6741, 6742,
72 6743, 6744, 6745, 6746, 6747, 6748, 6749, 6750, 6751, 6752, 6753,
73 6754, 6755, 6756, 6757, 6758, 6759, 6760, 6761, 6762, 6763, 6764,
74 6765, 6766, 6767, 6768, 6769, 6770, 6771, 6772, 6773, 6774, 6775,
75 6776, 6777, 6778, 6779, 6780, 6781, 6782, 6783, 6784, 6785, 6786,
76 6787, 6788, 6789, 6790, 6791, 6792, 6793, 6794, 6795, 6796, 6797,
77 6798, 6799, 6800, 6801, 6802, 6803, 6804, 6830, 6831, 6832, 6833,
78 6834, 6835, 6836, 6837, 6838, 6839, 6840, 6841, 6842, 6843, 6844,
79 6845, 6846, 6847, 6848, 6849, 6850, 6851, 6852, 6853, 6854, 6855,
80 6856, 6857, 6858, 6859, 6860, 6861, 6862, 6863, 6864, 6865, 6866,
81 6867, 6868, 6869, 6870, 6871, 6872, 6873, 6874, 6875, 6876, 6877,
82 6878, 6879, 6880, 6881, 6882, 6883, 6884, 6885, 6886, 6887
83 };
84
85 static int list_15mu_low[
N15_LOW]
86 = { 22, 28, 34, 40, 46, 52, 58, 72, 100, 105, 112, 118, 119,
87 124, 125, 130, 131, 136, 137, 143, 144
88 };
89
91 = { 91, 92 };
92
93 static int ix, iy, dimid[2], i, n, ncid, track, track0, xtrack,
94 time_varid, lon_varid, lat_varid, bt_4mu_varid, bt_4mu_pt_varid,
95 bt_4mu_var_varid, bt_8mu_varid, bt_15mu_low_varid, bt_15mu_low_pt_varid,
96 bt_15mu_low_var_varid, bt_15mu_high_varid, bt_15mu_high_pt_varid,
97 bt_15mu_high_var_varid, iarg, format;
98
99 static size_t start[2], count[2];
100
101
102 if (argc < 4)
103 ERRMSG("Give parameters: <ctl> <out.nc> <l1b_file1> [<l1b_file2> ...]");
104
105
106 format = (int) scan_ctl(argc, argv, "FORMAT", -1, "1", NULL);
107
108
110 ALLOC(pert_4mu,
pert_t, 1);
111 ALLOC(pert_15mu_low,
pert_t, 1);
112 ALLOC(pert_15mu_high,
pert_t, 1);
113
114
115
116
117
118
119 for (iarg = 3; iarg < argc; iarg++) {
120
121
122 printf("Read IASI Level-1C data file: %s\n", argv[iarg]);
124
125
128 ERRMSG("Too many granules!");
131 ERRMSG("Too many tracks!");
132 for (track = 0; track < iasi_rad->
ntrack; track++)
133 for (xtrack = 0; xtrack <
L1_NXTRACK; xtrack++) {
134 pert_4mu->
time[track0 + track][xtrack]
135 = iasi_rad->
Time[track][xtrack];
136 pert_4mu->
lon[track0 + track][xtrack]
138 pert_4mu->
lat[track0 + track][xtrack]
139 = iasi_rad->
Latitude[track][xtrack];
140 }
141
144 ERRMSG("Too many granules!");
147 ERRMSG("Too many tracks!");
148 for (track = 0; track < iasi_rad->
ntrack; track++)
149 for (xtrack = 0; xtrack <
L1_NXTRACK; xtrack++) {
150 pert_15mu_low->
time[track0 + track][xtrack]
151 = iasi_rad->
Time[track][xtrack];
152 pert_15mu_low->
lon[track0 + track][xtrack]
154 pert_15mu_low->
lat[track0 + track][xtrack]
155 = iasi_rad->
Latitude[track][xtrack];
156 }
157
160 ERRMSG("Too many granules!");
163 ERRMSG("Too many tracks!");
164 for (track = 0; track < iasi_rad->
ntrack; track++)
165 for (xtrack = 0; xtrack <
L1_NXTRACK; xtrack++) {
166 pert_15mu_high->
time[track0 + track][xtrack]
167 = iasi_rad->
Time[track][xtrack];
168 pert_15mu_high->
lon[track0 + track][xtrack]
170 pert_15mu_high->
lat[track0 + track][xtrack]
171 = iasi_rad->
Latitude[track][xtrack];
172 }
173
174
175 for (track = 0; track < iasi_rad->
ntrack; track++)
176 for (xtrack = 0; xtrack <
L1_NXTRACK; xtrack++)
177 pert_4mu->
dc[track0 + track][xtrack]
178 = BRIGHT(iasi_rad->
Rad[track][xtrack][2345], iasi_rad->
freq[2345]);
179
180
181 for (track = 0; track < iasi_rad->
ntrack; track++)
182 for (xtrack = 0; xtrack <
L1_NXTRACK; xtrack++) {
183 n = 0;
184 numean = radmean = 0;
185 for (i = 0; i <
N4; i++)
186 if (gsl_finite(iasi_rad->
Rad[track][xtrack][list_4mu[i]])) {
187 radmean += iasi_rad->
Rad[track][xtrack][list_4mu[i]];
188 numean += iasi_rad->
freq[list_4mu[i]];
189 n++;
190 }
192 pert_4mu->
bt[track0 + track][xtrack]
193 = BRIGHT(radmean / n, numean / n);
194 else
195 pert_4mu->
bt[track0 + track][xtrack] = GSL_NAN;
196 }
197
198
199 for (track = 0; track < iasi_rad->
ntrack; track++)
200 for (xtrack = 0; xtrack <
L1_NXTRACK; xtrack++) {
201 n = 0;
202 numean = radmean = 0;
204 if (gsl_finite(iasi_rad->
Rad[track][xtrack][list_15mu_low[i]])) {
205 radmean += iasi_rad->
Rad[track][xtrack][list_15mu_low[i]];
206 numean += iasi_rad->
freq[list_15mu_low[i]];
207 n++;
208 }
210 pert_15mu_low->
bt[track0 + track][xtrack]
211 = BRIGHT(radmean / n, numean / n);
212 else
213 pert_15mu_low->
bt[track0 + track][xtrack] = GSL_NAN;
214 }
215
216
217 for (track = 0; track < iasi_rad->
ntrack; track++)
218 for (xtrack = 0; xtrack <
L1_NXTRACK; xtrack++) {
219 n = 0;
220 numean = radmean = 0;
222 if (gsl_finite(iasi_rad->
Rad[track][xtrack][list_15mu_high[i]])) {
223 radmean += iasi_rad->
Rad[track][xtrack][list_15mu_high[i]];
224 numean += iasi_rad->
freq[list_15mu_high[i]];
225 n++;
226 }
228 pert_15mu_high->
bt[track0 + track][xtrack]
229 = BRIGHT(radmean / n, numean / n);
230 else
231 pert_15mu_high->
bt[track0 + track][xtrack] = GSL_NAN;
232 }
233
234
235 track0 += iasi_rad->
ntrack;
236 }
237
238
239
240
241
242
245
246
248
249
251
252
253 for (ix = 0; ix < wave.
nx; ix++)
254 for (iy = 0; iy < wave.
ny; iy++) {
255 pert_4mu->
pt[iy][ix] = wave.
pt[ix][iy];
256 pert_4mu->
var[iy][ix] = wave.
var[ix][iy];
257 }
258
259
261 0, pert_15mu_low->
ntrack - 1, 0, pert_15mu_low->
nxtrack - 1);
262
263
265
266
268
269
270 for (ix = 0; ix < wave.
nx; ix++)
271 for (iy = 0; iy < wave.
ny; iy++) {
272 pert_15mu_low->
pt[iy][ix] = wave.
pt[ix][iy];
273 pert_15mu_low->
var[iy][ix] = wave.
var[ix][iy];
274 }
275
276
278 0, pert_15mu_high->
ntrack - 1, 0, pert_15mu_high->
nxtrack - 1);
279
280
282
283
285
286
287 for (ix = 0; ix < wave.
nx; ix++)
288 for (iy = 0; iy < wave.
ny; iy++) {
289 pert_15mu_high->
pt[iy][ix] = wave.
pt[ix][iy];
290 pert_15mu_high->
var[iy][ix] = wave.
var[ix][iy];
291 }
292
293
294
295
296
297
298 printf("Write perturbation data file: %s\n", argv[2]);
299 NC(nc_create(argv[2], NC_CLOBBER, &ncid));
300
301
302 NC(nc_def_dim(ncid,
"NTRACK", NC_UNLIMITED, &dimid[0]));
304
305
306 NC(nc_def_var(ncid,
"time", NC_DOUBLE, 2, dimid, &time_varid));
307 addatt(ncid, time_varid,
"s",
"time (seconds since 2000-01-01T00:00Z)");
308 NC(nc_def_var(ncid,
"lon", NC_DOUBLE, 2, dimid, &lon_varid));
309 addatt(ncid, lon_varid,
"deg",
"footprint longitude");
310 NC(nc_def_var(ncid,
"lat", NC_DOUBLE, 2, dimid, &lat_varid));
311 addatt(ncid, lat_varid,
"deg",
"footprint latitude");
312
313 NC(nc_def_var(ncid,
"bt_8mu", NC_FLOAT, 2, dimid, &bt_8mu_varid));
314 addatt(ncid, bt_8mu_varid,
"K",
"brightness temperature at 8.1 micron");
315
316 NC(nc_def_var(ncid,
"bt_4mu", NC_FLOAT, 2, dimid, &bt_4mu_varid));
317 addatt(ncid, bt_4mu_varid,
"K",
"brightness temperature" " at 4.3 micron");
318 NC(nc_def_var(ncid,
"bt_4mu_pt", NC_FLOAT, 2, dimid, &bt_4mu_pt_varid));
319 addatt(ncid, bt_4mu_pt_varid,
"K",
"brightness temperature perturbation"
320 " at 4.3 micron");
321 NC(nc_def_var(ncid,
"bt_4mu_var", NC_FLOAT, 2, dimid, &bt_4mu_var_varid));
322 addatt(ncid, bt_4mu_var_varid,
"K^2",
"brightness temperature variance"
323 " at 4.3 micron");
324
325 NC(nc_def_var(ncid,
"bt_15mu_low", NC_FLOAT, 2, dimid, &bt_15mu_low_varid));
326 addatt(ncid, bt_15mu_low_varid,
"K",
"brightness temperature"
327 " at 15 micron (low altitudes)");
328 NC(nc_def_var(ncid,
"bt_15mu_low_pt", NC_FLOAT, 2, dimid,
329 &bt_15mu_low_pt_varid));
330 addatt(ncid, bt_15mu_low_pt_varid,
"K",
331 "brightness temperature perturbation"
332 " at 15 micron (low altitudes)");
334 (ncid, "bt_15mu_low_var", NC_FLOAT, 2, dimid, &bt_15mu_low_var_varid));
335 addatt(ncid, bt_15mu_low_var_varid,
"K^2",
336 "brightness temperature variance" " at 15 micron (low altitudes)");
337
338 NC(nc_def_var(ncid,
"bt_15mu_high", NC_FLOAT, 2, dimid,
339 &bt_15mu_high_varid));
340 addatt(ncid, bt_15mu_high_varid,
"K",
"brightness temperature"
341 " at 15 micron (high altitudes)");
342 NC(nc_def_var(ncid,
"bt_15mu_high_pt", NC_FLOAT, 2, dimid,
343 &bt_15mu_high_pt_varid));
344 addatt(ncid, bt_15mu_high_pt_varid,
"K",
345 "brightness temperature perturbation"
346 " at 15 micron (high altitudes)");
348 (ncid, "bt_15mu_high_var", NC_FLOAT, 2, dimid, &bt_15mu_high_var_varid));
349 addatt(ncid, bt_15mu_high_var_varid,
"K^2",
350 "brightness temperature variance" " at 15 micron (high altitudes)");
351
352
354
355
356 for (track = 0; track < pert_4mu->
ntrack; track++) {
357
358
359 start[0] = (size_t) track;
360 start[1] = 0;
361 count[0] = 1;
362 count[1] = (size_t) pert_4mu->
nxtrack;
363
364
365 NC(nc_put_vara_double(ncid, time_varid, start, count,
366 pert_4mu->
time[track]));
367 NC(nc_put_vara_double(ncid, lon_varid, start, count,
368 pert_4mu->
lon[track]));
369 NC(nc_put_vara_double(ncid, lat_varid, start, count,
370 pert_4mu->
lat[track]));
371
372 NC(nc_put_vara_double(ncid, bt_8mu_varid, start, count,
373 pert_4mu->
dc[track]));
374
375 NC(nc_put_vara_double(ncid, bt_4mu_varid, start, count,
376 pert_4mu->
bt[track]));
377 NC(nc_put_vara_double(ncid, bt_4mu_pt_varid, start, count,
378 pert_4mu->
pt[track]));
379 NC(nc_put_vara_double(ncid, bt_4mu_var_varid, start, count,
380 pert_4mu->
var[track]));
381
382 NC(nc_put_vara_double(ncid, bt_15mu_low_varid, start, count,
383 pert_15mu_low->
bt[track]));
384 NC(nc_put_vara_double(ncid, bt_15mu_low_pt_varid, start, count,
385 pert_15mu_low->
pt[track]));
386 NC(nc_put_vara_double(ncid, bt_15mu_low_var_varid, start, count,
387 pert_15mu_low->
var[track]));
388
389 NC(nc_put_vara_double(ncid, bt_15mu_high_varid, start, count,
390 pert_15mu_high->
bt[track]));
391 NC(nc_put_vara_double(ncid, bt_15mu_high_pt_varid, start, count,
392 pert_15mu_high->
pt[track]));
393 NC(nc_put_vara_double(ncid, bt_15mu_high_var_varid, start, count,
394 pert_15mu_high->
var[track]));
395 }
396
397
399
400
401 free(iasi_rad);
402 free(pert_4mu);
403 free(pert_15mu_low);
404 free(pert_15mu_high);
405
406 return EXIT_SUCCESS;
407}
void iasi_read(int format, char *filename, iasi_rad_t *iasi_rad)
Read IASI Level-1 data.
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
void variance(wave_t *wave, double dh)
Compute local variance.
void pert2wave(pert_t *pert, wave_t *wave, int track0, int track1, int xtrack0, int xtrack1)
Convert radiance perturbation data to wave analysis struct.
#define PERT_NXTRACK
Across-track size of perturbation data.
#define L1_NXTRACK
Across-track size of IASI radiance granule (don't change).
#define PERT_NTRACK
Along-track size of perturbation data.
void addatt(int ncid, int varid, const char *unit, const char *long_name)
IASI converted Level-1 radiation data.
double Longitude[L1_NTRACK][L1_NXTRACK]
Longitude of the sounder pixel.
double Latitude[L1_NTRACK][L1_NXTRACK]
Latitude of the sounder pixel.
double Time[L1_NTRACK][L1_NXTRACK]
Seconds since 2000-01-01 for each sounder pixel.
double freq[IASI_L1_NCHAN]
channel wavenumber [cm^-1]
int ntrack
Number of along-track samples.
float Rad[L1_NTRACK][L1_NXTRACK][IASI_L1_NCHAN]
Radiance [W/(m^2 sr cm^-1)].
double var[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature variance (4 or 15 micron) [K].
double pt[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature perturbation (4 or 15 micron) [K].
double time[PERT_NTRACK][PERT_NXTRACK]
Time (seconds since 2000-01-01T00:00Z).
double dc[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature (8 micron) [K].
int ntrack
Number of along-track values.
int nxtrack
Number of across-track values.
double lon[PERT_NTRACK][PERT_NXTRACK]
Longitude [deg].
double bt[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature (4 or 15 micron) [K].
double lat[PERT_NTRACK][PERT_NXTRACK]
Latitude [deg].
int nx
Number of across-track values.
int ny
Number of along-track values.
double var[WX][WY]
Variance [K].
double pt[WX][WY]
Perturbation [K].