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

5 {
6
7 static pert_t *pert;
8
9 char set[LEN], pertname[LEN];
10
11 double nedt = 0, sza2 = 0;
12
13 int orb = 0;
14
15 FILE *out;
16
17 /* Check arguments... */
18 if (argc < 4)
19 ERRMSG("Give parameters: <ctl> <pert.nc> <map.tab>");
20
21 /* Get control parameters... */
22 scan_ctl(argc, argv, "PERTNAME", -1, "4mu", pertname);
23 scan_ctl(argc, argv, "SET", -1, "full", set);
24 const int orbit = (int) scan_ctl(argc, argv, "ORBIT", -1, "-999", NULL);
25 int track0 = (int) scan_ctl(argc, argv, "TRACK0", -1, "0", NULL);
26 int track1 = (int) scan_ctl(argc, argv, "TRACK1", -1, "100000", NULL);
27 int xtrack0 = (int) scan_ctl(argc, argv, "XTRACK0", -1, "0", NULL);
28 int xtrack1 = (int) scan_ctl(argc, argv, "XTRACK1", -1, "29", NULL);
29 int ifov0 = (int) scan_ctl(argc, argv, "IFOV0", -1, "0", NULL);
30 int ifov1 = (int) scan_ctl(argc, argv, "IFOV1", -1, "8", NULL);
31 const double orblat = scan_ctl(argc, argv, "ORBLAT", -1, "0", NULL);
32 const double t0 = scan_ctl(argc, argv, "T0", -1, "-1e100", NULL);
33 const double t1 = scan_ctl(argc, argv, "T1", -1, "1e100", NULL);
34 const double sza0 = scan_ctl(argc, argv, "SZA0", -1, "-1e100", NULL);
35 const double sza1 = scan_ctl(argc, argv, "SZA1", -1, "1e100", NULL);
36 const double dt230 = scan_ctl(argc, argv, "DT230", -1, "-999", NULL);
37 const double nu = scan_ctl(argc, argv, "NU", -1, "-999", NULL);
38 const int dc = (int) scan_ctl(argc, argv, "DC", -1, "0", NULL);
39
40 /* Allocate... */
41 ALLOC(pert, pert_t, 1);
42
43 /* Read perturbation data... */
44 read_pert(argv[2], pertname, dc, pert);
45
46 /* Check ranges... */
47 track0 = GSL_MIN(GSL_MAX(track0, 0), pert->ntrack - 1);
48 track1 = GSL_MIN(GSL_MAX(track1, 0), pert->ntrack - 1);
49 xtrack0 = GSL_MIN(GSL_MAX(xtrack0, 0), pert->nxtrack - 1);
50 xtrack1 = GSL_MIN(GSL_MAX(xtrack1, 0), pert->nxtrack - 1);
51 ifov0 = GSL_MIN(GSL_MAX(ifov0, 0), pert->nfov - 1);
52 ifov1 = GSL_MIN(GSL_MAX(ifov1, 0), pert->nfov - 1);
53
54 /* Create output file... */
55 LOG(1, "Write perturbation data: %s", argv[3]);
56 if (!(out = fopen(argv[3], "w")))
57 ERRMSG("Cannot create file!");
58
59 /* Write header... */
60 fprintf(out,
61 "# $1 = time (seconds since 01-JAN-2000, 00:00 UTC)\n"
62 "# $2 = solar zenith angle [deg]\n"
63 "# $3 = longitude [deg]\n"
64 "# $4 = latitude [deg]\n"
65 "# $5 = cloud channel brightness temperature [K]\n"
66 "# $6 = %s brightness temperature [K]\n"
67 "# $7 = %s brightness temperature perturbation [K]\n"
68 "# $8 = %s brightness temperature variance [K^2]\n"
69 "# $9 = along-track index\n"
70 "# $10 = across-track index\n"
71 "# $11 = field-of-view index\n", pertname, pertname, pertname);
72
73 /* Write data... */
74 for (int itrack = track0; itrack <= track1; itrack++) {
75
76 /* Count orbits... */
77 if (itrack > 0)
78 if (pert->lat[itrack - 1][pert->nxtrack / 2][0] <= orblat
79 && pert->lat[itrack][pert->nxtrack / 2][0] >= orblat)
80 orb++;
81
82 /* Write output... */
83 fprintf(out, "\n");
84
85 /* Check for data gaps... */
86 if (itrack > 0 && pert->time[itrack][pert->nxtrack / 2][0]
87 - pert->time[itrack - 1][pert->nxtrack / 2][0] >= 10)
88 fprintf(out, "\n");
89
90 /* Loop over scans and field of views... */
91 for (int ixtrack = xtrack0; ixtrack <= xtrack1; ixtrack++)
92 for (int ifov = ifov0; ifov <= ifov1; ifov++) {
93
94 /* Check data... */
95 if (pert->lon[itrack][ixtrack][ifov] < -180
96 || pert->lon[itrack][ixtrack][ifov] > 180
97 || pert->lat[itrack][ixtrack][ifov] < -90
98 || pert->lat[itrack][ixtrack][ifov] > 90)
99 continue;
100
101 /* Get ascending/descending flag... */
102 int asc =
103 (pert->lat[itrack > 0 ? itrack : itrack + 1][pert->nxtrack / 2]
104 [ifov] > pert->lat[itrack >
105 0 ? itrack -
106 1 : itrack][pert->nxtrack / 2][ifov]);
107
108 /* Calculate solar zenith angle... */
109 if (sza0 >= -1e10 && sza0 <= 1e10 && sza1 >= -1e10 && sza1 <= 1e10)
110 sza2 = sza(pert->time[itrack][ixtrack][ifov],
111 pert->lon[itrack][ixtrack][ifov],
112 pert->lat[itrack][ixtrack][ifov]);
113
114 /* Estimate noise... */
115 if (dt230 > 0 && nu > 0) {
116 const double nesr = PLANCK(230.0 + dt230, nu) - PLANCK(230.0, nu);
117 const double tbg =
118 pert->bt[itrack][ixtrack][ifov] - pert->pt[itrack][ixtrack][ifov];
119 nedt = BRIGHT(PLANCK(tbg, nu) + nesr, nu) - tbg;
120 }
121
122 /* Write data... */
123 if (orbit < 0 || orb == orbit)
124 if (set[0] == 'f' || (set[0] == 'a' && asc)
125 || (set[0] == 'd' && !asc))
126 if (pert->time[itrack][ixtrack][ifov] >= t0
127 && pert->time[itrack][ixtrack][ifov] <= t1
128 && sza2 >= sza0 && sza2 <= sza1)
129 fprintf(out, "%.2f %g %g %g %g %g %g %g %d %d %d\n",
130 pert->time[itrack][ixtrack][ifov],
131 sza(pert->time[itrack][ixtrack][ifov],
132 pert->lon[itrack][ixtrack][ifov],
133 pert->lat[itrack][ixtrack][ifov]),
134 pert->lon[itrack][ixtrack][ifov],
135 pert->lat[itrack][ixtrack][ifov],
136 pert->dc[itrack][ixtrack][ifov],
137 pert->bt[itrack][ixtrack][ifov],
138 pert->pt[itrack][ixtrack][ifov],
139 pert->var[itrack][ixtrack][ifov] - gsl_pow_2(nedt),
140 itrack, ixtrack, ifov);
141 }
142 }
143
144 /* Close file... */
145 fclose(out);
146
147 /* Free... */
148 free(pert);
149
150 return EXIT_SUCCESS;
151}
double sza(const double sec, const double lon, const double lat)
Calculate solar zenith angle.
Definition: jurassic.c:5183
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
#define LEN
Maximum length of ASCII data lines.
Definition: jurassic.h:383
#define BRIGHT(rad, nu)
Compute brightness temperature.
Definition: jurassic.h:126
#define ERRMSG(...)
Print error message and quit program.
Definition: jurassic.h:237
#define ALLOC(ptr, type, n)
Allocate memory.
Definition: jurassic.h:121
#define PLANCK(T, nu)
Compute Planck function.
Definition: jurassic.h:183
#define LOG(level,...)
Print log message.
Definition: jurassic.h:221
void read_pert(char *filename, char *pertname, int dc, pert_t *pert)
Read radiance perturbation data.
Definition: libcris.c:1270
Perturbation data.
Definition: libcris.h:131
double dc[PERT_NTRACK][PERT_NXTRACK][PERT_NFOV]
Brightness temperature (cloud channel) [K].
Definition: libcris.h:152
double lat[PERT_NTRACK][PERT_NXTRACK][PERT_NFOV]
Latitude [deg].
Definition: libcris.h:149
int nfov
Number of field of views.
Definition: libcris.h:140
double pt[PERT_NTRACK][PERT_NXTRACK][PERT_NFOV]
Brightness temperature perturbation (4 or 15 micron) [K].
Definition: libcris.h:158
int ntrack
Number of along-track values.
Definition: libcris.h:134
double var[PERT_NTRACK][PERT_NXTRACK][PERT_NFOV]
Brightness temperature variance (4 or 15 micron) [K].
Definition: libcris.h:161
double time[PERT_NTRACK][PERT_NXTRACK][PERT_NFOV]
Time (seconds since 2000-01-01T00:00Z).
Definition: libcris.h:143
double bt[PERT_NTRACK][PERT_NXTRACK][PERT_NFOV]
Brightness temperature (4.3 or 15 micron) [K].
Definition: libcris.h:155
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: