Rotorcraft Turn Performance (flight-mechanics/performance/rotorcraft-turn-performance)
Use when the task is the banked-turn performance of a helicopter rotor
at load factors above one: the uniform-inflow momentum theory of a
steady coordinated level turn, where the disk banks so the thrust axis
carries the resultant n times the weight, the turning induced velocity
at that raised thrust, the turn power breakdown into induced, profile
and parasite terms, and the sustained-load-factor an available power
supports at the turn speed. This leaf implements the momentum-theory
solve in pure Python, stdlib only, with the disk-plane free-stream
convention of the level-flight Glauert model. It pairs with
flight-mechanics/performance/rotorcraft-forward-flight-performance,
which supplies the n = 1 power conventions and worked rotor this leaf
reuses, and with flight-mechanics/performance/rotorcraft-hover-
performance, whose v_h reference is the V = 0 identity of the turning
inflow.
Domain quick reference
- Turn thrust: the rotor thrust in the banked level turn is the load
factor times the weight, T = n * W with W = m * g0. At n = 1 the
disk carries the level-flight weight; above one the rotor carries
more than the aircraft weight.
- Turning inflow (momentum theory, uniform inflow): the generalized
induced velocity v_i of the turn solves
n * W = 2 * rho * A * v_i * sqrt(V2 + v_i2), v_i >= 0, with
A = pi * R**2 the disk area. The left side is strictly increasing on
v_i >= 0, so the root is unique; a FIXED-COUNT bisection on
[0.0, sqrt(n * W / (2 * rho * A))] (BISECT_ITER = 120 iterations, no
tolerance early exit) returns it. At n = 1 the value reproduces the
level-flight Glauert inflow; at V = 0 it is sqrt(n * W / (2 * rho *
A)) = sqrt(n) * v_h.
- Induced power: P_i = k * n * W * v_i with the induced power factor
k = K_DEFAULT = 1.15, the hover and forward-flight convention.
- Profile power: P_prof = (1/8) * rho * sigma * Cd0 * A * V_tip**3,
the average-section-drag model shared with the hover and forward-
flight leaves; the turn keeps the rotor speed fixed, so the profile
power of the turn equals the level-flight value.
- Parasite power: P_par = 0.5 * rho * V3 * f with f the equivalent
flat-plate drag area; the V3 term makes the parasite power grow
fast with the turn speed.
- Total turn power: P_total = k * n * W * v_i + P_prof + P_par,
strictly increasing in the load factor because both n * W and v_i
rise with n.
- Sustained maneuver: the power-sustained-load-factor n_s is the
largest n whose turn power the available power covers, found by a
FIXED-COUNT bisection on [1.0, N_CEILING]; bank angle phi =
acos(1 / n_s), turn rate omega = G0 * sqrt(n2 - 1) / V and turn
radius R_t = V2 / (G0 * sqrt(n**2 - 1)) close the maneuver with
G0 = 9.80665 m/s2.
- Units are SI throughout: N, W, m/s, m2, kg/m3, rad. Angles are in
rad; radians convert to degrees by 180 / pi.
- 14 CFR Part 29 (far-29) frames the rotorcraft context; the relations
above are standard engineering methodology, summary-only.
Workflow
- Fix the turn state and the rotor: load factor n >= 1, true airspeed
V, rotor radius R (disk area A = pi * R**2), rotorcraft mass m
(weight W = m * g0), density rho, solidity sigma, blade drag
coefficient Cd0, tip speed, flat-plate drag area f and induced
power factor k. Record the hover reference v_h = sqrt(W / (2 * rho
- Raise the thrust to the load factor: thrust_for_turn returns
T = n * W and rejects load factors below 1 with ValueError.
- Solve the turning-flight-inflow: generalized_induced_velocity
bisects on [0.0, sqrt(n * W / (2 * rho * A))] for v_i at the
n-times-weight thrust. Check the identities: speed zero returns
sqrt(n) * v_h, and at fixed n the inflow falls as the speed grows.
- Break down the banked-turn-power: turn_power returns the dict
{load_factor, thrust, induced_velocity, induced_power,
profile_power, parasite_power, total_power} through induced_power,
profile_power and parasite_power in the fixed order above. Confirm
the n = 1 total equals the level-flight total of the forward-flight
leaf at the same speed.
- Invert for the power-sustained-load-factor: sustained_load_factor
bisects h(n) = total power at n minus available power on
[1.0, N_CEILING] and returns the sustained-load-factor with its
bank_angle, the turning induced velocity, the power terms and a
note of "power-limited" or "power-excess above ceiling". Get the
same bank angle in one solve with max_bank_from_power.
- Close the maneuver kinematics: bank_from_load_factor gives the
power-limited-bank-angle acos(1 / n); turn_rate and turn_radius
give omega and R_t at the sustained point. Verify omega * R_t = V
and cos(bank) = 1 / n.
- Confirm determinism: repeated calls return bit-identical values and
the note strings are fixed, then run the contract test
scripts/test_rotorcraft_turn_performance.py.
Worked example
Shared worked rotor (identical to the hover and forward-flight worked
rotors): R = 5.0 m (A = 78.5398 m2), m = 2200 kg so W = m * g0 =
21574.63 N, rho = 1.225 kg/m3, solidity sigma = 0.08, Cd0 = 0.012,
tip speed 220 m/s, f = 2.2 m2, k = 1.15. Sea level.
- Hover reference at V = 0: v_h = sqrt(W / (2 * rho * A)) = 10.5887
m/s at n = 1; at n = 2 the turn inflow is sqrt(2) * v_h =
14.9747 m/s.
- Banked turn at n = 2.0, V = 60 m/s (module outputs): thrust
T = 43149.3 N, turning induced velocity 3.73017 m/s, induced power
185097 W, profile power 122935 W, parasite power 291060 W, total
turn power 599092 W; bank angle acos(1/2) = 1.0472 rad (60 deg),
turn rate 0.283094 rad/s, turn radius 211.944 m. The induced
velocity at n = 2 is about twice the level-flight value 1.86778 m/s
at the same speed, and the level-flight total power of 460336 W
(the n = 1 identity, matching the forward-flight leaf worked
example) grows by about 138 kW to sustain the 2 g turn at 60 m/s.
- Second state, n = 1.5 at V = 40 m/s: induced velocity 4.18175 m/s,
induced power 155629 W, total 364804 W. Third inflow probe, n = 3.0
at V = 60 m/s: induced velocity 5.58195 m/s.
- Power-sustained maneuver: available power 600000 W at V = 60 m/s
gives sustained-load-factor 2.00491, bank angle 1.04861 rad
(60.081 deg), turning induced velocity 3.73929 m/s, induced power
186005 W, total power at the sustained point 600000 W, turn rate
0.28402 rad/s and turn radius 211.253 m; max_bank_from_power
returns 1.04861 rad.
- With available power 450000 W at V = 40 m/s the sustained-load-
factor falls to 1.86867 (rate 0.387015 rad/s, radius 103.355 m),
and at the same power and V = 50 m/s it falls further to 1.69094
(rate 0.267439 rad/s, radius 186.959 m): the parasite V**3 growth
cuts the sustained-load-factor as the speed rises at fixed power.
Verification
- Confirm generalized_induced_velocity(2.0, 21574.63, 78.5398, 1.225,
60.0) returns 3.73017 m/s and that the n = 1, V = 0 and n = 2, V =
0 calls return 10.5887 and 14.9747 m/s (sqrt(2) times v_h).
- Confirm turn_power at n = 2, V = 60 m/s totals 599092 W and that the
n = 1 total at 60 m/s is 460336 W, equal to the forward-flight leaf
worked total at that speed.
- Confirm sustained_load_factor(600000.0, 21574.63, 78.5398, 1.225,
60.0, 0.08, 0.012, 220.0, 2.2) returns load_factor 2.00491 with note
"power-limited" and that turn_power at the returned load factor
reproduces the available power (round trip).
- Confirm every non-physical input raises ValueError: load factor
below 1, non-positive weight, area, rho, solidity, drag
coefficient, tip speed, k or available power, negative speed, a
ceiling at or below 1, and available power below the n = 1 total at
the speed (level flight not sustainable).
- Run the contract test offline: python3
scripts/test_rotorcraft_turn_performance.py (34 tests,
deterministic).
Related leaves
- flight-mechanics/performance/rotorcraft-forward-flight-performance:
the level-flight Glauert inflow and power conventions this leaf
reuses at n = 1; its worked rotor and total power are identical.
- flight-mechanics/performance/rotorcraft-hover-performance: the hover
v_h reference and V = 0 limit of the turning inflow.
- flight-mechanics/performance/turn-performance: the fixed-wing
level-turn kinematics (omega, R_t, load factor from bank) for
aircraft without a rotor inflow model.
- flight-mechanics/performance/rotorcraft-vertical-climb-performance:
the bracket convention of the "power-excess above ceiling" note and
its climb power solves.
- flight-mechanics/performance/rotorcraft-range-endurance: fuel
closure on the level power curve, downstream of the turn power
estimate.
Pitfalls
- Reusing the level-flight induced velocity in the turn: at n = 2 the
turning inflow is 3.73017 m/s against 1.86778 m/s level at 60 m/s,
so the power must be built on the n-times-weight thrust or the turn
is understated by a factor near n in the induced term.
- Forgetting the induced power factor: the induced term is k * n * W *
v_i with k = 1.15, not the ideal n * W * v_i; dropping k
understates P_i by 15 percent (185097 W against 160954 W at n = 2,
60 m/s).
- Feeding n into the profile or parasite power: the turn keeps the
rotor speed fixed and the free stream in the disk plane, so
profile_power and parasite_power do not depend on n; only the
induced term carries the load factor.
- Reading the excess case as a bisection result: when the total power
at n = N_CEILING stays below the available power, the sustained
solve returns load_factor = N_CEILING with note "power-excess above
ceiling"; the bracket convention does not extrapolate beyond the
ceiling.
- Ignoring the level-flight floor: an available power below the n = 1
total at the turn speed (460336 W at 60 m/s on the worked rotor)
raises ValueError, because no banked turn exists at a speed whose
level flight the power cannot sustain.
- Writing the compound terms with spaces: sustained-load-factor and
power-limited-bank-angle are the leaf's routing tokens; keep them
hyphenated in the description so they do not tokenize into generic
words owned by the fixed-wing turn leaf.
Contract test
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_rotorcraft_turn_performance.py
It covers the turning-flight-inflow anchors at n = 1, 1.5, 2 and 3
against the level-flight Glauert and sqrt(n) * v_h identities, the
banked-turn-power breakdown anchors (induced 185097 W, profile
122935 W, parasite 291060 W, total 599092 W at n = 2, 60 m/s), the
n = 1 total power identity with the forward-flight leaf, the monotone
power and inflow behaviors, the sustained-load-factor solves with
their power round trips and fixed note strings, the kinematics
anchors with the omega * R_t = V and cos(bank) = 1 / n identities,
determinism of repeated calls, and ValueError rejection of every
non-physical input class in the spec validation list.
Behavior contract (gate 3)
The leaf is deterministic: pure stdlib math, FIXED-COUNT bisection
schedules (BISECT_ITER = 120), no RNG, no network, no external
processes. The contract test above must pass in full before the leaf
is rated; its 34 test methods exercise every workflow step of this
SKILL.md and every validation item of the wave-41 spec.
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-turn-performance3description: Use when you must determine the banked-turn power of a helicopter rotor from momentum theory: the turning-flight inflow solved for the n-times-weight thrust of the banked level turn, the banked-turn-power breakdown into induced, profile and parasite terms, the sustained-load-factor an available power supports at the turn speed, the power-limited bank angle, and the turn rate and radius of the sustained maneuver. Produces the turn induced velocity, the turn power breakdown, the sustained-load-factor, bank angle, turn rate and turn radius that gate a rotorcraft maneuvering-power check at a chosen density. Momentum theory for level turns above one g only, not the fixed-wing method, level-flight power curve, hover, climb or autorotation. Trigger: helicopter banked turn, turning-flight inflow, rotorcraft turn power, sustained load factor, power-limited bank angle.4license: Apache-2.05---67# Rotorcraft Turn Performance (flight-mechanics/performance/rotorcraft-turn-performance)89Use when the task is the banked-turn performance of a helicopter rotor10at load factors above one: the uniform-inflow momentum theory of a11steady coordinated level turn, where the disk banks so the thrust axis12carries the resultant n times the weight, the turning induced velocity13at that raised thrust, the turn power breakdown into induced, profile14and parasite terms, and the sustained-load-factor an available power15supports at the turn speed. This leaf implements the momentum-theory16solve in pure Python, stdlib only, with the disk-plane free-stream17convention of the level-flight Glauert model. It pairs with18flight-mechanics/performance/rotorcraft-forward-flight-performance,19which supplies the n = 1 power conventions and worked rotor this leaf20reuses, and with flight-mechanics/performance/rotorcraft-hover-21performance, whose v_h reference is the V = 0 identity of the turning22inflow.2324## Domain quick reference2526- Turn thrust: the rotor thrust in the banked level turn is the load27 factor times the weight, T = n * W with W = m * g0. At n = 1 the28 disk carries the level-flight weight; above one the rotor carries29 more than the aircraft weight.30- Turning inflow (momentum theory, uniform inflow): the generalized31 induced velocity v_i of the turn solves32 n * W = 2 * rho * A * v_i * sqrt(V**2 + v_i**2), v_i >= 0, with33 A = pi * R**2 the disk area. The left side is strictly increasing on34 v_i >= 0, so the root is unique; a FIXED-COUNT bisection on35 [0.0, sqrt(n * W / (2 * rho * A))] (BISECT_ITER = 120 iterations, no36 tolerance early exit) returns it. At n = 1 the value reproduces the37 level-flight Glauert inflow; at V = 0 it is sqrt(n * W / (2 * rho *38 A)) = sqrt(n) * v_h.39- Induced power: P_i = k * n * W * v_i with the induced power factor40 k = K_DEFAULT = 1.15, the hover and forward-flight convention.41- Profile power: P_prof = (1/8) * rho * sigma * Cd0 * A * V_tip**3,42 the average-section-drag model shared with the hover and forward-43 flight leaves; the turn keeps the rotor speed fixed, so the profile44 power of the turn equals the level-flight value.45- Parasite power: P_par = 0.5 * rho * V**3 * f with f the equivalent46 flat-plate drag area; the V**3 term makes the parasite power grow47 fast with the turn speed.48- Total turn power: P_total = k * n * W * v_i + P_prof + P_par,49 strictly increasing in the load factor because both n * W and v_i50 rise with n.51- Sustained maneuver: the power-sustained-load-factor n_s is the52 largest n whose turn power the available power covers, found by a53 FIXED-COUNT bisection on [1.0, N_CEILING]; bank angle phi =54 acos(1 / n_s), turn rate omega = G0 * sqrt(n**2 - 1) / V and turn55 radius R_t = V**2 / (G0 * sqrt(n**2 - 1)) close the maneuver with56 G0 = 9.80665 m/s2.57- Units are SI throughout: N, W, m/s, m2, kg/m3, rad. Angles are in58 rad; radians convert to degrees by 180 / pi.59- 14 CFR Part 29 (far-29) frames the rotorcraft context; the relations60 above are standard engineering methodology, summary-only.6162## Workflow63641. Fix the turn state and the rotor: load factor n >= 1, true airspeed65 V, rotor radius R (disk area A = pi * R**2), rotorcraft mass m66 (weight W = m * g0), density rho, solidity sigma, blade drag67 coefficient Cd0, tip speed, flat-plate drag area f and induced68 power factor k. Record the hover reference v_h = sqrt(W / (2 * rho69 * A)).702. Raise the thrust to the load factor: thrust_for_turn returns71 T = n * W and rejects load factors below 1 with ValueError.723. Solve the turning-flight-inflow: generalized_induced_velocity73 bisects on [0.0, sqrt(n * W / (2 * rho * A))] for v_i at the74 n-times-weight thrust. Check the identities: speed zero returns75 sqrt(n) * v_h, and at fixed n the inflow falls as the speed grows.764. Break down the banked-turn-power: turn_power returns the dict77 {load_factor, thrust, induced_velocity, induced_power,78 profile_power, parasite_power, total_power} through induced_power,79 profile_power and parasite_power in the fixed order above. Confirm80 the n = 1 total equals the level-flight total of the forward-flight81 leaf at the same speed.825. Invert for the power-sustained-load-factor: sustained_load_factor83 bisects h(n) = total power at n minus available power on84 [1.0, N_CEILING] and returns the sustained-load-factor with its85 bank_angle, the turning induced velocity, the power terms and a86 note of "power-limited" or "power-excess above ceiling". Get the87 same bank angle in one solve with max_bank_from_power.886. Close the maneuver kinematics: bank_from_load_factor gives the89 power-limited-bank-angle acos(1 / n); turn_rate and turn_radius90 give omega and R_t at the sustained point. Verify omega * R_t = V91 and cos(bank) = 1 / n.927. Confirm determinism: repeated calls return bit-identical values and93 the note strings are fixed, then run the contract test94 scripts/test_rotorcraft_turn_performance.py.9596## Worked example9798Shared worked rotor (identical to the hover and forward-flight worked99rotors): R = 5.0 m (A = 78.5398 m2), m = 2200 kg so W = m * g0 =10021574.63 N, rho = 1.225 kg/m3, solidity sigma = 0.08, Cd0 = 0.012,101tip speed 220 m/s, f = 2.2 m2, k = 1.15. Sea level.102103- Hover reference at V = 0: v_h = sqrt(W / (2 * rho * A)) = 10.5887104 m/s at n = 1; at n = 2 the turn inflow is sqrt(2) * v_h =105 14.9747 m/s.106- Banked turn at n = 2.0, V = 60 m/s (module outputs): thrust107 T = 43149.3 N, turning induced velocity 3.73017 m/s, induced power108 185097 W, profile power 122935 W, parasite power 291060 W, total109 turn power 599092 W; bank angle acos(1/2) = 1.0472 rad (60 deg),110 turn rate 0.283094 rad/s, turn radius 211.944 m. The induced111 velocity at n = 2 is about twice the level-flight value 1.86778 m/s112 at the same speed, and the level-flight total power of 460336 W113 (the n = 1 identity, matching the forward-flight leaf worked114 example) grows by about 138 kW to sustain the 2 g turn at 60 m/s.115- Second state, n = 1.5 at V = 40 m/s: induced velocity 4.18175 m/s,116 induced power 155629 W, total 364804 W. Third inflow probe, n = 3.0117 at V = 60 m/s: induced velocity 5.58195 m/s.118- Power-sustained maneuver: available power 600000 W at V = 60 m/s119 gives sustained-load-factor 2.00491, bank angle 1.04861 rad120 (60.081 deg), turning induced velocity 3.73929 m/s, induced power121 186005 W, total power at the sustained point 600000 W, turn rate122 0.28402 rad/s and turn radius 211.253 m; max_bank_from_power123 returns 1.04861 rad.124- With available power 450000 W at V = 40 m/s the sustained-load-125 factor falls to 1.86867 (rate 0.387015 rad/s, radius 103.355 m),126 and at the same power and V = 50 m/s it falls further to 1.69094127 (rate 0.267439 rad/s, radius 186.959 m): the parasite V**3 growth128 cuts the sustained-load-factor as the speed rises at fixed power.129130## Verification131132- Confirm generalized_induced_velocity(2.0, 21574.63, 78.5398, 1.225,133 60.0) returns 3.73017 m/s and that the n = 1, V = 0 and n = 2, V =134 0 calls return 10.5887 and 14.9747 m/s (sqrt(2) times v_h).135- Confirm turn_power at n = 2, V = 60 m/s totals 599092 W and that the136 n = 1 total at 60 m/s is 460336 W, equal to the forward-flight leaf137 worked total at that speed.138- Confirm sustained_load_factor(600000.0, 21574.63, 78.5398, 1.225,139 60.0, 0.08, 0.012, 220.0, 2.2) returns load_factor 2.00491 with note140 "power-limited" and that turn_power at the returned load factor141 reproduces the available power (round trip).142- Confirm every non-physical input raises ValueError: load factor143 below 1, non-positive weight, area, rho, solidity, drag144 coefficient, tip speed, k or available power, negative speed, a145 ceiling at or below 1, and available power below the n = 1 total at146 the speed (level flight not sustainable).147- Run the contract test offline: python3148 scripts/test_rotorcraft_turn_performance.py (34 tests,149 deterministic).150151## Related leaves152153- flight-mechanics/performance/rotorcraft-forward-flight-performance:154 the level-flight Glauert inflow and power conventions this leaf155 reuses at n = 1; its worked rotor and total power are identical.156- flight-mechanics/performance/rotorcraft-hover-performance: the hover157 v_h reference and V = 0 limit of the turning inflow.158- flight-mechanics/performance/turn-performance: the fixed-wing159 level-turn kinematics (omega, R_t, load factor from bank) for160 aircraft without a rotor inflow model.161- flight-mechanics/performance/rotorcraft-vertical-climb-performance:162 the bracket convention of the "power-excess above ceiling" note and163 its climb power solves.164- flight-mechanics/performance/rotorcraft-range-endurance: fuel165 closure on the level power curve, downstream of the turn power166 estimate.167168## Pitfalls169170- Reusing the level-flight induced velocity in the turn: at n = 2 the171 turning inflow is 3.73017 m/s against 1.86778 m/s level at 60 m/s,172 so the power must be built on the n-times-weight thrust or the turn173 is understated by a factor near n in the induced term.174- Forgetting the induced power factor: the induced term is k * n * W *175 v_i with k = 1.15, not the ideal n * W * v_i; dropping k176 understates P_i by 15 percent (185097 W against 160954 W at n = 2,177 60 m/s).178- Feeding n into the profile or parasite power: the turn keeps the179 rotor speed fixed and the free stream in the disk plane, so180 profile_power and parasite_power do not depend on n; only the181 induced term carries the load factor.182- Reading the excess case as a bisection result: when the total power183 at n = N_CEILING stays below the available power, the sustained184 solve returns load_factor = N_CEILING with note "power-excess above185 ceiling"; the bracket convention does not extrapolate beyond the186 ceiling.187- Ignoring the level-flight floor: an available power below the n = 1188 total at the turn speed (460336 W at 60 m/s on the worked rotor)189 raises ValueError, because no banked turn exists at a speed whose190 level flight the power cannot sustain.191- Writing the compound terms with spaces: sustained-load-factor and192 power-limited-bank-angle are the leaf's routing tokens; keep them193 hyphenated in the description so they do not tokenize into generic194 words owned by the fixed-wing turn leaf.195196## Contract test197198Run the deterministic contract test (stdlib unittest, offline):199200 python3 scripts/test_rotorcraft_turn_performance.py201202It covers the turning-flight-inflow anchors at n = 1, 1.5, 2 and 3203against the level-flight Glauert and sqrt(n) * v_h identities, the204banked-turn-power breakdown anchors (induced 185097 W, profile205122935 W, parasite 291060 W, total 599092 W at n = 2, 60 m/s), the206n = 1 total power identity with the forward-flight leaf, the monotone207power and inflow behaviors, the sustained-load-factor solves with208their power round trips and fixed note strings, the kinematics209anchors with the omega * R_t = V and cos(bank) = 1 / n identities,210determinism of repeated calls, and ValueError rejection of every211non-physical input class in the spec validation list.212213## Behavior contract (gate 3)214215The leaf is deterministic: pure stdlib math, FIXED-COUNT bisection216schedules (BISECT_ITER = 120), no RNG, no network, no external217processes. The contract test above must pass in full before the leaf218is rated; its 34 test methods exercise every workflow step of this219SKILL.md and every validation item of the wave-41 spec.220221## Compliance222223- Standards referenced, not reproduced: 14 CFR Part 29 (far-29) is US224 government work in the public domain; the momentum-theory relations225 above are standard engineering methodology, summary-only per226 standards-map.yaml.227- compliance: STANDARDS-REF, gated: false.