SyLVER is a sparse direct solver for computing the solution of large sparse symmetrically-structured linear systems of equations. This includes both positive-definite and indefinite sparse symmetric systems as well as unsymmetric system whose sparsity pattern is symmetric.

The solution of the system of equations:

\[AX = B\]

is achived by computing a factorization of the input matrix. the following cases are covered:

  1. \(A\) is symmetric positive-definite, we compute the sparse Cholesky factorization:
\[PAP^T = LL^T\]

where the factor \(L\) is a lower triangular matrix and the matrix \(P\) is a permutation matrix used to reduce the fill-in generated during the factorization. Following the matrix factorization the solution can be retrieved by successively solving the system \(LY=PB\) (forward substitution) and \(L^{T}PX=Y\) (backward substitutions).

2. \(A\) is symmetric indefinite, then we compute the sparse \(LDL^T\) decomposition:

\[A = PLD(PL)^T\]

where \(P\) is a permutation matrix, \(L\) is unit lower triangular, and \(D\) is block diagonal with blocks of size \(1 \times 1\) and \(2 \times 2\).

The code optionally supports hybrid computation using one or more NVIDIA GPUs.

SyLVER returns bit-compatible results.

An option exists to scale the matrix. In this case, the factorization of the scaled matrix \(\overline{A} = S A S\) is computed, where \(S\) is a diagonal scaling matrix.

Usage overview

Solving \(AX=B\) using SyLVER is a four stage process.

  • If \(A\) is symmetric:

    1. Call spldlt_analyse() to perform a symbolic factorization, stored in spldlt_akeep.
    2. Call spldlt_factor() to perform a numeric factorization, stored in spldlt_fkeep. More than one numeric factorization can refer to the same spldlt_akeep.
    3. Call spldlt__solve() to perform a solve with the factors. More than one solve can be performed with the same spldlt_fkeep.
    4. Once all desired solutions have been performed, free memory with spldlt_free().


The sylver_init() routine must be called before any other routines whitin SyLVER. When all the desired operations have been performed, the sylver_finalize() routine should be called.