sandbox/Antoonvh/splash.c

    One may wounder where the fluid from the impacting droplet goes during a splash. Image via adobe stock.

    One may wounder where the fluid from the impacting droplet goes during a splash. Image via adobe stock.

    A splash

    A droplet impacts on a pool and creates a splash. We are curious to see where the fluid of the droplet ends up after the flow has settled a bit. For that purpose, we add particle tracers to the fluid in the droplet.

    Drop-fluid tracers and the interface

    Furthermore, tracer particles just outside the drop are added to see how their paths divergce from their initially-nearby neighbors at the other side of the interface.

    All tracers and the interface

    #include "navier-stokes/centered.h"
    #include "two-phase.h"
    #include "tension.h"
    #include "reduced.h"
    #include "view.h"
    #include "vof-tracer-particles.h"
    #include "scatter2.h"
    
    Particles Pin, Pout;
    int maxlevel = 9;

    The system parameters are chosen adhoc to produce a splashing scenario.

    int main() {
      L0 = 20;
      X0 = -L0/2;
      Y0 = -2;
      f.sigma = 10.;
      mu1 = .5;
      mu2 = .5;
      rho1 = 50.;
      rho2 = 1.;
      G.y = -5.;
      init_grid (64);
      run();
    }
    
    event init(t=0) {
      refine (sq(x) + sq(y) < 1.1 && level < maxlevel);
      fraction (f, 1 - sq(x) - sq (y - 5)); // The drop
      scalar m[];
      fraction (m, -y); // and the pool
      foreach()
        f[] += m[];
      DT = 0.05;

    Adding tracers

    We add 2 times 99999 tracers: First, they are distributed rondomly within the circular drop (Pin). Second, a ring surrounding the drop ais “filled” with particles (Pout).

      int Pnr = 99999;
      Pin = new_vof_tracer_particles (Pnr, 1); //Assign phase f[] = 1
      place_in_circle (Pin, (struct Init_P){Pnr, 0, 5, 1});
      particle_boundary (Pin);
    
      Pout = new_vof_tracer_particles (Pnr, 0); //assign phase f[] != 1
      foreach_particle_in(Pout) {
        double R = 1.1 + 0.1*noise();
        double angle = pi*noise();
        p().x = R*sin(angle);
        p().y = R*cos(angle) + 5;
      }
      particle_boundary (Pout);
    }
    
    event adapt (i++)
      adapt_wavelet ((scalar*){f,u}, (double[]){0.001, 0.1, 0.1}, maxlevel);
    
    event bviewer (t += 0.05) {
      translate (z = 0.05)
        draw_vof ("f", lw = 3);
      scatter (Pin, s = 5, pc = {0.6, 0.4, 0.6});
      scatter (Pout, s = 5, pc = {0.6, 0.6, 0.4});
      save ("mov_both.mp4");
      
      clear ();
      translate (z = 0.05)
        draw_vof ("f", lw = 3);
      scatter (Pin, s = 5, pc = {0.6, 0.4, 0.6});
      save ("mov.mp4");
    }
    
    event stop (t = 30) {
      return 1;
    }