From 760ff26129e171de4210bebdba53a3919879c722 Mon Sep 17 00:00:00 2001 From: Michael Tao Date: Sat, 4 Jan 2025 13:53:56 -0500 Subject: [PATCH 1/4] adding SparseQR --- src/polysolve/linear/Solver.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/polysolve/linear/Solver.cpp b/src/polysolve/linear/Solver.cpp index 25595be..32e1ec0 100644 --- a/src/polysolve/linear/Solver.cpp +++ b/src/polysolve/linear/Solver.cpp @@ -11,6 +11,12 @@ #include // ----------------------------------------------------------------------------- +// +// Subsequent macros assume a single template parameter and SparseQR fails due to requiring 2 parameters. this is because the OrderingType is not filled in. +// SparseLU has a default declaration of _OrderingType to use COLAMDOrdering but SparseQR doesn't - so this just mimics that behavior. If Eigen adds such a default in the future this line will need to be guarded to avoid multiple defaults +namespace Eigen { +template > class SparseQR; +} #include #ifdef POLYSOLVE_WITH_ACCELERATE #include @@ -293,6 +299,10 @@ namespace polysolve::linear else if (solver == "Eigen::SparseLU") { RETURN_DIRECT_SOLVER_PTR(SparseLU, "Eigen::SparseLU"); + } + else if (solver == "Eigen::SparseQR") + { + RETURN_DIRECT_SOLVER_PTR(SparseQR, "Eigen::SparseQR"); #ifdef POLYSOLVE_WITH_ACCELERATE } else if (solver == "Eigen::AccelerateLLT") @@ -465,6 +475,7 @@ namespace polysolve::linear return {{ "Eigen::SimplicialLDLT", "Eigen::SparseLU", + "Eigen::SparseQR", #ifdef POLYSOLVE_WITH_ACCELERATE "Eigen::AccelerateLLT", "Eigen::AccelerateLDLT", From d96792be46a29feccf81b571f750a86f04795927 Mon Sep 17 00:00:00 2001 From: Michael Tao Date: Sat, 4 Jan 2025 14:32:04 -0500 Subject: [PATCH 2/4] adding suitesparse::spqr --- CMakeLists.txt | 12 ++++++++++++ cmake/recipes/spqr.cmake | 11 +++++++++++ src/polysolve/linear/Solver.cpp | 27 +++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 cmake/recipes/spqr.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 474ef9b..a5a390d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,6 +74,7 @@ option(POLYSOLVE_WITH_ACCELERATE "Enable Apple Accelerate" ${POLYSOLVE_ON_APP option(POLYSOLVE_WITH_CHOLMOD "Enable Cholmod library" ON) option(POLYSOLVE_WITH_UMFPACK "Enable UmfPack library" ON) option(POLYSOLVE_WITH_SUPERLU "Enable SuperLU library" ON) +option(POLYSOLVE_WITH_SPQR "Enable SPQR library" ON) option(POLYSOLVE_WITH_MKL "Enable MKL library" ${POLYSOLVE_NOT_ON_APPLE_SILICON}) option(POLYSOLVE_WITH_CUSOLVER "Enable cuSOLVER library" OFF) option(POLYSOLVE_WITH_PARDISO "Enable Pardiso library" OFF) @@ -269,6 +270,17 @@ if(POLYSOLVE_WITH_SUPERLU) endif() endif() +# SuperLU solver +if(POLYSOLVE_WITH_SPQR) + include(SPQR) + if(TARGET SuiteSparse::SPQR) + target_link_libraries(polysolve_linear PRIVATE SuiteSparse::SPQR) + target_compile_definitions(polysolve_linear PUBLIC POLYSOLVE_WITH_SPQR) + else() + message(WARNING "SPQR Not found, solver will not be available.") + endif() +endif() + # AMGCL solver if(POLYSOLVE_WITH_AMGCL) include(amgcl) diff --git a/cmake/recipes/spqr.cmake b/cmake/recipes/spqr.cmake new file mode 100644 index 0000000..05cb74d --- /dev/null +++ b/cmake/recipes/spqr.cmake @@ -0,0 +1,11 @@ +# SPQR solver + +if(TARGET SparseSuite::SPQR) + return() +endif() + +message(STATUS "Third-party: creating targets 'SuiteSparse::SPQR'") + +# We do not have a build recipe for this, so find it as a system installed library. +find_package(SPQR) + diff --git a/src/polysolve/linear/Solver.cpp b/src/polysolve/linear/Solver.cpp index 32e1ec0..e7c0c25 100644 --- a/src/polysolve/linear/Solver.cpp +++ b/src/polysolve/linear/Solver.cpp @@ -27,6 +27,24 @@ template #endif +#ifdef POLYSOLVE_WITH_SPQR +#include +namespace polysolve::linear { + template <> + void EigenDirect>::analyze_pattern(const StiffnessMatrix& A, const int precond_num) { + m_Solver.compute(A); + } + template <> + void EigenDirect>::factorize(const StiffnessMatrix &A) + { + m_Solver.compute(A); + if (m_Solver.info() == Eigen::NumericalIssue) + { + throw std::runtime_error("[EigenDirect] NumericalIssue encountered."); + } + } +} +#endif #ifdef POLYSOLVE_WITH_SUPERLU #include #endif @@ -345,6 +363,12 @@ namespace polysolve::linear { RETURN_DIRECT_SOLVER_PTR(SuperLU, "Eigen::SuperLU"); #endif +#ifdef POLYSOLVE_WITH_SPQR + } + else if (solver == "Eigen::SPQR") + { + RETURN_DIRECT_SOLVER_PTR(SPQR, "Eigen::SPQR"); +#endif #ifdef POLYSOLVE_WITH_MKL } else if (solver == "Eigen::PardisoLLT") @@ -492,6 +516,9 @@ namespace polysolve::linear #ifdef POLYSOLVE_WITH_SUPERLU "Eigen::SuperLU", #endif +#ifdef POLYSOLVE_WITH_SPQR + "Eigen::SPQR", +#endif #ifdef POLYSOLVE_WITH_MKL "Eigen::PardisoLLT", "Eigen::PardisoLDLT", From 3f39a9066b7147244d061d53f12b06e7f02f2178 Mon Sep 17 00:00:00 2001 From: Michael Tao Date: Sat, 4 Jan 2025 14:43:49 -0500 Subject: [PATCH 3/4] fixing spqr capitaliztion --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a5a390d..f5bd543 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -272,7 +272,7 @@ endif() # SuperLU solver if(POLYSOLVE_WITH_SPQR) - include(SPQR) + include(spqr) if(TARGET SuiteSparse::SPQR) target_link_libraries(polysolve_linear PRIVATE SuiteSparse::SPQR) target_compile_definitions(polysolve_linear PUBLIC POLYSOLVE_WITH_SPQR) From 7bdb3ebd246921b769d2d16e3de13b0146fd4520 Mon Sep 17 00:00:00 2001 From: Michael Tao Date: Sat, 4 Jan 2025 14:45:16 -0500 Subject: [PATCH 4/4] adding suitesparse-dev to linux build --- .github/workflows/continuous.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/continuous.yml b/.github/workflows/continuous.yml index 5f5f524..493bdc0 100644 --- a/.github/workflows/continuous.yml +++ b/.github/workflows/continuous.yml @@ -42,13 +42,14 @@ jobs: libglu1-mesa-dev \ xorg-dev \ mpi \ - ccache + ccache \ + libsuitesparse-dev echo 'CACHE_PATH=~/.ccache' >> "$GITHUB_ENV" - name: Dependencies (macOS) if: runner.os == 'macOS' run: | - brew install ccache open-mpi + brew install ccache open-mpi suitesparse echo 'CACHE_PATH=~/Library/Caches/ccache' >> "$GITHUB_ENV" - name: Cache Build