CrIS Code Collection
libcris.h
Go to the documentation of this file.
1#include <netcdf.h>
2#include <gsl/gsl_randist.h>
3#include <gsl/gsl_fft_complex.h>
4#include <gsl/gsl_multifit.h>
5#include <gsl/gsl_poly.h>
6#include <gsl/gsl_sort.h>
7#include <gsl/gsl_spline.h>
8#include "jurassic.h"
9
10/* ------------------------------------------------------------
11 Dimensions...
12 ------------------------------------------------------------ */
13
15#define NDS 200000
16
18#define NPG 30
19
21#define L1_NTRACK 45
22
24#define L1_NXTRACK 30
25
27#define L1_NFOV 9
28
30#define L1_NCHAN_LW 717
31
33#define L1_NCHAN_MW 869
34
36#define L1_NCHAN_SW 637
37
39#define PERT_NTRACK 44000
40
42#define PERT_NXTRACK 120
43
45#define PERT_NFOV 9
46
48#define WX 300
49
51#define WY 33000
52
54#define PMAX 512
55
56/* ------------------------------------------------------------
57 Macros...
58 ------------------------------------------------------------ */
59
61#define NC(cmd) { \
62 int nc_result=(cmd); \
63 if(nc_result!=NC_NOERR) \
64 ERRMSG("%s", nc_strerror(nc_result)); \
65}
66
67/* ------------------------------------------------------------
68 Structs...
69 ------------------------------------------------------------ */
70
72typedef struct {
73
75 double time[L1_NTRACK][L1_NXTRACK];
76
79
82
84 double sat_z[L1_NTRACK];
85
87 double sat_lon[L1_NTRACK];
88
90 double sat_lat[L1_NTRACK];
91
93 double nu_lw[L1_NCHAN_LW];
94
97
99 float nedn_lw[L1_NFOV][L1_NCHAN_LW];
100
102 short qual_lw[L1_NTRACK][L1_NXTRACK][L1_NFOV];
103
105 double nu_mw[L1_NCHAN_MW];
106
109
111 float nedn_mw[L1_NFOV][L1_NCHAN_MW];
112
114 short qual_mw[L1_NTRACK][L1_NXTRACK][L1_NFOV];
115
117 double nu_sw[L1_NCHAN_SW];
118
121
123 float nedn_sw[L1_NFOV][L1_NCHAN_SW];
124
126 short qual_sw[L1_NTRACK][L1_NXTRACK][L1_NFOV];
127
128} cris_l1_t;
129
131typedef struct {
132
135
138
140 int nfov;
141
144
147
150
153
156
159
162
163} pert_t;
164
166typedef struct {
167
169 int nds;
170
172 int np;
173
175 double time[NDS][NPG];
176
178 double z[NDS][NPG];
179
181 double lon[NDS][NPG];
182
184 double lat[NDS][NPG];
185
187 double p[NDS][NPG];
188
190 double t[NDS][NPG];
191
193 double t_apr[NDS][NPG];
194
196 double t_tot[NDS][NPG];
197
199 double t_noise[NDS][NPG];
200
202 double t_fm[NDS][NPG];
203
205 double t_cont[NDS][NPG];
206
208 double t_res[NDS][NPG];
209
211 double chisq[NDS];
212
213} ret_t;
214
216typedef struct {
217
219 int nx;
220
222 int ny;
223
225 double time;
226
228 double z;
229
231 double lon[WX][WY];
232
234 double lat[WX][WY];
235
237 double x[WX];
238
240 double y[WY];
241
243 double temp[WX][WY];
244
246 double bg[WX][WY];
247
249 double pt[WX][WY];
250
252 double fit[WX][WY];
253
255 double var[WX][WY];
256
257} wave_t;
258
259/* ------------------------------------------------------------
260 Functions...
261 ------------------------------------------------------------ */
262
264void add_att(
265 const int ncid,
266 const int varid,
267 const char *unit,
268 const char *long_name);
269
271void add_var(
272 const int ncid,
273 const char *varname,
274 const char *unit,
275 const char *longname,
276 int type,
277 int dimid[],
278 int *varid,
279 int ndims);
280
282void background_poly(
283 wave_t * wave,
284 int dim_x,
285 int dim_y);
286
289 const double *xx,
290 double *yy,
291 const int n,
292 const int dim);
293
296 wave_t * wave,
297 int npts_x,
298 int npts_y);
299
302 wave_t * wave);
303
305void create_noise(
306 wave_t * wave,
307 double nedt);
308
310void create_wave(
311 wave_t * wave,
312 double amp,
313 double lx,
314 double ly,
315 double phi,
316 double fwhm);
317
319void day2doy(
320 const int year,
321 const int mon,
322 const int day,
323 int *doy);
324
326void doy2day(
327 const int year,
328 const int doy,
329 int *mon,
330 int *day);
331
333void fit_wave(
334 wave_t * wave,
335 double amp,
336 double phi,
337 double kx,
338 double ky,
339 double *chisq);
340
342void fft_help(
343 double *fcReal,
344 double *fcImag,
345 int n);
346
348void fft(
349 wave_t * wave,
350 double *Amax,
351 double *phimax,
352 double *lhmax,
353 double *kxmax,
354 double *kymax,
355 double *alphamax,
356 double *betamax,
357 char *filename);
358
360void gauss(
361 wave_t * wave,
362 double fwhm);
363
365void hamming(
366 wave_t * wave,
367 int nit);
368
370void intpol_x(
371 wave_t * wave,
372 int n);
373
375void median(
376 wave_t * wave,
377 int dx);
378
380void merge_y(
381 wave_t * wave1,
382 wave_t * wave2);
383
385void noise(
386 wave_t * wave,
387 double *mu,
388 double *sig);
389
391void noise_pert(
392 pert_t * pert,
393 int track0,
394 int track1,
395 double *mu,
396 double *sig);
397
399void period(
400 wave_t * wave,
401 double lxymax,
402 double dlxy,
403 double *Amax,
404 double *phimax,
405 double *lhmax,
406 double *kxmax,
407 double *kymax,
408 double *alphamax,
409 double *betamax,
410 char *filename);
411
414 pert_t * pert,
415 wave_t * wave,
416 int track0,
417 int track1,
418 int xtrack0,
419 int xtrack1);
420
422int read_cris_l1(
423 char *filename,
424 cris_l1_t * l1,
425 int apo);
426
428void read_pert(
429 char *filename,
430 char *pertname,
431 int dc,
432 pert_t * pert);
433
435void read_retr(
436 char *filename,
437 ret_t * ret);
438
440void read_retr_help(
441 double *help,
442 int nds,
443 int np,
444 double mat[NDS][NPG]);
445
447void read_wave(
448 char *filename,
449 wave_t * wave);
450
453 cris_l1_t * cris_l1,
454 double *nu,
455 int nd,
456 wave_t * wave);
457
459void ret2wave(
460 ret_t * ret,
461 wave_t * wave,
462 int dataset,
463 int ip);
464
466void variance(
467 wave_t * wave,
468 double dh);
469
471void write_wave(
472 char *filename,
473 wave_t * wave);
JURASSIC library declarations.
void hamming(wave_t *wave, int nit)
Apply Hamming filter to perturbations...
Definition: libcris.c:595
void day2doy(const int year, const int mon, const int day, int *doy)
Get day of year from date.
Definition: libcris.c:279
void merge_y(wave_t *wave1, wave_t *wave2)
Merge wave structs in y-direction.
Definition: libcris.c:743
void fit_wave(wave_t *wave, double amp, double phi, double kx, double ky, double *chisq)
Evaluate wave fit...
Definition: libcris.c:328
void create_wave(wave_t *wave, double amp, double lx, double ly, double phi, double fwhm)
Add linear wave pattern...
Definition: libcris.c:250
void noise_pert(pert_t *pert, int track0, int track1, double *mu, double *sig)
Estimate noise from perurbations.
Definition: libcris.c:821
void rad2wave(cris_l1_t *cris_l1, double *nu, int nd, wave_t *wave)
Convert CrIS radiance data to wave analysis struct.
void background_poly_help(const double *xx, double *yy, const int n, const int dim)
Get background based on polynomial fits.
Definition: libcris.c:47
#define PERT_NXTRACK
Across-track size of perturbation data.
Definition: libcris.h:42
void fft_help(double *fcReal, double *fcImag, int n)
Calculate 1-D FFT...
Definition: libcris.c:354
#define L1_NCHAN_LW
Number of CrIS longwave radiance channels.
Definition: libcris.h:30
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
Definition: libcris.c:151
#define L1_NXTRACK
Across-track size of CrIS radiance granule.
Definition: libcris.h:24
#define L1_NTRACK
Along-track size of CrIS radiance granule.
Definition: libcris.h:21
void intpol_x(wave_t *wave, int n)
Interpolate to regular grid in x-direction.
Definition: libcris.c:624
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: libcris.c:393
#define L1_NFOV
Number of field of views of CrIS radiance granule.
Definition: libcris.h:27
#define WX
Across-track size of wave analysis data.
Definition: libcris.h:48
void noise(wave_t *wave, double *mu, double *sig)
Estimate noise.
Definition: libcris.c:776
void read_retr_help(double *help, int nds, int np, double mat[NDS][NPG])
Convert array.
Definition: libcris.c:1567
#define PERT_NTRACK
Along-track size of perturbation data.
Definition: libcris.h:39
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
Definition: libcris.c:101
void create_noise(wave_t *wave, double nedt)
Add noise to perturbations and temperatures...
Definition: libcris.c:229
int read_cris_l1(char *filename, cris_l1_t *l1, int apo)
Read CrIS Level-1 data.
Definition: libcris.c:1100
void variance(wave_t *wave, double dh)
Compute local variance.
Definition: libcris.c:1769
#define NDS
Maximum number of data sets per granule.
Definition: libcris.h:15
void ret2wave(ret_t *ret, wave_t *wave, int dataset, int ip)
Convert CrIS retrieval results to wave analysis struct.
Definition: libcris.c:1715
void pert2wave(pert_t *pert, wave_t *wave, int track0, int track1, int xtrack0, int xtrack1)
Convert radiance perturbation data to wave analysis struct.
#define L1_NCHAN_MW
Number of CrIS midwave radiance channels.
Definition: libcris.h:33
#define L1_NCHAN_SW
Number of CrIS shortwave radiance channels.
Definition: libcris.h:36
#define NPG
Maximum number of data points per granule.
Definition: libcris.h:18
#define PERT_NFOV
Number of field of views of perturbation data.
Definition: libcris.h:45
void add_att(const int ncid, const int varid, const char *unit, const char *long_name)
Add variable attributes to netCDF file.
Definition: libcris.c:5
void read_retr(char *filename, ret_t *ret)
Read CrIS retrieval data.
Definition: libcris.c:1401
void doy2day(const int year, const int doy, int *mon, int *day)
Get date from day of year.
Definition: libcris.c:298
void create_background(wave_t *wave)
Set background...
Definition: libcris.c:204
void read_pert(char *filename, char *pertname, int dc, pert_t *pert)
Read radiance perturbation data.
Definition: libcris.c:1270
#define WY
Along-track size of wave analysis data.
Definition: libcris.h:51
void read_wave(char *filename, wave_t *wave)
Read wave analysis data.
Definition: libcris.c:1582
void gauss(wave_t *wave, double fwhm)
Apply Gaussian filter to perturbations...
Definition: libcris.c:555
void add_var(const 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: libcris.c:20
void median(wave_t *wave, int dx)
Apply median filter to perturbations...
Definition: libcris.c:702
void write_wave(char *filename, wave_t *wave)
Write wave analysis data.
Definition: libcris.c:1819
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: libcris.c:868
CrIS Level-1 data.
Definition: libcris.h:72
Perturbation data.
Definition: libcris.h:131
int nfov
Number of field of views.
Definition: libcris.h:140
int ntrack
Number of along-track values.
Definition: libcris.h:134
int nxtrack
Number of across-track values.
Definition: libcris.h:137
Retrieval results.
Definition: libcris.h:166
int nds
Number of data sets.
Definition: libcris.h:169
int np
Number of data points.
Definition: libcris.h:172
Wave analysis data.
Definition: libcris.h:216
int nx
Number of across-track values.
Definition: libcris.h:219
int ny
Number of along-track values.
Definition: libcris.h:222
double z
Altitude [km].
Definition: libcris.h:228
double time
Time (seconds since 2000-01-01T00:00Z).
Definition: libcris.h:225