/**
![Solitary waves are a source of happiness to a broad audiance. Image
via [ESA
science](http://sci.esa.int/cluster/42436-soliton-in-water/).](https://sci.esa.int/documents/34817/35562/1567218782764-CTS-070308-image1-410b.jpg)
# Soliton Solutions to the Korteweg-De Vries Equation
So-called soliton solutions may exist as a special case to special
equations. This entails that a *solution* shape, while it moves
through space, does not deform over time. Meaning that observations of
such phenomenon may be expected to be either very rare (special
solutions to special equations) or very common (since they persist
over time for many to observe). In this example we follow the soliton
solution as listed by
[wikipedia](https://en.wikipedia.org/wiki/Korteweg%E2%80%93de_Vries_equation)
page on the Korteweg-De Vries equation. Fortunately, there is a solver
to this equation in my sandbox.
*/
#include "grid/multigrid1D.h"
#include "KdV.h"
#include "run.h"
/**
We study two soliton solutions, both described by:
$$c(x,t) = -\frac{v}{2 \mathrm{cosh}^2\left(\frac{\sqrt{v}}{2}(x - vt - b)\right)}$$
for $v = 1$ and $v = 2$. To omit the most prominent issues at the
boundaries, we place them far away from the region of interest.
*/
scalar C[], CC[];
int main(){
L0 = 50;
X0 = -L0/2;
init_grid(512);
run();
}
/**
## Initialization
We initialize the solution fields and we also, to help visualize the data, we open a pipeline for output
plots with `gnuplot`.
*/
FILE * gnuplotPipe;
event init(t = 0){
double v = 2;
foreach()
C[] = (-v/(2.*sq(cosh(pow(v, 0.5)*0.5*(x + 12)))) -
1/(2.*sq(cosh(0.5*(x + 3)))));
DT = 0.01;
gnuplotPipe = popen ("gnuplot", "w");
fprintf(gnuplotPipe,
"set term pngcairo\n"
"set xr [-15: 15]\n"
"set yr [-1.8: 0.1]\n"
"set key bottom left\n"
"set grid\n"
"set title 'KdV Solitons'\n"
"set xlabel 'x'\n"
"set ylabel 'c'\n");
}
/**
## Time integration
User convienience is provided via the `KdV()`-fuction interface.
*/
event advance(i++) {
dt = dtnext (DT);
KdV({C, CC}, dt);
}
/**
## Output many plots
Each two time steps we output a plot that is produced via the pipe.
*/
int frame = 0;
event movie(i += 2){
fprintf(gnuplotPipe, "set output 'plot%d.png'\n", frame);
fprintf(gnuplotPipe, "plot '-' w l lw 5 t 'C', '-' w l lw 3 t 'CC'\n");
foreach()
fprintf(gnuplotPipe, "%g %g\n",x, C[]);
fprintf(gnuplotPipe, "e\n");
foreach()
fprintf(gnuplotPipe, "%g %g\n",x, CC[]);
fprintf(gnuplotPipe, "e\n");
frame++;
}
/**
## Creation of a movie from plots
We use Gnu/Linux commands and `ffmpeg` to generate a movie
from all our plots.
*/
event stop (t = 12){
system("rm mov.mp4");
system("ffmpeg -r 25 -f image2 -i plot%d.png -c:v libx264 -vf format=yuv420p -y mov.mp4");
system("rm plot*");
return 1;
}
/**
## Result
We can check if the solutions are indeed solitons.
![Well done `KdV()` function](KdV/mov.mp4)
## See also
* [A Vortex Soliton Colliding with a Wall](lamb-dipole.c)
*/