Rocket Nozzle Flow Separation (propulsion/rocket/rocket-nozzle-flow-separation)
Use when you must predict wall flow separation inside an overexpanded
rocket nozzle operating below its design altitude. This leaf applies the
separation-pressure-ratio criterion (Summerfield class) to decide whether
the nozzle wall flow separates, locates the separation station on the
divergent section through the isentropic area-Mach relation, finds the
altitude at which the nozzle un-separates as the ambient pressure falls,
and reports the separated-thrust correction and the side-load regime flag
that gate off-design nozzle operation. Pure Python, stdlib only. It pairs
with propulsion/rocket/nozzle-design, which owns the ideal attached-flow
sizing envelope from the chamber conditions, and with
propulsion/rocket/combustion-chamber-design for the chamber-side
performance that feeds the nozzle.
Domain quick reference
- Separation criterion: wall separation occurs when the local wall static
pressure falls to p_sep = K_SEP * pa with K_SEP = 0.4 (sea-level anchor,
documented model constant), pa the ambient pressure in Pa.
- Separation Mach number: M_sep = sqrt(((pc/p_sep)**((gamma-1)/gamma) - 1)
- 2/(gamma-1)), from the chamber pressure pc and the separation pressure.
- Separation station: A_sep/At from the isentropic area-Mach relation at
M_sep; the flow separates when the exit area ratio Ae_At exceeds
A_sep/At, and stays attached when Ae_At <= A_sep/At.
- Area-Mach relation: A/A* = (1/M) * ((2/(gamma+1)) * (1 + (gamma-1)/2 *
M2))((gamma+1)/(2*(gamma-1))); at M = 1 the ratio is exactly 1 (the
throat), and the supersonic branch is monotonic.
- Separation altitude: the altitude where the ISA ambient pressure equals
the design exit pressure pe_design (bisection over 0 to 20000 m, 100
iterations), the un-separation altitude for a nozzle designed for
pe_design; results clamp to the bracket ends.
- ISA pressure: p(h) = 101325 * (1 - 0.0065*h/288.15)**5.2561 below
11000 m and the isothermal form above, with module data R = 287.0 and
G0 = 9.80665; the troposphere base is 101325 Pa at 0 m.
- Side-load regime: separated flow with the nozzle overexpanded (design
exit pressure pe_design below the ambient pressure pa) is where
asymmetric separation side loads occur.
- Model notes: the corrected thrust in separated_thrust_loss evaluates the
momentum and the pressure term at the separation station and neglects
the pressure term beyond it, so the loss is measured against the
design-point reference m_dot * v_exit at perfect expansion (exit
pressure matched to ambient); when pe_design is omitted the side-load
flag follows the separation verdict because reaching p_sep below the
ambient pressure already means the nozzle runs overexpanded.
- Units are SI throughout: pressures in Pa, temperature in K, areas in
m^2, flow rate in kg/s, thrust in N, altitude in m.
- ECSS frames the launch-vehicle propulsion context; the relations above
are standard engineering methodology, summary-only.
Workflow
- Fix the operating point: chamber pressure pc, ambient pressure pa,
specific heat ratio gamma, exit-to-throat area ratio Ae_At, and the
design exit pressure pe_design. Use GAMMA_DEFAULT 1.2 for hot
combustion products when gamma is unknown.
- Get the separation pressure with separation_pressure_ratio(pa): the
wall static pressure that triggers separation at this ambient pressure.
- Compute the separation Mach number with separation_mach(pc, p_sep,
gamma) and the station area ratio with
separation_station_area_ratio(pc, pa, gamma).
- Judge the nozzle with separated_verdict(Ae_At, A_sep_At): True means
the exit lies downstream of the separation station and the flow
separates at this ambient pressure.
- Find the un-separation altitude with separation_altitude(pe_design),
where the ISA ambient pressure equals the design exit pressure, and
read the ambient pressure at any flight altitude with isa_pressure.
- Size the thrust impact with separated_thrust_loss(pc, Tc, At, pa,
gamma, Ae_At): chamber temperature Tc and throat area At scale the
choked flow; the dict carries the design-point thrust, the corrected
thrust, the loss and the relative loss.
- Flag the side-load regime with side_load_flag(separated, pc, pa,
pe_design): True only when the flow separates while the nozzle runs
overexpanded at that ambient pressure.
- Confirm the deterministic checks with the contract test
scripts/test_rocket_nozzle_flow_separation.py.
Worked example
pc = 10 MPa, pa = 101325 Pa (sea level), gamma = 1.2, Ae_At = 40,
pe_design = 40 kPa; the thrust-loss scale uses Tc = 3500 K and
At = 0.1 m^2:
- Separation pressure: p_sep = 0.4 * 101325 = 40530 Pa.
- Separation Mach number: M_sep = 3.8787 (3.8787 within 1e-3 of the spec
anchor at pc/p_sep = 246.7).
- Separation station area ratio: A_sep/At = 23.797 (module output
23.79742), so the sea-level station sits well upstream of the Ae_At = 40
exit.
- Verdict: separated_verdict(40, 23.797) is True, the nozzle wall flow
separates at sea level; a nozzle with Ae_At = 20 stays attached.
- Separation altitude: separation_altitude(40000) = 7185 m (module
7185.16 m, within 1 percent of 7185 m); isa_pressure(9000) = 30741 Pa
and isa_pressure(10000) = 26435 Pa bracket the flight corridor.
- Un-separation: at 7185 m the ambient pressure has fallen to the 40 kPa
design exit pressure and the verdict flips to attached flow.
- Side-load flag: side_load_flag(True, 1e7, 101325, 40000) is True at sea
level, the separated and overexpanded regime; an un-separated nozzle
never flags.
- Thrust impact: the design-point thrust is 1.8008 MN and the corrected
(separation-capped) thrust is 1.5965 MN, a loss of 204.2 kN, 11.34
percent of the design point. A mild nozzle with Ae_At = 10 stays
attached and shows zero loss.
Verification
- Confirm separation_station_area_ratio(1e7, 101325, 1.2) returns
23.79742, within the spec bound of 23.797, and that the station area
ratio grows as the ambient pressure falls (higher altitude, less
separation).
- Confirm separated_verdict(40, 23.797) is True and that a nozzle whose
Ae_At stays at or below the separation station area ratio is attached.
- Confirm area_ratio_from_mach(1.0, gamma) equals 1.0 for gamma 1.2 and
1.4, and that separation_altitude(40000) lands within 1 percent of
7185 m with an ISA pressure round trip back to 40000 Pa.
- Confirm the separated case reports a design-point thrust above the
corrected thrust with a positive loss, and the attached case reports
equal thrusts with zero loss.
- Confirm every non-physical input raises ValueError: pc <= 0, pa <= 0,
gamma <= 1, Ae_At <= 1, pe_design <= 0, negative altitude, negative
Mach, and a separation pressure at or above the chamber pressure.
- Run the contract test offline: python3
scripts/test_rocket_nozzle_flow_separation.py (35 tests, deterministic,
under a second).
Related leaves
- propulsion/rocket/nozzle-design: the ideal attached-flow nozzle sizing
envelope from the chamber conditions; this leaf adds the off-design
separation correction that nozzle-design does not model.
- propulsion/rocket/combustion-chamber-design: chamber-side performance
that supplies the chamber pressure and temperature inputs used here.
- propulsion/rocket/thrust-vector-control: actuated thrust deflection,
whose side loads interact with the separated flow regime flagged here.
Pitfalls
- Reading the separation pressure as an exit pressure: p_sep = K_SEP * pa
(40530 Pa at sea level) locates a station inside the divergent section;
the wall flow separates there, so A_sep/At (23.8) is well below the
Ae_At = 40 exit in the separated case.
- Inverting the verdict: separated means Ae_At exceeds A_sep/At, the exit
farther downstream than the separation station; an equal or smaller exit
area ratio keeps the flow attached, and the exact-equal boundary is
attached.
- Treating the separation altitude as a direct root of the A_sep_At =
Ae_At crossing: separation_altitude returns the altitude where the ISA
pressure equals the design exit pressure (bisection over 0 to 20000 m,
clamped at the ends), the design-point un-separation marker; the verdict
flips somewhere at or below it on the ascent.
- Confusing the side-load regime with plain separation: side loads need
separation AND an overexpanded state (pe_design < pa); a separated
nozzle running at or above its design point does not flag.
- Comparing the corrected thrust against the attached-flow estimate:
dropping the exit-side pressure deficit of an overexpanded nozzle would
raise the estimate above the corrected value, which inverts the loss;
the correction is measured against the design-point reference m_dot *
v_exit, where the pressure term vanishes.
- Forgetting the flow scale: separated_thrust_loss needs the chamber
temperature Tc and the throat area At to size the choked flow; without
them only the area-ratio statements of the criterion are available.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_rocket_nozzle_flow_separation.py
The test must pass with exit 0 and covers the worked-example anchors
(p_sep = 40530 Pa, M_sep = 3.8787 within 1e-3, A_sep/At = 23.797,
separation_altitude(40000) near 7185 m within 1 percent, ISA pressures at
9000, 10000 and 11000 m), the area-Mach identity at M = 1 for gamma 1.2
and 1.4, the verdict truth table including the exact-equal boundary, the
growth of the separation station as the ambient pressure falls, the
verdict flip at the separation altitude, the side-load flag across
separated, un-separated and design-above-ambient states, the separated
thrust correction (design point above corrected with a positive loss) and
the attached zero-loss case, the ISA round trip, bracket clamping,
determinism, and ValueError rejection of every non-physical input listed
in the spec.
Contract test
Run the contract test from the repo root:
python3 skills/propulsion/rocket/rocket-nozzle-flow-separation/scripts/test_rocket_nozzle_flow_separation.py
Stdlib unittest only, deterministic, offline, 35 test methods, exit 0 in
about a second. The test imports the sibling logic module
rocket_nozzle_flow_separation_logic from its own scripts directory, so no
install or path configuration is needed.
Compliance
- Standards referenced, not reproduced: ECSS frames the launch-vehicle
propulsion context; the Summerfield-class separation criterion, the
isentropic relations and the ISA standard atmosphere above are standard
engineering methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: rocket-nozzle-flow-separation3description: Use when you must predict flow separation in an overexpanded rocket nozzle: apply the separation-pressure-ratio criterion (wall static pressure falling to K_SEP times ambient, K_SEP 0.4) to decide whether the wall flow separates, find the separation-station area ratio from the isentropic area-Mach relation at the separation pressure, estimate the separation altitude where the nozzle un-separates, and compute the separated-thrust loss and the side-load flag. Produces the separation verdict, separation-station area ratio, separation altitude, corrected thrust and side-load flag. Trigger: rocket-nozzle-flow-separation, separation-pressure-ratio, summerfield-criterion, overexpanded-nozzle, separation-altitude, separated-thrust-loss, side-load-regime.4license: Apache-2.05---67# Rocket Nozzle Flow Separation (propulsion/rocket/rocket-nozzle-flow-separation)89Use when you must predict wall flow separation inside an overexpanded10rocket nozzle operating below its design altitude. This leaf applies the11separation-pressure-ratio criterion (Summerfield class) to decide whether12the nozzle wall flow separates, locates the separation station on the13divergent section through the isentropic area-Mach relation, finds the14altitude at which the nozzle un-separates as the ambient pressure falls,15and reports the separated-thrust correction and the side-load regime flag16that gate off-design nozzle operation. Pure Python, stdlib only. It pairs17with propulsion/rocket/nozzle-design, which owns the ideal attached-flow18sizing envelope from the chamber conditions, and with19propulsion/rocket/combustion-chamber-design for the chamber-side20performance that feeds the nozzle.2122## Domain quick reference2324- Separation criterion: wall separation occurs when the local wall static25 pressure falls to p_sep = K_SEP * pa with K_SEP = 0.4 (sea-level anchor,26 documented model constant), pa the ambient pressure in Pa.27- Separation Mach number: M_sep = sqrt(((pc/p_sep)**((gamma-1)/gamma) - 1)28 * 2/(gamma-1)), from the chamber pressure pc and the separation pressure.29- Separation station: A_sep/At from the isentropic area-Mach relation at30 M_sep; the flow separates when the exit area ratio Ae_At exceeds31 A_sep/At, and stays attached when Ae_At <= A_sep/At.32- Area-Mach relation: A/A* = (1/M) * ((2/(gamma+1)) * (1 + (gamma-1)/2 *33 M**2))**((gamma+1)/(2*(gamma-1))); at M = 1 the ratio is exactly 1 (the34 throat), and the supersonic branch is monotonic.35- Separation altitude: the altitude where the ISA ambient pressure equals36 the design exit pressure pe_design (bisection over 0 to 20000 m, 10037 iterations), the un-separation altitude for a nozzle designed for38 pe_design; results clamp to the bracket ends.39- ISA pressure: p(h) = 101325 * (1 - 0.0065*h/288.15)**5.2561 below40 11000 m and the isothermal form above, with module data R = 287.0 and41 G0 = 9.80665; the troposphere base is 101325 Pa at 0 m.42- Side-load regime: separated flow with the nozzle overexpanded (design43 exit pressure pe_design below the ambient pressure pa) is where44 asymmetric separation side loads occur.45- Model notes: the corrected thrust in separated_thrust_loss evaluates the46 momentum and the pressure term at the separation station and neglects47 the pressure term beyond it, so the loss is measured against the48 design-point reference m_dot * v_exit at perfect expansion (exit49 pressure matched to ambient); when pe_design is omitted the side-load50 flag follows the separation verdict because reaching p_sep below the51 ambient pressure already means the nozzle runs overexpanded.52- Units are SI throughout: pressures in Pa, temperature in K, areas in53 m^2, flow rate in kg/s, thrust in N, altitude in m.54- ECSS frames the launch-vehicle propulsion context; the relations above55 are standard engineering methodology, summary-only.5657## Workflow58591. Fix the operating point: chamber pressure pc, ambient pressure pa,60 specific heat ratio gamma, exit-to-throat area ratio Ae_At, and the61 design exit pressure pe_design. Use GAMMA_DEFAULT 1.2 for hot62 combustion products when gamma is unknown.632. Get the separation pressure with separation_pressure_ratio(pa): the64 wall static pressure that triggers separation at this ambient pressure.653. Compute the separation Mach number with separation_mach(pc, p_sep,66 gamma) and the station area ratio with67 separation_station_area_ratio(pc, pa, gamma).684. Judge the nozzle with separated_verdict(Ae_At, A_sep_At): True means69 the exit lies downstream of the separation station and the flow70 separates at this ambient pressure.715. Find the un-separation altitude with separation_altitude(pe_design),72 where the ISA ambient pressure equals the design exit pressure, and73 read the ambient pressure at any flight altitude with isa_pressure.746. Size the thrust impact with separated_thrust_loss(pc, Tc, At, pa,75 gamma, Ae_At): chamber temperature Tc and throat area At scale the76 choked flow; the dict carries the design-point thrust, the corrected77 thrust, the loss and the relative loss.787. Flag the side-load regime with side_load_flag(separated, pc, pa,79 pe_design): True only when the flow separates while the nozzle runs80 overexpanded at that ambient pressure.818. Confirm the deterministic checks with the contract test82 scripts/test_rocket_nozzle_flow_separation.py.8384## Worked example8586pc = 10 MPa, pa = 101325 Pa (sea level), gamma = 1.2, Ae_At = 40,87pe_design = 40 kPa; the thrust-loss scale uses Tc = 3500 K and88At = 0.1 m^2:8990- Separation pressure: p_sep = 0.4 * 101325 = 40530 Pa.91- Separation Mach number: M_sep = 3.8787 (3.8787 within 1e-3 of the spec92 anchor at pc/p_sep = 246.7).93- Separation station area ratio: A_sep/At = 23.797 (module output94 23.79742), so the sea-level station sits well upstream of the Ae_At = 4095 exit.96- Verdict: separated_verdict(40, 23.797) is True, the nozzle wall flow97 separates at sea level; a nozzle with Ae_At = 20 stays attached.98- Separation altitude: separation_altitude(40000) = 7185 m (module99 7185.16 m, within 1 percent of 7185 m); isa_pressure(9000) = 30741 Pa100 and isa_pressure(10000) = 26435 Pa bracket the flight corridor.101- Un-separation: at 7185 m the ambient pressure has fallen to the 40 kPa102 design exit pressure and the verdict flips to attached flow.103- Side-load flag: side_load_flag(True, 1e7, 101325, 40000) is True at sea104 level, the separated and overexpanded regime; an un-separated nozzle105 never flags.106- Thrust impact: the design-point thrust is 1.8008 MN and the corrected107 (separation-capped) thrust is 1.5965 MN, a loss of 204.2 kN, 11.34108 percent of the design point. A mild nozzle with Ae_At = 10 stays109 attached and shows zero loss.110111## Verification112113- Confirm separation_station_area_ratio(1e7, 101325, 1.2) returns114 23.79742, within the spec bound of 23.797, and that the station area115 ratio grows as the ambient pressure falls (higher altitude, less116 separation).117- Confirm separated_verdict(40, 23.797) is True and that a nozzle whose118 Ae_At stays at or below the separation station area ratio is attached.119- Confirm area_ratio_from_mach(1.0, gamma) equals 1.0 for gamma 1.2 and120 1.4, and that separation_altitude(40000) lands within 1 percent of121 7185 m with an ISA pressure round trip back to 40000 Pa.122- Confirm the separated case reports a design-point thrust above the123 corrected thrust with a positive loss, and the attached case reports124 equal thrusts with zero loss.125- Confirm every non-physical input raises ValueError: pc <= 0, pa <= 0,126 gamma <= 1, Ae_At <= 1, pe_design <= 0, negative altitude, negative127 Mach, and a separation pressure at or above the chamber pressure.128- Run the contract test offline: python3129 scripts/test_rocket_nozzle_flow_separation.py (35 tests, deterministic,130 under a second).131132## Related leaves133134- propulsion/rocket/nozzle-design: the ideal attached-flow nozzle sizing135 envelope from the chamber conditions; this leaf adds the off-design136 separation correction that nozzle-design does not model.137- propulsion/rocket/combustion-chamber-design: chamber-side performance138 that supplies the chamber pressure and temperature inputs used here.139- propulsion/rocket/thrust-vector-control: actuated thrust deflection,140 whose side loads interact with the separated flow regime flagged here.141142## Pitfalls143144- Reading the separation pressure as an exit pressure: p_sep = K_SEP * pa145 (40530 Pa at sea level) locates a station inside the divergent section;146 the wall flow separates there, so A_sep/At (23.8) is well below the147 Ae_At = 40 exit in the separated case.148- Inverting the verdict: separated means Ae_At exceeds A_sep/At, the exit149 farther downstream than the separation station; an equal or smaller exit150 area ratio keeps the flow attached, and the exact-equal boundary is151 attached.152- Treating the separation altitude as a direct root of the A_sep_At =153 Ae_At crossing: separation_altitude returns the altitude where the ISA154 pressure equals the design exit pressure (bisection over 0 to 20000 m,155 clamped at the ends), the design-point un-separation marker; the verdict156 flips somewhere at or below it on the ascent.157- Confusing the side-load regime with plain separation: side loads need158 separation AND an overexpanded state (pe_design < pa); a separated159 nozzle running at or above its design point does not flag.160- Comparing the corrected thrust against the attached-flow estimate:161 dropping the exit-side pressure deficit of an overexpanded nozzle would162 raise the estimate above the corrected value, which inverts the loss;163 the correction is measured against the design-point reference m_dot *164 v_exit, where the pressure term vanishes.165- Forgetting the flow scale: separated_thrust_loss needs the chamber166 temperature Tc and the throat area At to size the choked flow; without167 them only the area-ratio statements of the criterion are available.168169## Behavior contract (gate 3)170171Run the deterministic contract test (stdlib unittest, offline):172173 python3 scripts/test_rocket_nozzle_flow_separation.py174175The test must pass with exit 0 and covers the worked-example anchors176(p_sep = 40530 Pa, M_sep = 3.8787 within 1e-3, A_sep/At = 23.797,177separation_altitude(40000) near 7185 m within 1 percent, ISA pressures at1789000, 10000 and 11000 m), the area-Mach identity at M = 1 for gamma 1.2179and 1.4, the verdict truth table including the exact-equal boundary, the180growth of the separation station as the ambient pressure falls, the181verdict flip at the separation altitude, the side-load flag across182separated, un-separated and design-above-ambient states, the separated183thrust correction (design point above corrected with a positive loss) and184the attached zero-loss case, the ISA round trip, bracket clamping,185determinism, and ValueError rejection of every non-physical input listed186in the spec.187188## Contract test189190Run the contract test from the repo root:191192 python3 skills/propulsion/rocket/rocket-nozzle-flow-separation/scripts/test_rocket_nozzle_flow_separation.py193194Stdlib unittest only, deterministic, offline, 35 test methods, exit 0 in195about a second. The test imports the sibling logic module196rocket_nozzle_flow_separation_logic from its own scripts directory, so no197install or path configuration is needed.198199## Compliance200201- Standards referenced, not reproduced: ECSS frames the launch-vehicle202 propulsion context; the Summerfield-class separation criterion, the203 isentropic relations and the ISA standard atmosphere above are standard204 engineering methodology, summary-only per standards-map.yaml.205- compliance: STANDARDS-REF, gated: false.