Skip to content

Verification and validation ​

OpenFLUME is Alpha software. It was written by one engineer with heavy AI assistance (see "How This Was Built" in the README), so it has to be checked, not trusted. This page is the index to that evidence: what kind of evidence each result is, how the reports are produced, how often the checks run, and where the evidence stops.

The authoritative record is §8 of the user's manual. Before using a result to support a decision, read §1.7 Scope Boundaries as well.

Three classes of evidence ​

The manual (§8.1) separates three kinds of evidence. They mean different things, and a result should be cited with its class:

ClassCompared againstWhat a disagreement means
Analytic verificationA closed-form solution, or an independent reference (e.g. RK4 integration of the exact ODE) converged far below the solver's own toleranceA code defect, or discretization error that should shrink as the grid or time step is refined
Code-to-code benchmarkingPublished output of another established program (NASA GFSSP, SINDA/FLUINT sample decks, COMSOL results in papers)Supports the implementation, but inherits the other code's assumptions
Validation against experimentMeasured data, digitized with cited provenanceCould be the model, the closure correlation, the discretization, or the experiment

Where a correlation has research status or has not been validated, the manual says so and gives no agreement figure for it (§8.5).

How the reports are generated ​

Each of the seven reports below is written by a script in scripts/, which builds the cases, runs the current solver, computes the reference solutions, and writes the Markdown and SVG figures. None of the numbers are typed in by hand.

ReportGeneratorCI gate tests named in the report
Compressible flowscripts/compressible-validation-report.tssrc/core/__tests__/compressibleDuctFlow.test.ts
Incompressible hydraulicsscripts/hydraulics-validation-report.tssolver.test.ts, benchmarks.test.ts
Thermal networkscripts/thermal-validation-report.tsthermal.test.ts, solidThermalTransient.test.ts
Fluid transientscripts/fluid-transient-validation-report.tsfluidTransient.test.ts
Tank transientscripts/tank-transient-validation-report.tstransient.test.ts, benchmarks.test.ts
Combustionscripts/combustion-validation-report.tsreactingJunction.test.ts and the examples suite
Microfluidicsscripts/microfluidics-validation-report.tssrc/validation/__tests__/microfluidics.test.ts, plus rectChannel, capillaryChannel and flowScaledTolerance tests

To regenerate a report from a clone:

bash
npx tsx scripts/compressible-validation-report.ts

The scripts are run by hand. CI does not rewrite the reports. A report therefore shows the solver as it was when the report was last regenerated, while the gate tests named in its header recheck the same physics on every CI run.

CI cadence ​

From .github/workflows/ci.yml:

  • Every pull request and every push to main: lint, format check, the fast test tier (npm test), and a production build. A scientific-validation job runs every Vitest file (npm run test:all) and the fluid-catalogue drift check.
  • Push to main, weekly schedule (Mondays 03:17 UTC), and manual dispatch: the same scientific-validation job runs with RUN_SLOW=1, which turns on the expensive opt-in sweeps and convergence studies. On pull requests these slow blocks are skipped.
  • Python package: the wheel is built and the installed wheel is tested on Linux, macOS, and Windows.
  • End-to-end: the Playwright suite runs in four shards against the production build.

The test tiers are described in §8.6 and testing-slow.md.

The seven reports ​

The headline figures below are copied from each report's abstract or summary table. Each report gives the definitions, normalizations, and excluded stations behind its figures. Read those before quoting a number.

ReportCasesReferenceHeadline agreement
Compressible flow: recreation of the NASA GFSSP TFAWS-2007 study5 cases (Fanno, Rayleigh, combined, two nozzles), 7 grid configurationsRK4 of the generalized 1-D ODE, cross-checked with Fanno/Rayleigh closed formsWith central momentum faces: mass flow within 0.18 %, worst profile error 2.5 % (Rayleigh ΔP/P and ΔM/M). With the default upwind faces: mass flow 0.36–3.48 %, max ΔM/M 4.0 %. The original study reports 1.7–5 % for GFSSP
Incompressible hydraulics6 cases, 49 compared quantitiesClosed forms (Hagen–Poiseuille, Darcy–Weisbach, hydrostatics) and independently converged references (Hardy-Cross network, pump operating point)All 49 within 9.98e-10 %, which is the Newton tolerance (10⁻⁹). The friction closure and the reference are the same expression, so this verifies the network solve, not the friction law
Thermal network5 casesSeries resistance, radiation–convection balance, lumped capacitance, heated-pipe exponential, ε–NTUComposite wall 6.9e-14 %. Lumped cooldown within 0.18 % of span at dt = τ/100 (error ratio 4.01 for a 4× step refinement). 20-segment heat exchanger: effectiveness within 2.62 %, outlets within 1.730 K. The error shrinks as segmentation is refined
Fluid transient4 casesExact tanh/hyperbolic rigid-column laws, RK4 gas-spring oscillator, polytropic lawStartup/decay within 0.05 % RMS at the refined step. Oscillator period within 0.2 % (linearized) and 0.1 % (RK4). Method-of-characteristics water hammer is explicitly out of scope
Tank transient5 cases (including a 4-level dt study)RK4 of the lumped ODEs, choked blowdown closed form, equalization equilibrium, fill-heating limitEvery trace within 1.5 % at dt = 0.05 s. Mass conserved to 0.001 % or better. First-order convergence in dt confirmed
Combustion: CEA reacting junction and LOX/RP-1 thruster5 groups of checksCEA identities, choked-flow/orifice closed forms, RK4 quasi-1-D nozzle ODE, exact wall-resistance networkLocal nozzle profile error 3.16 % (subsonic) and 4.87 % (supersonic). Mass flow biased 3.01 % by the sonic cell. Wall temperatures 2.3e-13 K. Startup ramp vs. quasi-static reference 7.8e-5 %
Microfluidics5 closed-form cases (Part A) + 6 published networks (Part B)Shah & London, Washburn, Jurin; papers' COMSOL values, design values and measurementsDuct friction constant 0.002 %. Serial diluter inlet pressure 85.1 Pa vs. 85.2 Pa (COMSOL). Capillaric valve pressures within 1.3 %. Siphon flow 2.87 µL/s at nominal diameter vs. 3.63 ± 0.07 µL/s measured. The measurement lies inside the ±27 % flow band set by the stated diameter uncertainty

