// #include "grid/multigrid3D.h"
#include "grid/octree.h"
#include "navier-stokes/centered.h"
#include "vof.h"
#include "tension.h"
scalar f[], * interfaces = {f};
#define rho1 900.
#define rho2 1000.
#define mu1 0.1
#define mu2 0.001
#define rho(f) (clamp(f,0,1)*(rho1 - rho2) + rho2)
#define mu(f) (1./(clamp(f,0,1)*(1./(mu1) - 1./(mu2)) + 1./(mu2)))
#define H 0.1
#define G 9.81
#define Ug ((rho2 - rho1)/rho1*sqrt(H*G/2.))
#define tc (H/(2.*Ug))
face vector alphav[], muv[], av[];
scalar rhov[];
int maxlevel = 6;
#if 0
uf.n[left] = 0.;
uf.n[right] = 0.;
p[left] = neumann(0);
p[right] = neumann(0);
f[top] = 0.;
f[right] = 0.;
f[left] = 0.;
f[bottom] = 0.;
#if dimension == 3
f[front] = 0.;
f[back] = 0.;
#endif
#endif
timer tt;
int main (int argc, char * argv[]) {
maxlevel = argc > 1 ? atoi(argv[1]) : 7;
size (H);
origin (-H/2., -H/2., -H/2.);
#if !TREE
N = 1 << maxlevel;
#endif
a = av;
mu = muv;
alpha = alphav;
rho = rhov;
f.sigma = 0.045;
DT = 2e-2;
tt = timer_start();
run();
}
event init (i = 0) {
#if TREE
scalar f1[];
foreach()
f1[] = (x <= 0 && y <= 0 && z <= 0);
astats s;
do {
s = adapt_wavelet ({f1}, (double[]){0.0}, maxlevel, list = NULL);
foreach()
f1[] = (x <= 0 && y <= 0 && z <= 0);
} while (s.nf);
foreach()
f[] = (x <= 0 && y <= 0 && z <= 0);
#else
foreach()
f[] = (x <= 0 && y <= 0 && z <= 0);
#endif
}
event acceleration (i++) {
foreach_face(y)
av.y[] -= G;
}
event properties (i++) {
#if TREE
f.prolongation = refine_bilinear;
f.dirty = true;
#endif
foreach_face() {
double ff = (f[] + f[-1])/2.;
alphav.x[] = fm.x[]/rho(ff);
muv.x[] = fm.x[]*mu(ff);
}
foreach()
rhov[] = cm[]*rho(f[]);
#if TREE
f.prolongation = fraction_refine;
f.dirty = true;
#endif
}
event logfile (i++; t <= 20) {
double ke1 = 0., ke2 = 0., vd = 0., vol1 = 0.;
double ep1 = 0., ep2 = 0.;
double er1 = 0., er2 = 0.;
double area = 0.;
int nc = 0;
static long tnc = 0;
foreach(reduction(+:ke1) reduction(+:ke2) reduction(+:vd)
reduction(+:vol1) reduction(+:ep1) reduction(+:ep2)
reduction(+:er1) reduction(+:er2) reduction(+:area)
reduction(+:nc)) {
if (y > H/2. - H/8.)
vol1 += f[]*dv();
ep1 += rho1*f[]*G*(y + H/2.)*dv();
ep2 += rho2*(1. - f[])*G*(y + H/2.)*dv();
// interfacial area
if (f[] > 1e-4 && f[] < 1. - 1e-4) {
coord m = mycs (point, f);
double alpha = plane_alpha (f[], m);
coord p;
area += sq(Delta)*plane_area_center (m, alpha, &p);
}
double w2 = 0.;
foreach_dimension() {
// kinetic energy
ke1 += dv()*f[]*rho1*sq(u.x[]);
ke2 += dv()*(1. - f[])*rho2*sq(u.x[]);
// viscous dissipation
vd += dv()*(sq(u.x[1] - u.x[-1]) +
sq(u.x[0,1] - u.x[0,-1]) +
sq(u.x[0,0,1] - u.x[0,0,-1]))/sq(2.*Delta);
// enstrophy
w2 += sq(u.x[0,1] - u.x[0,-1] - u.y[1,0] + u.y[-1,0]);
}
w2 /= sq(2.*Delta);
er1 += dv()*f[]*w2;
er2 += dv()*(1. - f[])*w2;
nc++;
}
ke1 /= 2.;
ke2 /= 2.;
er1 /= 2.;
er2 /= 2.;
// vd *= MU/vol;
if (i == 0)
fprintf (stderr,
"t ke1 ke2 ep1 ep2 er1 er2 R2 area mgp.i mgu.i nc time speed\n");
double elapsed = timer_elapsed (tt);
tnc += nc;
fprintf (stderr, "%g %g %g %g %g %g %g %g %g %d %d %d %g %g\n",
t/tc,
ke1/(1./16.*rho1*sq(Ug)*cube(H)),
ke2/(1./16.*rho2*sq(Ug)*cube(H)),
ep1/(rho1*G*15.*sq(H)*sq(H)/128.),
ep2/(rho2*G*49.*sq(H)*sq(H)/128.),
er1/0.0733,
er2/1.3759,
8.*vol1/cube(H),
area,
mgp.i, mgu.i, nc, elapsed, tnc/elapsed);
#if 0
nc = 0;
foreach()
nc++;
fprintf (stderr, "nc: %d\n", nc);
fflush (stderr);
#endif
}
#if 0
event movies (t += 0.1*tc) {
char name[80];
sprintf (name, "f-%d.ppm", maxlevel);
static FILE * fp = fopen (name, "w");
output_ppm (f, fp, min = 0, max = 1, n = 256);
}
#endif
#if !_MPI
event gfsview (i += 10) {
scalar pid[];
foreach()
pid[] = tid();
#if dimension == 3
static FILE * fp = popen ("gfsview3D inversion.gfv", "w");
#else
static FILE * fp = popen ("gfsview2D inversion2D.gfv", "w");
#endif
output_gfs (fp);
}
#endif
#if 0 //TREE && !_MPI
event gfsview (t += 0.1*tc) {
@if _MPI
char name[80];
sprintf (name, "output-%g.gfs", t);
FILE * fp = fopen (name, "w");
@else
static FILE * fp =
popen ("gfsview3D ../inversion.gfv", "w");
@endif
output_gfs (fp, translate = true);
@if _MPI
fclose (fp);
@endif
// fprintf (fp, "Save stdout { format = PPM width = 512 height = 512 }\n");
}
#endif
#if 0
event snapshot (i = 100; i += 100) {
dump (file = "snapshot", t = t);
char name[80];
sprintf (name, "snapshot-%d.gfs", i);
scalar pid[];
foreach()
pid[] = tid();
output_gfs (file = name);
}
#endif
#if TREE
event adapt (i++) {
adapt_wavelet ({f,u}, (double[]){0.005,0.005,0.005,0.005}, maxlevel);
}
#endif