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
| Input |
Description |
Example |
| Matrix size |
Dimension of system |
n = 1000000 |
| Sparsity |
Fraction of nonzeros |
0.01% |
| Symmetry |
Is A = Aᵀ? |
yes |
| Definiteness |
Is A positive definite? |
yes (SPD) |
| Conditioning |
Estimated condition number |
10⁶ |
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 Type |
Solver |
Preconditioner |
| SPD, sparse |
CG |
AMG, IC |
| Symmetric indefinite |
MINRES |
ILU |
| Nonsymmetric |
GMRES, BiCGSTAB |
ILU, AMG |
| Dense |
LU, Cholesky |
None |
| Saddle point |
Schur complement, Uzawa |
Block preconditioner |
Script Outputs (JSON Fields)
| Script |
Key Outputs |
scripts/solver_selector.py |
recommended, alternatives, notes |
scripts/convergence_diagnostics.py |
rate, stagnation, recommended_action |
scripts/sparsity_stats.py |
nnz, density, bandwidth, symmetry |
scripts/preconditioner_advisor.py |
suggested, notes |
scripts/scaling_equilibration.py |
row_scale, col_scale, notes |
scripts/residual_norms.py |
residual_norms, relative_norms, converged |
Workflow
- Characterize matrix - symmetry, definiteness, sparsity
- Analyze sparsity - Run
scripts/sparsity_stats.py
- Select solver - Run
scripts/solver_selector.py
- Choose preconditioner - Run
scripts/preconditioner_advisor.py
- Apply scaling - If ill-conditioned, use
scripts/scaling_equilibration.py
- Monitor convergence - Use
scripts/convergence_diagnostics.py
- 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:
- Diagnose convergence:
python3 scripts/convergence_diagnostics.py --residuals 1,0.1,0.01,0.005,0.003,0.002,0.002,0.002 --json
- Check for preconditioning advice:
python3 scripts/preconditioner_advisor.py --matrix-type nonsymmetric --sparse --stagnation --json
- Recommend: Increase restart parameter, try ILU(k) with higher k, or switch to AMG.
Pre-Solve Checklist
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
| Error |
Cause |
Resolution |
Matrix file not found |
Invalid path |
Check file exists |
Matrix must be square |
Non-square input |
Verify matrix dimensions |
Residuals must be positive |
Invalid residual data |
Check input format |
Interpretation Guidance
Convergence Rate
| Rate |
Meaning |
Action |
| < 0.1 |
Excellent |
Current setup optimal |
| 0.1 - 0.5 |
Good |
Acceptable for most problems |
| 0.5 - 0.9 |
Slow |
Consider better preconditioner |
| > 0.9 |
Stagnation |
Change solver or preconditioner |
Stagnation Diagnosis
| Pattern |
Likely Cause |
Fix |
| Flat residual |
Poor preconditioner |
Improve preconditioner |
| Oscillating |
Near-singular or indefinite |
Check matrix, try different solver |
| Very slow decay |
Ill-conditioned |
Apply 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
1---2name: linear-solvers3description: Select and configure linear solvers for systems Ax=b in dense and sparse problems. Use when choosing direct vs iterative methods, diagnosing convergence issues, estimating conditioning, selecting preconditioners, or debugging stagnation in GMRES/CG/BiCGSTAB.4---56# Linear Solvers78## Goal910Provide a universal workflow to select a solver, assess conditioning, and diagnose convergence for linear systems arising in numerical simulations.1112## Requirements1314- Python 3.8+15- NumPy, SciPy (for matrix operations)16- See individual scripts for dependencies1718## Inputs to Gather1920| Input | Description | Example |21|-------|-------------|---------|22| Matrix size | Dimension of system | `n = 1000000` |23| Sparsity | Fraction of nonzeros | `0.01%` |24| Symmetry | Is A = Aᵀ? | `yes` |25| Definiteness | Is A positive definite? | `yes (SPD)` |26| Conditioning | Estimated condition number | `10⁶` |2728## Decision Guidance2930### Solver Selection Flowchart3132```33Is matrix small (n < 5000) and dense?34├── YES → Use direct solver (LU, Cholesky)35└── NO → Is matrix symmetric?36 ├── YES → Is it positive definite?37 │ ├── YES → Use CG with AMG/IC preconditioner38 │ └── NO → Use MINRES39 └── NO → Is it nearly symmetric?40 ├── YES → Use BiCGSTAB41 └── NO → Use GMRES with ILU/AMG42```4344### Quick Reference4546| Matrix Type | Solver | Preconditioner |47|-------------|--------|----------------|48| SPD, sparse | CG | AMG, IC |49| Symmetric indefinite | MINRES | ILU |50| Nonsymmetric | GMRES, BiCGSTAB | ILU, AMG |51| Dense | LU, Cholesky | None |52| Saddle point | Schur complement, Uzawa | Block preconditioner |5354## Script Outputs (JSON Fields)5556| Script | Key Outputs |57|--------|-------------|58| `scripts/solver_selector.py` | `recommended`, `alternatives`, `notes` |59| `scripts/convergence_diagnostics.py` | `rate`, `stagnation`, `recommended_action` |60| `scripts/sparsity_stats.py` | `nnz`, `density`, `bandwidth`, `symmetry` |61| `scripts/preconditioner_advisor.py` | `suggested`, `notes` |62| `scripts/scaling_equilibration.py` | `row_scale`, `col_scale`, `notes` |63| `scripts/residual_norms.py` | `residual_norms`, `relative_norms`, `converged` |6465## Workflow66671. **Characterize matrix** - symmetry, definiteness, sparsity682. **Analyze sparsity** - Run `scripts/sparsity_stats.py`693. **Select solver** - Run `scripts/solver_selector.py`704. **Choose preconditioner** - Run `scripts/preconditioner_advisor.py`715. **Apply scaling** - If ill-conditioned, use `scripts/scaling_equilibration.py`726. **Monitor convergence** - Use `scripts/convergence_diagnostics.py`737. **Diagnose issues** - Check residual history with `scripts/residual_norms.py`7475## Conversational Workflow Example7677**User**: My GMRES solver is stagnating after 50 iterations. The residual drops to 1e-3 then stops improving.7879**Agent workflow**:801. Diagnose convergence:81 ```bash82 python3 scripts/convergence_diagnostics.py --residuals 1,0.1,0.01,0.005,0.003,0.002,0.002,0.002 --json83 ```842. Check for preconditioning advice:85 ```bash86 python3 scripts/preconditioner_advisor.py --matrix-type nonsymmetric --sparse --stagnation --json87 ```883. Recommend: Increase restart parameter, try ILU(k) with higher k, or switch to AMG.8990## Pre-Solve Checklist9192- [ ] Confirm matrix symmetry/definiteness93- [ ] Decide direct vs iterative based on size and sparsity94- [ ] Set residual tolerance relative to physics scale95- [ ] Choose preconditioner appropriate to matrix structure96- [ ] Apply scaling/equilibration if needed97- [ ] Track convergence and adjust if stagnation occurs9899## CLI Examples100101```bash102# Analyze sparsity pattern103python3 scripts/sparsity_stats.py --matrix A.npy --json104105# Select solver for SPD sparse system106python3 scripts/solver_selector.py --symmetric --positive-definite --sparse --size 1000000 --json107108# Get preconditioner recommendation109python3 scripts/preconditioner_advisor.py --matrix-type spd --sparse --json110111# Diagnose convergence from residual history112python3 scripts/convergence_diagnostics.py --residuals 1,0.2,0.05,0.01 --json113114# Apply scaling115python3 scripts/scaling_equilibration.py --matrix A.npy --symmetric --json116117# Compute residual norms118python3 scripts/residual_norms.py --residual 1,0.1,0.01 --rhs 1,0,0 --json119```120121## Error Handling122123| Error | Cause | Resolution |124|-------|-------|------------|125| `Matrix file not found` | Invalid path | Check file exists |126| `Matrix must be square` | Non-square input | Verify matrix dimensions |127| `Residuals must be positive` | Invalid residual data | Check input format |128129## Interpretation Guidance130131### Convergence Rate132133| Rate | Meaning | Action |134|------|---------|--------|135| < 0.1 | Excellent | Current setup optimal |136| 0.1 - 0.5 | Good | Acceptable for most problems |137| 0.5 - 0.9 | Slow | Consider better preconditioner |138| > 0.9 | Stagnation | Change solver or preconditioner |139140### Stagnation Diagnosis141142| Pattern | Likely Cause | Fix |143|---------|--------------|-----|144| Flat residual | Poor preconditioner | Improve preconditioner |145| Oscillating | Near-singular or indefinite | Check matrix, try different solver |146| Very slow decay | Ill-conditioned | Apply scaling, use AMG |147148## Limitations149150- **Large dense matrices**: Direct solvers may run out of memory151- **Highly indefinite**: Standard preconditioners may fail152- **Saddle-point**: Requires specialized block preconditioners153154## References155156- `references/solver_decision_tree.md` - Selection logic157- `references/preconditioner_catalog.md` - Preconditioner options158- `references/convergence_patterns.md` - Diagnosing failures159- `references/scaling_guidelines.md` - Equilibration guidance160161## Version History162163- **v1.1.0** (2024-12-24): Enhanced documentation, decision guidance, examples164- **v1.0.0**: Initial release with 6 solver analysis scripts