Skip to content

Commit 0d895ce

Browse files
Add JOSS paper for LinearSolve.jl
This commit adds a Journal of Open Source Software (JOSS) paper submission following the structure used in DataInterpolations.jl. The paper includes: - joss/paper.md: Main paper content describing LinearSolve.jl's features, statement of need, and example usage - joss/paper.bib: Bibliography with references to Julia, underlying solver libraries (KLU, UMFPACK, Pardiso, Sparspak), Krylov methods, GPU libraries, and related SciML packages The paper highlights LinearSolve.jl's key contributions: - Unified interface for linear solvers across the Julia ecosystem - High-performance implementations with hardware-specific optimizations - Comprehensive sparse and dense solver support - GPU acceleration capabilities - Intelligent polyalgorithm selection - Seamless integration with the SciML ecosystem 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent 0f3e53a commit 0d895ce

File tree

2 files changed

+236
-0
lines changed

2 files changed

+236
-0
lines changed

joss/paper.bib

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
@article{Bezanson2017,
2+
author = {Bezanson, Jeff and Edelman, Alan and Karpinski, Stefan and Shah, Viral B.},
3+
title = {{J}ulia: A Fresh Approach to Numerical Computing},
4+
journal = {SIAM Review},
5+
volume = {59},
6+
number = {1},
7+
pages = {65-98},
8+
year = {2017},
9+
doi = {10.1137/141000671},
10+
URL = {https://doi.org/10.1137/141000671},
11+
eprint = {https://doi.org/10.1137/141000671}
12+
}
13+
14+
@misc{ma2021modelingtoolkit,
15+
title={ModelingToolkit: A Composable Graph Transformation System For Equation-Based Modeling},
16+
author={Yingbo Ma and Shashi Gowda and Ranjan Anantharaman and Chris Laughman and Viral Shah and Chris Rackauckas},
17+
year={2021},
18+
eprint={2103.05244},
19+
archivePrefix={arXiv},
20+
doi={10.48550/arXiv.2103.05244},
21+
url={https://doi.org/10.48550/arXiv.2103.05244},
22+
primaryClass={cs.MS}
23+
}
24+
25+
@article{rackauckas2017differentialequations,
26+
title={DifferentialEquations.jl--a performant and feature-rich ecosystem for solving differential equations in Julia},
27+
author={Rackauckas, Christopher and Nie, Qing},
28+
journal={Journal of Open Research Software},
29+
volume={5},
30+
number={1},
31+
pages={15},
32+
year={2017},
33+
publisher={Ubiquity Press},
34+
doi={10.5334/jors.151},
35+
url={https://doi.org/10.5334/jors.151}
36+
}
37+
38+
@article{Davis2010KLU,
39+
title={Algorithm 907: KLU, a direct sparse solver for circuit simulation problems},
40+
author={Davis, Timothy A. and Palamadai Natarajan, Ekanathan},
41+
journal={ACM Transactions on Mathematical Software (TOMS)},
42+
volume={37},
43+
number={3},
44+
pages={1--17},
45+
year={2010},
46+
publisher={ACM New York, NY, USA},
47+
doi={10.1145/1824801.1824814},
48+
url={https://doi.org/10.1145/1824801.1824814}
49+
}
50+
51+
@article{Davis2004UMFPACK,
52+
title={Algorithm 832: UMFPACK V4.3---an unsymmetric-pattern multifrontal method},
53+
author={Davis, Timothy A.},
54+
journal={ACM Transactions on Mathematical Software (TOMS)},
55+
volume={30},
56+
number={2},
57+
pages={196--199},
58+
year={2004},
59+
publisher={ACM New York, NY, USA},
60+
doi={10.1145/992200.992206},
61+
url={https://doi.org/10.1145/992200.992206}
62+
}
63+
64+
@article{Schenk2004Pardiso,
65+
title={Solving unsymmetric sparse systems of linear equations with PARDISO},
66+
author={Schenk, Olaf and G{\"a}rtner, Klaus},
67+
journal={Future Generation Computer Systems},
68+
volume={20},
69+
number={3},
70+
pages={475--487},
71+
year={2004},
72+
publisher={Elsevier},
73+
doi={10.1016/j.future.2003.07.011},
74+
url={https://doi.org/10.1016/j.future.2003.07.011}
75+
}
76+
77+
@misc{Sparspak,
78+
author = {Sherman, Andrew H. and George, Alan and Liu, Joseph W. H.},
79+
title = {Sparspak: Waterloo Sparse Matrix Package},
80+
howpublished = {Julia implementation: \url{https://github.com/PetrKryslUCSD/Sparspak.jl}},
81+
note = {User's Guide for SPARSPAK: Waterloo sparse linear equations package},
82+
year = {1978}
83+
}
84+
85+
@inproceedings{besard2018juliagpu,
86+
title={Effective extensible programming: unleashing Julia on GPUs},
87+
author={Besard, Tim and Foket, Christophe and De Sutter, Bjorn},
88+
booktitle={IEEE Transactions on Parallel and Distributed Systems},
89+
volume={30},
90+
number={4},
91+
pages={827--841},
92+
year={2019},
93+
organization={IEEE},
94+
doi={10.1109/TPDS.2018.2872064},
95+
url={https://doi.org/10.1109/TPDS.2018.2872064}
96+
}
97+
98+
@misc{Krylov,
99+
author = {Montoison, Alexis and Orban, Dominique},
100+
title = {Krylov.jl: A Julia basket of hand-picked Krylov methods},
101+
year = {2020},
102+
publisher = {GitHub},
103+
journal = {GitHub repository},
104+
howpublished = {\url{https://github.com/JuliaSmoothOptimizers/Krylov.jl}},
105+
doi={10.5281/zenodo.822073},
106+
url={https://doi.org/10.5281/zenodo.822073}
107+
}
108+
109+
@misc{IterativeSolvers,
110+
author = {Jutho Haegeman and others},
111+
title = {IterativeSolvers.jl: Iterative algorithms for solving linear systems, eigensystems, and singular value problems},
112+
year = {2023},
113+
publisher = {GitHub},
114+
journal = {GitHub repository},
115+
howpublished = {\url{https://github.com/JuliaLinearAlgebra/IterativeSolvers.jl}}
116+
}
117+
118+
@misc{KrylovKit,
119+
author = {Haegeman, Jutho},
120+
title = {KrylovKit.jl: A Julia package collecting a number of Krylov-based algorithms for linear problems, singular value and eigenvalue problems},
121+
year = {2023},
122+
publisher = {GitHub},
123+
journal = {GitHub repository},
124+
howpublished = {\url{https://github.com/Jutho/KrylovKit.jl}}
125+
}
126+
127+
@misc{RecursiveFactorization,
128+
author = {Rackauckas, Christopher and others},
129+
title = {RecursiveFactorization.jl: A Julia package for recursive dense matrix factorizations},
130+
year = {2023},
131+
publisher = {GitHub},
132+
journal = {GitHub repository},
133+
howpublished = {\url{https://github.com/JuliaLinearAlgebra/RecursiveFactorization.jl}}
134+
}

joss/paper.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
---
2+
title: 'LinearSolve.jl: High-Performance Unified Interface for Linear System Solvers'
3+
tags:
4+
- julia
5+
- linear algebra
6+
- numerical methods
7+
- high-performance computing
8+
authors:
9+
- name: Christopher Rackauckas
10+
orcid: 0000-0001-5850-0663
11+
corresponding: true
12+
affiliation: "1, 2, 3"
13+
affiliations:
14+
- name: JuliaHub
15+
index: 1
16+
- name: Pumas-AI
17+
index: 2
18+
- name: Massachusetts Institute of Technology
19+
index: 3
20+
date: 25 October 2025
21+
bibliography: paper.bib
22+
---
23+
24+
# Summary
25+
26+
Solving linear systems of the form $Ax = b$ is a fundamental operation in scientific computing, appearing in applications ranging from machine learning to differential equations. LinearSolve.jl is a Julia [@Bezanson2017] package that provides a unified, high-performance interface for linear system solvers across the Julia ecosystem. The package implements the SciML common interface, enabling users to easily swap between different solver algorithms while maintaining maximum efficiency. LinearSolve.jl includes:
27+
28+
- Fast pure Julia LU factorizations which can outperform standard BLAS implementations
29+
- Specialized sparse matrix solvers including KLU [@Davis2010KLU], UMFPACK [@Davis2004UMFPACK], and Pardiso [@Schenk2004Pardiso]
30+
- Sparspak.jl [@Sparspak] for pure Julia sparse LU factorization supporting generic number types
31+
- GPU-offloading capabilities for large dense and sparse matrices via CUDA.jl [@besard2018juliagpu], Metal.jl, and AMDGPU.jl
32+
- Comprehensive wrappers for Krylov methods from Krylov.jl [@Krylov], IterativeSolvers.jl [@IterativeSolvers], and KrylovKit.jl [@KrylovKit]
33+
- A polyalgorithm that intelligently selects optimal methods based on problem characteristics
34+
- An advanced caching interface that optimizes symbolic and numerical factorizations
35+
- Mixed precision solvers for memory-bandwidth-limited problems
36+
- Integration with ModelingToolkit.jl [@ma2021modelingtoolkit] for symbolic modeling
37+
38+
# Statement of need
39+
40+
Linear system solving is ubiquitous in scientific computing, yet choosing the right solver for a given problem requires significant expertise. Different algorithms excel in different regimes: direct methods like LU factorization are efficient for small to medium dense systems, sparse factorizations leverage structure in large sparse systems, and iterative Krylov methods scale to very large systems when lower tolerance is acceptable. Furthermore, modern hardware diversity (CPUs with various BLAS implementations, NVIDIA GPUs, AMD GPUs, Apple Silicon) means that optimal performance often requires hardware-specific implementations.
41+
42+
LinearSolve.jl addresses these challenges by providing a unified interface that abstracts away implementation details while maintaining high performance. Users define a `LinearProblem` once and can easily experiment with different solvers by changing a single argument. The package automatically handles API differences between underlying solver libraries, particularly in preconditioner definitions and matrix format requirements. This design philosophy aligns with the broader SciML ecosystem's goal of composable, high-performance scientific computing tools.
43+
44+
The package distinguishes itself from Base Julia's LinearAlgebra in several ways:
45+
46+
- **Performance optimizations**: Pure Julia implementations like `RFLUFactorization` [@RecursiveFactorization] can outperform BLAS for small to medium matrices, while hardware-specific wrappers (`AppleAccelerateLUFactorization`, `MKLLUFactorization`) provide optimal performance across different platforms
47+
- **Caching infrastructure**: Automatic reuse of symbolic and numerical factorizations when solving multiple systems with the same structure
48+
- **Unified Krylov interface**: Seamless access to multiple Krylov implementations with consistent preconditioner handling
49+
- **GPU acceleration**: First-class support for offloading to CUDA, Metal, and AMD GPUs with automatic data transfer
50+
- **Polyalgorithm selection**: Intelligent algorithm choice based on matrix properties and problem size
51+
- **Sparse solver diversity**: Access to KLU, UMFPACK, Pardiso, Sparspak, and CliqueTrees solvers through a common interface
52+
53+
LinearSolve.jl is a critical dependency in the SciML ecosystem, particularly for DifferentialEquations.jl [@rackauckas2017differentialequations] where linear solves appear in implicit time integration and nonlinear system solving. It enables downstream packages and users to easily experiment with different linear solvers to find optimal performance for their specific applications.
54+
55+
# Example
56+
57+
The package provides comprehensive tutorials in the documentation:
58+
59+
- [Tutorial I: Basics](https://docs.sciml.ai/LinearSolve/stable/tutorials/linear/) demonstrates defining linear problems and solving with different algorithms
60+
- [Tutorial II: Caching Interface](https://docs.sciml.ai/LinearSolve/stable/tutorials/caching_interface/) explains how to efficiently reuse factorizations
61+
- [Tutorial III: GPU Computing](https://docs.sciml.ai/LinearSolve/stable/tutorials/gpu/) shows GPU-accelerated solving for large matrices
62+
- [Tutorial IV: Autotuning](https://docs.sciml.ai/LinearSolve/stable/tutorials/autotune/) demonstrates automatic algorithm selection
63+
64+
A simple demonstration showing the unified interface:
65+
66+
```julia
67+
using LinearSolve
68+
69+
# Define the linear problem
70+
n = 4
71+
A = rand(n, n)
72+
b = rand(n)
73+
prob = LinearProblem(A, b)
74+
75+
# Initialize with default algorithm
76+
linsolve = init(prob)
77+
sol = solve!(linsolve)
78+
sol.u # Solution vector
79+
80+
# Reuse for a different right-hand side
81+
b2 = rand(n)
82+
linsolve.b = b2
83+
sol2 = solve!(linsolve)
84+
85+
# Switch to an iterative solver (GMRES)
86+
using IterativeSolvers # Load extension
87+
linsolve = init(prob, IterativeSolversJL_GMRES())
88+
sol3 = solve!(linsolve)
89+
90+
# Update the matrix and resolve
91+
A2 = rand(n, n)
92+
linsolve.A = A2
93+
sol4 = solve!(linsolve)
94+
```
95+
96+
This example demonstrates the key features: defining a problem once, efficiently solving multiple related systems through caching, and seamlessly switching between solver algorithms.
97+
98+
# Acknowledgements
99+
100+
We acknowledge contributions from the entire SciML community and the JuliaLang community for their development of the underlying solver packages that LinearSolve.jl interfaces with.
101+
102+
# References

0 commit comments

Comments
 (0)