Package: pyro-hydro
A simple python-based tutorial on computational methods for hydrodynamicspyro is a computational hydrodynamics code that presents
two-dimensional solvers for advection, compressible hydrodynamics,
diffusion, incompressible hydrodynamics, and multigrid, all in a
finite-volume framework.  The code is mainly written in python and is
designed with simplicity in mind.  The algorithms are written to
encourage experimentation and allow for self-learning of these code
methods.The latest version of pyro is always available at:https://github.com/python-hydro/pyro2The project webpage, where you'll find documentation, plots, notes,
etc. is here:https://pyro2.readthedocs.io/Table of ContentsGetting startedCore Data StructuresSolversWorking with dataUnderstanding the algorithmsRegression and unit testingAcknowledgementsGetting helpGetting startedBy default, we assume python 3.8 or later.We requirenumpy,numba,matplotlib, andh5pyfor running pyro
andsetuptools_scmfor the install.We recommend that pyro be installed so that it is found in your python search
path, and can work more easily with Jupyter notebooks.pyro can be installed on your system via:python setup.py install --useralternately, you can usedevelopinstead ofinstallif you are
planning on developing pyro solvers directly.Not all matplotlib backends allow for the interactive plotting as
pyro is run. One that does is the TkAgg backend. This can be made
the default by creating a file~/.matplotlib/matplotlibrcwith
the content:backend: TkAggYou can check what backend is your current default in python via:importmatplotlib.pyplotprintmatplotlib.pyplot.get_backend()If you want to run the unit tests, you need to havepytestinstalled.Finally, you can run a quick test of the advection solver:./pyro-sim.py advection smooth inputs.smoothyou should see a graphing window pop up with a smooth pulse
advecting diagonally through the periodic domain.Core Data StructuresThe main data structures that describe the grid and the data the lives
on the grid are described in a jupyter notebook:https://github.com/python-hydro/pyro2/blob/main/mesh/mesh-examples.ipynbMany of the methods here rely on multigrid.  The multigrid solver is
demonstrated in the juputer notebook:https://github.com/python-hydro/pyro2/blob/main/multigrid/multigrid-examples.ipynbSolverspyro provides the following solvers (all in 2-d):advection: a second-order unsplit linear advection solver.  This
uses characteristic tracing and corner coupling for the prediction
of the interface states.  This is the basic method to understand
hydrodynamics.advection_fv4: a fourth-order accurate finite-volume advection
solver that uses RK4 time integration.advection_nonuniform: a solver for advection with a non-uniform velocity field.advection_rk: a second-order unsplit solver for linear advection
that uses Runge-Kutta integration instead of characteristic
tracing.advection_weno: a method-of-lines WENO solver for linear
advection.compressible: a second-order unsplit solver for the Euler
equations of compressible hydrodynamics.  This uses characteristic
tracing and corner coupling for the prediction of the interface
states and a 2-shock or HLLC approximate Riemann solver.compressible_fv4: a fourth-order accurate finite-volume compressible
hydro solver that uses RK4 time integration.  This is built from the
method of McCourquodale and Colella (2011).compressible_rk: a second-order unsplit solver for Euler
equations that uses Runge-Kutta integration instead of
characteristic tracing.compressible_sdc: a fourth-order compressible solver,
using spectral-deferred correction (SDC) for the time integration.diffusion: a Crank-Nicolson time-discretized solver for the
constant-coefficient diffusion equation.incompressible: a second-order cell-centered approximate
projection method for the incompressible equations of
hydrodynamics.lm_atm: a solver for the equations of low Mach number
hydrodynamics for atmospheric flows.lm_combustion: (in development) a solver for the equations of
low Mach number hydrodynamics for smallscale combustion.multigrid: a cell-centered multigrid solver for a
constant-coefficient Helmholtz equation, as well as a
variable-coefficient Poisson equation (which inherits from the
constant-coefficient solver).particles: a solver for Lagrangian tracer particles.swe: a solver for the shallow water equations.Working with dataIn addition to the main pyro program, there are many analysis tools
that we describe here. Note: some problems write a report at the end
of the simulation specifying the analysis routines that can be used
with their data.compare.py: this takes two simulation output files as input and
compares zone-by-zone for exact agreement. This is used as part of
the regression testing.usage:./compare.py file1 file2plot.py: this takes the an output file as input and plots the
data using the solver's dovis method.usage:./plot.py fileanalysis/dam_compare.py: this takes an output file from the
shallow water dam break problem and plots a slice through the domain
together with the analytic solution (calculated in the script).usage:./dam_compare.py filegauss_diffusion_compare.py: this is for the diffusion solver's
Gaussian diffusion problem. It takes a sequence of output
files as arguments, computes the angle-average, and the plots
the resulting points over the analytic solution for comparison
with the exact result.usage:./gauss_diffusion_compare.py file*incomp_converge_error.py: this is for the incompressible
solver's converge problem. This takes a single output file as
input and compares the velocity field to the analytic
solution, reporting the L2 norm of the error.usage:./incomp_converge_error.py fileplotvar.py: this takes a single output file and a variable
name and plots the data for that variable.usage:./plotvar.py file variablesedov_compare.py: this takes an output file from the
compressible Sedov problem, computes the angle-average profile
of the solution and plots it together with the analytic data
(read in fromcylindrical-sedov.out).usage:./sedov_compare.py filesmooth_error.py: this takes an output file from the advection
solver's smooth problem and compares to the analytic solution,
outputting the L2 norm of the error.usage:./smooth_error.py filesod_compare.py: this takes an output file from the
compressible Sod problem and plots a slice through the domain
over the analytic solution (read in fromsod-exact.out).usage:./sod_compare.py fileUnderstanding the algorithmsThere is a set of notes that describe the background and details of the
algorithms that pyro implements:http://bender.astro.sunysb.edu/hydro_by_example/CompHydroTutorial.pdfThe source for these notes is also available on github:https://github.com/Open-Astrophysics-Bookshelf/numerical_exercisesRegression and unit testingThetest.pyscript will run several of the problems (as well as some
stand-alone multigrid tests) and compare the solution to stored
benchmarks (in each solver'stests/subdirectory).  The return value
of the script is the number of tests that failed.Unit tests are controlled by pytest and can be run simply viapytest .AcknowledgementsIf you use pyro in a class or workshop, please e-mail us to let us know
(we'd like to start listing these on the website).If pyro was used for a publication, please cite the article found in
theCITATIONfile.Getting helpWe use github discussions as a way to ask about the code:https://github.com/python-hydro/pyro2/discussions