sandbox/bugs/axiDrop.c

You do not have the rights to run code in /sandbox.

Spherical droplet blown by stream

Axisymetrical case, where a single drop is drag by an uniform stream of another. After some time-step, a non physical velocity arise in the upstream apex of the droplet.

#include "axi.h"

#include "navier-stokes/centered.h"
#include "two-phase.h"
#include "tension.h"

Fluids properties are defined next.

//Drop properties
#define RHOL 1000.
#define MUL 1.e-2
#define SIGMA 1e-2

//Stream properties
#define RHOG 1.
#define MUG 1.e-5
#define DIAMETER 1e-3
#define USTREAM 10.

#define MAXTIME 1.e-3


//Default refinements
int minlevel = 6;
int MAXLEVEL = 12;

double maxruntime = HUGE;

Inlet and outlet boundary conditions.

u.n[left]  = dirichlet(USTREAM);
u.t[left]  = dirichlet(0);
u.n[right] = neumann(0);
p[left]    = neumann(0);
p[right]   = dirichlet(0);

MAXLEVEL can be overriden by input parameter.

int main (int argc, char * argv[]) {
  if (argc > 1)
    MAXLEVEL = atoi (argv[1]);
  
  L0 = 20*DIAMETER;
  size (L0);
  origin(-L0/5, 0);
  init_grid (pow(2.0,minlevel));

  // CFL number
  CFL = 0.4;

  f.σ = SIGMA;
  rho1 = RHOL;
  rho2 = RHOG;

  mu1 = MUL;
  mu2 = MUG;
 
  TOLERANCE = 1e-5; //default is 1e-3.

  run();
}

Initial condition is given by drop position only, there is no flow at the begining.

event init (t = 0) {

  foreach()
    f[] = 0;
    
  mask (y >  2*DIAMETER ? top : none);

  if (!restore (file = "dump")){

    refine (sq(x) + sq(y) - sq(0.6*DIAMETER) < 0 &&
       sq(x) + sq(y) - sq(0.4*DIAMETER) > 0 && level < MAXLEVEL);

    fraction (f, sq(0.5*DIAMETER) - (sq(x) + sq(y)));
  }
}

event end (t = MAXTIME) {
  printf ("i = %d t = %g\n", i, t);
}

Adaptation tolerances are defined as a function of the RMS velocity.

event adapt (i++) {
  double uRMS = 0;
  foreach()
    foreach_dimension()
      uRMS += sq(u.x[]);

  double uemax = 2e-4*sqrt(uRMS);
  adapt_wavelet ({f,u}, (double[]){1e-4,uemax,uemax,uemax}, MAXLEVEL, minlevel);
}

Post-processing

Log file reports the droplet position and velocity, besides some numerical parameters. gfsview snapshots are each 100 time-steps.

event logfile (i += 10,first) {
  double xd = 0., yd = 0., sd = 0.;
  double vdx = 0., vdy = 0.;
  if (i == 0){
    fprintf (ferr,
	     "t dt sd xd/sd yd/sd vdx/sd, vdy/sd"
	     " mgp.i mgpf.i mgu.i grid->tn perf.t perf.speed\n");
  }

  foreach(reduction(+:xd) reduction(+:yd)
	  reduction(+:vdx) reduction(+:vdy) reduction(+:sd)) {
    double dv = f[]*dv();
    xd += x*dv;
    yd += y*dv;
    vdx += u.x[]*dv;
    vdy += u.y[]*dv;
    sd += dv;
  }

  fprintf (ferr,
	   "%.4e %.4e %.4e %.2e %.2e %.2e %.2e"
	   " %d %d %d %ld %.2e %.2e\n", 
	   t, dt, sd, xd/sd, yd/sd,
	   vdx/sd, vdy/sd, mgp.i, mgpf.i, mgu.i,
	   grid->tn, perf.t, perf.speed);

  fflush (ferr);
}

event snapshot (i = 0; i+=200; t <= MAXTIME)
{
  if(i > 0)
    dump (file = "dump");
  
  char name[80];
  sprintf (name, "snapshot-%g.gfs", t);
  output_gfs (file = name, t = t, list = {f,u,p});
}