Rotorcraft Forward-Flight Performance (flight-mechanics/performance/rotorcraft-forward-flight-performance)
Use when you must compute the forward-flight power required of a
rotorcraft rotor with momentum-theory inflow: the Glauert induced
velocity at a given flight speed, the induced power, the parasite
power from the equivalent flat-plate drag area, the profile power
from rotor blade solidity and tip speed, and the total power through
the induced power factor, then find the speed of minimum total power
(best endurance speed) and the speed that minimizes power per unit
speed (best range speed proxy) over a speed sweep. This leaf
implements the standard uniform-inflow momentum theory (Glauert
inflow) in pure Python, stdlib only. It is the forward-flight
companion to skills/flight-mechanics/performance/
rotorcraft-hover-performance, which owns the hover case; this leaf
takes the hover induced velocity only as the shared v_h input and
adds the flight-speed inflow, parasite and profile terms. Uniform
inflow only: no reverse-flow region, no blade-element section polars,
no compressibility. The equivalent flat-plate area f is an input
here, not a drag buildup.
Domain quick reference
- Hover reference velocity: v_h = sqrt(T / (2 * rho * A)), the
momentum-theory value at zero flight speed.
- Glauert inflow at flight speed V:
v = T / (2 * rho * A * sqrt(V2 + v2)). The unique positive
fixed point is found by substitution starting from v0 = v_h,
stopping when |v_new - v| < tol (TOL = 1e-9, MAX_ITER = 60).
Near hover the substitution contracts at about v2 /
(V2 + v**2) per pass, so each pass applies the standard
delta-squared acceleration to the last two substitution images
when the denominator is usable; this keeps the default 5 to 100
m/s sweep inside the iteration cap. Both routes converge on the
same fixed point, and speed 0 returns v_h directly.
- Induced power: P_i = T * v (ideal, before the induced power
factor).
- Parasite power: P_par = 0.5 * rho * V**3 * f, with f the
equivalent flat-plate drag area of the airframe in m2.
- Profile power: P_prof = (1/8) * rho * sigma * Cd0 * A * V_tip**3,
the average section drag model, sigma the rotor solidity and Cd0
the mean blade drag coefficient (CD0_DEFAULT = 0.012).
- Total power: P_total = k * T * v + P_prof + P_par, with the
induced power factor k = K_DEFAULT = 1.15.
- Characteristic speeds over the sweep (5 to 100 m/s by default):
best endurance speed minimizes P_total; best range speed proxy
minimizes P_total / V. Induced power falls with speed while
parasite power rises as V**3, so the best range speed always sits
above the best endurance speed.
- Units are SI throughout: N, kg/m3, m2, m/s, W.
- 14 CFR Part 29 (FAR-29) frames rotorcraft performance
requirements; the relations above are standard engineering
methodology, summary-only.
Workflow
- Fix the rotor and flight state: thrust T = weight from mass,
rotor area A = pi * R**2, air density rho, and the flight speed V
(hover_induced_velocity gives v_h for the reference point).
- Solve the Glauert inflow at the flight speed with
glauert_induced_velocity; it returns the hover value at V = 0 and
raises ValueError on negative speed and non-positive thrust, area
or rho, and RuntimeError when max_iter is exhausted.
- Compute the induced power with induced_power (T * v), the
parasite power with parasite_power (0.5 * rho * V**3 * f), and
the profile power with profile_power (the same (1/8) blade drag
model as the hover leaf).
- Combine them with total_power through the induced power factor
k (default 1.15, matching the hover leaf).
- Sweep the flight speed with power_sweep to get the total power
curve, then read the two characteristic speeds:
best_endurance_speed (argmin of total power) and
best_range_speed (argmin of total power over speed, returns the
speed and the power-per-speed ratio).
- Confirm the deterministic checks with the contract test
scripts/test_rotorcraft_forward_flight_performance.py.
Worked example
Same rotor as the hover leaf: R = 5.0 m (A = 78.5398 m2), m = 2200 kg
(T = 21574.63 N), rho = 1.225 kg/m3, solidity 0.08, Cd0 = 0.012,
tip speed 220 m/s, f = 2.2 m2, k = 1.15.
Power breakdown at V = 60 m/s (module outputs):
| quantity |
value |
| Glauert induced velocity |
1.868 m/s |
| Induced power T * v |
40297 W (40.3 kW) |
| Profile power |
122935 W (122.9 kW) |
| Parasite power |
291060 W (291.1 kW) |
| Total power (k = 1.15) |
460336 W (460.3 kW) |
The hover induced velocity is 10.59 m/s, so forward flight at 60 m/s
cuts the induced velocity by a factor of about 5.7 and the total
power is dominated by parasite drag (63%).
Characteristic speeds over the default sweep (module outputs):
best endurance speed 28.0 m/s, best range speed 45.0 m/s with
P/V = 6832 W per (m/s). The range speed sits strictly above the
endurance speed, as momentum theory requires. Note: the draft spec
window of 50 to 90 m/s for the best range speed is not reachable by
this model at f = 2.2 m2, where the P/V minimum of the parasite plus
induced balance lands near 45 m/s; the module value above is the
authoritative output of the spec model.
Verification
- Confirm glauert_induced_velocity(21574.63, 78.5398, 1.225, 60.0)
returns 1.868 m/s (spec bound 1.5 to 2.3 m/s) and that the same
call at speed 0 returns the hover value 10.5887 m/s within 1e-6.
- Confirm the four power terms fall in the spec magnitude bounds at
60 m/s: induced 35 000 to 50 000 W, profile 100 000 to 150 000 W,
parasite 270 000 to 320 000 W, total 420 000 to 500 000 W.
- Confirm best_endurance_speed returns 28.0 m/s (bound 25 to 45 m/s)
and best_range_speed returns 45.0 m/s strictly above it, with the
P/V ratio 6832 W per (m/s) equal to the sweep minimum.
- Confirm every non-physical input raises ValueError: speed < 0,
thrust <= 0, area <= 0, rho <= 0, f < 0, solidity <= 0, Cd0 <= 0,
tip_speed <= 0, k <= 0.
- Confirm a forced max_iter = 2 on the Glauert iteration raises
RuntimeError, and that the default cap converges at every default
sweep speed.
- Run the contract test offline: python3
scripts/test_rotorcraft_forward_flight_performance.py (34 tests,
deterministic, no RNG).
Pitfalls
- Treating the draft spec window as the model answer: the best range speed
of this model at f = 2.2 m2 lands near 45 m/s (the draft 50-90 m/s window
is not reachable); the module value is authoritative for the spec model.
- Starving the Glauert iteration: the inflow fixed point is found by
substitution with a 60-iteration cap (RuntimeError when exhausted); the
default 5-100 m/s sweep converges, but forcing max_iter = 2 raises
RuntimeError by contract.
- Expecting induced power to rise with speed: induced velocity falls with
flight speed (v ~ T/(2 rho A sqrt(V^2+v^2))) while parasite power rises as
V^3, so best range speed always sits above best endurance speed; a lower
range speed signals a sweep or formula error.
- Calling at V = 0 for the inflow: speed 0 returns the hover value v_h
directly; negative speed raises ValueError.
- Using the hover power terms without the induced power factor: total power
is kTv + P_profile + P_par with k = 1.15 default, matching the hover
leaf convention.
Related leaves
- flight-mechanics/performance/rotorcraft-hover-performance: the
hover companion leaf; owns the hover induced velocity, figure of
merit and disk loading, and shares this rotor and k = 1.15.
- flight-mechanics/performance/climb-performance: fixed-wing rate of
climb and ceilings from excess power, the climb analog.
- flight-mechanics/performance/thrust-required: fixed-wing drag and
thrust terms against which rotorcraft power is often compared.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_rotorcraft_forward_flight_performance.py
The test covers the worked-rotor power contract at 60 m/s (all four
magnitude bounds plus the exact module outputs), the Glauert speed
zero identity, the high-speed v_h**2 / V asymptote, the RuntimeError
failure mode, the parasite power monotonic sanity (20 m/s below
80 m/s), the default sweep shape (96 pairs from 5 to 100 m/s), the
best endurance and best range argmins with the strict ordering
physics check, and ValueError rejection of every non-physical input
class.
Compliance
- Standards referenced, not reproduced: 14 CFR Part 29 (far-29) is
US government work in the public domain; the momentum-theory
relations above are standard engineering methodology, summary-only
per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: rotorcraft-forward-flight-performance3description: Use when you must compute the forward-flight power required of a rotorcraft rotor with momentum-theory inflow: the Glauert induced velocity at a given flight speed, the induced power, the parasite power from the equivalent flat-plate drag area, the profile power from rotor blade solidity and tip speed, and the total power, then find the best endurance speed (minimum total power) and the best range speed (minimum power per unit speed) over a speed sweep. Produces the forward induced velocity, the three power components, the total power curve, and the two characteristic speeds that gate a rotorcraft cruise performance assessment. Trigger: rotorcraft forward flight, glauert inflow, induced power model, parasite power, equivalent flat plate area, best endurance speed, best range speed, rotor profile drag.4license: Apache-2.05---67# Rotorcraft Forward-Flight Performance (flight-mechanics/performance/rotorcraft-forward-flight-performance)89Use when you must compute the forward-flight power required of a10rotorcraft rotor with momentum-theory inflow: the Glauert induced11velocity at a given flight speed, the induced power, the parasite12power from the equivalent flat-plate drag area, the profile power13from rotor blade solidity and tip speed, and the total power through14the induced power factor, then find the speed of minimum total power15(best endurance speed) and the speed that minimizes power per unit16speed (best range speed proxy) over a speed sweep. This leaf17implements the standard uniform-inflow momentum theory (Glauert18inflow) in pure Python, stdlib only. It is the forward-flight19companion to skills/flight-mechanics/performance/20rotorcraft-hover-performance, which owns the hover case; this leaf21takes the hover induced velocity only as the shared v_h input and22adds the flight-speed inflow, parasite and profile terms. Uniform23inflow only: no reverse-flow region, no blade-element section polars,24no compressibility. The equivalent flat-plate area f is an input25here, not a drag buildup.2627## Domain quick reference2829- Hover reference velocity: v_h = sqrt(T / (2 * rho * A)), the30 momentum-theory value at zero flight speed.31- Glauert inflow at flight speed V:32 v = T / (2 * rho * A * sqrt(V**2 + v**2)). The unique positive33 fixed point is found by substitution starting from v0 = v_h,34 stopping when |v_new - v| < tol (TOL = 1e-9, MAX_ITER = 60).35 Near hover the substitution contracts at about v**2 /36 (V**2 + v**2) per pass, so each pass applies the standard37 delta-squared acceleration to the last two substitution images38 when the denominator is usable; this keeps the default 5 to 10039 m/s sweep inside the iteration cap. Both routes converge on the40 same fixed point, and speed 0 returns v_h directly.41- Induced power: P_i = T * v (ideal, before the induced power42 factor).43- Parasite power: P_par = 0.5 * rho * V**3 * f, with f the44 equivalent flat-plate drag area of the airframe in m2.45- Profile power: P_prof = (1/8) * rho * sigma * Cd0 * A * V_tip**3,46 the average section drag model, sigma the rotor solidity and Cd047 the mean blade drag coefficient (CD0_DEFAULT = 0.012).48- Total power: P_total = k * T * v + P_prof + P_par, with the49 induced power factor k = K_DEFAULT = 1.15.50- Characteristic speeds over the sweep (5 to 100 m/s by default):51 best endurance speed minimizes P_total; best range speed proxy52 minimizes P_total / V. Induced power falls with speed while53 parasite power rises as V**3, so the best range speed always sits54 above the best endurance speed.55- Units are SI throughout: N, kg/m3, m2, m/s, W.56- 14 CFR Part 29 (FAR-29) frames rotorcraft performance57 requirements; the relations above are standard engineering58 methodology, summary-only.5960## Workflow61621. Fix the rotor and flight state: thrust T = weight from mass,63 rotor area A = pi * R**2, air density rho, and the flight speed V64 (hover_induced_velocity gives v_h for the reference point).652. Solve the Glauert inflow at the flight speed with66 glauert_induced_velocity; it returns the hover value at V = 0 and67 raises ValueError on negative speed and non-positive thrust, area68 or rho, and RuntimeError when max_iter is exhausted.693. Compute the induced power with induced_power (T * v), the70 parasite power with parasite_power (0.5 * rho * V**3 * f), and71 the profile power with profile_power (the same (1/8) blade drag72 model as the hover leaf).734. Combine them with total_power through the induced power factor74 k (default 1.15, matching the hover leaf).755. Sweep the flight speed with power_sweep to get the total power76 curve, then read the two characteristic speeds:77 best_endurance_speed (argmin of total power) and78 best_range_speed (argmin of total power over speed, returns the79 speed and the power-per-speed ratio).806. Confirm the deterministic checks with the contract test81 scripts/test_rotorcraft_forward_flight_performance.py.8283## Worked example8485Same rotor as the hover leaf: R = 5.0 m (A = 78.5398 m2), m = 2200 kg86(T = 21574.63 N), rho = 1.225 kg/m3, solidity 0.08, Cd0 = 0.012,87tip speed 220 m/s, f = 2.2 m2, k = 1.15.8889Power breakdown at V = 60 m/s (module outputs):9091| quantity | value |92| --- | --- |93| Glauert induced velocity | 1.868 m/s |94| Induced power T * v | 40297 W (40.3 kW) |95| Profile power | 122935 W (122.9 kW) |96| Parasite power | 291060 W (291.1 kW) |97| Total power (k = 1.15) | 460336 W (460.3 kW) |9899The hover induced velocity is 10.59 m/s, so forward flight at 60 m/s100cuts the induced velocity by a factor of about 5.7 and the total101power is dominated by parasite drag (63%).102103Characteristic speeds over the default sweep (module outputs):104best endurance speed 28.0 m/s, best range speed 45.0 m/s with105P/V = 6832 W per (m/s). The range speed sits strictly above the106endurance speed, as momentum theory requires. Note: the draft spec107window of 50 to 90 m/s for the best range speed is not reachable by108this model at f = 2.2 m2, where the P/V minimum of the parasite plus109induced balance lands near 45 m/s; the module value above is the110authoritative output of the spec model.111112## Verification113114- Confirm glauert_induced_velocity(21574.63, 78.5398, 1.225, 60.0)115 returns 1.868 m/s (spec bound 1.5 to 2.3 m/s) and that the same116 call at speed 0 returns the hover value 10.5887 m/s within 1e-6.117- Confirm the four power terms fall in the spec magnitude bounds at118 60 m/s: induced 35 000 to 50 000 W, profile 100 000 to 150 000 W,119 parasite 270 000 to 320 000 W, total 420 000 to 500 000 W.120- Confirm best_endurance_speed returns 28.0 m/s (bound 25 to 45 m/s)121 and best_range_speed returns 45.0 m/s strictly above it, with the122 P/V ratio 6832 W per (m/s) equal to the sweep minimum.123- Confirm every non-physical input raises ValueError: speed < 0,124 thrust <= 0, area <= 0, rho <= 0, f < 0, solidity <= 0, Cd0 <= 0,125 tip_speed <= 0, k <= 0.126- Confirm a forced max_iter = 2 on the Glauert iteration raises127 RuntimeError, and that the default cap converges at every default128 sweep speed.129- Run the contract test offline: python3130 scripts/test_rotorcraft_forward_flight_performance.py (34 tests,131 deterministic, no RNG).132133## Pitfalls134135- Treating the draft spec window as the model answer: the best range speed136 of this model at f = 2.2 m2 lands near 45 m/s (the draft 50-90 m/s window137 is not reachable); the module value is authoritative for the spec model.138- Starving the Glauert iteration: the inflow fixed point is found by139 substitution with a 60-iteration cap (RuntimeError when exhausted); the140 default 5-100 m/s sweep converges, but forcing max_iter = 2 raises141 RuntimeError by contract.142- Expecting induced power to rise with speed: induced velocity falls with143 flight speed (v ~ T/(2 rho A sqrt(V^2+v^2))) while parasite power rises as144 V^3, so best range speed always sits above best endurance speed; a lower145 range speed signals a sweep or formula error.146- Calling at V = 0 for the inflow: speed 0 returns the hover value v_h147 directly; negative speed raises ValueError.148- Using the hover power terms without the induced power factor: total power149 is k*T*v + P_profile + P_par with k = 1.15 default, matching the hover150 leaf convention.151152## Related leaves153154- flight-mechanics/performance/rotorcraft-hover-performance: the155 hover companion leaf; owns the hover induced velocity, figure of156 merit and disk loading, and shares this rotor and k = 1.15.157- flight-mechanics/performance/climb-performance: fixed-wing rate of158 climb and ceilings from excess power, the climb analog.159- flight-mechanics/performance/thrust-required: fixed-wing drag and160 thrust terms against which rotorcraft power is often compared.161162## Behavior contract (gate 3)163164Run the deterministic contract test (stdlib unittest, offline):165166 python3 scripts/test_rotorcraft_forward_flight_performance.py167168The test covers the worked-rotor power contract at 60 m/s (all four169magnitude bounds plus the exact module outputs), the Glauert speed170zero identity, the high-speed v_h**2 / V asymptote, the RuntimeError171failure mode, the parasite power monotonic sanity (20 m/s below17280 m/s), the default sweep shape (96 pairs from 5 to 100 m/s), the173best endurance and best range argmins with the strict ordering174physics check, and ValueError rejection of every non-physical input175class.176177## Compliance178179- Standards referenced, not reproduced: 14 CFR Part 29 (far-29) is180 US government work in the public domain; the momentum-theory181 relations above are standard engineering methodology, summary-only182 per standards-map.yaml.183- compliance: STANDARDS-REF, gated: false.