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