Mixed-Flow Exhaust (propulsion/turbofan/mixed-flow-exhaust)
Use when the task is the two-stream turbofan design point with a MIXING
(common) exhaust: the fan and core streams are traversed to the mixer
entry plane, the constant-area mixer is closed by the energy and momentum
balances over the two streams' total states, and the mixed stream expands
through ONE common convergent nozzle. This leaf produces the mixed total
temperature and pressure with the mixing loss ratio, the common-nozzle
exit velocity and pressure term, the net thrust and TSFC of the mixed-flow
configuration, and the same-traverse separate-exhaust baseline whose F and
TSFC comparison gates the mixed-vs-separate exhaust decision at a low-BPR
operating point. It is the exhaust-configuration partner of the
separate-exhaust design point leaf in this pack: the sibling
turbofan-design-point computes the same station chain but explicitly
disclaims mixed-stream configurations, and this leaf returns the favor by
using the separate-exhaust layout only as the comparison baseline, not as
its output. Pure Python, stdlib only (math), constant-gamma isentropic
component forms, single-layer ISA troposphere, deterministic.
Domain quick reference
- Ram traverse: v0 = machsqrt(GAMMA_CR_Ct0); tt0 = t0(1 + 0.5*
(GAMMA_C-1)mach^2); pt0 = p0(tt0/t0)^(1/KAPPA_C).
- Diffuser: tt2 = tt0; pt2 = p0*(1 + eta_d*(tt0/t0 - 1))^(1/KAPPA_C).
- Cold compressor (fan, booster, HPC) at isentropic efficiency eta:
tt_s = tt_inpr^KAPPA_C; tt_out = tt_in + (tt_s - tt_in)/eta;
pt_out = pt_inpr.
- Burner: f = CP_C*(tt4 - tt3)/(eta_b*LHV); pt4 = pt3.
- HP spool per unit core air: CP_G*(tt4 - tt45) = CP_C*(tt3 - tt25).
- LP spool per unit core air: CP_G*(tt45 - tt5) = CP_C*((1 + bpr)*
(tt13 - tt2) + (tt25 - tt13)).
- Turbine expansion at eta: tt_s = tt_in - (tt_in - tt_out)/eta;
pt_out = pt_in*(tt_s/tt_in)^(1/KAPPA_G).
- Mass flows per unit core air: m_fan = bpr, m_core = 1 + f,
m_total = bpr + 1 + f; the fuel mass rides the core through the mixer
and common nozzle.
- Fan duct: tt16 = tt13; pt16 = pi_duct*pt13.
- Mixer entry at the equal static PRESSURE plane: p_s = pt16/(1 + 0.5*
(GAMMA_C-1)M_fan_entry^2)^(GAMMA_C/(GAMMA_C-1)); the core entry Mach
is the subsonic isentropic root at p_s; entry areas follow from
continuity A = mRT_s/(p_sv).
- Mixed gas: cp_mix, r_mix mass-weighted; gamma_mix = cp_mix/(cp_mix -
r_mix); energy gives tt_mix; the constant-area momentum balance
m_totalv_exit + p_exitA = m_fv_f + m_gv_g + p_s*A with p_exit from
continuity closes on the FIRST (subsonic) root by bisection.
- Mixing loss ratio: pt_mix/pt_tw below 1 when the entry velocities
differ, with pt_tw the mass-weighted entry total pressure.
- Common convergent nozzle on the mixed stream: choked when npr >=
((gamma+1)/2)^(gamma/(gamma-1)); v_exit = cvsqrt(2cp*(tt_mix - Te));
a_by_mdot = rTe/(pev_exit).
- Net thrust: F = m_total*(v_exit_nozz - v0) + (pe - p0)A9; TSFC = f/F
per unit core air. kg/(N s) converts to lbm/(lbf hr) via
LBF_PER_HR = 3600G0 = 35303.94.
- Gas constants: GAMMA_C 1.4, CP_C 1005, R_C 287.142857; GAMMA_G 4/3,
CP_G 1150, R_G 287.5. 14 CFR Part 33 (far-33) frames the engine
certification context (reference-only); the relations are standard
cycle-analysis methodology, summary-only.
Workflow
- Fix the operating point: mach, altitude (ISA troposphere, 0-11000 m),
OPR with opr = fprlpc_prhpc_pr, BPR, Tt4, the component efficiencies
eta_d/eta_fan/eta_bst/eta_hpc/eta_b/eta_hpt/eta_lpt, the nozzle
velocity coefficient cv, the duct pressure ratio pi_duct and the
fan-stream mixer entry Mach M_fan_entry in (0, 1).
- Get the atmosphere and freestream: isa_atmosphere then
freestream_state for t0, p0, v0, tt0, pt0.
- Traverse the station chain 0-2-13-2.5-3-4-4.5-5 with
design_point_traverse (fan on both streams, booster and HPC on the
core, burner, HPT, LPT) and confirm the closure identities
opr == fprlpc_prhpc_pr, m_core == 1 + f and m_total == bpr + m_core.
- Carry the bypass stream through the fan duct to the mixer entry:
station 16 with tt16 = tt13 and pt16 = pi_duct*pt13.
- Close the constant-area mixer with mixing_state on the two entry total
states (fan stream cold, core stream hot, mass flows per unit core
air) at M_fan_entry: read p_s, the core entry Mach, the entry
velocities and areas, the mixed total temperature tt_mix, the mixed
exit state on the first subsonic momentum-balance root, and the mixing
loss ratio pt_mix/pt_tw.
- Expand the mixed stream through the common convergent nozzle with
common_nozzle using the mixed gamma/cp/r and cv: choked check, exit
velocity and the exit-plane area per unit mass flow.
- Compute the net thrust with net_thrust and the TSFC = f/F per unit
core air for the mixed-flow configuration.
- Build the separate-exhaust baseline from the same traverse: two
per-stream convergent nozzles (fan nozzle on tt13/pt13 cold, core
nozzle on tt5/pt5 hot), F_sep = F_fan + F_core, and report the F ratio
and TSFC ratio that gate the mixed-vs-separate exhaust decision.
- Confirm the deterministic checks with the contract test
scripts/test_mixed_flow_exhaust.py (offline, stdlib unittest).
Worked example
Low-BPR military-style mixed-flow turbofan at Mach 0.85 and 10668 m:
OPR 24 (fan 4.0, booster 1.6, HPC 3.75), BPR 0.6, Tt4 = 1750 K;
eta_d 0.97, eta_fan 0.90, eta_bst 0.89, eta_hpc 0.88, eta_b 0.995,
eta_hpt 0.90, eta_lpt 0.91, cv 0.985, pi_duct 0.98, M_fan_entry 0.3.
All values are the real module outputs.
- Atmosphere and freestream: t0 = 218.808 K, p0 = 23835.9 Pa,
v0 = 252.0946 m/s.
- Traverse per unit core air: tt2 250.4258 K, pt2 37724.0983 Pa;
tt13 385.6541 K, pt13 150896.3931 Pa; tt25 447.9310 K,
pt25 241434.2290 Pa; tt3 681.4885 K, pt3 905378.3586 Pa;
tt45 1545.8911 K, pt45 519660.4508 Pa; tt5 1302.3820 K,
pt5 242959.2421 Pa; f 0.025099; m_fan 0.600, m_core 1.025099,
m_total 1.625099; hpc_pr 3.75.
- Fan duct: tt16 385.6541 K, pt16 147878.4652 Pa.
- Mixer: p_s 138927.3372 Pa at fan entry Mach 0.3000, core entry Mach
0.9486; fan stream T_s 378.8350 K, v 117.0737 m/s, A 0.004013 m2;
core stream T_s 1132.5358 K, v 625.0169 m/s, A 0.003844 m2; duct area
0.007857 m2. Mixed state tt_mix 992.1523 K, cp_mix 1096.4648,
r_mix 287.3681, gamma_mix 1.35517; exit v 356.7873 m/s,
p_exit 155617.86 Pa, M_exit 0.591555 subsonic on the first branch,
T_s_exit 934.1034 K; pt_mix 195867.88 Pa against pt_tw 207854.63 Pa,
mixing_loss_ratio 0.942331 (below 1 because the entry velocities
differ, v_f 117 vs v_g 625 m/s).
- Common nozzle: choked, Me 1.0, Te 842.5308 K, pe 104975.57 Pa,
v_ideal 572.8084 m/s, v_exit 564.2162 m/s = cv*v_ideal, A/mdot
0.004088.
- Mixed-flow net thrust 1046.247 N per unit core air (106.7 lbf per
kg/s core) and TSFC 2.40e-5 kg/(N s) = 0.847 lbm/(lbf hr).
- Separate-exhaust baseline from the same traverse: fan nozzle v19
354.044 m/s (choked), core nozzle v9 644.348 m/s (choked),
F_sep 990.686 N, TSFC_sep 2.53e-5 kg/(N s) = 0.894 lbm/(lbf hr).
- Comparison: F ratio 1.056083 and TSFC ratio 0.946895: the mixed
configuration gains about 5.6 percent thrust and 5.3 percent SFC at
this low-BPR point, because mixing equalizes the very different jet
velocities (354 vs 644 m/s).
Verification
- Confirm isa_atmosphere(0) returns (288.15, 101325.0) exactly and the
freestream at sea-level static (mach 0) gives v0 = 0, tt0 = t0.
- Confirm the traverse closures: opr = fprlpc_prhpc_pr = 24, f from the
burner energy balance closes tt4 = 1750 K, m_core = 1 + f and
m_total = bpr + m_core.
- Confirm the mixer energy result tt_mix = 992.1523 K and the
mass-weighted cp_mix/r_mix identities hold exactly; the momentum
residual m_totalv + pA = m_fv_f + m_gv_g + p_s*A closes at
M_exit = 0.591555 on the first subsonic branch.
- Confirm the mixing loss ratio 0.942331 stays below 1 (momentum mixing
loss when the entry velocities differ).
- Confirm the common nozzle is choked at the worked point with Me = 1
and v_exit = cv*v_ideal (ratio 0.985 exactly).
- Confirm F and TSFC (1046.247 N, 2.40e-5 kg/(N s)) and the comparison
ratios F 1.056083 and TSFC 0.946895 against the separate-exhaust
baseline.
- Confirm every non-physical input raises ValueError: altitude outside
[0, 11000] m, negative mach, efficiencies and cv outside (0, 1],
pressure ratios below 1, tt4 <= tt3, opr < fpr, hpc_pr < 1, negative
mass flows, m_fan_entry outside (0, 1), a core entry Mach reaching 1
(reduce m_fan_entry), a momentum balance with no subsonic root, and
non-positive nozzle states or mass flow.
- Run the contract test offline under both interpreters:
python3 scripts/test_mixed_flow_exhaust.py and
~/.pyenv/versions/3.13.12/bin/python3 scripts/test_mixed_flow_exhaust.py
(56 tests, deterministic).
Related leaves
- propulsion/turbofan/turbofan-design-point: the separate-exhaust design
point on the same station chain; the per-stream nozzle bookkeeping
this leaf reuses only as the comparison baseline.
- propulsion/turbofan/turbofan-cycle: the one-stream cycle context and
mass-flow/jet-velocity inputs.
- propulsion/turbofan/bypass-ratio-trade: the bypass-ratio thrust split
at the velocity level for the trade sweep.
- propulsion/turbofan/turbofan-off-design: off-design matching and
throttle behavior, explicitly outside this leaf's design-point scope.
- propulsion/gas-turbine-cycle/afterburner-cycle: core-only reheat, no
fan stream or mixer.
- propulsion/gas-turbine-cycle/propelling-nozzle: single-stream choked
convergent nozzle sizing; the common-nozzle step here uses the same
choked/unchoked relations on the mixed stream.
Pitfalls
- Reporting the mixed total state without the momentum balance: the
energy balance alone gives tt_mix; pt_mix must come from the
constant-area momentum balance on the first subsonic root, and the
mixing loss ratio pt_mix/pt_tw falls below 1 only when the entry
velocities differ (0.9423 at the worked point).
- Feeding the entry total pressures into the loss bookkeeping as the
mixed total pressure: pt_tw is the mass-weighted entry total pressure
(207854.6 Pa at the worked point), and pt_mix (195867.9 Pa) sits below
it by the momentum mixing loss, not above any single stream value.
- Assuming the mixer entry Mach on the core stream: the design input is
the fan-stream entry Mach M_fan_entry; the core entry Mach is DERIVED
from the equal static pressure plane (0.9486 at the worked point) and
reaches 1 when the fan entry Mach is pushed too high, which raises
ValueError (reduce M_fan_entry).
- Reading the separate-exhaust sibling's output as this leaf's model:
turbofan-design-point owns the separate-exhaust per-stream nozzle
output; here the per-stream nozzles appear only as the comparison
baseline that produces the F and TSFC ratios.
- Treating the mixed nozzle as a second mixer stream: after the mixer
there is ONE common convergent nozzle on the mixed stream with the
mixed gamma/cp/r, sized by the same choked/unchoked relations as
propelling-nozzle but never on two streams at once.
- Using variable specific heats or turbine cooling: all component forms
are constant-gamma isentropic on the module gas constants only; real
cycle effects and the nozzle throat AREA sizing for arbitrary entry
states belong to other leaves.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_mixed_flow_exhaust.py
The test covers the module constants, the atmosphere and freestream step
at sea level and at the worked altitude, the diffuser and cold
compression steps, the burner fuel-to-air ratio and its energy closure,
the HP and LP spool work balances, the turbine expansion pressures, the
full station traverse with the opr-product and mass-flow closure
identities, the fan duct carry, the mixer entry plane with the derived
core entry Mach and the continuity areas, the mixed gas properties, the
energy balance, the momentum-balance subsonic root, the total pressure
loss ratio, the common nozzle choked and unchoked regimes with the
velocity coefficient round trip, the net thrust and TSFC at the worked
point, the separate-exhaust baseline, the mixed-vs-separate F and TSFC
ratio comparison, the full ValueError rejection list, and the
determinism checks (no RNG, repeat runs identical).
Compliance
- Standards referenced, not reproduced: 14 CFR Part 33 (far-33) is named
as the engine certification frame; the cycle relations above are
standard engineering methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: mixed-flow-exhaust3description: Use when you must compute the two-stream turbofan design point with a mixing exhaust: traverse the fan and core streams to the mixer entry, close the constant-area mixer by the energy and momentum balance over the two streams' total states to the mixed total temperature and pressure with the mixing loss, expand the mixed stream through the common convergent nozzle, and report the net thrust and TSFC of the mixed-flow configuration against the separate-exhaust baseline. Produces the mixed total state, the mixer pressure loss ratio, the common-nozzle exit velocity, net thrust and TSFC, and the mixed-vs-separate comparison that gate the exhaust-configuration decision. Trigger: mixed-flow exhaust, turbofan mixing exhaust, constant-area mixer, common nozzle, mixing loss, exhaust mixer, low bypass ratio mixed turbofan.4license: Apache-2.05---67# Mixed-Flow Exhaust (propulsion/turbofan/mixed-flow-exhaust)89Use when the task is the two-stream turbofan design point with a MIXING10(common) exhaust: the fan and core streams are traversed to the mixer11entry plane, the constant-area mixer is closed by the energy and momentum12balances over the two streams' total states, and the mixed stream expands13through ONE common convergent nozzle. This leaf produces the mixed total14temperature and pressure with the mixing loss ratio, the common-nozzle15exit velocity and pressure term, the net thrust and TSFC of the mixed-flow16configuration, and the same-traverse separate-exhaust baseline whose F and17TSFC comparison gates the mixed-vs-separate exhaust decision at a low-BPR18operating point. It is the exhaust-configuration partner of the19separate-exhaust design point leaf in this pack: the sibling20turbofan-design-point computes the same station chain but explicitly21disclaims mixed-stream configurations, and this leaf returns the favor by22using the separate-exhaust layout only as the comparison baseline, not as23its output. Pure Python, stdlib only (math), constant-gamma isentropic24component forms, single-layer ISA troposphere, deterministic.2526## Domain quick reference2728- Ram traverse: v0 = mach*sqrt(GAMMA_C*R_C*t0); tt0 = t0*(1 + 0.5*29 (GAMMA_C-1)*mach^2); pt0 = p0*(tt0/t0)^(1/KAPPA_C).30- Diffuser: tt2 = tt0; pt2 = p0*(1 + eta_d*(tt0/t0 - 1))^(1/KAPPA_C).31- Cold compressor (fan, booster, HPC) at isentropic efficiency eta:32 tt_s = tt_in*pr^KAPPA_C; tt_out = tt_in + (tt_s - tt_in)/eta;33 pt_out = pt_in*pr.34- Burner: f = CP_C*(tt4 - tt3)/(eta_b*LHV); pt4 = pt3.35- HP spool per unit core air: CP_G*(tt4 - tt45) = CP_C*(tt3 - tt25).36- LP spool per unit core air: CP_G*(tt45 - tt5) = CP_C*((1 + bpr)*37 (tt13 - tt2) + (tt25 - tt13)).38- Turbine expansion at eta: tt_s = tt_in - (tt_in - tt_out)/eta;39 pt_out = pt_in*(tt_s/tt_in)^(1/KAPPA_G).40- Mass flows per unit core air: m_fan = bpr, m_core = 1 + f,41 m_total = bpr + 1 + f; the fuel mass rides the core through the mixer42 and common nozzle.43- Fan duct: tt16 = tt13; pt16 = pi_duct*pt13.44- Mixer entry at the equal static PRESSURE plane: p_s = pt16/(1 + 0.5*45 (GAMMA_C-1)*M_fan_entry^2)^(GAMMA_C/(GAMMA_C-1)); the core entry Mach46 is the subsonic isentropic root at p_s; entry areas follow from47 continuity A = m*R*T_s/(p_s*v).48- Mixed gas: cp_mix, r_mix mass-weighted; gamma_mix = cp_mix/(cp_mix -49 r_mix); energy gives tt_mix; the constant-area momentum balance50 m_total*v_exit + p_exit*A = m_f*v_f + m_g*v_g + p_s*A with p_exit from51 continuity closes on the FIRST (subsonic) root by bisection.52- Mixing loss ratio: pt_mix/pt_tw below 1 when the entry velocities53 differ, with pt_tw the mass-weighted entry total pressure.54- Common convergent nozzle on the mixed stream: choked when npr >=55 ((gamma+1)/2)^(gamma/(gamma-1)); v_exit = cv*sqrt(2*cp*(tt_mix - Te));56 a_by_mdot = r*Te/(pe*v_exit).57- Net thrust: F = m_total*(v_exit_nozz - v0) + (pe - p0)*A9; TSFC = f/F58 per unit core air. kg/(N s) converts to lbm/(lbf hr) via59 LBF_PER_HR = 3600*G0 = 35303.94.60- Gas constants: GAMMA_C 1.4, CP_C 1005, R_C 287.142857; GAMMA_G 4/3,61 CP_G 1150, R_G 287.5. 14 CFR Part 33 (far-33) frames the engine62 certification context (reference-only); the relations are standard63 cycle-analysis methodology, summary-only.6465## Workflow66671. Fix the operating point: mach, altitude (ISA troposphere, 0-11000 m),68 OPR with opr = fpr*lpc_pr*hpc_pr, BPR, Tt4, the component efficiencies69 eta_d/eta_fan/eta_bst/eta_hpc/eta_b/eta_hpt/eta_lpt, the nozzle70 velocity coefficient cv, the duct pressure ratio pi_duct and the71 fan-stream mixer entry Mach M_fan_entry in (0, 1).722. Get the atmosphere and freestream: isa_atmosphere then73 freestream_state for t0, p0, v0, tt0, pt0.743. Traverse the station chain 0-2-13-2.5-3-4-4.5-5 with75 design_point_traverse (fan on both streams, booster and HPC on the76 core, burner, HPT, LPT) and confirm the closure identities77 opr == fpr*lpc_pr*hpc_pr, m_core == 1 + f and m_total == bpr + m_core.784. Carry the bypass stream through the fan duct to the mixer entry:79 station 16 with tt16 = tt13 and pt16 = pi_duct*pt13.805. Close the constant-area mixer with mixing_state on the two entry total81 states (fan stream cold, core stream hot, mass flows per unit core82 air) at M_fan_entry: read p_s, the core entry Mach, the entry83 velocities and areas, the mixed total temperature tt_mix, the mixed84 exit state on the first subsonic momentum-balance root, and the mixing85 loss ratio pt_mix/pt_tw.866. Expand the mixed stream through the common convergent nozzle with87 common_nozzle using the mixed gamma/cp/r and cv: choked check, exit88 velocity and the exit-plane area per unit mass flow.897. Compute the net thrust with net_thrust and the TSFC = f/F per unit90 core air for the mixed-flow configuration.918. Build the separate-exhaust baseline from the same traverse: two92 per-stream convergent nozzles (fan nozzle on tt13/pt13 cold, core93 nozzle on tt5/pt5 hot), F_sep = F_fan + F_core, and report the F ratio94 and TSFC ratio that gate the mixed-vs-separate exhaust decision.959. Confirm the deterministic checks with the contract test96 scripts/test_mixed_flow_exhaust.py (offline, stdlib unittest).9798## Worked example99100Low-BPR military-style mixed-flow turbofan at Mach 0.85 and 10668 m:101OPR 24 (fan 4.0, booster 1.6, HPC 3.75), BPR 0.6, Tt4 = 1750 K;102eta_d 0.97, eta_fan 0.90, eta_bst 0.89, eta_hpc 0.88, eta_b 0.995,103eta_hpt 0.90, eta_lpt 0.91, cv 0.985, pi_duct 0.98, M_fan_entry 0.3.104All values are the real module outputs.105106- Atmosphere and freestream: t0 = 218.808 K, p0 = 23835.9 Pa,107 v0 = 252.0946 m/s.108- Traverse per unit core air: tt2 250.4258 K, pt2 37724.0983 Pa;109 tt13 385.6541 K, pt13 150896.3931 Pa; tt25 447.9310 K,110 pt25 241434.2290 Pa; tt3 681.4885 K, pt3 905378.3586 Pa;111 tt45 1545.8911 K, pt45 519660.4508 Pa; tt5 1302.3820 K,112 pt5 242959.2421 Pa; f 0.025099; m_fan 0.600, m_core 1.025099,113 m_total 1.625099; hpc_pr 3.75.114- Fan duct: tt16 385.6541 K, pt16 147878.4652 Pa.115- Mixer: p_s 138927.3372 Pa at fan entry Mach 0.3000, core entry Mach116 0.9486; fan stream T_s 378.8350 K, v 117.0737 m/s, A 0.004013 m2;117 core stream T_s 1132.5358 K, v 625.0169 m/s, A 0.003844 m2; duct area118 0.007857 m2. Mixed state tt_mix 992.1523 K, cp_mix 1096.4648,119 r_mix 287.3681, gamma_mix 1.35517; exit v 356.7873 m/s,120 p_exit 155617.86 Pa, M_exit 0.591555 subsonic on the first branch,121 T_s_exit 934.1034 K; pt_mix 195867.88 Pa against pt_tw 207854.63 Pa,122 mixing_loss_ratio 0.942331 (below 1 because the entry velocities123 differ, v_f 117 vs v_g 625 m/s).124- Common nozzle: choked, Me 1.0, Te 842.5308 K, pe 104975.57 Pa,125 v_ideal 572.8084 m/s, v_exit 564.2162 m/s = cv*v_ideal, A/mdot126 0.004088.127- Mixed-flow net thrust 1046.247 N per unit core air (106.7 lbf per128 kg/s core) and TSFC 2.40e-5 kg/(N s) = 0.847 lbm/(lbf hr).129- Separate-exhaust baseline from the same traverse: fan nozzle v19130 354.044 m/s (choked), core nozzle v9 644.348 m/s (choked),131 F_sep 990.686 N, TSFC_sep 2.53e-5 kg/(N s) = 0.894 lbm/(lbf hr).132- Comparison: F ratio 1.056083 and TSFC ratio 0.946895: the mixed133 configuration gains about 5.6 percent thrust and 5.3 percent SFC at134 this low-BPR point, because mixing equalizes the very different jet135 velocities (354 vs 644 m/s).136137## Verification138139- Confirm isa_atmosphere(0) returns (288.15, 101325.0) exactly and the140 freestream at sea-level static (mach 0) gives v0 = 0, tt0 = t0.141- Confirm the traverse closures: opr = fpr*lpc_pr*hpc_pr = 24, f from the142 burner energy balance closes tt4 = 1750 K, m_core = 1 + f and143 m_total = bpr + m_core.144- Confirm the mixer energy result tt_mix = 992.1523 K and the145 mass-weighted cp_mix/r_mix identities hold exactly; the momentum146 residual m_total*v + p*A = m_f*v_f + m_g*v_g + p_s*A closes at147 M_exit = 0.591555 on the first subsonic branch.148- Confirm the mixing loss ratio 0.942331 stays below 1 (momentum mixing149 loss when the entry velocities differ).150- Confirm the common nozzle is choked at the worked point with Me = 1151 and v_exit = cv*v_ideal (ratio 0.985 exactly).152- Confirm F and TSFC (1046.247 N, 2.40e-5 kg/(N s)) and the comparison153 ratios F 1.056083 and TSFC 0.946895 against the separate-exhaust154 baseline.155- Confirm every non-physical input raises ValueError: altitude outside156 [0, 11000] m, negative mach, efficiencies and cv outside (0, 1],157 pressure ratios below 1, tt4 <= tt3, opr < fpr, hpc_pr < 1, negative158 mass flows, m_fan_entry outside (0, 1), a core entry Mach reaching 1159 (reduce m_fan_entry), a momentum balance with no subsonic root, and160 non-positive nozzle states or mass flow.161- Run the contract test offline under both interpreters:162 python3 scripts/test_mixed_flow_exhaust.py and163 ~/.pyenv/versions/3.13.12/bin/python3 scripts/test_mixed_flow_exhaust.py164 (56 tests, deterministic).165166## Related leaves167168- propulsion/turbofan/turbofan-design-point: the separate-exhaust design169 point on the same station chain; the per-stream nozzle bookkeeping170 this leaf reuses only as the comparison baseline.171- propulsion/turbofan/turbofan-cycle: the one-stream cycle context and172 mass-flow/jet-velocity inputs.173- propulsion/turbofan/bypass-ratio-trade: the bypass-ratio thrust split174 at the velocity level for the trade sweep.175- propulsion/turbofan/turbofan-off-design: off-design matching and176 throttle behavior, explicitly outside this leaf's design-point scope.177- propulsion/gas-turbine-cycle/afterburner-cycle: core-only reheat, no178 fan stream or mixer.179- propulsion/gas-turbine-cycle/propelling-nozzle: single-stream choked180 convergent nozzle sizing; the common-nozzle step here uses the same181 choked/unchoked relations on the mixed stream.182183## Pitfalls184185- Reporting the mixed total state without the momentum balance: the186 energy balance alone gives tt_mix; pt_mix must come from the187 constant-area momentum balance on the first subsonic root, and the188 mixing loss ratio pt_mix/pt_tw falls below 1 only when the entry189 velocities differ (0.9423 at the worked point).190- Feeding the entry total pressures into the loss bookkeeping as the191 mixed total pressure: pt_tw is the mass-weighted entry total pressure192 (207854.6 Pa at the worked point), and pt_mix (195867.9 Pa) sits below193 it by the momentum mixing loss, not above any single stream value.194- Assuming the mixer entry Mach on the core stream: the design input is195 the fan-stream entry Mach M_fan_entry; the core entry Mach is DERIVED196 from the equal static pressure plane (0.9486 at the worked point) and197 reaches 1 when the fan entry Mach is pushed too high, which raises198 ValueError (reduce M_fan_entry).199- Reading the separate-exhaust sibling's output as this leaf's model:200 turbofan-design-point owns the separate-exhaust per-stream nozzle201 output; here the per-stream nozzles appear only as the comparison202 baseline that produces the F and TSFC ratios.203- Treating the mixed nozzle as a second mixer stream: after the mixer204 there is ONE common convergent nozzle on the mixed stream with the205 mixed gamma/cp/r, sized by the same choked/unchoked relations as206 propelling-nozzle but never on two streams at once.207- Using variable specific heats or turbine cooling: all component forms208 are constant-gamma isentropic on the module gas constants only; real209 cycle effects and the nozzle throat AREA sizing for arbitrary entry210 states belong to other leaves.211212## Behavior contract (gate 3)213214Run the deterministic contract test (stdlib unittest, offline):215216 python3 scripts/test_mixed_flow_exhaust.py217218The test covers the module constants, the atmosphere and freestream step219at sea level and at the worked altitude, the diffuser and cold220compression steps, the burner fuel-to-air ratio and its energy closure,221the HP and LP spool work balances, the turbine expansion pressures, the222full station traverse with the opr-product and mass-flow closure223identities, the fan duct carry, the mixer entry plane with the derived224core entry Mach and the continuity areas, the mixed gas properties, the225energy balance, the momentum-balance subsonic root, the total pressure226loss ratio, the common nozzle choked and unchoked regimes with the227velocity coefficient round trip, the net thrust and TSFC at the worked228point, the separate-exhaust baseline, the mixed-vs-separate F and TSFC229ratio comparison, the full ValueError rejection list, and the230determinism checks (no RNG, repeat runs identical).231232## Compliance233234- Standards referenced, not reproduced: 14 CFR Part 33 (far-33) is named235 as the engine certification frame; the cycle relations above are236 standard engineering methodology, summary-only per standards-map.yaml.237- compliance: STANDARDS-REF, gated: false.