Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions src/polysolve/linear/EigenSolver.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ namespace polysolve::linear
virtual void get_info(json &params) const override;

// Analyze sparsity pattern
virtual void analyze_pattern(const StiffnessMatrix &K, const int precond_num) override;
virtual void analyze_pattern(const StiffnessMatrix &A, const int precond_num) override;

// Factorize system matrix
virtual void factorize(const StiffnessMatrix &K) override;
virtual void factorize(const StiffnessMatrix &A) override;

// Solve the linear system
virtual void solve(const Ref<const VectorXd> b, Ref<VectorXd> x) override;
Expand All @@ -52,6 +52,11 @@ namespace polysolve::linear
// Name of the solver
std::string m_Name;

// Copy of the input matrix.
// We do this because Eigen iterative solver take a
// reference and assumes A is always valid.
StiffnessMatrix m_A;

public:
// Name of the solver type (for debugging purposes)
virtual std::string name() const override { return m_Name; }
Expand All @@ -67,10 +72,10 @@ namespace polysolve::linear
virtual void get_info(json &params) const override;

// Analyze sparsity pattern
virtual void analyze_pattern(const StiffnessMatrix &K, const int precond_num) override;
virtual void analyze_pattern(const StiffnessMatrix &A, const int precond_num) override;

// Factorize system matrix
virtual void factorize(const StiffnessMatrix &K) override;
virtual void factorize(const StiffnessMatrix &A) override;

// Solve the linear system
virtual void solve(const Ref<const VectorXd> b, Ref<VectorXd> x) override;
Expand Down Expand Up @@ -104,10 +109,10 @@ namespace polysolve::linear
virtual void get_info(json &params) const override;

// Factorize system matrix
virtual void factorize(const StiffnessMatrix &K) override;
virtual void factorize(const StiffnessMatrix &A) override;

// Factorize system matrix
virtual void factorize_dense(const Eigen::MatrixXd &K) override;
virtual void factorize_dense(const Eigen::MatrixXd &A) override;

// Solve the linear system
virtual void solve(const Ref<const VectorXd> b, Ref<VectorXd> x) override;
Expand Down
3 changes: 2 additions & 1 deletion src/polysolve/linear/EigenSolver.tpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ namespace polysolve::linear
template <typename SparseSolver>
void EigenIterative<SparseSolver>::factorize(const StiffnessMatrix &A)
{
m_Solver.factorize(A);
m_A = A;
m_Solver.factorize(m_A);
}

// Solve the linear system
Expand Down