Commit 36c428c0 authored by Praetorius, Simon's avatar Praetorius, Simon

updated some slides and added cheat sheets

parent 93f0b2e0
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
@import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic); @import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic);
@import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic); @import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
</style> </style>
<!--<link rel="stylesheet" type="text/css" href="style_display.css" />--> <link rel="stylesheet" type="text/css" href="style_display.css" />
<link rel="stylesheet" type="text/css" href="style_print.css" /> <!--<link rel="stylesheet" type="text/css" href="style_print.css" />-->
</head> </head>
<body> <body>
<textarea id="source"> <textarea id="source">
...@@ -32,15 +32,15 @@ Simon Praetorius *simon.praetorius@tu-dresden.de* ...@@ -32,15 +32,15 @@ Simon Praetorius *simon.praetorius@tu-dresden.de*
# About this Course # About this Course
> Goals: Introductory course > Goals: Introductory course
- You know how to use the software AMDiS - You know how to use the compile and link against the AMDiS library
- You can solve a scalar equation, or a system of elliptic equations - You can solve a linear scalar equation, or a system of elliptic equations
- You can handle instationary problems, nonlinearities and complex boundary conditions - You can handle instationary problems, nonlinearities and complex boundary conditions
- You can run your simulation in parallel - You can run your simulation in parallel
-- --
> References: > References:
- Some theoretical background and basic design ideas of AMDiS software: [ALBERTA-FEM](http://goo.gl/Sn9CIE) especially the ALBERT 1.0 [documentation](http://goo.gl/ZMI2kA). - Some theoretical background and basic design ideas of AMDiS software: [ALBERTA-FEM](http://goo.gl/Sn9CIE).
- The [AMDiS-Wiki](https://goo.gl/Jy3u1u) - The [AMDiS-Wiki](https://goo.gl/Jy3u1u)
- Some (old) PDF Documentation on [Fusionforge](https://goo.gl/5ngfYd) - Some (old) PDF Documentation on [Fusionforge](https://goo.gl/5ngfYd)
...@@ -135,6 +135,20 @@ Andreas Naumann, Simon Praetorius, Siqi Ling, Sebastian Reuther, ... ...@@ -135,6 +135,20 @@ Andreas Naumann, Simon Praetorius, Siqi Ling, Sebastian Reuther, ...
- Interface to **linear solvers**: (P)MTL4, PETSc, Hypre - Interface to **linear solvers**: (P)MTL4, PETSc, Hypre
- **FETI-DP** / Schur-complement solvers in parallel - **FETI-DP** / Schur-complement solvers in parallel
---
# Install AMDiS
- Debian package
- EasyBuild software
- Docker image
- Manual installation
### Requirements
- Recent C++ compiler (e.g. g++ >= 6.0, clang >= 4.0, intel icc >= 2018)
- CMake (>= 3.1)
- Boost (>= 1.48)
- optional: Git, SuiteSparse, PETSc, ParMetis, Hypre, BDDC,...
</textarea> </textarea>
<script src="lib/remark.js" type="text/javascript"></script> <script src="lib/remark.js" type="text/javascript"></script>
......
<!DOCTYPE html>
<html>
<head>
<title>AMDiS - Adaptive Multi-Dimensional Simulations</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
@import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz);
@import url(https://fonts.googleapis.com/css?family=Raleway);
@import url(https://fonts.googleapis.com/css?family=Ubuntu);
@import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic);
@import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
</style>
<link rel="stylesheet" type="text/css" href="style_display.css" />
<!--<link rel="stylesheet" type="text/css" href="style_print.css" />-->
</head>
<body>
<textarea id="source">
class: center, middle
# AMDiS - Adaptive Multi-Dimensional Simulations
## Introduction to the FEM-Framework
Simon Praetorius *simon.praetorius@tu-dresden.de*
*Institut für Wissenschaftliches Rechnen*
*Technische Universität Dresden*
---
## AMDiS: **A**daptive **M**ulti-**Di**mensional **S**imulations
AMDiS developed around 2005. Basis: C-library *ALBERTA*. Now: an object-oriented `C++`-Framework. Basic concepts:
- **High abstraction level**: (Physical) Problems can be formulated with little knowledge about numerical details
- **Generality**: Solve a broad class of PDE problems. Linear and nonlinear problems, stationary and instationary.
Multiple dimensions and coupling of different dimensions
- **Extensibility**: Interface to extend AMDiS in several aspects, e.g. own error estimators, linear solvers,
preconditioners, time-stepping schemes
- **Efficiency**: Several tools for highly efficient simulations, e.g. adaptive meshes, parallelization, multi-mesh,
fast linear solver libraries
---
# About this Course
> Goals: Introductory course
- You know how to compile and link against the AMDiS library
- You can solve a linear scalar PDE and a system of elliptic equations
- You can handle instationary problems, nonlinearities and complex boundary conditions
- You can run your simulation in parallel (*optional*)
--
> References:
- Some theoretical background and basic design ideas of AMDiS software: [ALBERTA-FEM](http://goo.gl/Sn9CIE).
- The [AMDiS-Wiki](https://goo.gl/Jy3u1u)
- Some (old) PDF Documentation on [Fusionforge](https://goo.gl/5ngfYd)
> Workshop material can be found on [GitHub](https://goo.gl/pjtg4a)
---
## Get the slides and material
All slides and source code, as well as exercise material can be found in a git repository:
```
# Get the repository
git clone https://gitlab.mn.tu-dresden.de/spraetor/amdis_workshop_16.git ...
... amdis_workshop
# Download the material
cd amdis_workshop
git submodule update --init --recursive
```
In the subdirectory `cheat_sheets/` you can find quick reference cards on some tools used in this workshop.
See also https://devhints.io
---
# Agenda
### Wednesday Nov 28
- Scalar linear second order PDEs
- Discrete functions on unstructured grids
### Friday Nov 30
- Adaptivity and systems of equations
- Time-dependent and nonlinear problems
### Wednesday Dec 5
- Boundary conditions and Composite FEM
- Parallelization
---
# Introduction
## Short history
- 2002: Beginning of development (based on C-library ALBERT(A))
- 2005: First release
- 2007: PhD Thesis of Simon Vey: "*Adaptive Finite Elements for Systems of PDEs*"
- 2007: Development in the IWR at TU-Dresden
- 2008: First parallel version
- 2011: Release of stable version 0.9
- 2013: PhD Thesis of Thomas Witkowski: "*Software concepts and algorithms for an efficient and scalable parallel finite element method*"
- 2014: Generic expression terms introduced
- 2019 (?): AMDiS 2.0 (based on dune library)
Developers:
```
Axel Voigt, Simon Vey, Christina Stöcker, Thomas Wittkowski,
Andreas Naumann, Simon Praetorius, Siqi Ling, Sebastian Reuther, ...
```
---
## Some features
- Solve (sequence of) Systems of **stationary linear PDEs** of **2nd order**
- **Time integrators**: e.g. Rosenbrock method
- **Nonlinear solvers**: e.g. Newton method
- **Adaptivity** in space and time
- Lagrange **basis functions** (deg. 1--4), and center-bubble function
- **Mixed finite-elements**, e.g. `\(P^2/P^1\)`, Mini-Element
- **Multi-Mesh** method (i.e. different components with different mesh)
- Sequential and **parallel** (tested with up to 16K cores, and `\(10^9\)` DOFs)
- **Multi-Grid**: geometric (in AMDiS), algebraic (external library)
- Interface to **linear solvers**: (P)MTL4, PETSc, Hypre
- **FETI-DP** / Schur-complement solvers in parallel
---
# Get AMDiS
### Source code
AMDiS is an open source library availabe on Gitlab
https://gitlab.mn.tu-dresden.de/iwr/amdis
### Package
Some precompiled packages for Debian Linux available
https://gitlab.mn.tu-dresden.de/iwr/packages
### Docker image
Environment to work with compiled and installed library
https://hub.docker.com/r/mathiwr/amdis-1.1.dev
---
## System requirements
- Recent C++ compiler (e.g. g++ >= 6.0, clang >= 4.0, intel icc >= 2018)
- CMake (>= 3.1)
- Boost (>= 1.48)
- optional: Git, SuiteSparse, PETSc, ParMetis, Hypre, BDDC,...
Everything necessary is collected and composed in a docker image.
## Setup AMDiS in PC lab
- Use docker image: `mathiwr/amdis-1.1.dev:debian9`
- Mount local directory: `~/Desktop`
- Work in terminal: `bash`
```
docker pull mathiwr/amdis-1.1.dev
docker run -it -v ~/Desktop:/Desktop mathiwr/amdis-1.1.dev:debian9 bash
```
</textarea>
<script src="lib/remark.js" type="text/javascript"></script>
<script type="text/javascript" src="MathJax/MathJax.js?config=TeX-AMS_HTML"></script>
<script type="text/javascript">
var slideshow = remark.create({
ratio: "4:3",
highlightLanguage: "cpp"
});
// Setup MathJax
MathJax.Hub.Config({
tex2jax: {
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
}
});
MathJax.Hub.Queue(function() {
$(MathJax.Hub.getAllJax()).map(function(index, elem) {
return(elem.SourceElement());
}).parent().addClass('has-jax');
});
MathJax.Hub.Configured();
</script>
</body>
</html>
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
@import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic); @import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic);
@import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic); @import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
</style> </style>
<!--<link rel="stylesheet" type="text/css" href="style_display.css" />--> <link rel="stylesheet" type="text/css" href="style_display.css" />
<link rel="stylesheet" type="text/css" href="style_print.css" /> <!--<link rel="stylesheet" type="text/css" href="style_print.css" />-->
</head> </head>
<body> <body>
<textarea id="source"> <textarea id="source">
...@@ -19,17 +19,9 @@ ...@@ -19,17 +19,9 @@
class: center, middle class: center, middle
# Session 1 # Session 1
## Scalar linear second order PDEs ## Wednesday Nov 28
---
# Agenda
### Monday
- **Scalar linear second order PDEs** - **Scalar linear second order PDEs**
- Handling data on unstructured grids - Discrete functions on unstructured grids
- Adaptivity and systems of equations
- Introduction to Student Projects
--- ---
...@@ -69,23 +61,25 @@ with `\(\langle a,b \rangle_\Omega:=\int_\Omega a\cdot b\,\text{d}x\)` and `\(V^ ...@@ -69,23 +61,25 @@ with `\(\langle a,b \rangle_\Omega:=\int_\Omega a\cdot b\,\text{d}x\)` and `\(V^
- `\(V^{(0)}=V^{(1)} = H^1(\Omega)\)`, or - `\(V^{(0)}=V^{(1)} = H^1(\Omega)\)`, or
- `\(V^{(1)}=V_G:=\{u\in H^1(\Omega)\,:\,u|_{\partial\Omega}=G\}, V^{(0)} = V_0\)`. - `\(V^{(1)}=V_G:=\{u\in H^1(\Omega)\,:\,u|_{\partial\Omega}=G\}, V^{(0)} = V_0\)`.
plus some boundary terms from the boundary conditions.
--- ---
# Basic ingredients # Basic ingredients
What data/information do you need to formulate your problem? What data/information do you need to formulate your problem?
1. Description of your **domain** `\(\Omega\)` + a **triangulation** `\(\mathcal{T}_h\)` of the domain --> `Mesh` 1. Description of your **domain** `\(\Omega\)` + a **triangulation** `\(\mathcal{T}_h\)` of the domain --> `Mesh`
2. Function-space `\(V\)`, or its **basis-functions** respectively. 2. (Discrete) Function-space `\(V_h\)`, or its **basis-functions** respectively.
- `P1` := Lagrange elements with polynomial degree `\(p=1\)`: - `P1` := Lagrange elements with polynomial degree `\(p=1\)`, e.g.
\\[ \\[
V = \\{ v\in H^1(\Omega)\,:\, v|\_T\in\mathbb{P}\_p(T),\,\forall T\in\mathcal{T}\_h(\Omega)\\} V_h = \\{ v\in H^1(\Omega)\,:\, v|\_T\in\mathbb{P}\_p(T),\,\forall T\in\mathcal{T}\_h(\Omega)\\}
\\] \\]
- `P1+bubble` := `P1` + center bubble-function - `P1+bubble` := `P1` + center bubble-function
`\(V^{(0)}\)` is called `RowFeSpace` and `\(V^{(1)}\)` is called `ColumnFeSpace`. `\(V_h^{(0)}\)` is called `RowFeSpace` and `\(V_h^{(1)}\)` is called `ColumnFeSpace`.
-- --
3. **Solution** vector `\(u\)`, based on a numbering of all DOFs --> `DOFVector` 3. **Solution** vector `\((u_i)\equiv u\in V_h^{(1)}\)`, called `DOFVector`
\\[ \\[
u(x) = \sum\_i u\_i\phi\_i(x),\quad\text{with}\;\\{\phi_i\\}\text{ a basis of }V^{(1)} u(x) = \sum\_i u\_i\phi\_i(x),\quad\text{with}\;\\{\phi_i\\}\text{ a basis of }V^{(1)}
\\] \\]
...@@ -111,11 +105,11 @@ What data/information do you need to formulate your problem? ...@@ -111,11 +105,11 @@ What data/information do you need to formulate your problem?
# General procedure # General procedure
<img src="images/procedure.png" width="100%" alt="Solution procedure" /> <img src="images/procedure_en.png" width="100%" alt="Solution procedure" />
--- ---
# Basic structure of an AMDiS program # First AMDiS program
### Header file ### Header file
``` ```
...@@ -169,7 +163,7 @@ prob.initialize(INIT_ALL); ...@@ -169,7 +163,7 @@ prob.initialize(INIT_ALL);
``` ```
with `initialize(flag)` with `initialize(flag)`
- reads a mesh from file - reads a mesh from file
- initial flobal refinement - initial global refinement of the mesh
- creates corresponsing finite-element spaces - creates corresponsing finite-element spaces
- creates, estimators, markers, solvers, ... - creates, estimators, markers, solvers, ...
...@@ -193,10 +187,10 @@ Operator opF(prob.getFeSpace()); ...@@ -193,10 +187,10 @@ Operator opF(prob.getFeSpace());
addZOT(opF, 1.0); // <f, theta>, f=1 addZOT(opF, 1.0); // <f, theta>, f=1
``` ```
with `addSOT(op, coeff)` with `addSOT(op, coeff)`
- adds a second order term to the operator `op`, with coefficient function `coeff` - adds a 2nd order term to the operator `op`, with coefficient function `coeff`
with `addZOT(op, coeff)` with `addZOT(op, coeff)`
- adds a zero order term to the operator `op`, with coefficient function `coeff` - adds a 0th order term to the operator `op`, with coefficient function `coeff`
--- ---
...@@ -220,7 +214,7 @@ addZOT(opF, 1.0); // <f, theta>, f=1 ...@@ -220,7 +214,7 @@ addZOT(opF, 1.0); // <f, theta>, f=1
prob.addMatrixOperator(opL, 0, 0); prob.addMatrixOperator(opL, 0, 0);
prob.addVectorOperator(opF, 0); prob.addVectorOperator(opF, 0);
``` ```
with the number `0` corresponding to the block-matrix component. We have only one block and thus, this is always 0. More about block systems later. with the number `0` corresponds to the 0th unknown in the 0th equation. We have only one block and thus, this is always 0. More about block systems later.
--- ---
...@@ -253,9 +247,6 @@ a predefined functor, that returns `0` always. ...@@ -253,9 +247,6 @@ a predefined functor, that returns `0` always.
--- ---
# Example 1 # Example 1
Find `\(u\in V_0\)`, s.t. `\(\langle\nabla u,\nabla\theta\rangle_\Omega = \langle f,\theta\rangle_\Omega,\;\forall\theta\in V_0.\)`
### Define boundary conditions ### Define boundary conditions
``` ```
ProblemStat prob("poisson"); // Problem definition ProblemStat prob("poisson"); // Problem definition
...@@ -276,8 +267,8 @@ prob.addDirichletBC(nr, 0, 0, new Constant(0.0)); // Define boundary condition ...@@ -276,8 +267,8 @@ prob.addDirichletBC(nr, 0, 0, new Constant(0.0)); // Define boundary condition
``` ```
AdaptInfo adaptInfo("adapt"); // Store Informations about solution process AdaptInfo adaptInfo("adapt"); // Store Informations about solution process
prob.assemble(&adaptInfo); // Assemble and solve system prob.assemble(&adaptInfo); // Assemble and
prob.solve(&adaptInfo); prob.solve(&adaptInfo); // solve the linear system
prob.writeFiles(&adaptInfo, true); // Write solution to file prob.writeFiles(&adaptInfo, true); // Write solution to file
``` ```
...@@ -320,7 +311,7 @@ int main(int argc, char** argv) ...@@ -320,7 +311,7 @@ int main(int argc, char** argv)
# Compile and run the AMDiS program # Compile and run the AMDiS program
### CMake configuration ### CMake configuration
File `CMakeLists.txt` File `DIR/CMakeLists.txt`
```cmake ```cmake
project("workshop") project("workshop")
find_package(AMDIS REQUIRED) find_package(AMDIS REQUIRED)
...@@ -328,19 +319,87 @@ add_executable("poisson" src/poisson.cc) ...@@ -328,19 +319,87 @@ add_executable("poisson" src/poisson.cc)
target_link_libraries("poisson" AMDiS) target_link_libraries("poisson" AMDiS)
``` ```
- CMake requires variable `AMDIS_DIR` to point to directory, that contains the file `AMDiSConfig.cmake` - CMake requires variable `AMDIS_DIR` to point to directory, that contains the file `AMDiSConfig.cmake`. This
is set automatically in Docker container.
- See [Link](http://goo.gl/kVe0Z2) for documentation of cmake commands - See [Link](http://goo.gl/kVe0Z2) for documentation of cmake commands
### Compile
```
cd DIR
mkdir build && cd build
cmake [-DAMDIS_DIR=...] DIR
make [poisson]
```
where `DIR=..` contains the `CMakeLists.txt` file.
---
### CMake output
```
-- The C compiler identification is GNU 7.3.0
-- The CXX compiler identification is GNU 7.3.0
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- [...]
-- Performing Test COMPILER_SUPPORTS_CXX14_FLAG - Success
-- Performing Test CXX14_COMPILES_WITH_CXX14_FLAG - Success
-- Boost version: 1.58.0
-- Found the following Boost libraries:
-- system
-- [...]
-- UMFPACK version: 5.7.1 (Oct 10, 2014)
-- Found the following SuiteSparse libraries:
-- /usr/lib/x86_64-linux-gnu/libumfpack.so
-- [...]
-- Configuring done
-- Generating done
-- Build files have been written to: DIR/build
```
### Compile output
```
Scanning dependencies of target poisson
[ 50%] Building CXX object CMakeFiles/poisson.dir/src/poisson.cc.o
[100%] Linking CXX executable poisson
[100%] Built target poisson
```
---
### Run an AMDiS program ### Run an AMDiS program
``` ```
./poisson INIT-FILE cd DIR
./build/poisson INIT-FILE
```
```
MacroReader::checkMesh():
Checking mesh ...
checking done; no error detected
ProblemStat::buildAfterCoarsen():
2113 DOFs for FeSpace[0] (P1)
fillin of assembled matrix: 13897
buildAfterCoarsen needed 0.01085 seconds
LinearSolverInterface::solveSystem():
LinearSolverInterface::solveSystem()
Problem::solve():
solution of discrete system needed 0.00278 seconds
FileWriter<T>::writeFiles():
ParaView file written to ./output/poisson.2d.vtu
ProblemStat::writeFiles():
writeFiles needed 0.01950 seconds
``` ```
--- ---
# The parameter file # Visualization
Plot Solution (.vtu file), using [ParaView](www.paraviw.org)
<img src="images/paraview.png" width="100%" alt="Poisson equation in paraview" />
---
# The parameter file (INIT-FILE)
A parameter file (init-file) controls various parameters of the solution A parameter file controls various parameters of the solution
process, defines the FiniteElemSpace and sets the mesh and is mandatory. process, defines the FiniteElemSpace and sets the mesh and is mandatory.
Init-files have the suffix `.dat.Xd`, where `X` is in \{1, 2, 3\}. Init-files have the suffix `.dat.Xd`, where `X` is in \{1, 2, 3\}.
...@@ -434,15 +493,6 @@ vertex coordinates: ...@@ -434,15 +493,6 @@ vertex coordinates:
</td> </td>
</tr></table> </tr></table>
---
# Visualization
Plot Solution (.vtu file), using [ParaView](www.paraviw.org)
<img src="images/paraview.png" width="100%" alt="Poisson equation in paraview" />
--- ---
class: center, middle class: center, middle
...@@ -495,7 +545,16 @@ with the program `ParaView`. ...@@ -495,7 +545,16 @@ with the program `ParaView`.
--- ---
# Some hints # Some hints
1. Used functions/classes: 1. When you get the error message
```
Cannot open file ./output/exercise1.2d.vtu for writing!
```
the directory `output` is missing. Just create it and run again:
```
mkdir output
```
2. Used functions/classes:
``` ```
addSOT(Operator, EXPRESSION); addSOT(Operator, EXPRESSION);
addZOT(Operator, EXPRESSION); addZOT(Operator, EXPRESSION);
...@@ -503,17 +562,19 @@ addZOT(Operator, EXPRESSION); ...@@ -503,17 +562,19 @@ addZOT(Operator, EXPRESSION);
// argument-type WorldVector<double>: // argument-type WorldVector<double>:
AbstractFunction<double, WorldVector<double>>; AbstractFunction<double, WorldVector<double>>;
``` ```
2. Parameters to modify: 3. Parameters to modify:
```matlab ```matlab
mesh->global refinements: INTEGER mesh->global refinements: INTEGER
poisson->feSpace[0]: [P1|P2|P3|P4|P1+bubble] poisson->feSpace[0]: [P1|P2|P3|P4|P1+bubble]
poisson->solver: [cg|gmres|direct|...] poisson->solver: [cg|gmres|direct|...]
``` ```
3. Sources for help: ---
- [AMDiS-Wiki](https://goo.gl/Jy3u1u)
- [Init-file manual](https://goo.gl/Dhm9Bx) ## Sources for help:
- [Expressions manual](https://goo.gl/JK8EUI) - [AMDiS-Wiki](https://goo.gl/Jy3u1u)
- [List of init-file parameters](https://goo.gl/LWJzq9) - [Init-file manual](https://goo.gl/Dhm9Bx)
- [Expressions manual](https://goo.gl/JK8EUI)
- [List of init-file parameters](https://goo.gl/LWJzq9)
</textarea> </textarea>
<script src="lib/remark.js" type="text/javascript"></script> <script src="lib/remark.js" type="text/javascript"></script>
......
...@@ -10,45 +10,34 @@ ...@@ -10,45 +10,34 @@
@import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic); @import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic);
@import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic); @import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
</style> </style>
<!--<link rel="stylesheet" type="text/css" href="style_display.css" />--> <link rel="stylesheet" type="text/css" href="style_display.css" />
<link rel="stylesheet" type="text/css" href="style_print.css" /> <!--<link rel="stylesheet" type="text/css" href="style_print.css" />-->
</head> </head>
<body> <body>
<textarea id="source"> <textarea id="source">
class: center, middle
# Session 2 # Session 2
## Handling data on unstructured grids ## Wednesday Nov 28
---
# Agenda
### Monday
- Scalar linear second order PDEs - Scalar linear second order PDEs
- **Handling data on unstructured grids** - **Discrete functions on unstructured grids**
- Adaptivity and systems of equations
- Introduction to Student Projects
--- ---
# Motivation