Reference documentation for deal.II version 9.1.1
\(\newcommand{\dealcoloneq}{\mathrel{\vcenter{:}}=}\)
Tutorial programs

New to deal.II? You might want to start with tutorial step-1 and work your way up to step-5. At that point you can explore what features you are interested in and look at the large collection of programs listed below.

The deal.II tutorial contains a collection of programs, each more or less built atop of previous ones, which demonstrate various aspects of the library. Each such example has the following structure:

  1. Introduction: What the program does, including the mathematical model, and what programming techniques are new.
  2. The commented program: An extensively documented listing of the source code.
  3. Results: The output of the program, with comments and interpretation.
  4. The plain program: The source code stripped of all comments.

You can browse the available tutorial programs

  1. as a graph that shows how tutorial programs build upon each other.
  2. as a list that provides a short synopsis of each program.
  3. or grouped by topic.

The programs are in the examples/ directory of your local deal.II installation. After compiling the library itself, if you go into one of the tutorial directories, you can configure the program by typing cmake ., build it via make and run it using make run. The latter command also compiles the program if that has not already been done. The CMakeLists.txt files in the different directories are based on the autopilot style CMakeLists.txt example.

Note
Some of the tutorial programs also jointly form the geodynamics demonstration suite. More, often more complex but less well documented, deal.II-based programs than the ones that form the tutorial can also be found in the The deal.II code gallery .

Connections between tutorial programs

The following graph shows the connections between tutorial programs and how they build on each other. Click on any of the boxes to go to one of the programs. If you hover your mouse pointer over a box, a brief description of the program should appear.

Legend:

Tutorial programs listed by number

step-1

Creating a grid. A simple way to write it to a file.
Keywords: Triangulation, GridGenerator::hyper_cube, GridGenerator::hyper_shell, GridOut, Triangulation::execute_coarsening_and_refinement

step-2

Associate degrees of freedom to each vertex and compute the resulting sparsity pattern of matrices. Show that renumbering reduces the bandwidth of matrices significantly, i.e. clusters nonzero entries around the diagonal.
Keywords: FE_Q, DynamicSparsityPattern, DoFTools::make_sparsity_pattern, DoFHandler::distribute_dofs, DoFRenumbering, SparsityPattern

step-3

Actually solve Laplace's problem. Object-orientation. Assembling matrices and vectors. Boundary values.
Keywords: FEValues, VectorTools::interpolate_boundary_values, MatrixTools::apply_boundary_values, SolverCG, Vector<double>, SparseMatrix<double>, DataOut

step-4

This example is programmed in a way that it is independent of the dimension for which we want to solve Laplace's equation; we will solve the equation in 2D and 3D, although the program is exactly the same. Non-constant right hand side function. Non-homogeneous boundary values.
Keywords: VectorTools::point_value, VectorTools::compute_mean_value

step-5

Computations on successively refined grids. Reading a grid from disk. Some optimizations. Using assertions. Non-constant coefficient in the elliptic operator (yielding the extended Poisson equation). Preconditioning the CG solver for the linear system of equations.
Keywords: PreconditionSSOR, GridIn, SphericalManifold

step-6

Adaptive local refinement. Handling of hanging nodes. Higher order elements. Catching exceptions in the main; function.
Keywords: DoFTools::make_hanging_node_constraints, AffineConstraints::distribute_local_to_global, KellyErrorEstimator, GridRefinement::refine_and_coarsen_fixed_number

step-7

Helmholtz equation. Non-homogeneous Neumann boundary conditions and boundary integrals. Verification of correctness of computed solutions. Computing the error between exact and numerical solution and output of the data in tables. Using counted pointers.
Keywords: FEFaceValues, VectorTools::integrate_difference, VectorTools::compute_global_error, TableHandler

step-8

The elasticity equations will be solved instead of Laplace's equation. The solution is vector-valued and the equations form a system with as many equations as the dimension of the space in which it is posed.
Keywords: FESystem

step-9

Linear advection equation, assembling the system of equations in parallel using multi-threading, implementing a refinement criterion based on a finite difference approximation of the gradient.
Keywords: TensorFunction, WorkStream::run, SolverGMRES

step-10

Higher order mappings. Do not solve equations, but rather compute the value of pi to high accuracy.

step-11

Solving a Laplace problem with higher order mappings. Using mean value constraints and intermediate representations of sparsity patterns.

step-12

Discontinuous Galerkin methods for linear advection problems.

step-13

Software design questions and how to write a modular, extensible finite element program.

step-14

Duality based error estimators, more strategies to write a modular, extensible finite element program.

step-15

A nonlinear elliptic problem: The minimal surface equation. Newton's method. Transferring a solution across mesh refinement.

step-16

Multigrid preconditioning of the Laplace equation on adaptive meshes.

step-16b

