I lecture the C6.4 Finite Element Methods for PDEs course for fourth-year and MSc students. The lecture notes are available on the course webpage.

I have also designed and delivered three courses to the Oxford 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.
    pdf-iconLecture 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.
    pdf-iconLecture slides (Trinity term, 2015)

I have also given tutorials for Christ Church and Oriel in Linear Algebra I, Geometry, Computational Mathematics, Differential Equations I, Optimisation, Numerical Analysis, and Calculus of Variations.