sandbox/lbattershill/multilayer-slide/slide_layered.c
Tsunami generation by a “pyroclastic” density current
This is a simulation of a pyroclastic density current entering water and generating tsunami waves. We simulate a dense layer at base of flow, overlayed by a lighter layer. The setup is dimensionless and based on the experimental geometry of Bougouin et al., 2020, where a laboratory fluidised granular flow runs down a ramp and into water. This is the multilayer version of the Navier-Stokes case (Battershill et al., 2021).
The setup is adapted from overflow.c to simulate a flow of variable density layers into water, using the Boussinesq buoyancy module of the non-hydrostatic layered scheme.
#include "grid/multigrid1D.h"
#include "layered/hydro.h"
#include "layered/nh.h"
Setting \Delta \rho directly.
#define drho(T) T
Including the relevant modules and intialising the simulation
#include "layered/dr.h"
#include "layered/remap.h"
#include "layered/rpe.h"
#include "layered/perfs.h"
#define nlayers 26
double rho_0 = 0.1;
double rho_2 = -0.1;
double rho_3 = 0.;
//double nu_H = 0.0001; // 1e-2;
int main()
{
size (32);
//breaking = 0.7;
N = 512; //2048
nl = nlayers;
nu = 0.0001;
DT = 0.0025;
G = 1.;
cell_lim = mono_limit;
system ("rm -r gnuplot");
system ("mkdir gnuplot");
system ("mkdir gnuplot/all");
system ("mkdir gnuplot/closeup");
system ("mkdir gnuplot/closeup/density");
system ("mkdir gnuplot/closeup/ux");
const scalar slip[] = HUGE;
lambda_b = slip;
run();
}
Define the geometry.
#define theta0 0.268 //angle
#define width 0.338/0.265 //width of flow
#define gradient_m -1.*tan(theta0) //gradient of slope
#define Hi 1. //initial water depth
#define slope_exposed 1.
#define Hel (slope_exposed/0.265)*sin(theta0)
#define c_intercept tan(theta0)*(width+ (Hi+Hel)/tan(theta0)) - Hi
#define height_cm 0.185/0.265
#define frac 6./7.
#define c_intercept2 height_cm + ((frac*height_cm)/(1- frac))
Initialise domain.
event init (i = 0)
{
foreach() {
zb[] = x < width ? Hel : (x < width + (Hi+Hel)/tan(theta0) ?
gradient_m*x + c_intercept : -Hi);
foreach_layer() {
if (x <= width*frac) {// Granular fluid
// DEPTH
h[] = (height_cm)/(nl);
// BUOYANCY
if (point.l < nl/2)
T[] = rho_0;
else
T[] = rho_2;
}
else if (x < width) { //Granular fluid
h[] = (-1*x*(height_cm/(width-(width*frac))) + c_intercept2 ) /nl;
if (point.l < nl/2)
T[] = rho_0;
else
T[] = rho_2;
}
else if (x < width + Hel/tan(theta0)) { // Gap
// DEPTH
h[] = 0.00002;
// BUOYANCY
T[] = rho_0;
}
else { //Water
// DEPTH
h[] = - zb[]/nl;
// BUOYANCY
T[] = rho_3;
}
}
}
}
Outputs
event logfile (i += 10)
{
static double rpe0 = 0., rpen = 0., tn = 0.;
double rpe = RPE();
double PE, KE;
energy (&PE, &KE);
if (i == 0) {
rpe0 = rpe;
fprintf (stderr, "t dt rpe-rpe0 rpe0 PE KE d_t(rpe) mgp.i\n");
}
fprintf (stderr, "%g %g %.12g %.12g %.12g %.12g %.12g %d\n", t, dt,
rpe - rpe0, rpe0, PE, KE,
t > tn ? (rpe - rpen)/(t - tn)/L0 : 0.,
#if NH
mgp.i
#else
mgH.i
#endif
);
rpen = rpe, tn = t;
}
Animations including density, u.x…
void setup (FILE * fp)
{
fprintf (fp,
#if ISOPYCNAL
"set pm3d map corners2color c2\n"
#else
"set pm3d map\n"
#endif
"# jet colormap\n"
"set palette defined ( 0 0 0 0.5647, 0.125 0 0.05882 1, 0.25"
" 0 0.5647 1, 0.375 0.05882 1 0.9333, 0.5 0.5647 1 0.4392, 0.625"
" 1 0.9333 0, 0.75 1 0.4392 0, 0.875 0.9333 0 0, 1 0.498 0 0 )\n"
"unset key\n"
"set xlabel 'x'\n"
"set ylabel 'depth'\n"
);
}
void plot_ux (FILE * fp)
{
fprintf (fp,
"set cbrange [-0.1:30]\n" // u.x
"set title 't = %.2f'\n"
"sp '-' u 1:2:3\n",t);
foreach (serial) {
double z = zb[];
fprintf (fp, "%g %g %g %g\n", x, z, u.x[], T[]);
foreach_layer() {
z += h[];
fprintf (fp, "%g %g %g %g\n", x, z, u.x[], T[]);
}
fprintf (fp, "\n");
}
fprintf (fp, "e\n\n");
fflush (fp);
}
void plot_density (FILE * fp)
{
fprintf (fp,
"set cbrange [-0.1:0.1]\n" // Density
"set title 't/T0 = %.2f'\n"
"sp '-' u 1:2:4\n",t);
foreach (serial) {
double z = zb[];
fprintf (fp, "%g %g %g %g\n", x, z, u.x[], T[]);
foreach_layer() {
z += h[];
fprintf (fp, "%g %g %g %g\n", x, z, u.x[], T[]);
}
fprintf (fp, "\n");
}
fprintf (fp, "e\n\n");
fflush (fp);
}
event gnuplot (t += 0.1)
{
static FILE * fp = popen ("gnuplot 2> /dev/null", "w");
if (i == 0)
setup (fp);
// Uncomment for animation during run.
/*
if (getenv ("DISPLAY")) {
fprintf (fp, "set term x11\n");
plot_density (fp);
}
*/
fprintf (fp,
"set term pngcairo font \",10\" size 1600,620\n"
"set xrange [0:12.5]\n"
"set yrange [-1.5:4]\n"
"set size ratio -1\n"
"set ytics\n"
"set output 'gnuplot/closeup/density/plot-%06d.png'\n", i);
plot_density (fp);
fprintf (fp,
"set term pngcairo font \",10\" size 1600,266\n"
"set xrange [0:32]\n"
"set yrange [-1.5:2.5]\n"
"set size ratio -1\n"
"unset ytics\n"
"set output 'gnuplot/all/plot-%06d.png'\n", i);
plot_density (fp);
}
Equally placed wave gauges.
Gauge gauges[] = {
{"WG_3m", 3./0.265, 0.},
{"WG_4m", 4./0.265, 0.},
{"WG_5m", 5./0.265, 0.},
{"WG_6m", 6./0.265, 0.},
{"WG_7m", 7./0.265, 0.},
{NULL}
};
event output (t += 0.1)
output_gauges (gauges, {eta});
We plot the wave gauges:
set xlabel 't/T0'
set ylabel 'y'
plot 'WG_3m' u 1:2 w l t 'x = 11.3','WG_4m' u 1:2 w l t 'x = 15.1', 'WG_5m' u 1:2 w l t 'x = 18.9'
event end (t = 25.)
{
system ("for f in gnuplot/all/plot-*.png; do"
" convert $f ppm:- && rm -f $f; done | "
"ppm2mp4 movie_normal.mp4");
system ("for f in gnuplot/closeup/density/plot-*.png; do"
" convert $f ppm:- && rm -f $f; done | "
"ppm2mp4 movie_closeup.mp4");
fprintf (stderr, "\n\nDone\n");
}
References
[battershill2021] |
Lily Battershill, Colin Whittaker, Emily Lane, Stephane Popinet, James White, William Power, and P Nomikou. Numerical simulations of a fluidized granular flow entry into water: insights into modeling tsunami generation by pyroclastic density currents. 2021. |
[bougouin2020] |
Alexis Bougouin, Raphael Paris, and Olivier Roche. Impact of fluidized granular flows into water: implications for tsunamis generated by pyroclastic flows. Journal of Geophysical Research: Solid Earth, 125(5):e2019JB018954, 2020. [ DOI ] |