Since moving to Oxford I have designed and delivered three courses to the MSc in Mathematical Modelling and Scientific Computing.

- Practical Numerical Analysis: this course is an introductory numerical analysis course and covers floating point arithmetic, interpolation, quadrature, rootfinding, spectral and finite difference discretisations, and geometric multigrid.
- Python in Scientific Computing: this course covers implementing finite element discretisations with FEniCS and Python. Along the way I teach how to discretise the Poisson equation, the heat equation, the \(p\)-Laplace equation, the Stokes equations with nonlinear rheology, an obstacle complementarity problem, St. Venant–Kirchhoff hyperelasticity, the time-dependent Navier–Stokes equations, and a PDE-constrained optimisation problem governed by the Ginzburg–Landau equation.
Lecture slides (Trinity term, 2015)

- Solving PDEs on Supercomputers: this course covers how to design and implement scalable solvers for very large discretisations of PDEs (billions of degrees of freedom). I cover modern supercomputer architecture and its consequences for numerical algorithms, how to run jobs on supercomputers, algebraic multigrid solvers for the Poisson and Yamabe equations, block-triangular factorisation preconditioners (fieldsplit preconditioners) for the Stokes equations and the mother problem of PDE constrained optimisation, globalisation of Newton’s method, nonlinear preconditioning, and full approximation scheme nonlinear multigrid.
Lecture slides (Trinity term, 2015)

I have also given tutorials for Christ Church in

- Numerical Analysis (second year course);
- Constructive Mathematics (first year course);
- Optimisation (first year course).