Optimizer-tuned limiters: what pymoo NSGA-II found, and where it stops
A multi-objective optimizer searched the parameters of an adaptive k(gradient) flux limiter on the Sod shock tube. The same idea was tried on a stiff ODE. One small positive result, one clear negative.
GlobalMOO vs pymoo: Historical comparison
99.4%
lower chi-squared in that run; budgets not verified equal
Not a GlobalMOO advantage: this run's budgets were not verified equal. pymoo got 180 measured evaluations; GlobalMOO was configured for up to 200 loop iterations plus initial cases that were neither counted nor scored, and its actual total was not recorded. Fragility was on for GlobalMOO only. A preregistered rerun with equal measured budgets, on the June problem with its optimum moved off the box centre, read inconclusive (Wilcoxon p = 0.105), and its descriptive direction favours pymoo. The fair rerun and what it showed.
A separate problem (the canonical meta_calculus.moo_integration objectives, not the shock tube), seed 20260612. GlobalMOO reached chi-squared 0.00035 vs pymoo's 0.061; both saturate spectral gap and invariance at ~1.0. The file records a budget of 200 per engine, but for GlobalMOO that is 200 iterations: the service also evaluates its initial cases outside that budget, and this artifact records no measured total evaluation count for either engine. Equal total budgets are therefore not verified. Artifact: docs/simulations/globalmoo_vs_fallback_baseline.json. This is the only GlobalMOO run on this page; the shock tube results below are pymoo only.
Sod shock tube: a single-run result, not a proof
In one unseeded pymoo NSGA-II run, 10 of the 30 front points Pareto-dominate the Van Leer limiter on L2 error, TV excess and shock width. The best L2 is 0.65% below Van Leer. On the fixed-scheme comparison the best meta scheme (Meta-Adaptive) is 0.37% below Van Leer, which the project's honest status treats as a tie.
All numbers are computed from public/shock_tube_dual_moo.json and public/shock_tube_moo.json.
Shock Tube: Optimizer Front
How It Works
1. k(gradient) Function
Instead of a fixed k, a sigmoid of the normalized local gradient sets k cell by cell. Searched parameters: k_base, k_max, threshold, width (the solver only sees k_base + 0.5 k_max).
2. Optimizer
pymoo NSGA-II searches the 4D parameter box, scoring each candidate on L2 error, TV excess and shock width.
3. Pareto Front
The stored run keeps 30 non-dominated settings. 10 of them beat Van Leer on all three objectives; the rest trade L2 for lower oscillation.
Robertson Stiff ODE: Honest Results
Application Boundary
Worth trying
- - Tuning limiter parameters on a specific shock problem (gains are problem-specific)
- - Sensitivity studies of how optimizer choices change local outcomes
Did not work
- - Stiff ODEs: Meta-BDF k=0 needed 25,051 function evaluations vs LSODA's 916 (27x more)
- - Meta-BDF with k > 0 returned wrong answers (max error 1.00)
- - Sod-tuned parameters on Shu-Osher (re-run on the SSP-RK2 solver): L2 0.1304 vs superbee 0.1207, the best standard limiter (8.0% higher L2); the file's transfer change against the Shu-Osher-tuned parameters is -3.27%, verdict PROBLEM_SPECIFIC. The earlier transfer figure from the retracted solver is superseded.
Data Sources
results/shock_tube_dual_moo.json- Shock tube optimizer front (pymoo; GlobalMOO not_connected)results/shock_tube_moo.json- Fixed limiter comparisonresults/robertson_stiff_ode.json- Robertson benchmarkresults/cross_validation_results.json- Sod-to-Shu-Osher transfer (re-run on the SSP-RK2 solver)simulations/shock_tube_moo.py,simulations/robertson_stiff_ode.py