Deep Stall Analysis (flight-mechanics/stability-control/deep-stall-analysis)
Use when the task is to assess whether a T-tail or aft-fuselage-mounted
tail airplane can enter a deep stall, a self-sustaining high-angle-of-
attack trim beyond the stall sometimes called alpha lock, and whether
the elevator retains enough pitch-down authority to recover from it.
The model captures the loss of horizontal-tail effectiveness when the
tail enters the wing or fuselage wake at high angle of attack through a
tail blanking factor, adds a separated-flow wing-body pitch-up that
rises after the stall and fades at very high angle of attack, solves
for the post-stall trim point in the deep-stall band, and compares the
elevator pitch-down moment available at that trim with the pitch-up
moment hump the elevator must overcome to pitch back below the stall.
It pairs with flight-mechanics/stability-control/spin-recovery as the
departure and spinning neighbor and with
flight-mechanics/stability-control/longitudinal-stability as the tail
sizing and static stability neighbor. Deep stall here means the static
pitch trim at high alpha with a wake-blanked tail, not a spin entry;
developed spins and autorotation bands belong to spin-recovery, and
stall and post-stall flight test programs belong to
flight-test-operations stall-characteristics-testing and
high-angle-of-attack-testing. All wake and separation coefficients in
this model are documented typical engineering-model constants, not
standard values.
Domain quick reference
- Stall angle: alpha_stall = (clmax / a_w) * R2D +
VISC_STALL_SHIFT_DEG, with a viscous shift of 2.0 deg above the
linear clmax/a slope.
- Tail blanking factor: 1.0 below the wake angle, linear ramp to
eta_blank / eta_t0 across the next BLANK_DELTA_DEG = 10 deg, constant
at eta_blank / eta_t0 above. The factor multiplies eta_t0, so the
effective tail efficiency is eta = eta_t0 * factor. Setting
eta_blank equal to eta_t0 gives factor 1.0 everywhere, a tail that is
never blanked.
- Tail pitch contribution: Cm_t = -v_h * eta * a_t * (1 -
d_eps_dalpha) * alpha (radians), from the tail volume coefficient
v_h, tail lift slope a_t and downwash gradient d_eps_dalpha.
- Separated-flow pitch-up: rises linearly at slope sep_contrib over
SEP_RISE_RAD = 0.6 rad beyond the stall, fades linearly back to zero
over SEP_FADE_RAD = 0.4 rad, zero outside that band.
- Total moment: Cm = cm0_wb + cm_alpha_wb * alpha + Cm_sep + Cm_t.
A positive Cm in the deep-stall band means the airplane pitches up
into the post-stall region; a downward crossing of Cm through zero at
high alpha is the stable deep-stall trim (alpha lock point).
- Recovery authority: max_down_moment = |cm_delta| * |delta_e_max|,
compared with the maximum pitch-up moment hump between the stall and
the locked trim. Positive recovery margin means full down elevator
can pitch the nose back below the stall.
- FAR 25 and CS 25 frame the stall and controllability context; the
relations above are standard engineering methodology, summary-only.
Workflow
- Gather the configuration: clmax, a_w, cm0_wb, cm_alpha_wb, v_h,
a_t, eta_t0, eta_blank, alpha_wake_deg, d_eps_dalpha, sep_contrib,
cm_delta and delta_e_max_deg into the inputs dict.
- Compute the stall angle with stall_angle_deg(clmax, a_w) and the
tail blanking factor across alpha with blanking_factor(alpha_deg,
alpha_wake_deg, eta_blank / eta_t0).
- Build the pitch moment curve with cm_total(alpha_deg, inputs) and
check its sign at the stall with cm_at_stall(inputs). A negative
Cm at the stall is the trimmed pre-stall state.
- Solve for the post-stall trim with find_deep_stall_trim(inputs):
it scans the band from stall + 5 deg up to hi_deg (default 60 deg)
and returns the highest-angle Cm zero crossing, the stable
high-alpha trim where the fading separated-flow pitch-up lets Cm
fall back below zero. None means Cm never crosses in the band, so
the tail keeps authority and no deep-stall trim exists.
- Measure the lock with lock_depth_deg(alpha_lock_deg,
alpha_stall_deg) and the blanking at the trim from
blanking_factor at the lock angle.
- Compute recovery_margin(inputs, alpha_lock_deg): the elevator
pitch-down moment available over the pitch-up hump between the
stall and the locked trim. Infinite when no lock exists.
- Run analyze(inputs) for the verdict dict: deep_stall True when a
post-stall trim sits at least 3 deg above the stall; alpha_lock
True when the elevator cannot overcome the hump (negative
recovery margin).
- Confirm the deterministic checks with the contract test
scripts/test_deep_stall_analysis.py.
Worked example
T-tail transport-like airplane: clmax 1.5, a_w 5.7, cm0_wb 0.02,
cm_alpha_wb -0.6, v_h 0.9, a_t 4.2, eta_t0 0.9, eta_blank 0.25,
alpha_wake_deg 20.0, d_eps_dalpha 0.35, sep_contrib 3.0,
cm_delta -1.1, delta_e_max_deg -25.0.
- Stall angle: 1.5 / 5.7 * 57.29578 + 2.0 = 17.08 deg (module value
17.077837).
- Blanking factor: 1.0 at 20 deg, 0.63889 at 25 deg, 0.27778 at 30 deg
and above (eta 0.25, tail almost fully in the wake).
- At 45 deg (0.7854 rad): the tail is fully blanked so Cm_t =
-0.9 * 0.25 * 4.2 * 0.65 * 0.7854 = -0.482; the separated-flow
pitch-up, x = 0.4873 rad past the stall, adds 3.0 * 0.4873 = 1.462;
wing-body Cm = 0.02 - 0.471 = -0.451. Total Cm = +0.528, positive,
the pitch-up deep-stall band.
- find_deep_stall_trim returns 58.77 deg, in the [55, 60] deg band,
deterministically (two calls agree to 1e-9). Lock depth 58.77 -
17.08 = 41.69 deg.
- Recovery: max down moment = 1.1 * 25 * 0.0174533 = 0.480. The
pitch-up hump peak between stall and lock is about 0.729, so the
recovery margin is 0.480 - 0.729 = -0.249, negative. analyze
verdict: "deep-stall alpha lock, elevator insufficient", with
cm_at_stall -0.818 (pre-stall trim is stable) and blanking factor
0.27778 at the lock.
- With the same airplane at eta_blank 0.9 (tail never blanked, blank
ratio 1.0) the tail keeps authority, Cm stays negative at high
alpha, find_deep_stall_trim returns None and the verdict is
"no deep-stall trim" with recovery margin infinite.
- With cm_delta -1.6 and delta_e_max_deg -30.0 the down moment rises
to 0.838, the margin turns positive (+0.109) and the verdict becomes
"deep-stall trim, elevator recovers".
Verification
- stall_angle_deg(1.5, 5.7) returns 17.077837 deg, within 1e-6 of the
module contract value.
- blanking_factor(25.0, 20.0, 0.25 / 0.9) returns 0.638889 and
blanking_factor(35.0, 20.0, 0.25 / 0.9) returns 0.277778.
- separation_pitch_up at 45 deg returns 1.4620 (rise branch);
peak 1.8 at 0.6 rad past the stall; 0.9 at 0.8 rad; zero at and
beyond 1.0 rad and below the stall.
- cm_total(45.0, inputs) returns +0.5283, positive in the deep-stall
band; cm_at_stall(inputs) is -0.818, negative.
- find_deep_stall_trim returns 58.7701 deg deterministically; the
eta_blank 0.9 sanity case returns None.
- analyze reports deep_stall True, alpha_lock True, lock depth 41.69
deg and the alpha-lock verdict for the worked example.
- ValueError rejection: clmax <= 0, a_w <= 0, v_h <= 0, eta_t0 <= 0 or
1, eta_blank < 0 or > eta_t0, alpha_wake_deg <= 0, d_eps_dalpha
outside [0, 1], sep_contrib <= 0, cm_delta >= 0, delta_e_max_deg
= 0 and cm_alpha_wb >= 0 all raise ValueError.
- Run the contract test offline: python3
scripts/test_deep_stall_analysis.py (35 tests, deterministic).
Pitfalls
- Setting eta_blank above eta_t0: the blanking factor is eta_blank/eta_t0
and eta_blank is validated in [0, eta_t0]; setting eta_blank equal to
eta_t0 models a tail that is never blanked (factor 1.0), not 'more
blanking'.
- Expecting a deep-stall trim from every T-tail: find_deep_stall_trim
returns None when Cm never crosses zero in the post-stall band (tail keeps
authority), and recovery_margin is infinite then - None is the 'no alpha
lock' answer, not a failure.
- Reading a positive Cm in the deep-stall band as recovery: positive Cm at
high alpha means the airplane pitches up into the post-stall region; the
downward crossing through zero is the stable lock point, and alpha_lock
True means the elevator cannot overcome the hump.
- Sign conventions on the elevator: cm_delta must be negative and
delta_e_max_deg negative (down elevator); cm_alpha_wb must be negative;
violations raise ValueError and a positive cm_delta would report recovery
authority with the wrong sign.
- Quoting the wake and separation coefficients as standard values: the
blanking ramp, separation rise (0.6 rad) and fade (0.4 rad) and slopes are
documented typical engineering-model constants, not standard values.
Related leaves
- flight-mechanics/stability-control/spin-recovery: the departure and
spinning regime neighbor; developed spin modes and spin recovery
control inputs are its claim, not this leaf.
- flight-mechanics/stability-control/longitudinal-stability: neutral
point and static margin for the low-alpha stability context and the
tail volume basis.
- flight-mechanics/stability-control/dynamic-stability: the short
period and phugoid modes around the trimmed states.
- flight-test-operations/envelope/stall-characteristics-testing: the
flight test program for stall characteristics, the testing boundary
for this analysis.
- flight-test-operations/envelope/high-angle-of-attack-testing: the
flight test program for the post-stall regime this model assesses.
- vehicle-design/sizing/tail-sizing: sizing the horizontal tail that
sets v_h and the tail authority used here.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_deep_stall_analysis.py
The test covers the stall angle value and scaling, the blanking factor
ramp points, the separation pitch-up branches (rise, peak, fade,
zero), the positive Cm deep-stall band at 45 deg, the negative Cm at
the stall, the bisection root value in [55, 60] deg with
determinism, the no-root sanity case, lock depth, recovery margins
(negative, infinite, positive), the analyze verdict strings, the full
output dict, and ValueError rejection of every non-physical input in
the validation list.
Compliance
- Standards referenced, not reproduced: FAR 25 and CS 25 frame the
stall and controllability context (25.103 stall, 25.143
controllability and 25.145 longitudinal control context,
summary-only per standards-map.yaml). The wake blanking and
separated-flow coefficients in this model are documented typical
engineering-model constants, not values taken from the standards.
- compliance: STANDARDS-REF, gated: false.
1---2name: deep-stall-analysis3description: Use when you must assess whether a T-tail or aft-fuselage-mounted-tail airplane can enter a deep stall, a self-sustaining high-angle-of-attack trim beyond the stall sometimes called alpha lock, and whether the elevator retains pitch-down authority to recover. Compute the viscous stall angle from the wing lift slope, model the loss of horizontal-tail effectiveness in the wing or fuselage wake with a tail blanking factor, add the separated-flow wing-body pitch-up that rises after the stall and fades at very high angle of attack, solve for the post-stall trim angle in the deep-stall band, and compare the elevator pitch-down moment with the pitch-up hump it must overcome. Produces the stall angle, blanking factor at the trim, lock depth, recovery margin, and the deep-stall and alpha-lock verdicts. Trigger: deep stall, T-tail blanking, alpha lock, post-stall trim, tail blanking factor, separated flow pitch-up, pitch-down recovery authority.4license: Apache-2.05---67# Deep Stall Analysis (flight-mechanics/stability-control/deep-stall-analysis)89Use when the task is to assess whether a T-tail or aft-fuselage-mounted10tail airplane can enter a deep stall, a self-sustaining high-angle-of-11attack trim beyond the stall sometimes called alpha lock, and whether12the elevator retains enough pitch-down authority to recover from it.13The model captures the loss of horizontal-tail effectiveness when the14tail enters the wing or fuselage wake at high angle of attack through a15tail blanking factor, adds a separated-flow wing-body pitch-up that16rises after the stall and fades at very high angle of attack, solves17for the post-stall trim point in the deep-stall band, and compares the18elevator pitch-down moment available at that trim with the pitch-up19moment hump the elevator must overcome to pitch back below the stall.20It pairs with flight-mechanics/stability-control/spin-recovery as the21departure and spinning neighbor and with22flight-mechanics/stability-control/longitudinal-stability as the tail23sizing and static stability neighbor. Deep stall here means the static24pitch trim at high alpha with a wake-blanked tail, not a spin entry;25developed spins and autorotation bands belong to spin-recovery, and26stall and post-stall flight test programs belong to27flight-test-operations stall-characteristics-testing and28high-angle-of-attack-testing. All wake and separation coefficients in29this model are documented typical engineering-model constants, not30standard values.3132## Domain quick reference3334- Stall angle: alpha_stall = (clmax / a_w) * R2D +35 VISC_STALL_SHIFT_DEG, with a viscous shift of 2.0 deg above the36 linear clmax/a slope.37- Tail blanking factor: 1.0 below the wake angle, linear ramp to38 eta_blank / eta_t0 across the next BLANK_DELTA_DEG = 10 deg, constant39 at eta_blank / eta_t0 above. The factor multiplies eta_t0, so the40 effective tail efficiency is eta = eta_t0 * factor. Setting41 eta_blank equal to eta_t0 gives factor 1.0 everywhere, a tail that is42 never blanked.43- Tail pitch contribution: Cm_t = -v_h * eta * a_t * (1 -44 d_eps_dalpha) * alpha (radians), from the tail volume coefficient45 v_h, tail lift slope a_t and downwash gradient d_eps_dalpha.46- Separated-flow pitch-up: rises linearly at slope sep_contrib over47 SEP_RISE_RAD = 0.6 rad beyond the stall, fades linearly back to zero48 over SEP_FADE_RAD = 0.4 rad, zero outside that band.49- Total moment: Cm = cm0_wb + cm_alpha_wb * alpha + Cm_sep + Cm_t.50 A positive Cm in the deep-stall band means the airplane pitches up51 into the post-stall region; a downward crossing of Cm through zero at52 high alpha is the stable deep-stall trim (alpha lock point).53- Recovery authority: max_down_moment = |cm_delta| * |delta_e_max|,54 compared with the maximum pitch-up moment hump between the stall and55 the locked trim. Positive recovery margin means full down elevator56 can pitch the nose back below the stall.57- FAR 25 and CS 25 frame the stall and controllability context; the58 relations above are standard engineering methodology, summary-only.5960## Workflow61621. Gather the configuration: clmax, a_w, cm0_wb, cm_alpha_wb, v_h,63 a_t, eta_t0, eta_blank, alpha_wake_deg, d_eps_dalpha, sep_contrib,64 cm_delta and delta_e_max_deg into the inputs dict.652. Compute the stall angle with stall_angle_deg(clmax, a_w) and the66 tail blanking factor across alpha with blanking_factor(alpha_deg,67 alpha_wake_deg, eta_blank / eta_t0).683. Build the pitch moment curve with cm_total(alpha_deg, inputs) and69 check its sign at the stall with cm_at_stall(inputs). A negative70 Cm at the stall is the trimmed pre-stall state.714. Solve for the post-stall trim with find_deep_stall_trim(inputs):72 it scans the band from stall + 5 deg up to hi_deg (default 60 deg)73 and returns the highest-angle Cm zero crossing, the stable74 high-alpha trim where the fading separated-flow pitch-up lets Cm75 fall back below zero. None means Cm never crosses in the band, so76 the tail keeps authority and no deep-stall trim exists.775. Measure the lock with lock_depth_deg(alpha_lock_deg,78 alpha_stall_deg) and the blanking at the trim from79 blanking_factor at the lock angle.806. Compute recovery_margin(inputs, alpha_lock_deg): the elevator81 pitch-down moment available over the pitch-up hump between the82 stall and the locked trim. Infinite when no lock exists.837. Run analyze(inputs) for the verdict dict: deep_stall True when a84 post-stall trim sits at least 3 deg above the stall; alpha_lock85 True when the elevator cannot overcome the hump (negative86 recovery margin).878. Confirm the deterministic checks with the contract test88 scripts/test_deep_stall_analysis.py.8990## Worked example9192T-tail transport-like airplane: clmax 1.5, a_w 5.7, cm0_wb 0.02,93cm_alpha_wb -0.6, v_h 0.9, a_t 4.2, eta_t0 0.9, eta_blank 0.25,94alpha_wake_deg 20.0, d_eps_dalpha 0.35, sep_contrib 3.0,95cm_delta -1.1, delta_e_max_deg -25.0.9697- Stall angle: 1.5 / 5.7 * 57.29578 + 2.0 = 17.08 deg (module value98 17.077837).99- Blanking factor: 1.0 at 20 deg, 0.63889 at 25 deg, 0.27778 at 30 deg100 and above (eta 0.25, tail almost fully in the wake).101- At 45 deg (0.7854 rad): the tail is fully blanked so Cm_t =102 -0.9 * 0.25 * 4.2 * 0.65 * 0.7854 = -0.482; the separated-flow103 pitch-up, x = 0.4873 rad past the stall, adds 3.0 * 0.4873 = 1.462;104 wing-body Cm = 0.02 - 0.471 = -0.451. Total Cm = +0.528, positive,105 the pitch-up deep-stall band.106- find_deep_stall_trim returns 58.77 deg, in the [55, 60] deg band,107 deterministically (two calls agree to 1e-9). Lock depth 58.77 -108 17.08 = 41.69 deg.109- Recovery: max down moment = 1.1 * 25 * 0.0174533 = 0.480. The110 pitch-up hump peak between stall and lock is about 0.729, so the111 recovery margin is 0.480 - 0.729 = -0.249, negative. analyze112 verdict: "deep-stall alpha lock, elevator insufficient", with113 cm_at_stall -0.818 (pre-stall trim is stable) and blanking factor114 0.27778 at the lock.115- With the same airplane at eta_blank 0.9 (tail never blanked, blank116 ratio 1.0) the tail keeps authority, Cm stays negative at high117 alpha, find_deep_stall_trim returns None and the verdict is118 "no deep-stall trim" with recovery margin infinite.119- With cm_delta -1.6 and delta_e_max_deg -30.0 the down moment rises120 to 0.838, the margin turns positive (+0.109) and the verdict becomes121 "deep-stall trim, elevator recovers".122123## Verification124125- stall_angle_deg(1.5, 5.7) returns 17.077837 deg, within 1e-6 of the126 module contract value.127- blanking_factor(25.0, 20.0, 0.25 / 0.9) returns 0.638889 and128 blanking_factor(35.0, 20.0, 0.25 / 0.9) returns 0.277778.129- separation_pitch_up at 45 deg returns 1.4620 (rise branch);130 peak 1.8 at 0.6 rad past the stall; 0.9 at 0.8 rad; zero at and131 beyond 1.0 rad and below the stall.132- cm_total(45.0, inputs) returns +0.5283, positive in the deep-stall133 band; cm_at_stall(inputs) is -0.818, negative.134- find_deep_stall_trim returns 58.7701 deg deterministically; the135 eta_blank 0.9 sanity case returns None.136- analyze reports deep_stall True, alpha_lock True, lock depth 41.69137 deg and the alpha-lock verdict for the worked example.138- ValueError rejection: clmax <= 0, a_w <= 0, v_h <= 0, eta_t0 <= 0 or139 > 1, eta_blank < 0 or > eta_t0, alpha_wake_deg <= 0, d_eps_dalpha140 outside [0, 1], sep_contrib <= 0, cm_delta >= 0, delta_e_max_deg141 >= 0 and cm_alpha_wb >= 0 all raise ValueError.142- Run the contract test offline: python3143 scripts/test_deep_stall_analysis.py (35 tests, deterministic).144145## Pitfalls146147- Setting eta_blank above eta_t0: the blanking factor is eta_blank/eta_t0148 and eta_blank is validated in [0, eta_t0]; setting eta_blank equal to149 eta_t0 models a tail that is never blanked (factor 1.0), not 'more150 blanking'.151- Expecting a deep-stall trim from every T-tail: find_deep_stall_trim152 returns None when Cm never crosses zero in the post-stall band (tail keeps153 authority), and recovery_margin is infinite then - None is the 'no alpha154 lock' answer, not a failure.155- Reading a positive Cm in the deep-stall band as recovery: positive Cm at156 high alpha means the airplane pitches up into the post-stall region; the157 downward crossing through zero is the stable lock point, and alpha_lock158 True means the elevator cannot overcome the hump.159- Sign conventions on the elevator: cm_delta must be negative and160 delta_e_max_deg negative (down elevator); cm_alpha_wb must be negative;161 violations raise ValueError and a positive cm_delta would report recovery162 authority with the wrong sign.163- Quoting the wake and separation coefficients as standard values: the164 blanking ramp, separation rise (0.6 rad) and fade (0.4 rad) and slopes are165 documented typical engineering-model constants, not standard values.166167## Related leaves168169- flight-mechanics/stability-control/spin-recovery: the departure and170 spinning regime neighbor; developed spin modes and spin recovery171 control inputs are its claim, not this leaf.172- flight-mechanics/stability-control/longitudinal-stability: neutral173 point and static margin for the low-alpha stability context and the174 tail volume basis.175- flight-mechanics/stability-control/dynamic-stability: the short176 period and phugoid modes around the trimmed states.177- flight-test-operations/envelope/stall-characteristics-testing: the178 flight test program for stall characteristics, the testing boundary179 for this analysis.180- flight-test-operations/envelope/high-angle-of-attack-testing: the181 flight test program for the post-stall regime this model assesses.182- vehicle-design/sizing/tail-sizing: sizing the horizontal tail that183 sets v_h and the tail authority used here.184185## Behavior contract (gate 3)186187Run the deterministic contract test (stdlib unittest, offline):188189 python3 scripts/test_deep_stall_analysis.py190191The test covers the stall angle value and scaling, the blanking factor192ramp points, the separation pitch-up branches (rise, peak, fade,193zero), the positive Cm deep-stall band at 45 deg, the negative Cm at194the stall, the bisection root value in [55, 60] deg with195determinism, the no-root sanity case, lock depth, recovery margins196(negative, infinite, positive), the analyze verdict strings, the full197output dict, and ValueError rejection of every non-physical input in198the validation list.199200## Compliance201202- Standards referenced, not reproduced: FAR 25 and CS 25 frame the203 stall and controllability context (25.103 stall, 25.143204 controllability and 25.145 longitudinal control context,205 summary-only per standards-map.yaml). The wake blanking and206 separated-flow coefficients in this model are documented typical207 engineering-model constants, not values taken from the standards.208- compliance: STANDARDS-REF, gated: false.