Rotorcraft Vertical Climb Performance (flight-mechanics/performance/rotorcraft-vertical-climb-performance)
Use when you must compute the vertical climb performance of a rotorcraft
rotor with axial momentum theory: the climb induced velocity falls below
the hover induced velocity as the climb rate grows, and the power needed
to climb is the induced power through the induced power factor k plus the
profile power. This leaf pairs with
flight-mechanics/performance/rotorcraft-hover-performance (the hover
state at zero climb rate, which owns the hover power terms) and with
flight-mechanics/performance/rotorcraft-forward-flight-performance (the
speed-dependent power split in level flight). Axial momentum theory only:
uniform inflow, no ground effect, vertical climb only with climb rates
zero or positive, and no wake distortion modeling in descending flight
(the model rejects negative climb rates).
Domain quick reference
All quantities are SI. The rotor thrust equals the rotorcraft weight in
the climb check: T = m * g0, g0 = 9.80665 m/s^2. Default density
rho = 1.225 kg/m^3 is sea level; pass the density at the chosen density
altitude to re-run the climb check there.
- Disk area: A = PI * R^2.
- Hover induced velocity (momentum theory): v_h = sqrt(T / (2 * rho *
A)).
- Climb induced velocity at vertical climb rate Vc: v_i = -Vc/2 +
sqrt((Vc/2)^2 + v_h^2). The induced velocity decreases as the climb
rate grows, and v_i < v_h for any positive Vc.
- Profile power (average section drag model): P_profile = (1/8) * rho *
sigma * Cd0 * A * Vtip^3, with sigma the rotor solidity, Cd0 the mean
blade drag coefficient and Vtip the tip speed.
- Total climb power: P = k * T * (Vc + v_i) + P_profile, where k is the
induced power factor (default 1.15) applied to the climb induced power
for wake and tip losses. At Vc = 0 this reduces to the hover total
power k * T * v_h + P_profile.
- Climb power margin: margin = P_available - P_required.
- Maximum vertical rate of climb: solve P(Vc) = P_available for Vc.
Climb power is strictly increasing in Vc because dP/dVc = kT(1 +
d(v_i)/dVc) > 0 with d(v_i)/dVc in (-1/2, 0), so a bisection on [0,
200] m/s finds the root. A vertical climb is impossible when the
available power sits below the hover total power at Vc = 0; that case
raises ValueError. When the available power exceeds the power required
at the 200 m/s upper bracket, the bracket value is returned as an
excess-power case.
- 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, density
rho at the density altitude, solidity sigma, mean blade drag
coefficient Cd0, tip speed Vtip, induced power factor k, the vertical
climb rate Vc and the available shaft power.
- Get the disk area with disk_area(radius) and the climb thrust
T = m * G0 (thrust equals weight).
- Compute the hover induced velocity with hover_induced_velocity(thrust,
area, rho), the baseline for the climb inflow.
- Compute the climb induced velocity with climb_induced_velocity(thrust,
area, climb_rate, rho); verify it sits below the hover value.
- Compute the profile power with profile_power(rho, area, solidity,
drag_coefficient, tip_speed).
- Combine with climb_power(thrust, climb_rate, induced_velocity,
profile_power, k) for the total rotor power required in the climb.
- Compare against the shaft power with climb_power_margin(available,
required); a negative margin means the climb cannot be sustained.
- For the climb limit, call max_vertical_climb_rate(thrust, area, rho,
available_power, profile_power, k) to get the maximum vertical rate
of climb from the excess shaft power.
- For a single-call verdict run vertical_climb_performance(weight_kg,
radius, rho, solidity, drag_coefficient, tip_speed, k, climb_rate,
available_power), which returns the full dict and propagates every
ValueError from the primitives.
- Confirm the deterministic checks with the contract test
scripts/test_rotorcraft_vertical_climb_performance.py.
Worked example
A helicopter at 2200 kg mass with a 5.0 m radius rotor climbing
vertically at 5 m/s at sea level: rho = 1.225 kg/m^3, solidity 0.08,
Cd0 = 0.012, tip speed 220 m/s, k = 1.15, available power 600 kW.
Running vertical_climb_performance(2200.0, 5.0, 1.225, 0.08, 0.012,
220.0, 1.15, 5.0, 600000.0):
- Thrust: 2200 * 9.80665 = 21574.63 N.
- Disk area: PI * 5.0^2 = 78.54 m^2.
- Hover induced velocity: v_h = 10.59 m/s (within the 9.5-11.5 m/s
band).
- Climb induced velocity at 5 m/s: v_i = 8.380 m/s (within 7.5-9.5 m/s,
below the hover value as momentum theory requires).
- Profile power: P_profile = 122935 W (within 100000-150000 W).
- Climb power at 5 m/s: P = 1.15 * 21574.63 * (5 + 8.380) + 122935 =
454900 W (within 420000-490000 W).
- Climb power margin at 600 kW: 600000 - 454900 = 145100 W.
- Maximum vertical rate of climb at 600 kW: 13.40 m/s (within 11-16
m/s), found by bisection on the power balance.
- Hover total power (Vc = 0): k * T * v_h + P_profile = 385650 W
(within 350000-430000 W); the 600 kW case clears it with room to
climb.
At a density altitude where rho drops to 1.06 kg/m^3 the induced
velocities rise and the climb power check must be re-run at the chosen
density.
Verification
- Confirm vertical_climb_performance(2200.0, 5.0, available_power =
600000.0) with the sea-level defaults returns hover_induced_velocity
10.59 m/s, climb_induced_velocity 8.380 m/s, profile_power_W 122935,
climb_power_W 454900, climb_power_margin_W 145100 and
max_vertical_climb_rate 13.40.
- Confirm the hover round trip: climb_power(thrust, 0.0, v_h,
profile_power) equals k * T * v_h + P_profile, the hover total power.
- Confirm monotonicity: the climb induced velocity at 2 m/s exceeds the
value at 10 m/s, and the climb power strictly increases with the climb
rate.
- Confirm max_vertical_climb_rate raises ValueError when the available
power sits below the hover total power (300 kW with this rotor), and
returns the 200.0 m/s upper bracket when the available power exceeds
the power required at 200 m/s (about 5.10 MW for this rotor, so 6 MW
returns 200.0).
- Confirm every non-positive radius, thrust, area, density, solidity,
drag coefficient, tip speed and induced power factor, and every
negative climb rate, induced velocity, profile power and available or
required power raises ValueError.
- Confirm determinism: repeated runs return identical floats (no RNG,
stdlib only).
- Run the contract test offline: python3
scripts/test_rotorcraft_vertical_climb_performance.py (35 tests,
deterministic).
Pitfalls
- Calling with a negative climb rate: axial momentum theory applies to climb
only in this leaf and negative Vc raises ValueError - descending flight
(wake distortion, vortex ring) is out of scope.
- Expecting the climb induced velocity above the hover value: v_i = -Vc/2 +
sqrt((Vc/2)^2 + v_h^2) always sits below v_h for positive climb rate and
decreases as Vc grows.
- Reading max_vertical_climb_rate = 200.0 as the exact limit: when the
available power exceeds the power required at the 200 m/s upper bracket
the bracket value is returned as an excess-power case, not a converged
root.
- Available power below the hover total: a vertical climb is impossible (the
power balance has no root) and max_vertical_climb_rate raises ValueError
at 300 kW for the worked rotor, which needs about 385.7 kW to hover.
- Reusing sea-level numbers at altitude: re-run the climb check at the
density altitude - induced velocities rise as density drops (rho = 1.06
example), changing v_i and the climb power.
Related leaves
- flight-mechanics/performance/rotorcraft-hover-performance: the hover
state at Vc = 0, which owns the hover induced velocity, hover power
terms and disk loading context that seed this climb model.
- flight-mechanics/performance/rotorcraft-forward-flight-performance:
the sibling rotor leaf for the speed-dependent power split in level
flight, adjacent in the rotorcraft performance pass.
- flight-mechanics/performance/oei-climb-gradient: the one-engine-
inoperative climb gradient for multi-engine rotorcraft, the
longitudinal companion to this vertical-axis check.
- flight-mechanics/performance/climb-performance: the fixed-wing
excess-thrust climb case; this leaf owns the rotorcraft vertical
momentum-theory climb only.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_rotorcraft_vertical_climb_performance.py
The test covers the worked example with the spec magnitude bounds (hover
induced velocity 9.5-11.5 m/s, climb induced velocity 7.5-9.5 m/s,
profile power 100000-150000 W, climb power 420000-490000 W, hover total
power 350000-430000 W, max climb rate 11-16 m/s), the momentum-theory
closed forms, the climb induced velocity decrease with climb rate, the
hover round trip, the induced power factor model and its default
constant, the cubic tip speed scaling of profile power, the
max_vertical_climb_rate bisection with the below-hover-power ValueError
and the excess-power upper bracket, the climb power margin sign, exact
dict keys and primitive consistency of vertical_climb_performance,
run-to-run determinism, absence of random or third-party 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 axial momentum theory
climb relations above are standard engineering methodology,
summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: rotorcraft-vertical-climb-performance3description: Use when you must compute the vertical climb performance of a rotorcraft rotor with axial momentum theory: the climb induced velocity from the hover induced velocity and the climb rate, the induced power through an induced power factor, the total rotor power required in a vertical climb as induced plus profile power, and the maximum vertical rate of climb for an available shaft power. Produces the induced velocity in climb, the climb power required, the climb power margin and the maximum vertical rate of climb that gate a rotorcraft climb check at a chosen density altitude. Momentum theory only: uniform inflow, no ground effect, climb only. Trigger: rotorcraft vertical climb performance, axial momentum theory, climb induced velocity, rotorcraft climb power, vertical rate of climb, available shaft power, climb power margin.4license: Apache-2.05---67# Rotorcraft Vertical Climb Performance (flight-mechanics/performance/rotorcraft-vertical-climb-performance)89Use when you must compute the vertical climb performance of a rotorcraft10rotor with axial momentum theory: the climb induced velocity falls below11the hover induced velocity as the climb rate grows, and the power needed12to climb is the induced power through the induced power factor k plus the13profile power. This leaf pairs with14flight-mechanics/performance/rotorcraft-hover-performance (the hover15state at zero climb rate, which owns the hover power terms) and with16flight-mechanics/performance/rotorcraft-forward-flight-performance (the17speed-dependent power split in level flight). Axial momentum theory only:18uniform inflow, no ground effect, vertical climb only with climb rates19zero or positive, and no wake distortion modeling in descending flight20(the model rejects negative climb rates).2122## Domain quick reference2324All quantities are SI. The rotor thrust equals the rotorcraft weight in25the climb check: T = m * g0, g0 = 9.80665 m/s^2. Default density26rho = 1.225 kg/m^3 is sea level; pass the density at the chosen density27altitude to re-run the climb check there.2829- Disk area: A = PI * R^2.30- Hover induced velocity (momentum theory): v_h = sqrt(T / (2 * rho *31 A)).32- Climb induced velocity at vertical climb rate Vc: v_i = -Vc/2 +33 sqrt((Vc/2)^2 + v_h^2). The induced velocity decreases as the climb34 rate grows, and v_i < v_h for any positive Vc.35- Profile power (average section drag model): P_profile = (1/8) * rho *36 sigma * Cd0 * A * Vtip^3, with sigma the rotor solidity, Cd0 the mean37 blade drag coefficient and Vtip the tip speed.38- Total climb power: P = k * T * (Vc + v_i) + P_profile, where k is the39 induced power factor (default 1.15) applied to the climb induced power40 for wake and tip losses. At Vc = 0 this reduces to the hover total41 power k * T * v_h + P_profile.42- Climb power margin: margin = P_available - P_required.43- Maximum vertical rate of climb: solve P(Vc) = P_available for Vc.44 Climb power is strictly increasing in Vc because dP/dVc = k*T*(1 +45 d(v_i)/dVc) > 0 with d(v_i)/dVc in (-1/2, 0), so a bisection on [0,46 200] m/s finds the root. A vertical climb is impossible when the47 available power sits below the hover total power at Vc = 0; that case48 raises ValueError. When the available power exceeds the power required49 at the 200 m/s upper bracket, the bracket value is returned as an50 excess-power case.51- FAR 29 frames the rotorcraft certification context; the relations52 above are standard engineering methodology, summary-only.5354## Workflow55561. Fix the operating point: rotor radius R, rotorcraft mass m, density57 rho at the density altitude, solidity sigma, mean blade drag58 coefficient Cd0, tip speed Vtip, induced power factor k, the vertical59 climb rate Vc and the available shaft power.602. Get the disk area with disk_area(radius) and the climb thrust61 T = m * G0 (thrust equals weight).623. Compute the hover induced velocity with hover_induced_velocity(thrust,63 area, rho), the baseline for the climb inflow.644. Compute the climb induced velocity with climb_induced_velocity(thrust,65 area, climb_rate, rho); verify it sits below the hover value.665. Compute the profile power with profile_power(rho, area, solidity,67 drag_coefficient, tip_speed).686. Combine with climb_power(thrust, climb_rate, induced_velocity,69 profile_power, k) for the total rotor power required in the climb.707. Compare against the shaft power with climb_power_margin(available,71 required); a negative margin means the climb cannot be sustained.728. For the climb limit, call max_vertical_climb_rate(thrust, area, rho,73 available_power, profile_power, k) to get the maximum vertical rate74 of climb from the excess shaft power.759. For a single-call verdict run vertical_climb_performance(weight_kg,76 radius, rho, solidity, drag_coefficient, tip_speed, k, climb_rate,77 available_power), which returns the full dict and propagates every78 ValueError from the primitives.7910. Confirm the deterministic checks with the contract test80 scripts/test_rotorcraft_vertical_climb_performance.py.8182## Worked example8384A helicopter at 2200 kg mass with a 5.0 m radius rotor climbing85vertically at 5 m/s at sea level: rho = 1.225 kg/m^3, solidity 0.08,86Cd0 = 0.012, tip speed 220 m/s, k = 1.15, available power 600 kW.87Running vertical_climb_performance(2200.0, 5.0, 1.225, 0.08, 0.012,88220.0, 1.15, 5.0, 600000.0):8990- Thrust: 2200 * 9.80665 = 21574.63 N.91- Disk area: PI * 5.0^2 = 78.54 m^2.92- Hover induced velocity: v_h = 10.59 m/s (within the 9.5-11.5 m/s93 band).94- Climb induced velocity at 5 m/s: v_i = 8.380 m/s (within 7.5-9.5 m/s,95 below the hover value as momentum theory requires).96- Profile power: P_profile = 122935 W (within 100000-150000 W).97- Climb power at 5 m/s: P = 1.15 * 21574.63 * (5 + 8.380) + 122935 =98 454900 W (within 420000-490000 W).99- Climb power margin at 600 kW: 600000 - 454900 = 145100 W.100- Maximum vertical rate of climb at 600 kW: 13.40 m/s (within 11-16101 m/s), found by bisection on the power balance.102- Hover total power (Vc = 0): k * T * v_h + P_profile = 385650 W103 (within 350000-430000 W); the 600 kW case clears it with room to104 climb.105106At a density altitude where rho drops to 1.06 kg/m^3 the induced107velocities rise and the climb power check must be re-run at the chosen108density.109110## Verification111112- Confirm vertical_climb_performance(2200.0, 5.0, available_power =113 600000.0) with the sea-level defaults returns hover_induced_velocity114 10.59 m/s, climb_induced_velocity 8.380 m/s, profile_power_W 122935,115 climb_power_W 454900, climb_power_margin_W 145100 and116 max_vertical_climb_rate 13.40.117- Confirm the hover round trip: climb_power(thrust, 0.0, v_h,118 profile_power) equals k * T * v_h + P_profile, the hover total power.119- Confirm monotonicity: the climb induced velocity at 2 m/s exceeds the120 value at 10 m/s, and the climb power strictly increases with the climb121 rate.122- Confirm max_vertical_climb_rate raises ValueError when the available123 power sits below the hover total power (300 kW with this rotor), and124 returns the 200.0 m/s upper bracket when the available power exceeds125 the power required at 200 m/s (about 5.10 MW for this rotor, so 6 MW126 returns 200.0).127- Confirm every non-positive radius, thrust, area, density, solidity,128 drag coefficient, tip speed and induced power factor, and every129 negative climb rate, induced velocity, profile power and available or130 required power raises ValueError.131- Confirm determinism: repeated runs return identical floats (no RNG,132 stdlib only).133- Run the contract test offline: python3134 scripts/test_rotorcraft_vertical_climb_performance.py (35 tests,135 deterministic).136137## Pitfalls138139- Calling with a negative climb rate: axial momentum theory applies to climb140 only in this leaf and negative Vc raises ValueError - descending flight141 (wake distortion, vortex ring) is out of scope.142- Expecting the climb induced velocity above the hover value: v_i = -Vc/2 +143 sqrt((Vc/2)^2 + v_h^2) always sits below v_h for positive climb rate and144 decreases as Vc grows.145- Reading max_vertical_climb_rate = 200.0 as the exact limit: when the146 available power exceeds the power required at the 200 m/s upper bracket147 the bracket value is returned as an excess-power case, not a converged148 root.149- Available power below the hover total: a vertical climb is impossible (the150 power balance has no root) and max_vertical_climb_rate raises ValueError151 at 300 kW for the worked rotor, which needs about 385.7 kW to hover.152- Reusing sea-level numbers at altitude: re-run the climb check at the153 density altitude - induced velocities rise as density drops (rho = 1.06154 example), changing v_i and the climb power.155156## Related leaves157158- flight-mechanics/performance/rotorcraft-hover-performance: the hover159 state at Vc = 0, which owns the hover induced velocity, hover power160 terms and disk loading context that seed this climb model.161- flight-mechanics/performance/rotorcraft-forward-flight-performance:162 the sibling rotor leaf for the speed-dependent power split in level163 flight, adjacent in the rotorcraft performance pass.164- flight-mechanics/performance/oei-climb-gradient: the one-engine-165 inoperative climb gradient for multi-engine rotorcraft, the166 longitudinal companion to this vertical-axis check.167- flight-mechanics/performance/climb-performance: the fixed-wing168 excess-thrust climb case; this leaf owns the rotorcraft vertical169 momentum-theory climb only.170171## Behavior contract (gate 3)172173Run the deterministic contract test (stdlib unittest, offline):174175 python3 scripts/test_rotorcraft_vertical_climb_performance.py176177The test covers the worked example with the spec magnitude bounds (hover178induced velocity 9.5-11.5 m/s, climb induced velocity 7.5-9.5 m/s,179profile power 100000-150000 W, climb power 420000-490000 W, hover total180power 350000-430000 W, max climb rate 11-16 m/s), the momentum-theory181closed forms, the climb induced velocity decrease with climb rate, the182hover round trip, the induced power factor model and its default183constant, the cubic tip speed scaling of profile power, the184max_vertical_climb_rate bisection with the below-hover-power ValueError185and the excess-power upper bracket, the climb power margin sign, exact186dict keys and primitive consistency of vertical_climb_performance,187run-to-run determinism, absence of random or third-party imports, and188ValueError rejection of every non-physical input in the validation list.189190## Compliance191192- Standards referenced, not reproduced: FAR 29 (rotorcraft193 airworthiness, certification context only). The axial momentum theory194 climb relations above are standard engineering methodology,195 summary-only per standards-map.yaml.196- compliance: STANDARDS-REF, gated: false.