sympy2c: from symbolic expressions to fast C/C++ functions and ODE
  solvers in Python
  Computer algebra systems play an important role in science as they facilitate
the development of new theoretical models. The resulting symbolic equations are
often implemented in a compiled programming language in order to provide fast
and portable codes for practical applications. We describe sympy2c, a new
Python package designed to bridge the gap between the symbolic development and
the numerical implementation of a theoretical model. sympy2c translates
symbolic equations implemented in the SymPy Python package to C/C++ code that
is optimized using symbolic transformations. The resulting functions can be
conveniently used as an extension module in Python. sympy2c is used within the
PyCosmo Python package to solve the Einstein-Boltzmann equations, a large
system of ODEs describing the evolution of linear perturbations in the
Universe. After reviewing the functionalities and usage of sympy2c, we describe
its implementation and optimization strategies. This includes, in particular, a
novel approach to generate optimized ODE solvers making use of the sparsity of
the symbolic Jacobian matrix. We demonstrate its performance using the
Einstein-Boltzmann equations as a test case. sympy2c is widely applicable and
may prove useful for various areas of computational physics. sympy2c is
publicly available at
https://cosmology.ethz.ch/research/software-lab/sympy2c.html
