AIRS Code Collection
libairs.h
Go to the documentation of this file.
1/*
2 This file is part of the AIRS Code Collection.
3
4 The AIRS Code Collection 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 AIRS 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 AIRS Code Collection. If not, see
16 <http://www.gnu.org/licenses/>.
17
18 Copyright (C) 2019-2025 Forschungszentrum Juelich GmbH
19*/
20
91#include <netcdf.h>
92#include <gsl/gsl_randist.h>
93#include <gsl/gsl_fft_complex.h>
94#include <gsl/gsl_multifit.h>
95#include <gsl/gsl_poly.h>
96#include <gsl/gsl_sort.h>
97#include <gsl/gsl_spline.h>
98#include <airs_rad_typ.h>
99#include <airs_rad_struct.h>
100#include <airs_ret_typ.h>
101#include <airs_ret_struct.h>
102#include "jurassic.h"
103
104/* ------------------------------------------------------------
105 Dimensions...
106 ------------------------------------------------------------ */
107
109#define NDS 200000
110
112#define NPG 30
113
115#define L1_NCHAN 34
116
118#define L1_NTRACK 135
119
121#define L1_NXTRACK 90
122
124#define L2_NLAY 27
125
127#define L2_NTRACK 45
128
130#define L2_NXTRACK 30
131
133#define PERT_NTRACK 132000
134
136#define PERT_NXTRACK 360
137
139#define WX 300
140
142#define WY 33000
143
145#define PMAX 512
146
147/* ------------------------------------------------------------
148 Macros...
149 ------------------------------------------------------------ */
150
152#define NC(cmd) { \
153 int nc_result=(cmd); \
154 if(nc_result!=NC_NOERR) \
155 ERRMSG("%s", nc_strerror(nc_result)); \
156}
157
158/* ------------------------------------------------------------
159 Structs...
160 ------------------------------------------------------------ */
161
163typedef struct {
164
166 double time[L1_NTRACK][L1_NXTRACK];
167
169 double lon[L1_NTRACK][L1_NXTRACK];
170
172 double lat[L1_NTRACK][L1_NXTRACK];
173
175 double sat_z[L1_NTRACK];
176
178 double sat_lon[L1_NTRACK];
179
181 double sat_lat[L1_NTRACK];
182
184 double nu[L1_NCHAN];
185
188
189} airs_l1_t;
190
192typedef struct {
193
195 double time[L2_NTRACK][L2_NXTRACK];
196
199
201 double lon[L2_NTRACK][L2_NXTRACK];
202
204 double lat[L2_NTRACK][L2_NXTRACK];
205
207 double p[L2_NLAY];
208
211
212} airs_l2_t;
213
215typedef struct {
216
219
222
225
228
231
234
237
240
243
244} pert_t;
245
247typedef struct {
248
250 int nds;
251
253 int np;
254
256 double time[NDS][NPG];
257
259 double z[NDS][NPG];
260
262 double lon[NDS][NPG];
263
265 double lat[NDS][NPG];
266
268 double p[NDS][NPG];
269
271 double t[NDS][NPG];
272
274 double t_apr[NDS][NPG];
275
277 double t_tot[NDS][NPG];
278
280 double t_noise[NDS][NPG];
281
283 double t_fm[NDS][NPG];
284
286 double t_cont[NDS][NPG];
287
289 double t_res[NDS][NPG];
290
292 double chisq[NDS];
293
294} retr_t;
295
297typedef struct {
298
300 int nx;
301
303 int ny;
304
306 double time;
307
309 double z;
310
312 double lon[WX][WY];
313
315 double lat[WX][WY];
316
318 double x[WX];
319
321 double y[WY];
322
324 double temp[WX][WY];
325
327 double bg[WX][WY];
328
330 double pt[WX][WY];
331
333 double var[WX][WY];
334
336 double fit[WX][WY];
337
338} wave_t;
339
340/* ------------------------------------------------------------
341 Functions...
342 ------------------------------------------------------------ */
343
345void add_att(
346 int ncid,
347 int varid,
348 const char *unit,
349 const char *long_name);
350
352void add_var(
353 int ncid,
354 const char *varname,
355 const char *unit,
356 const char *longname,
357 int type,
358 int dimid[],
359 int *varid,
360 int ndims);
361
363void background_poly(
364 wave_t * wave,
365 int dim_x,
366 int dim_y);
367
370 double *xx,
371 double *yy,
372 int n,
373 int dim);
374
377 wave_t * wave,
378 int npts_x,
379 int npts_y);
380
383 wave_t * wave);
384
386void create_noise(
387 wave_t * wave,
388 double nedt);
389
391void create_wave(
392 wave_t * wave,
393 double amp,
394 double lx,
395 double ly,
396 double phi,
397 double fwhm);
398
400void fit_wave(
401 wave_t * wave,
402 double amp,
403 double phi,
404 double kx,
405 double ky,
406 double *chisq);
407
409void fft_help(
410 double *fcReal,
411 double *fcImag,
412 int n);
413
415void fft(
416 wave_t * wave,
417 double *Amax,
418 double *phimax,
419 double *lhmax,
420 double *kxmax,
421 double *kymax,
422 double *alphamax,
423 double *betamax,
424 char *filename);
425
427void gauss(
428 wave_t * wave,
429 double fwhm);
430
432void hamming(
433 wave_t * wave,
434 int nit);
435
437void intpol_x(
438 wave_t * wave,
439 int n);
440
442void median(
443 wave_t * wave,
444 int dx);
445
447void merge_y(
448 wave_t * wave1,
449 wave_t * wave2);
450
452void noise(
453 wave_t * wave,
454 double *mu,
455 double *sig);
456
458void period(
459 wave_t * wave,
460 double lxymax,
461 double dlxy,
462 double *Amax,
463 double *phimax,
464 double *lhmax,
465 double *kxmax,
466 double *kymax,
467 double *alphamax,
468 double *betamax,
469 char *filename);
470
472void pert2wave(
473 pert_t * pert,
474 wave_t * wave,
475 int track0,
476 int track1,
477 int xtrack0,
478 int xtrack1);
479
481void read_l1(
482 char *filename,
483 airs_l1_t * l1);
484
486void read_l2(
487 char *filename,
488 airs_l2_t * l2);
489
491void read_pert(
492 char *filename,
493 char *pertname,
494 pert_t * pert);
495
497void read_retr(
498 char *filename,
499 retr_t * ret);
500
502void read_retr_help(
503 double *help,
504 int nds,
505 int np,
506 double mat[NDS][NPG]);
507
509void read_wave(
510 char *filename,
511 wave_t * wave);
512
514void rad2wave(
515 airs_rad_gran_t * airs_rad_gran,
516 double *nu,
517 int nd,
518 wave_t * wave);
519
521void ret2wave(
522 retr_t * ret,
523 wave_t * wave,
524 int dataset,
525 int ip);
526
528void variance(
529 wave_t * wave,
530 double dh);
531
533void write_l1(
534 char *filename,
535 airs_l1_t * l1);
536
538void write_l2(
539 char *filename,
540 airs_l2_t * l2);
541
543void write_wave(
544 char *filename,
545 wave_t * wave);
void hamming(wave_t *wave, int nit)
Apply Hamming filter to perturbations...
Definition: libairs.c:569
void merge_y(wave_t *wave1, wave_t *wave2)
Merge wave structs in y-direction.
Definition: libairs.c:715
void fit_wave(wave_t *wave, double amp, double phi, double kx, double ky, double *chisq)
Evaluate wave fit...
Definition: libairs.c:304
void create_wave(wave_t *wave, double amp, double lx, double ly, double phi, double fwhm)
Add linear wave pattern...
Definition: libairs.c:275
void read_l1(char *filename, airs_l1_t *l1)
Read AIRS Level-1 data.
Definition: libairs.c:1023
#define PERT_NXTRACK
Across-track size of perturbation data.
Definition: libairs.h:136
void background_poly_help(double *xx, double *yy, int n, int dim)
Get background based on polynomial fits.
Definition: libairs.c:72
void fft_help(double *fcReal, double *fcImag, int n)
Calculate 1-D FFT...
Definition: libairs.c:330
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
Definition: libairs.c:176
#define L1_NXTRACK
Across-track size of AIRS radiance granule (don't change).
Definition: libairs.h:121
#define L1_NTRACK
Along-track size of AIRS radiance granule (don't change).
Definition: libairs.h:118
void add_att(int ncid, int varid, const char *unit, const char *long_name)
Add variable attributes to netCDF file.
Definition: libairs.c:30
void intpol_x(wave_t *wave, int n)
Interpolate to regular grid in x-direction.
Definition: libairs.c:598
void fft(wave_t *wave, double *Amax, double *phimax, double *lhmax, double *kxmax, double *kymax, double *alphamax, double *betamax, char *filename)
Calculate 2-D FFT...
Definition: libairs.c:369
#define WX
Across-track size of wave analysis data.
Definition: libairs.h:139
void noise(wave_t *wave, double *mu, double *sig)
Estimate noise.
Definition: libairs.c:748
void read_retr_help(double *help, int nds, int np, double mat[NDS][NPG])
Convert array.
Definition: libairs.c:1335
#define L2_NXTRACK
Across-track size of AIRS retrieval granule (don't change).
Definition: libairs.h:130
#define PERT_NTRACK
Along-track size of perturbation data.
Definition: libairs.h:133
void ret2wave(retr_t *ret, wave_t *wave, int dataset, int ip)
Convert AIRS retrieval results to wave analysis struct.
Definition: libairs.c:1481
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
Definition: libairs.c:126
void create_noise(wave_t *wave, double nedt)
Add noise to perturbations and temperatures...
Definition: libairs.c:254
void variance(wave_t *wave, double dh)
Compute local variance.
Definition: libairs.c:1534
#define NDS
Maximum number of data sets per granule.
Definition: libairs.h:109
void write_l2(char *filename, airs_l2_t *l2)
Write AIRS Level-2 data.
Definition: libairs.c:1642
void read_l2(char *filename, airs_l2_t *l2)
Read AIRS Level-2 data.
Definition: libairs.c:1057
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: libairs.c:45
void rad2wave(airs_rad_gran_t *airs_rad_gran, double *nu, int nd, wave_t *wave)
Convert AIRS radiance data to wave analysis struct.
Definition: libairs.c:1411
#define L2_NLAY
Number of AIRS pressure layers (don't change).
Definition: libairs.h:124
void read_retr(char *filename, retr_t *ret)
Read AIRS retrieval data.
Definition: libairs.c:1169
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: libairs.c:949
#define NPG
Maximum number of data points per granule.
Definition: libairs.h:112
#define L1_NCHAN
Number of AIRS radiance channels (don't change).
Definition: libairs.h:115
void create_background(wave_t *wave)
Set background...
Definition: libairs.c:227
#define L2_NTRACK
Along-track size of AIRS retrieval granule (don't change).
Definition: libairs.h:127
#define WY
Along-track size of wave analysis data.
Definition: libairs.h:142
void read_wave(char *filename, wave_t *wave)
Read wave analysis data.
Definition: libairs.c:1350
void read_pert(char *filename, char *pertname, pert_t *pert)
Read radiance perturbation data.
Definition: libairs.c:1087
void gauss(wave_t *wave, double fwhm)
Apply Gaussian filter to perturbations...
Definition: libairs.c:529
void write_l1(char *filename, airs_l1_t *l1)
Write AIRS Level-1 data.
Definition: libairs.c:1584
void median(wave_t *wave, int dx)
Apply median filter to perturbations...
Definition: libairs.c:676
void write_wave(char *filename, wave_t *wave)
Write wave analysis data.
Definition: libairs.c:1691
void period(wave_t *wave, double lxymax, double dlxy, double *Amax, double *phimax, double *lhmax, double *kxmax, double *kymax, double *alphamax, double *betamax, char *filename)
Compute periodogram.
Definition: libairs.c:792
AIRS Level-1 data.
Definition: libairs.h:163
AIRS Level-2 data.
Definition: libairs.h:192
Perturbation data.
Definition: libairs.h:215
int ntrack
Number of along-track values.
Definition: libairs.h:218
int nxtrack
Number of across-track values.
Definition: libairs.h:221
Retrieval results.
Definition: libairs.h:247
int np
Number of data points.
Definition: libairs.h:253
int nds
Number of data sets.
Definition: libairs.h:250
Wave analysis data.
Definition: libairs.h:297
int nx
Number of across-track values.
Definition: libairs.h:300
int ny
Number of along-track values.
Definition: libairs.h:303
double z
Altitude [km].
Definition: libairs.h:309
double time
Time (seconds since 2000-01-01T00:00Z).
Definition: libairs.h:306