Most of these reports are analytic verification. The compressible report recreates a code-to-code study case for case, but its references are analytic. Part B of the microfluidics report mixes classes: COMSOL values are code-to-code, while the siphon, dilution-ratio, and bead-trap outcomes are compared with measurements.

Mach number along the Fanno-flow duct: OpenFLUME against the RK4 analytical reference

Fanno flow, Mach number along the duct, from the compressible-flow report.

Heat-exchanger effectiveness error against the number of wall segments

Counterflow heat-exchanger segmentation study, from the thermal-network report. The ε–NTU discrepancy shrinks as the wall is refined.

Tank pressure during adiabatic blowdown through a choked orifice, solver against RK4 reference

Choked adiabatic blowdown, tank pressure, from the tank-transient report.

Code-to-code benchmarks outside the reports ​

The manual's §8.3 lists further benchmarks, each gated by a test:

BenchmarkResult (from §8.3)
GFSSP Example 13, conduction rod with convectionSolid temperatures within 3.0 K; conduction heat flows within 7 %; energy balance within 0.5 %
N₂–N₂ counterflow heat exchanger (JANNAF 2024, Majumdar & LeClair)Duty within 5 %; outlets within 2.5 K
GFSSP Example 5, water-water heat exchangerHot outlet 295.67 ± 1.0 K; cold outlet 290.94 ± 0.5 K; duty within 3 %
Lee & Martin entrapped air (GFSSP Figure 10)First peak within 15 %; trace within 8 % of an RK4 rigid column at refined step
SINDA/FLUINT Sample Problem F, LH₂ no-vent fillFill fraction, pressure, vapor temperature, and vent flow within about 1 % at 15 min
NURETH-16 gas-cooled reactor loopPublished trends only; geometry is representative

See OpenFLUME vs. GFSSP and OpenFLUME vs. SINDA/FLUINT for what these benchmarks do and do not show.

Experimental corpora and trust levels ​

From §8.4:

  • NBS Report 9264 cryogenic chilldown (Brennan et al., 1966). Table 6 provides eighteen chilldown-time points for saturated and subcooled LH₂ and LN₂. Eleven digitized oscillograph figures provide forty-four station traces (10 195 samples), rebuilt from source CSVs by npm run gen:trace-corpus.
    • Trusted, calibration-grade: four saturated runs (sixteen traces).
    • Diagnostic only: seven subcooled runs. At coarse axial discretization their errors reach +80 %. They may be used to diagnose a problem but may not be quoted as agreement.
    • CI baseline: computed chilldown time at the instrumented station must stay within a factor of 1.6 of experiment, with mean absolute error under 25 % across the four-case slow suite. Two-phase chilldown energy and enthalpy balances close within 10 % and 12 %.
    • Single-phase chilldown surrogates match the plateau-then-plunge shape only. They are not comparable on absolute times and are asserted as trends.

A factor-of-1.6 band is a regression guard, not a precision claim. Cryogenic chilldown is the least mature area of the code.

The repository also carries digitized datasets under validation/data/digitized/: Hord's cavitation series and other choked-flow data, NASA tank-pressurization tests, additional chilldown studies, and two-phase boiling pressure-drop data. The manual quotes agreement figures only for the NBS 9264 corpus. Treat the other datasets as available reference data, not as validation claims.

Correlation status ​

Closure correlations are where network codes most often go wrong. §8.5 records the status of each one. Swamee–Jain and Dittus–Boelter are standard. Miropolskii film boiling is used as GFSSP uses it for chilldown. Darr–Hartwig is verified structurally against its published equations, inside an LH₂ / vertical-upflow / 1 g envelope. TT-WF is research status, not validated. A custom expression is the user's responsibility.

Result provenance ​

Every run hashes the configuration that produced it. If the model is edited after a run, that result is marked stale. Exports and sweep CSVs carry the model name, a solver-settings summary, and the config hash (§8.7).

Reporting a disagreement ​

If OpenFLUME disagrees with a reference you trust, open an issue. The project treats a well-documented disagreement as one of the most useful contributions it can receive. The bug-report template asks for:

  • the reference value and its source (analytical, published benchmark, or experiment);
  • the tolerance you consider acceptable;
  • units and assumptions;
  • the model, as an attached .fn file or a pasted JSON config.

New validation cases are welcome too. See CONTRIBUTING.md. Numerical claims must state their reference, tolerance, and units. Do not relax tolerances without physical or numerical justification. Do not submit export-controlled material.