Class MUMPS and PARDISO

Solvers MUMPS and PARDISO are different from TAUCS and UMFPACK in respect that they posses more functionality within the same interface. For example they can work with positive definite, indefinite or unsymmetric matrices and the switch is done through a single variable. They also support out-of-core and this setting  is controlled by another variable.

The LinearSolver interface for historical reasons allows us to pass one string only and this string has been reserved in the TAUCS implementation as a reordering scheme. It could be possible to develop more solvers (as in the case of TAUCS) but such a solution does not fit well solver interfaces. It could be possible to pass an array of strings or to change the meaning of the information in the string but this would require the change in the TAUCS implementation. As a quick fix, the solution was to employ two global variables MUMPSpositive and MUMPSoutofcore to take a decision.

The logic is as follows. If the matrix is unsymmetric then the solvers are switched to the LU factorization, here there is no ambiguity. If the matrix however symmetric, then the variable MUMPSpositive is is checked. If it is true, then the solvers are switched to LTL factorization, if false then to LTDL factorization. The former is faster and set by default but it is applicable to posititive definite matrices only. The second choice is a bit slower but it is working for all symmetric matrices including indefinite. The similar situation is with  MUMPSoutofcore. If it is equal to zero (default), then the in-core solver is employed, if to one, then out-of-core.

Otherwise the implementation is similar to that for UMFPACK. There is one class MUMPS in solver_mumps.cpp and one class PARDISO in solver_pardiso.cpp. The implementation is straightforward according to the documentation.

Previous

Introduction
Class Matrix
Class SparseMatrix
Sample code in C++ to run TAUCS
Sample code in C++ to run MUMPS
Class LinearSolver
  Class UMFPACK
  Class TAUCS

Next

  Gluing all together: LinearSolver::create
Sample driver to run a sparse solver


Comments are closed.