DYNOMIATA ← Home
Methodology · v2.1

How we turn a CSV into a number.

DynoMiata calculates wheel horsepower from a road-load physics model. It is not a chassis dyno. The number on your share card comes from solving Newton's second law over your OBD log, not from a roller. This page is the math, the change log, and what the model does not claim.

01The model

At any instant during a wide-open throttle run, the engine is pushing the car against three forces at the wheels: inertia (mass times acceleration), aerodynamic drag, and rolling resistance. Driveline loss is not a force at the wheels: it sits between the crank and the wheels and enters only the crank-horsepower estimate. The OBD log gives us speed over time, which gives us acceleration. The car's mass and aero are looked up from your trim (NC or ND, listed in the supported-generations section below). The rest is arithmetic.

# Force at the wheels at instant t (Newtons)
F_wheel(t) = m_eff · a(t)  +  ( A + B·v(t) + C·v(t)² )

# The road-load term (A + B·v + C·v²) is Mazda's own coastdown-measured
# road load, filed with the EPA under 40 CFR 1066. A is rolling resistance,
# C is aerodynamic drag, B is the linear (driveline + tire-hysteresis) term.
# This replaces the old separate Cd/Crr estimate with one manufacturer
# measurement of the exact quantity the model needs.

# Power at the wheels (Watts), then horsepower
P_wheel(t) = F_wheel(t) · v(t)
WHP(t)     = P_wheel(t) / 745.7

# Then the SAE J1349 atmospheric correction (full standard):
WHP_corr   = WHP(t) · [ 1.176 · (99.0 / P_ambient) · √(T_air / 298.15) − 0.176 ]
# The 1.176 / −0.176 split accounts for friction power (~15% of output)
# that does not scale with air density. T_air is the measured intake-air
# temperature (Kelvin), falling back to 298.15 K (25 °C) when absent.
# See Section 04 for the heat-soaked-sensor caveat this introduces.

