47 int main(
int argc,
char **argv)
57 double _Complex (*kernel)(double , int ,
const double *);
60 double _Complex *direct;
71 printf(
"\nfastsum_test d N M n m p kernel c\n\n");
72 printf(
" d dimension \n");
73 printf(
" N number of source nodes \n");
74 printf(
" M number of target nodes \n");
75 printf(
" n expansion degree \n");
76 printf(
" m cut-off parameter \n");
77 printf(
" p degree of smoothness \n");
78 printf(
" kernel kernel function (e.g., gaussian)\n");
79 printf(
" c kernel parameter \n");
80 printf(
" eps_I inner boundary \n");
81 printf(
" eps_B outer boundary \n\n");
87 N=atoi(argv[2]); c=1.0/pow((
double)N,1.0/(
double)d);
96 if (strcmp(s,
"gaussian")==0)
98 else if (strcmp(s,
"multiquadric")==0)
99 kernel = multiquadric;
100 else if (strcmp(s,
"inverse_multiquadric")==0)
101 kernel = inverse_multiquadric;
102 else if (strcmp(s,
"logarithm")==0)
104 else if (strcmp(s,
"thinplate_spline")==0)
105 kernel = thinplate_spline;
106 else if (strcmp(s,
"one_over_square")==0)
107 kernel = one_over_square;
108 else if (strcmp(s,
"one_over_modulus")==0)
109 kernel = one_over_modulus;
110 else if (strcmp(s,
"one_over_x")==0)
112 else if (strcmp(s,
"inverse_multiquadric3")==0)
113 kernel = inverse_multiquadric3;
114 else if (strcmp(s,
"sinc_kernel")==0)
115 kernel = sinc_kernel;
116 else if (strcmp(s,
"cosc")==0)
118 else if (strcmp(s,
"cot")==0)
123 kernel = multiquadric;
126 printf(
"d=%d, N=%d, M=%d, n=%d, m=%d, p=%d, kernel=%s, c=%g, eps_I=%g, eps_B=%g \n",d,N,M,n,m,p,s,c,eps_I,eps_B);
129 fastsum_init_guru(&my_fastsum_plan, d, N, M, kernel, &c, 0, n, m, p, eps_I, eps_B);
133 fid1=fopen(
"x.dat",
"r");
134 fid2=fopen(
"alpha.dat",
"r");
139 fscanf(fid1,
"%le",&my_fastsum_plan.
x[k*d+t]);
141 fscanf(fid2,
"%le",&temp); my_fastsum_plan.
alpha[k] = temp;
142 fscanf(fid2,
"%le",&temp); my_fastsum_plan.
alpha[k] += temp*_Complex_I;
148 fid1=fopen(
"y.dat",
"r");
153 fscanf(fid1,
"%le",&my_fastsum_plan.
y[j*d+t]);
159 printf(
"direct computation: "); fflush(NULL);
163 time=nfft_elapsed_seconds(t1,t0);
164 printf(
"%fsec\n",time);
167 direct = (
double _Complex *)
nfft_malloc(my_fastsum_plan.
M_total*(
sizeof(
double _Complex)));
168 for (j=0; j<my_fastsum_plan.
M_total; j++)
169 direct[j]=my_fastsum_plan.
f[j];
172 printf(
"pre-computation: "); fflush(NULL);
176 time=nfft_elapsed_seconds(t1,t0);
177 printf(
"%fsec\n",time);
180 printf(
"fast computation: "); fflush(NULL);
184 time=nfft_elapsed_seconds(t1,t0);
185 printf(
"%fsec\n",time);
189 for (j=0; j<my_fastsum_plan.
M_total; j++)
191 if (cabs(direct[j]-my_fastsum_plan.
f[j])/cabs(direct[j])>error)
192 error=cabs(direct[j]-my_fastsum_plan.
f[j])/cabs(direct[j]);
194 printf(
"max relative error: %e\n",error);
197 fid1=fopen(
"f.dat",
"w+");
198 fid2=fopen(
"f_direct.dat",
"w+");
206 temp=creal(my_fastsum_plan.
f[j]);
207 fprintf(fid1,
" % .16e",temp);
208 temp=cimag(my_fastsum_plan.
f[j]);
209 fprintf(fid1,
" % .16e\n",temp);
211 temp=creal(direct[j]);
212 fprintf(fid2,
" % .16e",temp);
213 temp=cimag(direct[j]);
214 fprintf(fid2,
" % .16e\n",temp);