Tracer advection in a accelerating frame of reference
set xr [8:512]
set yr [1e-5:10]
set grid
set logscale x 2
set logscale y
set size square
set xlabel 'N'
set ylabel 'L_1'
plot 'out' t 'Data', 1e6*x**(-4) t '4th order'
reset
set xr [8:512]
set yr [0:40]
set grid
set logscale x 2
set size square
set xlabel 'N'
set ylabel 'Sum of squares'
plot 'out' u 1:3 t 'Data', 33.333 t 'Perfect noise'
#include "nsf4t.h"
#include "view.h"
scalar s[], n[], * tracers = {s, n};
double ax = 0.1, ay, uo = 0.5, tend;
int main() {
foreach_dimension()
periodic (left);
L0 = 10;
X0 = Y0 = -L0/2;
tend = (-uo + sqrt(sq(uo) - 2*ax*-L0))/(ax); // ABC formula
ay = 2*L0/sq(tend);
const vector av[] = {ax, ay};
a = av;
for (N = 16; N <= 256; N *= 2)
run();
}
event init (t = 0) {
foreach_face(x)
u.x[] = uo;
foreach_vert() {
s[] = exp(-sq(x) - sq(y));
n[] = noise();
}
}
event mover (t += 0.5) {
squares ("s", min = -0.1, max = 1.1);
save ("s.mp4");
squares ("n", min = -1, max = 1, map = cool_warm);
save ("n.mp4");
// There is an issue with these:
// output_ppm (s, file = "s.png", n = 300);
// output_ppm (n, file = "n.mp4", n = 300, min = -1, max = 1);
}
event stop (t = tend) {
event ("mover");
double e = 0, E = 0;
foreach_vert() {
e += dv()*fabs(s[] - exp(-sq(x) - sq(y)));
E += dv()*sq(n[]);
}
printf ("%d %g %g\n", N, e, E);
}