NFFT Logo 3.0 API Reference
Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals

fastsum_matlab.c

Go to the documentation of this file.
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   /*fastsum_init_guru(&my_fastsum_plan, d, N, M, kernel, &c, EXACT_NEARFIELD, n, m, p);*/
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 /* \} */

Generated on 1 Nov 2006 by Doxygen 1.4.4