13    ERRMSG(
"Give parameters: <ctl> <l1b_file> <spec.tab>");
 
   16  const int apo = (int) 
scan_ctl(argc, argv, 
"APO", -1, 
"0", NULL);
 
   17  int track = (int) 
scan_ctl(argc, argv, 
"TRACK", -1, 
"0", NULL);
 
   18  int xtrack = (int) 
scan_ctl(argc, argv, 
"XTRACK", -1, 
"0", NULL);
 
   19  int ifov = (int) 
scan_ctl(argc, argv, 
"IFOV", -1, 
"0", NULL);
 
   20  const double lon = (int) 
scan_ctl(argc, argv, 
"LON", -1, 
"-999", NULL);
 
   21  const double lat = (int) 
scan_ctl(argc, argv, 
"LAT", -1, 
"-999", NULL);
 
   25    ERRMSG(
"Cannot read CrIS Level-1B file!");
 
   28  if (lon >= -180 && lon <= 180 && lat >= -90 && lat <= 90) {
 
   29    double dmin = 1e100, x0[3], x1[3];
 
   31    for (
int track2 = 0; track2 < 
L1_NTRACK; track2++)
 
   32      for (
int xtrack2 = 0; xtrack2 < 
L1_NXTRACK; xtrack2++)
 
   33        for (
int ifov2 = 0; ifov2 < 
L1_NFOV; ifov2++) {
 
   35                   l1.
lat[track2][xtrack2][ifov2], x1);
 
   36          if (
DIST2(x0, x1) < dmin) {
 
   44      ERRMSG(
"Geolocation not covered by granule!");
 
   45    LOG(1, 
"nearest footprint: lon= %g, lat= %g, track= %d, xtrack=%d",
 
   46        l1.
lon[track][xtrack][ifov], l1.
lat[track][xtrack][ifov],
 
   52    ERRMSG(
"Along-track index out of range!");
 
   54    ERRMSG(
"Across-track index out of range!");
 
   55  if (ifov < 0 || ifov >= 
L1_NFOV)
 
   56    ERRMSG(
"Field of view index out of range!");
 
   59  LOG(1, 
"Write spectrum: %s", argv[3]);
 
   60  if (!(out = fopen(argv[3], 
"w")))
 
   61    ERRMSG(
"Cannot create file!");
 
   65          "# $1 = time (seconds since 01-JAN-2000, 00:00 UTC)\n" 
   66          "# $2 = satellite longitude [deg]\n" 
   67          "# $3 = satellite latitude [deg]\n" 
   68          "# $4 = footprint longitude [deg]\n" 
   69          "# $5 = footprint latitude [deg]\n" 
   70          "# $6 = wavenumber [cm^-1]\n" 
   71          "# $7 = brightness temperature [K]\n" 
   72          "# $8 = radiance [W/(m^2 sr cm^-1)]\n" 
   73          "# $9 = noise [W/(m^2 sr cm^-1)]\n" "# $10 = channel index\n\n");
 
   77    fprintf(out, 
"%.2f %g %g %g %g %.4f %g %g %g LW_%03d\n",
 
   78            l1.
time[track][xtrack] - 220838400,
 
   80            l1.
lon[track][xtrack][ifov], l1.
lat[track][xtrack][ifov],
 
   84            l1.
rad_lw[track][xtrack][ifov][ichan] * 1e-3,
 
   85            l1.
nedn_lw[ifov][ichan] * 1e-3, ichan);
 
   89    fprintf(out, 
"%.2f %g %g %g %g %.4f %g %g %g MW_%03d\n",
 
   90            l1.
time[track][xtrack] - 220838400,
 
   92            l1.
lon[track][xtrack][ifov], l1.
lat[track][xtrack][ifov],
 
   96            l1.
rad_mw[track][xtrack][ifov][ichan] * 1e-3,
 
   97            l1.
nedn_mw[ifov][ichan] * 1e-3, ichan);
 
  101    fprintf(out, 
"%.2f %g %g %g %g %.4f %g %g %g SW_%03d\n",
 
  102            l1.
time[track][xtrack] - 220838400,
 
  104            l1.
lon[track][xtrack][ifov], l1.
lat[track][xtrack][ifov],
 
  108            l1.
rad_sw[track][xtrack][ifov][ichan] * 1e-3,
 
  109            l1.
nedn_sw[ifov][ichan] * 1e-3, ichan);
 
double scan_ctl(int argc, char *argv[], const char *varname, const int arridx, const char *defvalue, char *value)
Search control parameter file for variable entry.
 
void geo2cart(const double z, const double lon, const double lat, double *x)
Convert geolocation to Cartesian coordinates.
 
#define BRIGHT(rad, nu)
Compute brightness temperature.
 
#define ERRMSG(...)
Print error message and quit program.
 
#define LOG(level,...)
Print log message.
 
#define DIST2(a, b)
Compute squared distance between two vectors.
 
int read_cris_l1(char *filename, cris_l1_t *l1, int apo)
Read CrIS Level-1 data.
 
#define L1_NCHAN_LW
Number of CrIS longwave radiance channels.
 
#define L1_NXTRACK
Across-track size of CrIS radiance granule.
 
#define L1_NTRACK
Along-track size of CrIS radiance granule.
 
#define L1_NFOV
Number of field of views of CrIS radiance granule.
 
#define L1_NCHAN_MW
Number of CrIS midwave radiance channels.
 
#define L1_NCHAN_SW
Number of CrIS shortwave radiance channels.
 
int main(int argc, char *argv[])
 
double nu_sw[L1_NCHAN_SW]
Shortwave channel frequencies [cm^-1].
 
float nedn_sw[L1_NFOV][L1_NCHAN_SW]
Longwave radiance noise [W/(m^2 sr cm^-1)].
 
float rad_mw[L1_NTRACK][L1_NXTRACK][L1_NFOV][L1_NCHAN_MW]
Midwave radiance [W/(m^2 sr cm^-1)].
 
float nedn_mw[L1_NFOV][L1_NCHAN_MW]
Midwave radiance noise [W/(m^2 sr cm^-1)].
 
double nu_mw[L1_NCHAN_MW]
Midwave channel frequencies [cm^-1].
 
float rad_sw[L1_NTRACK][L1_NXTRACK][L1_NFOV][L1_NCHAN_SW]
Shortwave radiance [W/(m^2 sr cm^-1)].
 
float nedn_lw[L1_NFOV][L1_NCHAN_LW]
Longwave radiance noise [W/(m^2 sr cm^-1)].
 
double lon[L1_NTRACK][L1_NXTRACK][L1_NFOV]
Footprint longitude [deg].
 
float rad_lw[L1_NTRACK][L1_NXTRACK][L1_NFOV][L1_NCHAN_LW]
Longwave radiance [W/(m^2 sr cm^-1)].
 
double sat_lat[L1_NTRACK]
Satellite latitude [deg].
 
double time[L1_NTRACK][L1_NXTRACK]
Time (seconds since 2000-01-01T00:00Z).
 
double sat_lon[L1_NTRACK]
Satellite longitude [deg].
 
double nu_lw[L1_NCHAN_LW]
Longwave channel frequencies [cm^-1].
 
double lat[L1_NTRACK][L1_NXTRACK][L1_NFOV]
Footprint latitude [deg].