27 #define NFFT_PRECISION_DOUBLE
39 static NFFT_R
my_weight(NFFT_R z, NFFT_R a, NFFT_R b, NFFT_R c)
41 return NFFT_M(pow)(NFFT_K(0.25) - z * z, b) / (c + NFFT_M(pow)(NFFT_M(fabs)(z), NFFT_K(2.0) * a));
47 int j, k, k0, k1, l, my_N[2], my_n[2];
50 SOLVER(plan_complex) ip;
55 my_n[0] = (int)NFFT(next_power_of_2)(N);
57 my_n[1] = (int)NFFT(next_power_of_2)(N);
58 NFFT(init_guru)(&p, 2, my_N, M, my_n, 6,
59 PRE_PHI_HUT | PRE_FULL_PSI |
60 MALLOC_X | MALLOC_F_HAT | MALLOC_F |
61 FFTW_INIT | FFT_OUT_OF_PLACE,
62 FFTW_MEASURE | FFTW_DESTROY_INPUT);
65 SOLVER(init_advanced_complex)(&ip, (NFFT(mv_plan_complex)*) (&p),
66 CGNE | PRECOMPUTE_DAMP);
67 fprintf(stderr,
"Using the generic solver!");
70 fp = fopen(
"input_data.dat",
"r");
71 for (j = 0; j < p.M_total; j++)
73 fscanf(fp,
"%" NFFT__FES__
" %" NFFT__FES__
" %" NFFT__FES__, &p.x[2 * j + 0], &p.x[2 * j + 1], &tmp_y);
79 if (p.flags & PRE_ONE_PSI)
80 NFFT(precompute_one_psi)(&p);
83 if (ip.flags & PRECOMPUTE_DAMP)
84 for (k0 = 0; k0 < p.N[0]; k0++)
85 for (k1 = 0; k1 < p.N[1]; k1++)
86 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])),
87 NFFT_K(0.5), NFFT_K(3.0), NFFT_K(0.001))
88 *
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));
91 for (k = 0; k < p.N_total; k++)
92 ip.f_hat_iter[k] = NFFT_K(0.0);
95 SOLVER(before_loop_complex)(&ip);
97 for (l = 0; l < 40; l++)
99 fprintf(stderr,
"Residual ||r||=%" NFFT__FES__
",\n", NFFT_M(sqrt)(ip.dot_r_iter));
100 SOLVER(loop_one_step_complex)(&ip);
103 for (k = 0; k < p.N_total; k++)
104 printf(
"%" NFFT__FES__
" %" NFFT__FES__
"\n", NFFT_M(creal)(ip.f_hat_iter[k]), NFFT_M(cimag)(ip.f_hat_iter[k]));
106 SOLVER(finalize_complex)(&ip);
111 static void glacier_cv(
int N,
int M,
int M_cv,
unsigned solver_flags)
113 int j, k, k0, k1, l, my_N[2], my_n[2];
116 SOLVER(plan_complex) ip;
123 my_n[0] = (int)NFFT(next_power_of_2)(N);
125 my_n[1] = (int)NFFT(next_power_of_2)(N);
126 NFFT(init_guru)(&p, 2, my_N, M_re, my_n, 6,
127 PRE_PHI_HUT | PRE_FULL_PSI |
128 MALLOC_X | MALLOC_F_HAT | MALLOC_F |
129 FFTW_INIT | FFT_OUT_OF_PLACE,
130 FFTW_MEASURE | FFTW_DESTROY_INPUT);
133 SOLVER(init_advanced_complex)(&ip, (NFFT(mv_plan_complex)*) (&p), solver_flags);
136 cp_y = (NFFT_C*) NFFT(malloc)((size_t)(M) *
sizeof(NFFT_C));
137 NFFT(init_guru)(&cp, 2, my_N, M, my_n, 6,
138 PRE_PHI_HUT | PRE_FULL_PSI |
139 MALLOC_X | MALLOC_F |
140 FFTW_INIT | FFT_OUT_OF_PLACE,
141 FFTW_MEASURE | FFTW_DESTROY_INPUT);
143 cp.f_hat = ip.f_hat_iter;
146 fp = fopen(
"input_data.dat",
"r");
147 for (j = 0; j < cp.M_total; j++)
149 fscanf(fp,
"%" NFFT__FES__
" %" NFFT__FES__
" %" NFFT__FES__, &cp.x[2 * j + 0], &cp.x[2 * j + 1], &tmp_y);
155 for (j = 0; j < p.M_total; j++)
157 p.x[2 * j + 0] = cp.x[2 * j + 0];
158 p.x[2 * j + 1] = cp.x[2 * j + 1];
163 if (p.flags & PRE_ONE_PSI)
164 NFFT(precompute_one_psi)(&p);
167 if (cp.flags & PRE_ONE_PSI)
168 NFFT(precompute_one_psi)(&cp);
171 if (ip.flags & PRECOMPUTE_DAMP)
172 for (k0 = 0; k0 < p.N[0]; k0++)
173 for (k1 = 0; k1 < p.N[1]; k1++)
174 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])),
175 NFFT_K(0.5), NFFT_K(3.0), NFFT_K(0.001))
176 *
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));
179 for (k = 0; k < p.N_total; k++)
180 ip.f_hat_iter[k] = NFFT_K(0.0);
183 SOLVER(before_loop_complex)(&ip);
185 for (l = 0; l < 40; l++)
186 SOLVER(loop_one_step_complex)(&ip);
190 NFFT_CSWAP(p.f_hat, ip.f_hat_iter);
192 NFFT_CSWAP(p.f_hat, ip.f_hat_iter);
193 NFFT(upd_axpy_complex)(p.f, -1, ip.y, M_re);
194 r = NFFT_M(sqrt)(NFFT(dot_complex)(p.f, M_re) / NFFT(dot_complex)(cp_y, M));
195 fprintf(stderr,
"r=%1.2" NFFT__FES__
", ", r);
196 printf(
"$%1.1" NFFT__FES__
"$ & ", r);
199 NFFT(upd_axpy_complex)(&cp.f[M_re], -1, &cp_y[M_re], M_cv);
200 r = NFFT_M(sqrt)(NFFT(dot_complex)(&cp.f[M_re], M_cv) / NFFT(dot_complex)(cp_y, M));
201 fprintf(stderr,
"r_1=%1.2" NFFT__FES__
"\t", r);
202 printf(
"$%1.1" NFFT__FES__
"$ & ", r);
205 SOLVER(finalize_complex)(&ip);
210 int main(
int argc,
char **argv)
216 fprintf(stderr,
"Call this program from the Matlab script glacier.m!");
221 glacier(atoi(argv[1]), atoi(argv[2]));
223 for (M_cv = atoi(argv[3]); M_cv <= atoi(argv[5]); M_cv += atoi(argv[4]))
225 fprintf(stderr,
"\nM_cv=%d,\t", M_cv);
226 printf(
"$%d$ & ", M_cv);
227 fprintf(stderr,
"cgne+damp: ");
228 glacier_cv(atoi(argv[1]), atoi(argv[2]), M_cv, CGNE | PRECOMPUTE_DAMP);
231 fprintf(stderr,
"cgnr: ");
232 glacier_cv(atoi(argv[1]), atoi(argv[2]), M_cv, CGNR);
233 fprintf(stderr,
"cgnr: ");
234 glacier_cv(atoi(argv[1]) / 4, atoi(argv[2]), M_cv, CGNR);
235 printf(
"XXX \\\\\n");
238 fprintf(stderr,
"\n");
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.