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:
is achived by computing a factorization of the input matrix. the following cases are covered:
- \(A\) is symmetric positive-definite, we compute the sparse Cholesky factorization:
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:
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:
- Call
spldlt_analyse()
to perform a symbolic factorization, stored in spldlt_akeep. - Call
spldlt_factor()
to perform a numeric factorization, stored in spldlt_fkeep. More than one numeric factorization can refer to the same spldlt_akeep. - Call
spldlt__solve()
to perform a solve with the factors. More than one solve can be performed with the same spldlt_fkeep. - Once all desired solutions have been performed, free memory with
spldlt_free()
.
- Call
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.