sandbox/popinet/collapse.c
Collapse of a bubble
A movie of the gradient of density is here. Higher-resolution (LEVEL = 11) movies are here.
////////////////////////////////////////////////////////////
#include "all-mach.h"
#include "vof.h"
scalar f[], rhov[], rho1[], rho2[], * interfaces = {f};
face vector alphav[];
scalar rhoc2v[];
double CFLacous = 0.5, rhomin = 1e-6;
event defaults (i = 0) {
= alphav;
alpha = rhov;
rho = rhoc2v;
rhoc2
foreach()
[] = rho2[] = f[] = 1.;
rho1boundary ({rho1,rho2,f});
}
static scalar * interfaces1 = NULL;
event vof (i++) {
vector q1 = q, q2[];
foreach()
foreach_dimension() {
double u = q.x[]/rho[];
.x[] = rho1[]*u;
q1.x[] = rho2[]*u;
q2}
boundary ((scalar *){q1,q2});
= 1.; // strict minmod limiter
theta foreach_dimension() {
.x.inverse = true;
q2.x.gradient = q2.x.gradient = minmod2;
q1}
.inverse = true;
rho2.gradient = rho2.gradient = minmod2;
rho1.tracers = {rho1,rho2,q1,q2};
fvof_advection ({f}, i);
foreach() {
foreach_dimension()
.x[] = q1.x[] + q2.x[];
qif (rho1[] < rhomin*f[])
[] = rhomin*f[];
rho1if (rho2[] < rhomin*(1. - f[]))
[] = rhomin*(1. - f[]);
rho2}
boundary ((scalar *){q,rho1,rho2});
= interfaces, interfaces = NULL;
interfaces1 }
event tracer_advection (i++) {
= interfaces1;
interfaces }
double pstate (double rho, double rhoref, double pref,
double B, double gamma) {
return pref*((1. + B)*pow(rho/rhoref, gamma) - B);
}
double cstate (double rho, double rhoref, double pref,
double B, double gamma) {
return (1. + B)*pref/rhoref*gamma*pow(rho/rhoref, gamma - 1.);
}
event stability (i++) {
foreach() {
double dt = f[] > 0.5 ?
/sqrt(cstate (rho1[]/f[], 1., 1., 3000., 4.)) :
Delta/sqrt(cstate (rho2[]/(1. - f[]), 0.001, 1., 0., 1.4));
Delta*= CFLacous;
dt if (dt < dtmax)
= dt;
dtmax }
}
event properties (i++) {
foreach() {
[] = rho1[] + rho2[];
rhovif (f[] > 0.5) {
double r = rho1[]/f[];
[] = pstate (r, 1., 1., 3000., 4.);
ps[] = rhov[]*cstate (r, 1., 1., 3000., 4.);
rhoc2v}
else {
double r = rho2[]/(1. - f[]);
[] = pstate (r, 0.001, 1., 0., 1.4);
ps[] = rhov[]*cstate (r, 0.001, 1., 0., 1.4);
rhoc2v}
}
boundary ({rhov});
foreach_face()
.x[] = 2./(rho[] + rho[-1]);
alphav}
////////////////////////////////////////////////////////////
#include "tension.h"
#define LEVEL 7
int main() {
= Y0 = -L0/2.;
X0 .sigma = 1.;
frun();
}
event init (i = 0) {
if (!restore (file = "dump"))
do {
fraction (f, - (sq(0.25) - sq(x) - sq(y + 0.2)));
foreach() {
[] = f[]*1.15;
rho1[] = (1. - f[])/1000.;
rho2[] = rho1[] + rho2[];
rhov}
boundary ({rho1,rho2,rhov});
} while (adapt_wavelet ({f,rho}, (double[]){5e-3,5e-4}, LEVEL).nf);
}
event logfile (i++) {
stats s1 = statsf(rho1), s2 = statsf(rho2);
scalar rhot[];
foreach()
[] = rho1[] + rho2[];
rhotstats st = statsf(rhot);
if (i == 0)
fprintf (stderr,"t f.sum s1.min s1.sum s1.max "
"s2.min s2.sum s2.max st.min st.sum st.max\n");
fprintf (stderr, "%g %.12f %.12f %.12f %.12f %.12f"
" %.12f %.12f %.12f %.12f %.12f\n",
, statsf(f).sum,
t.min, s1.sum, s1.max,
s1.min, s2.sum, s2.max,
s2.min, st.sum, st.max);
st}
#if 1
event gfsview (i += 10)
{
static FILE * fp = popen ("gfsview2D -s collapse.gfv", "w");

unknown function parameter âtâ
output_gfs (fp, t = t);
}
#endif
#if 0
event snapshot (i = 3184) {
dump (file = "dump");
}
event snapshots (i++) {
char name[80];
sprintf (name, "snapshot-%d.gfs", i);
output_gfs (file = name);
}
#endif
event movies (t += 5e-5; t <= 0.05)
{
output_ppm (rho, linear = true, spread = 2);
static FILE * fp1 = popen("ppm2mpeg > p.mpg", "w");
output_ppm (p, fp1, linear = true, spread = 2);
scalar dr[];
foreach() {
[] = 0.;
drforeach_dimension()
[] += sq(rho[1] - rho[-1]);
dr[] = sqrt(dr[])/(2.*Delta);
dr}
boundary({dr});
static FILE * fp2 = popen("ppm2mpeg > dr.mpg", "w");
output_ppm (dr, fp2, map = gray, min = 0, max = 2, n = 512, linear = true);
foreach()
[] = (rho[0,1] - rho[0,-1])/(2.*Delta);
drboundary({dr});
static FILE * fp3 = popen("ppm2mpeg > dy.mpg", "w");
output_ppm (dr, fp3, map = gray, min = -2, max = 2, n = 512, linear = true);
foreach()
[] = (rho[0,1] + rho[0,-1] - 2.*rho[])/sq(Delta);
drboundary({dr});
static FILE * fp4 = popen("ppm2mpeg > d2y.mpg", "w");
output_ppm (dr, fp4, map = gray, min = -10, max = 10, n = 512, linear = true);
foreach()
[] = level;
drboundary({dr});
static FILE * fp5 = popen("ppm2mpeg > level.mpg", "w");
output_ppm (dr, fp5, min = 0, max = LEVEL, n = 512);
}
#if TREE
event adapt (i++) {
({f,rho}, (double[]){5e-3,5e-4}, LEVEL);
adapt_wavelet }
#endif