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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
| Candidate fix | Mechanism | Mesh-quality result | Verdict |
|---|---|---|---|
| Axial mesh clustering | Concentrate z-nodes around the dome | makes non-orthogonality monotonically worse | rejected |
| Arc-length dome reparametrization | Re-space nodes along the curve's arc length | 0.81 → 0.9999 (much worse) | rejected |
| Blunted tip | Truncate the point to a small flat disk | real but modest gain; solver still diverges | rejected |
| Wall-normal mesh (localized blend) | Tilt near-wall cells to follow the surface normal | genuine ~6% ceiling for this blend family | ceiling found |
| Conical tip (p=1, not p=2) | Change the shape, not the mesh — constant slope to the apex | 15–20% better, resolution-stable | stable |
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.
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.
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.
Every CFD case is gated on mass conservation, residual convergence, and mesh-convergence trend before it's allowed to train anything.
Optimized candidates are always re-run on the full CFD solver. The surrogate screens; it never has the final word.
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.
Rejected fixes stay in the record with their numbers. A ceiling that's honestly measured is still a finding.