sandbox/Francesco/test/transcritical-ml.c

    Transcritical flow over a bump with multiple layers

    We want to reproduce the transcritical test case of Audusse et al, 2011. The viscosity is set to \nu = 0.01 m^2/s and for the bottom friction we use the Strickler relation: \displaystyle k(h,\mathbf{U}) = \frac{g}{S^2h^{1/3}}|\mathbf{U}| with S = 25 m^{1/3}/s the Strickler coefficient, h the water depth and \mathbf{U} the depth-averaged velocity.

    #include "grid/cartesian1D.h"
    #include "saint-venant.h"
    
    int main() {
      X0 = 0.;
      L0 = 21.;
      G = 9.81;
      N = 256;
      nu = 0.01;
      gradient = zero;

    We do the test for several number of layers.

      for (nl = 2; nl <= 15; nl++)
        run();
    }

    We impose the outlet water level.

    h[right] = dirichlet(0.6);
    eta[right] = dirichlet(0.6);

    Initialitazion

    We initialize the topography, the h and we create a field hc to check convergence on h.

    scalar hc[];
    
    event init (i = 0) {
      foreach() {
        zb[] = max(0., 0.2*(1. - 1./sq(5.75/2.)*sq(x - 10.)));
        h[]  = 0.6 - zb[];
        hc[] = h[];
      }

    Boundary Conditions on velocity

    We impose a constant inflow of 1 m^2/s in the inlet and neumann condition on the outlet.

      for (vector u in ul) {
        u.n[left] = dirichlet(h[left] ? 1./h[left] : 0.);
        u.n[right] = neumann(0.);
      }
    }

    We check for convergence.

    event logfile (t += 0.1; i <= 100000) {
      double dh = change (h, hc);
      if (i > 0 && dh < 1e-3)
        return 1;
    }
    
    /* uncomment this part if you want on-the-fly animation. */
    event output (i++) {
      static FILE * fp = popen ("gnuplot", "w");
      fprintf (fp, 
               "set title 't=%f'\n"
               "set xl 'x'\nset yl 'h'\n"
               "plot [0:21][] '-' w l t 'eta', '-' u 1:3 w l t 'zb'\n", t); 
      foreach()
        fprintf (fp, "%g %g %g\n", x, eta[], zb[]);
      fprintf (fp, "e\n");
    }

    Output

    We save the value of \eta.

    event output (t = end) {
      FILE * fp1 = fopen ("end", "w");
      foreach()
        fprintf (fp1, "%g %g %g\n", x, eta[], zb[]);
      fprintf (fp1, "\n\n");
    }

    Results

    set xr [0:21]
    set yr [0:1]
    set xlabel 'x'
    set ylabel 'eta'
    plot 'end' i 0 w l t '2 layers', '' i 3 w l t '5 layers', '' i 13 w l t '15 layers', '' i 0 u 1:3 w l t 'topography' 
    Free surface and topography. (script)

    Free surface and topography. (script)