CrIS Code Collection
Functions
spec2tab.c File Reference
#include "libcris.h"

Go to the source code of this file.

Functions

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

Function Documentation

◆ main()

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

Definition at line 3 of file spec2tab.c.

5 {
6
7 static cris_l1_t l1;
8
9 FILE *out;
10
11 /* Check arguments... */
12 if (argc < 4)
13 ERRMSG("Give parameters: <ctl> <l1b_file> <spec.tab>");
14
15 /* Get control parameters... */
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);
22
23 /* Read CrIS data... */
24 if (!read_cris_l1(argv[2], &l1, apo))
25 ERRMSG("Cannot read CrIS Level-1B file!");
26
27 /* Find nearest footprint... */
28 if (lon >= -180 && lon <= 180 && lat >= -90 && lat <= 90) {
29 double dmin = 1e100, x0[3], x1[3];
30 geo2cart(0, lon, lat, x0);
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++) {
34 geo2cart(0, l1.lon[track2][xtrack2][ifov2],
35 l1.lat[track2][xtrack2][ifov2], x1);
36 if (DIST2(x0, x1) < dmin) {
37 dmin = DIST2(x0, x1);
38 track = track2;
39 xtrack = xtrack2;
40 ifov = ifov2;
41 }
42 }
43 if (dmin > 2500)
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],
47 track, xtrack);
48 }
49
50 /* Check indices... */
51 if (track < 0 || track >= L1_NTRACK)
52 ERRMSG("Along-track index out of range!");
53 if (xtrack < 0 || xtrack >= L1_NXTRACK)
54 ERRMSG("Across-track index out of range!");
55 if (ifov < 0 || ifov >= L1_NFOV)
56 ERRMSG("Field of view index out of range!");
57
58 /* Create file... */
59 LOG(1, "Write spectrum: %s", argv[3]);
60 if (!(out = fopen(argv[3], "w")))
61 ERRMSG("Cannot create file!");
62
63 /* Write header... */
64 fprintf(out,
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");
74
75 /* Write data... */
76 for (int ichan = 0; ichan < L1_NCHAN_LW; ichan++)
77 fprintf(out, "%.2f %g %g %g %g %.4f %g %g %g LW_%03d\n",
78 l1.time[track][xtrack] - 220838400,
79 l1.sat_lon[track], l1.sat_lat[track],
80 l1.lon[track][xtrack][ifov], l1.lat[track][xtrack][ifov],
81 l1.nu_lw[ichan],
82 BRIGHT(l1.rad_lw[track][xtrack][ifov][ichan] * 1e-3,
83 l1.nu_lw[ichan]),
84 l1.rad_lw[track][xtrack][ifov][ichan] * 1e-3,
85 l1.nedn_lw[ifov][ichan] * 1e-3, ichan);
86
87 fprintf(out, "\n");
88 for (int ichan = 0; ichan < L1_NCHAN_MW; ichan++)
89 fprintf(out, "%.2f %g %g %g %g %.4f %g %g %g MW_%03d\n",
90 l1.time[track][xtrack] - 220838400,
91 l1.sat_lon[track], l1.sat_lat[track],
92 l1.lon[track][xtrack][ifov], l1.lat[track][xtrack][ifov],
93 l1.nu_mw[ichan],
94 BRIGHT(l1.rad_mw[track][xtrack][ifov][ichan] * 1e-3,
95 l1.nu_mw[ichan]),
96 l1.rad_mw[track][xtrack][ifov][ichan] * 1e-3,
97 l1.nedn_mw[ifov][ichan] * 1e-3, ichan);
98
99 fprintf(out, "\n");
100 for (int ichan = 0; ichan < L1_NCHAN_SW; ichan++)
101 fprintf(out, "%.2f %g %g %g %g %.4f %g %g %g SW_%03d\n",
102 l1.time[track][xtrack] - 220838400,
103 l1.sat_lon[track], l1.sat_lat[track],
104 l1.lon[track][xtrack][ifov], l1.lat[track][xtrack][ifov],
105 l1.nu_sw[ichan],
106 BRIGHT(l1.rad_sw[track][xtrack][ifov][ichan] * 1e-3,
107 l1.nu_sw[ichan]),
108 l1.rad_sw[track][xtrack][ifov][ichan] * 1e-3,
109 l1.nedn_sw[ifov][ichan] * 1e-3, ichan);
110
111 /* Close file... */
112 fclose(out);
113
114 return EXIT_SUCCESS;
115}
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
void geo2cart(const double z, const double lon, const double lat, double *x)
Convert geolocation to Cartesian coordinates.
Definition: jurassic.c:3500
#define BRIGHT(rad, nu)
Compute brightness temperature.
Definition: jurassic.h:126
#define ERRMSG(...)
Print error message and quit program.
Definition: jurassic.h:237
#define LOG(level,...)
Print log message.
Definition: jurassic.h:221
#define DIST2(a, b)
Compute squared distance between two vectors.
Definition: jurassic.h:137
int read_cris_l1(char *filename, cris_l1_t *l1, int apo)
Read CrIS Level-1 data.
Definition: libcris.c:1100
#define L1_NCHAN_LW
Number of CrIS longwave radiance channels.
Definition: libcris.h:30
#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
#define L1_NFOV
Number of field of views of CrIS radiance granule.
Definition: libcris.h:27
#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
CrIS Level-1 data.
Definition: libcris.h:72
double nu_sw[L1_NCHAN_SW]
Shortwave channel frequencies [cm^-1].
Definition: libcris.h:117
float nedn_sw[L1_NFOV][L1_NCHAN_SW]
Longwave radiance noise [W/(m^2 sr cm^-1)].
Definition: libcris.h:123
float rad_mw[L1_NTRACK][L1_NXTRACK][L1_NFOV][L1_NCHAN_MW]
Midwave radiance [W/(m^2 sr cm^-1)].
Definition: libcris.h:108
float nedn_mw[L1_NFOV][L1_NCHAN_MW]
Midwave radiance noise [W/(m^2 sr cm^-1)].
Definition: libcris.h:111
double nu_mw[L1_NCHAN_MW]
Midwave channel frequencies [cm^-1].
Definition: libcris.h:105
float rad_sw[L1_NTRACK][L1_NXTRACK][L1_NFOV][L1_NCHAN_SW]
Shortwave radiance [W/(m^2 sr cm^-1)].
Definition: libcris.h:120
float nedn_lw[L1_NFOV][L1_NCHAN_LW]
Longwave radiance noise [W/(m^2 sr cm^-1)].
Definition: libcris.h:99
double lon[L1_NTRACK][L1_NXTRACK][L1_NFOV]
Footprint longitude [deg].
Definition: libcris.h:78
float rad_lw[L1_NTRACK][L1_NXTRACK][L1_NFOV][L1_NCHAN_LW]
Longwave radiance [W/(m^2 sr cm^-1)].
Definition: libcris.h:96
double sat_lat[L1_NTRACK]
Satellite latitude [deg].
Definition: libcris.h:90
double time[L1_NTRACK][L1_NXTRACK]
Time (seconds since 2000-01-01T00:00Z).
Definition: libcris.h:75
double sat_lon[L1_NTRACK]
Satellite longitude [deg].
Definition: libcris.h:87
double nu_lw[L1_NCHAN_LW]
Longwave channel frequencies [cm^-1].
Definition: libcris.h:93
double lat[L1_NTRACK][L1_NXTRACK][L1_NFOV]
Footprint latitude [deg].
Definition: libcris.h:81
Here is the call graph for this function: