Public Types | |
enum | Cycle { v_cycle, w_cycle, f_cycle } |
typedef VECTOR | vector_type |
typedef const VECTOR | const_vector_type |
Public Member Functions | |
template<int dim> | |
Multigrid (const MGDoFHandler< dim > &mg_dof_handler, const MGMatrixBase< VECTOR > &matrix, const MGCoarseGridBase< VECTOR > &coarse, const MGTransferBase< VECTOR > &transfer, const MGSmootherBase< VECTOR > &pre_smooth, const MGSmootherBase< VECTOR > &post_smooth, Cycle cycle=v_cycle) | |
Multigrid (const unsigned int minlevel, const unsigned int maxlevel, const MGMatrixBase< VECTOR > &matrix, const MGCoarseGridBase< VECTOR > &coarse, const MGTransferBase< VECTOR > &transfer, const MGSmootherBase< VECTOR > &pre_smooth, const MGSmootherBase< VECTOR > &post_smooth, Cycle cycle=v_cycle) | |
void | reinit (const unsigned int minlevel, const unsigned int maxlevel) |
void | cycle () |
void | vcycle () |
void | vmult (VECTOR &dst, const VECTOR &src) const |
void | vmult_add (VECTOR &dst, const VECTOR &src) const |
void | Tvmult (VECTOR &dst, const VECTOR &src) const |
void | Tvmult_add (VECTOR &dst, const VECTOR &src) const |
void | set_edge_matrices (const MGMatrixBase< VECTOR > &edge_down, const MGMatrixBase< VECTOR > &edge_up) |
unsigned int | get_maxlevel () const |
unsigned int | get_minlevel () const |
void | set_maxlevel (const unsigned int) |
void | set_minlevel (const unsigned int level, bool relative=false) |
void | set_cycle (Cycle) |
void | set_debug (const unsigned int) |
Public Attributes | |
MGLevelObject< VECTOR > | defect |
MGLevelObject< VECTOR > | solution |
Private Member Functions | |
void | level_v_step (const unsigned int level) |
void | level_step (const unsigned int level, Cycle cycle) |
Private Attributes | |
Cycle | cycle_type |
unsigned int | minlevel |
unsigned int | maxlevel |
MGLevelObject< VECTOR > | t |
MGLevelObject< VECTOR > | defect2 |
SmartPointer< const MGMatrixBase< VECTOR > > | matrix |
SmartPointer< const MGCoarseGridBase< VECTOR > > | coarse |
SmartPointer< const MGTransferBase< VECTOR > > | transfer |
SmartPointer< const MGSmootherBase< VECTOR > > | pre_smooth |
SmartPointer< const MGSmootherBase< VECTOR > > | post_smooth |
SmartPointer< const MGMatrixBase< VECTOR > > | edge_down |
SmartPointer< const MGMatrixBase< VECTOR > > | edge_up |
unsigned int | debug |
Friends | |
class | PreconditionMG |
Implementation of the multigrid method.
The function which starts a multigrid cycle on the finest level is cycle(). Depending on the cycle type chosen with the constructor (see enum Cycle), this function triggers one of the cycles level_v_step() or level_step(), where the latter one can do different types of cycles.
Using this class, it is expected that the right hand side has been converted from a vector living on the locally finest level to a multilevel vector. This is a nontrivial operation, usually initiated automatically by the class PreconditionMG and performed by the classes derived from MGTransferBase.
typedef VECTOR Multigrid< VECTOR >::vector_type |
typedef const VECTOR Multigrid< VECTOR >::const_vector_type |
enum Multigrid::Cycle |
Multigrid< VECTOR >::Multigrid | ( | const MGDoFHandler< dim > & | mg_dof_handler, | |
const MGMatrixBase< VECTOR > & | matrix, | |||
const MGCoarseGridBase< VECTOR > & | coarse, | |||
const MGTransferBase< VECTOR > & | transfer, | |||
const MGSmootherBase< VECTOR > & | pre_smooth, | |||
const MGSmootherBase< VECTOR > & | post_smooth, | |||
Cycle | cycle = v_cycle | |||
) | [inline] |
Constructor. The MGDoFHandler is used to determine the highest possible level. transfer
is an object performing prolongation and restriction.
This function already initializes the vectors which will be used later in the course of the computations. You should therefore create objects of this type as late as possible.
Multigrid< VECTOR >::Multigrid | ( | const unsigned int | minlevel, | |
const unsigned int | maxlevel, | |||
const MGMatrixBase< VECTOR > & | matrix, | |||
const MGCoarseGridBase< VECTOR > & | coarse, | |||
const MGTransferBase< VECTOR > & | transfer, | |||
const MGSmootherBase< VECTOR > & | pre_smooth, | |||
const MGSmootherBase< VECTOR > & | post_smooth, | |||
Cycle | cycle = v_cycle | |||
) |
Experimental constructor for cases in which no MGDoFHandler is available.
void Multigrid< VECTOR >::cycle | ( | ) |
Execute one multigrid cycle. The type of cycle is selected by the constructor argument cycle. See the enum Cycle for available types.
void Multigrid< VECTOR >::vcycle | ( | ) |
Execute one step of the V-cycle algorithm. This function assumes, that the multilevel vector defect is filled with the residual of an outer defect correction scheme. This is usually taken care of by PreconditionMG). After vcycle(), the result is in the multilevel vector solution. See copy_*_mg
in class MGTools if you want to use these vectors yourself.
The actual work for this function is done in level_v_step().
void Multigrid< VECTOR >::vmult | ( | VECTOR & | dst, | |
const VECTOR & | src | |||
) | const |
Perform a multigrid cycle with a vector which is already a level vector. Use of this function assumes that there is NO local refinement and that both vectors are on the finest level of this Multigrid object.
void Multigrid< VECTOR >::vmult_add | ( | VECTOR & | dst, | |
const VECTOR & | src | |||
) | const |
Perform a multigrid cycle with a vector which is already a level vector. Use of this function assumes that there is NO local refinement and that both vectors are on the finest level of this Multigrid object.
void Multigrid< VECTOR >::Tvmult | ( | VECTOR & | dst, | |
const VECTOR & | src | |||
) | const |
void Multigrid< VECTOR >::Tvmult_add | ( | VECTOR & | dst, | |
const VECTOR & | src | |||
) | const |
void Multigrid< VECTOR >::set_edge_matrices | ( | const MGMatrixBase< VECTOR > & | edge_down, | |
const MGMatrixBase< VECTOR > & | edge_up | |||
) |
Set additional matrices to correct residual computation at refinement edges. These matrices originate from discontinuous Galerkin methods (see FE_DGQ etc.), where they correspond tu the edge fluxes at the refinement edge between two levels.
Return the finest level for multigrid.
Return the coarsest level for multigrid.
Set the highest level for which the multilevel method is performed. By default, this is the finest level of the Triangulation; therefore, this function will only accept arguments smaller than the current maxlevel and not smaller than the current minlevel.
void Multigrid< VECTOR >::set_minlevel | ( | const unsigned int | level, | |
bool | relative = false | |||
) |
Chance cycle_type used in cycle().
Set the debug level. Higher values will create more debugging output during the multigrid cycles.
void Multigrid< VECTOR >::level_v_step | ( | const unsigned int | level | ) | [private] |
The V-cycle multigrid method. level
is the level the function starts on. It will usually be called for the highest level from outside, but will then call itself recursively for level-1
, unless we are on minlevel where the coarse grid solver solves the problem exactly.
void Multigrid< VECTOR >::level_step | ( | const unsigned int | level, | |
Cycle | cycle | |||
) | [private] |
The actual W-cycle or F-cycle multigrid method. level
is the level the function starts on. It will usually be called for the highest level from outside, but will then call itself recursively for level-1
, unless we are on minlevel where the coarse grid solver solves the problem exactly.
friend class PreconditionMG [friend] |
Cycle Multigrid< VECTOR >::cycle_type [private] |
Cycle type performed by the method cycle().
Level for coarse grid solution.
MGLevelObject<VECTOR> Multigrid< VECTOR >::defect |
Input vector for the cycle. Contains the defect of the outer method projected to the multilevel vectors.
MGLevelObject<VECTOR> Multigrid< VECTOR >::solution |
The solution update after the multigrid step.
MGLevelObject<VECTOR> Multigrid< VECTOR >::t [private] |
Auxiliary vector.
MGLevelObject<VECTOR> Multigrid< VECTOR >::defect2 [private] |
Auxiliary vector for W- and F-cycles. Left uninitialized in V-cycle.
SmartPointer<const MGMatrixBase<VECTOR> > Multigrid< VECTOR >::matrix [private] |
The matrix for each level.
SmartPointer<const MGCoarseGridBase<VECTOR> > Multigrid< VECTOR >::coarse [private] |
The matrix for each level.
SmartPointer<const MGTransferBase<VECTOR> > Multigrid< VECTOR >::transfer [private] |
Object for grid tranfer.
SmartPointer<const MGSmootherBase<VECTOR> > Multigrid< VECTOR >::pre_smooth [private] |
The pre-smoothing object.
SmartPointer<const MGSmootherBase<VECTOR> > Multigrid< VECTOR >::post_smooth [private] |
The post-smoothing object.
SmartPointer<const MGMatrixBase<VECTOR> > Multigrid< VECTOR >::edge_down [private] |
Edge matrix from fine to coarse.
SmartPointer<const MGMatrixBase<VECTOR> > Multigrid< VECTOR >::edge_up [private] |
Transpose edge matrix from coarse to fine.
Level for debug output. Defaults to zero and can be set by set_debug().