sandbox/Vierron/Natural-convection/cylindrical/rbcyl.c

    Rayleight Benard instability in 3D

    don’t work with adaptative mesh

    //#include "grid/octree.h"
    #include "grid/multigrid3D.h"
    #include "navier-stokes/centered.h"
    #include "tracer.h"
    #include "diffusion.h"
    #include "radial.h"
    #include "navier-stokes/perfs.h"
    #include "view.h"
    //#include "display.h"
    
    #define MAXLEVEL 8
    #define MINLEVEL 5
    
    scalar T[];
    scalar * tracers = {T};
    
    face vector muc[], av[];
    
    double Ra, Pr;
    
    int main (int argc, char * argv[])
    {
      size (4.);
      dtheta=2*pi;
      Z0=-L0/2.;
      init_grid (1 << 4);
      a=av;
      mu=muc;
      Ra = 1900; Pr = 0.71;
      run();
    }
    
    T[front] = dirichlet(-0.5);
    T[back] = dirichlet(0.5);
    T[left] = neumann(0.);
    T[right] = neumann(0.);
    T[top] = neumann(0.);
    T[bottom] = neumann(0.);
    
    
    u.n[top] = dirichlet(0.);
    u.n[bottom] = dirichlet(0.);
    u.n[right] = dirichlet(0.);
    u.n[left] = dirichlet(0.);
    u.n[front] = dirichlet(0.);
    u.n[back] = dirichlet(0.);
    
    u.t[top] = dirichlet(0.);
    u.t[bottom] = dirichlet(0.);
    u.t[right] = dirichlet(0.);
    u.t[left] = dirichlet(0.);
    u.t[front] = dirichlet(0.);
    u.t[back] = dirichlet(0.);
    
    u.r[top] = dirichlet(0.);
    u.r[bottom] = dirichlet(0.);
    u.r[right] = dirichlet(0.);
    u.r[left] = dirichlet(0.);
    u.r[front] = dirichlet(0.);
    u.r[back] = dirichlet(0.);
    
    event init (t=0) {
      foreach(){
        T[] = -z/(L0/2.);
        foreach_dimension()
          u.x[] = 0.01*noise();
      }
      boundary ({T,u});
      //dump("init");
      DT = 0.001;
      dtnext(DT);
      TOLERANCE=10E-6;
    }
    
    event properties (i++) {
      foreach_face()
        muc.x[] = fm.x[]*Pr/sqrt(Ra);
      boundary ((scalar*){muc});
    }
    
    
    event tracer_diffusion (i++) {
      face vector D[];
      foreach_face()
        D.x[] = fm.x[]*1./sqrt(Ra);
      boundary ((scalar*){D});
      diffusion (T, dt, D);
      boundary ({T});
    }
    
    event acceleration (i++) {
      foreach_face(z)
        av.z[] += fm.z[]*Pr*(T[] + T[0,0,-1])/2.;
      foreach_face(y)
        av.y[] += 0.;
      foreach_face(x)
        av.x[] += 0.;
      if ((i==10||i==10)){
        DT=0.1;
        TOLERANCE=10E-4;
      }
    }
    
    scalar un[];
    event init_un (i = 0) {
      foreach()
        un[] = u.z[];
    }
    
    event logfile(i++){
      scalar div[];
      double deltau = change (u.z, un);
      double avg = normf(u.z).avg, du = deltau/(avg + SEPS);
      foreach() {
        div[] = 0.;
        foreach_dimension()
          div[] += u.x[1] - u.x[];
        div[] /= Delta;
       }
      stats s0 = statsf (div);
      fprintf (stdout, "%f %.9g %.9g %.9g %.9g %.9g %.9g %.9g \n", t, deltau, avg, du, s0.sum/s0.volume, s0.max, statsf(u.z).sum, normf(p).max);
      fflush(stdout);
    }
    
    #if 0
    event adapt (i++){
      double err = 0.01;
      astats s = adapt_wavelet ((scalar*){T, u},
    		 (double[]){err, err, err, err}, MAXLEVEL, MINLEVEL);
      fprintf (stderr, "# refined %d cells, coarsened %d cells\n", s.nf, s.nc);
    }
    #endif
    
    void radial (coord * p) {
      double r = p->x, theta = p->y*dtheta/L0;
      p->x = r*cos(theta), p->y = r*sin(theta);
    }
    
    event movie (t += 1.; t<=40.) {
      clear();
        view (quat = {-0.206, 0.558, 0.759, -0.266}, map = radial,
          fov = 30, near = 0.01, far = 1000,
          tx = 0.115, ty = -0.025, tz = -3.580,
          width = 1548, height = 936);
      box ();
      cells ();
      //isosurface (f = "T", color = "T", min = -0.5, max = 0.5);
      squares (color = "T", min = -0.5, max = 0.5, n = {1,0,0}, alpha = 2);
      cells (n = {1,0,0}, alpha = 2);
      save ("T.mp4");
    }
    
    event movie2(t += 1.; t<=40.){
      clear();
      view (quat = {0.183, 0.612, 0.731, 0.242}, map = radial,
          fov = 30, near = 0.01, far = 1000,
          tx = 0.109, ty = 0.152, tz = -2.879,
          width = 1980, height = 1020);
      box ();
      isosurface (f = "T", v = -0.45, min = -0.5, max = 0.5);
      isosurface (f = "T", v = 0.45, min = -0.5, max = 0.5);
      isosurface (f = "T", v = 0., min = -0.5, max = 0.5);
      save ("T2.mp4");
    }
    
    event movie3(t+=1.; t<=40.){
      clear();
      view (quat = {0.544, 0.239, 0.173, 0.785}, map = radial,
          fov = 30, near = 0.01, far = 1000,
          tx = -0.104, ty = -0.054, tz = -2.922,
          width = 1548, height = 936);
      squares (color = "u.z", max = 0.9, spread = 1);
      box ();
      cells ();
      squares (color = "T", min = -0.48, max = 0.5, n = {1,0,0}, alpha = 1);
      save ("T3.mp4");
    }

    Results

    video1

    video2

    video3