Mass (m) is your car's curb weight (the factory spec, or your own scale reading), plus fuel and driver weight. The driver is always counted: the configure step defaults to 170 lb and lets you change it, and fuel level is yours to set. A passenger is the one thing a single number can't guess, so fold that into the driver weight if you ran with one. The inertia term uses an effective mass that adds the spinning mass the engine accelerates alongside the car. The wheels and tires (roughly 4 to 5 percent) turn at road speed in every gear. The engine, flywheel, clutch and gearbox input turn at engine speed, so in a lower gear they spin far faster for the same road speed and absorb proportionally more power. The model accounts for this directly: it reads the gear ratio from your own log (engine RPM against road speed, no lookup needed) and adds the rotating assembly's inertia, referred to the wheels through that ratio. The anchor is a measured part: the stock NC flywheel weighs about 16.2 lb on a vendor's scale, and the rest of the assembly (clutch, crank, damper, input shaft) is an engineering estimate with a stated band, so the term carries an uncertainty bar like every other constant. The effect is real: it lifts a lower-gear pull (about 5 percent in 3rd gear, more in 2nd) toward the truth, correcting a gear-dependent low read that a single flat factor left in. ND cars borrow the NC rotating-assembly value with a wider band (the ND's dual-mass flywheel is unmeasured), so an ND's bar runs wider in low gears. The band tightens the first time anyone logs a run with GPS-grade speed. The road-load coefficients (A, B, C) are Mazda's own EPA coastdown values for each generation, so the aero and rolling drag come from one manufacturer measurement rather than separate estimates. We don't publish a bare drag coefficient: the NC's frontal area has no authoritative published value, so the honest figure is the measured drag-area product CdA (about 0.66 m² for the NC hard-top), which is the quantity the model actually uses. Roof variants (hard-top vs soft-top vs fastback) scale off it by ratio. If you run stickier tires than stock, the configure step lets you say so and we raise the rolling-resistance term to match published rolling-resistance data for that tire class.

We compute WHP at every sample of the run, then take the smoothed peak. The ±X next to the wheel-horsepower number on the share card combines two things: the run-to-run standard deviation across the session's repeated pulls, and the rotating-assembly inertia band scaled by your gear (a big share of the bar in 2nd, small in 4th). The ±X next to the estimated crank horsepower is different: it's a drivetrain-loss sensitivity bound, showing how much the crank number moves under a 3-percentage-point uncertainty in the assumed drivetrain loss. Same symbol, two different uncertainties.

What the number aims at. Steady-state wheel power: what the engine delivers through the wheels at constant speed, the same quantity a load-cell dyno holds the car against. With the rotating assembly's inertia counted (the gear term above), the result no longer depends on which gear you logged or how fast the engine swept, so the same car should read the same in 2nd, 3rd, or 4th. That makes it comparable to an inertial-dyno sheet within the spread you'd see between two dyno shops on the same day. It is a physics estimate with a stated band, not a match to any particular dyno, and we make no promise about which way a given shop's rollers will read. In practice the number lands in Dynojet territory: documented stock-NC Dynojet pulls run about 130 to 145 wheel hp. An eddy-current or Mustang-style dyno reads roughly 10 to 15 percent lower for the same engine, so a shop sheet on one of those will look lower without anything being wrong. For the most repeatable log, pull in 3rd gear.

02Supported generations

The math runs for the NC and ND generations: NC1 (2006-2008), NC2 (2009-2012), NC3 (2013-2015), ND1 (2016-2018), ND2 (2019-2023), and ND3 (2024+). NA and NB are on the roadmap, not yet supported. If you upload a log from a generation that isn't listed, the configure step won't let you proceed.

The inputs the model actually consumes for each variant (redline shown for orientation; the model reads RPM from your log):

NC1 (2006-2008)

2,480 lb curb (Sport MT base). Redline 6,700 rpm. Road load uses the NC2 EPA coastdown (proxy: pre-2009 cert files predate coastdown reporting, and the body is shared). Stock tire 205/50R16 on 16-inch cars, 205/45R17 on 17-inch cars. Mazda renamed the trims partway through the NC1 run, so wheel size is the reliable key, not the trim name.

NC2 (2009-2012)

2,480 lb curb (Sport MT base). Redline 7,200 rpm. Road load A + B·v + C·v² from Mazda's MY2010 EPA coastdown (PRHT body), implying a drag area CdA of about 0.66 m². Roof variants scale off the hard-top measurement using the Autobild wind-tunnel ratios (soft top and top-down add drag). Stock tire 205/45R17.

NC3 (2013-2015)

2,480 lb curb (Sport MT base). Same powertrain and Cd as NC2; road load from the MY2013 EPA coastdown.

ND1 (2016-2018)

2,332 lb curb (Sport MT base). Redline 6,800 rpm. Road load from the ND1 EPA coastdown, implying a drag area CdA of about 0.64 m² (the RF roof a touch lower). Stock tire 195/50R16 on 16-inch cars, 205/45R17 on 17-inch cars.

ND2 (2019-2023)

2,339 lb curb. Redline 7,500 rpm. Same body and Cd as ND1. Engine revised (see notes below).

ND3 (2024+)

2,368 lb curb. Same powertrain and Cd as ND2. Added 29 lb for the Kinematic Posture Control braking system plus minor cosmetic deltas.

ND road load comes from Mazda's MY2016 EPA coastdown (ND1). ND2 and ND3 share the ND1 body, so they use the ND1 coastdown until their own measured rows are pulled. That is a measured total road load, not a community estimate; it implies a drag area CdA of about 0.64 m². The model no longer consumes a bare drag coefficient, so the old "Mazda hasn't published a Cd" caveat is moot. Roof variants (soft top vs RF, up vs down) scale off it by ratio.

ND1 and ND2/ND3 have different 6-speed automatic final drives. The 2019 model upgrade explicitly changed the 6AT final drive from 3.454 to 3.583. ND1 6AT pulls and ND2/ND3 6AT pulls run through different lookup keys so the wheel-torque math accounts for it. The 6-speed manual final drive (2.866) is shared across all three ND generations.

ND2 raised the redline from 6,800 to 7,500 rpm. The 2019 engine upgrade revised the internals enough to justify the higher limit: pistons lighter by 27 grams each, connecting rods lighter by 41 grams, valve lift and duration increased, exhaust manifold inner diameter enlarged, plus a low-inertia dual-mass flywheel and higher-pressure fuel injectors. That's the credibility story for why an ND2 makes more crank horsepower than an ND1 from the same displacement.

Sources for every per-variant number live as inline comments in worker/src/profiles.ts. The Mazda press materials cited are the 2017, 2019, and 2024 MX-5 spec decks at news.mazdausa.com/download/, plus the 2019 engine-upgrade press release.

03Change log

When the math changes, you'll find it here, dated, with the diff. A change applies to every analysis run from then on. Most recent first.

A run you saved earlier keeps the number it was computed with. We don't store your raw log, so an old run isn't recalculated when the math changes. To see an earlier log under the current model, re-run it (upload the same CSV again). Email [email protected] with any questions.

04What this model does not claim

Honest about limits. If your use case is in this list, the number on the share card is a starting conversation, not a final answer.

Forced induction

The model is anchored on naturally-aspirated NC and ND drivetrains. Turbo and supercharged builds: the curve shape and peak location will be wrong. The peak number is in the right neighborhood.

Uphill and downhill runs

Slope changes acceleration. A run on a road steeper than 1° will read low (uphill) or high (downhill). The data-quality panel flags any run with significant elevation change.

Wind

A 10 mph headwind costs roughly 6 to 7 WHP at 80 mph. We can't measure it from the OBD log. If your run was on a windy day, log a second one in the opposite direction and pool both.

Heat-soaked IAT sensors can inflate the number

The SAE / DIN correction now uses your log's measured intake-air temperature (wired 2026-05-23). The reference temperature is 25°C for SAE J1349 and 20°C for DIN 70020. Measured IAT hotter than the reference scales the corrected number upward, which is the correct physical direction. The caveat: IAT sensors heat-soak after sustained driving, reading higher than true ambient (a common OBD-II failure mode), which can inflate later-pull numbers on back-to-back runs. The data-quality panel above the result flags monotonic IAT rise across pulls so you know when this is happening. A future revision may add an upper cap on IAT used in the correction. Logs without IAT samples fall back to a 25°C reference.

Humidity

SAE J1349 specifies the correction against dry-air pressure. We use total barometric pressure. Water vapor makes total pressure higher than the dry-air pressure the standard wants, so on humid days the correction factor comes out slightly small and the number reads low, by roughly 0.5 to 1.5 percent in typical conditions. The error is in the conservative direction.

How the peak is found

The model reads power from how hard the car accelerates at each RPM, then finds the peak by fitting a smooth curve through the data points pooled across all your pulls, rather than grabbing the single highest reading (which on a noisy log is often just a sensor blip). That gives a precise peak RPM, not one rounded to the nearest bin. One honest limit remains: a coarse speed signal (whole 1 km/h or 1 mph steps) can bias a broad, flat power peak high by up to about 10 percent on a single 2nd-gear pull, because the gentle flattening at the top of a flat curve is a smaller change than the speed rounding can express. It shrinks fast when you log several pulls, and it goes away in a taller gear or with a finer speed source than the 1 mph steps.

Log 3 or more pulls in 3rd gear

The single best thing you can do for a clean number is log three or more pulls in 3rd gear. The tool pools them, and the small random errors from speed rounding cancel out across pulls while real power stays put. A single pull on a typical OBD adapter (which samples slowly, around 1 to 2 readings a second) can land 15 to 20 percent off; three or more is where the number becomes trustworthy. 3rd gear is the sweet spot: 2nd is over too fast for a slow adapter to capture the curve, and is the worst for wheelspin and clutch slip, while 4th reaches the rev limit near 100 mph, which is unsafe. A taller gear also sidesteps the speed-rounding bias noted above, which is why 3rd, not 2nd, is the one to use.

Estimate, not a measurement

DynoMiata is a physics model, not a chassis-dyno comparison. Without published ground-truth runs, no absolute-accuracy number is honest. Use the result to compare deltas across runs and modifications. For a published absolute number, take the car to a real chassis dyno.

Spot something wrong in the math? Tell me. [email protected]. I read every email and I'll add a line to the change log if you're right.

Estimates only · Not affiliated with Mazda · Methodology v2.1