📁 SuperLU
here,
- and are row and col permutation matrices
- and are row and col scaling diagonal matrices
- is unit lower triangular matrix
- is an upper triangular matrix
To solve
A is given by
is given by
Therefore,
Please read from right to left.
Note that and operates on column vectors only.
Simple Driver algorithm
Choose to order the columns of to increase the sparsity of the computed and factors, and hopefully to increase parallelism
Compute factorization of . Most of the pkgs, including SuperLU, can perform dynamic pivoting with row interchanges for numerical stability, computing , and at the same time.
Solve the system using s and and as described above (with s equal to identity)
Expert Driver Algorithm for sequential and multithreaded
Equilibrate the matrix , that is, compute diagonal matrices and so that is better conditioned than , that is, is less sensitive to perturbations in that is to perturbations in .
Order the columns of to increase the sparsity of computed and factors. In other words replace by .
Compute the factorization of
Column ordering
- Natural ordering
- Multiple Minimum Degree applied to the structure of
- MMD applied to the structure of
- Column Approximation Minimum Degree (COLAMD)
- User supplied ordering, e.g., from Metis
Sequential SuperLU
- SuperLU can preorder the columns
- Threshold row pivoting
- equilibrate the system
- estimate the condition number
- relative backward error bounds
- ILU factorization
- Real and complex with single and double precision
Useful routines
- dgssv() solves the system of linear equations , using the LU factorization from
DGSTRF
. - dgssvx() solves the system of linear equations or
- dgstrf()
- dgstrs()
- dgscon()
- dgsequ()
- dlaqgs()
- dgsrfs()
- dgsisx()
- dgsitrf()
Data structure
typedef struct {
Stype_t Stype; /* Storage type: interprets the storage structure
pointed to by *Store. */
Dtype_t Dtype; /* Data type. */
Mtype_t Mtype; /* Matrix type: describes the mathematical property of
the matrix. */
int_t nrow; /* number of rows */
int_t ncol; /* number of columns */
void *Store; /* pointer to the actual storage of the matrix */
} SuperMatrix;
typedef struct {
int_t nnz; /* number of nonzeros in the matrix */
void *nzval; /* pointer to array of nonzero values, packed by column */
int_t *rowind; /* pointer to array of row indices of the nonzeros */
int_t *colptr; /* pointer to array of beginning of columns in nzval[]
and rowind[] */
/* Note:
Zero-based indexing is used;
colptr[] has ncol+1 entries, the last one pointing
beyond the last column, so that colptr[ncol] = nnz. */
} NCformat;
typedef struct {
int_t nnz; /* number of nonzeros in the matrix */
void *nzval; /* pointer to array of nonzero values, packed by raw */
int_t *colind; /* pointer to array of columns indices of the nonzeros */
int_t *rowptr; /* pointer to array of beginning of rows in nzval[]
and colind[] */
/* Note:
Zero-based indexing is used;
rowptr[] has nrow+1 entries, the last one pointing
beyond the last row, so that rowptr[nrow] = nnz. */
} NRformat;
How to call SuperLU
Installation
Installation by using cmake:
Configuration:
export build_dir=$HOME/temp/easifem-extpkgs/superlu/build/
export install_dir=$HOME/.easifem/extpkgs/
cmake -S . -B $build_dir \
-D CMAKE_INSTALL_PREFIX=$install_dir \
-D BUILD_SHARED_LIBS:BOOL=ON \
-D CMAKE_BUILD_TYPE=Release
Build step:
cmake -B $build_dir
Install step
cmake --build $build_dir --target install
SuperLU will be installed at $install_dir/lib
and $install_dir/include