graph LR P["Preconditioner Families ๐งฐ"] --> GS["Gauss-Seidel ๐\nsimple, no setup"] P --> ILU["ILU ๐๏ธ\nILU0 / ILUT / ILUTP / MILU"] P --> AMG["AMG ๐\nBoomerAMG / ML"] style P fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px,color:#2e3440 style GS fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#2e3440 style ILU fill:#fff3e0,stroke:#e65100,stroke-width:3px,color:#2e3440 style AMG fill:#e3f2fd,stroke:#1565c0,stroke-width:3px,color:#2e3440
graph TD A["Large sparse system Ax = b\n(nonsymmetric)"] --> B{"Well-conditioned?\nAMG available?"} B -->|"Yes โ "| C["GMRES + Classical AMG\n(right preconditioning)"] B -->|"No / saddle-point โ ๏ธ"| D["BiCGSTAB + MILU\n(right preconditioning)"] C --> E["BoomerAMG: HMIS + FF1"] D --> F["Or ILUTP for\nmoderate sizes"] style A fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px,color:#2e3440 style B fill:#ffcdd2,stroke:#c62828,stroke-width:3px,color:#2e3440 style C fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#2e3440 style D fill:#fff3e0,stroke:#e65100,stroke-width:3px,color:#2e3440 style E fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#2e3440 style F fill:#fff3e0,stroke:#e65100,stroke-width:3px,color:#2e3440