AIRS Code Collection
Macros | Functions
zm_ret.c File Reference

Calculate zonal means of retrieval data. More...

#include "libairs.h"

Go to the source code of this file.

Macros

#define NLAT   180
 

Functions

int main (int argc, char *argv[])
 

Detailed Description

Calculate zonal means of retrieval data.

Definition in file zm_ret.c.

Macro Definition Documentation

◆ NLAT

#define NLAT   180

Definition at line 33 of file zm_ret.c.

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 39 of file zm_ret.c.

41 {
42
43 static ret_t ret;
44 static wave_t wave;
45
46 static double apr_tm[NPG][NLAT], apr_var[NPG][NLAT], apr_noise[NPG][NLAT],
47 ret_tm[NPG][NLAT], ret_var[NPG][NLAT], ret_noise[NPG][NLAT],
48 ret_time[NPG][NLAT], mu, sig_apr, sig_ret, tbg[NDS], tabg[NDS];
49
50 static int n[NPG][NLAT], ncid;
51
52 FILE *out;
53
54 /* Check arguments... */
55 if (argc < 4)
56 ERRMSG("Give parameters: <ctl> <zm.tab> <airs1.nc> [<airs2.nc> ...]");
57
58 /* Get control parameters... */
59 const int bg_poly_x =
60 (int) scan_ctl(argc, argv, "BG_POLY_X", -1, "5", NULL);
61 const int bg_poly_y =
62 (int) scan_ctl(argc, argv, "BG_POLY_Y", -1, "0", NULL);
63 const int bg_smooth_x =
64 (int) scan_ctl(argc, argv, "BG_SMOOTH_X", -1, "0", NULL);
65 const int bg_smooth_y =
66 (int) scan_ctl(argc, argv, "BG_SMOOTH_Y", -1, "0", NULL);
67 const int nlat = (int) scan_ctl(argc, argv, "NLAT", -1, "36", NULL);
68 if (nlat > NLAT)
69 ERRMSG("Too many latitudes!");
70
71 /* Loop over files... */
72 for (int i = 3; i < argc; i++) {
73
74 /* Read AIRS data... */
75 if (nc_open(argv[i], NC_WRITE, &ncid) != NC_NOERR)
76 continue;
77 else
78 nc_close(ncid);
79 read_retr(argv[i], &ret);
80
81 /* Loop over altitudes... */
82 for (int ip = 0; ip < ret.np; ip++) {
83
84 /* Compute background... */
85 ret2wave(&ret, &wave, 1, ip);
86 background_poly(&wave, bg_poly_x, bg_poly_y);
87 background_smooth(&wave, bg_smooth_x, bg_smooth_y);
88 for (int ix = 0; ix < wave.nx; ix++)
89 for (int iy = 0; iy < wave.ny; iy++)
90 tbg[iy * 90 + ix] = wave.bg[ix][iy];
91 noise(&wave, &mu, &sig_ret);
92 ret2wave(&ret, &wave, 2, ip);
93 background_poly(&wave, bg_poly_x, bg_poly_y);
94 background_smooth(&wave, bg_smooth_x, bg_smooth_y);
95 for (int ix = 0; ix < wave.nx; ix++)
96 for (int iy = 0; iy < wave.ny; iy++)
97 tabg[iy * 90 + ix] = wave.bg[ix][iy];
98 noise(&wave, &mu, &sig_apr);
99
100 /* Loop over data sets... */
101 for (int ids = 0; ids < ret.nds; ids++) {
102
103 /* Check data... */
104 if (ret.lon[ids][ip] < -180 || ret.lon[ids][ip] > 180
105 || ret.lat[ids][ip] < -90 || ret.lat[ids][ip] > 90
106 || ret.t[ids][ip] < 110 || ret.t[ids][ip] > 390
107 || !gsl_finite(ret.t[ids][ip]))
108 continue;
109
110 /* Get latitude index... */
111 const int ilat =
112 (int) ((ret.lat[ids][ip] + 90.) / 180. * (double) nlat);
113 if (ilat < 0 || ilat >= nlat)
114 continue;
115
116 /* Get zonal mean... */
117 if (gsl_finite(ret.t[ids][ip]) && gsl_finite(tbg[ids])) {
118 ret_time[ip][ilat] += ret.time[ids][ip];
119 ret_tm[ip][ilat] += ret.t[ids][ip];
120 ret_var[ip][ilat] += gsl_pow_2(ret.t[ids][ip] - tbg[ids]);
121 ret_noise[ip][ilat] += gsl_pow_2(sig_ret);
122 apr_tm[ip][ilat] += ret.t_apr[ids][ip];
123 apr_var[ip][ilat] += gsl_pow_2(ret.t_apr[ids][ip] - tabg[ids]);
124 apr_noise[ip][ilat] += gsl_pow_2(sig_apr);
125 n[ip][ilat]++;
126 }
127 }
128 }
129 }
130
131 /* Create output file... */
132 printf("Write AIRS zonal mean data: %s\n", argv[2]);
133 if (!(out = fopen(argv[2], "w")))
134 ERRMSG("Cannot create file!");
135
136 /* Write header... */
137 fprintf(out,
138 "# $1 = time (seconds since 01-JAN-2000, 00:00 UTC)\n"
139 "# $2 = altitude [km]\n"
140 "# $3 = latitude [deg]\n"
141 "# $4 = mean temperature (retrieved) [K]\n"
142 "# $5 = temperature variance (retrieved) [K^2]\n"
143 "# $6 = noise estimate (retrieved) [K^2]\n"
144 "# $7 = mean temperature (a priori) [K]\n"
145 "# $8 = temperature variance (a priori) [K^2]\n"
146 "# $9 = noise estimate (a priori) [K^2]\n"
147 "# $10 = number of data points\n");
148
149 /* Loop over latitudes... */
150 for (int ilat = 0; ilat < nlat; ilat++) {
151
152 /* Write empty line... */
153 fprintf(out, "\n");
154
155 /* Loop over altitudes... */
156 for (int ip = 0; ip < ret.np; ip++) {
157
158 /* Write data... */
159 fprintf(out, "%.2f %g %g %g %g %g %g %g %g %d\n",
160 ret_time[ip][ilat] / n[ip][ilat],
161 ret.z[0][ip], (ilat + 0.5) / nlat * 180. - 90.,
162 ret_tm[ip][ilat] / n[ip][ilat],
163 sqrt(ret_var[ip][ilat] / n[ip][ilat]),
164 sqrt(ret_noise[ip][ilat] / n[ip][ilat]),
165 apr_tm[ip][ilat] / n[ip][ilat],
166 sqrt(apr_var[ip][ilat] / n[ip][ilat]),
167 sqrt(apr_noise[ip][ilat] / n[ip][ilat]), n[ip][ilat]);
168 }
169 }
170
171 /* Close file... */
172 fclose(out);
173
174 return EXIT_SUCCESS;
175}
double scan_ctl(int argc, char *argv[], const char *varname, int arridx, const char *defvalue, char *value)
Search control parameter file for variable entry.
Definition: jurassic.c:5114
#define ERRMSG(...)
Print error message and quit program.
Definition: jurassic.h:237
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
Definition: libairs.c:176
void noise(wave_t *wave, double *mu, double *sig)
Estimate noise.
Definition: libairs.c:798
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
Definition: libairs.c:126
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 read_retr(char *filename, ret_t *ret)
Read AIRS retrieval data.
Definition: libairs.c:1219
#define NDS
Maximum number of data sets per granule.
Definition: libairs.h:99
#define NPG
Maximum number of data points per granule.
Definition: libairs.h:102
Retrieval results.
Definition: libairs.h:237
double t_apr[NDS][NPG]
Temperature (a priori data) [K].
Definition: libairs.h:264
double lat[NDS][NPG]
Latitude [deg].
Definition: libairs.h:255
double t[NDS][NPG]
Temperature [K].
Definition: libairs.h:261
double z[NDS][NPG]
Altitude [km].
Definition: libairs.h:249
int nds
Number of data sets.
Definition: libairs.h:240
int np
Number of data points.
Definition: libairs.h:243
double time[NDS][NPG]
Time (seconds since 2000-01-01T00:00Z).
Definition: libairs.h:246
double lon[NDS][NPG]
Longitude [deg].
Definition: libairs.h:252
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 bg[WX][WY]
Background [K].
Definition: libairs.h:317
#define NLAT
Definition: zm_ret.c:33
Here is the call graph for this function: