PILUT: Parallel Incomplete Factorization


PILUT is not actively supported by the hypre development team. We recommend using ILU for parallel ILU algorithms. This new ILU implementation includes 64-bit integers support (for linear systems with more than 2,147,483,647 global unknowns) through both mixedint and bigint builds of hypre and NVIDIA/AMD GPUs support through the CUDA/HIP backends.

PILUT is a parallel preconditioner based on Saad’s dual-threshold incomplete factorization algorithm. The original version of PILUT was done by Karypis and Kumar [KaKu1998] in terms of the Cray SHMEM library. The code was subsequently modified by the hypre team: SHMEM was replaced by MPI; some algorithmic changes were made; and it was software engineered to be interoperable with several matrix implementations, including hypre’s ParCSR format, PETSc’s matrices, and ISIS++ RowMatrix. The algorithm produces an approximate factorization \(L U\), with the preconditioner \(M\) defined by \(M = L U\).


PILUT produces a nonsymmetric preconditioner even when the original matrix is symmetric. Thus, it is generally inappropriate for preconditioning symmetric methods such as Conjugate Gradient.


  • SetMaxNonzerosPerRow( int LFIL ); (Default: 20) Set the maximum number of nonzeros to be retained in each row of \(L\) and \(U\). This parameter can be used to control the amount of memory that \(L\) and \(U\) occupy. Generally, the larger the value of LFIL, the longer it takes to calculate the preconditioner and to apply the preconditioner and the larger the storage requirements, but this trades off versus a higher quality preconditioner that reduces the number of iterations.

  • SetDropTolerance( double tol ); (Default: 0.0001) Set the tolerance (relative to the 2-norm of the row) below which entries in L and U are automatically dropped. PILUT first drops entries based on the drop tolerance, and then retains the largest LFIL elements in each row that remain. Smaller values of tol lead to more accurate preconditioners, but can also lead to increases in the time to calculate the preconditioner.