47 static pert_t *pert, *pert2;
50 char set[
LEN], pertname[
LEN];
52 double nedt = 0, sza2 = 0;
60 ERRMSG(
"Give parameters: <ctl> <pert.nc> <map.tab>");
63 scan_ctl(argc, argv,
"PERTNAME", -1,
"4mu", pertname);
65 (int)
scan_ctl(argc, argv,
"BG_POLY_X", -1,
"0", NULL);
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);
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) {
107 gauss(&wave, gauss_fwhm);
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];
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]
145 memcpy(pert2, pert,
sizeof(
pert_t));
148 printf(
"Write perturbation data: %s\n", argv[3]);
149 if (!(out = fopen(argv[3],
"w")))
150 ERRMSG(
"Cannot create file!");
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);
166 for (
int itrack = 0; itrack < pert->
ntrack; itrack++) {
170 if (pert->
lat[itrack - 1][pert->
nxtrack / 2] <= orblat
171 && pert->
lat[itrack][pert->
nxtrack / 2] >= orblat)
178 if (itrack > 0 && pert->
time[itrack][pert->
nxtrack / 2]
183 for (
int ixtrack = 0; ixtrack < pert->
nxtrack; ixtrack++) {
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)
194 (pert->
lat[itrack > 0 ? itrack : itrack + 1][pert->
nxtrack / 2]
195 > pert->
lat[itrack > 0 ? itrack - 1 : itrack][pert->
nxtrack / 2]);
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]);
204 const double nesr =
PLANCK(230.0 + dt230, nu) -
PLANCK(230.0, nu);
206 pert->
bt[itrack][ixtrack] - pert->
pt[itrack][ixtrack];
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,
248 double d1 = 0, d2 = 0, v1 = 0, v2 = 0;
251 for (
int i = itrack + 1; i < ntrack; i++)
252 if (gsl_finite(var[i][ixtrack])) {
253 d1 = fabs((
double) i - (
double) itrack);
254 v1 = var[i][ixtrack];
257 for (
int i = itrack - 1; i >= 0; i--)
258 if (gsl_finite(var[i][ixtrack])) {
259 d2 = fabs((
double) i - (
double) itrack);
260 v2 = var[i][ixtrack];
266 return (d2 * v1 + d1 * v2) / (d1 + d2);
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...
AIRS Code Collection library declarations.
#define PERT_NXTRACK
Across-track size of perturbation data.
#define PERT_NTRACK
Along-track size of perturbation data.
double fill_array(double var[PERT_NTRACK][PERT_NXTRACK], int ntrack, int itrack, int ixtrack)
int main(int argc, char *argv[])
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].