// // Created by Wei Chen on 3/31/22 // #ifndef EigenLibSolver_hpp #define EigenLibSolver_hpp #include "LinSysSolver.hpp" #include #include #include namespace ssim { template class EigenLibSolver : public LinSysSolver { typedef LinSysSolver Base; protected: Eigen::SparseMatrix coefMtr; Eigen::SimplicialLDLT> simplicialLDLT; public: void set_pattern(const std::vector>& vNeighbor); void set_pattern(const Eigen::SparseMatrix& mtr); //NOTE: mtr must be SPD void analyze_pattern(void); bool factorize(void); void solve(Eigen::VectorXd& rhs, Eigen::VectorXd& result); double coeffMtr(int rowI, int colI) const; void setZero(void); virtual void setCoeff(int rowI, int colI, double val); virtual void addCoeff(int rowI, int colI, double val); virtual void setUnit_row(int rowI); virtual void setUnit_col(int colI, const std::set& rowVIs); virtual void setZeroCol(int colI); }; } // namespace SIM #endif /* EigenLibSolver_hpp */