Get the FREE Ultimate OpenClaw Setup Guide →

linear-solvers

Scanned
npx machina-cli add skill HeshamFS/materials-simulation-skills/linear-solvers --openclaw
Files (1)
SKILL.md
5.8 KB

Linear Solvers

Goal

Provide a universal workflow to select a solver, assess conditioning, and diagnose convergence for linear systems arising in numerical simulations.

Requirements

  • Python 3.8+
  • NumPy, SciPy (for matrix operations)
  • See individual scripts for dependencies

Inputs to Gather

InputDescriptionExample
Matrix sizeDimension of systemn = 1000000
SparsityFraction of nonzeros0.01%
SymmetryIs A = Aᵀ?yes
DefinitenessIs A positive definite?yes (SPD)
ConditioningEstimated condition number10⁶

Decision Guidance

Solver Selection Flowchart

Is matrix small (n < 5000) and dense?
├── YES → Use direct solver (LU, Cholesky)
└── NO → Is matrix symmetric?
    ├── YES → Is it positive definite?
    │   ├── YES → Use CG with AMG/IC preconditioner
    │   └── NO → Use MINRES
    └── NO → Is it nearly symmetric?
        ├── YES → Use BiCGSTAB
        └── NO → Use GMRES with ILU/AMG

Quick Reference

Matrix TypeSolverPreconditioner
SPD, sparseCGAMG, IC
Symmetric indefiniteMINRESILU
NonsymmetricGMRES, BiCGSTABILU, AMG
DenseLU, CholeskyNone
Saddle pointSchur complement, UzawaBlock preconditioner

Script Outputs (JSON Fields)

ScriptKey Outputs
scripts/solver_selector.pyrecommended, alternatives, notes
scripts/convergence_diagnostics.pyrate, stagnation, recommended_action
scripts/sparsity_stats.pynnz, density, bandwidth, symmetry
scripts/preconditioner_advisor.pysuggested, notes
scripts/scaling_equilibration.pyrow_scale, col_scale, notes
scripts/residual_norms.pyresidual_norms, relative_norms, converged

Workflow

  1. Characterize matrix - symmetry, definiteness, sparsity
  2. Analyze sparsity - Run scripts/sparsity_stats.py
  3. Select solver - Run scripts/solver_selector.py
  4. Choose preconditioner - Run scripts/preconditioner_advisor.py
  5. Apply scaling - If ill-conditioned, use scripts/scaling_equilibration.py
  6. Monitor convergence - Use scripts/convergence_diagnostics.py
  7. Diagnose issues - Check residual history with scripts/residual_norms.py

Conversational Workflow Example

User: My GMRES solver is stagnating after 50 iterations. The residual drops to 1e-3 then stops improving.

Agent workflow:

  1. Diagnose convergence:
    python3 scripts/convergence_diagnostics.py --residuals 1,0.1,0.01,0.005,0.003,0.002,0.002,0.002 --json
    
  2. Check for preconditioning advice:
    python3 scripts/preconditioner_advisor.py --matrix-type nonsymmetric --sparse --stagnation --json
    
  3. Recommend: Increase restart parameter, try ILU(k) with higher k, or switch to AMG.

Pre-Solve Checklist

  • Confirm matrix symmetry/definiteness
  • Decide direct vs iterative based on size and sparsity
  • Set residual tolerance relative to physics scale
  • Choose preconditioner appropriate to matrix structure
  • Apply scaling/equilibration if needed
  • Track convergence and adjust if stagnation occurs

CLI Examples

# Analyze sparsity pattern
python3 scripts/sparsity_stats.py --matrix A.npy --json

# Select solver for SPD sparse system
python3 scripts/solver_selector.py --symmetric --positive-definite --sparse --size 1000000 --json

# Get preconditioner recommendation
python3 scripts/preconditioner_advisor.py --matrix-type spd --sparse --json

# Diagnose convergence from residual history
python3 scripts/convergence_diagnostics.py --residuals 1,0.2,0.05,0.01 --json

