Skip to main content

Github Actions status: pytest Deploy

Coverage status: codecov Codecov Status

Structural analysis solvers tailored for semi-analytical models

  • Linear statics: [K]{u} = {f}
  • Eigensolver for Linear buckling: ([K] + lambda[KG]){u} = 0
  • Eigensolver for dynamics: ([K] + lambda^2[M]){u} = 0
  • Sparse eigenvalue solvers first, verified, with dense solvers only as a last resort, also in the browser (Pyodide) and with the Intel MKL versions that break ARPACK
  • Nonlinear statics using Newton-Raphson
  • Nonlinear statics using the Arc-Length method
  • Support for unsymmetric problems, such as those involving follower forces
  • Load vectors that depend on the load factor, e.g. prescribed displacements imposed exactly as linear constraints

Currently these solvers are pretty much compatible with my other repositories panels, buckling.

Citing this library

Saullo G. P. Castro (2026). Structural analysis solvers tailored for semi-analytical models (Version 0.8.0). Zenodo. DOI: https://doi.org/10.5281/zenodo.2581212.

Documentation

The documentation is available on: https://saullocastro.github.io/structsolve.

History

See CHANGELOG.md for the details of each version.

  • version 0.8.0 (2026-10-14)
    • Fewer evaluations and factorizations, same solutions: dR/dlbd is evaluated together with the tangent stiffness matrix only, Newton-Raphson reuses the factorization of the tangent while it is not updated, the follower linear static analysis factorizes K0 once, and lb estimates its shift and the inertia of K once for all its attempts
  • version 0.7.0 (2026-10-13)
    • calc_fext may declare the keyword argument lbd and then receives the current load factor with the configuration, for prescribed displacements imposed exactly as linear constraints; the solvers use dR/dlbd for the arc-length scale, the first Newton-Raphson predictor and the relative convergence criterion. Callables without lbd behave as before
  • version 0.6.1 (2026-10-08)
    • Pyodide support: await micropip.install("structsolve") in the browser, and the whole test suite runs in Pyodide in GitHub Actions
    • lb and freq always run the sparse solvers first, whatever the size of the problem, with verified results; the dense solvers are only a last resort within max_dense_size, with a DenseFallbackWarning
    • ARPACK's ncv is capped at 32 when SciPy is linked against the Intel MKL versions whose dsteqr is faulty (new structsolve.arpackutils), computing more than 15 eigenpairs in passes whose eigenvectors are made orthonormal with a Rayleigh-Ritz projection
    • Unsymmetric lb: a shift search finds the lowest positive real load multiplier, instead of silently returning negative or complex ones
    • The test extra no longer requires buckling and composites
  • version 0.5.3 (2026-10-06)
    • Configuration-dependent loads, e.g. follower pressures: the load factor is passed to the callables that accept inc, and the arc-length methods use the load vector of the current configuration
    • Unsymmetric matrices in lb (automatic detection), freq (residual check, optional symmetric solvers, kinetic criterion) and solve
    • The unsymmetric solvers of lb and freq use the complex LAPACK drivers of scipy.linalg.eig, avoiding crashes of the Python process with Intel MKL 2025.0.0
    • Linear static analysis with configuration-dependent loads in Analysis.static(NLgeom=False)
  • version 0.4.3 (2026-09-17)
    • Fixed the eigenvalue shift of the sparse solver of lb, which could return buckling loads higher than the critical ones
    • Fixed wrong buckling loads of the sparse solver of lb when SciPy is linked against Intel MKL 2024.2.0 to 2025.0.0 (e.g. Anaconda on Windows), whose dsteqr routine breaks ARPACK
    • lb condenses out the dofs where KG is null and solves small condensed problems with a dense solver
    • lb verifies the eigenpairs of the sparse solver, raising an error instead of returning wrong results
    • The sparse solver of lb returns the load multipliers sorted as the dense solver
    • Newton-Raphson with full Newton iterations and a relative convergence criterion by default, reaching quadratic convergence with exact tangent stiffness matrices
    • Fixed the load-factor bookkeeping of Newton-Raphson, which could finish before reaching the full load
    • Arc-length methods (Riks and Crisfield) rewritten, able to trace limit points, snap-through and snap-back until a load factor of exactly 1.0
    • Sphinx documentation
  • version 0.3.1 (2026-04-09)
    • Robust estimation of the eigenvalue shift for singular matrices in freq and lb, and new skip_null_cols argument
    • Python 3.14 support
    • Estimation of the eigenvalue shift in freq and lb
    • Packaging with pyproject.toml, GitHub Actions and a test suite
  • version 0.2.2 (2019-03-02)
    • Release of 0.2.1 with an updated distribution
    • Fixed the dense solver of freq
    • freq returns the eigenvalues lambda**2 instead of the natural frequencies
  • version 0.1.0 (2018-06-23)
    • First release, with the solvers from compmech

License

Distributed in the 3-Clause BSD license (https://raw.github.com/saullocastro/structsolve/master/LICENSE).

Contact: S.G.P.Castro@tudelft.nl

Metadata

Release files for structsolve 0.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for structsolve 0.8.0
File Size Uploaded
structsolve-0.8.0.tar.gz 76.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for structsolve 0.8.0
File Interpreter ABI Platform
structsolve-0.8.0-py3-none-any.whl Python 3 none any Details

Total release size: 126.6 kB

Release files / structsolve-0.8.0.tar.gz

Download URL structsolve-0.8.0.tar.gz
Size 76.0 kB
Tags Source
SHA-256 checksum
How to use checksums
99b3dbe125df0e55576e0035aabe68ec4a7686779b2a17439a836d9e5dec0770
BLAKE2b-256 checksum
How to use checksums
766d96119de3fbf9d13a4ad8d317d97a3e6399faad68bf04b21f780e7a84cdf3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / structsolve-0.8.0-py3-none-any.whl

Download URL structsolve-0.8.0-py3-none-any.whl
Size 50.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
92aa8b4e87c721bb48b640b6af87b5dddb3c2cce358f4e41362dcd966926ef3b
BLAKE2b-256 checksum
How to use checksums
df7ec285275d068b1a517796fe3c3c7ec867ab200d207a15945dbbf393145619
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release history Release notifications | RSS feed

This release

0.8.0 This release

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.0

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page