Reference documentation for deal.II version 9.3.0
Multilevel support
Collaboration diagram for Multilevel support:


This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.

mg

## Classes

class  MGLevelObject< Object >

class  MGMatrixBase< VectorType >

class  MGCoarseGridBase< VectorType >

class  MGTransferBase< VectorType >

class  MGSmootherBase< VectorType >

class  MGSmootherBlock< MatrixType, RelaxationType, number >

class  MGCoarseGridApplySmoother< VectorType >

class  MGCoarseGridIterativeSolver< VectorType, SolverType, MatrixType, PreconditionerType >

class  MGCoarseGridHouseholder< number, VectorType >

class  MGCoarseGridSVD< number, VectorType >

class  MGConstrainedDoFs

class  MGMatrixSelect< MatrixType, number >

class  MGSmoother< VectorType >

class  MGSmootherIdentity< VectorType >

class  MGSmootherRelaxation< MatrixType, RelaxationType, VectorType >

class  MGSmootherPrecondition< MatrixType, PreconditionerType, VectorType >

class  MGLevelGlobalTransfer< VectorType >

class  MGLevelGlobalTransfer< LinearAlgebra::distributed::Vector< Number > >

class  MGTransferPrebuilt< VectorType >

class  MGTransferBlockBase

class  MGTransferBlock< number >

class  MGTransferBlockSelect< number >

class  MGTransferComponentBase

class  MGTransferSelect< number >

class  MGTransferMatrixFree< dim, Number >

class  MGTransferBlockMatrixFree< dim, Number >

class  Multigrid< VectorType >

class  PreconditionMG< dim, VectorType, TRANSFER >

## Detailed Description

Classes that have to do with multigrid algorithms.

The main class with implementation of the multigrid scheme is Multigrid with its function Multigrid::cycle(). It uses the following abstract classes in order to perform the multigrid cycle:

1. MGMatrixBase contains the level matrices with a fairly general implementation in mg::Matrix
2. MGCoarseGridBase is the solver on the coarsest level.
3. MGSmootherBase performs smoothing on each level.
4. MGTransferBase organizes the transfer between levels.

Additionally, there is a class PreconditionMG, which is a wrapper around Multigrid with the standard interface of deal.II Preconditioners and Relaxation Operators. PreconditionMG also uses the classes inheriting from MGTransferBase, for instance MGTransferPrebuilt, where it uses MGTransferPrebuilt::copy_to_mg() and MGTransferPrebuilt::copy_from_mg_add(), which transfer between the global vector and the level vectors.

Finally, we have several auxiliary classes, namely MGLevelObject, which stores an object on each level*

See the step-16, step-16b, and step-39 example programs on how to use this functionality.

### Multigrid and hanging nodes

Using multigrid methods on adaptively refined meshes involves more infrastructure than with regular refinement. First, in order to keep the complexity optimal, we need to decide how to do the smoothing on each level. And to this end, we have to define what a level is in the sense of multilevel decomposition.

First, we define that a level in the multigrid sense is constituted by all cells of a certain level in the mesh hierarchy. Thus, smoothing on a certain level is restricted to the subdomain which consists of cells of this level or finer. This is usually referred to as local smoothing. The advantage of this definition is, that level matrices for the multigrid scheme can be assembled easily by traversing to all cells of a certain level, and that these level matrices do not contain hanging nodes.

The disadvantage of this decomposition is, that we need additional matrices to handle the issues that arise at refinement edges. Furthermore, the treatment is different, depending on whether the method is continuous (thus having degrees of freedom on the refinement edge) or discontinuous (employs flux matrices at the refinement edge). While these matrices are small, we have to assemble them and notify the multigrid method of them.