20 #ifndef LIBMESH_EIGEN_SPARSE_LINEAR_SOLVER_H
21 #define LIBMESH_EIGEN_SPARSE_LINEAR_SOLVER_H
23 #include "libmesh/libmesh_common.h"
25 #ifdef LIBMESH_HAVE_EIGEN
30 #include "libmesh/linear_solver.h"
31 #include "libmesh/eigen_sparse_vector.h"
32 #include "libmesh/eigen_sparse_matrix.h"
33 #include "libmesh/enum_convergence_flags.h"
48 class EigenSparseLinearSolver :
public LinearSolver<T>
64 virtual void clear ()
override;
69 virtual void init (
const char *
name=
nullptr)
override;
74 virtual std::pair<unsigned int, Real>
75 solve (SparseMatrix<T> & matrix,
76 NumericVector<T> & solution,
77 NumericVector<T> & rhs,
79 const unsigned int m_its)
override;
84 virtual std::pair<unsigned int, Real>
86 NumericVector<T> & solution,
87 NumericVector<T> & rhs,
89 const unsigned int m_its)
override;
94 virtual std::pair<unsigned int, Real>
95 solve (SparseMatrix<T> & matrix,
97 NumericVector<T> & solution,
98 NumericVector<T> & rhs,
100 const unsigned int m_its)
override;
105 virtual std::pair<unsigned int, Real>
106 solve (
const ShellMatrix<T> & shell_matrix,
107 NumericVector<T> & solution_in,
108 NumericVector<T> & rhs_in,
110 const unsigned int m_its)
override;
117 virtual std::pair<unsigned int, Real>
118 solve (
const ShellMatrix<T> & shell_matrix,
119 const SparseMatrix<T> & precond_matrix,
120 NumericVector<T> & solution_in,
121 NumericVector<T> & rhs_in,
123 const unsigned int m_its)
override;
152 static std::map<Eigen::ComputationInfo, LinearConvergenceReason>
build_map()
154 std::map<Eigen::ComputationInfo, LinearConvergenceReason> ret;
168 template <
typename T>
169 std::map<Eigen::ComputationInfo, LinearConvergenceReason>
174 template <
typename T>
183 template <
typename T>
185 std::pair<unsigned int, Real>
193 libmesh_error_msg(
"ERROR: Eigen does not support a user-supplied preconditioner!");
195 std::pair<unsigned int, Real> p;
201 #endif // #ifdef LIBMESH_HAVE_EIGEN
202 #endif // LIBMESH_EIGEN_SPARSE_LINEAR_SOLVER_H