30 {
31
33
34 double x0[3], x1[3], x2[3];
35
36
37 if (argc < 3)
38 ERRMSG(
"Give parameters: <ctl> <pert.nc>");
39
40
42
43
45
46
47 double dmin = 1e100;
48 double dmax = -1e100;
49 double dmu = 0;
50 int n = 0;
51
52
53 for (
int itrack = 0; itrack < pert->
ntrack; itrack++) {
57 double d = 2. *
RE * asin(
DIST(x0, x1) / (2. *
RE));
58 dmin = GSL_MIN(dmin, d);
59 dmax = GSL_MAX(dmax, d);
60 dmu += d;
61 n++;
62 }
63
64
65 printf("\nmean_swath_width= %.1f km\n", dmu / n);
66 printf("minimum_swath_width= %.1f km\n", dmin);
67 printf("maximum_swath_width= %.1f km\n", dmax);
68
69
70 dmin = 1e100;
71 dmax = -1e100;
72 dmu = 0;
73 n = 0;
74
75
76 for (
int itrack = 0; itrack < pert->
ntrack; itrack++) {
77 for (
int ixtrack = 0; ixtrack < pert->
nxtrack - 1; ixtrack++) {
78 geo2cart(0, pert->
lon[itrack][ixtrack], pert->
lat[itrack][ixtrack], x0);
80 pert->
lat[itrack][ixtrack + 1], x1);
81 double d = 2. *
RE * asin(
DIST(x0, x1) / (2. *
RE));
82 dmin = GSL_MIN(dmin, d);
83 dmax = GSL_MAX(dmax, d);
84 dmu += d;
85 n++;
86 }
87 }
88
89
90 printf("\nmean_across_track_sampling_distance= %.1f km\n", dmu / n);
91 printf("minimum_across_track_sampling_distance= %.1f km\n", dmin);
92 printf("maximum_across_track_sampling_distance= %.1f km\n", dmax);
93
94
95 dmin = 1e100;
96 dmax = -1e100;
97 dmu = 0;
98 n = 0;
99
100
101 for (
int itrack = 0; itrack < pert->
ntrack - 1; itrack++) {
102 for (
int ixtrack = 0; ixtrack < pert->
nxtrack; ixtrack++) {
103 geo2cart(0, pert->
lon[itrack][ixtrack], pert->
lat[itrack][ixtrack], x0);
105 pert->
lat[itrack + 1][ixtrack], x1);
106 double d = 2. *
RE * asin(
DIST(x0, x1) / (2. *
RE));
107 dmin = GSL_MIN(dmin, d);
108 dmax = GSL_MAX(dmax, d);
109 dmu += d;
110 n++;
111 }
112 }
113
114
115 printf("\nmean_along_track_sampling_distance= %.1f km\n", dmu / n);
116 printf("minimum_along_track_sampling_distance= %.1f km\n", dmin);
117 printf("maximum_along_track_sampling_distance= %.1f km\n", dmax);
118
119
120 dmin = 1e100;
121 dmax = -1e100;
122 dmu = 0;
123 n = 0;
124
125
126 for (
int itrack = 0; itrack < pert->
ntrack - 1; itrack++) {
130 pert->
lat[itrack][pert->
nxtrack / 2 + 1], x1);
132 pert->
lat[itrack + 1][pert->
nxtrack / 2], x2);
133 for (int i = 0; i < 3; i++) {
134 x1[i] -= x0[i];
135 x2[i] -= x0[i];
136 }
137 double d = acos(
DOTP(x1, x2) / (
NORM(x1) *
NORM(x2))) * 180. / M_PI;
138 dmin = GSL_MIN(dmin, d);
139 dmax = GSL_MAX(dmax, d);
140 dmu += d;
141 n++;
142 }
143
144
145 printf("\nmean_across_track_angle= %.1f deg\n", dmu / n);
146 printf("minimum_across_track_angle= %.1f deg\n", dmin);
147 printf("maximum_across_track_angle= %.1f deg\n", dmax);
148
149
150 free(pert);
151
152 return EXIT_SUCCESS;
153}
void geo2cart(const double z, const double lon, const double lat, double *x)
Convert geolocation to Cartesian coordinates.
#define RE
Mean radius of Earth [km].
#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 DIST(a, b)
Compute Cartesian distance between two vectors.
void read_pert(char *filename, char *pertname, pert_t *pert)
Read radiance perturbation data.
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].