00001
00008 #include <stdlib.h>
00009 #include <stdio.h>
00010 #include <string.h>
00011 #include <complex.h>
00012 #include <math.h>
00013
00014 #include "fastsum.h"
00015 #include "kernels.h"
00016
00023 int main(int argc, char **argv)
00024 {
00025 int j,k,t;
00026 int d;
00027 int N;
00028 int M;
00029 int n;
00030 int m;
00031 int p;
00032 char *s;
00033 complex (*kernel)(double , int , const double *);
00034 double c;
00035 fastsum_plan my_fastsum_plan;
00036 complex *direct;
00037 double time;
00038 double error=0.0;
00039 double eps_I;
00040 double eps_B;
00041 FILE *fid1, *fid2;
00042 double temp;
00043
00044 if (argc!=11)
00045 {
00046 printf("\nfastsum_test d N M n m p kernel c\n\n");
00047 printf(" d dimension \n");
00048 printf(" N number of source nodes \n");
00049 printf(" M number of target nodes \n");
00050 printf(" n expansion degree \n");
00051 printf(" m cut-off parameter \n");
00052 printf(" p degree of smoothness \n");
00053 printf(" kernel kernel function (e.g., gaussian)\n");
00054 printf(" c kernel parameter \n");
00055 printf(" eps_I inner boundary \n");
00056 printf(" eps_B outer boundary \n\n");
00057 exit(-1);
00058 }
00059 else
00060 {
00061 d=atoi(argv[1]);
00062 N=atoi(argv[2]); c=1.0/pow((double)N,1.0/(double)d);
00063 M=atoi(argv[3]);
00064 n=atoi(argv[4]);
00065 m=atoi(argv[5]);
00066 p=atoi(argv[6]);
00067 s=argv[7];
00068 c=atof(argv[8]);
00069 eps_I=atof(argv[9]);
00070 eps_B=atof(argv[10]);
00071 if (strcmp(s,"gaussian")==0)
00072 kernel = gaussian;
00073 else if (strcmp(s,"multiquadric")==0)
00074 kernel = multiquadric;
00075 else if (strcmp(s,"inverse_multiquadric")==0)
00076 kernel = inverse_multiquadric;
00077 else if (strcmp(s,"logarithm")==0)
00078 kernel = logarithm;
00079 else if (strcmp(s,"thinplate_spline")==0)
00080 kernel = thinplate_spline;
00081 else if (strcmp(s,"one_over_square")==0)
00082 kernel = one_over_square;
00083 else if (strcmp(s,"one_over_modulus")==0)
00084 kernel = one_over_modulus;
00085 else if (strcmp(s,"one_over_x")==0)
00086 kernel = one_over_x;
00087 else if (strcmp(s,"inverse_multiquadric3")==0)
00088 kernel = inverse_multiquadric3;
00089 else if (strcmp(s,"sinc_kernel")==0)
00090 kernel = sinc_kernel;
00091 else if (strcmp(s,"cosc")==0)
00092 kernel = cosc;
00093 else if (strcmp(s,"cot")==0)
00094 kernel = cot;
00095 else
00096 {
00097 s="multiquadric";
00098 kernel = multiquadric;
00099 }
00100 }
00101 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);
00102
00104 fastsum_init_guru(&my_fastsum_plan, d, N, M, kernel, &c, 0, n, m, p, eps_I, eps_B);
00105
00106
00108 fid1=fopen("x.dat","r");
00109 fid2=fopen("alpha.dat","r");
00110 for (k=0; k<N; k++)
00111 {
00112 for (t=1; t<d; t++)
00113 {
00114 fscanf(fid1,"%le",&my_fastsum_plan.x[k*d+t]);
00115 }
00116 fscanf(fid2,"%le",&temp); my_fastsum_plan.alpha[k] = temp;
00117 fscanf(fid2,"%le",&temp); my_fastsum_plan.alpha[k] += temp*I;
00118 }
00119 fclose(fid1);
00120 fclose(fid2);
00121
00123 fid1=fopen("y.dat","r");
00124 for (j=0; j<M; j++)
00125 {
00126 for (t=1; t<d; t++)
00127 {
00128 fscanf(fid1,"%le",&my_fastsum_plan.y[j*d+t]);
00129 }
00130 }
00131 fclose(fid1);
00132
00134 printf("direct computation: "); fflush(NULL);
00135 time=nfft_second();
00136 fastsum_exact(&my_fastsum_plan);
00137 time=nfft_second()-time;
00138 printf("%fsec\n",time);
00139
00141 direct = (complex *)malloc(my_fastsum_plan.M_total*(sizeof(complex)));
00142 for (j=0; j<my_fastsum_plan.M_total; j++)
00143 direct[j]=my_fastsum_plan.f[j];
00144
00146 printf("pre-computation: "); fflush(NULL);
00147 time=nfft_second();
00148 fastsum_precompute(&my_fastsum_plan);
00149 time=nfft_second()-time;
00150 printf("%fsec\n",time);
00151
00153 printf("fast computation: "); fflush(NULL);
00154 time=nfft_second();
00155 fastsum_trafo(&my_fastsum_plan);
00156 time=nfft_second()-time;
00157 printf("%fsec\n",time);
00158
00160 error=0.0;
00161 for (j=0; j<my_fastsum_plan.M_total; j++)
00162 {
00163 if (cabs(direct[j]-my_fastsum_plan.f[j])/cabs(direct[j])>error)
00164 error=cabs(direct[j]-my_fastsum_plan.f[j])/cabs(direct[j]);
00165 }
00166 printf("max relative error: %e\n",error);
00167
00169 fid1=fopen("f.dat","w+");
00170 fid2=fopen("f_direct.dat","w+");
00171 if (fid1==NULL)
00172 {
00173 printf("Fehler!\n");
00174 exit(-1);
00175 }
00176 for (j=0; j<M; j++)
00177 {
00178 temp=creal(my_fastsum_plan.f[j]);
00179 fprintf(fid1," % .16e",temp);
00180 temp=cimag(my_fastsum_plan.f[j]);
00181 fprintf(fid1," % .16e\n",temp);
00182
00183 temp=creal(direct[j]);
00184 fprintf(fid2," % .16e",temp);
00185 temp=cimag(direct[j]);
00186 fprintf(fid2," % .16e\n",temp);
00187 }
00188 fclose(fid1);
00189 fclose(fid2);
00190
00192 fastsum_finalize(&my_fastsum_plan);
00193
00194 return 0;
00195 }
00196