45 {
46
47 static pert_t *pert, *pert2;
49
50 char set[
LEN], pertname[
LEN];
51
52 double nedt = 0, sza2 = 0;
53
54 int orb = 0;
55
56 FILE *out;
57
58
59 if (argc < 4)
60 ERRMSG(
"Give parameters: <ctl> <pert.nc> <map.tab>");
61
62
63 scan_ctl(argc, argv,
"PERTNAME", -1,
"4mu", pertname);
64 const int bg_poly_x =
65 (int)
scan_ctl(argc, argv,
"BG_POLY_X", -1,
"0", NULL);
66 const int bg_poly_y =
67 (int)
scan_ctl(argc, argv,
"BG_POLY_Y", -1,
"0", NULL);
68 const int bg_smooth_x =
69 (int)
scan_ctl(argc, argv,
"BG_SMOOTH_X", -1,
"0", NULL);
70 const int bg_smooth_y =
71 (int)
scan_ctl(argc, argv,
"BG_SMOOTH_Y", -1,
"0", NULL);
72 const double gauss_fwhm =
scan_ctl(argc, argv,
"GAUSS_FWHM", -1,
"0", NULL);
73 const int ham_iter = (int)
scan_ctl(argc, argv,
"HAM_ITER", -1,
"0", NULL);
74 const int med_dx = (int)
scan_ctl(argc, argv,
"MED_DX", -1,
"0", NULL);
75 const double var_dh =
scan_ctl(argc, argv,
"VAR_DH", -1,
"0", NULL);
76 scan_ctl(argc, argv,
"SET", -1,
"full", set);
77 const int orbit = (int)
scan_ctl(argc, argv,
"ORBIT", -1,
"-999", NULL);
78 const double orblat =
scan_ctl(argc, argv,
"ORBLAT", -1,
"0", NULL);
79 const double t0 =
scan_ctl(argc, argv,
"T0", -1,
"-1e100", NULL);
80 const double t1 =
scan_ctl(argc, argv,
"T1", -1,
"1e100", NULL);
81 const double sza0 =
scan_ctl(argc, argv,
"SZA0", -1,
"-1e100", NULL);
82 const double sza1 =
scan_ctl(argc, argv,
"SZA1", -1,
"1e100", NULL);
83 const double dt230 =
scan_ctl(argc, argv,
"DT230", -1,
"0.16", NULL);
84 const double nu =
scan_ctl(argc, argv,
"NU", -1,
"2345.0", NULL);
85 const int fill = (int)
scan_ctl(argc, argv,
"FILL", -1,
"0", NULL);
86
87
90
91
93
94
95 if (bg_poly_x > 0 || bg_poly_y > 0 ||
96 bg_smooth_x > 0 || bg_smooth_y > 0 ||
97 gauss_fwhm > 0 || ham_iter > 0 || med_dx > 0 || var_dh > 0) {
98
99
101
102
105
106
107 gauss(&wave, gauss_fwhm);
108
109
111
112
114
115
117
118
119 for (
int ix = 0; ix < wave.
nx; ix++)
120 for (
int iy = 0; iy < wave.
ny; iy++) {
121 pert->
pt[iy][ix] = wave.
pt[ix][iy];
122 pert->
var[iy][ix] = wave.
var[ix][iy];
123 }
124 }
125
126
127 if (fill)
128 for (
int itrack = 0; itrack < pert->
ntrack; itrack++)
129 for (
int ixtrack = 0; ixtrack < pert->
nxtrack; ixtrack++) {
130 if (!gsl_finite(pert->
dc[itrack][ixtrack]))
131 pert->
dc[itrack][ixtrack]
133 if (!gsl_finite(pert->
bt[itrack][ixtrack]))
134 pert->
bt[itrack][ixtrack]
136 if (!gsl_finite(pert->
pt[itrack][ixtrack]))
137 pert->
pt[itrack][ixtrack]
139 if (!gsl_finite(pert->
var[itrack][ixtrack]))
140 pert->
var[itrack][ixtrack]
142 }
143
144
145 memcpy(pert2, pert,
sizeof(
pert_t));
146
147
148 printf("Write perturbation data: %s\n", argv[3]);
149 if (!(out = fopen(argv[3], "w")))
150 ERRMSG(
"Cannot create file!");
151
152
153 fprintf(out,
154 "# $1 = time (seconds since 01-JAN-2000, 00:00 UTC)\n"
155 "# $2 = solar zenith angle [deg]\n"
156 "# $3 = longitude [deg]\n"
157 "# $4 = latitude [deg]\n"
158 "# $5 = 8mu brightness temperature [K]\n"
159 "# $6 = %s brightness temperature [K]\n"
160 "# $7 = %s brightness temperature perturbation [K]\n"
161 "# $8 = %s brightness temperature variance [K^2]\n"
162 "# $9 = along-track index\n"
163 "# $10 = across-track index\n", pertname, pertname, pertname);
164
165
166 for (
int itrack = 0; itrack < pert->
ntrack; itrack++) {
167
168
169 if (itrack > 0)
170 if (pert->
lat[itrack - 1][pert->
nxtrack / 2] <= orblat
171 && pert->
lat[itrack][pert->
nxtrack / 2] >= orblat)
172 orb++;
173
174
175 fprintf(out, "\n");
176
177
178 if (itrack > 0 && pert->
time[itrack][pert->
nxtrack / 2]
180 fprintf(out, "\n");
181
182
183 for (
int ixtrack = 0; ixtrack < pert->
nxtrack; ixtrack++) {
184
185
186 if (pert->
lon[itrack][ixtrack] < -180
187 || pert->
lon[itrack][ixtrack] > 180
188 || pert->
lat[itrack][ixtrack] < -90
189 || pert->
lat[itrack][ixtrack] > 90)
190 continue;
191
192
193 int asc =
194 (pert->
lat[itrack > 0 ? itrack : itrack + 1][pert->
nxtrack / 2]
195 > pert->
lat[itrack > 0 ? itrack - 1 : itrack][pert->
nxtrack / 2]);
196
197
198 if (sza0 >= -1e10 && sza0 <= 1e10 && sza1 >= -1e10 && sza1 <= 1e10)
199 sza2 =
sza(pert->
time[itrack][ixtrack], pert->
lon[itrack][ixtrack],
200 pert->
lat[itrack][ixtrack]);
201
202
203 if (dt230 > 0) {
204 const double nesr =
PLANCK(230.0 + dt230, nu) -
PLANCK(230.0, nu);
205 const double tbg =
206 pert->
bt[itrack][ixtrack] - pert->
pt[itrack][ixtrack];
208 }
209
210
211 if (orbit < 0 || orb == orbit)
212 if (set[0] == 'f' || (set[0] == 'a' && asc)
213 || (set[0] == 'd' && !asc))
214 if (pert->
time[itrack][ixtrack] >= t0
215 && pert->
time[itrack][ixtrack] <= t1
216 && sza2 >= sza0 && sza2 <= sza1)
217 fprintf(out, "%.2f %g %g %g %g %g %g %g %d %d\n",
218 pert->
time[itrack][ixtrack],
219 sza(pert->
time[itrack][ixtrack],
220 pert->
lon[itrack][ixtrack],
221 pert->
lat[itrack][ixtrack]),
222 pert->
lon[itrack][ixtrack], pert->
lat[itrack][ixtrack],
223 pert->
dc[itrack][ixtrack], pert->
bt[itrack][ixtrack],
224 pert->
pt[itrack][ixtrack],
225 pert->
var[itrack][ixtrack] - gsl_pow_2(nedt), itrack,
226 ixtrack);
227 }
228 }
229
230
231 fclose(out);
232
233
234 free(pert);
235 free(pert2);
236
237 return EXIT_SUCCESS;
238}
double sza(const double sec, const double lon, const double lat)
Calculate solar zenith angle.
double scan_ctl(int argc, char *argv[], const char *varname, int arridx, const char *defvalue, char *value)
Search control parameter file for variable entry.
#define LEN
Maximum length of ASCII data lines.
#define BRIGHT(rad, nu)
Compute brightness temperature.
#define ERRMSG(...)
Print error message and quit program.
#define ALLOC(ptr, type, n)
Allocate memory.
#define PLANCK(T, nu)
Compute Planck function.
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
void hamming(wave_t *wave, int niter)
Apply Hamming filter to perturbations...
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
void variance(wave_t *wave, double dh)
Compute local variance.
void pert2wave(pert_t *pert, wave_t *wave, int track0, int track1, int xtrack0, int xtrack1)
Convert radiance perturbation data to wave analysis struct.
void read_pert(char *filename, char *pertname, pert_t *pert)
Read radiance perturbation data.
void gauss(wave_t *wave, double fwhm)
Apply Gaussian filter to perturbations...
void median(wave_t *wave, int dx)
Apply median filter to perturbations...
double fill_array(double var[PERT_NTRACK][PERT_NXTRACK], int ntrack, int itrack, int ixtrack)
double var[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature variance (4 or 15 micron) [K].
double pt[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature perturbation (4 or 15 micron) [K].
double time[PERT_NTRACK][PERT_NXTRACK]
Time (seconds since 2000-01-01T00:00Z).
double dc[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature (8 micron) [K].
int ntrack
Number of along-track values.
int nxtrack
Number of across-track values.
double lon[PERT_NTRACK][PERT_NXTRACK]
Longitude [deg].
double bt[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature (4 or 15 micron) [K].
double lat[PERT_NTRACK][PERT_NXTRACK]
Latitude [deg].
int nx
Number of across-track values.
int ny
Number of along-track values.
double var[WX][WY]
Variance [K].
double pt[WX][WY]
Perturbation [K].