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 |
Security
The linear-solvers scripts enforce the following safeguards when processing external data:
- Pickle-safe loading:
np.load() is called with allow_pickle=False to prevent arbitrary code execution via crafted .npy files.
- File size limits: Matrix files are rejected if they exceed 500 MB before any parsing occurs.
- Matrix dimension limits: Loaded matrices are capped at 100,000 per dimension to prevent memory exhaustion.
- Input length limits: Comma-separated residual/vector inputs are capped at 100,000 entries.
- Finite-value validation: All numeric inputs (residuals, tolerances, matrix entries) are validated as finite numbers.
- Size bounds: The
solver_selector.py --size parameter is bounded at 10 billion.
- Reduced tool surface: The skill's
allowed-tools excludes Bash to prevent the agent from executing arbitrary commands when processing untrusted matrix files or numeric inputs.
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---5
6# Linear Solvers
7
8## Goal
9
10Provide a universal workflow to select a solver, assess conditioning, and diagnose convergence for linear systems arising in numerical simulations.
11
12## Requirements
13
14- Python 3.8+
15- NumPy, SciPy (for matrix operations)
16- See individual scripts for dependencies
17
18## Inputs to Gather
19
20| 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⁶` |
27
28## Decision Guidance
29
30### Solver Selection Flowchart
31
32```
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 preconditioner
38 │ └── NO → Use MINRES
39 └── NO → Is it nearly symmetric?
40 ├── YES → Use BiCGSTAB
41 └── NO → Use GMRES with ILU/AMG
42```
43
44### Quick Reference
45
46| 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 |
53
54## Script Outputs (JSON Fields)
55
56| 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` |
64
65## Workflow
66
671. **Characterize matrix** - symmetry, definiteness, sparsity
682. **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`
74
75## Conversational Workflow Example
76
77**User**: My GMRES solver is stagnating after 50 iterations. The residual drops to 1e-3 then stops improving.
78
79**Agent workflow**:
801. Diagnose convergence:
81 ```bash
82 python3 scripts/convergence_diagnostics.py --residuals 1,0.1,0.01,0.005,0.003,0.002,0.002,0.002 --json
83 ```
842. Check for preconditioning advice:
85 ```bash
86 python3 scripts/preconditioner_advisor.py --matrix-type nonsymmetric --sparse --stagnation --json
87 ```
883. Recommend: Increase restart parameter, try ILU(k) with higher k, or switch to AMG.
89
90## Pre-Solve Checklist
91
92- [ ] Confirm matrix symmetry/definiteness
93- [ ] Decide direct vs iterative based on size and sparsity
94- [ ] Set residual tolerance relative to physics scale
95- [ ] Choose preconditioner appropriate to matrix structure
96- [ ] Apply scaling/equilibration if needed
97- [ ] Track convergence and adjust if stagnation occurs
98
99## CLI Examples
100
101```bash
102# Analyze sparsity pattern
103python3 scripts/sparsity_stats.py --matrix A.npy --json
104
105# Select solver for SPD sparse system
106python3 scripts/solver_selector.py --symmetric --positive-definite --sparse --size 1000000 --json
107
108# Get preconditioner recommendation
109python3 scripts/preconditioner_advisor.py --matrix-type spd --sparse --json
110
111# Diagnose convergence from residual history
112python3 scripts/convergence_diagnostics.py --residuals 1,0.2,0.05,0.01 --json
113
114# Apply scaling
115python3 scripts/scaling_equilibration.py --matrix A.npy --symmetric --json
116
117# Compute residual norms
118python3 scripts/residual_norms.py --residual 1,0.1,0.01 --rhs 1,0,0 --json
119```
120
121## Error Handling
122
123| 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 |
128
129## Interpretation Guidance
130
131### Convergence Rate
132
133| 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 |
139
140### Stagnation Diagnosis
141
142| 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 |
147
148## Security
149
150The linear-solvers scripts enforce the following safeguards when processing external data:
151
152- **Pickle-safe loading**: `np.load()` is called with `allow_pickle=False` to prevent arbitrary code execution via crafted `.npy` files.
153- **File size limits**: Matrix files are rejected if they exceed 500 MB before any parsing occurs.
154- **Matrix dimension limits**: Loaded matrices are capped at 100,000 per dimension to prevent memory exhaustion.
155- **Input length limits**: Comma-separated residual/vector inputs are capped at 100,000 entries.
156- **Finite-value validation**: All numeric inputs (residuals, tolerances, matrix entries) are validated as finite numbers.
157- **Size bounds**: The `solver_selector.py` `--size` parameter is bounded at 10 billion.
158- **Reduced tool surface**: The skill's `allowed-tools` excludes `Bash` to prevent the agent from executing arbitrary commands when processing untrusted matrix files or numeric inputs.
159
160## Limitations
161
162- **Large dense matrices**: Direct solvers may run out of memory
163- **Highly indefinite**: Standard preconditioners may fail
164- **Saddle-point**: Requires specialized block preconditioners
165
166## References
167
168- `references/solver_decision_tree.md` - Selection logic
169- `references/preconditioner_catalog.md` - Preconditioner options
170- `references/convergence_patterns.md` - Diagnosing failures
171- `references/scaling_guidelines.md` - Equilibration guidance
172
173## Version History
174
175- **v1.1.0** (2024-12-24): Enhanced documentation, decision guidance, examples
176- **v1.0.0**: Initial release with 6 solver analysis scripts