45int main(
int argc,
char **argv)
55 C (*kernel)(R, int,
const R *);
69 printf(
"\nfastsum_test d N M n m p kernel c\n\n");
70 printf(
" d dimension \n");
71 printf(
" N number of source nodes \n");
72 printf(
" M number of target nodes \n");
73 printf(
" n expansion degree \n");
74 printf(
" m cut-off parameter \n");
75 printf(
" p degree of smoothness \n");
76 printf(
" kernel kernel function (e.g., gaussian)\n");
77 printf(
" c kernel parameter \n");
78 printf(
" eps_I inner boundary \n");
79 printf(
" eps_B outer boundary \n\n");
86 c = K(1.0) / POW((R)(N), K(1.0) / ((R)(d)));
92 c = (R)(atof(argv[8]));
93 eps_I = (R)(atof(argv[9]));
94 eps_B = (R)(atof(argv[10]));
95 if (strcmp(s,
"gaussian") == 0)
97 else if (strcmp(s,
"multiquadric") == 0)
99 else if (strcmp(s,
"inverse_multiquadric") == 0)
101 else if (strcmp(s,
"logarithm") == 0)
103 else if (strcmp(s,
"thinplate_spline") == 0)
105 else if (strcmp(s,
"one_over_square") == 0)
107 else if (strcmp(s,
"one_over_modulus") == 0)
109 else if (strcmp(s,
"one_over_x") == 0)
111 else if (strcmp(s,
"inverse_multiquadric3") == 0)
113 else if (strcmp(s,
"sinc_kernel") == 0)
115 else if (strcmp(s,
"cosc") == 0)
117 else if (strcmp(s,
"cot") == 0)
119 else if (strcmp(s,
"one_over_cube") == 0)
121 else if (strcmp(s,
"log_sin") == 0)
123 else if (strcmp(s,
"laplacian_rbf") == 0)
125 else if (strcmp(s,
"der_laplacian_rbf") == 0)
127 else if (strcmp(s,
"xx_gaussian") == 0)
129 else if (strcmp(s,
"absx") == 0)
133 printf(
"Unrecognized kernel function!\n");
138 "d=%d, N=%d, M=%d, n=%d, m=%d, p=%d, kernel=%s, c=%" __FGS__
", eps_I=%" __FGS__
", eps_B=%" __FGS__
" \n",
139 d, N, M, n, m, p, s, c, eps_I, eps_B);
142 fastsum_init_guru(&my_fastsum_plan, d, N, M, kernel, &c, 0, n, m, p, eps_I,
147 fid1 = fopen(
"x.dat",
"r");
148 fid2 = fopen(
"alpha.dat",
"r");
149 for (k = 0; k < N; k++)
151 for (t = 0; t < d; t++)
153 fscanf(fid1, __FR__, &my_fastsum_plan.
x[k * d + t]);
155 fscanf(fid2, __FR__, &temp);
156 my_fastsum_plan.
alpha[k] = temp;
157 fscanf(fid2, __FR__, &temp);
158 my_fastsum_plan.
alpha[k] += temp * II;
164 fid1 = fopen(
"y.dat",
"r");
165 for (j = 0; j < M; j++)
167 for (t = 0; t < d; t++)
169 fscanf(fid1, __FR__, &my_fastsum_plan.
y[j * d + t]);
175 printf(
"direct computation: ");
180 time = NFFT(elapsed_seconds)(t1, t0);
181 printf(__FI__
"sec\n", time);
184 direct = (C *) NFFT(malloc)((size_t)(my_fastsum_plan.
M_total) * (
sizeof(C)));
185 for (j = 0; j < my_fastsum_plan.
M_total; j++)
186 direct[j] = my_fastsum_plan.
f[j];
189 printf(
"pre-computation: ");
194 time = NFFT(elapsed_seconds)(t1, t0);
195 printf(__FI__
"sec\n", time);
198 printf(
"fast computation: ");
203 time = NFFT(elapsed_seconds)(t1, t0);
204 printf(__FI__
"sec\n", time);
208 for (j = 0; j < my_fastsum_plan.
M_total; j++)
210 if (CABS(direct[j] - my_fastsum_plan.
f[j]) / CABS(direct[j]) > error)
211 error = CABS(direct[j] - my_fastsum_plan.
f[j]) / CABS(direct[j]);
213 printf(
"max relative error: " __FE__
"\n", error);
216 fid1 = fopen(
"f.dat",
"w+");
217 fid2 = fopen(
"f_direct.dat",
"w+");
220 printf(
"Error writing to file f.dat!\n");
223 for (j = 0; j < M; j++)
225 temp = CREAL(my_fastsum_plan.
f[j]);
226 fprintf(fid1,
" % .16" __FES__
"", temp);
227 temp = CIMAG(my_fastsum_plan.
f[j]);
228 fprintf(fid1,
" % .16" __FES__
"\n", temp);
230 temp = CREAL(direct[j]);
231 fprintf(fid2,
" % .16" __FES__
"", temp);
232 temp = CIMAG(direct[j]);
233 fprintf(fid2,
" % .16" __FES__
"\n", temp);
Header file for the fast NFFT-based summation algorithm.
void fastsum_precompute(fastsum_plan *ths)
precomputation for fastsum
C inverse_multiquadric(R x, int der, const R *param)
K(x)=1/sqrt(x^2+c^2)
int M_total
number of target knots
C logarithm(R x, int der, const R *param)
K(x)=log |x|.
C multiquadric(R x, int der, const R *param)
K(x)=sqrt(x^2+c^2)
void fastsum_init_guru(fastsum_plan *ths, int d, int N_total, int M_total, kernel k, R *param, unsigned flags, int nn, int m, int p, R eps_I, R eps_B)
initialization of fastsum plan
R * x
source knots in d-ball with radius 1/4-eps_b/2
C one_over_cube(R x, int der, const R *param)
K(x) = 1/x^3.
C one_over_square(R x, int der, const R *param)
K(x) = 1/x^2.
C sinc_kernel(R x, int der, const R *param)
K(x) = sin(cx)/x.
C der_laplacian_rbf(R x, int der, const R *param)
K(x) = |x|/c exp(-|x|/c)
C kcot(R x, int der, const R *param)
K(x) = cot(cx)
C one_over_modulus(R x, int der, const R *param)
K(x) = 1/|x|.
C * alpha
source coefficients
C thinplate_spline(R x, int der, const R *param)
K(x) = x^2 log |x|.
void fastsum_trafo(fastsum_plan *ths)
fast NFFT-based summation
void fastsum_exact(fastsum_plan *ths)
direct computation of sums
void fastsum_finalize(fastsum_plan *ths)
finalization of fastsum plan
C inverse_multiquadric3(R x, int der, const R *param)
K(x) = 1/sqrt(x^2+c^2)^3.
C absx(R x, int der, const R *param)
K(x) = |x|.
C gaussian(R x, int der, const R *param)
K(x)=exp(-x^2/c^2)
C one_over_x(R x, int der, const R *param)
K(x) = 1/x.
C cosc(R x, int der, const R *param)
K(x) = cos(cx)/x.
C xx_gaussian(R x, int der, const R *param)
K(x) = x^2/c^2 exp(-x^2/c^2)
R * y
target knots in d-ball with radius 1/4-eps_b/2
C log_sin(R x, int der, const R *param)
K(x) = log(|sin(cx)|)
C laplacian_rbf(R x, int der, const R *param)
K(x) = exp(-|x|/c)
Internal header file for auxiliary definitions and functions.
Header file with predefined kernels for the fast summation algorithm.
plan for fast summation algorithm