AIRS Code Collection
Data Structures | Macros | Functions
diff_apr.c File Reference

Extract differences between retrieval and a priori data. More...

#include <omp.h>
#include <netcdf.h>
#include "jurassic.h"

Go to the source code of this file.

Data Structures

struct  ncd_t
 Buffer for netCDF data. More...
 

Macros

#define NC(cmd)
 Execute netCDF library command and check result. More...
 
#define L1_NCHAN   34
 
#define L1_NTRACK   135
 
#define L1_NXTRACK   90
 
#define L2_NLAY   27
 
#define L2_NTRACK   45
 
#define L2_NXTRACK   30
 

Functions

void read_nc (char *filename, ncd_t *ncd)
 
int main (int argc, char *argv[])
 

Detailed Description

Extract differences between retrieval and a priori data.

Definition in file diff_apr.c.

Macro Definition Documentation

◆ NC

#define NC (   cmd)
Value:
{ \
int nc_result=(cmd); \
if(nc_result!=NC_NOERR) \
ERRMSG("%s", nc_strerror(nc_result)); \
}

Execute netCDF library command and check result.

Definition at line 35 of file diff_apr.c.

◆ L1_NCHAN

#define L1_NCHAN   34

Definition at line 46 of file diff_apr.c.

◆ L1_NTRACK

#define L1_NTRACK   135

Definition at line 49 of file diff_apr.c.

◆ L1_NXTRACK

#define L1_NXTRACK   90

Definition at line 52 of file diff_apr.c.

◆ L2_NLAY

#define L2_NLAY   27

Definition at line 55 of file diff_apr.c.

◆ L2_NTRACK

#define L2_NTRACK   45

Definition at line 58 of file diff_apr.c.

◆ L2_NXTRACK

#define L2_NXTRACK   30

Definition at line 61 of file diff_apr.c.

Function Documentation

◆ read_nc()

void read_nc ( char *  filename,
ncd_t ncd 
)

Definition at line 227 of file diff_apr.c.

229 {
230
231 int varid;
232
233 /* Open netCDF file... */
234 printf("Read netCDF file: %s\n", filename);
235 NC(nc_open(filename, NC_WRITE, &ncd->ncid));
236
237 /* Read Level-1 data... */
238 NC(nc_inq_varid(ncd->ncid, "l1_time", &varid));
239 NC(nc_get_var_double(ncd->ncid, varid, ncd->l1_time[0]));
240 NC(nc_inq_varid(ncd->ncid, "l1_lon", &varid));
241 NC(nc_get_var_double(ncd->ncid, varid, ncd->l1_lon[0]));
242 NC(nc_inq_varid(ncd->ncid, "l1_lat", &varid));
243 NC(nc_get_var_double(ncd->ncid, varid, ncd->l1_lat[0]));
244 NC(nc_inq_varid(ncd->ncid, "l1_sat_z", &varid));
245 NC(nc_get_var_double(ncd->ncid, varid, ncd->l1_sat_z));
246 NC(nc_inq_varid(ncd->ncid, "l1_sat_lon", &varid));
247 NC(nc_get_var_double(ncd->ncid, varid, ncd->l1_sat_lon));
248 NC(nc_inq_varid(ncd->ncid, "l1_sat_lat", &varid));
249 NC(nc_get_var_double(ncd->ncid, varid, ncd->l1_sat_lat));
250 NC(nc_inq_varid(ncd->ncid, "l1_nu", &varid));
251 NC(nc_get_var_double(ncd->ncid, varid, ncd->l1_nu));
252 NC(nc_inq_varid(ncd->ncid, "l1_rad", &varid));
253 NC(nc_get_var_float(ncd->ncid, varid, ncd->l1_rad[0][0]));
254
255 /* Read Level-2 data... */
256 NC(nc_inq_varid(ncd->ncid, "l2_z", &varid));
257 NC(nc_get_var_double(ncd->ncid, varid, ncd->l2_z[0][0]));
258 NC(nc_inq_varid(ncd->ncid, "l2_press", &varid));
259 NC(nc_get_var_double(ncd->ncid, varid, ncd->l2_p));
260 NC(nc_inq_varid(ncd->ncid, "l2_temp", &varid));
261 NC(nc_get_var_double(ncd->ncid, varid, ncd->l2_t[0][0]));
262}
#define NC(cmd)
Execute netCDF library command and check result.
Definition: diff_apr.c:35
double l1_lat[L1_NTRACK][L1_NXTRACK]
Footprint latitude [deg].
Definition: diff_apr.c:83
double l1_lon[L1_NTRACK][L1_NXTRACK]
Footprint longitude [deg].
Definition: diff_apr.c:80
double l2_z[L2_NTRACK][L2_NXTRACK][L2_NLAY]
Altitude [km].
Definition: diff_apr.c:101
double l1_sat_lat[L1_NTRACK]
Satellite latitude [deg].
Definition: diff_apr.c:92
int ncid
NetCDF file ID.
Definition: diff_apr.c:71
double l1_sat_lon[L1_NTRACK]
Satellite longitude [deg].
Definition: diff_apr.c:89
double l2_p[L2_NLAY]
Pressure [hPa].
Definition: diff_apr.c:104
double l2_t[L2_NTRACK][L2_NXTRACK][L2_NLAY]
Temperature [K].
Definition: diff_apr.c:107
double l1_nu[L1_NCHAN]
Channel frequencies [cm^-1].
Definition: diff_apr.c:95
double l1_sat_z[L1_NTRACK]
Satellite altitude [km].
Definition: diff_apr.c:86
float l1_rad[L1_NTRACK][L1_NXTRACK][L1_NCHAN]
Radiance [W/(m^2 sr cm^-1)].
Definition: diff_apr.c:98
double l1_time[L1_NTRACK][L1_NXTRACK]
Time (seconds since 2000-01-01T00:00Z).
Definition: diff_apr.c:77

