# Algebraic Multigrid (AMG)

Build Status |
---|

This package lets you solve sparse linear systems using Algebraic Multigrid (AMG). This works especially well for symmetric positive definite matrices.

## Usage

### Using the CommonSolve interface

This is highest level API. It internally creates the multilevel object
and calls the multigrid cycling `_solve`

.

A = poisson(100);
b = rand(100);
solve(A, b, RugeStubenAMG(), maxiter = 1, abstol = 1e-6)

### Multigrid cycling

using AlgebraicMultigrid
A = poisson(1000) # Creates a sample symmetric positive definite sparse matrix
ml = ruge_stuben(A) # Construct a Ruge-Stuben solver
# Multilevel Solver
# -----------------
# Operator Complexity: 1.9859906604402935
# Grid Complexity: 1.99
# No. of Levels: 8
# Coarse Solver: AMG.Pinv()
# Level Unknowns NonZeros
# ----- -------- --------
# 1 1000 2998 [50.35%]
# 2 500 1498 [25.16%]
# 3 250 748 [12.56%]
# 4 125 373 [ 6.26%]
# 5 62 184 [ 3.09%]
# 6 31 91 [ 1.53%]
# 7 15 43 [ 0.72%]
# 8 7 19 [ 0.32%]
AlgebraicMultigrid._solve(ml, A * ones(1000)) # should return ones(1000)

### As a Preconditioner

You can use AMG as a preconditioner for Krylov methods such as Conjugate Gradients.

import IterativeSolvers: cg
p = aspreconditioner(ml)
c = cg(A, A*ones(1000), Pl = p)

## Features and Roadmap

This package currently supports:

AMG Styles:

- Ruge-Stuben Solver
- Smoothed Aggregation (SA)

Strength of Connection:

- Classical Strength of Connection
- Symmetric Strength of Connection

Smoothers:

- Gauss Seidel (Symmetric, Forward, Backward)
- Damped Jacobi

Cycling:

- V, W and F cycles

In the future, this package will support:

- Other splitting methods (like CLJP)
- SOR smoother
- AMLI cycles

#### Acknowledgements

This package has been heavily inspired by the `PyAMG`

project.