## Why take this course?

Even if this is the only numerical methods course you ever take, dedicating yourself to mastering all modules will give you a foundation from which you can build a career in scientific computing.

## A re-start for 2015!

New on-campus courses are running in Fall 2015 that will use this online course. Unlike other MOOCs that are "re run" with a fresh set of participants and a clean forum and gradebook, we will continue using the same online course that we started in August 2014. All participants who enrolled before, but did not complete the course modules, are invited to try again in 2015.

## About This Course

The first instance of this course ran in Fall 2014. Prof. Lorena A. Barba at the George Washington University, led the online course while at the same time teaching an on-campus course. Two other institutions ran local courses: the University of Southampton (UK) and Pontifical Catholic University of Chile (Santiago, Chile).* The instructors at these partner institutions contributed to the development of materials and engaged with students on the course forum. Students at all locations participated in the same learning community with MOOC participants.

**New in 2015 —** *Numerical MOOC has a new partner!* A course in numerical methods will be taught at Université Libre de Bruxelles adopting this online course. The instructor is Prof. Bernard Knaepen of the Physics Department. His students will join us in the MOOC and he will contribute new materials and updates to the old materials.

*NOTE: Initial planning included the King-Abdullah University of Science and Technology (Saudi Arabia) with Prof. David Ketcheson. Unfortunately, their local course got cancelled and they could not participate.

## Course Aims

The course aims are for students to achieve the following:

- connect the physics represented by a mathematical model to the characteristics of numerical methods to be able to
*select* a good solution method;
- implement a numerical solution method in a well-designed, correct computer program;
- interpret the numerical solutions that were obtained in regards to their accuracy and suitability for applications.

## Who is the course for?

Numerical methods for differential equations are relevant across all of science and engineering. This course is for anyone with mathematical, scientific or engineering backgrounds who wishes to develop a grounding in scientific computing. Using a range of hands-on lessons, participants in the course will develop the basic skills to tackle modern computational modelling problems.

In developing this course, the instructors are inspired by the philosophy of open-source software. One of the tenets of the course is that we can use the web to interact, connect our learning, teach each other by sharing our learning objects. Therefore, this course is especially for those who are eager to participate in distributed knowledge creation on the web. Join us in this adventure!

## Prerequisites

The connected courses and MOOC are aimed at first-year graduate students or advanced seniors, and assume a background in vector calculus, linear algebra, and differential equations. We won't assume more than a beginner's programming experience and will guide students to develop a foundation in numerical methods, and hands-on experience coding up solutions to differential equations.

## Course Topics

The course consists of stacked learning modules that are somewhat self-contained. Each one is motivated by a problem that can be modeled by a differential equation (or system of DEs) and builds new concepts in numerical computing, new coding skills and ideas about analysis of numerical solutions.

The topics cover methods for time integration of simple dynamical systems (systems of ordinary differential equations); finite-difference solutions of various types of partial differential equations (hyperbolic, parabolic or elliptic); assessing the accuracy and convergence of numerical solutions; and using the scientific Python libraries to write these numerical solutions.

## Course Learning Modules

### (1) The phugoid model of glider flight.

Described by a set of two nonlinear ordinary differential equations, the phugoid model motivates numerical time integration methods, and we will build it starting from an even simpler model (e.g., simple harmonic motion), building up to the full nonlinear model in 4 or 5 lessons on initial-value problems. Roughly, this module includes: a) Forward/backward differencing and Euler's method for simple harmonic motion; b) extension to the phugoid model; c) the midpoint method, convergence testing, local vs. global error; d) Runge-Kutta methods.

### (2) Space and Time—Introduction to finite-difference solutions of PDEs

Starting with the simplest model represented by a partial differential equation (PDE)—the linear convection equation in one dimension—, this module builds the foundation of using finite differencing in PDEs. (The module is based on the “CFD Python” collection, steps 1 through 4.) It also motivates CFL condition, numerical diffusion, accuracy of finite-difference approximations via Taylor series, consistency and stability, and the physical idea of conservation laws. Computational techniques: more array operations with NumPy and symbolic computing with SymPy; getting better performance with NumPy array operations.

### (3) Riding the wave: convection problems.

Starting with an overview of the concept of conservation laws, this module uses the traffic-flow model to study different solutions methods for problems with shocks: upwind, Lax-Friedrichs, Lax-Wendroff, MacCormack, then MUSCL (discussing limiters). Reinforces concepts of numerical diffusion and stability, in the context of solutions with shocks. It will motivate spectral analysis of schemes, dispersion errors, Gibbs phenomenon, conservative schemes.

### (4) Spreading out: diffusion problems

This module deals with solutions to parabolic PDEs, exemplified by the diffusion (heat) equation. Starting with the 1D heat equation, we learn the details of implementing boundary conditions and are introduced to implicit schemes for the first time. Another first in this module is the solution of a two-dimensional problem. The 2D heat equation is solved with both explicit and implict schemes, each time taking special care with boundary conditions. The final lesson builds solutions with a Crank-Nicolson scheme.

## New Modules for 2015

### (5) Relax and hold steady: elliptic problems.

Laplace and Poisson equations (steps 9 and 10 of “CFD Python”), explained as systems relaxing under the influence of the boundary conditions and the Laplace operator; introducing the idea of pseudo-time and iterative methods. Linear solvers for PDEs : Jacobi’s method, slow convergence of low-frequency modes (matrix analysis of Jacobi), Jacobi as a smoother, Multigrid.

### (6) Perform like a pro: making your codes faster

Getting performance out of your numerical Python codes with just-in-time compilation, targeting GPUs with Numba and PyCUDA.

## Planned new modules, not yet developed:

### Boundaries take over: the boundary element method (BEM)

Weak and boundary integral formulation of elliptic partial differential equations; the free space Green's function. Boundary discretization: basis functions; collocation and Galerkin systems. The BEM stiffness matrix: dense versus sparse; matrix conditioning. Solving the BEM system: singular and near-singular integrals; Gauss quadrature integration.