# Title: Boussinesq flow generated by a heated cylinder # # Description: # # The classical Boussinesq approximation is applied to solve the flow # generated by a heated cylinder. # # A source term proportional to a diffusive tracer is added to the # vertical component of the velocity field. # # Adaptivity is used to generate a "sponge" outflow condition on the # top boundary. # # The turbulent plume obtained is illustrated on Figure \ref{tracer}. # # The movie is generated using the scripting mode of GfsView. # # \begin{figure}[htbp] # \caption{\label{tracer}MPEG movie of the tracer field.} # \begin{center} # \htmladdnormallinkfoot{\includegraphics[width=0.3\hsize]{t.eps}}{t.mpg} # \end{center} # \end{figure} # # Author: St\'ephane Popinet # Command: gerris2D boussinesq.gfs | gfsview2D boussinesq.gfv | ppm2mpeg > t.mpg # Version: 1.1.2 # Required files: boussinesq.gfv # Running time: 60 minutes # Generated files: t.mpg t.eps # 3 2 GfsSimulation GfsBox GfsGEdge {} { # Limit the maximum timestep to 1e-2 so that the initial diffusion # is properly resolved Time { end = 20 dtmax = 1e-2 } # Use an initial refinement of 8 levels around the solid boundary RefineSolid 8 # Insert the solid boundary defined implicitly by the # ellipse() function Solid (ellipse(0.,-0.15,1./16.,1./16.)) # Add a passive tracer called T VariableTracer T # Add diffusion to tracer T SourceDiffusion T 0.0001 # Add a source term to the vertical velocity component equal to T Source V T # Dirichlet boundary condition for T on the cylinder SurfaceBc T Dirichlet 1 # Adapt the mesh using the vorticity criterion at every timestep # down to a maximum level of 8 if y is smaller than 1.5, 0 # otherwise. The topmost part of the domain will not be refined and # will act as a very efficient "sponge" layer to damp any eddies # before they exit the domain. AdaptVorticity { istep = 1 } { maxlevel = (y > 1.5 ? 0 : 8) cmax = 1e-2 } # Also adapt according to the tracer gradient AdaptGradient { istep = 1 } { maxlevel = 8 cmax = 5e-2 } T # Writes the time and timestep every 10 timesteps on standard error OutputTime { istep = 10 } stderr # Writes the simulation size every 10 timesteps on standard error OutputBalance { istep = 10 } stderr # Writes info about the convergence of the Poisson solver on standard error OutputProjectionStats { istep = 10 } stderr # Outputs profiling information at the end of the simulation to standard error OutputTiming { start = end } stderr # Outputs the simulation every 4 timesteps OutputSimulation { istep = 4 } stdout # Every 4 timesteps, GfsView will read the following command, after having read # the simulation file and will output a PPM screenshot on its standard output EventScript { istep = 4 } { echo "Save stdout { width = 256 height = 512 }" } # At t = 19, GfsView will create the PPM file used in the doc. EventScript { start = 19 } { echo "Save t.ppm { width = 256 height = 512 }" } # At the end of the simulation this file is converted to EPS. EventScript { start = end } { convert -colors 256 t.ppm t.eps ; rm -f t.ppm } } # The bottom boundary will also allow inflow (despite its name) GfsBox { bottom = BoundaryOutflow } GfsBox {} # The top boundary is a simple outflow condition. This could cause problems # (eddies getting stuck on the boundary) if the adaptive "sponge" layer was not # used. GfsBox { top = BoundaryOutflow } 1 2 top 2 3 top