openseespy_solvers.cupy¶
CUDA sparse linear and eigen solver constructors implemented with
cupyx.scipy.sparse.linalg.
This module follows cupyx.scipy.sparse.linalg naming where possible. Constructors return
OpenSeesPy-compatible solver objects; OpenSeesPy supplies A, b, K, and M at solve
time. Importing this module requires cupy.
Solving Linear Problems¶
Direct methods:
| Constructor | cupy analogue |
Description |
|---|---|---|
spsolve |
cupyx.scipy.sparse.linalg.splu |
Sparse direct solver on CUDA |
Iterative methods:
| Constructor | cupy analogue |
Description |
|---|---|---|
cg |
cupyx.scipy.sparse.linalg.cg |
Conjugate Gradient on CUDA |
gmres |
cupyx.scipy.sparse.linalg.gmres |
GMRES on CUDA |
Eigenvalue Problems¶
| Constructor | cupy/scipy analogue |
Description |
|---|---|---|
eigsh |
cupyx.scipy.sparse.linalg.eigsh / scipy.sparse.linalg.eigsh |
CUDA-assisted generalized symmetric eigen solve |
lobpcg |
cupyx.scipy.sparse.linalg.lobpcg |
LOBPCG on CUDA |
Installation¶
Install the CUDA extra matching your driver:
OpenSeesPy Usage¶
from openseespy_solvers.cupy import eigsh
solver = eigsh(tol=1e-8)
lam = ops.eigen("PythonSparse", num_modes, solver.to_openseespy())
Notes¶
OpenSeesPy assembles matrices on the CPU. cupy solvers copy matrix data to the GPU before
solving, so GPU speedups depend on problem size, sparsity, and transfer overhead.
eigsh solves K x = lambda M x with shift-invert support:
mass_mode="general"usesscipy.sparse.linalg.eigshwith GPU inner solves when shift-invert is active.mass_mode="diagonal"andmass_mode="lumped"use GPU shift-invert with diagonal mass.
Raw cupyx.scipy.sparse.linalg.eigsh does not accept a mass matrix; use lobpcg when you
need a different iterative eigen strategy.
Function Reference¶
Sparse linear algebra solvers for OpenSeesPy (cupyx.scipy.sparse.linalg backend).
This module provides solver objects that wrap :mod:cupyx.scipy.sparse.linalg
for OpenSeesPy's PythonSparse commands. Factory signatures match the
cupyx.scipy.sparse.linalg API except that A and b (or K and M) are
supplied by OpenSees at solve time.
Importing this module requires cupy. Install a CUDA-matched extra, for example
python -m pip install "openseespy-solvers[cuda13]" or use [cuda12].
Notes
Generalized :func:cupyx.scipy.sparse.linalg.eigsh is not available.
:func:eigsh supports:
mass_mode='general'(default): matches OpenSeeseigsh(shift-invert withsigma=0for smallest modes; plain ARPACK for largest). GPU inner solves when shift-invert is used.mass_mode='diagonal'/'lumped': shift-invert on GPU (smallest modes, or whensigmais set); usegeneralfor largest modes without a shift.
Use :func:lobpcg when these modes are not appropriate.
Submodules
precond
GPU preconditioner factories for use with M=.
See Also
cupyx.scipy.sparse.linalg openseespy_solvers.scipy CPU backend with the same interface.
spsolve
¶
spsolve(*, permc_spec: str = 'COLAMD', scheme: str | None = None, writable: str | list[str] = 'none', debug: bool = False, dtype: Any = float64) -> _SpSolve
Source code in src/openseespy_solvers/cupy/__init__.py
cg
¶
cg(x0: Any = None, *, rtol: float = 1e-05, atol: float = 0.0, maxiter: int | None = None, M: Any = None, callback: Any = None, scheme: str | None = None, writable: str | list[str] = 'none', debug: bool = False, dtype: Any = float64) -> _CG
Source code in src/openseespy_solvers/cupy/__init__.py
gmres
¶
gmres(x0: Any = None, *, rtol: float = 1e-05, atol: float = 0.0, restart: int = 20, maxiter: int | None = None, M: Any = None, callback: Any = None, scheme: str | None = None, writable: str | list[str] = 'none', debug: bool = False, dtype: Any = float64) -> _GMRES
Source code in src/openseespy_solvers/cupy/__init__.py
eigsh
¶
eigsh(*, sigma: float | None = None, which: str = 'LM', mass_mode: str = 'general', linear_solver: LinearSolver | None = None, mode: str = 'normal', v0: Any = None, ncv: int | None = None, maxiter: int | None = None, tol: float = 0.0, scheme: str | None = None, debug: bool = False, dtype: Any = float64) -> _Eigsh
Source code in src/openseespy_solvers/cupy/__init__.py
lobpcg
¶
lobpcg(*, X: Any = None, M: Any = None, tol: float | None = None, maxiter: int = 20, largest: bool = False, rng: Any = None, scheme: str | None = None, debug: bool = False, dtype: Any = float64) -> _Lobpcg