IASI Code Collection
libiasi.h
Go to the documentation of this file.
1/*
2 This file is part of the IASI Code Collection.
3
4 the IASI Code Collections is free software: you can redistribute it
5 and/or modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation, either version 3 of
7 the License, or (at your option) any later version.
8
9 The IASI Code Collection is distributed in the hope that it will be
10 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
11 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with the IASI Code Collection. If not, see
16 <http://www.gnu.org/licenses/>.
17
18 Copyright (C) 2019-2026 Forschungszentrum Juelich GmbH
19*/
20
82#include <netcdf.h>
83#include <gsl/gsl_randist.h>
84#include <gsl/gsl_fft_complex.h>
85#include <gsl/gsl_multifit.h>
86#include <gsl/gsl_poly.h>
87#include <gsl/gsl_sort.h>
88#include <gsl/gsl_spline.h>
89#include "coda.h"
90#include "jurassic.h"
91
92/* ------------------------------------------------------------
93 Dimensions...
94 ------------------------------------------------------------ */
95
97#define L1_NCHAN 33
98
100#define L1_NTRACK 1800
101
103#define L1_NXTRACK 60
104
106#define L2_NLAY 27
107
109#define L2_NTRACK 1800
110
112#define L2_NXTRACK 60
113
115#define IASI_L1_NCHAN 8700
116
118#define IASI_NXTRACK 30
119
121#define IASI_PM 4
122
124#define IASI_IDefNsfirst1b 2581
125
127#define IASI_IDefNslast1b 11041
128
130#define IASI_IDefSpectDWn1b 25
131
133#define PERT_NTRACK 132000
134
136#define PERT_NXTRACK 360
137
139#define WX 300
140
142#define WY 33000
143
144/* ------------------------------------------------------------
145 Macros...
146 ------------------------------------------------------------ */
147
149#define CODA(cmd) { \
150 int coda_result=(cmd); \
151 if(coda_result!=0) \
152 ERRMSG("%s", coda_errno_to_string(coda_errno)); \
153 }
154
156#define NC(cmd) { \
157 int nc_result=(cmd); \
158 if(nc_result!=NC_NOERR) \
159 ERRMSG("%s", nc_strerror(nc_result)); \
160}
161
162/* ------------------------------------------------------------
163 Structs...
164 ------------------------------------------------------------ */
165
167typedef struct {
168
170 size_t ntrack;
171
173 double time[L1_NTRACK][L1_NXTRACK];
174
176 double lon[L1_NTRACK][L1_NXTRACK];
177
179 double lat[L1_NTRACK][L1_NXTRACK];
180
182 double sat_z[L1_NTRACK];
183
185 double sat_lon[L1_NTRACK];
186
188 double sat_lat[L1_NTRACK];
189
191 double nu[L1_NCHAN];
192
195
196} iasi_l1_t;
197
199typedef struct {
200
202 size_t ntrack;
203
205 double time[L2_NTRACK][L2_NXTRACK];
206
209
211 double lon[L2_NTRACK][L2_NXTRACK];
212
214 double lat[L2_NTRACK][L2_NXTRACK];
215
217 double p[L2_NLAY];
218
221
222} iasi_l2_t;
223
225typedef struct {
226
229
232
235
238
241
244
247
250
253
254} pert_t;
255
257typedef struct {
258
260 long ntrack;
261
263 float IDefSpectDWn1b[L1_NTRACK];
264
266 int32_t IDefNsfirst1b[L1_NTRACK];
267
269 int32_t IDefNslast1b[L1_NTRACK];
270
272 double Time[L1_NTRACK][IASI_NXTRACK];
273
276
278 float Wavenumber[IASI_L1_NCHAN];
279
282
284 unsigned int Sat_z[L1_NTRACK];
285
286} iasi_raw_t;
287
289typedef struct {
290
293
295 double freq[IASI_L1_NCHAN];
296
298 double Time[L1_NTRACK][L1_NXTRACK];
299
301 double Longitude[L1_NTRACK][L1_NXTRACK];
302
304 double Latitude[L1_NTRACK][L1_NXTRACK];
305
308
310 double Sat_z[L1_NTRACK];
311
313 double Sat_lon[L1_NTRACK];
314
316 double Sat_lat[L1_NTRACK];
317
318} iasi_rad_t;
319
321typedef struct {
322
324 int nx;
325
327 int ny;
328
330 double time;
331
333 double z;
334
336 double lon[WX][WY];
337
339 double lat[WX][WY];
340
342 double x[WX];
343
345 double y[WY];
346
348 double temp[WX][WY];
349
351 double bg[WX][WY];
352
354 double pt[WX][WY];
355
357 double var[WX][WY];
358
359} wave_t;
360
361/* ------------------------------------------------------------
362 Functions...
363 ------------------------------------------------------------ */
364
366void add_var(
367 int ncid,
368 const char *varname,
369 const char *unit,
370 const char *longname,
371 int type,
372 int dimid[],
373 int *varid,
374 int ndims);
375
377void background_poly(
378 wave_t * wave,
379 int dim_x,
380 int dim_y);
381
384 double *xx,
385 double *yy,
386 int n,
387 int dim);
388
391 wave_t * wave,
392 int npts_x,
393 int npts_y);
394
396void gauss(
397 wave_t * wave,
398 double fwhm);
399
401void hamming(
402 wave_t * wave,
403 int nit);
404
406void iasi_read(
407 int format,
408 char *filename,
409 iasi_rad_t * iasi_rad);
410
413 char *filename,
414 iasi_rad_t * iasi_rad);
415
418 char *filename,
419 iasi_rad_t * iasi_rad);
420
422void median(
423 wave_t * wave,
424 int dx);
425
427void noise(
428 wave_t * wave,
429 double *mu,
430 double *sig);
431
433void pert2wave(
434 pert_t * pert,
435 wave_t * wave,
436 int track0,
437 int track1,
438 int xtrack0,
439 int xtrack1);
440
442void read_pert(
443 char *filename,
444 char *pertname,
445 pert_t * pert);
446
448void variance(
449 wave_t * wave,
450 double dh);
451
453double wgs84(
454 double lat);
455
457void write_l1(
458 char *filename,
459 iasi_l1_t * l1);
460
462void write_l2(
463 char *filename,
464 iasi_l2_t * l2);
void hamming(wave_t *wave, int nit)
Apply Hamming filter to perturbations...
Definition: libiasi.c:268
#define IASI_NXTRACK
Raw data across-track size of IASI radiance granule.
Definition: libiasi.h:118
void iasi_read(int format, char *filename, iasi_rad_t *iasi_rad)
Read IASI Level-1 data.
Definition: libiasi.c:297
#define PERT_NXTRACK
Across-track size of perturbation data.
Definition: libiasi.h:136
void background_poly_help(double *xx, double *yy, int n, int dim)
Get background based on polynomial fits.
Definition: libiasi.c:57
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
Definition: libiasi.c:177
#define L1_NXTRACK
Across-track size of IASI radiance granule (don't change).
Definition: libiasi.h:103
#define L1_NTRACK
Maximum along-track size of IASI radiance granule (don't change).
Definition: libiasi.h:100
#define IASI_L1_NCHAN
Number of channels of IASI radiance granule.
Definition: libiasi.h:115
#define WX
Across-track size of wave analysis data.
Definition: libiasi.h:139
void write_l2(char *filename, iasi_l2_t *l2)
Write IASI Level-2 data.
Definition: libiasi.c:1217
void noise(wave_t *wave, double *mu, double *sig)
Estimate noise.
Definition: libiasi.c:848
void write_l1(char *filename, iasi_l1_t *l1)
Write IASI Level-1 data.
Definition: libiasi.c:1159
void iasi_read_netcdf(char *filename, iasi_rad_t *iasi_rad)
Read IASI Level-1 data from netCDF file.
Definition: libiasi.c:557
#define L2_NXTRACK
Across-track size of IASI retrieval granule (don't change).
Definition: libiasi.h:112
#define PERT_NTRACK
Along-track size of perturbation data.
Definition: libiasi.h:133
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
Definition: libiasi.c:114
void variance(wave_t *wave, double dh)
Compute local variance.
Definition: libiasi.c:1089
void add_var(int ncid, const char *varname, const char *unit, const char *longname, int type, int dimid[], int *varid, int ndims)
Add variable to netCDF file.
Definition: libiasi.c:30
#define L2_NLAY
Number of IASI pressure layers (don't change).
Definition: libiasi.h:106
void pert2wave(pert_t *pert, wave_t *wave, int track0, int track1, int xtrack0, int xtrack1)
Convert radiance perturbation data to wave analysis struct.
Definition: libiasi.c:893
#define L1_NCHAN
Number of IASI radiance channels (don't change).
Definition: libiasi.h:97
#define L2_NTRACK
Maximum along-track size of IASI retrieval granule (don't change).
Definition: libiasi.h:109
#define WY
Along-track size of wave analysis data.
Definition: libiasi.h:142
void read_pert(char *filename, char *pertname, pert_t *pert)
Read radiance perturbation data.
Definition: libiasi.c:1007
void gauss(wave_t *wave, double fwhm)
Apply Gaussian filter to perturbations...
Definition: libiasi.c:228
#define IASI_PM
Raw data size of measurement matrix (2x2).
Definition: libiasi.h:121
void iasi_read_native(char *filename, iasi_rad_t *iasi_rad)
Read IASI Level-1 data from native file.
Definition: libiasi.c:317
void median(wave_t *wave, int dx)
Apply median filter to perturbations...
Definition: libiasi.c:809
double wgs84(double lat)
Calculate Earth radius according to WGS-84 reference ellipsoid.
Definition: libiasi.c:1143
IASI Level-1 data.
Definition: libiasi.h:167
size_t ntrack
Number of along-track values.
Definition: libiasi.h:170
IASI Level-2 data.
Definition: libiasi.h:199
size_t ntrack
Number of along-track values.
Definition: libiasi.h:202
IASI converted Level-1 radiation data.
Definition: libiasi.h:289
int ntrack
Number of along-track samples.
Definition: libiasi.h:292
IASI raw Level-1 data.
Definition: libiasi.h:257
long ntrack
Number of along-track samples.
Definition: libiasi.h:260
Perturbation data.
Definition: libiasi.h:225
int ntrack
Number of along-track values.
Definition: libiasi.h:228
int nxtrack
Number of across-track values.
Definition: libiasi.h:231
Wave analysis data.
Definition: libiasi.h:321
int nx
Number of across-track values.
Definition: libiasi.h:324
int ny
Number of along-track values.
Definition: libiasi.h:327
double z
Altitude [km].
Definition: libiasi.h:333
double time
Time (seconds since 2000-01-01T00:00Z).
Definition: libiasi.h:330