Solver
Solver Changelog
Every simulation result is stamped server-side with the solver version that produced it — the PROM v{N} chip on the results page links here. The version bumps whenever any simulation model (propeller, motor, battery, or system solver) changes results.
The solver lineage predates ThrustLab by several versions; this public changelog starts at v4.0 — the model-accuracy release — and earlier history is not retro-seeded.
v4.3 — Forward flight, coaxial rotors, and a powertrain-accuracy sweep
2026-08-17 · propeller, motor, battery, PROM
This release adds forward-flight and coaxial rotor modelling, corrects how endurance is computed, and lands a sustained motor, ESC and battery accuracy sweep. Models changed: propeller, motor, battery, and the PROM system solver.
New: forward flight and crosswind
Rotors were previously modelled in axial flow only — air arriving straight down the shaft. The solver now resolves a rotor in oblique inflow, which is what a rotor actually sees in forward flight, in a crosswind, or on a tilted vehicle. In-plane and drag forces on the rotor disc are now reported rather than dropped, and the descent model covers the vortex-ring region a descending rotor can enter.
New: coaxial rotor stacks
Coaxial stacks are now modelled, including the wake and swirl an upper rotor puts into the one below it. Rotor order and stack position are carried through the API. Coaxial results in dynamic (time-varying) runs are provisional; the steady-state coaxial path is the validated one.
Endurance now holds thrust constant — reported times fall
Endurance previously divided the pack's charge by the current at the operating point, which holds current constant — a flight no aircraft actually flies. It now computes the constant-thrust case: as the pack sags, throttle and current rise to keep the aircraft up. Reported times are therefore lower. On a 5000 mAh 6S1P pack at 1100 W the figure falls about 11% at a full pack, 8% at three-quarters charge, and about 6% below half charge. Where a pack cannot sustain the demanded power at all, the flight now correctly ends at that state of charge.
Two times are now published. Est. Time Remaining is the pack's full remaining charge. Est. Time to Reserve stops at the 20% floor and equals the previous headline figure exactly, so no number was lost. The 20% is a rule of thumb, not a limit the solver enforces. This also removes an unreadable result: a pack at 20% charge used to publish 0:00 endurance beside 1000 mAh of remaining capacity.
Motor and ESC accuracy
Reported bus current no longer re-divides by ESC efficiency, and ESC efficiency and loss are now reported from the same ledger the solver bills — the summary and the solve can no longer disagree. The ESC series element bills the current it drops, and that current is no longer charged twice. Iron loss is applied exactly once and can no longer go negative, which previously affected catalog motors below roughly 500 rpm — reachable on any spin-up. Advancing ESC timing now buys RPM, and each ESC type is billed the off-axis current its own commutation implies.
Motor temperature
The dynamic solver now cools the whole winding-to-ambient path rather than part of it, propeller-wash cooling uses the propeller exit velocity, a specified forced-air velocity is honoured, and sweeps resolve cooling at each point instead of once at the base condition. Cooling can no longer be applied twice, and a converged solve can no longer report an impossible winding temperature.
Motor catalog
275 catalog motor resistance values were corrected to the phase-to-phase terminal convention manufacturers actually publish. Several hundred motor kv values stored as text are now numeric, so they pass the API boundary and the kv filter. Every catalog row now declares where its no-load test voltage came from, because 10 V had been both a real measured value and a silent default.
Battery
NiMH cells joined the catalog, and cylindrical packs can be arranged flat, hump or T. Pack internal resistance now uses a true parallel combination — the previous approach double-counted parallel strings — and is reported over time in dynamic runs. Pack cooling uses the real exposed face area rather than the contact patch between cells, and the battery summary publishes a chemistry-aware open-circuit voltage instead of a LiPo-only curve. A pack driven past its discharge cutoff is now flagged: between roughly 1.0× and 1.35× the rated C-rate at high charge the cell voltages read ordinary while the pack was at or past cutoff, and nothing said so. The flag is a reporting addition and moves no number.
Propeller
Corrected a sign error in the propeller wake model that had been opposing rotation. Reported blade Reynolds number and Mach diagnostics no longer average in unused padding, the radial table names the solution it belongs to, and the reported slipstream follows the reported thrust.
v4.1 — Propeller power accuracy
2026-06-13 · propeller
- Improved the accuracy of predicted propeller power against wind-tunnel data. Reported propeller power rises by about 0.5% across the propeller catalog; thrust is unchanged.
The propeller photo-to-geometry importer was also hardened in the same release window; those changes do not affect simulation results and are not a results-version change on their own.
v4.0 — Model-accuracy release
2026-06-10 · propeller, motor, PROM
This release closes a systemic thrust over-prediction / current under-prediction bias identified against wind-tunnel and manufacturer bench data. Models changed: propeller, motor, and the PROM system solver.
Propeller: high-tip-speed thrust accuracy
Removed thrust over-prediction at high tip speeds — the propeller model no longer extrapolates beyond its validated operating envelope. Results inside the envelope are unchanged. Pitch-to-diameter is now derived from the actual blade geometry instead of the propeller name.
System: ESC losses now drawn on the DC bus
ESC losses are now fully accounted as current on the DC bus, 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: realistic electrical resistance
Catalog motor resistance is now interpreted the way manufacturers publish it, and a realistic ESC + wiring series-resistance default replaces the previous zero-resistance assumption, alongside a wire-gauge preset. Full-throttle RPM median error against bench data: +0.4%.
Motor: realistic temperature prediction
Motor temperature prediction now accounts for motor size and cooling airflow, replacing a one-size-fits-all assumption that produced unrealistically high temperatures on large motors. Each rotor group can select its cooling condition: cowled (still air), propeller exit airflow (default), or a custom air velocity / direct thermal resistance. The results page flags any rotor group that reaches the winding (155 °C) or magnet (120 °C) thermal limits.
Motor: part-throttle accuracy
Part-throttle current and RPM for six-step (BLDC) ESCs now match published bench data substantially better (40–70% throttle band current median improved from 0.94 to 0.99); full-throttle results are unchanged. See the throttle-semantics note below.
Results
Results now carry solver_version (this stamp), the per-rotor applied motor cooling air velocity, and thermal-limit flags when the 155 °C / 120 °C caps are hit.
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.
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 small bench-derived endpoint adjustment: real hobby ESC "throttle %" corresponds to a slightly higher effective duty than the commanded fraction, and the adjustment absorbs that convention so part-throttle current and RPM match published bench data. At 100% throttle the adjustment vanishes — full-throttle results are unchanged. FOC ESCs are untouched (duty = throttle exactly).