pgesv
The pgesv solver supports the following input types.
- data type: DSZC
- index type:
std::int32_t,std::int64_t
pgesv solves a square system A * X = B using LU decomposition with partial pivoting.
The matrix A of size \(N\) is stored in a memory block of size \(N^2\).
Type Aliases
For convenience, the following type aliases are provided.
For example, par_dgesv<int> is equivalent to pgesv<double, int, 'R'>.
Constructor
The solver takes three template arguments.
- data type, e.g.,
double,float,std::complex<double>,std::complex<float>; - index type, e.g.,
std::int32_t,std::int64_t; - process grid order,
RorC.
The solver uses a 2D process grid.
The grid order can be either Row major or Column major.
With np_row and np_col denoting the numbers of rows and columns of the process grid, a solver is constructed as follows.
The library can also determine the grid dimensions automatically.
Indexer
A nested indexer helper converts 2D row-major indices into the 1D column-major offsets required by ScaLAPACK's Fortran-order storage.
Solving
Prepare matrices \(A\) and \(B\) on the root process in whatever form is convenient.
The two matrices must be wrapped into template<data_t DT, index_t IT> struct full_mat objects, which require
- the number of rows of the matrix,
n_rows; - the number of columns of the matrix,
n_cols; - a pointer to the data,
data.
Then call the solver.
The factorization is stored internally as long as the solver object stays alive. A second solve reuses the stored factorization.
Calling solve(full_mat<DT, IT>&& A, full_mat<DT, IT>&& B) again clears the previous factorization automatically.
On return, B is replaced by the solution.
In the example above, std::vector<double> B then contains the solution.
Determinant
pgesv also provides a det() method that computes the determinant from the stored LU factorization.
The factorization must be performed before det() is called.
The determinant is computed on the root process and returned to all processes.