37 char method[
LEN], filename[
LEN], pertname[
LEN];
39 double Amax, phimax, lhmax, kxmax, kymax, alphamax, betamax, chisq;
43 ERRMSG(
"Give parameters: <ctl> <pert.nc> <spec.tab>");
46 scan_ctl(argc, argv,
"PERTNAME", -1,
"4mu", pertname);
47 const int track0 = (int)
scan_ctl(argc, argv,
"TRACK0", -1,
"", NULL);
48 const int track1 = (int)
scan_ctl(argc, argv,
"TRACK1", -1,
"", NULL);
49 const int xtrack0 = (int)
scan_ctl(argc, argv,
"XTRACK0", -1,
"0", NULL);
50 const int xtrack1 = (int)
scan_ctl(argc, argv,
"XTRACK1", -1,
"89", NULL);
51 const int strack = (int)
scan_ctl(argc, argv,
"STRACK", -1,
"15", NULL);
52 const int sxtrack = (int)
scan_ctl(argc, argv,
"SXTRACK", -1,
"15", NULL);
53 const int dtrack = (int)
scan_ctl(argc, argv,
"DTRACK", -1,
"5", NULL);
54 const int dxtrack = (int)
scan_ctl(argc, argv,
"DXTRACK", -1,
"5", NULL);
55 const int inter_x = (int)
scan_ctl(argc, argv,
"INTER_X", -1,
"0", NULL);
57 (int)
scan_ctl(argc, argv,
"BG_POLY_X", -1,
"5", NULL);
59 (int)
scan_ctl(argc, argv,
"BG_POLY_Y", -1,
"0", NULL);
60 const int bg_smooth_x =
61 (int)
scan_ctl(argc, argv,
"BG_SMOOTH_X", -1,
"0", NULL);
62 const int bg_smooth_y =
63 (int)
scan_ctl(argc, argv,
"BG_SMOOTH_Y", -1,
"0", NULL);
64 const double var_dh =
scan_ctl(argc, argv,
"VAR_DH", -1,
"100.0", NULL);
65 const double lxymax =
scan_ctl(argc, argv,
"LXYMAX", -1,
"1000.0", NULL);
66 const double dlxy =
scan_ctl(argc, argv,
"DLXY", -1,
"10.0", NULL);
67 scan_ctl(argc, argv,
"METHOD", -1,
"P", method);
68 const int output = (int)
scan_ctl(argc, argv,
"OUTPUT", -1,
"1", NULL);
88 for (
int ix = 0; ix < wave->
nx; ix++)
89 for (
int iy = 0; iy < wave->
ny; iy++) {
90 pert->
pt[iy][ix] = wave->
pt[ix][iy];
91 pert->
var[iy][ix] = wave->
var[ix][iy];
98 printf(
"Write spectral data: %s\n", argv[3]);
99 if (!(out = fopen(argv[3],
"w")))
100 ERRMSG(
"Cannot create file!");
104 "# $1 = time (seconds since 01-JAN-2000, 00:00 UTC)\n"
105 "# $2 = longitude [deg]\n"
106 "# $3 = latitude [deg]\n"
107 "# $4 = amplitude [K]\n"
108 "# $5 = phase [deg]\n"
109 "# $6 = horizontal wavelength [km]\n"
110 "# $7 = wavenumber x [1/km]\n"
111 "# $8 = wavenumber y [1/km]\n"
112 "# $9 = rotation angle alpha [deg]\n"
113 "# $10 = rotation angle beta [deg]\n");
115 "# $11 = chi^2 of fit [K^2]\n"
116 "# $12 = along-track index minimum\n"
117 "# $13 = along-track index maximum\n"
118 "# $14 = across-track index minimum\n"
119 "# $15 = across-track index maximum\n"
120 "# $16 = box size x\n" "# $17 = box size y\n\n");
123 for (
int track = track0; track <= track1 - strack + 1; track += dtrack)
124 for (
int xtrack = xtrack0; xtrack <= xtrack1 - sxtrack + 1;
128 printf(
"Analyze track = %d and xtrack = %d ...\n", track, xtrack);
131 pert2wave(pert, wave, track, track + strack - 1,
132 xtrack, xtrack + sxtrack - 1);
135 if (method[0] ==
'p' || method[0] ==
'P') {
136 sprintf(filename,
"period_%d_%d.tab", track, xtrack);
137 period(wave, lxymax, dlxy, &Amax, &phimax, &lhmax, &kxmax, &kymax,
138 &alphamax, &betamax, output ? filename : NULL);
139 }
else if (method[0] ==
'f' || method[0] ==
'F') {
140 sprintf(filename,
"fft_%d_%d.tab", track, xtrack);
141 fft(wave, &Amax, &phimax, &lhmax, &kxmax, &kymax,
142 &alphamax, &betamax, output ? filename : NULL);
147 fit_wave(wave, Amax, phimax, kxmax, kymax, &chisq);
151 sprintf(filename,
"wave_%d_%d.tab", track, xtrack);
156 fprintf(out,
"%.2f %g %g %g %g %g %g %g %g %g %g %d %d %d %d %d %d\n",
157 pert->
time[track + strack / 2][xtrack + sxtrack / 2],
158 pert->
lon[track + strack / 2][xtrack + sxtrack / 2],
159 pert->
lat[track + strack / 2][xtrack + sxtrack / 2],
160 Amax, phimax, lhmax, kxmax, kymax, alphamax, betamax,
161 chisq, track, track + strack - 1,
162 xtrack, xtrack + sxtrack - 1, wave->
nx, wave->
ny);
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 ERRMSG(...)
Print error message and quit program.
#define ALLOC(ptr, type, n)
Allocate memory.
void fit_wave(wave_t *wave, double amp, double phi, double kx, double ky, double *chisq)
Evaluate wave fit...
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
void intpol_x(wave_t *wave, int n)
Interpolate to regular grid in x-direction.
void fft(wave_t *wave, double *Amax, double *phimax, double *lhmax, double *kxmax, double *kymax, double *alphamax, double *betamax, char *filename)
Calculate 2-D FFT...
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 write_wave(char *filename, wave_t *wave)
Write wave analysis data.
void period(wave_t *wave, double lxymax, double dlxy, double *Amax, double *phimax, double *lhmax, double *kxmax, double *kymax, double *alphamax, double *betamax, char *filename)
Compute periodogram.
AIRS Code Collection library declarations.
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).
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].
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].