# Introduction¶

## Purpose¶

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().

Note

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.