Incompressible hydrodynamics solver
pyro’s incompressible solver solves:
The algorithm combines the Godunov/advection features used in the advection and compressible solver together with multigrid to enforce the divergence constraint on the velocities.
Here we implement a cell-centered approximate projection method for solving the incompressible equations. At the moment, only periodic BCs are supported.
The main parameters that affect this solver are:
section: [driver]
option
value
description
cfl
0.8
section: [incompressible]
option
value
description
limiter
2
limiter (0 = none, 1 = 2nd order, 2 = 4th order)
proj_type
2
what are we projecting? 1 includes -Gp term in U*
section: [particles]
option
value
description
do_particles
0
particle_generator
grid
Examples
shear
The shear problem initializes a shear layer in a domain with doubly-periodic boundaries and looks at the development of two vortices as the shear layer rolls up. This problem was explored in a number of papers, for example, [BellColellaGlaz89] and [MartinColella00]. This is run as:
pyro_sim.py incompressible shear inputs.shear

The vorticity panel (lower left) is what is usually shown in papers. Note that the velocity divergence is not zero—this is because we are using an approximate projection.
convergence
The convergence test initializes a simple velocity field on a periodic
unit square with known analytic solution. By evolving at a variety of
resolutions and comparing to the analytic solution, we can measure the
convergence rate of the algorithm. The particular set of initial
conditions is from [Minion96]. Limiting can be disabled by
adding incompressible.limiter=0
to the run command. The basic set of
tests shown below are run as:
pyro_sim.py incompressible converge inputs.converge.32 vis.dovis=0
pyro_sim.py incompressible converge inputs.converge.64 vis.dovis=0
pyro_sim.py incompressible converge inputs.converge.128 vis.dovis=0
The error is measured by comparing with the analytic solution using
the routine incomp_converge_error.py
in analysis/
. To generate
the plot below, run
python incompressible/tests/convergence_errors.py convergence_errors.txt
or convergence_errors_no_limiter.txt
after running with that option. Then:
python incompressible/tests/convergence_plot.py

The dashed line is second order convergence. We see almost second order behavior with the limiters enabled and slightly better than second order with no limiting.
Exercises
Explorations
Disable the MAC projection and run the converge problem—is the method still 2nd order?
Disable all projections—does the solution still even try to preserve \(\nabla \cdot U = 0\)?
Experiment with what is projected. Try projecting \(U_t\) to see if that makes a difference.
Extensions
Switch the final projection from a cell-centered approximate projection to a nodal projection. This will require writing a new multigrid solver that operates on nodal data.
Add viscosity to the system. This will require doing 2 parabolic solves (one for each velocity component). These solves will look like the diffusion operation, and will update the provisional velocity field.
Switch to a variable density system. This will require adding a mass continuity equation that is advected and switching the projections to a variable-coefficient form (since ρ now enters).
Going further
The incompressible algorithm presented here is a simplified version of the projection methods used in the Maestro low Mach number hydrodynamics code. Maestro can do variable-density incompressible, anelastic, and low Mach number stratified flows in stellar (and terrestrial) environments in close hydrostatic equilibrium.