This repo contains CPU and GPU implementations for a purely algebraic, hybrid linear solver targetting locally stiff problems (e.g., contact, meshes with poor quality stiffness ratios, extreme elastic deformations, etc.). Regions of local stiffness are identified automatically using the
An improved implementation of our solver that can be easily integrated into other projects exists in PolySolve (see the CPUHybridSolver and GPUHybridSolver classes).
The GPU version of our solver requires CUDA 13. The CPU version of our solver requires MPI and MKL. To build:
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_CUDA_HOST_COMPILER=mpicc -DCMAKE_CUDA_ARCHITECTURES=X -DPOLYSOLVE_WITH_CUDA=ON ..
make -j4We provide the executable /build/tests/linear_solve, which can solve matrices specified by mtx files. The following command will use the solver specified in params.json to solve the system specified by A.mtx and b.mtx:
./tests/linear_solve -A A.mtx -b b.mtx -j params.jsonFor solvers that may require additional, problem-specific information, we provide additional input options. In addition, users can set benchmarking settings such as the number of times to solve the system. A full list of arguments is included below:
| Option | Description |
|---|---|
| -A <matrix.mtx> (REQUIRED) | Path to the input Matrix Market sparse matrix. |
| -b <rhs.mtx> | Path to Matrix Market vector containing the RHS. |
| --rand [seed=0] | Generate a random RHS vector using the given (default 0) random seed. |
| -i <problem_info.mtx> | Path to a Matrix Market vector containing problem-specific information. |
| -p <positions.mtx> | Path to a Matrix Market file specifying spatial node positions. |
| -e <elements.mtx> | Path to a Matrix Market file specifying element connectivity. |
| -t, --threshold | Threshold value applied to problem-specific information vector. |
| --less-than | Condition for setting the problematic subspace based on the provided problem-specific information vector. When set, selects info(i) < threshold. Default selects info(i) > threshold. |
| -j <spec.json> | Path to JSON file describing solver settings. |
| --force-symmetry | Force input matrix to be treated as symmetric by duplicating off diagonal entries. Required if your Matrix Market file stores only the upper/lower triangular part of a symmetric matrix. |
| -w <int=1> | Number of warmup solves to perform before reporting timing information. |
| -r <int=1> | Number of times to repeat the solve. |
Example solver configuration files for our CPU and GPU solver can be found in the spec/ directory.
We include two example matrices mats/ for quick testing, one from a contact problem another from solving the Laplacian on a mesh containing poor quality elements. Note that the former requires block_size=3, while the latter should be solved with block_size=1.
@inproceedings{Paik:2026:PALSS,
title = {A Purely Algebraic Solver for Locally Stiff Linear Systems},
author = {Paik, Maxwell, and Su, Tzu Hsiang, and Kusupati, Uday, and Kolev, Tzanio, and Panozzo, Daniele, and Zorin, Denis},
year = {2026},
isbn = {9798400728426},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
month = nov,
series = {SA Conference Papers ’26},
booktitle = {SIGGRAPH Asia 2026 Conference Papers (SA Conference Papers '26), December 01--04, 2026, Kuala Lumpur, Malaysia},
articleno = {91},
numpages = {10},
doi = {10.1145/3829340.3842242}
}