# Presentation: 016068

## IFPACK:Robust AlgebraicPreconditioning Package

- IFPACK:Robust AlgebraicPreconditioning Package

- Trilinos Users Group Meeting
- November ’04

- Marzio Sala, Mike Heroux

## Overview

- IFPACK algebriac preconditioners for sparse distributed matrices
- Epetra_RowMatrix derived classes
- Preconditioner is defined using matrix structure and values only
- Can be applied in parallel
- Use local matrix rows, plus (if required) some neighboring rows
- IFPACK contains (among others) Aztec-like preconditioners
- New relaxation methods
- Different ILU factorizations
- Improved handling of overlapping regions

## Matrix-vector product: Data layout

| ri |
| --- |

| zi |
| --- |

| = |
| --- |

| ri, zi local vectors
Local rows
Neighboring (overlapping) rows

 Need a preconditioner (action of the inverse of A) |
| --- |

| Processor i -> |
| --- |

- Ai

## IFPACK preconditioners

- IFPACK implements **one-level additive Schwarz** **preconditioners** (overlapping domain decomposition)
- “Subdomain” i is identified by the rows assigned to a processor i
- Minimal overlap:
- Variable overlap:

## Preconditioning: Data layout

| ri |
| --- |

| zi |
| --- |

| = |
| --- |

| ri, zi local vectors
Local rows
Neighboring (overlapping) rows
Square local matrix |
| --- |

| Processor i -> |
| --- |

- Ai

- Preconditioner has two components:
-  handling of overlap (matrix, vecs)
-  solution with local matrix

## IFPACK preconditioners (2)

- Class Ifpack_AdditiveSchwarz<T> defines the IFPACK preconditioner
- Overlap is handled by class Ifpack_AdditiveSchwarz
- If overlap > 0, overlapping matrix allocated rows for overlapping region only
- This class is templated with the local solver T:
- Defines Ai-1
- Must be an Ifpack_Preconditioner derived class

## Available Local Solvers

- Simple point relaxation methods:
- Jacobi, Gauss-Seidel, SOR, SSOR
- Block relaxation methods:
- Blocks defined by METIS or a simple greedy algorithm
- Blocks of any size, inverse of each block applied using LAPACK of any IFPACK preconditioner
- Jacobi, Gauss-Seidel, symmetric Gauss-Seidel
- Incomplete factorizations:
- Dropping based on graph
- Dropping based on value
- Any Amesos LU factorization
- Replace Y12M

- Effectiveness
- Memory
-  requirements

|  |
| --- |

|  |
| --- |

## How to use an IFPACK preconditioner

- Create
- Epetra_RowMatrix A
- Ifpack_Preconditioner P(A,OverlapLevel)
- Set parameters of P using **SetParameters**(List)
- Compute elements of P using sparsity of A by calling **Initialize**()
- Compute the elements of P using values of A by calling **Compute**()
- If estimated condition number if ok, proceed
- Apply the preconditioner using **ApplyInverse**()

## Example of Code

- #include “Teuchos_ParameterList.hpp”
- #include “Ifpack_AdditiveSchwarz.h”
- #include “Ifpack_vIct.h”
- ...
- Teuchos::ParameterList List;
- int Overlap = 2;
**Ifpack_AdditiveSchwarz**<**Ifpack_vIct**> Prec(A,Overlap);
- List.set("fact: level-of-fill", 5);
- IFPACK_CHK_ERR(Prec.**SetParameters**(List));
- IFPACK_CHK_ERR(Prec.**Initialize**());
- IFPACK_CHK_ERR(Prec.**Compute**());
- AztecOOSolver.SetPrecOperator(&Prec);

- Or any IFPACK
- preconditioner

## Estimating The Condition Number

- The quality of a preconditioner is assessed by the corresponding condition number
- cond(A) = || A || * || A-1 ||
- Method Condest() returns a cheap estimate of the condition number
- If Condest() returns a “big” number, it may be preferable to re-build a new preconditioner with different parameters (for example, a different threshold)
- Condest(Ifpack_CG) and Condest(Ifpack_GMRES) use AztecOO’s Krylov solvers to accurately estimate the condition number

## Estimating The Condition Number (2)

**Ifpack_AdditiveSchwarz**<**Ifpack_BlockJacobi**
**<Ifpack_DenseContainer> **> Prec(A,Overlap);
- List.set(”partitioner: local parts", 64);
- IFPACK_CHK_ERR(Prec.**SetParameters**(List));
- IFPACK_CHK_ERR(Prec.**Initialize**());
- IFPACK_CHK_ERR(Prec.**Compute**());
- // cheap estimate of the condition number
- double Condest = Prec.**Condest**();
- // if necessary,change parameters and call Compute()
- // alternatively, one can use:
- double Condest2 = Prec.Condest(Ifpack_CG);
- double Condest3 = Prec.Condest(Ifpack_GMRES);

## Factory class

- #include “Ifpack_Preconditioner.h”
- #include “Ifpack.h”
- Ifpack Factory;
- Ifpack_Preconditioner* Prec =
-   **Factory.Create**(“Amesos”, A, OverlapLevel);
- assert(Prec != 0);
- List.set(”amesos: local solver", “KLU”);
- IFPACK_CHK_ERR(Prec->SetParameters(List));
- IFPACK_CHK_ERR(Prec->Initialize());
- IFPACK_CHK_ERR(Prec->Compute());
- // use Prec, e.g. w/ AztecOO
- delete Prec;

| “point relaxation”
“block relaxation”
“vIct”, “gIct”
“gRiluk”, “vRiluk” 
... |
| --- |

## Concluding Remarks

- IFPACK preconditioners accept any Epetra_RowMatrix object
- If overlap > 0, we do not replicate the local rows in the overlapping matrix
- Additional memory is required for rows corresponding to overlapping rows only
- Reordering of local matrix:
- Reverse Chuthill-McKee
- METIS reordering
- Local matrix can be “filtered” before performing the factorization
- Dropping “small” elements
- Limit the number of elements per row
- Add value to diagonals
- User’s guide in preparation, Doxygen documentation
- End of development: **January 2005** (??)