src/test/stream.c

Merging of two vertices

Studying the interaction of two incompressible vortices is interesting for example as a basic model of two-dimensional turbulence. Here we solve the incompressible 2D Euler equations using a vorticity–streamfunction formulation.

#include "navier-stokes/stream.h"

The domain is centered on (0,0) and the maximum level of refinement is 8 i.e. the initial grid has N=28=256 grid points per dimension.

#define MAXLEVEL 8

int main()
{
  origin (-0.5, -0.5);
  init_grid (1 << MAXLEVEL);
  run();
}

The initial vorticity field is composed of two Gaussian vortices separated by twice dd and with caracteristic radii dd/10.

event init (i = 0)
{
  double dd = 0.1;
  foreach()
    ω[] = (exp(-(sq(x - dd) + sq(y))/(dd/10.)) +
	       exp(-(sq(x + dd) + sq(y))/(dd/10.)));
}

We output some statistics on the vorticity field and Poisson solver at the start and end of the simulation.

event logfile (t = {0,30}) {
  stats s = statsf (ω);
  fprintf (stderr, "%g %d %g %g %d\n", t, i, dt, s.sum, mgpsi.i);
}

We output the vorticity and level fields at regular intervals in a format compatible with gnuplot.

event output (t += 5) {
  static int nf = 0;
  char name[80];
  sprintf (name, "omega-%d", nf);
  FILE * fp = fopen (name, "w");
  output_field ({ω}, fp, linear = true);
  fclose (fp);
  
  scalar l[];
  foreach()
    l[] = level;
  sprintf (name, "level-%d", nf);
  fp = fopen (name, "w");
  output_field ({l}, fp);
  fclose (fp);
  nf++;
}

If we are using a quadtree grid, it is adapted using wavelet error control on ω.

#if TREE
event adapt (i++) {
  adapt_wavelet ({ω}, (double[]){1e-2}, MAXLEVEL, list = {ω, ψ});
}
#endif

Results

After running and processing by gnuplot we get:

Evolution of the vorticity field with time.

Evolution of the vorticity field with time.

Evolution of level of refinement with time.

Evolution of level of refinement with time.

See also