src/test/stencils.c

    Automatic stencils / boundary conditions

    int main()
    {
      init_grid (8);
    
      scalar s[];

    This should warn (once) that we are assigning a scalar multiple times.

      for (int i = 1; i < 2; i++)
        foreach_face()
          s[] = 1;

    This should set s as the y-component of a face vector.

      foreach_face(y)
        s[] = 1;

    This should set v to be a face vector.

      vector v[];
      foreach_face()
        v.x[] = 1;

    Same thing for the components of a tensor.

      tensor Fq[];
      foreach_face()
        Fq.x.x[] = Fq.y.x[] = 0.;

    This should set Fv.x.y as a vertex scalar.

      tensor Fv[];
      foreach_vertex()
        Fv.x.y[] = 1;

    Here flux boundary conditions should be imposed on s[].

      scalar a[];
      foreach()
        a[] = (s[0,1] - s[])/Delta;

    Here we use ‘tangential’ values of the face vector y-component ‘s’, so central boundary conditions need to be imposed.

      foreach()
        a[] = (s[1] - s[])/Delta;

    If normal boundary conditions are set, central boundary conditions should be imposed (not just fluxes).

      foreach_face(y)
        s[] = 1;
    
      s[top] = 0.;
      foreach()
        a[] = (s[0,1] - s[])/Delta;

    The same but for face vectors.

      face vector f[];
      foreach_face()
        f.x[] = 1;

    Flux BCs here.

      foreach()
        a[] = (f.y[0,1] - f.y[])/Delta;

    Central BCs here.

      f.n[top] = 0.;
      foreach()
        a[] = (f.y[0,1] - f.y[])/Delta;

    This should warn that we are assigning a face vector using a foreach() loop.

      foreach()
        f.x[] = 2;

    This should warn that we are assigning a vertex scalar using a foreach() loop.

      vertex scalar b[];
      foreach()
        b[] = 2;

    This should warn that we are using a global variable without reduction.

      double t = 0;
      foreach()
        t++;
    }