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} ret_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 day2doy(
391 int year,
392 int mon,
393 int day,
394 int *doy);
395
397void doy2day(
398 int year,
399 int doy,
400 int *mon,
401 int *day);
402
404void fit_wave(
405 wave_t * wave,
406 double amp,
407 double phi,
408 double kx,
409 double ky,
410 double *chisq);
411
413void fft_help(
414 double *fcReal,
415 double *fcImag,
416 int n);
417
419void fft(
420 wave_t * wave,
421 double *Amax,
422 double *phimax,
423 double *lhmax,
424 double *kxmax,
425 double *kymax,
426 double *alphamax,
427 double *betamax,
428 char *filename);
429
431void gauss(
432 wave_t * wave,
433 double fwhm);
434
436void hamming(
437 wave_t * wave,
438 int nit);
439
441void intpol_x(
442 wave_t * wave,
443 int n);
444
446void median(
447 wave_t * wave,
448 int dx);
449
451void merge_y(
452 wave_t * wave1,
453 wave_t * wave2);
454
456void noise(
457 wave_t * wave,
458 double *mu,
459 double *sig);
460
462void period(
463 wave_t * wave,
464 double lxymax,
465 double dlxy,
466 double *Amax,
467 double *phimax,
468 double *lhmax,
469 double *kxmax,
470 double *kymax,
471 double *alphamax,
472 double *betamax,
473 char *filename);
474
476void pert2wave(
477 pert_t * pert,
478 wave_t * wave,
479 int track0,
480 int track1,
481 int xtrack0,
482 int xtrack1);
483
485void read_l1(
486 char *filename,
487 airs_l1_t * l1);
488
490void read_l2(
491 char *filename,
492 airs_l2_t * l2);
493
495void read_pert(
496 char *filename,
497 char *pertname,
498 pert_t * pert);
499
501void read_retr(
502 char *filename,
503 ret_t * ret);
504
506void read_retr_help(
507 double *help,
508 int nds,
509 int np,
510 double mat[NDS][NPG]);
511
513void read_wave(
514 char *filename,
515 wave_t * wave);
516
518void rad2wave(
519 airs_rad_gran_t * airs_rad_gran,
520 double *nu,
521 int nd,
522 wave_t * wave);
523
525void ret2wave(
526 ret_t * ret,
527 wave_t * wave,
528 int dataset,
529 int ip);
530
532void variance(
533 wave_t * wave,
534 double dh);
535
537void write_l1(
538 char *filename,
539 airs_l1_t * l1);
540
542void write_l2(
543 char *filename,
544 airs_l2_t * l2);
545
547void write_wave(
548 char *filename,
549 wave_t * wave);
JURASSIC library declarations.
void hamming(wave_t *wave, int nit)
Apply Hamming filter to perturbations...
Definition: libairs.c:619
void merge_y(wave_t *wave1, wave_t *wave2)
Merge wave structs in y-direction.
Definition: libairs.c:765
void fit_wave(wave_t *wave, double amp, double phi, double kx, double ky, double *chisq)
Evaluate wave fit...
Definition: libairs.c:354
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:1073
#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:380
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 day2doy(int year, int mon, int day, int *doy)
Get day of year from date.
Definition: libairs.c:304
void intpol_x(wave_t *wave, int n)
Interpolate to regular grid in x-direction.
Definition: libairs.c:648
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:419
#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:798
void read_retr_help(double *help, int nds, int np, double mat[NDS][NPG])
Convert array.
Definition: libairs.c:1385
#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 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:1584
#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:1692
void read_l2(char *filename, airs_l2_t *l2)
Read AIRS Level-2 data.
Definition: libairs.c:1107
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:1461
#define L2_NLAY
Number of AIRS pressure layers (don't change).
Definition: libairs.h:114
void ret2wave(ret_t *ret, wave_t *wave, int dataset, int ip)
Convert AIRS retrieval results to wave analysis struct.
Definition: libairs.c:1531
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:999
#define NPG
Maximum number of data points per granule.
Definition: libairs.h:102
void read_retr(char *filename, ret_t *ret)
Read AIRS retrieval data.
Definition: libairs.c:1219
void doy2day(int year, int doy, int *mon, int *day)
Get date from day of year.
Definition: libairs.c:324
#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:1400
void read_pert(char *filename, char *pertname, pert_t *pert)
Read radiance perturbation data.
Definition: libairs.c:1137
void gauss(wave_t *wave, double fwhm)
Apply Gaussian filter to perturbations...
Definition: libairs.c:579
void write_l1(char *filename, airs_l1_t *l1)
Write AIRS Level-1 data.
Definition: libairs.c:1634
void median(wave_t *wave, int dx)
Apply median filter to perturbations...
Definition: libairs.c:726
void write_wave(char *filename, wave_t *wave)
Write wave analysis data.
Definition: libairs.c:1741
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:842
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 nds
Number of data sets.
Definition: libairs.h:240
int np
Number of data points.
Definition: libairs.h:243
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