#include <Multigrid.h>
Inheritance diagram for AddMultigrid::

Public Methods | |
| AddMultigrid (const MLSolver_prm &pm) | |
| ~AddMultigrid () | |
| virtual String | description () const |
| virtual int | getWork (const PrecondWork work_tp) const |
| virtual bool | solve (StartVectorMode start) |
NAME: AddMultigrid - abstract additive multigrid algorithm
DESCRIPTION:
Implements the additive version of a multigrid cycle. One version of it sometimes is called the "BPX" preconditioner. The different sub-domains here are the different grids. The grids themselves can be Lattice Grids, structured or unstructured grids, or adaptively refined grids. The algorithm usually is used as a preconditioner. With a proper scaling it could be used as a iterative solver, but there is no scaling available now
The coarse grid is number 1, the fine grid is number "getNoOfSpaces". The grids all cover the same geometric domain, but differ in the resolution or grid size. For standard applications the grids are nested and the grid sizes double form fine to coarse. However, in general the grids need not be nested.
The "Proj" operators will usually be used to implement the grid transfers for "transfer" of "MLSolverUDC". Only the transfers from i to i+1 (prolongation) and the adjoint transfers from i+1 to i (restriction) are used. Both operations should really be adjoint if using it as a symmetric preconditioner. The transfers can be implemented very efficiently for nested grids which grid sizes double. For non nested grids this transfers are more expensive.
The approximate solvers for the different grids usually are called smoothers. The solver for the coarsest grid number 1 can be exact, e.g. a direct solver, but does not have to be exact. It is not useful to use additional exact solvers for linear problems. Hence the other solvers are iterative solvers. Usually it is sufficient to use a small fixed number of iterations. Note that the optimal relaxation for over-relaxation iterations differs from the optimal value used for single-grid (standard) applications. There is only one kind of smoother for every grid. In the case of adaptively refined grids, the iteration can be restricted to the refined parts of the grid. The original version of the "BPX" algorithm uses a direct coarse solver and one Jacobi iteration for each of the finer grids. This is at least equivalent version for the constant coefficient case.
There is no "gamma" parameter. The algorithm is always a V-cycle.
In the case you want to have a symmetric multigrid, take care that the transfers i to i+1 and i+1 to i are adjoint and that the smoothing is symmetric, too. Standard choices are "Jacobi" and "SSOR". This is useful for self-adjoint differential operators and symmetric solvers like "ConjGrad".
For further reading see e.g. Bramble, Pasciak, Xu "Parallel Multilevel Preconditioners", Math. Comp. 55, 1990, 1-22.
|
|
See class "MLSolver". |
|
|
|
|
|
Reimplemented from Multigrid. |
|
|
estimate work. Estimates are compatible with estimates for linear solvers. Reimplemented from Multigrid. |
|
|
solves the system. The function implements the algorithm and will probably never be called by the user directly. Data vectors have to be attached during initialization. The actual algorithm determines exactly, which vectors are needed and checks, whether they have been attached. The start vector is given by a value "StartVectorMode". Reimplemented from Multigrid. |