Navier-Stokes AI
Case study — physics-grounded AI for CFD

Navier‑Stokes AI

Can a validated AI surrogate learn from a small, verified set of Navier‑Stokes CFD solutions and cut the number of expensive simulations needed to explore and optimize an intravascular medical‑device design — without ever letting the AI's confidence outrun the physics backing it?

This project does not claim AI has solved the general Navier‑Stokes existence‑and‑smoothness problem. Navier‑Stokes stays the physics foundation throughout; AI approximates verified numerical solutions inside a defined design space.

25/25
CFD cases passed every verification gate before training
0.95–0.9997
held-out R², GP surrogates
20,000
candidate designs screened by the surrogate
3/3
top candidates independently re-confirmed on the full CFD solver
Workflow

Physics first, AI second, confirmation always

Every stage gates the next. A design never reaches the surrogate before its CFD solution has passed verification, and no optimized candidate is trusted before it's re-run through the full solver.

geometry + operating conditions
→
Navier‑Stokes / CFD
→
verification + physics QA
→
selected CFD dataset
→
AI surrogate ← active learning
→
large-scale optimization
→
CFD confirmation
Milestones 1–6

From an exact solution to a confirmed optimum

Vessel ID 4 mm, catheter OD 2 mm, 100 mL/min blood flow, incompressible laminar Newtonian flow — the baseline problem every stage below builds on.

01

Verified physics baseline complete

The concentric annular-flow case solved analytically and independently by finite differences. Re ≈ 107.1, pressure drop 736.9 Pa over 100 mm, catheter-wall shear 4.29 Pa. A 161-point radial grid reproduces the analytical velocity profile to 0.000172% relative L2 error — the number every later numerical claim is measured against.

02

Surrogate architecture prototype complete

A reduced-order tapered-catheter model exercised the full physics → dataset → surrogate → optimization pipeline before committing to real CFD. Explicitly not full 2D CFD, and never used to make a CFD-speedup claim — kept only as architecture scaffolding.

03

2D axisymmetric Navier‑Stokes solver complete

A body-fitted, finite-volume, SIMPLE-coupled solver, written from the momentum and pressure-correction equations up. The straight-annulus limit reproduces Milestone 1's analytical result; every case is gated on mass conservation, residual convergence, and mesh-convergence trend before it counts.

04

Production CFD dataset complete

25 of 25 device-geometry cases accepted (20 design-of-experiments + 5 active-learning), each individually passing its verification gate before it was allowed to train anything.

05

Active-learning AI surrogate complete

Gaussian Process surrogates for pressure drop and device wall shear stress, with GP predictive uncertainty driving where the next expensive CFD sample gets spent. Held-out R² 0.95–0.9997 across both outputs.

06

Optimization + confirmation complete

20,000 candidate designs screened through the surrogate; the top designs independently re-run on the full CFD solver — 3 of 3 confirmed. The finding itself was worth reporting plainly: pressure drop and wall shear stress don't trade off against each other in this design space, so the true Pareto front is genuinely small. Not a failed search — a real engineering result.

What "confirmed" means here

Every optimized candidate the surrogate proposed was re-solved from scratch on the full CFD solver — the surrogate's prediction was never taken as the final answer.
20,000 candidates (surrogate screen) 3 of 3 re-confirmed on full CFD (0.03% of the screened set)
Separate track — catheter-tip research

A catheter tip that wouldn't converge, and what that taught

A separate track from the milestones above, not gating any of them: a free-ended catheter tip, open to the vessel downstream. Its axis‑symmetry boundary condition checks out exactly. Its realistic rounded geometry does not converge — and finding out why, honestly, turned into the most interesting part of this project.

Verified

The boundary condition is not the problem

Isolated the axis‑symmetry treatment from tip geometry entirely by testing it on a plain straight pipe, which has an exact solution (Hagen‑Poiseuille) at every station. L2 error against that exact profile fell monotonically with mesh refinement — 0.87% → 0.26% → 0.17% — with mass conservation under 0.1% at every station. The boundary condition itself is correct.

Root-caused

The real cause: a smooth 3D closure isn't a discretization convenience

Direct mesh inspection (not another expensive solve) found face non-orthogonality spiking from 0.16 to 0.81 across just 3–4 cells, exactly where a rounded nose closes to a point. That's a real differential-geometry fact, not a mesh bug: any surface of revolution that closes smoothly in 3D is required to meet its own axis with a vertical tangent — the same reason a sphere's pole looks locally flat. Every mesh-based fix tried below was, in effect, fighting that geometric fact rather than a numerical one.

