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
81#include <netcdf.h>
82#include <gsl/gsl_randist.h>
83#include <gsl/gsl_fft_complex.h>
84#include <gsl/gsl_multifit.h>
85#include <gsl/gsl_poly.h>
86#include <gsl/gsl_sort.h>
87#include <gsl/gsl_spline.h>
88#include "coda.h"
89#include "jurassic.h"
90
91/* ------------------------------------------------------------
92 Dimensions...
93 ------------------------------------------------------------ */
94
96#define L1_NCHAN 33
97
99#define L1_NTRACK 1800
100
102#define L1_NXTRACK 60
103
105#define L2_NLAY 27
106
108#define L2_NTRACK 1800
109
111#define L2_NXTRACK 60
112
114#define IASI_L1_NCHAN 8700
115
117#define IASI_NXTRACK 30
118
120#define IASI_PM 4
121
123#define IASI_IDefNsfirst1b 2581
124
126#define IASI_IDefNslast1b 11041
127
129#define IASI_IDefSpectDWn1b 25
130
132#define PERT_NTRACK 132000
133
135#define PERT_NXTRACK 360
136
138#define WX 300
139
141#define WY 33000
142
143/* ------------------------------------------------------------
144 Macros...
145 ------------------------------------------------------------ */
146
148#define CODA(cmd) { \
149 int coda_result=(cmd); \
150 if(coda_result!=0) \
151 ERRMSG("%s", coda_errno_to_string(coda_errno)); \
152 }
153
155#define NC(cmd) { \
156 int nc_result=(cmd); \
157 if(nc_result!=NC_NOERR) \
158 ERRMSG("%s", nc_strerror(nc_result)); \
159}
160
161/* ------------------------------------------------------------
162 Structs...
163 ------------------------------------------------------------ */
164
166typedef struct {
167
169 size_t ntrack;
170
172 double time[L1_NTRACK][L1_NXTRACK];
173
175 double lon[L1_NTRACK][L1_NXTRACK];
176
178 double lat[L1_NTRACK][L1_NXTRACK];
179
181 double sat_z[L1_NTRACK];
182
184 double sat_lon[L1_NTRACK];
185
187 double sat_lat[L1_NTRACK];
188
190 double nu[L1_NCHAN];
191
194
195} iasi_l1_t;
196
198typedef struct {
199
201 size_t ntrack;
202
204 double time[L2_NTRACK][L2_NXTRACK];
205
208
210 double lon[L2_NTRACK][L2_NXTRACK];
211
213 double lat[L2_NTRACK][L2_NXTRACK];
214
216 double p[L2_NLAY];
217
220
221} iasi_l2_t;
222
224typedef struct {
225
228
231
234
237
240
243
246
249
252
253} pert_t;
254
256typedef struct {
257
259 long ntrack;
260
262 float IDefSpectDWn1b[L1_NTRACK];
263
265 int32_t IDefNsfirst1b[L1_NTRACK];
266
268 int32_t IDefNslast1b[L1_NTRACK];
269
271 double Time[L1_NTRACK][IASI_NXTRACK];
272
275
277 float Wavenumber[IASI_L1_NCHAN];
278
281
283 unsigned int Sat_z[L1_NTRACK];
284
285} iasi_raw_t;
286
288typedef struct {
289
292
294 double freq[IASI_L1_NCHAN];
295
297 double Time[L1_NTRACK][L1_NXTRACK];
298
300 double Longitude[L1_NTRACK][L1_NXTRACK];
301
303 double Latitude[L1_NTRACK][L1_NXTRACK];
304
307
309 double Sat_z[L1_NTRACK];
310
312 double Sat_lon[L1_NTRACK];
313
315 double Sat_lat[L1_NTRACK];
316
317} iasi_rad_t;
318
320typedef struct {
321
323 int nx;
324
326 int ny;
327
329 double time;
330
332 double z;
333
335 double lon[WX][WY];
336
338 double lat[WX][WY];
339
341 double x[WX];
342
344 double y[WY];
345
347 double temp[WX][WY];
348
350 double bg[WX][WY];
351
353 double pt[WX][WY];
354
356 double var[WX][WY];
357
358} wave_t;
359
360/* ------------------------------------------------------------
361 Functions...
362 ------------------------------------------------------------ */
363
365void add_var(
366 int ncid,
367 const char *varname,
368 const char *unit,
369 const char *longname,
370 int type,
371 int dimid[],
372 int *varid,
373 int ndims);
374
376void background_poly(
377 wave_t * wave,
378 int dim_x,
379 int dim_y);
380
383 double *xx,
384 double *yy,
385 int n,
386 int dim);
387
390 wave_t * wave,
391 int npts_x,
392 int npts_y);
393
395void gauss(
396 wave_t * wave,
397 double fwhm);
398
400void hamming(
401 wave_t * wave,
402 int nit);
403
405void iasi_read(
406 int format,
407 char *filename,
408 iasi_rad_t * iasi_rad);
409
412 char *filename,
413 iasi_rad_t * iasi_rad);
414
417 char *filename,
418 iasi_rad_t * iasi_rad);
419
421void median(
422 wave_t * wave,
423 int dx);
424
426void noise(
427 wave_t * wave,
428 double *mu,
429 double *sig);
430
432void pert2wave(
433 pert_t * pert,
434 wave_t * wave,
435 int track0,
436 int track1,
437 int xtrack0,
438 int xtrack1);
439
441void read_pert(
442 char *filename,
443 char *pertname,
444 pert_t * pert);
445
447void variance(
448 wave_t * wave,
449 double dh);
450
452double wgs84(
453 double lat);
454
456void write_l1(
457 char *filename,
458 iasi_l1_t * l1);
459
461void write_l2(
462 char *filename,
463 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:117
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:135
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:102
#define L1_NTRACK
Maximum along-track size of IASI radiance granule (don't change).
Definition: libiasi.h:99
#define IASI_L1_NCHAN
Number of channels of IASI radiance granule.
Definition: libiasi.h:114
#define WX
Across-track size of wave analysis data.
Definition: libiasi.h:138
void write_l2(char *filename, iasi_l2_t *l2)
Write IASI Level-2 data.
Definition: libiasi.c:1139
void noise(wave_t *wave, double *mu, double *sig)
Estimate noise.
Definition: libiasi.c:808
void write_l1(char *filename, iasi_l1_t *l1)
Write IASI Level-1 data.
Definition: libiasi.c:1081
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:111
#define PERT_NTRACK
Along-track size of perturbation data.
Definition: libiasi.h:132
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:1011
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:105
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:853
#define L1_NCHAN
Number of IASI radiance channels (don't change).
Definition: libiasi.h:96
#define L2_NTRACK
Maximum along-track size of IASI retrieval granule (don't change).
Definition: libiasi.h:108
#define WY
Along-track size of wave analysis data.
Definition: libiasi.h:141
void read_pert(char *filename, char *pertname, pert_t *pert)
Read radiance perturbation data.
Definition: libiasi.c:929
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:120
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:769
double wgs84(double lat)
Calculate Earth radius according to WGS-84 reference ellipsoid.
Definition: libiasi.c:1065
IASI Level-1 data.
Definition: libiasi.h:166
size_t ntrack
Number of along-track values.
Definition: libiasi.h:169
IASI Level-2 data.
Definition: libiasi.h:198
size_t ntrack
Number of along-track values.
Definition: libiasi.h:201
IASI converted Level-1 radiation data.
Definition: libiasi.h:288
int ntrack
Number of along-track samples.
Definition: libiasi.h:291
IASI raw Level-1 data.
Definition: libiasi.h:256
long ntrack
Number of along-track samples.
Definition: libiasi.h:259
Perturbation data.
Definition: libiasi.h:224
int ntrack
Number of along-track values.
Definition: libiasi.h:227
int nxtrack
Number of across-track values.
Definition: libiasi.h:230
Wave analysis data.
Definition: libiasi.h:320
int nx
Number of across-track values.
Definition: libiasi.h:323
int ny
Number of along-track values.
Definition: libiasi.h:326
double z
Altitude [km].
Definition: libiasi.h:332
double time
Time (seconds since 2000-01-01T00:00Z).
Definition: libiasi.h:329