30 {
31
33
34 FILE *out;
35
36 char method[
LEN], filename[
LEN];
37
38 double Amax, phimax, lhmax, kxmax, kymax, alphamax, betamax, chisq;
39
40
41 if (argc < 3)
42 ERRMSG(
"Give parameters: <ctl> <spec.tab>");
43
44
45 const int nx = (int)
scan_ctl(argc, argv,
"NX", -1,
"256", NULL);
46 const int ny = (int)
scan_ctl(argc, argv,
"NY", -1,
"256", NULL);
47 const double sx =
scan_ctl(argc, argv,
"SX", -1,
"1000.0", NULL);
48 const double sy =
scan_ctl(argc, argv,
"SY", -1,
"1000.0", NULL);
49 const double amp =
scan_ctl(argc, argv,
"AMP", -1,
"1.0", NULL);
50 const double phi =
scan_ctl(argc, argv,
"PHI", -1,
"0.0", NULL);
51 const double lx0 =
scan_ctl(argc, argv,
"LX0", -1,
"100.0", NULL);
52 const double lx1 =
scan_ctl(argc, argv,
"LX1", -1,
"100.0", NULL);
53 const double dlx =
scan_ctl(argc, argv,
"DLX", -1,
"10.0", NULL);
54 const double ly0 =
scan_ctl(argc, argv,
"LY0", -1,
"200.0", NULL);
55 const double ly1 =
scan_ctl(argc, argv,
"LY1", -1,
"200.0", NULL);
56 const double dly =
scan_ctl(argc, argv,
"DLY", -1,
"10.0", NULL);
57 const double fwhm =
scan_ctl(argc, argv,
"FWHM", -1,
"0.0", NULL);
58 const int inter_x = (int)
scan_ctl(argc, argv,
"INTER_X", -1,
"0", NULL);
59 const int bg_poly_x =
60 (int)
scan_ctl(argc, argv,
"BG_POLY_X", -1,
"5", NULL);
61 const int bg_poly_y =
62 (int)
scan_ctl(argc, argv,
"BG_POLY_Y", -1,
"0", NULL);
63 const int bg_smooth_x =
64 (int)
scan_ctl(argc, argv,
"BG_SMOOTH_X", -1,
"0", NULL);
65 const int bg_smooth_y =
66 (int)
scan_ctl(argc, argv,
"BG_SMOOTH_Y", -1,
"0", NULL);
67 const double var_dh =
scan_ctl(argc, argv,
"VAR_DH", -1,
"100.0", NULL);
68 const double lxymax =
scan_ctl(argc, argv,
"LXYMAX", -1,
"1000.0", NULL);
69 const double dlxy =
scan_ctl(argc, argv,
"DLXY", -1,
"10.0", NULL);
70 scan_ctl(argc, argv,
"METHOD", -1,
"P", method);
71 const int output = (int)
scan_ctl(argc, argv,
"OUTPUT", -1,
"1", NULL);
72
73
75
76
77 printf("Write spectral data: %s\n", argv[2]);
78 if (!(out = fopen(argv[2], "w")))
79 ERRMSG(
"Cannot create file!");
80
81
82 fprintf(out,
83 "# $1 = real amplitude [K]\n"
84 "# $2 = real phase [deg]\n"
85 "# $3 = real horizontal wavelength [km]\n"
86 "# $4 = real wavelength x [km]\n"
87 "# $5 = real wavelength y [km]\n"
88 "# $6 = real rotation angle alpha [deg]\n");
89 fprintf(out,
90 "# $7 = amplitude [K]\n"
91 "# $8 = phase [deg]\n"
92 "# $9 = horizontal wavelength [km]\n"
93 "# $10 = wavelength x [km]\n"
94 "# $11 = wavelength y [km]\n"
95 "# $12 = rotation angle alpha [deg]\n"
96 "# $13 = rotation angle beta [deg]\n"
97 "# $14 = chi^2 of fit [K^2]\n"
98 "# $15 = box size x\n" "# $16 = box size y\n");
99
100
103 for (
int ix = 0; ix < wave->
nx; ix++)
104 for (
int iy = 0; iy < wave->
ny; iy++) {
105 wave->
x[ix] = sx / (nx - 1.) * ix - sx / 2.;
106 wave->
y[iy] = sy / (ny - 1.) * iy - sy / 2.;
107 }
108
109
110 for (double lx = lx0; lx <= lx1; lx += dlx) {
111
112
113 fprintf(out, "\n");
114
115
116 for (double ly = ly0; ly <= ly1; ly += dly) {
117
118
119 printf("Analyze lx = %g km and ly = %g km...\n", lx, ly);
120
121
122 double lh =
123 2 * M_PI / sqrt(gsl_pow_2(2 * M_PI / lx) + gsl_pow_2(2 * M_PI / ly));
124
125
126 double alpha = 90. - 180. / M_PI * atan2(2 * M_PI / lx, 2 * M_PI / ly);
127
128
130
131
134
135
137
138
140
141
142 if (method[0] == 'p' || method[0] == 'P') {
143 sprintf(filename, "period_%g_%g.tab", lx, ly);
144 period(wave, lxymax, dlxy, &Amax, &phimax, &lhmax, &kxmax, &kymax,
145 &alphamax, &betamax, output ? filename : NULL);
146 } else if (method[0] == 'f' || method[0] == 'F') {
147 sprintf(filename, "fft_%g_%g.tab", lx, ly);
148 fft(wave, &Amax, &phimax, &lhmax, &kxmax, &kymax,
149 &alphamax, &betamax, output ? filename : NULL);
150 } else
152
153
154 fit_wave(wave, Amax, phimax, kxmax, kymax, &chisq);
155
156
157 sprintf(filename, "wave_%g_%g.tab", lx, ly);
158 if (output)
160
161
162 fprintf(out, "%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d %d\n",
163 amp, phi, lh, lx, ly, alpha, Amax, phimax, lhmax,
164 2 * M_PI / kxmax, 2 * M_PI / kymax, alphamax, betamax,
165 chisq, wave->
nx, wave->
ny);
166 }
167 }
168
169
170 fclose(out);
171
172
173 free(wave);
174
175 return EXIT_SUCCESS;
176}
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 create_wave(wave_t *wave, double amp, double lx, double ly, double phi, double fwhm)
Add linear wave pattern...
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 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.
int nx
Number of across-track values.
int ny
Number of along-track values.
double x[WX]
Across-track distance [km].
double y[WY]
Along-track distance [km].