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 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 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
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 <airs_rad_typ.h>
89#include <airs_rad_struct.h>
90#include <airs_ret_typ.h>
91#include <airs_ret_struct.h>
92#include "jurassic.h"
93
94/* ------------------------------------------------------------
95 Dimensions...
96 ------------------------------------------------------------ */
97
99#define NDS 200000
100
102#define NPG 30
103
105#define L1_NCHAN 34
106
108#define L1_NTRACK 135
109
111#define L1_NXTRACK 90
112
114#define L2_NLAY 27
115
117#define L2_NTRACK 45
118
120#define L2_NXTRACK 30
121
123#define PERT_NTRACK 132000
124
126#define PERT_NXTRACK 360
127
129#define WX 300
130
132#define WY 33000
133
135#define PMAX 512
136
137/* ------------------------------------------------------------
138 Macros...
139 ------------------------------------------------------------ */
140
142#define NC(cmd) { \
143 int nc_result=(cmd); \
144 if(nc_result!=NC_NOERR) \
145 ERRMSG("%s", nc_strerror(nc_result)); \
146}
147
148/* ------------------------------------------------------------
149 Structs...
150 ------------------------------------------------------------ */
151
153typedef struct {
154
156 double time[L1_NTRACK][L1_NXTRACK];
157
159 double lon[L1_NTRACK][L1_NXTRACK];
160
162 double lat[L1_NTRACK][L1_NXTRACK];
163
165 double sat_z[L1_NTRACK];
166
168 double sat_lon[L1_NTRACK];
169
171 double sat_lat[L1_NTRACK];
172
174 double nu[L1_NCHAN];
175
178
179} airs_l1_t;
180
182typedef struct {
183
185 double time[L2_NTRACK][L2_NXTRACK];
186
189
191 double lon[L2_NTRACK][L2_NXTRACK];
192
194 double lat[L2_NTRACK][L2_NXTRACK];
195
197 double p[L2_NLAY];
198
201
202} airs_l2_t;
203
205typedef struct {
206
209
212
215
218
221
224
227
230
233
234} pert_t;
235
237typedef struct {
238
240 int nds;
241
243 int np;
244
246 double time[NDS][NPG];
247
249 double z[NDS][NPG];
250
252 double lon[NDS][NPG];
253
255 double lat[NDS][NPG];
256
258 double p[NDS][NPG];
259
261 double t[NDS][NPG];
262
264 double t_apr[NDS][NPG];
265
267 double t_tot[NDS][NPG];
268
270 double t_noise[NDS][NPG];
271
273 double t_fm[NDS][NPG];
274
276 double t_cont[NDS][NPG];
277
279 double t_res[NDS][NPG];
280
282 double chisq[NDS];
283
284} retr_t;
285
287typedef struct {
288
290 int nx;
291
293 int ny;
294
296 double time;
297
299 double z;
300
302 double lon[WX][WY];
303
305 double lat[WX][WY];
306
308 double x[WX];
309
311 double y[WY];
312
314 double temp[WX][WY];
315
317 double bg[WX][WY];
318
320 double pt[WX][WY];
321
323 double var[WX][WY];
324
326 double fit[WX][WY];
327
328} wave_t;
329
330/* ------------------------------------------------------------
331 Functions...
332 ------------------------------------------------------------ */
333
335void add_att(
336 int ncid,
337 int varid,
338 const char *unit,
339 const char *long_name);
340
342void add_var(
343 int ncid,
344 const char *varname,
345 const char *unit,
346 const char *longname,
347 int type,
348 int dimid[],
349 int *varid,
350 int ndims);
351
353void background_poly(
354 wave_t * wave,
355 int dim_x,
356 int dim_y);
357
360 double *xx,
361 double *yy,
362 int n,
363 int dim);
364
367 wave_t * wave,
368 int npts_x,
369 int npts_y);
370
373 wave_t * wave);
374
376void create_noise(
377 wave_t * wave,
378 double nedt);
379
381void create_wave(
382 wave_t * wave,
383 double amp,
384 double lx,
385 double ly,
386 double phi,
387 double fwhm);
388
390void fit_wave(
391 wave_t * wave,
392 double amp,
393 double phi,
394 double kx,
395 double ky,
396 double *chisq);
397
399void fft_help(
400 double *fcReal,
401 double *fcImag,
402 int n);
403
405void fft(
406 wave_t * wave,
407 double *Amax,
408 double *phimax,
409 double *lhmax,
410 double *kxmax,
411 double *kymax,
412 double *alphamax,
413 double *betamax,
414 char *filename);
415
417void gauss(
418 wave_t * wave,
419 double fwhm);
420
422void hamming(
423 wave_t * wave,
424 int nit);
425
427void intpol_x(
428 wave_t * wave,
429 int n);
430
432void median(
433 wave_t * wave,
434 int dx);
435
437void merge_y(
438 wave_t * wave1,
439 wave_t * wave2);
440
442void noise(
443 wave_t * wave,
444 double *mu,
445 double *sig);
446
448void period(
449 wave_t * wave,
450 double lxymax,
451 double dlxy,
452 double *Amax,
453 double *phimax,
454 double *lhmax,
455 double *kxmax,
456 double *kymax,
457 double *alphamax,
458 double *betamax,
459 char *filename);
460
462void pert2wave(
463 pert_t * pert,
464 wave_t * wave,
465 int track0,
466 int track1,
467 int xtrack0,
468 int xtrack1);
469
471void read_l1(
472 char *filename,
473 airs_l1_t * l1);
474
476void read_l2(
477 char *filename,
478 airs_l2_t * l2);
479
481void read_pert(
482 char *filename,
483 char *pertname,
484 pert_t * pert);
485
487void read_retr(
488 char *filename,
489 retr_t * ret);
490
492void read_retr_help(
493 double *help,
494 int nds,
495 int np,
496 double mat[NDS][NPG]);
497
499void read_wave(
500 char *filename,
501 wave_t * wave);
502
504void rad2wave(
505 airs_rad_gran_t * airs_rad_gran,
506 double *nu,
507 int nd,
508 wave_t * wave);
509
511void ret2wave(
512 retr_t * ret,
513 wave_t * wave,
514 int dataset,
515 int ip);
516
518void variance(
519 wave_t * wave,
520 double dh);
521
523void write_l1(
524 char *filename,
525 airs_l1_t * l1);
526
528void write_l2(
529 char *filename,
530 airs_l2_t * l2);
531
533void write_wave(
534 char *filename,
535 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:126
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:111
#define L1_NTRACK
Along-track size of AIRS radiance granule (don't change).
Definition: libairs.h:108
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:129
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:120
#define PERT_NTRACK
Along-track size of perturbation data.
Definition: libairs.h:123
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:99
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:114
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:102
#define L1_NCHAN
Number of AIRS radiance channels (don't change).
Definition: libairs.h:105
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:117
#define WY
Along-track size of wave analysis data.
Definition: libairs.h:132
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:153
AIRS Level-2 data.
Definition: libairs.h:182
Perturbation data.
Definition: libairs.h:205
int ntrack
Number of along-track values.
Definition: libairs.h:208
int nxtrack
Number of across-track values.
Definition: libairs.h:211
Retrieval results.
Definition: libairs.h:237
int np
Number of data points.
Definition: libairs.h:243
int nds
Number of data sets.
Definition: libairs.h:240
Wave analysis data.
Definition: libairs.h:287
int nx
Number of across-track values.
Definition: libairs.h:290
int ny
Number of along-track values.
Definition: libairs.h:293
double z
Altitude [km].
Definition: libairs.h:299
double time
Time (seconds since 2000-01-01T00:00Z).
Definition: libairs.h:296