Corrected mid-investigation

A diagnostic bug in the investigation itself

A wall-normal mesh looked like a 67% mesh-quality win (0.691 → 0.225) — and then the solver got remarkably close to converging before blowing up late and hard. Re-checking every radial mesh row, not just the one nearest the wall, found the real number: 16 of 30 rows were worse than the uniform baseline. The true improvement was 12%, not 67%. This is very likely why the failure looked like a sudden, unexplained blow-up: the undiagnosed error sat in the rows nobody had checked.

worst non-orthogonality, wall row only: 0.691 → 0.225 (reported)
worst non-orthogonality, all 30 rows: 0.691 → 0.605 (actual)
Candidate fixMechanismMesh-quality resultVerdict
Axial mesh clusteringConcentrate z-nodes around the domemakes non-orthogonality monotonically worserejected
Arc-length dome reparametrizationRe-space nodes along the curve's arc length0.81 → 0.9999 (much worse)rejected
Blunted tipTruncate the point to a small flat diskreal but modest gain; solver still divergesrejected
Wall-normal mesh (localized blend)Tilt near-wall cells to follow the surface normalgenuine ~6% ceiling for this blend familyceiling found
Conical tip (p=1, not p=2)Change the shape, not the mesh — constant slope to the apex15–20% better, resolution-stablestable
The turn

Changing the shape instead of the mesh

Every single-block mesh trick applied to the circular tip had a real ceiling, because the profile's slope goes vertical as it approaches the axis — a property of the shape, not the grid. A cone closes to the same point with a constant slope the whole way, singular only at the literal apex. It's also a legitimate device geometry: real catheter and dilator tips are routinely conical, not just hemispherical.

Worst-case face non‑orthogonality, by mesh resolution

Lower is better. The circular tip's worst case is erratic across resolutions — a signature of chasing a geometric singularity. The cone's is flat: 0.706 / 0.706 / 0.707.
0.5 1.0 0.853 0.706 nz=241 0.900 0.706 nz=361 0.810 0.707 nz=401
circular tip (p=2) conical tip (p=1)
Current status

Confirmed stable, twice — not yet fully converged

Solved on the actual mesh (nz=241) at two independent relaxation settings. Conservative relaxation gave the cleanest trajectory of the entire investigation: monotonically decreasing residual for all 4,000 iterations, no exceptions. Standard relaxation oscillated but never diverged, then settled sharply — a second, independent confirmation that the geometry itself is fundamentally well-behaved under this solver.

Convergence trajectory, conical tip (log scale)

Both runs, same mesh (nz=241). Neither diverged — unlike every circular-tip variant. The 1e-7 target is well below this axis.
1e-3 1e-4 1e-5 it 0 it 2000 it 4000 2.16e-5 4.09e-5
relaxation 0.3 / 0.15 · 4,000 it · ~3.6 h relaxation 0.7 / 0.3 · 3,000 it · ~1 h

Not yet at the full-convergence target (1e-7). At the observed decay rate that's roughly 6–11+ more hours of compute — a real number, not a euphemism. Rather than launch another unsupervised multi-hour run against a solver with no way to save progress, the next thing built was checkpointing: solve_with_checkpointing() now saves full solver state every 200 iterations to an atomic, crash-safe file, and resumes automatically. Building it caught a real bug before it shipped — the first version silently re-zeroed the flow field's internal flux at every resume, costing extra iterations every time (300 vs. 269 to reach the same state) — caught by directly comparing a segmented run against a continuous reference rather than assuming the two were equivalent.

Status as of 24 September 2026: no solve is running. The long checkpointed run toward the 1e-7 target has not been started yet.

Principles

What held this together

Verify before you trust it

Every CFD case is gated on mass conservation, residual convergence, and mesh-convergence trend before it's allowed to train anything.

Confirm the AI's answer with physics

Optimized candidates are always re-run on the full CFD solver. The surrogate screens; it never has the final word.

Diagnose before you fix

Cheap mesh inspection ruled out or confirmed a cause before any multi-hour solve was spent testing it — and, once, corrected a bug in the diagnosis itself.

Report the negative results

Rejected fixes stay in the record with their numbers. A ceiling that's honestly measured is still a finding.