/**
# Vortex Ejection from a mode 3 instability
According to [Kizner et
al. (2013)](https://www.cambridge.org/core/journals/journal-of-fluid-mechanics/article/instabilities-of-the-flow-around-a-cylinder-and-emission-of-vortex-dipoles/2327C2CFA76059D27461A2BC6A09F146),
a flow around a no-slip cylinder with radius $R$ maybe unstable and eject three
dipolar vortex pairs. We study the flow using embedded boundaries and
the Navier-Stokes solver with the double-projection scheme. Furthermore, we will `view` our results.
*/
#include "embed.h"
#include "navier-stokes/centered.h"
#include "navier-stokes/double-projection.h"
#include "view.h"
/**
The maximum resolution is set to $\Delta_{min}=R/100$. This allows to run on the sandbox server (see `[Pushing the resolution](kizner.c#note-on-pushing-the-resolution.)' section).
*/
int maxlevel = 12;
double Re = 30000.;
face vector muc[];
int main(){
init_grid(64);
L0 = 40.;
mu = muc;
X0 = Y0 = -L0/2.;
/**
Rather than choosing stress-free outer-domain boundaries, periodic
boundaries are used. This markably increased the congergence
properties of the iterative Multigrid strategy applied to the
advection and viscous problems.
*/
foreach_dimension()
periodic(left);
run();
}
event properties (i++){
foreach_face()
muc.x[] = fm.x[]/Re;
boundary ((scalar*){muc});
}
/**
The cylinder is defined and the flow field is initialized c.f. Kizner
et al. (2013) with an $m=3$ perturbation.
*/
#define RAD (pow(sq(x) + sq(y), 0.5))
#define THETA(M) (M*asin(x/RAD))
#define RADP(P, M) ((1 + P*sin(THETA(M)))/(pow(1 + 0.5*sq(P), 0.5)))
double a1 = 1.5, b1 = 2.25;
double P = 0.005, m = 3;
event init(t = 0){
double gamma = (sq(a1) - 1.)/(sq(b1) - sq(a1));
refine (RAD < b1 && level < (maxlevel - 1));
refine (RAD < 1.05 && RAD > 0.95 && level < maxlevel);
vertex scalar phi[];
foreach_vertex()
phi[] = RAD - 1;
fractions(phi, cs, fs);
foreach(){
double r = RAD;
double r1 = RADP(P,m)*r;
double vr;
if (r1 > 0.9 && r1 < a1)
vr = r1 - 1./r1;
else if (r1 >= a1 && r1 <= b1)
vr = -gamma*r1 + ((1 + gamma)*sq(a1) - 1.)/r1;
else // (0.9 > r || r > b)
vr = 0;
u.x[] = cm[]*0.5*vr*r*-y/(sq(x) + sq(y));
u.y[] = cm[]*0.5*vr*r* x/(sq(x) + sq(y));
}
/**
The boundary conditions on the embedded boundary are set:
*/
u.t[embed] = dirichlet (0.);
u.n[embed] = dirichlet (0.);
boundary (all);
/**
Since the perturbed initialized solution is slightly inconsistent, the
Poisson solver is tuned to be extra robust for the first ten
timesteps.
*/
CFL = 0.6;
DT = 0.02;
TOLERANCE = 1E-4;
NITERMIN = 5;
}
event relax_a_little (i = 10)
NITERMIN = 1;
/**
The grid is adaptedively refined and coarsened to properly represent
the boundary and the evolution of the flow field. We set
$\zeta_{u,v}\approx U_{max}/100$.
*/
event adapt (i++)
adapt_wavelet ({cs, u.x, u.y}, (double[]){0.01, 0.004, 0.004}, maxlevel);
/**
## Ouput and Results
Movies are generated that display the vorticity dynamics and the
grid-cell structure.
*/
event movie (t += 0.4; t <= 100){
scalar omega[];
vorticity (u, omega);
boundary ({omega});
view (fov = 7, width = 600, height = 600, samples = 1);
clear();
draw_vof ("cs", filled = -1, fc = {1., 1., 1.});
squares ("omega", min = -0.75, max = 0.75,
map = cool_warm, linear = true);
draw_vof ("cs", "fs", lw = 2);
save ("kizner12.mp4");
clear();
cells();
save("kizner_cells12.mp4");
}
/**
Furthermore, we log the number of grid cells over time.
*/
event logger(t += 0.1){
int cells = 0;
foreach()
cells++;
printf("%g\t%d\t%d\t%g\t%g\t%d\t%d\t%d\n",
t, i, cells, dt, DT, mgp.i, mgpf.i, mgu.i);
}
/**
~~~gnuplot These numbers may be compared against the millions of cells that Kizner et al. (2013) employed.
set yr [0 : 22000]
set xlabel 'time'
set ylabel 'Cells'
set key off
plot 'out' u 1:3 w l lw 2
~~~
## Note on pushing the resolution.
A run with 13 levels of refinement was also performed offline. The
resulting animation can be viewed via [vimeo](https://vimeo.com/305325218). Note that the
refinement criterion was reduced ($\zeta_{u,v} = 0.002$), increasing
the maximum number of cells to 50000. Furthermore, the `CFL` number
was lowered (0.3) and the value of `NITERMIN` was set to `3`. It would
be nice if the methods were more robust.
##Reference
Kizner, Z., Makarov, V., Kamp, L., & Van Heijst, G. (2013). *Instabilities of the flow around a cylinder and emission of vortex dipoles*. Journal of Fluid Mechanics, 730, 419-441. doi:10.1017/jfm.2013.345
*/