◆ main()

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

Definition at line 133 of file diff_apr.c.

135 {
136
137 static ctl_t ctl;
138
139 static ncd_t ncd, ncd2;
140
141 static FILE *out;
142
143 static double mean[L2_NLAY], sigma[L2_NLAY], min[L2_NLAY], max[L2_NLAY],
144 tt[L2_NLAY], lon[L2_NLAY], lat[L2_NLAY], temp[L2_NLAY], press[L2_NLAY],
145 z[L2_NLAY];
146
147 /* Check arguments... */
148 if (argc < 5)
149 ERRMSG("Give parameters: <ctl> <airs.nc> <airs2.nc> <diff.tab>");
150
151 /* Read control parameters... */
152 read_ctl(argc, argv, &ctl);
153
154 /* Read netCDF files... */
155 read_nc(argv[2], &ncd);
156 read_nc(argv[3], &ncd2);
157
158 /* Compute differences... */
159 for (int itrack = 0; itrack < L2_NTRACK; itrack++)
160 for (int ixtrack = 0; ixtrack < L2_NXTRACK; ixtrack++) {
161 for (int ip = 0; ip < L2_NLAY; ip++) {
162 if (ncd.l1_time[3 * itrack + 1][3 * ixtrack + 1] !=
163 ncd2.l1_time[3 * itrack + 1][3 * ixtrack + 1]
164 || ncd.l1_lon[3 * itrack + 1][3 * ixtrack + 1] !=
165 ncd2.l1_lon[3 * itrack + 1][3 * ixtrack + 1]
166 || ncd.l1_lat[3 * itrack + 1][3 * ixtrack + 1] !=
167 ncd2.l1_lat[3 * itrack + 1][3 * ixtrack + 1])
168 ERRMSG("Data files do not match!");
169 tt[ip] += ncd.l1_time[3 * itrack + 1][3 * ixtrack + 1];
170 lon[ip] += ncd.l1_lon[3 * itrack + 1][3 * ixtrack + 1];
171 lat[ip] += ncd.l1_lat[3 * itrack + 1][3 * ixtrack + 1];
172 z[ip] += ncd.l2_z[itrack][ixtrack][ip];
173 press[ip] += ncd.l2_p[ip];
174 temp[ip] += ncd.l2_t[itrack][ixtrack][ip];
175 int idx = locate_irr(ncd2.l2_z[itrack][ixtrack], L2_NLAY,
176 ncd.l2_z[itrack][ixtrack][ip]);
177 double tip = LIN(ncd2.l2_z[itrack][ixtrack][idx],
178 ncd2.l2_t[itrack][ixtrack][idx],
179 ncd2.l2_z[itrack][ixtrack][idx + 1],
180 ncd2.l2_t[itrack][ixtrack][idx + 1],
181 ncd.l2_z[itrack][ixtrack][ip]);
182 mean[ip] += tip - ncd.l2_t[itrack][ixtrack][ip];
183 sigma[ip] += gsl_pow_2(tip - ncd.l2_t[itrack][ixtrack][ip]);
184 min[ip] = GSL_MIN(min[ip], tip - ncd.l2_t[itrack][ixtrack][ip]);
185 max[ip] = GSL_MAX(max[ip], tip - ncd.l2_t[itrack][ixtrack][ip]);
186 }
187 }
188
189 /* Create output file... */
190 printf("Write a priori differences data: %s\n", argv[4]);
191 if (!(out = fopen(argv[4], "w")))
192 ERRMSG("Cannot create file!");
193
194 /* Write header... */
195 fprintf(out,
196 "# $1 = time (seconds since 01-JAN-2000, 00:00 UTC)\n"
197 "# $2 = altitude [km]\n"
198 "# $3 = longitude [deg]\n"
199 "# $4 = latitude [deg]\n"
200 "# $5 = pressure (set 1) [hPa]\n"
201 "# $6 = temperature (set 1) [K]\n"
202 "# $7 = temperature difference (mean, set 2 - set 1) [K]\n"
203 "# $8 = temperature difference (sigma, set 2 - set 1) [K]\n"
204 "# $9 = temperature difference (minimum, set 2 - set 1) [K]\n"
205 "# $10 = temperature difference (maximum, set 2 - set 1) [K]\n\n");
206
207 /* Write output... */
208 for (int ip = 0; ip < L2_NLAY; ip++)
209 fprintf(out, "%.2f %g %g %g %g %g %g %g %g %g\n",
210 tt[ip] / (L2_NTRACK * L2_NXTRACK),
211 z[ip] / (L2_NTRACK * L2_NXTRACK),
212 lon[ip] / (L2_NTRACK * L2_NXTRACK),
213 lat[ip] / (L2_NTRACK * L2_NXTRACK),
214 press[ip] / (L2_NTRACK * L2_NXTRACK),
215 temp[ip] / (L2_NTRACK * L2_NXTRACK),
216 mean[ip] / (L2_NTRACK * L2_NXTRACK),
217 sqrt(sigma[ip] / (L2_NTRACK * L2_NXTRACK) -
218 gsl_pow_2(mean[ip] / (L2_NTRACK * L2_NXTRACK))), min[ip],
219 max[ip]);
220
221 /* Close file... */
222 fclose(out);
223}
#define L2_NXTRACK
Definition: diff_apr.c:61
void read_nc(char *filename, ncd_t *ncd)
Definition: diff_apr.c:227
#define L2_NLAY
Definition: diff_apr.c:55
#define L2_NTRACK
Definition: diff_apr.c:58
void read_ctl(int argc, char *argv[], ctl_t *ctl)
Read forward model control parameters.
Definition: jurassic.c:4547
int locate_irr(const double *xx, const int n, const double x)
Find array index for irregular grid.
Definition: jurassic.c:4103
#define ERRMSG(...)
Print error message and quit program.
Definition: jurassic.h:237
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
Definition: jurassic.h:164
Forward model control parameters.
Definition: jurassic.h:541
Buffer for netCDF data.
Definition: diff_apr.c:68
Here is the call graph for this function: