My graduate research, the facility work behind it, and my independent turbulence and reacting-flow studies. Select a project for the full write-up, figures and documents.

JET-CALF (Jet Contrails from Aviation Lubricants and Fuels) is a multi-institution program on how fuels and lubricants affect aircraft emissions and contrails. I lead the micro-turbojet performance and gaseous-emissions task, and I coordinate the UBC experimental work for JET-CALF, SCALE-SAF and VLAME. Back-to-back tests on a JetCat P200-SX compare fuel use, gaseous emissions and particles for Jet A-1 and FT-SPK. Each result below belongs to one campaign on this one engine.
View project →
Daniel Lieder (TU Braunschweig) built a chemical reactor network (CRN) for the RQL combustor of the P200-SX. My measurements calibrate and test it. Against the Jet A-1 data of the ASME paper, it reproduces outlet temperature, EI CO₂ and EI CO within 4.5%. It overpredicts NOₓ by about 1.8×. In the GPPS fuel comparison, it predicts the measured fuel-induced changes in \(T_{t4}\), CO₂ and NOₓ within 1 percentage point. It does not predict the particle-number change.
View project →
Fuel effects on soot are a large part of the non-CO₂ question, and the micro-turbojet makes back-to-back particle tests affordable. I integrated an SMPS behind a catalytic stripper and built the size-dependent loss correction for the sampling line and stripper. At maximum thrust, the first distribution had a geometric mean diameter of 8.6 nm, similar in shape to a CFM56-7B at ground idle. In a later back-to-back test, FT-SPK cut the unit-density soot mass by 72%. The particle-number result is less certain, because it depends on the smallest, most strongly corrected bins.
View project →
I built a physics-based transient model of the P200-SX core with a P220 nozzle, in MATLAB and Simulink. It is built from component physics. Driven by the measured fuel flow, it predicts speed, thrust and several sensor readings. It also gives an estimate of the air mass flow, which the rig does not measure. That estimate is model-dependent and has no direct validation.
View project →
Commissioned the original instrumented JetCat P200-SX facility at CERC: engine telemetry, thermocouples, pressure transducers, a load cell, fuel metering, an ECOM J2KN Pro on the undiluted line and dedicated NOₓ, CO and CO₂ analysers on the diluted line. Verified ventilation and CO-alarm response, designed the first exhaust ducting and wrote the engine-test SOP.
View project →
This apparatus adds a Station 4 sampling port to the P220-RXi casing, with a coaxial dilution probe that samples gas ahead of the turbine. The main purpose is to separate fuel-derived pollutants from lubrication-oil contributions, which exhaust measurements cannot isolate. I designed the probe with a coupled one-dimensional model, drew the probe and installation packages, and sent the designs out for fabrication of parts. No sample has been taken with the probe yet, so an oil-free sample is still a design objective.
View project →
This project takes a hot, fast jet out of a closed test cell, safely and without disturbing the engine. A MATLAB model of the free jet sized the ducting. A first concept failed because it set off the CO alarm. The installed duct carries the exhaust upward. The latest design work is a digital twin of the cell.
View project →Systems-level aviation emissions modeling with TU Braunschweig (IFAS): synthetic flight trajectories, a digital-engine performance model and emissions inventories, connecting engine exhaust to contrail-relevant analysis.
View project →Turbulence and combustion have always pulled me in. Graduate courses in both areas made the ideas stick, so I kept going on my own time. These are those personal projects.

A personal learning project on a simple question: how much of a turbulent flame survives when you reduce it to a few chemical reactors? I set it up as four steps, each with a check before the next. I built the CFD, built reactor networks from it, measured what the reduction throws away, and tested ways to put it back. The networks are scored against my own parent CFD. Only the CFD and the tabulated chemistry are scored against the experiment.
View project →
A personal project to build rocket-nozzle CFD from the ground up. The test bed is the chamber and bell nozzle of the Apollo Lunar Module ascent engine. Each simulation adds exactly one piece of physics to the last. The sequence is 1-D theory, inviscid flow, a thermally perfect gas, viscous flow, turbulent flow and finally the plume. This shows me what each layer of fidelity actually buys. It also shows, very visually, how a nozzle designed for vacuum over-expands and separates against sea-level back pressure.
View project →
Every practical turbulence simulation discards the small scales and then has to guess what they were doing. This personal project asks a sharper question. If you watch the large scales for a while, how much can you actually say about the small ones, and how confident can you be? The study has three parts: my own RANS and LES runs, an in-house turbulence solver, and information-based measures of what coarse data determines. I scored my runs against published DNS, experiment and LES data.
View project →
An individual course project in MECH 477 (aerospace propulsion). I wrote a zero-dimensional cycle model of the F-15’s low-bypass afterburning turbofan (BPR 0.69, OPR 24.1, TIT 1680 K). It marches through the engine station by station, with temperature-dependent gas properties, polytropic efficiencies, mixing and a choked convergent nozzle.
View project →
Rising Star Award, 2025 ASHRAE Student Design Competition. Capstone (MECH 457) for the ASHRAE Student Design Competition. We did the HVAC design and load calculation for a three-story, 67,158 ft² outpatient medical office building in Manchester, England. The design follows ASHRAE Standards 55, 62.1, 90.1 and 170. I was project manager and led the thermal-systems optimization.
View project →
A group lab in MECH 489, an undergraduate experimental thermofluids course. We built a two-mirror schlieren system from a flashlight, a drilled aluminum block, two 8-foot mirrors and a razor blade. We used it to watch hot air rise off a heated plate at two temperatures and two angles. The result is mainly qualitative: it shows how the flow changes.
View project →
A group research project in aircraft aerodynamics (MECH 484, 2024). We reviewed how tapered and delta planforms work. We then used simplified course formulas on the F-111’s two sweep positions, and compared two reconnaissance aircraft, the U-2 and the SR-71.
View project →
A course project in turbulent shear flows. Lubrication-oil-derived material in the P200-SX exhaust complicates the emissions measurements. I asked whether that native aerosol could instead seed particle image velocimetry (PIV) of the jet. On paper, it does not pass, so the study supports controlled external seeding.
View project →
In MECH 489 Lab 2, my group tested a Joukowski airfoil with a chord close to a third of the wall spacing (c/H = 0.3075). I derived wall corrections for it from first principles, but we never applied them. I came back to my hand notes, checked every step against a panel method with exact walls, found the errors and fixed them.
View project →
Density-based compressible solver with k–ω SST at Mach 0.3 and 0.9; structured mesh with refined boundary layers.
\(C_L\) about 2.45% below thin-airfoil theory; earlier separation and weak-shock signatures at Mach 0.9.

Four mount types, three driving conditions, 100 Hz tri-axial acceleration; FFT, ANOVA and t-tests against NASA’s 0.3 g readability threshold.
All mounts exceeded 0.3 g; peak content at 10–30 Hz.

Wheatstone-bridge load cell, op-amp conditioning, DAQ and a C# real-time GUI with tare and stability detection.
±0.01 kg after calibration.

SolidWorks models and GD&T drawings; machined piston, displacer and cylinder.
Held ±0.001 m tolerances; ran continuously on thermal input.

A steady one-dimensional thermofluid application for designing coaxial dilution sampling probes. It takes a probe geometry, an engine state and a commanded dilution flow. It solves the capture, pressure, mixing and heat-transfer problems together. It returns the sample flow, dilution ratio, supply pressure, outlet temperature and a solution class. I used it to design the probe on the Station 4 sampling apparatus page. It is verified against an independent implementation, but it has no experimental validation.
View project →
An experimental, typed Python framework for guarded agentic workflows around OpenFOAM. Language models can interpret a request, explain a failure or propose a next step. Deterministic code, explicit contracts and human approval control what actually runs. A run that finishes can still be numerically wrong, and a numerically sound run can still be physically wrong.
View project →
A Windows desktop workbench that drives OpenFOAM in WSL without hiding it. Every action maps to real dictionary files and real commands, edited losslessly, and every change goes into a revertable command journal. It adds mesh-quality tools, Cantera-based combustion pre-calculations, GPU visualization and data-driven analysis. An AI copilot can act only through steps that the user approves.
View project →Can a world model learn the dynamics of a rotor only by listening to it? I built a JEPA world model that learns from unlabeled sound and plans control actions in its own latent space. It needs very few labels and it tolerates acoustic noise. A physics pipeline that knows the true equation is still more accurate when the sensor is clean.
View project →
My first Manim animation. I made it to see deterministic chaos for myself. Two trajectories of the Lorenz system start \(10^{-5}\) apart and end up completely different, with LaTeX equations and a rotating 3-D camera. A companion Plotly Dash dashboard lets you change the parameters live.
View project →
An iPhone and Mac app that I built for fun. It turns a phone camera into a background-oriented schlieren (BOS) system. The app generates a random-dot background and captures a reference frame and a flow frame through it. It then cross-correlates the two frames to find the apparent dot displacement that density gradients cause. Examples are the plume above a candle or a heat gun.
View project →