42 static double my_weight(
double z,
double a,
double b,
double c)
 
   44     return pow(0.25-z*z,b)/(c+pow(fabs(z),2*a));
 
   50   int j,k,k0,k1,l,my_N[2],my_n[2];
 
   57   my_N[0]=N; my_n[0]=X(next_power_of_2)(N);
 
   58   my_N[1]=N; my_n[1]=X(next_power_of_2)(N);
 
   59   nfft_init_guru(&p, 2, my_N, M, my_n, 6,
 
   60      PRE_PHI_HUT| PRE_FULL_PSI|
 
   61      MALLOC_X| MALLOC_F_HAT| MALLOC_F|
 
   62      FFTW_INIT| FFT_OUT_OF_PLACE,
 
   63      FFTW_MEASURE| FFTW_DESTROY_INPUT);
 
   67   fprintf(stderr,
"Using the generic solver!");
 
   70   fp=fopen(
"input_data.dat",
"r");
 
   73       fscanf(fp,
"%le %le %le",&p.
x[2*j+0],&p.
x[2*j+1],&tmp_y);
 
   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++)
 
   87       my_weight(((
double)(k0-p.
N[0]/2))/p.
N[0],0.5,3,0.001)*
 
   88       my_weight(((
double)(k1-p.
N[1]/2))/p.
N[1],0.5,3,0.001);
 
   95   solver_before_loop_complex(&ip);
 
   98       fprintf(stderr,
"Residual ||r||=%e,\n",sqrt(ip.
dot_r_iter));
 
  110 static void glacier_cv(
int N,
int M,
int M_cv,
unsigned solver_flags)
 
  112   int j,k,k0,k1,l,my_N[2],my_n[2];
 
  116   double _Complex* cp_y;
 
  121   my_N[0]=N; my_n[0]=X(next_power_of_2)(N);
 
  122   my_N[1]=N; my_n[1]=X(next_power_of_2)(N);
 
  123   nfft_init_guru(&p, 2, my_N, M_re, my_n, 6,
 
  124      PRE_PHI_HUT| PRE_FULL_PSI|
 
  125      MALLOC_X| MALLOC_F_HAT| MALLOC_F|
 
  126      FFTW_INIT| FFT_OUT_OF_PLACE,
 
  127      FFTW_MEASURE| FFTW_DESTROY_INPUT);
 
  134   cp_y = (
double _Complex*) 
nfft_malloc(M*
sizeof(
double _Complex));
 
  135   nfft_init_guru(&cp, 2, my_N, M, my_n, 6,
 
  136      PRE_PHI_HUT| PRE_FULL_PSI|
 
  138      FFTW_INIT| FFT_OUT_OF_PLACE,
 
  139      FFTW_MEASURE| FFTW_DESTROY_INPUT);
 
  144   fp=fopen(
"input_data.dat",
"r");
 
  147       fscanf(fp,
"%le %le %le",&cp.
x[2*j+0],&cp.
x[2*j+1],&tmp_y);
 
  155       p.
x[2*j+0]=cp.
x[2*j+0];
 
  156       p.
x[2*j+1]=cp.
x[2*j+1];
 
  162     nfft_precompute_one_psi(&p);
 
  166     nfft_precompute_one_psi(&cp);
 
  169   if(ip.
flags & PRECOMPUTE_DAMP)
 
  170     for(k0=0;k0<p.
N[0];k0++)
 
  171       for(k1=0;k1<p.
N[1];k1++)
 
  173       my_weight(((
double)(k0-p.
N[0]/2))/p.
N[0],0.5,3,0.001)*
 
  174       my_weight(((
double)(k1-p.
N[1]/2))/p.
N[1],0.5,3,0.001);
 
  181   solver_before_loop_complex(&ip);
 
  193   fprintf(stderr,
"r=%1.2e, ",r);
 
  194   printf(
"$%1.1e$ & ",r);
 
  199   fprintf(stderr,
"r_1=%1.2e\t",r);
 
  200   printf(
"$%1.1e$ & ",r);
 
  209 int main(
int argc, 
char **argv)
 
  215       fprintf(stderr,
"Call this program from the Matlab script glacier.m!");
 
  220     glacier(atoi(argv[1]),atoi(argv[2]));
 
  222     for(M_cv=atoi(argv[3]);M_cv<=atoi(argv[5]);M_cv+=atoi(argv[4]))
 
  224   fprintf(stderr,
"\nM_cv=%d,\t",M_cv);
 
  225   printf(
"$%d$ & ",M_cv);
 
  226   fprintf(stderr,
"cgne+damp: ");
 
  227   glacier_cv(atoi(argv[1]),atoi(argv[2]),M_cv,CGNE| PRECOMPUTE_DAMP);
 
  230   fprintf(stderr,
"cgnr: ");
 
  231   glacier_cv(atoi(argv[1]),atoi(argv[2]),M_cv,CGNR);
 
  232   fprintf(stderr,
"cgnr: ");
 
  233   glacier_cv(atoi(argv[1])/4,atoi(argv[2]),M_cv,CGNR);
 
  234   printf(
"XXX \\\\\n");
 
  237   fprintf(stderr,
"\n");