Solver Changelog
Every simulation result is stamped server-side with the solver version that produced it — the solver v1 chip on the results page links here. The version bumps whenever any simulation package (propeller, motor, battery, or system solver) changes results.
The solver evolved continuously before versioning began; this changelog starts at v1 — the model-accuracy release — and earlier history is not retro-seeded.
v1 — Model-accuracy release (June 2026)
This release closes a systemic thrust-over-prediction / current-under-prediction bias root-caused against wind-tunnel and manufacturer bench data (98 motors, 7,600+ bench rows). Models changed: propeller, motor, and system solver.
Propeller: calibration envelope guard + geometry-derived pitch
The propeller calibration multipliers now fade smoothly to neutral outside the validated wind-tunnel envelope instead of extrapolating beyond the data they were fit on. This removes thrust over-prediction at high tip speeds. In-envelope results are unchanged. Pitch-to-diameter is now derived from the actual blade twist at 75% radius instead of parsing the propeller name.
System: ESC losses now drawn on the DC bus
ESC inverter, PCB, AC-excess, ripple, freewheel, and six-step-harmonic losses are now sourced as current on the DC bus inside the solver, closing an energy-balance leak. Displayed bus current, voltage sag, SOC depletion, flight time, and pack heating rise by the ~3–7% the bus previously under-read.
Motor: resistance convention + bench-fit series resistance
Catalog motor resistance is now interpreted as the line-to-line value (per-phase R = Rm/2), matching how manufacturers publish it. This pairs with a bench-fit ESC + wire series-resistance default (fleet-median ≈ 18 mΩ) replacing the previous zero-resistance assumption, and a wire-gauge preset. Full-throttle RPM median error vs bench: +0.4%.
Motor: size-scaled, airflow-cooled thermal resistance + hard caps
The flat motor thermal resistance (0.5 K/W regardless of motor size — the cause of unrealistic 193–317 °C predictions on large motors) is replaced with a size-scaled, bench-fit law plus a forced-convection cooling model and a per-rotor cooling selector: cowled (still air), propeller exit airflow (default), or custom velocity / direct thermal resistance. Temperatures are hard-capped at 155 °C (winding) / 120 °C (magnet); the results page flags any rotor group that hits the caps.
Motor: part-throttle six-step throttle→duty map
A matched-RPM study against bench data showed the motor model is essentially exact at the bench operating point; the remaining part-throttle gap was throttle→duty endpoint semantics, now absorbed by a global bench-calibrated map (40–70% throttle band current accuracy improved from 0.94 to 0.99 of bench). Full-throttle results are unchanged. See the throttle-semantics note below.
Results
Results now carry the solver version stamp, the per-rotor applied motor cooling air velocity, and thermal-limit flags when the 155 °C / 120 °C caps are hit.
Throttle semantics
"Throttle %" in ThrustLab means inverter duty %, not transmitter stick %. The throttle you enter is the modulation duty command the ESC applies to the DC bus — it is not a radio/transmitter percentage, which real ESCs remap through their own endpoint and minimum-throttle calibration.
For six-step (BLDC) ESCs, ThrustLab additionally applies a global bench-calibrated throttle→duty map, duty = clip(−0.0040 + 1.0261 × throttle, 0, 1), fit against 7,079 part-throttle bench rows across 98 T-Motor motors. Real hobby ESC "throttle %" corresponds to a slightly higher effective duty than the commanded fraction; the map absorbs that endpoint convention so part-throttle current and RPM match published bench data. At 100% throttle the map clips to exactly 1.0 — full-throttle results are unchanged. FOC ESCs are untouched (duty = throttle exactly).
ESC type: API default vs app default
The web app defaults to esc_type="six_step" (the hobby BLDC ESC model), while the public API defaults to esc_type="foc". The two models differ by roughly +4.7% RPM / +9.6% thrust (FOC higher). API and SDK users who want results matching the app should set esc_type="six_step" explicitly.