sandbox/ysaade/allMach/AXI_expansion.c

    Axisymmetric expansion of a bubble

    #include "grid/quadtree.h"
    #include "axi.h"
    #include "compressible/thermal.h"
    #include "compressible/NASG.h"
    #include "view.h"
    
    #define LEVEL 8

    The initial density of the gas is chosen in way such as the initial temperature inside the bubble is half the far-field temperature T_\infty.

    double rhoL = 1., rhoR = 0.080470865772519;
    double p0L = 1.;
    double p0 = 1.;
    double tend = 1.;
    double Rbub = 1.;
    double lambda = 8.;
    double tr;

    The problem is rendered dimensionless using the ambient pressure, the liquid density, the far-field temperature and the bubble initial radius. The values employed for this simulation are respectively listed.

    double pdim = 5e6;
    double rhodim = 975.91;
    double Tdim = 350;
    double Rdim = 1e-4;
    
    scalar pdata[], tdata[];
    
    uf.n[right] = neumann(0.);
    p[right]    = dirichlet(p0L);
    q.n[right]  = neumann(0.);
    
    uf.n[left] = neumann(0.);
    p[left]    = dirichlet(p0L);
    q.n[left]  = neumann(0.);
    
    uf.n[top] = neumann(0.);
    p[top]    = dirichlet(p0L);
    q.n[top]  = neumann(0.);
    
    uf.n[bottom] = 0.;
    uf.t[bottom] = dirichlet(0.);

    Although the thermal solver is implicit and unconditionally stable, a diffusive CFL condition is employed for better accuracy.

    event stability (i++) {
      dtmax = rhoR*cp2*sq(L0/pow(2,LEVEL))/kappa2/2.;
    }
    
    int main() {
      L0 = lambda;
      X0 = -L0/2.;
      
      f.gradient = zero;

    Liquid water parameters in the Noble-Abel Stiffened Gas (NASG) equation of state.

      gamma1 = 1.187;
      PI1 = 7028e5/pdim;
      b1 = 6.61e-4*rhodim;
      q1 = -1177788*rhodim/pdim;

    Specific heats and thermal conductivity of the fluids.

      cv1 = 3610*rhodim*Tdim/pdim; cv2 = 729.1*rhodim*Tdim/pdim;
      cp1 = 4285*rhodim*Tdim/pdim; cp2 = 1063*rhodim*Tdim/pdim;
    
      kappa1 = 0.6705/(Rdim/Tdim*sqrt(cube(pdim)/rhodim));
      kappa2 = 0.03153/(Rdim/Tdim*sqrt(cube(pdim)/rhodim));
    
      mu1 = 3.7e-4/(Rdim*sqrt(rhodim*pdim));
      mu2 = mu1*1e-2;

    The diffusive time scale \tau based on the gas properties.

      tr = rhoR*cp2/kappa2;
      
      tend *= tr;
    
      init_grid(1 << LEVEL);
    
      TOLERANCE = 1e-6;
    
      system ("mkdir dumps");
      
      run();
    }
    
    event init (t = 0) {
      if (!restore (file = "restart")) {
        fraction (f, - (sq(Rbub) - sq(x) - sq(y)));
      
        foreach() {
          frho1[]  = f[]*rhoL;
          frho2[]  = (1. - f[])*rhoR;
        
          double pL = p0L;
        
          p[] = pL*f[] + p0*(1.-f[]);

    Initialization of the initial temperature using the the NASG EoS in compatibility with the initialization of both the density and pressure fields.

          double fc = clamp (f[],0.,1.);
          double rhocpmcvavg = (cp1 - cv1)*frho1[] + (cp2 - cv2)*frho2[];
          double const1 = (fc - frho1[]*b1) + (1. - fc - frho2[]*b2);
          double const2 = (fc - frho1[]*b1)*PI1 + (1. - fc - frho2[]*b2)*PI2;
          T[] = (const1*p[] + const2)/rhocpmcvavg;
        
          fE1[]   = (pL + gamma1*PI1)/(gamma1 - 1.)*(f[] - frho1[]*b1) + frho1[]*q1;
          fE2[]   = (1. - f[])*(p0/(gamma2 - 1.));
        }
      }
    }

    Outputting the bubble radius in an 0.01*\tau increment.

    event centroid (t += 0.01*18951.2) {
      scalar ff[];
      foreach()
        ff[] = 1. - f[];
      
      double Volume = statsf(ff).sum;
    
      if (pid() == 0) {
        FILE * fp = fopen ("radius.txt","a");
        char str[80];
        sprintf(str,"%g %g\n",t/tr,pow(3.*Volume/2.,1./3.));
        fputs(str,fp);
        fclose(fp);
      }
    }

    Outputting some statistics about the fields.

    event logfile (i++) {
      stats sp = statsf (p);
      stats su = statsf (q.x), sv = statsf (q.y);
      stats sT = statsf (T);
      fprintf (stderr,"t = %g, i = %d, dt = %g, max(p) = %g, max(T) = %g, max(u) = %g, max(v) = %g\n",
    	   t/tr, i, dt/tr, sp.max, sT.max, su.max, sv.max);
    }

    Saving dump files for post-processing. (Uncomment)

    /* event outputs (t += 0.01*18951.2) { */
    /*   char name[80]; */
    /*   sprintf (name,"dumps/dump-%g",t/18951.2); */
    /*   dump (name, list = (scalar *){f,p,T}); */
    /* } */

    On the fly movie generation.

    event movie (t += 0.01*18951.2) {
      char name[80], s[80];
      sprintf (name,"T0.5.mp4");
      sprintf (s, "t = %.2f", t/18951.2);
    
      clear();
      view(fov = 12.5, quat = {0,0,-cos(M_PI/4.),cos(M_PI/4.)}, width = 1280, height = 1980);
      draw_vof("f");
      squares("p", min = 1., map = cool_warm);
      mirror({0,1}) {
        draw_vof("f");
        squares("T", min = 0.5548, max = 1.0896, map = cool_warm);
        draw_string (s, pos = 2, size = 16, lc = {255,255,255}, lw = 4);
        draw_string ("Temperature", pos = 3, size = 25, lc = {255,255,255}, lw = 4);
        draw_string ("Pressure", size = 25, lc = {255,255,255}, lw = 4);
      }
      save(name);
    }
    event ending (t = tend) {
      double ending = 0.;
      ending++;
      return ending;
    }
    set xlabel 't'
    set ylabel 'R'
    plot "radius.txt" u 1:2 w p
    Bubble radius as a function of time (script)

    Bubble radius as a function of time (script)