  Lattice Boltzmann methods are a popular mesoscopic alternative to macroscopic
computational fluid dynamics solvers. Many variants have been developed that
vary in complexity, accuracy, and computational cost. Extensions are available
to simulate multi-phase, multi-component, turbulent, or non-Newtonian flows. In
this work we present lbmpy, a code generation package that supports a wide
variety of different methods and provides a generic development environment for
new schemes as well. A high-level domain-specific language allows the user to
formulate, extend and test various lattice Boltzmann schemes. The method
specification is represented in a symbolic intermediate representation.
Transformations that operate on this intermediate representation optimize and
parallelize the method, yielding highly efficient lattice Boltzmann compute
kernels not only for single- and two-relaxation-time schemes but also for
multi-relaxation-time, cumulant, and entropically stabilized methods. An
integration into the HPC framework waLBerla makes massively parallel,
distributed simulations possible, which is demonstrated through scaling
experiments on the SuperMUC-NG supercomputing system
