I assume that you have already read Sample code in C++ to run TAUCS. The goal in this section is to compare two codes to run different sparse solvers when the purpose of the code is actually quite similar. We would like to develop a command line tool that will read a matrix and a right-hand side
run_mumps matrix rhs
in the Matrix Market format and then writes the solution of the system of linear equations in file rhs.solution
also in the Matrix Market format.
The code is presented in run_mumps.cpp and is briefly explained below. It is assumed that you have already browsed the MUMPS documentation.
The first difference is that MUMPS does not have an equivalent of taucs_linsolve
and we will need more steps to run MUMPS (this will be similar to using of TAUCS low-level functions). Also MUMPS does not have a function for matrix-vector multiply and it is implemented before the main in the code.
1) The SparseMatrix mat
is initialized from the file matrix
(first argument in the command line). Here there is no difference with run_taucs.cpp, as the same class SparseMatrix
is employed.
2a) It takes more efforts to set up MUMPS. On the other hand, it is not necessary to create a MUMPS matrix, for matrix will be passed as several arrays and the user is responsible for their memory management. The matrix storage is different from TAUCS, it is just three arrays to represent val
, i
, j
.
2b) The SparseMatrix
is iterated through all nonzero elements and they are copied into the three arrays for MUMPS. Finally the memory to keep SparseMatrix
is freed up. In this case actually it might be simpler directly write val
, i
, j
from the Matrix Market file to the three arrays.
3) The matrix is factorized.
4) The right hand side is read in Matrix rhs
. Note that it can contain several vectors in the case when we need to solve the linear system several times with different right-hand sides. This is similar to step 3 in run_taucs.cpp with the difference that MUMPS overwrites rhs
with the solution and it is necessary to make a copy to compute the norm.
5) Back substitution when the factor from the step 3 is employed to find a solution to A x = rhs
. x
now is in rhs
.
6) The norm | Ax - rhs |
is computed and printed. After that the solution is saved into the file. This is similar to step 4c in run_taucs.cpp.
7) Clean up memory. This is similar to step 5 in TAUCS.
The compilation and testing is very similar to what is described in Sample code in C++ to run TAUCS and is left as an exercise. If you are in trouble, please just run
$ make -f run_mumps.make
and then look at what is in the makefile.
Previous
Introduction
Class Matrix
Class SparseMatrix
Sample code in C++ to run TAUCS
Next
Class LinearSolver
Class UMFPACK
Class TAUCS
Class MUMPS and PARDISO
Gluing all together: LinearSolver::create
Sample driver to run a sparse solver
RSS