This course teaches you how to develop scientific software in a systematic way instead of hacking together spaghetti code that is impossible to maintain. We will use modern C++11/14/17/20, which is a very efficient and powerful programming language that is widely used both at universities and in industry. Many of the design concepts and programming patterns taught during this course apply to other programming languages as well. That said, the focus of this course is not primarily to teach C++ as a programming language but to teach universal programming concepts that help to develop scientific software.

The development of good scientific software starts at the software design stage, where you decide on how to break down the overall problem to be solved into smaller subtasks and to structure your code into smaller units (called classes and structures in C++) accordingly. Each of these units can be developed and tested independently before all of them are used in concert to solve the overall problem. A good program design even allows to develop individual units in a team of several people. You will practice collaborative software development during the final project.

The course will furthermore teach modern object-oriented programming patterns like grouping and encapsulating data and functionality in classes, inheriting functionality and data between classes, and overriding and overloading functionality if specialisation is needed. Another very powerful concept, namely, template meta-programming will be studied extensively, which will allow you to develop generic code. For instance, think about a function that multiplies a n-x-k matrix with a k-x-m matrix. The same function can be used to multiply a column vector of length n with a row vector of length n and vice versa.

At the end of the course you will be able to analyse your scientific problem and make a good modular software design for it using modern programming concepts. You will moreover be able to turn the design into an efficient implementation in C++.

2021-2022Nov 8, 2021Feb 28, 2022
2020-2021Nov 12, 2020