CrIS Code Collection
Functions
sampling.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 sampling.c.

5 {
6
7 static pert_t *pert;
8
9 static double dx[L1_NXTRACK], x0[3], x1[3], x2[3];
10
11 static int nx[L1_NXTRACK];
12
13 /* Check arguments... */
14 if (argc < 3)
15 ERRMSG("Give parameters: <ctl> <pert.nc>");
16
17 /* Allocate... */
18 ALLOC(pert, pert_t, 1);
19
20 /* Read perturbation data... */
21 read_pert(argv[2], "4mu", 0, pert);
22
23 /* Init... */
24 double dmin = 1e100;
25 double dmax = -1e100;
26 double dmu = 0;
27 int n = 0;
28
29 /* Get swath width... */
30 for (int itrack = 0; itrack < pert->ntrack; itrack++) {
31 geo2cart(0, pert->lon[itrack][0][4], pert->lat[itrack][0][4], x0);
32 geo2cart(0, pert->lon[itrack][pert->nxtrack - 1][4],
33 pert->lat[itrack][pert->nxtrack - 1][4], x1);
34 const double d = 2. * RE * asin(DIST(x0, x1) / (2. * RE));
35 dmin = GSL_MIN(dmin, d);
36 dmax = GSL_MAX(dmax, d);
37 dmu += d;
38 n++;
39 }
40
41 /* Write output... */
42 printf("\nmean_swath_width= %.1f km\n", dmu / n);
43 printf("minimum_swath_width= %.1f km\n", dmin);
44 printf("maximum_swath_width= %.1f km\n", dmax);
45
46 /* Init... */
47 dmin = 1e100;
48 dmax = -1e100;
49 dmu = 0;
50 n = 0;
51
52 /* Get across-track sampling distances... */
53 for (int itrack = 0; itrack < pert->ntrack; itrack++) {
54 for (int ixtrack = 0; ixtrack < pert->nxtrack - 1; ixtrack++) {
55 geo2cart(0, pert->lon[itrack][ixtrack][4],
56 pert->lat[itrack][ixtrack][4], x0);
57 geo2cart(0, pert->lon[itrack][ixtrack + 1][4],
58 pert->lat[itrack][ixtrack + 1][4], x1);
59 const double d = 2. * RE * asin(DIST(x0, x1) / (2. * RE));
60 dmin = GSL_MIN(dmin, d);
61 dmax = GSL_MAX(dmax, d);
62 dmu += d;
63 n++;
64 }
65 }
66
67 /* Write output... */
68 printf("\nmean_across_track_sampling_distance= %.1f km | %.1f km\n",
69 dmu / n, dmu / n / 3.);
70 printf("minimum_across_track_sampling_distance= %.1f km | %.1f km\n", dmin,
71 dmin / 3.);
72 printf("maximum_across_track_sampling_distance= %.1f km | %.1f km\n", dmax,
73 dmax / 3.);
74
75 /* Init... */
76 dmin = 1e100;
77 dmax = -1e100;
78 dmu = 0;
79 n = 0;
80
81 /* Get along-track sampling distances... */
82 for (int itrack = 0; itrack < pert->ntrack - 1; itrack++) {
83 for (int ixtrack = 0; ixtrack < pert->nxtrack; ixtrack++) {
84 geo2cart(0, pert->lon[itrack][ixtrack][4],
85 pert->lat[itrack][ixtrack][4], x0);
86 geo2cart(0, pert->lon[itrack + 1][ixtrack][4],
87 pert->lat[itrack + 1][ixtrack][4], x1);
88 const double d = 2. * RE * asin(DIST(x0, x1) / (2. * RE));
89 dmin = GSL_MIN(dmin, d);
90 dmax = GSL_MAX(dmax, d);
91 dmu += d;
92 n++;
93 }
94 }
95
96 /* Write output... */
97 printf("\nmean_along_track_sampling_distance= %.1f km | %.1f km\n",
98 dmu / n, dmu / n / 3.);
99 printf("minimum_along_track_sampling_distance= %.1f km | %.1f km\n", dmin,
100 dmin / 3.);
101 printf("maximum_along_track_sampling_distance= %.1f km | %.1f km\n", dmax,
102 dmax / 3.);
103
104 /* Init... */
105 dmin = 1e100;
106 dmax = -1e100;
107 dmu = 0;
108 n = 0;
109
110 /* Get angle between along-track and across-track direction... */
111 for (int itrack = 0; itrack < pert->ntrack - 1; itrack++) {
112 geo2cart(0, pert->lon[itrack][pert->nxtrack / 2][4],
113 pert->lat[itrack][pert->nxtrack / 2][4], x0);
114 geo2cart(0, pert->lon[itrack][pert->nxtrack / 2 + 1][4],
115 pert->lat[itrack][pert->nxtrack / 2 + 1][4], x1);
116 geo2cart(0, pert->lon[itrack + 1][pert->nxtrack / 2][4],
117 pert->lat[itrack + 1][pert->nxtrack / 2][4], x2);
118 for (int i = 0; i < 3; i++) {
119 x1[i] -= x0[i];
120 x2[i] -= x0[i];
121 }
122 const double d = acos(DOTP(x1, x2) / (NORM(x1) * NORM(x2))) * 180. / M_PI;
123 dmin = GSL_MIN(dmin, d);
124 dmax = GSL_MAX(dmax, d);
125 dmu += d;
126 n++;
127 }
128
129 /* Write output... */
130 printf("\nmean_across_track_angle= %.1f deg\n", dmu / n);
131 printf("minimum_across_track_angle= %.1f deg\n", dmin);
132 printf("maximum_across_track_angle= %.1f deg\n", dmax);
133
134 /* Get across-track distances... */
135 for (int itrack = 0; itrack < pert->ntrack; itrack++) {
136 for (int ixtrack = 0; ixtrack < pert->nxtrack; ixtrack++) {
137 geo2cart(0, pert->lon[itrack][0][4], pert->lat[itrack][0][4], x0);
138 geo2cart(0, pert->lon[itrack][ixtrack][4],
139 pert->lat[itrack][ixtrack][4], x1);
140 const double d = 2. * RE * asin(DIST(x0, x1) / (2. * RE));
141 dx[ixtrack] += d;
142 nx[ixtrack]++;
143 }
144 }
145
146 /* Write output... */
147 printf("\n");
148 for (int ixtrack = 0; ixtrack < pert->nxtrack; ixtrack++)
149 printf("ixtrack= %2d | dx= %.1f km | cx= %.1f km\n", ixtrack,
150 dx[ixtrack] / nx[ixtrack],
151 0.5 * dx[pert->nxtrack - 1] / nx[pert->nxtrack - 1] -
152 dx[ixtrack] / nx[ixtrack]);
153
154 /* Free... */
155 free(pert);
156
157 return EXIT_SUCCESS;
158}
void geo2cart(const double z, const double lon, const double lat, double *x)
Convert geolocation to Cartesian coordinates.
Definition: jurassic.c:3500
#define RE
Mean radius of Earth [km].
Definition: jurassic.h:299
#define DOTP(a, b)
Compute dot product of two vectors.
Definition: jurassic.h:141
#define ERRMSG(...)
Print error message and quit program.
Definition: jurassic.h:237
#define NORM(a)
Compute norm of a vector.
Definition: jurassic.h:180
#define ALLOC(ptr, type, n)
Allocate memory.
Definition: jurassic.h:121
#define DIST(a, b)
Compute Cartesian distance between two vectors.
Definition: jurassic.h:134
void read_pert(char *filename, char *pertname, int dc, pert_t *pert)
Read radiance perturbation data.
Definition: libcris.c:1270
#define L1_NXTRACK
Across-track size of CrIS radiance granule.
Definition: libcris.h:24
Perturbation data.
Definition: libcris.h:131
double lat[PERT_NTRACK][PERT_NXTRACK][PERT_NFOV]
Latitude [deg].
Definition: libcris.h:149
int ntrack
Number of along-track values.
Definition: libcris.h:134
int nxtrack
Number of across-track values.
Definition: libcris.h:137
double lon[PERT_NTRACK][PERT_NXTRACK][PERT_NFOV]
Longitude [deg].
Definition: libcris.h:146
Here is the call graph for this function: