sandbox/cselcuk/2D-3multidomain_overlapping_test-2.c

    Three overlapping cylinders freely rotating in a sheared-flow with DLMFD

    Three cylinders, overlapping each other and twice as heavy as the surrounding fluid, are freely rotating in a linear shear-flow.

    # define LEVEL 6 
    # include "grid/quadtree.h"
    # define DLM_Moving_particle 1
    # define TRANSLATION 0
    # define ROTATION 1
    # define DLM_alpha_coupling 0
    # define adaptive 1
    # define NPARTICLES 3
    
    # if adaptive
    # define MAXLEVEL (LEVEL + 1)
    # endif

    Physical parameters

    # define Uc 1. //caracteristic velocity
    # define rhoval 1. // fluid density
    # define diam (0.5) // particle diameter
    # define ReD  (10) // Reynolds number based on the particle's diameter
    # define Ldomain 1.0
    # define rhosolid 2.0 //particle density
    # define tval (rhoval*Uc*Ldomain/ReD) //fluid's dynamic viscosity

    Output and numerical parameters

    # define Tc (diam/Uc) // caracteristic time scale
    # define mydt (Tc/200) // maximum time-step
    # define maxtime (1.0)
    # define tsave (Tc/1.)

    We include the ficitious-domain implementation

    # include "dlmfd.h"
    # include "view.h"
    
    double deltau;
    scalar un[];
    
    int main() {
      L0 = Ldomain;
      
      /* set time step */
      DT = mydt;
        
      /* initialize grid */
      init_grid(1 << (LEVEL));
      
      /* boundary conditions */
      u.n[left] = dirichlet(-Uc + 2*y*Uc/L0);
      u.t[left] = dirichlet(0);
    
      u.n[right] = dirichlet(-Uc + 2*y*Uc/L0);
      u.t[right] = dirichlet(0);
    	
      u.n[top]   = dirichlet(0);
      u.t[top]   = dirichlet(Uc);
    
      u.n[bottom] = dirichlet(0);
      u.t[bottom] = dirichlet(-Uc);
    
       
      /* Convergence criteria */
      TOLERANCE = 1e-3;
    
      run();
    }

    We initialize the fluid and particle variables.

    event init (i = 0) {
    
      /* set origin */
      origin (0, 0);
      
      if (!restore (file = "dump")) {
        /* fluid initial condition: */
        foreach() {
          u.x[] = -Uc + 2*y*Uc/L0;
          un[] = u.x[];
        }
        /* particles initial position */
        particle * p = particles;
    
        for (int k = 0; k < NPARTICLES; k++) {
          GeomParameter gp = {0};

    We place the cylinders close to each others to test how the stencils are constructed when they are close to colision.

          if (k == 0) {
    	gp.center.x = L0/4;
    	gp.center.y = L0/4;
    	gp.radius   = diam/2;
          }
    
          if (k == 1) { 
    	gp.center.x = 3*L0/4;
    	gp.center.y = L0/4;
    	gp.radius   = diam/2;
    
          }
    
          if (k == 2) { 
    	gp.center.x = L0/2;
    	gp.center.y = L0/4;
    	gp.radius   = diam/2;
    
          }
        
          p[k].g = gp;
           
          /* particle's initial angular velocity */
          coord c = {0., 0., 0.};
          p[k].w = c;
        }
      }
      else // Restart of a simulation
        {
         /* the default init=0 event will take of it */
      }
    }
    
    
    
    event output_data (t += maxtime/50; t < maxtime) {
      stats statsvelox;
      view (fov = 22.3366, quat = {0, 0, 0, 1}, tx = -0.465283, ty = -0.439056, bg = {1,1,1}, width = 890, height = 862, samples = 1);
    
      scalar constrained_cells[];
      int aa;
      foreach() {
        aa = 0;
        if ((int)index_lambda.y[] > -1 && flagfield[] < 1)
          aa = 1;
        constrained_cells[] = aa;
        constrained_cells[] += 3*flagfield[];
      }
      statsvelox =  statsf (constrained_cells);
      clear();
      squares ("constrained_cells", map = cool_warm, min = statsvelox.min, max = statsvelox.max); 
      cells();
      save ("movie.mp4");
    }
    
    
    event output_data_2 (t += maxtime/50; t < maxtime) {
      stats statsvelox;
      view (fov = 22.3366, quat = {0,0,0,1}, tx = -0.465283, ty = -0.439056, bg = {1,1,1}, width = 890, height = 862, samples = 1);
      statsvelox =  statsf (u.x);
      clear();
      squares ("u.x", map = cool_warm, min = statsvelox.min, max = statsvelox.max); 
      cells();
      save ("movie1.mp4");
    }
    
    event output_data_3 (t += maxtime/50; t < maxtime) {
      stats statsvelox;
      view (fov = 22.3366, quat = {0,0,0,1}, tx = -0.465283, ty = -0.439056, bg = {1,1,1}, width = 890, height = 862, samples = 1);
      statsvelox =  statsf (index_lambda.y);
      clear();
      squares ("index_lambda.y", map = cool_warm, min = statsvelox.min, max = statsvelox.max); 
      cells();
      save ("movie2.mp4");
    }

    Results

    
    set grid
    show grid
    set xlabel "time"
    set ylabel "Omegaz"
    plot "particle-data-0" u 1:6 w l, "particle-data-1" u 1:6 w l, "particle-data-2" u 1:6 w l 
    particles angular velocities (script)
    set grid
    show grid
    set xlabel "time"
    set ylabel "Tz"
    plot "sum_lambda-0" u 1:3 w l, "sum_lambda-1" u 1:3 w l, "sum_lambda-2" u 1:3 w l
    Torque of the particles (script)
    
    set grid
    show grid
    set xlabel "Time iteration"
    set ylabel "Iterations to solve the saddle problem"
    plot "converge-uzawa" u 1:2 w l
    Number of iterations to solve the saddle problem with the Uzawa method (script)

    Annimation

    Constrained cells by the Lagrange multipliers

    Red cells: constrained by the set of Lagrange multipliers which lie on the surface of the particle.

    Light blue cells: constrained by Lagrange multipliers that are inside the particle.

    Streamwise velocity u.x

    Fictitious domains of the particles