  Creating scalable, high performance PDE-based simulations requires a suitable
combination of discretizations, differential operators, preconditioners and
solvers. The required combination changes with the application and with the
available hardware, yet software development time is a severely limited
resource for most scientists and engineers. Here we demonstrate that generating
simulation code from a high-level Python interface provides an effective
mechanism for creating high performance simulations from very few lines of user
code. We demonstrate that moving from one supercomputer to another can require
significant algorithmic changes to achieve scalable performance, but that the
code generation approach enables these algorithmic changes to be achieved with
minimal development effort.
