Rocket Engine Cycle (propulsion/rocket/rocket-engine-cycle)
Use when the task is liquid rocket engine feed-system cycle selection and
preliminary cycle analysis: trading pressure-fed against pump-fed
gas-generator, staged-combustion, and expander architectures for a
required thrust, chamber pressure, and propellant pair, then computing
the pump discharge pressure, pump powers, turbine drive power, and the
cycle power balance. This leaf implements a simplified SI engine balance
in pure Python, stdlib only, with a small reference propellant table
(LOX/RP-1, LOX/LH2, N2O4/MMH, monopropellant hydrazine). It covers the
feed system only: pair it with propulsion/rocket/combustion-chamber-design
for the chamber, propulsion/rocket/nozzle-design for the expansion
hardware, and propulsion/rocket/propellant-selection for the propellant
families trade.
Domain quick reference
- Total mass flow from thrust and specific impulse: mdot = F / (Isp *
g0), g0 = 9.80665 m/s^2. Table isp_vac is a default, overridable.
- Oxidizer/fuel split at mixture ratio r_m: mdot_ox = mdot * r_m /
(1 + r_m), mdot_f = mdot / (1 + r_m). A monopropellant (r_m None)
keeps one stream.
- Pump discharge pressure: p_pump = p_c + p_losses (2.0 MPa default
injector plus line loss). The pump inlet sees the low-pressure feed
tank, 0.3 MPa default.
- Pump power per propellant: P_pump = mdot_prop * (p_pump - p_inlet) /
(rho_prop * eta_pump), eta_pump 0.7 default. Total is the sum over the
oxidizer and fuel legs; LH2 pumps dominate because of the low density.
- Turbine drive power (isentropic expansion model):
P_turb = mdot_gas * cp * T_in * eta_turb * (1 - (p_exit/p_in)^((g-1)/g)).
Gas-generator defaults: 3% of total flow, cp 2000 J/(kg K), T 1200 K,
g 1.2, p_gg = 0.8 * p_c, p_exit 0.2 MPa, eta_turb 0.6, all
reference-only. Staged combustion expands the full flow from a
1.5 * p_c preburner discharge. The expander drives the turbine with
jacket-heated LH2 fuel from a small ratio near p_c (simplified model,
reference-only).
- Feed-tank mass penalty (thin-wall estimate):
m_tank = p_tank * V_prop * rho_wall / (2 * sigma_wall), titanium
constants, propellant volume from the mass flow over a 60 s reference
burn.
- Feasibility bounds (documented, reference-only): pressure-fed up to
p_c = 3 MPa for storable-class systems; expander only for the LH2
fuel below p_c = 10 MPa; gas-generator and staged-combustion feasible
across the range for bipropellant pairs. ECSS E-ST-35 frames the
space propulsion context; the relations above are standard
engineering methodology, summary-only.
- Units are SI throughout: N, Pa, kg/s, W, kg/m3.
Workflow
- Fix the operating point: thrust F, chamber pressure p_c, propellant
pair, and cycle (pressure-fed, gas-generator, staged-combustion,
expander). Read pair properties with propellant_pair_properties.
- Get the total and per-leg mass flow with mass_flow_split (Isp input
or the table vacuum default).
- Check the cycle against the documented bounds with
cycle_feasibility; it returns (feasible, reason).
- Compute the pump discharge pressure with pump_discharge_pressure and
each pump leg with pump_power; the fuel leg is often the driver.
- Compute the turbine drive with turbine_power using the cycle drive
gas model (gas-generator bleed, staged full flow, expander fuel).
- Size the feed tank with pressure_fed_tank_mass when a pressure-fed
option is on the table.
- Run the full balance with engine_cycle_analysis: it returns the
summary dict (feasible, pump_power_total, turbine_power,
power_balance, drive_mass_fraction, tank_mass_penalty, verdict).
- Confirm the deterministic checks with the contract test
scripts/test_rocket_engine_cycle.py.
Worked example
LOX/RP-1 gas-generator upper stage engine: F = 1.0e6 N, Isp = 300 s,
r_m = 2.56, p_c = 10 MPa, p_losses = 2 MPa, eta_pump = 0.7, 3% gas
generator.
- Mass flow: mdot = 1.0e6 / (300 * 9.80665) = 339.905 kg/s, split to
mdot_ox = 244.426 kg/s and mdot_f = 95.479 kg/s.
- Pump discharge pressure: p_pump = 10 + 2 = 12 MPa.
- Pump powers: oxidizer 244.426 * (12e6 - 0.3e6) / (1140 * 0.7) =
3.584 MW; fuel 95.479 * (12e6 - 0.3e6) / (820 * 0.7) = 1.946 MW;
total 5.530 MW, within 1% of the 5.5 MW ballpark.
- Drive gas: mdot_gg = 0.03 * 339.905 = 10.197 kg/s at p_gg = 8 MPa.
P_turb = 10.197 * 2000 * 1200 * 0.6 * (1 - (0.2/8)^(1/6)) = 6.744 MW
(exact formula value; the power balance is positive).
- Power balance: 6.744 - 5.530 = +1.214 MW surplus, so the
gas-generator cycle closes with margin. The pressure-fed alternative
at this p_c is rejected: the 12 MPa feed tank costs 599.6 kg against
15.0 kg for the 0.3 MPa pump-fed tank on the same 60 s propellant
basis.
- Expander with LOX/RP-1 at 10 MPa is infeasible: the drive needs the
high heat-capacity LH2 fuel, so only LOX/LH2 below the 10 MPa bound
qualifies.
- Small storable contrast: N2O4/MMH pressure-fed at p_c = 2 MPa needs a
4 MPa tank and carries a 162.4 kg penalty at 1 MN for 60 s, a
reasonable mass for a small system with no turbomachinery.
Verification
- Confirm mass_flow_split(1.0e6, 300, g0, 2.56) returns
(339.905, 244.426, 95.479) kg/s to within 1e-6.
- Confirm the pump powers fall within 10% of the 3.6 MW and 1.95 MW
ballparks, total 5.5 MW.
- Confirm the gas-generator analysis returns power_balance =
turbine_power - pump_power_total greater than 0 with the 3% drive
mass fraction, and the staged-combustion balance is positive too.
- Confirm the feasibility matrix is deterministic across every
cycle, propellant, and pressure combination, and that the expander
bound and the pressure-fed bound reject LOX/RP-1 at 10 MPa.
- Confirm every non-positive thrust, pressure, or mass flow, every
unknown propellant or cycle, every efficiency outside (0, 1], and
every non-finite input raises ValueError.
- Run the contract test offline: python3
scripts/test_rocket_engine_cycle.py (30 tests, deterministic).
Related leaves
- propulsion/rocket/combustion-chamber-design: the chamber the feed
system must supply.
- propulsion/rocket/nozzle-design: the expansion hardware downstream of
the chamber.
- propulsion/rocket/propellant-selection: propellant families and their
impulse and density properties.
- propulsion/rocket/rocket-staging: the stage architecture the engine
cycle serves.
Pitfalls
- Selecting a cycle outside its feasibility bounds: pressure-fed is only
for storable-class systems up to about p_c = 3 MPa and the expander
only for the LH2 fuel below p_c = 10 MPa - the worked example's
LOX/RP-1 expander at 10 MPa is rejected by cycle_feasibility, not
rescued by a bigger turbine.
- Reading the power balance as the whole story: the +1.214 MW surplus
closes the gas-generator cycle, but the pump-fed tank penalty (15.0
kg) versus the pressure-fed tank (599.6 kg at 12 MPa) is what decides
between feed architectures at this chamber pressure.
- Forgetting that the fuel leg often drives the pumps: LH2 pumps
dominate because of the low density, and in the worked example the
RP-1 fuel leg still consumes 1.946 MW of the 5.530 MW total - sizing
pumps from the oxidizer leg alone understates the balance.
- Feeding an efficiency outside (0, 1]: eta_pump and eta_turb outside
the open interval raise ValueError, as do non-positive thrust,
pressure or mass flow, unknown propellants or cycles and non-finite
inputs.
- Trusting the reference defaults as flight values: the table Isp, the
2.0 MPa default injector-plus-line loss and the 3% gas-generator
drive are reference-only defaults - the Isp is overridable and the
loss and bleed must be set from the actual engine design.
- Treating the cycle analysis as a chamber or nozzle design: this leaf
covers the feed system only; pair it with combustion-chamber-design
and nozzle-design before judging the engine.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_rocket_engine_cycle.py
The test covers the propellant reference table and its ValueError on
unknown pairs, the worked-example mass flows and split identities
including the monopropellant case, pump discharge pressure, the pump
power anchors (oxidizer, fuel, total), pump power scaling with mass
flow and its fall with efficiency, the gas-generator turbine formula
value, cycle feasibility bounds and the deterministic matrix, the
feed-tank mass scaling, the full engine_cycle_analysis anchors (power
balance identity, drive mass fraction, verdict text), Isp override,
and ValueError rejection of non-physical inputs throughout.
Compliance
- Standards referenced, not reproduced: ECSS E-ST-35 is named as the
space propulsion context per standards-map.yaml; the feed-cycle
relations above are standard engineering methodology, summary-only.
- compliance: STANDARDS-REF, gated: false.
1---2name: rocket-engine-cycle3description: Use when you must assess liquid rocket engine feed cycles at a fixed thrust, chamber pressure, and propellant pair: compare pressure-fed against the pump-fed gas-generator, staged-combustion, and expander cycles, compute the pump discharge pressure, the oxidizer and fuel pump powers, the turbine drive power and the cycle power balance, and size the pressure-fed feed-tank mass penalty. Produces the feasible cycle set, pump and turbine power balance, drive mass fraction, tank mass penalty, and a cycle selection verdict. Trigger: rocket-engine-cycle, feed-cycle, gas-generator cycle, staged-combustion, expander-cycle, pressure-fed, pump-fed, pump-power, turbine-power.4license: Apache-2.05---67# Rocket Engine Cycle (propulsion/rocket/rocket-engine-cycle)89Use when the task is liquid rocket engine feed-system cycle selection and10preliminary cycle analysis: trading pressure-fed against pump-fed11gas-generator, staged-combustion, and expander architectures for a12required thrust, chamber pressure, and propellant pair, then computing13the pump discharge pressure, pump powers, turbine drive power, and the14cycle power balance. This leaf implements a simplified SI engine balance15in pure Python, stdlib only, with a small reference propellant table16(LOX/RP-1, LOX/LH2, N2O4/MMH, monopropellant hydrazine). It covers the17feed system only: pair it with propulsion/rocket/combustion-chamber-design18for the chamber, propulsion/rocket/nozzle-design for the expansion19hardware, and propulsion/rocket/propellant-selection for the propellant20families trade.2122## Domain quick reference2324- Total mass flow from thrust and specific impulse: mdot = F / (Isp *25 g0), g0 = 9.80665 m/s^2. Table isp_vac is a default, overridable.26- Oxidizer/fuel split at mixture ratio r_m: mdot_ox = mdot * r_m /27 (1 + r_m), mdot_f = mdot / (1 + r_m). A monopropellant (r_m None)28 keeps one stream.29- Pump discharge pressure: p_pump = p_c + p_losses (2.0 MPa default30 injector plus line loss). The pump inlet sees the low-pressure feed31 tank, 0.3 MPa default.32- Pump power per propellant: P_pump = mdot_prop * (p_pump - p_inlet) /33 (rho_prop * eta_pump), eta_pump 0.7 default. Total is the sum over the34 oxidizer and fuel legs; LH2 pumps dominate because of the low density.35- Turbine drive power (isentropic expansion model):36 P_turb = mdot_gas * cp * T_in * eta_turb * (1 - (p_exit/p_in)^((g-1)/g)).37 Gas-generator defaults: 3% of total flow, cp 2000 J/(kg K), T 1200 K,38 g 1.2, p_gg = 0.8 * p_c, p_exit 0.2 MPa, eta_turb 0.6, all39 reference-only. Staged combustion expands the full flow from a40 1.5 * p_c preburner discharge. The expander drives the turbine with41 jacket-heated LH2 fuel from a small ratio near p_c (simplified model,42 reference-only).43- Feed-tank mass penalty (thin-wall estimate):44 m_tank = p_tank * V_prop * rho_wall / (2 * sigma_wall), titanium45 constants, propellant volume from the mass flow over a 60 s reference46 burn.47- Feasibility bounds (documented, reference-only): pressure-fed up to48 p_c = 3 MPa for storable-class systems; expander only for the LH249 fuel below p_c = 10 MPa; gas-generator and staged-combustion feasible50 across the range for bipropellant pairs. ECSS E-ST-35 frames the51 space propulsion context; the relations above are standard52 engineering methodology, summary-only.53- Units are SI throughout: N, Pa, kg/s, W, kg/m3.5455## Workflow56571. Fix the operating point: thrust F, chamber pressure p_c, propellant58 pair, and cycle (pressure-fed, gas-generator, staged-combustion,59 expander). Read pair properties with propellant_pair_properties.602. Get the total and per-leg mass flow with mass_flow_split (Isp input61 or the table vacuum default).623. Check the cycle against the documented bounds with63 cycle_feasibility; it returns (feasible, reason).644. Compute the pump discharge pressure with pump_discharge_pressure and65 each pump leg with pump_power; the fuel leg is often the driver.665. Compute the turbine drive with turbine_power using the cycle drive67 gas model (gas-generator bleed, staged full flow, expander fuel).686. Size the feed tank with pressure_fed_tank_mass when a pressure-fed69 option is on the table.707. Run the full balance with engine_cycle_analysis: it returns the71 summary dict (feasible, pump_power_total, turbine_power,72 power_balance, drive_mass_fraction, tank_mass_penalty, verdict).738. Confirm the deterministic checks with the contract test74 scripts/test_rocket_engine_cycle.py.7576## Worked example7778LOX/RP-1 gas-generator upper stage engine: F = 1.0e6 N, Isp = 300 s,79r_m = 2.56, p_c = 10 MPa, p_losses = 2 MPa, eta_pump = 0.7, 3% gas80generator.8182- Mass flow: mdot = 1.0e6 / (300 * 9.80665) = 339.905 kg/s, split to83 mdot_ox = 244.426 kg/s and mdot_f = 95.479 kg/s.84- Pump discharge pressure: p_pump = 10 + 2 = 12 MPa.85- Pump powers: oxidizer 244.426 * (12e6 - 0.3e6) / (1140 * 0.7) =86 3.584 MW; fuel 95.479 * (12e6 - 0.3e6) / (820 * 0.7) = 1.946 MW;87 total 5.530 MW, within 1% of the 5.5 MW ballpark.88- Drive gas: mdot_gg = 0.03 * 339.905 = 10.197 kg/s at p_gg = 8 MPa.89 P_turb = 10.197 * 2000 * 1200 * 0.6 * (1 - (0.2/8)^(1/6)) = 6.744 MW90 (exact formula value; the power balance is positive).91- Power balance: 6.744 - 5.530 = +1.214 MW surplus, so the92 gas-generator cycle closes with margin. The pressure-fed alternative93 at this p_c is rejected: the 12 MPa feed tank costs 599.6 kg against94 15.0 kg for the 0.3 MPa pump-fed tank on the same 60 s propellant95 basis.96- Expander with LOX/RP-1 at 10 MPa is infeasible: the drive needs the97 high heat-capacity LH2 fuel, so only LOX/LH2 below the 10 MPa bound98 qualifies.99- Small storable contrast: N2O4/MMH pressure-fed at p_c = 2 MPa needs a100 4 MPa tank and carries a 162.4 kg penalty at 1 MN for 60 s, a101 reasonable mass for a small system with no turbomachinery.102103## Verification104105- Confirm mass_flow_split(1.0e6, 300, g0, 2.56) returns106 (339.905, 244.426, 95.479) kg/s to within 1e-6.107- Confirm the pump powers fall within 10% of the 3.6 MW and 1.95 MW108 ballparks, total 5.5 MW.109- Confirm the gas-generator analysis returns power_balance =110 turbine_power - pump_power_total greater than 0 with the 3% drive111 mass fraction, and the staged-combustion balance is positive too.112- Confirm the feasibility matrix is deterministic across every113 cycle, propellant, and pressure combination, and that the expander114 bound and the pressure-fed bound reject LOX/RP-1 at 10 MPa.115- Confirm every non-positive thrust, pressure, or mass flow, every116 unknown propellant or cycle, every efficiency outside (0, 1], and117 every non-finite input raises ValueError.118- Run the contract test offline: python3119 scripts/test_rocket_engine_cycle.py (30 tests, deterministic).120121## Related leaves122123- propulsion/rocket/combustion-chamber-design: the chamber the feed124 system must supply.125- propulsion/rocket/nozzle-design: the expansion hardware downstream of126 the chamber.127- propulsion/rocket/propellant-selection: propellant families and their128 impulse and density properties.129- propulsion/rocket/rocket-staging: the stage architecture the engine130 cycle serves.131132## Pitfalls133134- Selecting a cycle outside its feasibility bounds: pressure-fed is only135 for storable-class systems up to about p_c = 3 MPa and the expander136 only for the LH2 fuel below p_c = 10 MPa - the worked example's137 LOX/RP-1 expander at 10 MPa is rejected by cycle_feasibility, not138 rescued by a bigger turbine.139- Reading the power balance as the whole story: the +1.214 MW surplus140 closes the gas-generator cycle, but the pump-fed tank penalty (15.0141 kg) versus the pressure-fed tank (599.6 kg at 12 MPa) is what decides142 between feed architectures at this chamber pressure.143- Forgetting that the fuel leg often drives the pumps: LH2 pumps144 dominate because of the low density, and in the worked example the145 RP-1 fuel leg still consumes 1.946 MW of the 5.530 MW total - sizing146 pumps from the oxidizer leg alone understates the balance.147- Feeding an efficiency outside (0, 1]: eta_pump and eta_turb outside148 the open interval raise ValueError, as do non-positive thrust,149 pressure or mass flow, unknown propellants or cycles and non-finite150 inputs.151- Trusting the reference defaults as flight values: the table Isp, the152 2.0 MPa default injector-plus-line loss and the 3% gas-generator153 drive are reference-only defaults - the Isp is overridable and the154 loss and bleed must be set from the actual engine design.155- Treating the cycle analysis as a chamber or nozzle design: this leaf156 covers the feed system only; pair it with combustion-chamber-design157 and nozzle-design before judging the engine.158159## Behavior contract (gate 3)160161Run the deterministic contract test (stdlib unittest, offline):162163 python3 scripts/test_rocket_engine_cycle.py164165The test covers the propellant reference table and its ValueError on166unknown pairs, the worked-example mass flows and split identities167including the monopropellant case, pump discharge pressure, the pump168power anchors (oxidizer, fuel, total), pump power scaling with mass169flow and its fall with efficiency, the gas-generator turbine formula170value, cycle feasibility bounds and the deterministic matrix, the171feed-tank mass scaling, the full engine_cycle_analysis anchors (power172balance identity, drive mass fraction, verdict text), Isp override,173and ValueError rejection of non-physical inputs throughout.174175## Compliance176177- Standards referenced, not reproduced: ECSS E-ST-35 is named as the178 space propulsion context per standards-map.yaml; the feed-cycle179 relations above are standard engineering methodology, summary-only.180- compliance: STANDARDS-REF, gated: false.