This is shared course between the SISSA PhD track on Mathematical Analysis, Modeling, and Applications (math.sissa.it) and the Master in High Performance Computing (www.mhpc.it). It is a course that follows two parallel lines: theory of finite element methods (graduate students level, ~20 hours) and practice of finite element methods (mhpc students levels, ~20 hours).
The goal of the course is to provide to the students advanced analysis tools for finite element methods, as well as state-of-the-art programming knowledge for the actual implementation part.
The theory ranges from basic FEM and functional analysis arguments, like Lax-Milgram, Cea, and Bramble Hilbert lemmas, to more advanced topics, like inf-sup conditions and a-posteriori error analysis.
The goal of the practice part is to enable a PhD or MHPC student working on
numerical analysis of PDEs to implement a state-of-the-art adaptive finite
element code, that runs in parallel, using modern C++ libraries. The
implementation will be based on the deal.II
library (www.dealii.org).
What you will learn:
- Advanced Finite Element theory
- How to use a modern C++ IDE, to build and debug your codes
- How to use a large FEM library to solve complex PDE problems
- How to properly document your code using Doxygen
- How to use a proper Git workflow to develop your applications
- How to leverage GitHub actions, google tests, and docker images to test and deploy your application
- How hybrid parallelisation (threads + MPI + GPU) works in real life FEM applications
Course main page, with schedule and up to date information
Course classroom on GitHub (for assignments/exercises)
Course slides, notes, materials, and codes:
Course recordings:
A tentative detailed program is shown below (this will be updated during the course to reflect the actual course content)
- Introduction
- Model problem
- Lax-Milgram Lemma
- Cea’s Lemma
- [C++] Tools and background
- Using modern IDEs: VisualStudio CODE
- Using the "Remote" plugin to build with docker inside VS Code
- Testing your code with Google Test
- Formal definition of Finite Elements
- Lagrangian polynomial basis
- Triangulation and degrees of freedom
- Finite element triple
- Lagrangian Finite Element spaces
- [C++] Introduction to deal.II
- Deal.II general structure
- Triangulation
- Elementary FiniteElement types
- Degrees of Freedom
- Paraview
- Conforming finite element spaces
- Local basis functions
- Global basis functions
- Numbering of degrees of freedom
- Scaling arguments
- Affine mappings
- Transformation of Sobolev norms under Affine mappings
- [C++] Solving a Poisson problem using deal.II
- General program structure
- Local assembly
- Global distribution
- ParameterHandler and ParsedFunction
- Different types of boundary conditions
- Curved geometries, high order mappings
- Interpolation error estimates for smooth functions
- Denis-Lions Lemma
- Bramble-Hilbert Lemma
- [C++] Checking a priori error estimates on globally refined grids
- Construction of Manufactured solutions
- Working on successively (uniformly) refined grids
- Studying the convergence rates of FEM codes
- ConvergenceTable
- A priori error estimates in H1 and L2
- Bramble-Hilbert + Ceas = H1 a priori bounds
- Nitsche's Lemma
- Inverse Estimates
- Trace inequalities
- [C++] Improving on our Poisson solver
- Dirichlet boundary conditions as AffineConstraints
- General (and efficient) treatment of Constraints in FEM codes
- Neumann boundary conditions
- Hanging nodes constraints
- A-posteriori error estimates - Part 1 (efficiency)
- Interpolation error on H1 functions: Scott-Zhang interpolation
- Orthogonal projections in H1 and L2
- Global upper bounds (reliability)
- [C++] Adaptive finite element methods in deal.II
- SOLVE-ESTIMATE-MARK-REFINE loop
- Kelly error estimator
- Dorfler marking strategy
- Fixed number marking strategy
- A-posteriori error estimates - Part 2 (optimality)
- Properties of bubble functions
- Lifting operator (from traces to values in the elements)
- Local optimality property
- Error balancing
- [C++] Shared memory parallelization
- Parallelize using threads
- Parallelize using tasks
- Exploiting the FEM loops characteristics: WorkStream
- Problems in general Banach spaces
- Closed range theorem and Open mapping theorem
- Banach-Necas-Babuska conditions
- Application to general mixed problems
- [C++] Distributed memory parallelization 1. Domain decomposition VS algebraic decomposition 2. Splitting workload: partitioning with space filling curves 3. Moving from serial Poisson to parallel distributed Poisson
- A priori estimates for Petrov Galerkin and Mixed methods
- Cea's Lemma for Petrov Galerkin methods
- Cea's Lemma for Mixed problems
- Discrete infsup conditions
- Error estimates for mixed problems
- [C++] Vector valued problems
- Handling systems of PDEs
- Accessing subspaces using "Extractors"
- Proving the infsup condition
- Continuous case: mixed Poisson
- Fortin's trick
- Macroelement technique
- [C++] Mixed problems
- Block systems of equations
- Stokes system example
- Block-Preconditioning using LinearOperators
- Convergence of Stokes system, and infsup considerations
- Git & GitHub fundamentals
- Environment setup
- Triangulation, DoFHandler, and FiniteElement
- Poisson problem
- Bramble-Hilbert Lemma in action
- Boundary conditions and constraints
- Adaptive Finite Element methods for the Poisson problem
- Shared memory parallelization
- MPI parallelisation
- Vector valued problems
- Mixed problems (Stokes)