# Apply scaling
python3 scripts/scaling_equilibration.py --matrix A.npy --symmetric --json

# Compute residual norms
python3 scripts/residual_norms.py --residual 1,0.1,0.01 --rhs 1,0,0 --json

Error Handling

ErrorCauseResolution
Matrix file not foundInvalid pathCheck file exists
Matrix must be squareNon-square inputVerify matrix dimensions
Residuals must be positiveInvalid residual dataCheck input format

Interpretation Guidance

Convergence Rate

RateMeaningAction
< 0.1ExcellentCurrent setup optimal
0.1 - 0.5GoodAcceptable for most problems
0.5 - 0.9SlowConsider better preconditioner
> 0.9StagnationChange solver or preconditioner

Stagnation Diagnosis

PatternLikely CauseFix
Flat residualPoor preconditionerImprove preconditioner
OscillatingNear-singular or indefiniteCheck matrix, try different solver
Very slow decayIll-conditionedApply scaling, use AMG

Limitations

  • Large dense matrices: Direct solvers may run out of memory
  • Highly indefinite: Standard preconditioners may fail
  • Saddle-point: Requires specialized block preconditioners

References

  • references/solver_decision_tree.md - Selection logic
  • references/preconditioner_catalog.md - Preconditioner options
  • references/convergence_patterns.md - Diagnosing failures
  • references/scaling_guidelines.md - Equilibration guidance

Version History

  • v1.1.0 (2024-12-24): Enhanced documentation, decision guidance, examples
  • v1.0.0: Initial release with 6 solver analysis scripts

Source

git clone https://github.com/HeshamFS/materials-simulation-skills/blob/main/skills/core-numerical/linear-solvers/SKILL.mdView on GitHub

Overview

Provides a universal workflow to select a solver, assess conditioning, and diagnose convergence for linear systems Ax=b arising in numerical simulations. It covers both dense and sparse matrices and guides direct vs iterative choice, preconditioner selection, and strategies to diagnose stagnation in GMRES, CG, and BiCGSTAB.

How This Skill Works

First characterize the matrix (symmetry, definiteness, sparsity) and collect inputs. Then run the analytic scripts (sparsity_stats.py, solver_selector.py, preconditioner_advisor.py, scaling_equilibration.py, convergence_diagnostics.py, residual_norms.py) to recommend solvers and preconditioners and monitor convergence. Finally, apply scaling, choose preconditioners, and diagnose stagnation based on residual history.

When to Use It

  • Choosing direct vs iterative solvers for a large sparse system based on size, sparsity, and available memory.
  • Assessing conditioning and selecting preconditioners (AMG/IC, ILU) before solving.
  • Diagnosing stagnation in iterative methods like GMRES, CG, or BiCGSTAB.
  • Solving SPD sparse systems where CG with a preconditioner is appropriate.
  • Dealing with dense matrices that favor LU or Cholesky with no preconditioning.

Quick Start

  1. Step 1: Characterize the matrix (symmetry, definiteness, sparsity) and collect inputs.
  2. Step 2: Run solver_selector.py to pick a solver and preconditioner.
  3. Step 3: Run convergence_diagnostics.py and adjust based on residuals.

Best Practices

  • Characterize A early: symmetry, definiteness, sparsity.
  • Estimate conditioning and use it to drive solver choice.
  • Match solver to matrix type (SPD -> CG, nonsymmetric -> GMRES/BiCGSTAB, dense -> LU/Cholesky).
  • Select preconditioners aligned to structure (AMG/IC for SPD, ILU for nonsymmetric).
  • Validate convergence with residual norms and adjust if stagnation occurs.

Example Use Cases

  • SPD sparse system: use CG with AMG/IC preconditioner.
  • Symmetric indefinite: MINRES with ILU.
  • Nonsymmetric GMRES with ILU/AMG preconditioners.
  • Dense linear system: LU or Cholesky without preconditioning.
  • Saddle-point problem: Schur complement with a block preconditioner.

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers