src/test/poisson1D.c

    #include "grid/multigrid1D.h"
    #include "utils.h"
    #include "poisson.h"
    
    scalar a[], b[];
    
    double solution (double x)
    {
      return sin(3.*pi*x);
    }
    
    /* Dirichlet condition on all boundaries */
    a[right]  = dirichlet (solution(x));
    a[left]   = dirichlet (solution(x));
    
    int main (int argc, char ** argv)
    {
      size (1.[0]);
      origin (-0.5, -0.5);
    
      for (int depth = 5; depth <= 8; depth++) {
        init_grid (1 << depth);
    
        foreach() {
          b[] = - sq(3.*pi)*sin (3.*pi*x);
          a[] = 0.;
        }
    
        TOLERANCE = 1e-4;
        poisson (a, b);
    
        double max = 0;
        foreach() {
          double e = a[] - solution(x);
          if (fabs(e) > max) max = fabs(e);
          printf ("%g %g %g %g\n", x, a[], b[], e);
        }
        fprintf (stderr, "%d %g\n", depth, max);
      }
    }
    
    /** After the program has finished we plot the error as a function of *n*
    
    ~~~gnuplot
    set logscale y
    set xlabel 'level'
    set ylabel 'normf(e).max'
    fit a*x+b 'log' u 1:(log($2)) via a,b
    plot [4:9]'log' pt 7 t '', exp(a*x+b) t sprintf("%.0f/n^{%4.2f}", exp(b), -a/log(2.))

    */

    ~~~