  PyUltraLight simulates the dynamics of ultralight dark matter in a
non-expanding background. PyUltraLight can describe the evolution of several
interacting ultralight dark matter halos or one or more halos orbiting a
central, fixed Newtonian potential, the latter scenario corresponding to dwarf
galaxies orbiting a massive central galaxy. We verify PyUltraLight by showing
that it reproduces qualitative dynamical features of previously published
simulations and demonstrate that it has excellent energy-conservation
properties. PyUltraLight is implemented in a Python-based Jupyter notebook,
solving the Schrodinger-Poisson equation governing ultralight scalar field dark
matter dynamics in the non-relativistic regime using a symmetrised split-step
pseudospectral algorithm. The notebook interface makes it simple to specify
simulation parameters and visualise the resulting output but
performance-critical routines are managed via calls to computationally
efficient compiled libraries. PyUltraLight runs on standard desktop hardware
with support for shared memory mutlithreading and is available on GitHub.
