Rotorcraft Blade-Element Hover Performance (flight-mechanics/performance/rotorcraft-blade-element-hover-performance)
Use when you must determine the blade-element hover performance of a
helicopter main rotor: the rotor thrust coefficient C_T and inflow
ratio from the pitch schedule, the collective pitch required to hover,
and the torque coefficient (induced plus profile split), rotor shaft
torque and figure of merit that follow from the coefficients. This is
the pitch-to-coefficients chain, theta0 to C_T/C_Q to torque/FM, the
blade-element member of the rotorcraft vertical-flight group: the
sibling flight-mechanics/performance/rotorcraft-hover-performance leaf
takes thrust as input and is momentum-only (no C_T, C_Q, theta0,
lift-curve slope, twist or tip-loss factor in its logic), while this
leaf integrates the blade loading over the pitch schedule with the Betz
tip loss factor B. Modeled in pure Python, stdlib only, deterministic.
The blade-element and momentum models agree exactly at B = 1: shaft
power from the torque coefficient equals P_ideal + P_profile of the
momentum model and the figure of merit from coefficients equals the
momentum power ratio, which the contract test verifies against the
sibling module.
Domain quick reference
All quantities are SI. Rotor radius R, disk area A = PI * R^2, tip
speed Vtip = Omega * R, solidity sigma, mean blade drag coefficient
Cd0, lift-curve slope a (1/rad), thrust T. The hover thrust equals the
rotorcraft weight: T = m * G, G = 9.80665 m/s^2.
- Blade-element thrust coefficient: C_T = (sigma * a / 2) * (theta0 *
B^3 / 3 - lambda * B^2 / 2), with theta0 the collective pitch (rad)
and B the Betz tip loss factor in (0, 1]. The B^3/3 term integrates
the pitch loading over the blade; the B^2/2 term removes the inflow
incidence.
- Thrust coefficient from thrust: C_T = T / (rho * A * Vtip^2), the
standard definition used to close the hover state.
- Inflow closure (uniform inflow in hover): lambda = v_i / Vtip =
sqrt(C_T / 2). The hover momentum balance C_T = 2 * lambda^2 closes
the inflow ratio directly from the thrust coefficient.
- Collective for a target C_T: theta0 = (3 / B^3) * (2 * C_T / (sigma *
a) + lambda * B^2 / 2) with lambda = sqrt(C_T / 2). Tip loss below 1
raises the required collective at fixed thrust coefficient (about 6%
at B = 0.97 on the worked rotor).
- Torque coefficient: C_Q = lambda * C_T + sigma * Cd0 / 8, the induced
contribution lambda * C_T carrying the inflow work and the profile
contribution sigma * Cd0 / 8 the section drag.
- Rotor shaft torque: Q = C_Q * rho * A * Vtip^2 * R in N m.
- Rotor shaft power: P = Q * Omega = C_Q * rho * A * Vtip^3 in W. At
B = 1 with the closure lambda this equals the momentum hover total
P_ideal + P_profile of the sibling leaf, and each term matches its
momentum counterpart separately.
- Figure of merit from coefficients: FM = C_T^1.5 / (sqrt(2) * C_Q),
the same ratio the momentum leaf forms from powers.
- Defaults: rho = 1.225 kg/m^3 at sea level, lift-curve slope
a = 5.73 1/rad. Modelled twist is zero (untwisted, constant-chord
blade integral); the assumption is recorded here because the spec
formula integrates theta0 as constant along the blade.
- FAR 29 frames the rotorcraft certification context; the relations
above are standard engineering methodology, summary-only.
Workflow
- Fix the operating point: rotor radius R, rotorcraft mass m (hover
thrust T = m * G), density rho, solidity sigma, mean blade drag
coefficient Cd0, tip speed Vtip, lift-curve slope a and Betz tip
loss factor B.
- Get the thrust coefficient from the thrust with the standard
definition C_T = T / (rho * A * Vtip^2), or start from a target
C_T directly.
- Close the inflow with inflow_ratio_from_ct(c_t), giving
lambda = sqrt(C_T / 2).
- Recover the required collective with
collective_for_thrust_coefficient(c_t, solidity, lift_slope,
tip_loss) and convert to degrees; compare against the published
5-10 deg hover collective band.
- Split the torque coefficient with torque_coefficient(c_t, lambda,
solidity, drag_coefficient) and confirm the induced term
lambda * C_T plus the profile term sigma * Cd0 / 8 gives the total.
- Get the rotor shaft torque with rotor_torque(c_q, rho, area,
tip_speed, radius) and the shaft power with
rotor_power_from_torque; both consume the same arguments.
- Compute the figure of merit with
figure_of_merit_from_coefficients(c_t, c_q) and check it against
the momentum power ratio for the same rotor.
- For a single-call verdict on one hover state run
hover_blade_element_summary(thrust_N, radius_m, rho, solidity,
lift_slope, drag_coefficient, tip_speed, tip_loss, collective_rad),
which returns the full dict and verifies the supplied collective
reproduces the thrust-derived C_T (mismatched inputs raise
ValueError). For a sweep run collective_pitch_polar(collectives_rad,
...), which closes lambda by fixed-point iteration for every entry.
- Confirm the deterministic checks with the contract test
scripts/test_rotorcraft_blade_element_hover_performance.py.
Worked example
The reference rotor (identical to the momentum hover-leaf example):
R = 5.0 m, m = 2200 kg, rho = 1.225 kg/m^3, sigma = 0.08, Cd0 = 0.012,
Vtip = 220 m/s, a = 5.73 1/rad. Real module outputs:
- Thrust: 2200 * 9.80665 = 21574.63 N; disk area PI * 5.0^2 = 78.54
m^2.
- Thrust coefficient: C_T = 0.0046331 (spec bound about 0.00463).
- Inflow ratio: inflow_ratio_from_ct gives lambda = 0.048131, the hand
value sqrt(C_T / 2).
- Collective at B = 1: theta0 = 0.132839 rad = 7.61 deg (spec about
0.1328 rad, 7.6 deg; within the 5-10 deg band).
- Collective at B = 0.97: theta0 = 0.140874 rad = 8.07 deg (spec about
0.1409 rad, 8.1 deg), 6.05% higher than at B = 1.
- Torque coefficient split: induced lambda * C_T = 2.2299e-4, profile
sigma * Cd0 / 8 = 1.2000e-4 exactly, total C_Q = 3.4299e-4 (spec
about 3.43e-4).
- Rotor torque: Q = 7985.97 N m (spec about 7986 N m).
- Rotor shaft power: P = 351382.76 W, equal to the momentum hover
P_ideal + P_profile = 228447.84 + 122934.92 W to 1.7e-16 relative.
- Figure of merit: FM = 0.650140 (spec about 0.650), equal to the
momentum FM ratio 228447.84 / 351382.76 = 0.650140.
- Round trip: feeding the recovered theta0 back through
thrust_coefficient returns C_T to 1e-9 relative at both B = 1 and
B = 0.97.
Verification
- Confirm hover_blade_element_summary on the reference rotor returns
thrust_coefficient 0.0046331, inflow_ratio 0.048131,
torque_coefficient_total 3.4299e-4, rotor_torque_Nm 7985.97,
rotor_power_W 351382.76 and figure_of_merit 0.650140, with the
induced plus profile split summing to the total to 1e-12.
- Confirm collective_for_thrust_coefficient returns 0.132839 rad at
B = 1 and 0.140874 rad at B = 0.97, and that both round-trip
through thrust_coefficient to the target C_T within 1e-9.
- Confirm the cross-leaf identity at B = 1: power from the torque
coefficient equals the momentum P_ideal + P_profile within 1e-6
relative and the coefficient FM equals the momentum power ratio
within 1e-9 (both verified against the sibling module by the
contract test).
- Confirm tip-loss monotonicity: B = 0.97 requires a higher collective
than B = 1.0, and higher B gives a higher C_T at fixed collective.
- Confirm the ideal-limit check FM <= 1: at the ideal C_Q =
C_T^1.5 / sqrt(2) the figure of merit is exactly 1, and the worked
FM sits inside (0, 1).
- Confirm every non-positive solidity, lift slope, drag coefficient,
tip speed, radius, rho, thrust, and every tip loss outside (0, 1],
negative collective, negative c_t and non-positive c_q raises
ValueError, and that a collective which does not reproduce the
thrust-derived C_T is rejected by the summary.
- Confirm determinism: repeated runs return identical floats (no RNG,
stdlib only).
- Run the contract test offline: python3
scripts/test_rotorcraft_blade_element_hover_performance.py (34
tests, deterministic).
Pitfalls
- Letting the Betz factor out of (0, 1]: B = 1 is the no-tip-loss limit
where the blade-element power equals the momentum P_ideal + P_profile, and
B = 0.97 already raises the required collective about 6%; B outside (0, 1]
raises ValueError.
- Mixing radians and degrees for collective: the module works in radians
(theta0 = 0.132839 rad = 7.61 deg on the reference rotor) and the
published 5-10 deg band is in degrees; compare after conversion, not on
the raw number.
- Calling the summary with a collective that does not reproduce the thrust:
hover_blade_element_summary verifies the supplied collective reproduces
the thrust-derived C_T and raises ValueError on a mismatch, so pass one
consistent hover state rather than a sweep point.
- Splitting the torque coefficient incorrectly: the induced term is
lambdaC_T and the profile term sigmaCd0/8; they must sum to the total to
1e-12, so do not double count profile drag when you already have a total
C_Q.
- Reading the figure of merit above 1: FM = C_T^1.5/(sqrt(2)*C_Q) sits in
(0, 1) for a real rotor and equals exactly 1 only at the ideal C_Q; an FM
at or above 1 flags a coefficient inconsistency.
Related leaves
- flight-mechanics/performance/rotorcraft-hover-performance: the
momentum-theory power leaf; the B = 1 cross-leaf identity ties the
two models.
- flight-mechanics/performance/rotorcraft-blade-flapping-dynamics:
blade dynamics sibling that also consumes theta0.
- flight-mechanics/performance/rotorcraft-tail-rotor-sizing.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_rotorcraft_blade_element_hover_performance.py
The test covers the worked example with the spec magnitude bounds
(C_T about 0.00463, inflow about 0.0481, theta0 about 0.1328 rad at
B = 1 and 0.1409 rad at B = 0.97, C_Q about 3.43e-4, Q about 7986 N m,
P about 351383 W, FM about 0.650), the closed-form formulas checked
against independent hand computation, the collective round trip to C_T
at 1e-9, the torque split identity with the profile term equal to
sigma * Cd0 / 8 exactly, the power and FM cross-leaf identities against
the momentum hover leaf, tip-loss monotonicity, figure-of-merit bounds
with the ideal limit, exact dict keys of the summary and polar chains,
the fixed-point inflow closure of the polar, run-to-run determinism,
absence of random or external imports, and ValueError rejection of
every non-physical input in the validation list.
Compliance
- Standards referenced, not reproduced: FAR 29 (rotorcraft
airworthiness, certification context only). The blade-element hover
relations above are standard engineering methodology, summary-only
per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: rotorcraft-blade-element-hover-performance3description: Use when you must determine the blade-element hover performance of a helicopter main rotor: the thrust coefficient from the collective pitch schedule, rotor solidity, lift-curve slope and Betz tip loss factor, the inflow ratio from the uniform-inflow hover closure, the collective pitch required to hover at a target thrust coefficient, the torque coefficient with its induced and profile split, and the rotor shaft torque, shaft power and hover figure of merit from the coefficients. Produces a hover blade-element summary and a collective pitch polar across the pitch range of the same rotor. Trigger: blade element theory, thrust coefficient, torque coefficient, collective pitch, tip loss factor, hover figure of merit.4license: Apache-2.05---67# Rotorcraft Blade-Element Hover Performance (flight-mechanics/performance/rotorcraft-blade-element-hover-performance)89Use when you must determine the blade-element hover performance of a10helicopter main rotor: the rotor thrust coefficient C_T and inflow11ratio from the pitch schedule, the collective pitch required to hover,12and the torque coefficient (induced plus profile split), rotor shaft13torque and figure of merit that follow from the coefficients. This is14the pitch-to-coefficients chain, theta0 to C_T/C_Q to torque/FM, the15blade-element member of the rotorcraft vertical-flight group: the16sibling flight-mechanics/performance/rotorcraft-hover-performance leaf17takes thrust as input and is momentum-only (no C_T, C_Q, theta0,18lift-curve slope, twist or tip-loss factor in its logic), while this19leaf integrates the blade loading over the pitch schedule with the Betz20tip loss factor B. Modeled in pure Python, stdlib only, deterministic.21The blade-element and momentum models agree exactly at B = 1: shaft22power from the torque coefficient equals P_ideal + P_profile of the23momentum model and the figure of merit from coefficients equals the24momentum power ratio, which the contract test verifies against the25sibling module.2627## Domain quick reference2829All quantities are SI. Rotor radius R, disk area A = PI * R^2, tip30speed Vtip = Omega * R, solidity sigma, mean blade drag coefficient31Cd0, lift-curve slope a (1/rad), thrust T. The hover thrust equals the32rotorcraft weight: T = m * G, G = 9.80665 m/s^2.3334- Blade-element thrust coefficient: C_T = (sigma * a / 2) * (theta0 *35 B^3 / 3 - lambda * B^2 / 2), with theta0 the collective pitch (rad)36 and B the Betz tip loss factor in (0, 1]. The B^3/3 term integrates37 the pitch loading over the blade; the B^2/2 term removes the inflow38 incidence.39- Thrust coefficient from thrust: C_T = T / (rho * A * Vtip^2), the40 standard definition used to close the hover state.41- Inflow closure (uniform inflow in hover): lambda = v_i / Vtip =42 sqrt(C_T / 2). The hover momentum balance C_T = 2 * lambda^2 closes43 the inflow ratio directly from the thrust coefficient.44- Collective for a target C_T: theta0 = (3 / B^3) * (2 * C_T / (sigma *45 a) + lambda * B^2 / 2) with lambda = sqrt(C_T / 2). Tip loss below 146 raises the required collective at fixed thrust coefficient (about 6%47 at B = 0.97 on the worked rotor).48- Torque coefficient: C_Q = lambda * C_T + sigma * Cd0 / 8, the induced49 contribution lambda * C_T carrying the inflow work and the profile50 contribution sigma * Cd0 / 8 the section drag.51- Rotor shaft torque: Q = C_Q * rho * A * Vtip^2 * R in N m.52- Rotor shaft power: P = Q * Omega = C_Q * rho * A * Vtip^3 in W. At53 B = 1 with the closure lambda this equals the momentum hover total54 P_ideal + P_profile of the sibling leaf, and each term matches its55 momentum counterpart separately.56- Figure of merit from coefficients: FM = C_T^1.5 / (sqrt(2) * C_Q),57 the same ratio the momentum leaf forms from powers.58- Defaults: rho = 1.225 kg/m^3 at sea level, lift-curve slope59 a = 5.73 1/rad. Modelled twist is zero (untwisted, constant-chord60 blade integral); the assumption is recorded here because the spec61 formula integrates theta0 as constant along the blade.62- FAR 29 frames the rotorcraft certification context; the relations63 above are standard engineering methodology, summary-only.6465## Workflow66671. Fix the operating point: rotor radius R, rotorcraft mass m (hover68 thrust T = m * G), density rho, solidity sigma, mean blade drag69 coefficient Cd0, tip speed Vtip, lift-curve slope a and Betz tip70 loss factor B.712. Get the thrust coefficient from the thrust with the standard72 definition C_T = T / (rho * A * Vtip^2), or start from a target73 C_T directly.743. Close the inflow with inflow_ratio_from_ct(c_t), giving75 lambda = sqrt(C_T / 2).764. Recover the required collective with77 collective_for_thrust_coefficient(c_t, solidity, lift_slope,78 tip_loss) and convert to degrees; compare against the published79 5-10 deg hover collective band.805. Split the torque coefficient with torque_coefficient(c_t, lambda,81 solidity, drag_coefficient) and confirm the induced term82 lambda * C_T plus the profile term sigma * Cd0 / 8 gives the total.836. Get the rotor shaft torque with rotor_torque(c_q, rho, area,84 tip_speed, radius) and the shaft power with85 rotor_power_from_torque; both consume the same arguments.867. Compute the figure of merit with87 figure_of_merit_from_coefficients(c_t, c_q) and check it against88 the momentum power ratio for the same rotor.898. For a single-call verdict on one hover state run90 hover_blade_element_summary(thrust_N, radius_m, rho, solidity,91 lift_slope, drag_coefficient, tip_speed, tip_loss, collective_rad),92 which returns the full dict and verifies the supplied collective93 reproduces the thrust-derived C_T (mismatched inputs raise94 ValueError). For a sweep run collective_pitch_polar(collectives_rad,95 ...), which closes lambda by fixed-point iteration for every entry.969. Confirm the deterministic checks with the contract test97 scripts/test_rotorcraft_blade_element_hover_performance.py.9899## Worked example100101The reference rotor (identical to the momentum hover-leaf example):102R = 5.0 m, m = 2200 kg, rho = 1.225 kg/m^3, sigma = 0.08, Cd0 = 0.012,103Vtip = 220 m/s, a = 5.73 1/rad. Real module outputs:104105- Thrust: 2200 * 9.80665 = 21574.63 N; disk area PI * 5.0^2 = 78.54106 m^2.107- Thrust coefficient: C_T = 0.0046331 (spec bound about 0.00463).108- Inflow ratio: inflow_ratio_from_ct gives lambda = 0.048131, the hand109 value sqrt(C_T / 2).110- Collective at B = 1: theta0 = 0.132839 rad = 7.61 deg (spec about111 0.1328 rad, 7.6 deg; within the 5-10 deg band).112- Collective at B = 0.97: theta0 = 0.140874 rad = 8.07 deg (spec about113 0.1409 rad, 8.1 deg), 6.05% higher than at B = 1.114- Torque coefficient split: induced lambda * C_T = 2.2299e-4, profile115 sigma * Cd0 / 8 = 1.2000e-4 exactly, total C_Q = 3.4299e-4 (spec116 about 3.43e-4).117- Rotor torque: Q = 7985.97 N m (spec about 7986 N m).118- Rotor shaft power: P = 351382.76 W, equal to the momentum hover119 P_ideal + P_profile = 228447.84 + 122934.92 W to 1.7e-16 relative.120- Figure of merit: FM = 0.650140 (spec about 0.650), equal to the121 momentum FM ratio 228447.84 / 351382.76 = 0.650140.122- Round trip: feeding the recovered theta0 back through123 thrust_coefficient returns C_T to 1e-9 relative at both B = 1 and124 B = 0.97.125126## Verification127128- Confirm hover_blade_element_summary on the reference rotor returns129 thrust_coefficient 0.0046331, inflow_ratio 0.048131,130 torque_coefficient_total 3.4299e-4, rotor_torque_Nm 7985.97,131 rotor_power_W 351382.76 and figure_of_merit 0.650140, with the132 induced plus profile split summing to the total to 1e-12.133- Confirm collective_for_thrust_coefficient returns 0.132839 rad at134 B = 1 and 0.140874 rad at B = 0.97, and that both round-trip135 through thrust_coefficient to the target C_T within 1e-9.136- Confirm the cross-leaf identity at B = 1: power from the torque137 coefficient equals the momentum P_ideal + P_profile within 1e-6138 relative and the coefficient FM equals the momentum power ratio139 within 1e-9 (both verified against the sibling module by the140 contract test).141- Confirm tip-loss monotonicity: B = 0.97 requires a higher collective142 than B = 1.0, and higher B gives a higher C_T at fixed collective.143- Confirm the ideal-limit check FM <= 1: at the ideal C_Q =144 C_T^1.5 / sqrt(2) the figure of merit is exactly 1, and the worked145 FM sits inside (0, 1).146- Confirm every non-positive solidity, lift slope, drag coefficient,147 tip speed, radius, rho, thrust, and every tip loss outside (0, 1],148 negative collective, negative c_t and non-positive c_q raises149 ValueError, and that a collective which does not reproduce the150 thrust-derived C_T is rejected by the summary.151- Confirm determinism: repeated runs return identical floats (no RNG,152 stdlib only).153- Run the contract test offline: python3154 scripts/test_rotorcraft_blade_element_hover_performance.py (34155 tests, deterministic).156157## Pitfalls158159- Letting the Betz factor out of (0, 1]: B = 1 is the no-tip-loss limit160 where the blade-element power equals the momentum P_ideal + P_profile, and161 B = 0.97 already raises the required collective about 6%; B outside (0, 1]162 raises ValueError.163- Mixing radians and degrees for collective: the module works in radians164 (theta0 = 0.132839 rad = 7.61 deg on the reference rotor) and the165 published 5-10 deg band is in degrees; compare after conversion, not on166 the raw number.167- Calling the summary with a collective that does not reproduce the thrust:168 hover_blade_element_summary verifies the supplied collective reproduces169 the thrust-derived C_T and raises ValueError on a mismatch, so pass one170 consistent hover state rather than a sweep point.171- Splitting the torque coefficient incorrectly: the induced term is172 lambda*C_T and the profile term sigma*Cd0/8; they must sum to the total to173 1e-12, so do not double count profile drag when you already have a total174 C_Q.175- Reading the figure of merit above 1: FM = C_T^1.5/(sqrt(2)*C_Q) sits in176 (0, 1) for a real rotor and equals exactly 1 only at the ideal C_Q; an FM177 at or above 1 flags a coefficient inconsistency.178179## Related leaves180181- flight-mechanics/performance/rotorcraft-hover-performance: the182 momentum-theory power leaf; the B = 1 cross-leaf identity ties the183 two models.184- flight-mechanics/performance/rotorcraft-blade-flapping-dynamics:185 blade dynamics sibling that also consumes theta0.186- flight-mechanics/performance/rotorcraft-tail-rotor-sizing.187188## Behavior contract (gate 3)189190Run the deterministic contract test (stdlib unittest, offline):191192 python3 scripts/test_rotorcraft_blade_element_hover_performance.py193194The test covers the worked example with the spec magnitude bounds195(C_T about 0.00463, inflow about 0.0481, theta0 about 0.1328 rad at196B = 1 and 0.1409 rad at B = 0.97, C_Q about 3.43e-4, Q about 7986 N m,197P about 351383 W, FM about 0.650), the closed-form formulas checked198against independent hand computation, the collective round trip to C_T199at 1e-9, the torque split identity with the profile term equal to200sigma * Cd0 / 8 exactly, the power and FM cross-leaf identities against201the momentum hover leaf, tip-loss monotonicity, figure-of-merit bounds202with the ideal limit, exact dict keys of the summary and polar chains,203the fixed-point inflow closure of the polar, run-to-run determinism,204absence of random or external imports, and ValueError rejection of205every non-physical input in the validation list.206207## Compliance208209- Standards referenced, not reproduced: FAR 29 (rotorcraft210 airworthiness, certification context only). The blade-element hover211 relations above are standard engineering methodology, summary-only212 per standards-map.yaml.213- compliance: STANDARDS-REF, gated: false.