## Fundamentals, Non-linear Systems and Interpolation [M12]

The aims of this course are to provide introductions to floating-point arithmetic and numerical techniques. The principles of good numerical methods will be illustrated by examples, but it will be shown that the design of a numerical algorithm is not necessarily straightforward, even for simple problems - that the solution has to fit the problem. At the end of the course students should be able to apply numerical techniques with an understanding of their underlying principles.

## Numerical Integration and ODEs [M12]

The course introduces numerical methods for ordinary differential equations. At the end of the course students should be adept at choosing methods appropriate for a specific application, they should understand the problem of stiffness and its associated difficulties.

## Numerical Differentiation and PDEs [M12]

The course introduces numerical methods for numerical Differentiation and their application to partial differential equations. At the end of the course students should be adept at choosing methods appropriate for a specific application and constructing their own methods, they should understand the various notions of stability.

## Linear Systems [M12]

Linear systems form an integral part of numerical methods, since continuous problems have to be linearised to be handled by a computer. At the end of the course students should be able to apply numerical techniques to solve linear systems with an understanding of their advantages and disadvantages.

## Numerical Solutions of Hyperbolic Partial Differential Equations [M16]

The objective of this course is to introduce students to numerical methods for partial differential equations, especially those of physical importance. It will be shown that many obvious methods are unsuccessful, and that the majority of the successful methods are guided by the physics and mathematics of the problem at hand. Simple model problems representing several major classifications are studied for the sake of the general messages that they convey. Relevant numerical techniques are discussed.

## Mesh generation and mesh adaptation for partial differential equations [M6]

The course will offer a top-level overview of various mesh generation and mesh adaptation techniques, with particular emphasis on the production of meshes suitable for the solution of all types of partial differential equations. The course will cover issues of mesh quality, ease of generation and computational efficiency. A series of practical sessions will guide students in developing simple codes implementing a number of these algorithms and allow for hands-on experience of the mesh-generation process.

## Foundation Course in QM and solid state physics [M10]

A brief self-contained pedestrian guide to QM starting from scratch, Bloch theorem and Bloch functions. This is very basic, adequate for people with a background not quite in physics or chemistry (materials, engineering, bio, geo etc). The course will include a practical exercise (mini-project): students with coding skills will do a simple programme from scratch and plot simple tight-binding band structures of selected simple 3D solids. Students without coding skills can use a couple of simple 1D (2x2) models instead.

## Electronic structure and DFT [M10]

Main purpose: Fundamentals and main approximations of DFT ( Density Functional Theory Calculations)-based electronic structure; students should leave the course knowing: how to run DFT calculations from a pre-existing programme; how to converge the results with respect to technical parameters; the capabilities and limitations of the methods, addressing the different approximations separately. Practicals will be based on SIESTA, ONETEP, and CASTEP.

## Atomistic Modelling of Materials [M24]

This 24-hour course gives an introduction to the atomistic simulation of materials using classical molecular dynamics and Monte Carlo techniques, and consists of a series of lectures with associated examples classes and computing classes in which both the theoretical and practical aspects of running simulations will be covered. The course starts with a brief review of essential concepts in thermodynamics and statistical mechanics required to understand atomistic simulation methods, and is suitable for those with a physical sciences background.

## Molecular modelling [M12]

During this course, students will develop an understanding of the atomic scale processes behind familiar macroscopic concepts like temperature and stress/strain curves, and learn how to compute and predict various observables. A few introductory lectures are given to introduce atomistic simulation and the associated software tools, but most of the course consists of completing the simulation and programming assignments. Students can get help from the course leader and/or demonstrators in the DPO in the time slots advertised for the course. The assignments and the necessary data files are available from the associated CamTools support site.

## Scientific Programming in C++ [M12]

This course will introduce students to C++ as a language widely used in scientific computing. The course will cover most aspects of C++ to an intermediate level, with the aim being to teach students sufficient C++ to program non-trivial algorithms in a robust and efficient manner. The course should be accessible to all students, irrespective of any prior programming knowledge.:

## Computational hardware [M8]

The course will provide an overview of how the hardware design of a computer impacts its performance and therefore the optimal way to program it.

## Software Design [M6]

This covers the basic principles of practical software engineering that are important for reliable and efficient scientific software.

## Message Passing Interface [M10]

This introduces parallel programming using distributed memory message-passing and the MPI (Message Passing Interface) standard. It covers the properties of the computing model, and the basic facilities of the MPI standard. No prior knowledge of parallel programming is assumed. The goal is to teach all of the facilities that are used in most MPI codes that are developed and used in scientific and engineering research organisations, and to be able to refer to the MPI standard on specific points or to use other facilities.

## Programming with GPUs [M6]

This course will introduce students to the principles of writing scientific software for the latest graphics cards, taking advantage of the highly-parallel nature of the hardware to attain significant speed-ups as compared to traditional CPUs. The course will begin by covering the hardware structure of modern GPUs, and how this relates to the software model. Students will then be introduced to the C-like CUDA programming language which has been developed by NVIDIA, and be shown how to develop efficient algorithms using this language. Students will be introduced to general strategies for optimising code. The main examples used in the course will be related to the numerical solution of PDEs.

## Open MP

This is an introduction to using OpenMP for writing parallel programs to run on multi-CPU (SMP) systems, for the purposes of "high-performance computing" (i.e. running programs faster than they can on a single CPU core). It covers all of the principles of OpenMP, and teach the use of all of the basic facilities, so that attendees will be able to write serious programs using it and update most of those that they get from other people. It concentrates on describing how to avoid problems, because shared memory programming and using OpenMP are less about knowing what to do than knowing what not to do. It covers Fortran, C and, to some extent, C++.

## Machine Learning [M12]

The lecture course gives an introduction to machine learning, a field which is interdisciplinary bringing together expertise developed in Mathematics, Computing, Engineering, Physics and more. The goal of machine learning is to gain knowledge from data, the sources of which can be very varied. From this, understanding of the underlying principles is gained in order to make decisions or predictions. Different techniques with their advantages and disadvantages will be introduced at a high level with theoretical underpinning and pointers to more in depth sources of information. The central questions explored for different methods are: "Why does it work?", "When should it be applied?" and "Where and why can it go wrong?". Where appropriate, techniques will be illustrated by an application.

## Geometric Algebra [M8]

This course introduces the mathematical language of geometric algebra as a tool for analysing problems in physics and geometry.

## Introduction to Linux [M4]

This course will cover the basics of Linux as used in a research environment.

## Programming for power-efficient computing

This course introduces programming for power efficient computing as an important skill in today's computing landscape. The course will introduce students to today's computing landscape with an overview of various computer hardware and software technologies and a comparison between these. This will be followed by an introduction to a number of high level and low level techniques for power-efficient computing. The course will then introduce the new era of mobile computing and Internet-of-Things. Following this, it will present specific technologies in more detail namely: graphics processors, multicore processors with SIMD extensions, and server and high performance computer architectures.