A variant of step-16 but with MeshWorker for assembly: Multigrid preconditioning of the Laplace equation on adaptive meshes.

step-17

Using PETSc for linear algebra; running in parallel on clusters of computers linked together by MPI.

step-18

A time dependent problem; using a much simplified version of implementing elasticity; moving meshes; handling large scale output of parallel programs.

step-19

Input parameter file handling. Merging output of a parallel program.

step-20

Mixed finite elements. Using block matrices and block vectors to define more complicated solvers and preconditioners working on the Schur complement.

step-21

The time dependent two-phase flow in porous media. Extensions of mixed Laplace discretizations. More complicated block solvers. Simple time stepping.

step-22

Solving the Stokes equations of slow fluid flow on adaptive meshes. More on Schur complement solvers. Advanced use of the AffineConstraints class.

step-23

Finally a "real" time dependent problem, the wave equation.

step-24

A variant of step-23 with absorbing boundary conditions, and extracting practically useful data.

step-25

The sine-Gordon soliton equation, which is a nonlinear variant of the time dependent wave equation covered in step-23 and step-24.

step-26

The heat equation, solved on a mesh that is adapted every few time steps.

step-27

The hp finite element method.

step-28

Multiple grids for solving a multigroup diffusion equation in nuclear physics simulating a nuclear reactor core.

step-29

Solving a complex-valued Helmholtz equation. Sparse direct solvers. Dealing with parameter files.

step-30

Anisotropic refinement for DG finite element methods.

step-31

Time-dependent Stokes flow driven by temperature differences in a fluid. Adaptive meshes that change between time steps.

step-32

A massively parallel solver for time-dependent Stokes flow driven by temperature differences in a fluid. Adapting methods for real-world equations.

step-33

A nonlinear hyperbolic conservation law: The Euler equations of compressible gas dynamics.

step-34

Boundary element methods (BEM) of low order: Exterior irrotational flow. The ParsedFunction class.

step-35

A projection solver for the Navier–Stokes equations.

step-36

Using SLEPc for linear algebra; solving an eigenspectrum problem. The Schrödinger wave equation.

step-37

Solving a Poisson problem with a multilevel preconditioner without explicitly storing the matrix (a matrix-free method) in a massively parallel context.

step-38

Solving the Laplace-Beltrami equation on curved manifolds embedded in higher dimensional spaces.

step-39

Solving Poisson's equation once more, this time with the interior penalty method, one of the discontinuous Galerkin methods developed for this problem. Error estimator, adaptive meshes, and multigrid preconditioner, all using the MeshWorker framework.

step-40

Techniques for the massively parallel solution of the Laplace equation (up to 10,000s of processors).

step-41

Solving the obstacle problem, a variational inequality.

step-42

A solver for an elasto-plastic contact problem, running on parallel machines.

step-43

Advanced techniques for the simulation of porous media flow.

step-44

Finite strain hyperelasticity based on a three-field formulation.
Keywords: CellDataStorage, FEValuesExtractors, WorkStream::run, BlockSparseMatrix, BlockVector, ComponentSelectFunction, Physics::Elasticity, FullMatrix::extract_submatrix_from, FullMatrix::scatter_matrix_to, LinearOperator, SolverSelector, PreconditionSelector, ReductionControl, MappingQEulerian

step-45

Periodic boundary conditions.
Keywords: GridTools::collect_periodic_faces, GridTools::PeriodicFacePair, Triangulation::add_periodicity

step-46

Coupling different kinds of equations in different parts of the domain.

step-48

Explicit time stepping for the Sine–Gordon equation based on a diagonal mass matrix. Efficient implementation of (nonlinear) finite element operators.

step-49

Advanced mesh creation and manipulation techniques.

step-51

Solving the convection-diffusion equation with a hybridizable discontinuous Galerkin method using face elements.

step-52

Solving the time dependent neutron diffusion equation using Runge-Kutta methods.

step-53

Describing the geometry of complex domains and curved boundaries.

step-54

Using CAD files to describe the boundary of your domain.
Keywords: Manifold, OpenCASCADE::read_IGES, OpenCASCADE::NormalProjectionBoundary

step-55

Solving the Stokes problem in parallel.

step-56

Geometric Multigrid for Stokes.

step-57

Incompressible, stationary Navier Stokes equations.

step-59

Solving a Poisson problem discretized with an interior penalty DG method and a multilevel preconditioner in a matrix-free fashion using a massively parallel implementation.

step-60

Distributed Lagrange multipliers for the solution of Poisson problems in complex domains with constraints defined on non-matching grids.

step-61

Solving the Poisson problem with the "weak Galerkin" finite element method.

step-62

Resonance frequency and bandgap of a phononic crystal. Elastic wave equation in the frequency domain with Perfectly Matched Layer boundary conditions. Parallelization via MUMPS and MPI.

step-63

