56 double dmin = 1e100, x0[3], x1[3];
58 int orb = 0, track0 = 0, xtrack0 = 0;
62 ERRMSG(
"Give parameters: <ctl> <pert.nc> <lon0> <lat0> <overpass.tab>");
65 const double lon0 = atof(argv[3]);
66 const double lat0 = atof(argv[4]);
69 scan_ctl(argc, argv,
"PERTNAME", -1,
"4mu", pertname);
70 const double orblat =
scan_ctl(argc, argv,
"ORBLAT", -1,
"0", NULL);
71 const double rmax =
scan_ctl(argc, argv,
"RMAX", -1,
"100", NULL);
72 const double obsz =
scan_ctl(argc, argv,
"OBSZ", -1,
"", NULL);
84 printf(
"Write overpass data file: %s\n", argv[5]);
85 if (!(out = fopen(argv[5],
"w")))
86 ERRMSG(
"Cannot create file!");
90 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
91 "# $2 = time (string)\n"
92 "# $3 = longitude [deg]\n"
93 "# $4 = latitude [deg]\n"
94 "# $5 = along-track index\n"
95 "# $6 = across-track index\n"
96 "# $7 = orbit number\n"
97 "# $8 = ascending (1=yes, 0=no)\n"
98 "# $9 = scan angle [deg]\n" "# $10 = distance [km]\n\n");
101 for (
int track = 0; track < pert->
ntrack; track++) {
105 if (pert->
lat[track - 1][pert->
nxtrack / 2] <= orblat
106 && pert->
lat[track][pert->
nxtrack / 2] >= orblat) {
109 if (sqrt(dmin) <= rmax)
118 for (
int xtrack = 0; xtrack < pert->
nxtrack; xtrack++) {
119 geo2cart(0, pert->
lon[track][xtrack], pert->
lat[track][xtrack], x1);
120 if (
DIST2(x0, x1) < dmin) {
121 dmin =
DIST2(x0, x1);
129 if (sqrt(dmin) <= rmax)
152 double xf[3], xs[3], xsf[3], remain;
154 int year, mon, day, hour, min, sec;
157 geo2cart(0, pert->
lon[track0][xtrack0], pert->
lat[track0][xtrack0], xf);
162 for (
int i = 0; i < 3; i++) {
166 double alpha = 180. / M_PI * acos(
DOTP(xf, xsf) /
NORM(xf) /
NORM(xsf));
167 if (xtrack0 < pert->nxtrack / 2)
171 int asc = (pert->
lat[track0 > 0 ? track0 : track0 + 1][pert->
nxtrack / 2]
173 0 ? track0 - 1 : track0][pert->
nxtrack / 2]);
177 &hour, &min, &sec, &remain);
179 "%.2f %d-%02d-%02dT%02d:%02d:%02dZ %g %g %d %d %d %d %g %g\n",
180 pert->
time[track0][xtrack0], year, mon, day, hour, min, sec,
181 pert->
lon[track0][xtrack0], pert->
lat[track0][xtrack0],
182 track0, xtrack0, orb, asc, alpha, sqrt(dmin));
void jsec2time(const double jsec, int *year, int *mon, int *day, int *hour, int *min, int *sec, double *remain)
Convert seconds to date.
double scan_ctl(int argc, char *argv[], const char *varname, 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 LEN
Maximum length of ASCII data lines.
#define DOTP(a, b)
Compute dot product of two vectors.
#define ERRMSG(...)
Print error message and quit program.
#define NORM(a)
Compute norm of a vector.
#define ALLOC(ptr, type, n)
Allocate memory.
#define DIST2(a, b)
Compute squared distance between two vectors.
void read_pert(char *filename, char *pertname, pert_t *pert)
Read radiance perturbation data.
AIRS Code Collection library declarations.
int main(int argc, char *argv[])
void write_results(FILE *out, pert_t *pert, int track0, int xtrack0, int orb, double dmin, double obsz)
double time[PERT_NTRACK][PERT_NXTRACK]
Time (seconds since 2000-01-01T00:00Z).
int ntrack
Number of along-track values.
int nxtrack
Number of across-track values.
double lon[PERT_NTRACK][PERT_NXTRACK]
Longitude [deg].
double lat[PERT_NTRACK][PERT_NXTRACK]
Latitude [deg].