Rotorcraft Axial Descent Flow States (flight-mechanics/performance/rotorcraft-axial-descent-flow-states)
Use when you must categorize the axial flow state of a helicopter
rotor in vertical descent from the descent-rate ratio w = Vd / v_h and
evaluate the windmill-brake state with momentum theory: the
vortex-ring / turbulent-wake band 0 < w < 2 versus the windmill-brake
state w >= 2, the band induced velocity from the momentum closed form,
the signed rotor power and torque in descent, and whether momentum
theory can close to the zero-shaft-power autorotative equilibrium. It
pairs with flight-mechanics/performance/rotorcraft-hover-performance
(the hover state at zero rate) and with
flight-mechanics/performance/rotorcraft-vertical-climb-performance (the
climb-only momentum leaf). It implements the windmill-brake momentum
model in pure Python, stdlib only, and never computes empirical inflow:
inside the vortex-ring band the flow is momentum-invalid and the
induced velocity is left None.
Scope: this leaf owns the windmill-brake momentum-theory branch and
the vortex-ring band boundary. Power-off descent estimation is owned by
the empirical leaf
flight-mechanics/performance/rotorcraft-autorotative-descent (which
explicitly excludes momentum theory in descent, the vortex-ring state
and vertical zero-airspeed descent); induced velocity at hover and in
climb belongs to the hover and vertical-climb leaves; inflow in level
flight belongs to the forward-flight leaf. Momentum theory is applied
only where it is valid, Vd >= 2 v_h.
Domain quick reference
All quantities are SI (m/s, N, W, N m). Module constants are
RHO_SL = 1.225 kg/m^3, G = 9.80665 m/s^2, K_INDUCED_DEFAULT = 1.15,
PI = math.pi.
- Hover induced velocity from thrust and disk area:
v_h = sqrt(T / (2 rho A)), A = PI R^2. The reference rotor
(R = 5.0 m, m = 2200 kg, T = m G) gives v_h = 10.5887 m/s.
- Flow-state bands: Vd = 0 is hover, 0 < Vd < 2 v_h is the
vortex-ring / turbulent-wake band (momentum invalid, empirical
inflow, NASA TP-2005-213477 public-domain context), Vd >= 2 v_h is
the windmill-brake state where momentum theory applies.
- Band limits: vortex_ring_band_limits(v_h) returns (0, 2 v_h); the
worked rotor gives (0, 21.18) m/s.
- Windmill-brake induced velocity (physical branch):
v_i = Vd/2 - sqrt((Vd/2)^2 - v_h^2), valid only for Vd >= 2 v_h.
The boundary identity v_i(2 v_h) = v_h holds exactly, v_i never
exceeds v_h, and v_i falls like v_h^2 / Vd as Vd grows (at
Vd = 5 v_h, v_i / v_h = 0.2087, near the 1 / w asymptote).
- Signed descent power: P = k T (-Vd + v_i) + P_profile. Negative P
means the rotor absorbs power from the airstream (windmill-brake
working state); positive P means the shaft drives the rotor.
- Signed torque: Q = P / Omega. Negative torque opposes the engine
drive while the rotor absorbs power.
- Torque-reversal condition: c = P_profile / (k T) versus v_h. The
zero-power condition P = 0 combined with the momentum quadratic
v_i^2 - Vd v_i + v_h^2 = 0 gives the formal crossing at
Vd = c + v_h^2 / c with v_i = v_h^2 / c. That root is physical only
when v_i <= v_h, i.e. c >= v_h (then Vd >= 2 v_h by AM-GM). When
c < v_h no momentum root exists and the equilibrium is
momentum-unreachable.
Workflow
- Fix the operating point: descent rate Vd (m/s, positive downward),
thrust T (N) and disk area A = PI R^2 (or the mass, radius, density
that imply them). The sibling vertical-climb leaf owns climb, so
Vd < 0 raises ValueError here.
- Get the hover induced velocity from the thrust, density and area:
v_h = sqrt(T / (2 rho A)); call axial_flow_state(Vd, v_h) for the
verdict "hover", "vortex-ring-band" or "windmill-brake", and
vortex_ring_band_limits(v_h) for the band in m/s.
- In the windmill-brake state only, get the induced velocity with
windmill_brake_induced_velocity(Vd, v_h); the function refuses Vd
below 2 v_h because momentum theory does not apply in the band.
- Compute the signed power with rotor_descent_power(T, Vd, v_i,
P_profile, k) and, with the rotor speed Omega, the signed torque
with rotor_descent_torque(P, Omega).
- Decide zero-shaft-power reachability with
torque_reversal_condition(P_profile, T, k, v_h): c >= v_h reports
the momentum root Vd = c + v_h^2 / c on the windmill-brake branch;
c < v_h returns momentum_root_Vd None with the
momentum-unreachable verdict (the equilibrium lies in the empirical
vortex-ring / turbulent-wake regime).
- Bundle everything with descent_summary(T, R, P_profile, Vd, rho, k,
rotor_speed_rad_s): it returns flow_state, v_h, band_limits,
induced_velocity, power_W, torque_Nm and momentum_root_reachable,
with the momentum fields None in the band and at hover.
- Confirm the deterministic checks with the contract test
scripts/test_rotorcraft_axial_descent_flow_states.py.
Worked example
Reference rotor (shared with the hover and blade-element siblings):
R = 5.0 m, m = 2200 kg (T = m G = 21574.63 N), rho = 1.225 kg/m^3,
A = PI R^2 = 78.540 m^2, P_profile = 122935 W, k = 1.15. Real module
outputs:
- v_h = 10.5887 m/s, vortex_ring_band_limits -> (0, 21.177) m/s.
- At Vd = 2 v_h (21.177 m/s): windmill_brake_induced_velocity returns
v_i = 10.5887 m/s, the boundary identity with diff 0.0; the signed
power is -139780.0 W (the rotor absorbs power from the airstream).
- At Vd = 25 m/s: v_i = 5.8570 m/s (0.553 v_h), P = -352017.6 W
(spec magnitude about -352019 W).
- At Vd = 30 m/s: v_i = 4.3756 m/s (0.413 v_h), P = -512828.7 W
(about -512829 W); with Omega = Vtip / R = 220 / 5 = 44 rad/s,
Q = P / Omega = -11655.2 N m (about -11655 N m), torque opposing the
engine drive.
- At Vd = 40 m/s: P = -794246.6 W (about -794247 W); P stays negative
across the whole windmill-brake band for this rotor.
- torque_reversal_condition: c = P_profile / (k T) = 4.9549 m/s
(about 4.955), c < v_h (4.955 < 10.589), verdict
momentum-unreachable, momentum_root_Vd None. The formal crossing
would sit at Vd = c + v_h^2 / c = 27.58 m/s only on the
non-physical branch: it demands v_i = v_h^2 / c = 22.63 m/s, above
v_h, impossible on the windmill-brake branch, so 27.6 m/s is never a
momentum root of this rotor.
Verification
- Confirm axial_flow_state boundaries: Vd = 0 -> "hover", Vd just
below 2 v_h -> "vortex-ring-band", Vd = 2 v_h and above ->
"windmill-brake".
- Confirm windmill_brake_induced_velocity(2 v_h, v_h) equals v_h to
1e-9, and that v_i satisfies the momentum quadratic identity
v_i (Vd - v_i) = v_h^2 exactly on the physical branch.
- Confirm the worked powers -139780.0, -352017.6, -512828.7 and
-794246.6 W and the torque -11655.2 N m at Omega = 44 rad/s, all
within the spec magnitude bounds, and that P is negative across the
windmill-brake band.
- Confirm the torque-reversal split: c >= v_h reports the momentum
root Vd = c + v_h^2 / c (>= 2 v_h) as reachable; the worked rotor
with c = 4.955 < v_h reports momentum-unreachable with no root, and
the required v_i = v_h^2 / c = 22.63 m/s exceeding v_h is the reason
the formal 27.58 m/s crossing is non-physical.
- Confirm ValueError on Vd < 0 (climb), v_h <= 0, a windmill-brake
call below 2 v_h, non-positive thrust, non-positive k, negative
profile power or induced velocity, and Omega <= 0.
- Confirm the descent_summary dict contains exactly the seven
documented keys with momentum fields None in the band and at hover.
- Confirm determinism: identical inputs give identical floats run to
run (no RNG).
- Run the contract test offline: python3
scripts/test_rotorcraft_axial_descent_flow_states.py (34 tests,
deterministic).
Pitfalls
- Evaluating momentum theory inside the vortex-ring band:
windmill_brake_induced_velocity refuses Vd below 2*v_h with ValueError
because momentum theory is invalid there, and the band induced velocity is
None; do not fill the band with the closed form.
- Signing Vd wrong: descent rate is positive downward in this leaf and a
negative Vd (climb) raises ValueError - vertical climb is owned by the
sibling climb leaf.
- Reading the signed power without its sign: negative P means the rotor
absorbs power from the airstream (windmill-brake working state) and the
torque opposes the engine drive; flipping the sign for a 'magnitude'
erases the physical verdict.
- Reporting the formal torque-reversal root as reachable: when c < v_h the
momentum root Vd = c + v_h^2/c would demand v_i = v_h^2/c above v_h and is
non-physical; the function returns momentum_root_Vd None with the
momentum-unreachable verdict, as in the worked rotor (c = 4.955 < v_h =
10.589).
- Reading descent_summary momentum fields at hover or in the band: the
induced velocity, power and torque momentum fields are None outside the
windmill-brake state by contract.
- Non-positive thrust, k, or rotor speed and negative profile power raise
ValueError; determinism is pinned (no RNG).
Related leaves
- flight-mechanics/performance/rotorcraft-autorotative-descent: the
empirical power-off descent sibling; this leaf's torque-reversal
verdict explains why momentum theory cannot close to the autorotative
equilibrium.
- flight-mechanics/performance/rotorcraft-vertical-climb-performance:
the climb-only momentum leaf (Vc < 0 raises ValueError there).
- flight-mechanics/performance/rotorcraft-hover-performance: the hover
state at zero descent rate and its induced power terms.
- flight-mechanics/performance/rotorcraft-blade-element-hover-performance:
the coefficient-polar blade-element model sharing the reference
rotor.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_rotorcraft_axial_descent_flow_states.py
The test covers the reference-rotor worked example (v_h 10.5887 m/s,
band (0, 21.18) m/s, v_i(2 v_h) = v_h identity, powers about -139780 /
-352019 / -512829 / -794247 W, torque about -11655 N m at Omega 44),
the flow-state boundaries at 0, just below, at and above 2 v_h, the
momentum quadratic identity v_i (Vd - v_i) = v_h^2, the 1 / w
asymptote at 5 v_h, the torque-reversal split (c >= v_h reachable with
root at c + v_h^2 / c, c < v_h momentum-unreachable), the exact
descent_summary keys with momentum fields None in the band, the pinned
module constants, determinism run to run, and ValueError rejection of
climb rates, non-positive v_h, windmill calls below 2 v_h,
non-positive thrust, k, profile power and Omega.
Compliance
- Standards referenced, not reproduced: FAR-29 is named reference-only
per standards-map.yaml. NASA TP-2005-213477 (public domain) is named
in the body as the empirical-inflow context that marks the
vortex-ring band momentum-invalid; the momentum relations above are
summary-only standard engineering methodology.
- compliance: STANDARDS-REF, gated: false.
1---2name: rotorcraft-axial-descent-flow-states3description: Use when you must classify the axial flow state of a rotor in vertical descent: hover at zero rate, the vortex-ring band from zero to twice the hover induced velocity, and the windmill-brake momentum state at and above that boundary. Computes the band limits, the windmill-brake induced velocity from the momentum-theory closed form, the signed rotor power and torque in descent (negative when the rotor absorbs power from the airstream), and the torque-reversal condition c = P_profile over k T versus v_h that decides whether the zero-shaft-power autorotative equilibrium is reachable on the momentum branch. Produces the flow-state verdict, the descent induced velocity, signed power and torque, and the momentum reachability verdict. Trigger: vortex-ring state, windmill-brake state, axial descent, descent induced velocity, torque reversal, rotor descent power.4license: Apache-2.05---67# Rotorcraft Axial Descent Flow States (flight-mechanics/performance/rotorcraft-axial-descent-flow-states)89Use when you must categorize the axial flow state of a helicopter10rotor in vertical descent from the descent-rate ratio w = Vd / v_h and11evaluate the windmill-brake state with momentum theory: the12vortex-ring / turbulent-wake band 0 < w < 2 versus the windmill-brake13state w >= 2, the band induced velocity from the momentum closed form,14the signed rotor power and torque in descent, and whether momentum15theory can close to the zero-shaft-power autorotative equilibrium. It16pairs with flight-mechanics/performance/rotorcraft-hover-performance17(the hover state at zero rate) and with18flight-mechanics/performance/rotorcraft-vertical-climb-performance (the19climb-only momentum leaf). It implements the windmill-brake momentum20model in pure Python, stdlib only, and never computes empirical inflow:21inside the vortex-ring band the flow is momentum-invalid and the22induced velocity is left None.2324Scope: this leaf owns the windmill-brake momentum-theory branch and25the vortex-ring band boundary. Power-off descent estimation is owned by26the empirical leaf27flight-mechanics/performance/rotorcraft-autorotative-descent (which28explicitly excludes momentum theory in descent, the vortex-ring state29and vertical zero-airspeed descent); induced velocity at hover and in30climb belongs to the hover and vertical-climb leaves; inflow in level31flight belongs to the forward-flight leaf. Momentum theory is applied32only where it is valid, Vd >= 2 v_h.3334## Domain quick reference3536All quantities are SI (m/s, N, W, N m). Module constants are37RHO_SL = 1.225 kg/m^3, G = 9.80665 m/s^2, K_INDUCED_DEFAULT = 1.15,38PI = math.pi.3940- Hover induced velocity from thrust and disk area:41 v_h = sqrt(T / (2 rho A)), A = PI R^2. The reference rotor42 (R = 5.0 m, m = 2200 kg, T = m G) gives v_h = 10.5887 m/s.43- Flow-state bands: Vd = 0 is hover, 0 < Vd < 2 v_h is the44 vortex-ring / turbulent-wake band (momentum invalid, empirical45 inflow, NASA TP-2005-213477 public-domain context), Vd >= 2 v_h is46 the windmill-brake state where momentum theory applies.47- Band limits: vortex_ring_band_limits(v_h) returns (0, 2 v_h); the48 worked rotor gives (0, 21.18) m/s.49- Windmill-brake induced velocity (physical branch):50 v_i = Vd/2 - sqrt((Vd/2)^2 - v_h^2), valid only for Vd >= 2 v_h.51 The boundary identity v_i(2 v_h) = v_h holds exactly, v_i never52 exceeds v_h, and v_i falls like v_h^2 / Vd as Vd grows (at53 Vd = 5 v_h, v_i / v_h = 0.2087, near the 1 / w asymptote).54- Signed descent power: P = k T (-Vd + v_i) + P_profile. Negative P55 means the rotor absorbs power from the airstream (windmill-brake56 working state); positive P means the shaft drives the rotor.57- Signed torque: Q = P / Omega. Negative torque opposes the engine58 drive while the rotor absorbs power.59- Torque-reversal condition: c = P_profile / (k T) versus v_h. The60 zero-power condition P = 0 combined with the momentum quadratic61 v_i^2 - Vd v_i + v_h^2 = 0 gives the formal crossing at62 Vd = c + v_h^2 / c with v_i = v_h^2 / c. That root is physical only63 when v_i <= v_h, i.e. c >= v_h (then Vd >= 2 v_h by AM-GM). When64 c < v_h no momentum root exists and the equilibrium is65 momentum-unreachable.6667## Workflow68691. Fix the operating point: descent rate Vd (m/s, positive downward),70 thrust T (N) and disk area A = PI R^2 (or the mass, radius, density71 that imply them). The sibling vertical-climb leaf owns climb, so72 Vd < 0 raises ValueError here.732. Get the hover induced velocity from the thrust, density and area:74 v_h = sqrt(T / (2 rho A)); call axial_flow_state(Vd, v_h) for the75 verdict "hover", "vortex-ring-band" or "windmill-brake", and76 vortex_ring_band_limits(v_h) for the band in m/s.773. In the windmill-brake state only, get the induced velocity with78 windmill_brake_induced_velocity(Vd, v_h); the function refuses Vd79 below 2 v_h because momentum theory does not apply in the band.804. Compute the signed power with rotor_descent_power(T, Vd, v_i,81 P_profile, k) and, with the rotor speed Omega, the signed torque82 with rotor_descent_torque(P, Omega).835. Decide zero-shaft-power reachability with84 torque_reversal_condition(P_profile, T, k, v_h): c >= v_h reports85 the momentum root Vd = c + v_h^2 / c on the windmill-brake branch;86 c < v_h returns momentum_root_Vd None with the87 momentum-unreachable verdict (the equilibrium lies in the empirical88 vortex-ring / turbulent-wake regime).896. Bundle everything with descent_summary(T, R, P_profile, Vd, rho, k,90 rotor_speed_rad_s): it returns flow_state, v_h, band_limits,91 induced_velocity, power_W, torque_Nm and momentum_root_reachable,92 with the momentum fields None in the band and at hover.937. Confirm the deterministic checks with the contract test94 scripts/test_rotorcraft_axial_descent_flow_states.py.9596## Worked example9798Reference rotor (shared with the hover and blade-element siblings):99R = 5.0 m, m = 2200 kg (T = m G = 21574.63 N), rho = 1.225 kg/m^3,100A = PI R^2 = 78.540 m^2, P_profile = 122935 W, k = 1.15. Real module101outputs:102103- v_h = 10.5887 m/s, vortex_ring_band_limits -> (0, 21.177) m/s.104- At Vd = 2 v_h (21.177 m/s): windmill_brake_induced_velocity returns105 v_i = 10.5887 m/s, the boundary identity with diff 0.0; the signed106 power is -139780.0 W (the rotor absorbs power from the airstream).107- At Vd = 25 m/s: v_i = 5.8570 m/s (0.553 v_h), P = -352017.6 W108 (spec magnitude about -352019 W).109- At Vd = 30 m/s: v_i = 4.3756 m/s (0.413 v_h), P = -512828.7 W110 (about -512829 W); with Omega = Vtip / R = 220 / 5 = 44 rad/s,111 Q = P / Omega = -11655.2 N m (about -11655 N m), torque opposing the112 engine drive.113- At Vd = 40 m/s: P = -794246.6 W (about -794247 W); P stays negative114 across the whole windmill-brake band for this rotor.115- torque_reversal_condition: c = P_profile / (k T) = 4.9549 m/s116 (about 4.955), c < v_h (4.955 < 10.589), verdict117 momentum-unreachable, momentum_root_Vd None. The formal crossing118 would sit at Vd = c + v_h^2 / c = 27.58 m/s only on the119 non-physical branch: it demands v_i = v_h^2 / c = 22.63 m/s, above120 v_h, impossible on the windmill-brake branch, so 27.6 m/s is never a121 momentum root of this rotor.122123## Verification124125- Confirm axial_flow_state boundaries: Vd = 0 -> "hover", Vd just126 below 2 v_h -> "vortex-ring-band", Vd = 2 v_h and above ->127 "windmill-brake".128- Confirm windmill_brake_induced_velocity(2 v_h, v_h) equals v_h to129 1e-9, and that v_i satisfies the momentum quadratic identity130 v_i (Vd - v_i) = v_h^2 exactly on the physical branch.131- Confirm the worked powers -139780.0, -352017.6, -512828.7 and132 -794246.6 W and the torque -11655.2 N m at Omega = 44 rad/s, all133 within the spec magnitude bounds, and that P is negative across the134 windmill-brake band.135- Confirm the torque-reversal split: c >= v_h reports the momentum136 root Vd = c + v_h^2 / c (>= 2 v_h) as reachable; the worked rotor137 with c = 4.955 < v_h reports momentum-unreachable with no root, and138 the required v_i = v_h^2 / c = 22.63 m/s exceeding v_h is the reason139 the formal 27.58 m/s crossing is non-physical.140- Confirm ValueError on Vd < 0 (climb), v_h <= 0, a windmill-brake141 call below 2 v_h, non-positive thrust, non-positive k, negative142 profile power or induced velocity, and Omega <= 0.143- Confirm the descent_summary dict contains exactly the seven144 documented keys with momentum fields None in the band and at hover.145- Confirm determinism: identical inputs give identical floats run to146 run (no RNG).147- Run the contract test offline: python3148 scripts/test_rotorcraft_axial_descent_flow_states.py (34 tests,149 deterministic).150151## Pitfalls152153- Evaluating momentum theory inside the vortex-ring band:154 windmill_brake_induced_velocity refuses Vd below 2*v_h with ValueError155 because momentum theory is invalid there, and the band induced velocity is156 None; do not fill the band with the closed form.157- Signing Vd wrong: descent rate is positive downward in this leaf and a158 negative Vd (climb) raises ValueError - vertical climb is owned by the159 sibling climb leaf.160- Reading the signed power without its sign: negative P means the rotor161 absorbs power from the airstream (windmill-brake working state) and the162 torque opposes the engine drive; flipping the sign for a 'magnitude'163 erases the physical verdict.164- Reporting the formal torque-reversal root as reachable: when c < v_h the165 momentum root Vd = c + v_h^2/c would demand v_i = v_h^2/c above v_h and is166 non-physical; the function returns momentum_root_Vd None with the167 momentum-unreachable verdict, as in the worked rotor (c = 4.955 < v_h =168 10.589).169- Reading descent_summary momentum fields at hover or in the band: the170 induced velocity, power and torque momentum fields are None outside the171 windmill-brake state by contract.172- Non-positive thrust, k, or rotor speed and negative profile power raise173 ValueError; determinism is pinned (no RNG).174175## Related leaves176177- flight-mechanics/performance/rotorcraft-autorotative-descent: the178 empirical power-off descent sibling; this leaf's torque-reversal179 verdict explains why momentum theory cannot close to the autorotative180 equilibrium.181- flight-mechanics/performance/rotorcraft-vertical-climb-performance:182 the climb-only momentum leaf (Vc < 0 raises ValueError there).183- flight-mechanics/performance/rotorcraft-hover-performance: the hover184 state at zero descent rate and its induced power terms.185- flight-mechanics/performance/rotorcraft-blade-element-hover-performance:186 the coefficient-polar blade-element model sharing the reference187 rotor.188189## Behavior contract (gate 3)190191Run the deterministic contract test (stdlib unittest, offline):192193 python3 scripts/test_rotorcraft_axial_descent_flow_states.py194195The test covers the reference-rotor worked example (v_h 10.5887 m/s,196band (0, 21.18) m/s, v_i(2 v_h) = v_h identity, powers about -139780 /197-352019 / -512829 / -794247 W, torque about -11655 N m at Omega 44),198the flow-state boundaries at 0, just below, at and above 2 v_h, the199momentum quadratic identity v_i (Vd - v_i) = v_h^2, the 1 / w200asymptote at 5 v_h, the torque-reversal split (c >= v_h reachable with201root at c + v_h^2 / c, c < v_h momentum-unreachable), the exact202descent_summary keys with momentum fields None in the band, the pinned203module constants, determinism run to run, and ValueError rejection of204climb rates, non-positive v_h, windmill calls below 2 v_h,205non-positive thrust, k, profile power and Omega.206207## Compliance208209- Standards referenced, not reproduced: FAR-29 is named reference-only210 per standards-map.yaml. NASA TP-2005-213477 (public domain) is named211 in the body as the empirical-inflow context that marks the212 vortex-ring band momentum-invalid; the momentum relations above are213 summary-only standard engineering methodology.214- compliance: STANDARDS-REF, gated: false.