48 ret_time[
NPG][
NLAT], mu, sig_apr, sig_ret, tbg[
NDS], tabg[
NDS];
56 ERRMSG(
"Give parameters: <ctl> <zm.tab> <airs1.nc> [<airs2.nc> ...]");
60 (int)
scan_ctl(argc, argv,
"BG_POLY_X", -1,
"5", NULL);
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);
69 ERRMSG(
"Too many latitudes!");
72 for (
int i = 3; i < argc; i++) {
75 if (nc_open(argv[i], NC_WRITE, &ncid) != NC_NOERR)
82 for (
int ip = 0; ip < ret.
np; ip++) {
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);
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);
101 for (
int ids = 0; ids < ret.
nds; ids++) {
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]))
112 (int) ((ret.
lat[ids][ip] + 90.) / 180. * (double) nlat);
113 if (ilat < 0 || ilat >= nlat)
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);
132 printf(
"Write AIRS zonal mean data: %s\n", argv[2]);
133 if (!(out = fopen(argv[2],
"w")))
134 ERRMSG(
"Cannot create file!");
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");
150 for (
int ilat = 0; ilat < nlat; ilat++) {
156 for (
int ip = 0; ip < ret.
np; ip++) {
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]);
double scan_ctl(int argc, char *argv[], const char *varname, int arridx, const char *defvalue, char *value)
Search control parameter file for variable entry.
#define ERRMSG(...)
Print error message and quit program.
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
void noise(wave_t *wave, double *mu, double *sig)
Estimate noise.
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
void ret2wave(ret_t *ret, wave_t *wave, int dataset, int ip)
Convert AIRS retrieval results to wave analysis struct.
void read_retr(char *filename, ret_t *ret)
Read AIRS retrieval data.
AIRS Code Collection library declarations.
#define NDS
Maximum number of data sets per granule.
#define NPG
Maximum number of data points per granule.
double t_apr[NDS][NPG]
Temperature (a priori data) [K].
double lat[NDS][NPG]
Latitude [deg].
double t[NDS][NPG]
Temperature [K].
double z[NDS][NPG]
Altitude [km].
int nds
Number of data sets.
int np
Number of data points.
double time[NDS][NPG]
Time (seconds since 2000-01-01T00:00Z).
double lon[NDS][NPG]
Longitude [deg].
int nx
Number of across-track values.
int ny
Number of along-track values.
double bg[WX][WY]
Background [K].
int main(int argc, char *argv[])