Computational fluid dynamics
Solving a partial differential equation on a grid — a velocity field over space and time. A self-contained Lattice-Boltzmann solver reproduces the most iconic result in fluid dynamics: the von Kármán vortex street shed by flow past a cylinder, validated on channel flow, the Strouhal number, drag and lift, and a lid-driven cavity.

- channel-flow error vs analytic
- 0.27%channel-flow error vs analytic
- Strouhal number (shedding frequency)
- 0.20Strouhal number (shedding frequency)
- cylinder drag coefficient
- 0.94cylinder drag coefficient
- drag oscillates at twice the lift frequency
- 2×drag oscillates at twice the lift frequency
- design notebooks
- 10design notebooks
- requirements PASS
- 5 / 5requirements PASS
A whole velocity field, not a handful of states.
Every other model in this portfolio tracks a few variables in time. Fluid flow is different: it's a field — velocity and pressure at every point in space, coupled by a partial differential equation, evolving together. Solving it on a grid is computational fluid dynamics, the domain of COMSOL and ANSYS Fluent. This program builds a self-contained solver from scratch and uses it to reproduce the single most recognizable result in the field — the vortex street that peels off a cylinder in a flowing stream — then validates it against textbook benchmarks.
Get the physics right on a problem you can check.
The solver is a Lattice-Boltzmann method — a kinetic, particle-distribution route to the incompressible Navier-Stokes equations that is explicit, local and robust where a direct pressure solve is finicky. Before trusting it on anything complex, the program validates it on pressure-driven channel flow, where the exact answer is a parabola: the simulated profile matches the analytic one to 0.27%. A solver that nails the case you can check on paper is one you can believe on the case you can't.


The wake doesn't always shed — until it does.
At low Reynolds number the flow behind the cylinder is a steady, symmetric pair of recirculating bubbles. Raise the Reynolds number past a critical value and that symmetry breaks: the wake goes unstable and begins to shed vortices at a clean periodic frequency — a Hopf bifurcation in the flow itself. The program sweeps the Reynolds number and catches the transition, the wake oscillation amplitude jumping from essentially zero to fully developed shedding.

Shedding leaves a fingerprint on the forces.
The vortex street isn't just pretty — it's measurable. Probe the wake and its velocity oscillates at a frequency that, made dimensionless, is the Strouhal number ≈ 0.2, the value every fluids textbook quotes. And the shedding shakes the cylinder: the lift force oscillates at the shedding frequency while the drag ripples at exactly twice it — the von Kármán signature, and the reason chimneys, cables and bridge decks need to be designed against vortex-induced vibration.

The other canonical test, passed too.
The lid-driven cavity — fluid in a box dragged by a moving top lid — is the other standard CFD validation case, with decades of published reference solutions. The solver produces the expected primary recirculating vortex, its centre landing right where the literature (Ghia et al.) puts it. Two canonical benchmarks passed, from one self-contained solver written in the notebook.

Every number re-derived at sign-off.
The V&V notebook rebuilds the solver from scratch and re-derives each requirement against theory and benchmark, printing a PASS/FAIL board.
Result
- Poiseuille profile vs analytic: 0.27%
- Vortex-shedding amplitude / U₀: 0.87
- Strouhal number: 0.20
- Drag coefficient / signature: 0.94; drag = 2× lift
- Cavity primary-vortex centre: (0.61, 0.72)
Requirement
- Poiseuille profile vs analytic: R-01 < 2%
- Vortex-shedding amplitude / U₀: R-02
- Strouhal number: R-03 ≈ 0.15–0.2
- Drag coefficient / signature: R-04
- Cavity primary-vortex centre: R-05
A real field solver, at teaching fidelity.
The deliverable is ten notebooks and the dossier — a discretized PDE field, not an acausal lumped network, so there's no custom block or canvas. The solver is 2D incompressible, low-Mach Lattice-Boltzmann with a single-relaxation-time collision; the grid resolution is modest, the cylinder uses a staircase bounce-back boundary, the drag coefficients are indicative rather than publication-validated, and there's no turbulence model. What the program proves is the capability the portfolio most lacked — solving a partial differential equation as a spatial field on a grid — with a self-contained solver (no external CFD dependency) that reproduces the vortex street, the Strouhal number, the force signature, and two canonical benchmarks, every number re-runnable.
Keep exploring