Block smoothers for geometric multigrid. A scalar convection diffusion equation is solved with different additive or multiplicative multigrid smoothers.
Keywords: Multigrid, MeshWorker::mesh_loop, MGSmootherPrecondition, RelaxationBlock, DoFRenumbering::downstream


step-64

Solving a Helmholtz problem using matrix-free methods on the GPU with MPI parallelization.

Tutorial programs grouped by topics

Basic techniques

Creating a grid. A simple way to write it to a file

step-1

Degrees of freedom

step-2

Solve the Laplace equation

step-3

Dimension independent programming, non-zero data

step-4

Computing on uniformly refined meshes

step-5

Adaptivity

step-6, step-26

Evaluating errors

step-7

Nonlinear problems, Newton's method

step-15

Advanced techniques

Multithreading

step-9, step-28, step-32, step-44, step-48, step-51

Block solvers and preconditioners

step-20, step-21, step-22, step-31, step-32, step-43, step-44, step-55, step-56, step-57

Using Trilinos

step-31, step-32, step-33, step-41, step-42, step-43, step-55

Parallelization via PETSc and MPI

step-17, step-18, step-19, step-40, step-55

Parallelization via Trilinos and MPI

step-32, step-42, step-55

Parallelization via MUMPS and MPI

step-62

Parallelization via CUDA and MPI

step-64

Parallelization on very large numbers of processors

step-32, step-37, step-40, step-42, step-55, step-59

Input parameter handling

step-19, step-28, step-29, step-32, step-33, step-34, step-35, step-36, step-42, step-44, step-60, step-62

Higher order mappings

step-10, step-11, step-32, step-60

Error indicators and estimators

step-6, step-9, step-14, step-39

Transferring solutions across mesh refinement

step-15, step-28, step-31, step-32, step-33, step-42, step-43, step-57

Discontinuous Galerkin methods

step-12, step-21, step-39, step-46, step-51, step-59, step-61

hp finite elements

step-27, step-46

Anisotropic refinement for DG finite element methods

step-30

Computing Jacobians from residuals, automatic differentiation

step-33

Boundary element methods, curved manifolds

step-32, step-34, step-38, step-53, step-54

Periodic boundary conditions

step-45, step-59

Matrix-free methods with sum factorization

step-37, step-48, step-59

Advanced meshes and geometries

step-49, step-53, step-54

Non matching algorithms

step-60

HDF5 and Python

step-62

Linear solvers

Conjugate Gradient solver

step-3

Preconditioned CG solver

step-5

BiCGStab

step-9

Multilevel preconditioners

step-16, step-16b step-31, step-32, step-37, step-39, step-41, step-42, step-43, step-56, step-59, step-63

Parallel solvers

step-17, step-18, step-32, step-37, step-40, step-42, step-55, step-59

Block and Schur complement solvers

step-20, step-21, step-22, step-31, step-32, step-43, step-55, step-56, step-57, step-60

Decoupled projection solvers

step-35

Linear Newton systems from nonlinear equations

step-33, step-41, step-42, step-44, step-57

Eigenvalue solvers

step-36

Linear operators

step-44, step-60

Other equations

Helmholtz equation

step-7, step-29, step-62, step-64

Elasticity and elasto-plasticity equations

step-8, step-42, step-46, step-62

The heat equation

step-26

Minimal surface equation

step-15

Quasi-static elasticity equations

step-18, step-44

Transport (advection) equations

step-9, step-21, step-31, step-32, step-43, step-51

The nonlinear hyperbolic Euler system of compressible gas dynamics

step-33

Mixed Laplace, Darcy, Porous media

step-20, step-21, step-43

Stokes and incompressible Navier-Stokes flow

step-22, step-31, step-32, step-35, step-46, step-55, step-56, step-57

The wave equation, in linear and nonlinear variants

step-23, step-24, step-25, step-48

A multigroup diffusion problem in neutron transport

step-28

Irrotational flow

step-34

An eigenspectrum problem

step-36

The obstacle problem, a variational inequality

step-41, step-42

Coupling different equations in different parts of the domain

step-46

Vector problems

Elasticity and elasto-plasticity equations

step-8, step-42

Mixed Laplace

step-20

Mixed Laplace plus an advection equation

step-21, step-43

Incompressible Stokes and Navier-Stokes flow

step-22, step-31, step-32, step-35, step-55, step-56, step-57

A complex-valued Helmholtz problem

step-29

The Euler equations of compressible gas dynamics

step-33

Coupling different equations in different parts of the domain

step-46

Time dependent problems

The heat equation

step-26

Quasi-static elasticity

step-18, step-44

Porous media flow

step-21, step-43

The wave equation, in linear and nonlinear variants

step-23, step-24, step-25, step-48

Time dependent Stokes flow driven by buoyancy

step-31, step-32

The Euler equations of compressible gas dynamics

step-33

Time dependent neutron diffusion equation step-52