See the deviation, not just the claim
Every row here is regressed live against a named, cited dataset with a stated acceptance tolerance. Expand any row for the parity plot, or run the exact case yourself.
| Binary pair | Package | Bubble-T AAD | Vapor-y AAD | Points | Status | |
|---|---|---|---|---|---|---|
Ethanol-Water (NRTL) Gmehling & Onken, DECHEMA Vol. I; Carey & Lewis (1932). 101.3 kPa. | nrtl | 0.18 K/ ≤ 1 K | 0.0043/ ≤ 0.02 | 9 | Pass | |
Ethanol-Water (UNIQUAC) Gmehling & Onken, DECHEMA Vol. I; Carey & Lewis (1932). 101.3 kPa. | uniquac | 0.10 K/ ≤ 1.2 K | 0.0029/ ≤ 0.025 | 9 | Pass | |
Methanol-Water (NRTL) Dunlop (1948) smoothed data via Perry's Chemical Engineers' Handbook. 101.3 kPa. | nrtl | 0.06 K/ ≤ 1 K | 0.0063/ ≤ 0.02 | 9 | Pass | |
Benzene-Toluene (Peng-Robinson) Perry's Chemical Engineers' Handbook; near-ideal benzene-toluene at 101.3 kPa. | peng-robinson | 0.13 K/ ≤ 2 K | 0.0035/ ≤ 0.03 | 9 | Pass | |
Benzene-Toluene (Soave-RK) Perry's Chemical Engineers' Handbook; near-ideal benzene-toluene at 101.3 kPa. | srk | 0.24 K/ ≤ 2 K | 0.0026/ ≤ 0.03 | 9 | Pass |
AAD = average absolute deviation vs. cited experimental data. Generated 10/22/2026, 4:24:08 PM.
Measured VLE at corpus scale — NIST TRC ThermoML Archive
378 binary pairs / 13,823 measured tie-lines, vendored in this repository. For every measured (T, x) the model is asked what vapour is in equilibrium with that liquid; the number is the average absolute deviation in vapour mole fraction.
| Package | Coverage | Median AAD (y) / tol | Mean AAD (y) | Worst pairs | Status |
|---|---|---|---|---|---|
| nrtl | 75%(45/60) | 0.0090/ 0.08 | 0.0174 | methanol–n_butane 0.074 octafluorocyclobutane–octafluoropropane 0.068 n_butane–propane 0.048 | Pass |
| peng-robinson | 100%(60/60) | 0.0176/ 0.08 | 0.0409 | 3_methylamino_propylamine–water 0.436 gamma_valerolactone–water 0.191 n_hexane–sec_butanol 0.125 | Pass |
| srk | 100%(60/60) | 0.0196/ 0.08 | 0.0432 | 3_methylamino_propylamine–water 0.467 gamma_valerolactone–water 0.163 n_hexane–sec_butanol 0.116 | Pass |
Coverage qualifies the deviation and is reported next to it deliberately. NRTL is the most accurate here but only reaches the binaries it has fitted interaction parameters for; the cubics reach nearly every pair in the corpus at roughly twice the deviation. That trade is the result, not a footnote. The gate is on the median rather than per pair — a sweep of arbitrary binaries legitimately contains systems no general-purpose package fits.
Component attribution in the source archive is inferred, not read: the rendering mislabels which component a composition belongs to, so labels are resolved by a pure-component saturation-pressure tie-break that corrected 23% of datasets. The tie-break uses only pure-component data, independent of the mixture models scored here — but it is an inference, and it travels with these numbers.
Pure-component property path — measured against NIST ThermoML
1,490 components, 85,825 measured points. Scores the component databank's own liquid-property path: only 431 of 6,745 components carry a regressed DIPPR block, so for the rest every property is a corresponding-states estimate.
| Property | Method | Components / points | Median error | p90 |
|---|---|---|---|---|
| liquid viscosity | DIPPR (regressed)control | 140 / 3,807 | 1.8% | 10% |
| liquid viscosity | Letsou-Stielestimate | 265 / 4,143 | 70.3% | 95% |
| liquid viscosity | Letsou-Stiel (group-contribution criticals)estimate | 57 / 686 | 69.6% | 88% |
| liquid viscosity | ThermoML fit (hold-out)estimate | 160 / 2,911 | 1.2% | 4% |
| liquid thermal conductivity | DIPPR (regressed)control | 61 / 939 | 2.6% | 7% |
| liquid thermal conductivity | Sato-Riedelestimate | 68 / 1,106 | 11.1% | 29% |
| liquid thermal conductivity | Sato-Riedel (group-contribution criticals)estimate | 5 / 86 | 7.6% | 17% |
| liquid thermal conductivity | ThermoML fit (hold-out)estimate | 37 / 812 | 0.2% | 1% |
| surface tension | DIPPR (regressed)control | 92 / 1,436 | 1.0% | 4% |
| surface tension | Brock-Birdestimate | 156 / 1,614 | 6.6% | 47% |
| surface tension | Brock-Bird (group-contribution criticals)estimate | 27 / 220 | 7.0% | 42% |
| surface tension | ThermoML fit (hold-out)estimate | 57 / 835 | 0.2% | 1% |
| vapor pressure | DIPPR (regressed)control | 190 / 5,993 | 1.4% | 18% |
| vapor pressure | Lee-Keslerestimate | 519 / 11,879 | 9.5% | 85% |
| vapor pressure | Lee-Kesler (group-contribution criticals)estimate | 319 / 6,726 | 33.8% | 152% |
| vapor pressure | ThermoML fit (hold-out)estimate | 341 / 8,275 | 0.8% | 2% |
| liquid heat capacity | DIPPR (regressed)control | 72 / 1,913 | 1.5% | 7% |
| liquid heat capacity | Rowlinson-Bondiestimate | 62 / 1,374 | 4.7% | 14% |
| liquid heat capacity | Rowlinson-Bondi (group-contribution criticals)estimate | 68 / 1,564 | 4.1% | 18% |
| liquid heat capacity | ThermoML fit (hold-out)estimate | 225 / 6,911 | 0.1% | 0% |
| liquid density | DIPPR (regressed)control | 175 / 5,581 | 0.1% | 0% |
| liquid density | COSTALDestimate | 479 / 8,907 | 3.1% | 11% |
| liquid density | COSTALD (group-contribution criticals)estimate | 165 / 1,572 | 5.8% | 17% |
| liquid density | ThermoML fit (hold-out)estimate | 331 / 7,275 | 0.0% | 0% |
| liquid density compressed | saturated value (no pressure term)estimate | 242 / 13,082 | 2.1% | 8% |
| liquid density compressed | Thomson-Brobst-Hankinsonestimate | 242 / 13,082 | 0.5% | 2% |
| heat of vaporization | Clausius-Clapeyron on Psat (ideal vapour)estimate | 266 / 328 | 3.9% | 31% |
| heat of vaporization | h_V - h_L (databank)estimate | 266 / 328 | 4.1% | 26% |
The DIPPR rows are a control, not a result: a regressed correlation scored against the data it was regressed from must come out tight, and that is what makes the estimated rows interpretable rather than merely asserted. Letsou-Stiel viscosity measures at roughly twice its own published error.
Still open: liquid density has no corresponding-states fallback, so 24,343 components carry criticals but cannot produce one. Vapour pressure had the same hole until Lee-Kesler was measured on this corpus and wired in.
Wax appearance temperature — measured against NIST ThermoML
37 liquidus curves and 619 measured points: C16–C44 n-paraffins in 11 solvents. Each point is a measured wax appearance temperature.
| Liquid model | Mean error | Bias | Points |
|---|---|---|---|
| Ideal liquid | 1.85 K | -0.34 K | 619 |
| UNIFAC-Dortmund (default, gated) | 1.15 K | -0.38 K | 619 |
| Peng-Robinson, no binary parameter | 7.20 K | +6.66 K | 619 |
With fusion enthalpies alone, as a handbook table gives them, the mean error is 5.8 K (bias -5.8 K), against 1.3 K with every crystal transition.
Estimated solid data, checked by leaving each measured paraffin out of the fit: mean error 2.0 K.
Solid–liquid solubility — measured against NIST ThermoML
65 measured solubility curves, 565 points, over 41 solute/solvent pairs. Both of the solver's solubility models are scored on log10(x), because solubility here spans four decades.
| Model | Median error | Mean error | Pairs |
|---|---|---|---|
| Ideal (van 't Hoff) line | 0.45 decades | 0.93 decades | 41 |
| UNIFAC activity coefficient | 0.41 decades | 0.81 decades | 41 |
How much each model says the solvent matters
The accuracy columns above are a dead heat, which is why they are not the headline. The ideal line contains no property of the solvent at all, so its spread across a solute's solvents is exactly zero decades — it cannot rank two solvents. Measurement spreads by one to four.
| Solute | Solvents | Measured | Ideal line | UNIFAC |
|---|---|---|---|---|
| acetylsalicylic acid | 4 | 0.39 | 0.00 | 0.78 |
| benzoic acid | 8 | 2.66 | 0.00 | 2.54 |
| citric acid | 7 | 0.41 | 0.00 | 5.32 |
| ibuprofen | 5 | 4.37 | 0.00 | 5.34 |
| salicylic acid | 6 | 2.77 | 0.00 | 0.81 |
| stearic acid | 5 | 0.51 | 0.00 | 0.56 |
| xylitol | 6 | 3.63 | 0.00 | 6.35 |
UNIFAC earns that where it counts — ibuprofen in water is 4.3 decades out on the ideal line and 0.9 on UNIFAC — but it is worse in the good solvents, where γ ≈ 1 makes the ideal line nearly exact, and it overshoots the size of the solvent effect (citric acid varies half a decade across its solvents; UNIFAC says five). Screening-grade for ranking a solvent, not for a yield.
Component attribution in the source rendering is inferred, not read: a curve is kept only when exactly one component melts above the measured range and the other below it, and only in the reading whose solubility rises with temperature (ΔH_fus > 0). That tie-break corrected 62% of the curves kept, so the labelling is this corpus's own inference.
CO2 transport — mixture density measured against NIST ThermoML
2,717 measured densities of CO2 with argon, co, ethane, h2s, methane, n2, oxygen, so2, in gas, liquid and supercritical states. Each package's own flash chooses the phase.
| Package | All points | Dense phase (≥80% CO2, ≥70 bar) | Dense-phase bias | False two-phase calls |
|---|---|---|---|---|
| peng-robinson | 2.46% | 3.14% | +1.00% | 19 |
| srk | 4.79% | 8.42% | -8.40% | 10 |
| gerg-2008 | 0.75% | 0.97% | +0.34% | 23 |
Component labels in the archive were settled against CoolProp's multiparameter model, so the gerg-2008 row checks this product's wrapper rather than GERG-2008 independently.
Hydrogen solubility — measured against NIST ThermoML
305 measured hydrogen mole fractions in the liquid, over 19 partners from methane at 100 K to squalane at 870 bar. They set the hydrogen binary parameters of both cubic packages.
| Package | Hydrocarbon class k_ij | Held-out partner error | Error at k_ij = 0 |
|---|---|---|---|
| peng-robinson | 0.34 | 7.6% | 45.7% |
| srk | 0.32 | 9.3% | 30.6% |
The database rows these replace put k_ij = −0.5 on benzene, cyclohexane, n_decane, toluene, which overpredicts measured hydrogen solubility by 108–251%.
Measured partners use values fitted to their own points, so their error is in-sample. The held-out column is not: each hydrocarbon partner is scored with the value fitted to the others, which is what an unmeasured hydrocarbon receives.
MESH solver vs. the exact analytical solution
The production distillation solver run on a synthetic constant-α, constant-molal-overflow binary — the one case where McCabe-Thiele and Fenske are exact. The reference is a different algorithm (sequential stage march with shooting), so agreement tests the solver rather than restating it.
x_D 0.888625 vs 0.888625 · x_B 0.111375 vs 0.111375 · α 2, N 12, R 2
McCabe & Thiele, Ind. Eng. Chem. 17, 605 (1925) / Lewis (1922) operating-line staircase; Fenske, Ind. Eng. Chem. 24, 482 (1932) total-reflux limit — both exact for a constant-relative-volatility, constant-molal-overflow binary.
Rigorous column — measured solve time and residual
Real wall-clock timing of the Boston-Sullivan inside-out MESH solver at increasing stage counts, measured on this run.
| Case | Stages | Solve time | Residual | Status |
|---|---|---|---|---|
| 5 stages Small stripper / rough-cut column | 5 | 0.21 s | 4.4e-7 | converged |
| 8 stages Standard binary distillation | 8 | 0.82 s | 9.1e-7 | converged |
| 12 stages High-purity binary split | 12 | 1.23 s | 9.6e-7 | converged |
Timed on the server that generated this report, so absolute times reflect its hardware and current load — the point is the trend with stage count and that every case converges, not the seconds.
Ideal-gas heat capacity vs. independent compilations (TRC, Poling)
| Population | Coverage | Median |dev| | p90 |dev| | Status |
|---|---|---|---|---|
| Correlations the solver uses254/382 | 66% | 0.27% | 1.52% | validation.table.pass |
| CoolProp-shadowed (never evaluated)42/48 | 88% | 0.21% | 0.97% | validation.table.pass |
5 correlation(s) found wrong beyond the threshold are superseded at runtime by the TRC coefficients and are therefore listed here rather than scored: ethyl_chloride, ethylene_carbonate, ethylene_glycol, nitrogen_trioxide, acrylic_acid.
Matched by CAS against the TRC gas tables and Poling, Prausnitz & O'Connell 5th ed. Appendix A, each evaluated only inside its own stated temperature range. Both populations are shown because a CoolProp cross-check can only see the shadowed ones — which are exactly the correlations the solver never evaluates. This tests transcription, units and equation dispatch against independent compilations of overlapping experimental literature; it is not an independent measurement.
Electrolyte activity coefficients (B-dot vs. Pitzer)
| Model | Ionic strength | Model γ | Literature γ | Source | Status |
|---|---|---|---|---|---|
| NaCl mean activity coefficient (B-dot) | 1 mol/kg | 0.6620 | 0.6570 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
| NaCl mean activity coefficient (B-dot) | 2 mol/kg | 0.6760 | 0.6680 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
| NaCl mean activity coefficient (B-dot) | 3 mol/kg | 0.7139 | 0.7140 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
| NaCl mean activity coefficient (B-dot) | 4 mol/kg | 0.7641 | 0.7830 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
| NaCl mean activity coefficient (Pitzer) | 1 mol/kg | 0.6549 | 0.6570 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
| NaCl mean activity coefficient (Pitzer) | 2 mol/kg | 0.6666 | 0.6680 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
| NaCl mean activity coefficient (Pitzer) | 3 mol/kg | 0.7122 | 0.7140 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
| NaCl mean activity coefficient (Pitzer) | 4 mol/kg | 0.7810 | 0.7830 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
| NaCl mean activity coefficient (Pitzer) | 6 mol/kg | 0.9865 | 0.9860 | Hamer & Wu, J. Phys. Chem. Ref. Data 1, 1047 (1972); NaCl, 25 degC. | Pass |
Saturation pressure (Antoine / EoS)
| T (K) | Model Psat | Reference Psat | Deviation | Source | Status |
|---|---|---|---|---|---|
| 373.15 | 101.42 kPa | 101.42 kPa | 0.002% | Cengel & Boles, "Thermodynamics: An Engineering Approach", Table A-4 (IAPWS-IF97). | Pass |
| 393.15 | 198.67 kPa | 198.67 kPa | 0.002% | Cengel & Boles, "Thermodynamics: An Engineering Approach", Table A-4 (IAPWS-IF97). | Pass |
| 423.15 | 476.17 kPa | 476.16 kPa | 0.002% | Cengel & Boles, "Thermodynamics: An Engineering Approach", Table A-4 (IAPWS-IF97). | Pass |
| 443.15 | 792.19 kPa | 792.19 kPa | 0.000% | Cengel & Boles, "Thermodynamics: An Engineering Approach", Table A-4 (IAPWS-IF97). | Pass |
PC-SAFT — pure-component saturation & liquid density
| Component | Condition | Model value | Reference value | Deviation | Source | Status |
|---|---|---|---|---|---|---|
| propane | P=9.97e+05 Pa | 299.93 K | 300.00 K | 0.02% | NIST WebBook saturation data; Gross & Sadowski (2001) Table 1 parameters. | Pass |
| n_pentane | P=1.01e+05 Pa | 309.20 K | 309.20 K | 0.00% | NIST WebBook saturation data; Gross & Sadowski (2001) Table 1 parameters. | Pass |
| n_hexane | P=1.01e+05 Pa | 341.95 K | 341.90 K | 0.01% | NIST WebBook saturation data; Gross & Sadowski (2001) Table 1 parameters. | Pass |
| n_octane | P=1.01e+05 Pa | 398.98 K | 398.80 K | 0.05% | NIST WebBook saturation data; Gross & Sadowski (2001) Table 1 parameters. | Pass |
| benzene | P=1.01e+05 Pa | 353.50 K | 353.20 K | 0.09% | NIST WebBook saturation data; Gross & Sadowski (2001) Table 1 parameters. | Pass |
| ethane | P=2.66e+06 Pa | 277.68 K | 280.00 K | 0.83% | NIST WebBook saturation data; Gross & Sadowski (2001) Table 1 parameters. | Pass |
| co2 | P=1e+06 Pa | 231.53 K | 233.00 K | 0.63% | NIST WebBook saturation data; Gross & Sadowski (2001) Table 1 parameters. | Pass |
| co2 | T=240.0 K, P=1.28e+06 Pa | 1064.33 kg/m^3 | 1088.00 kg/m^3 | 2.18% | NIST WebBook liquid density; Gross & Sadowski (2001) Table 1 parameters. | Pass |
| n_heptane | T=298.1 K, P=1e+05 Pa | 672.49 kg/m^3 | 679.50 kg/m^3 | 1.03% | NIST WebBook liquid density; Gross & Sadowski (2001) Table 1 parameters. | Pass |
Distillation column — stage count vs. Fenske minimum
Actual converged stages compared against the Fenske minimum-reflux stage count for the same separation; ratio must fall in the expected design range.
| Feed / package | Actual stages | Fenske minimum | Ratio | Source | Status |
|---|---|---|---|---|---|
ethanol-water nrtl | 8 | 8.18 | 0.98×/ [0.9–2.5] | Fenske, Ind. Eng. Chem. 24, 482 (1932) — closed-form total-reflux min-stage equation. | Pass |
Azeotrope location
Predicted azeotrope composition and temperature compared against the cited experimental azeotrope for each system.
| Binary pair | Package | Composition (predicted / experimental) | Temperature (predicted / experimental) | Source | Status | |
|---|---|---|---|---|---|---|
ethanol-water azeotrope | nrtl | 89.07% / 89.40%Δ 0.33 / ≤ 2% | 351.40 / 351.30 KΔ 0.10 / ≤ 1 K | Gmehling & Onken, DECHEMA Vol. I; ethanol-water azeotrope 89.4 mol%, 78.15 degC, 1atm. | Pass |
Liquid-liquid equilibrium (LLE)
Checks whether the thermo package predicts the same two-phase liquid split the cited data shows, and how much of each component crosses into the other phase.
| System | T (K) | Two phases? | Minor-component carryover | Source | Status |
|---|---|---|---|---|---|
water/n_hexane miscibility gap | 298.15 | Yes | n_hexane in water: 0.009% / ≤ 0.50% water in n_hexane: 0.076% / ≤ 1.00% | Sorensen & Arlt, DECHEMA LLE Data Collection; water/n-hexane near-immiscibility, 25 C. | Pass |
Thermodynamic consistency (Gibbs-Duhem)
The Herington area-test D and J values for each VLE dataset; |D − J| within 10 flags the underlying data (not the model) as thermodynamically consistent.
| Binary pair | D | J | |D − J| / ≤ 10 | Source | Status |
|---|---|---|---|---|---|
Ethanol-Water (NRTL) | 11.0 | 7.4 | 3.6 | Gmehling & Onken, DECHEMA Vol. I; Carey & Lewis (1932). 101.3 kPa. | Consistent |
Ethanol-Water (UNIQUAC) | 11.0 | 7.4 | 3.6 | Gmehling & Onken, DECHEMA Vol. I; Carey & Lewis (1932). 101.3 kPa. | Consistent |
Methanol-Water (NRTL) | 22.1 | 9.6 | 12.5 | Dunlop (1948) smoothed data via Perry's Chemical Engineers' Handbook. 101.3 kPa. | marginal |
Benzene-Toluene (Peng-Robinson) | 45.1 | 10.1 | — | Perry's Chemical Engineers' Handbook; near-ideal benzene-toluene at 101.3 kPa. | Near-ideal |
Benzene-Toluene (Soave-RK) | 45.1 | 10.1 | — | Perry's Chemical Engineers' Handbook; near-ideal benzene-toluene at 101.3 kPa. | Near-ideal |
APC controller solve-time scaling
Timed benchmark of the real MIMO DMC quadratic-program solver,flowsim.apc.mimo_dmc.dmc_move, at increasing controller sizes — measured, not projected.
| Controller size | P / M horizon | Decision vars | Solve time | Optimality residual | Target application | Status |
|---|---|---|---|---|---|---|
| 2 × 4 (unit scale) | 20 / 5 | 10 | 0.03 ms/ ≤ 1000 ms | 4.6e-16 | Local flow loops | Pass |
| 5 × 10 (process loop) | 20 / 5 | 25 | 0.05 ms/ ≤ 1000 ms | 4.2e-16 | Standard unit ops | Pass |
| 10 × 20 (unit wide) | 30 / 10 | 100 | 0.51 ms/ ≤ 1000 ms | 8.2e-16 | Crude tower section | Pass |
| 20 × 40 (area wide) | 30 / 10 | 200 | 5.21 ms/ ≤ 1000 ms | 1.3e-15 | Fractionation area | Pass |
| 50 × 100 (plant wide) | 30 / 10 | 500 | 40.83 ms/ ≤ 1000 ms | 1.9e-15 | Plant-wide refinery network | Pass |
Protocol: Each row solves the QP end-to-end on this box and reports wall-clock time against the scan-budget ceiling for that controller class.
Optimality residual is the KKT stationarity norm ‖∇L‖∞ at the solver's terminal iterate — near zero confirms the QP actually converged, not just that it stopped.
RTO cycle-solve scaling
Timed benchmark of the real plant-wide multistart Ipopt NLP,flowsim.solver.rto.run_rto_schedule, at increasing multistart-restart counts — measured, not projected.
| Multistart restarts | Solve time | Objective ($/cycle) | Engine | Status |
|---|---|---|---|---|
| 1 multistart | 11.3 ms/ ≤ 1000 ms | $250.00 | Plant-wide NLP (CasADi/Ipopt, multistart) | Pass |
| 4 multistarts | 53.0 ms/ ≤ 1000 ms | $250.00 | Plant-wide NLP (CasADi/Ipopt, multistart) | Pass |
| 8 multistarts | 73.7 ms/ ≤ 1000 ms | $250.00 | Plant-wide NLP (CasADi/Ipopt, multistart) | Pass |
| 16 multistarts | 126.6 ms/ ≤ 1000 ms | $250.00 | Plant-wide NLP (CasADi/Ipopt, multistart) | Pass |
Per-model acceptance cases
Beyond the binary-VLE sweeps above, each of these binds one model to one published dataset, one acceptance metric and one tolerance — the electrolyte, equation-of-state and solubility models a VLE parity plot can't score. 8 of 8 pass. Recomputed live from the shipped code.
| Model / property | Reference dataset | N | Metric | Tolerance | Verdict |
|---|---|---|---|---|---|
| eNRTL CO₂-MEA VLEp_CO₂ vs. loading [Pa] | Jou, Otto & Mather (1995), Can. J. Chem. Eng. 73, 140 — 30 wt% MEA, 313.15 K | 4 | 0.289log10 AAD | 0.450 | pass |
| NRTL ethanol-water VLEbubble temperature [K] | Gmehling & Onken, DECHEMA VLE Data Coll. Vol. I (Carey & Lewis 1932), 101.3 kPa | 9 | 0.178AAD | 1.00 | pass |
| NRTL ethanol-water VLEvapor ethanol fraction [mol frac] | Gmehling & Onken, DECHEMA VLE Data Coll. Vol. I (Carey & Lewis 1932), 101.3 kPa | 9 | 0.00435AAD | 0.0200 | pass |
| Pitzer NaCl activitymean ionic activity coeff. γ± [dimensionless] | Hamer & Wu (1972), J. Phys. Chem. Ref. Data 1, 1047 — NaCl(aq), 298.15 K | 5 | 0.00216rel. AAD | 0.0100 | pass |
| SAFT-VR Mie methane densitysaturated-liquid density [kg/m³] | Lafitte et al. (2013), J. Chem. Phys. 139, 154504 — methane, NIST sat. liquid | 5 | 0.00734rel. AAD | 0.0100 | pass |
| CPA water saturationsaturation temperature vs. pressure [K] | NIST/IAPWS-IF97 steam tables — water saturation line, 10-500 kPa | 5 | 0.234AAD | 0.500 | pass |
| Peng-Robinson speed of soundspeed of sound [m/s] | NIST reference acoustic data — CH₄ ~450, N₂ ~353, CO₂ ~270 m/s at 300 K, 1 bar | 3 | 0.00124rel. AAD | 0.0100 | pass |
| Scale-mineral solubility (Ksp)mineral solubility in pure water [mol/L] | Blount (1977) barite 1.04e-5; CRC fluorite ~2.05e-4 / gypsum ~1.53e-2 mol/L | 3 | 0.0366rel. AAD | 0.0600 | pass |
Numerical-robustness leaderboard
The cases that break solvers — near-critical flashes, spurious-root bubble points, phase boundaries, azeotrope pinches, tight recycles, singular Jacobians — run live through the real engine, each with its measured outcome. Every number is recomputed on load, not stored.
An isenthalpic flash of a mixed refrigerant into the cryogenic cold end; a naive subcooled bracket floors at ~180 K and returns the wrong temperature.
Measured: recovered 170.2 K, vapour fraction 0.469 — in the cold end below 180 K
C3MR liquefaction cold end (110-230 K); subcooled / JT physics (Peng-Robinson).
A wide relative-volatility spread makes the incipient-phase iteration prone to collapsing onto the heaviest pure component's saturation temperature (a spurious root).
Measured: bubble point 222.7 K (pure ethane 220.4 K, pure n-pentane 365.9 K); K-value spread 2.0e+02
92% ethane / propane / butane / pentane at 5 bar; true bubble point sits just above pure ethane's 220.4 K, not near pure n-pentane's 365.9 K.
At the phase boundary the Rachford-Rice root sits exactly at 0 or 1; a naive Newton or unclamped bracket walks outside the physical [0,1] window and diverges.
Measured: psi(all-liquid)=0.00e+00 (=>0), psi(all-vapour)=1.000000 (=>1)
Analytic edges: every K<1 => psi=0; every K>1 => psi=1.
The relative volatility crosses 1 at the azeotrope; a model that misplaces it makes every distillation result past the pinch wrong even when the AAD looks fine.
Measured: located x=0.891 vs 0.894 (dev 0.003), T=351.40 vs 351.30 K (dev 0.10 K)
Gmehling & Onken, DECHEMA Vol. I; ethanol-water azeotrope 89.4 mol%, 78.15 degC, 1atm.
A tight (~5:1) material recycle: the tear fixed point converges slowly and can oscillate; sequential-modular needs many accelerated passes to close the loop.
Measured: converged in 26 recycle passes, tear residual 6.14e-07
high-recycle-ammonia-eo; sequential-modular closes the tear via Wegstein acceleration (the equation-oriented mode closes all stream unknowns in one solve).
An under/over-determined flowsheet has a singular Jacobian; legacy simulators report a cryptic 'Singular Jacobian' code with no location or cause.
Measured: DoF +2, 0 floating variable(s); explained: 2 degree(s) of freedom — system is under-determined
Structural degrees-of-freedom / floating-variable analysis (eo_diagnostics) — the same view surfaced in the in-app Solver Diagnostics panel.
Hand-picked hard cases can only cover what someone thought to try; a seeded sweep of thousands of random (T,P,composition) states hammers the flash across the whole phase envelope — subcooled, two-phase and superheated — and asserts the invariants every flash must satisfy (no NaN, psi in [0,1], normalized phases, and the lever rule z=(1-psi)x+psi y).
Measured: 3000/3000 random flash states survived every invariant (worst lever-rule residual 1.4e-13, tol 1e-06); 2000/2000 Rachford-Rice cases clean
Property-based testing of the (T,P) flash + Rachford-Rice; deterministic (seeded), run in CI and expandable to millions of states offline with no cloud infra.
Validation history
Every milestone adds cited validations, fixes regressions, improves convergence, or reproduces new literature — the honest "quality is increasing" signal, not one snapshot.
- Numerical-robustness leaderboard2026-08
- Added
- Published robustness leaderboard: near-critical cryogenic (P,H) flash, wide-boiling spurious-root bubble point, Rachford-Rice edges, ethanol-water azeotrope pinch, tight ammonia recycle, and structural singular-Jacobian detection — each run live through the real solver with its measured outcome.
- MESH Levenberg-Marquardt globalization2026-07-30
- Added
- Near-azeotropic extractive-column convergence guard (CO2/ethane with an n-decane entrainer) in the inside-out MESH Newton.
- Fixed
- Unconverged distillation columns now return a physically self-consistent best-iterate partial (every stage T is its own composition's bubble point), not the last swing.
- Convergence
- Levenberg-Marquardt globalization crosses the near-pinch region where the pure-Newton line search stalled; co2-ethane and light-ends columns that previously fell to the successive-substitution fallback now converge to ~1e-6.
- Component-balance convergence gate + mass-conservation audit2026-07-28
- Added
- Whole-catalog per-unit mole-conservation audit with an executable ledger of known internal leaks; a column is accepted as converged only if its global feed-vs-products component balance closes.
- Fixed
- Indefensible columns (17-63% single-component imbalance) are now honestly reported unconverged instead of a false 'converged'.
- Complex-op cited-reference gates (SMB / Petlyuk / VPSA)2026-07-28
- Added
- Simulated Moving Bed vs triangle theory (Storti/Mazzotti/Morbidelli 1993). · Petlyuk dividing-wall energy saving against Triantafyllou-Smith (1992), 20-30% band. · VPSA 13X N2/O2 Langmuir loadings against Data in Brief (2020), within 5%.
- Fixed
- Cryogenic (P,H) flash subcooled floor lowered 180 K -> 90 K (LNG cold end no longer clamped to a wrong temperature). · Wide-relative-volatility bubble point no longer collapses to the heaviest pure component's spurious saturation root.
- Literature
- Triangle theory; Triantafyllou-Smith DWC saving; 13X adsorption isotherms.
- Thermodynamic-rigor gates2026-07
- Added
- PC-SAFT bubble-T + liquid density vs NIST WebBook / Gross & Sadowski (2001). · Pitzer NaCl activity coefficient vs Hamer & Wu (1972), ~0.3% to I=6 mol/kg. · Herington (1951) thermodynamic-consistency test on every cited VLE set. · UNIFAC liquid-liquid equilibrium vs Sorensen & Arlt DECHEMA solubility bounds. · Rigorous MESH column cross-checked against the Fenske minimum-stages shortcut.
- Literature
- DECHEMA / Carey & Lewis (1932) ethanol-water VLE + azeotrope; Dunlop (1948) methanol-water; Perry's benzene-toluene; IAPWS-IF97 water saturation.
Reproduce every number
Nothing above is pinned — it's recomputed live from the solver on every page load. We publish our inputs, our numbers, and the citation so the comparison is reproducible. We don't publish competitor numbers we didn't measure. To benchmark a competitor honestly: build the identical case in your own simulator (same components, package family, and conditions), read off the same quantity, and compare against the cited experimental reference — the ground truth both simulators are measured against.
# reproduce our numbers locally (no API key needed)
uv run python scripts/reproduce_validation.py
# or drive the same case through the Python SDK
from flowsim.sdk import FlowSimClient
client = FlowSimClient("https://maximalabs.io")
# ...build the cited case, run, and compare against the reference