25 #define NFFT_PRECISION_DOUBLE
37 static NFFT_R
my_weight(NFFT_R z, NFFT_R a, NFFT_R b, NFFT_R c)
39 return NFFT_M(pow)(NFFT_K(0.25) - z * z, b) / (c + NFFT_M(pow)(NFFT_M(fabs)(z), NFFT_K(2.0) * a));
45 int j, k, k0, k1, l, my_N[2], my_n[2];
48 SOLVER(plan_complex) ip;
53 my_n[0] = (int)NFFT(next_power_of_2)(N);
55 my_n[1] = (int)NFFT(next_power_of_2)(N);
56 NFFT(init_guru)(&p, 2, my_N, M, my_n, 6,
60 FFTW_MEASURE | FFTW_DESTROY_INPUT);
63 SOLVER(init_advanced_complex)(&ip, (NFFT(mv_plan_complex)*) (&p),
65 fprintf(stderr,
"Using the generic solver!");
68 fp = fopen(
"input_data.dat",
"r");
69 for (j = 0; j < p.M_total; j++)
71 fscanf(fp,
"%" NFFT__FES__
" %" NFFT__FES__
" %" NFFT__FES__, &p.x[2 * j + 0], &p.x[2 * j + 1], &tmp_y);
78 NFFT(precompute_one_psi)(&p);
82 for (k0 = 0; k0 < p.N[0]; k0++)
83 for (k1 = 0; k1 < p.N[1]; k1++)
84 ip.w_hat[k0 * p.N[1] + k1] =
my_weight(((NFFT_R) ((NFFT_R)(k0) - (NFFT_R)(p.N[0]) / NFFT_K(2.0))) / ((NFFT_R)(p.N[0])),
85 NFFT_K(0.5), NFFT_K(3.0), NFFT_K(0.001))
86 *
my_weight((((NFFT_R)(k1) - (NFFT_R)(p.N[1]) / NFFT_K(2.0))) / ((NFFT_R)(p.N[1])), NFFT_K(0.5), NFFT_K(3.0), NFFT_K(0.001));
89 for (k = 0; k < p.N_total; k++)
90 ip.f_hat_iter[k] = NFFT_K(0.0);
93 SOLVER(before_loop_complex)(&ip);
95 for (l = 0; l < 40; l++)
97 fprintf(stderr,
"Residual ||r||=%" NFFT__FES__
",\n", NFFT_M(sqrt)(ip.dot_r_iter));
98 SOLVER(loop_one_step_complex)(&ip);
101 for (k = 0; k < p.N_total; k++)
102 printf(
"%" NFFT__FES__
" %" NFFT__FES__
"\n", NFFT_M(creal)(ip.f_hat_iter[k]), NFFT_M(cimag)(ip.f_hat_iter[k]));
104 SOLVER(finalize_complex)(&ip);
109 static void glacier_cv(
int N,
int M,
int M_cv,
unsigned solver_flags)
111 int j, k, k0, k1, l, my_N[2], my_n[2];
114 SOLVER(plan_complex) ip;
121 my_n[0] = (int)NFFT(next_power_of_2)(N);
123 my_n[1] = (int)NFFT(next_power_of_2)(N);
124 NFFT(init_guru)(&p, 2, my_N, M_re, my_n, 6,
128 FFTW_MEASURE | FFTW_DESTROY_INPUT);
131 SOLVER(init_advanced_complex)(&ip, (NFFT(mv_plan_complex)*) (&p), solver_flags);
134 cp_y = (NFFT_C*) NFFT(malloc)((size_t)(M) *
sizeof(NFFT_C));
135 NFFT(init_guru)(&cp, 2, my_N, M, my_n, 6,
139 FFTW_MEASURE | FFTW_DESTROY_INPUT);
141 cp.f_hat = ip.f_hat_iter;
144 fp = fopen(
"input_data.dat",
"r");
145 for (j = 0; j < cp.M_total; j++)
147 fscanf(fp,
"%" NFFT__FES__
" %" NFFT__FES__
" %" NFFT__FES__, &cp.x[2 * j + 0], &cp.x[2 * j + 1], &tmp_y);
153 for (j = 0; j < p.M_total; j++)
155 p.x[2 * j + 0] = cp.x[2 * j + 0];
156 p.x[2 * j + 1] = cp.x[2 * j + 1];
162 NFFT(precompute_one_psi)(&p);
166 NFFT(precompute_one_psi)(&cp);
170 for (k0 = 0; k0 < p.N[0]; k0++)
171 for (k1 = 0; k1 < p.N[1]; k1++)
172 ip.w_hat[k0 * p.N[1] + k1] =
my_weight((((NFFT_R)(k0) - (NFFT_R)(p.N[0]) / NFFT_K(2.0))) / ((NFFT_R)(p.N[0])),
173 NFFT_K(0.5), NFFT_K(3.0), NFFT_K(0.001))
174 *
my_weight((((NFFT_R)(k1) - (NFFT_R)(p.N[1]) / NFFT_K(2.0))) / ((NFFT_R)(p.N[1])), NFFT_K(0.5), NFFT_K(3.0), NFFT_K(0.001));
177 for (k = 0; k < p.N_total; k++)
178 ip.f_hat_iter[k] = NFFT_K(0.0);
181 SOLVER(before_loop_complex)(&ip);
183 for (l = 0; l < 40; l++)
184 SOLVER(loop_one_step_complex)(&ip);
188 NFFT_CSWAP(p.f_hat, ip.f_hat_iter);
190 NFFT_CSWAP(p.f_hat, ip.f_hat_iter);
191 NFFT(upd_axpy_complex)(p.f, -1, ip.y, M_re);
192 r = NFFT_M(sqrt)(NFFT(dot_complex)(p.f, M_re) / NFFT(dot_complex)(cp_y, M));
193 fprintf(stderr,
"r=%1.2" NFFT__FES__
", ", r);
194 printf(
"$%1.1" NFFT__FES__
"$ & ", r);
197 NFFT(upd_axpy_complex)(&cp.f[M_re], -1, &cp_y[M_re], M_cv);
198 r = NFFT_M(sqrt)(NFFT(dot_complex)(&cp.f[M_re], M_cv) / NFFT(dot_complex)(cp_y, M));
199 fprintf(stderr,
"r_1=%1.2" NFFT__FES__
"\t", r);
200 printf(
"$%1.1" NFFT__FES__
"$ & ", r);
203 SOLVER(finalize_complex)(&ip);
208 int main(
int argc,
char **argv)
214 fprintf(stderr,
"Call this program from the Matlab script glacier.m!");
219 glacier(atoi(argv[1]), atoi(argv[2]));
221 for (M_cv = atoi(argv[3]); M_cv <= atoi(argv[5]); M_cv += atoi(argv[4]))
223 fprintf(stderr,
"\nM_cv=%d,\t", M_cv);
224 printf(
"$%d$ & ", M_cv);
225 fprintf(stderr,
"cgne+damp: ");
229 fprintf(stderr,
"cgnr: ");
231 fprintf(stderr,
"cgnr: ");
233 printf(
"XXX \\\\\n");
236 fprintf(stderr,
"\n");
int main(int argc, char **argv)
Main routine.
static NFFT_R my_weight(NFFT_R z, NFFT_R a, NFFT_R b, NFFT_R c)
Generalised Sobolev weight.
static void glacier(int N, int M)
Reconstruction routine.
static void glacier_cv(int N, int M, int M_cv, unsigned solver_flags)
Reconstruction routine with cross validation.