sandbox/Antoonvh/tlsrk.c

    A test for the Low-Storage RK integrator

    \displaystyle s_t = s, \displaystyle s(0) = 1.

    set xr [0.5:16000]
    set yr [1e-10:1e5]
    set logscale xy
    set xlabel 'Error'
    set ylabel 'Steps'
    set size square
    set grid
    plot 'out' t 'data', 1e6*x**(-4) t '4th order'
    (script)

    (script)

    #define RKORDER 4
    #include "lsrk.h"
    
    void df_is_f (scalar * al, scalar * bl) {
      scalar a, b;
      foreach() {
        for (a, b in al, bl) 
          b[] =  a[];
      }
    }
    
    double tend = 10;
    scalar s[];
    
    int main () {
      N = 1;
      for (DT = tend; DT > 0.001; DT /= 2)
        run();
    }
    
    event init (t = 0) {
      foreach()
        s[] = 1;
    }
    
    event step (i++, last) {
      dt = dtnext (DT);
      A_Time_Step ({s}, DT, df_is_f);
    }
      
    event stop (t = tend) {
      foreach()
        printf ("%d %g\n", (int) (tend/DT + 0.5), fabs(s[] - exp(tend)));
      return 1;
    }