OGS
EigenLisLinearSolver.cpp
Go to the documentation of this file.
1 
11 #include "EigenLisLinearSolver.h"
12 
13 #ifdef _OPENMP
14 #include <omp.h>
15 #endif
16 
17 #include "BaseLib/ConfigTree.h"
23 
24 namespace MathLib
25 {
27  const std::string /*solver_name*/, BaseLib::ConfigTree const* const option)
28  : lis_option_(option)
29 {
30 }
31 
33  EigenVector& x_)
34 {
35  static_assert(EigenMatrix::RawMatrixType::IsRowMajor,
36  "Sparse matrix is required to be in row major storage.");
37  auto& A = A_.getRawMatrix();
38  auto& b = b_.getRawVector();
39  auto& x = x_.getRawVector();
40 
41  if (!A.isCompressed())
42  A.makeCompressed();
43  int nnz = A.nonZeros();
44  int* ptr = A.outerIndexPtr();
45  int* col = A.innerIndexPtr();
46  double* data = A.valuePtr();
47  LisMatrix lisA(A_.getNumberOfRows(), nnz, ptr, col, data);
48  LisVector lisb(b.rows(), b.data());
49  LisVector lisx(x.rows(), x.data());
50 
51  LisLinearSolver lissol; // TODO not always create Lis solver here
52  lissol.setOption(lis_option_);
53  bool const status = lissol.solve(lisA, lisb, lisx);
54 
55  for (std::size_t i = 0; i < lisx.size(); i++)
56  x[i] = lisx[i];
57 
58  return status;
59 }
60 
61 } // namespace MathLib
Definition of the LisLinearSolver class.
Definition of the LisMatrix class.
Definition of the LisVector class.
bool solve(EigenMatrix &A, EigenVector &b, EigenVector &x)
EigenLisLinearSolver(const std::string solver_name, BaseLib::ConfigTree const *const option)
IndexType getNumberOfRows() const
return the number of rows
Definition: EigenMatrix.h:53
RawMatrixType & getRawMatrix()
Definition: EigenMatrix.h:162
Global vector based on Eigen vector.
Definition: EigenVector.h:26
RawVectorType & getRawVector()
return a raw Eigen vector object
Definition: EigenVector.h:110
Linear solver using Lis (http://www.ssisc.org/lis/)
void setOption(const LisOption &option)
bool solve(LisMatrix &A, LisVector &b, LisVector &x)
LisMatrix is a wrapper class for matrix types of the linear iterative solvers library.
Definition: LisMatrix.h:45
Lis vector wrapper class.
Definition: LisVector.h:29
std::size_t size() const
return a vector length
Definition: LisVector.cpp:46