Aircraft Oxygen System Sizing (vehicle-design/sizing/aircraft-oxygen-system-sizing)
Use when the task is sizing the supplemental oxygen system of a
transport aircraft at the conceptual level: passenger continuous-flow
chemical oxygen generators (one unit per passenger, TSO-C64 style 22
minute protection) against a crew diluter-demand gaseous oxygen
system, the oxygen demand volume at standard conditions from the
per-occupant flow rate and protection duration, the stored oxygen
mass, and the crew high-pressure bottle volume from the ideal gas law.
This leaf implements that sizing in pure Python, stdlib only. It pairs
with vehicle-design/sizing/environmental-control-sizing, which
produces the governing cabin pressure altitude that this leaf consumes
as the demand driver (the schedule itself lives there; this leaf takes
its altitude result as an input). The aircraft oxygen system sizing
never covers surface thermal protection (ice-protection-sizing) or
seat layout (fuselage-sizing).
Domain quick reference
- Passenger continuous-flow demand: V_pax = n_pax * q_pax * t_pax in
standard litres (SL), with q_pax = 5.0 SLPM per passenger and
t_pax = 22 min of protection per generator unit. The architecture
supplies one chemical generator unit per passenger.
- Demand mass: m = V * 1e-3 * RHO_O2_STP with RHO_O2_STP = 1.429
kg/m3, the oxygen density at 0 C and 101.325 kPa (1.429 g per
standard litre), so m_kg = V_SL * 1.429e-3 exactly.
- Crew diluter-demand: V_crew = n_crew * q_crew * t_crew with q_crew =
2.5 SLPM average per crew member and t_crew = 120 min (2 h crew
protection); same volume-to-mass conversion.
- Crew storage: the gaseous oxygen bottle holds the crew demand mass at
the service pressure. Ideal gas law V = m * R_O2 * T / p with R_O2 =
259.8 J/(kg K), T = 288.15 K (15 C storage) and p = p_psi *
6894.757 Pa. The bottle volume is inversely proportional to the
service pressure at fixed mass and temperature.
- The design cabin pressure altitude sets the demand context: cabin
partial pressure of oxygen at an 8000 ft cabin altitude is about
15.8 kPa versus 21.2 kPa at sea level, which is why the altitude
drives the demand. The altitude itself comes from
environmental-control-sizing.
- All demand volumes are standard litres at 0 C and 101.325 kPa;
pressures enter as psi and are converted internally.
Workflow
- Fix the occupant split: passenger count n_passengers and crew count
n_crew (sources: fuselage-sizing for seats, the operator's crew
complement) and the governing cabin pressure altitude from
environmental-control-sizing.
- Decide the delivery architecture: continuous-flow chemical
generators for passengers, diluter-demand gaseous oxygen for the
crew.
- Compute the passenger demand with passenger_demand (volume_sl and
mass_kg at the default 5.0 SLPM over 22 min) and the generator unit
count with generator_units, one unit per passenger.
- Compute the crew demand with crew_demand (default 2.5 SLPM over 120
min).
- Size the crew storage with bottle_volume from the crew demand mass,
the service pressure in psi and the storage temperature; it returns
volume_m3 and volume_l (for layout, one bottle or two half-size
bottles).
- Roll everything up with oxygen_summary(n_passengers, n_crew,
service_pressure_psi), which returns the passenger demand, the
generator count, the crew demand, the crew bottle volume and the
total stored mass.
- Confirm the deterministic checks with the contract test
scripts/test_aircraft_oxygen_system_sizing.py.
Worked example
Reference transport: 150 passengers, 6 crew, crew bottle service
pressure 1800 psi. Real module outputs:
- passenger_demand(150): volume_sl = 16500.0 SL (150 * 5.0 * 22),
mass_kg = 23.5785 kg (spec bound 23.58 within 1e-1).
- generator_units(150): 150 units, one per passenger.
- crew_demand(6): volume_sl = 1800.0 SL (6 * 2.5 * 120), mass_kg =
2.5722 kg (spec bound 2.57 within 1e-2).
- bottle_volume(2.5722, 1800): volume_m3 = 0.015516 m3, volume_l =
15.52 L within 1e-2 of the spec value (2.5722 * 259.8 * 288.15 /
(1800 * 6894.757) = 0.015516 m3). For layout, one 15.5 L bottle or
two 7.76 L bottles.
- oxygen_summary(150, 6, 1800): total_mass_kg = 26.1507 kg (23.5785
passenger + 2.5722 crew), bottle_volume_l = 15.516 L.
Pitfalls
- Using one architecture for both cabins: passengers get
continuous-flow chemical generators (one unit per passenger,
5.0 SLPM over 22 min) while the crew runs on diluter-demand
gaseous oxygen (2.5 SLPM over 120 min); swapping the flow rates or
durations mis-sizes both.
- Forgetting the unit conversion in the demand mass: m_kg =
V_SL * 1.429e-3 exactly (one standard litre of oxygen masses
1.429 g at 0 C and 101.325 kPa), so a standard-litre volume quoted
directly as grams is off by 1000.
- Sizing the bottle at the wrong pressure convention: pressures
enter in psi and are converted internally (1800 psi in the worked
example); the ideal-gas volume is inversely proportional to the
service pressure, so a psi-versus-Pa slip mis-sizes the bottle.
- Confusing standard litres with ambient litres: all demand volumes
are at standard conditions (0 C, 101.325 kPa); an ambient-volume
demand does not convert through the same density.
- Neglecting the cabin altitude driver: the design cabin pressure
altitude sets the demand context and comes from
environmental-control-sizing; this leaf consumes that altitude
result as an input rather than re-deriving the schedule.
- Feeding non-positive occupants, flows, durations, mass, pressure
or temperature: every one of these raises ValueError, including
through the oxygen_summary convenience call.
Verification
- Confirm passenger_demand(150) returns 16500.0 SL and 23.5785 kg,
and that doubling the passenger count doubles both the volume and
the mass.
- Confirm generator_units(150) returns 150 and generator_units(1)
returns 1.
- Confirm crew_demand(6) returns 1800.0 SL and 2.5722 kg.
- Confirm bottle_volume(2.5722, 1800) returns 0.015516 m3 and
15.516 L, that doubling the pressure halves the volume and doubling
the mass doubles the volume.
- Confirm the mass round trip: one standard litre of oxygen masses
exactly 1.429e-3 kg (mass_kg = volume_sl * 1.429e-3).
- Confirm identical inputs give identical outputs (deterministic).
- Confirm every non-positive n_passengers, n_crew, flow, duration,
mass, pressure and temperature raises ValueError, including through
oxygen_summary.
- Confirm the oxygen_summary keys match the documented contract
exactly: passenger_demand_sl, passenger_mass_kg, generator_units,
crew_demand_sl, crew_mass_kg, bottle_volume_m3, bottle_volume_l,
total_mass_kg.
- Run the contract test offline: python3
scripts/test_aircraft_oxygen_system_sizing.py (34 tests,
deterministic).
Related leaves
- vehicle-design/sizing/environmental-control-sizing: produces the
governing cabin pressure altitude this leaf consumes as the demand
driver.
- vehicle-design/sizing/fuselage-sizing: seat count and cabin layout
source for the occupant split.
- vehicle-design/sizing/ice-protection-sizing: surface thermal
protection, distinct from the breathing oxygen demand sized here.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_aircraft_oxygen_system_sizing.py
The test covers the 150 passenger / 6 crew / 1800 psi worked example
within the spec magnitude bounds, the doubling identities (passengers,
pressure, mass), the exact standard-litre mass round trip, the
oxygen_summary convenience keys and values, and ValueError rejection
of every non-physical input class (34 test methods).
Compliance
- Standards referenced, not reproduced: FAR 25.1443 frames the
supplemental oxygen context (framing only); the flow, density and
protection-duration values above are standard engineering design
practice per the summary-only convention of standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: aircraft-oxygen-system-sizing3description: Use when you must size the aircraft supplemental oxygen system: computing passenger continuous-flow chemical generator demand and unit count, crew diluter-demand gaseous oxygen requirement, converting standard-litre demand volumes to oxygen mass at standard conditions, and sizing crew gaseous oxygen bottle volume from the ideal gas law at the service pressure and storage temperature. Produces the passenger and crew oxygen demands, the generator count, the crew bottle volume and the stored oxygen mass that gate the oxygen system architecture. Trigger: supplemental oxygen sizing, oxygen generator count, oxygen demand mass, oxygen bottle volume, breathing oxygen, diluter-demand, chemical generator, gaseous oxygen.4license: Apache-2.05---67# Aircraft Oxygen System Sizing (vehicle-design/sizing/aircraft-oxygen-system-sizing)89Use when the task is sizing the supplemental oxygen system of a10transport aircraft at the conceptual level: passenger continuous-flow11chemical oxygen generators (one unit per passenger, TSO-C64 style 2212minute protection) against a crew diluter-demand gaseous oxygen13system, the oxygen demand volume at standard conditions from the14per-occupant flow rate and protection duration, the stored oxygen15mass, and the crew high-pressure bottle volume from the ideal gas law.16This leaf implements that sizing in pure Python, stdlib only. It pairs17with vehicle-design/sizing/environmental-control-sizing, which18produces the governing cabin pressure altitude that this leaf consumes19as the demand driver (the schedule itself lives there; this leaf takes20its altitude result as an input). The aircraft oxygen system sizing21never covers surface thermal protection (ice-protection-sizing) or22seat layout (fuselage-sizing).2324## Domain quick reference2526- Passenger continuous-flow demand: V_pax = n_pax * q_pax * t_pax in27 standard litres (SL), with q_pax = 5.0 SLPM per passenger and28 t_pax = 22 min of protection per generator unit. The architecture29 supplies one chemical generator unit per passenger.30- Demand mass: m = V * 1e-3 * RHO_O2_STP with RHO_O2_STP = 1.42931 kg/m3, the oxygen density at 0 C and 101.325 kPa (1.429 g per32 standard litre), so m_kg = V_SL * 1.429e-3 exactly.33- Crew diluter-demand: V_crew = n_crew * q_crew * t_crew with q_crew =34 2.5 SLPM average per crew member and t_crew = 120 min (2 h crew35 protection); same volume-to-mass conversion.36- Crew storage: the gaseous oxygen bottle holds the crew demand mass at37 the service pressure. Ideal gas law V = m * R_O2 * T / p with R_O2 =38 259.8 J/(kg K), T = 288.15 K (15 C storage) and p = p_psi *39 6894.757 Pa. The bottle volume is inversely proportional to the40 service pressure at fixed mass and temperature.41- The design cabin pressure altitude sets the demand context: cabin42 partial pressure of oxygen at an 8000 ft cabin altitude is about43 15.8 kPa versus 21.2 kPa at sea level, which is why the altitude44 drives the demand. The altitude itself comes from45 environmental-control-sizing.46- All demand volumes are standard litres at 0 C and 101.325 kPa;47 pressures enter as psi and are converted internally.4849## Workflow50511. Fix the occupant split: passenger count n_passengers and crew count52 n_crew (sources: fuselage-sizing for seats, the operator's crew53 complement) and the governing cabin pressure altitude from54 environmental-control-sizing.552. Decide the delivery architecture: continuous-flow chemical56 generators for passengers, diluter-demand gaseous oxygen for the57 crew.583. Compute the passenger demand with passenger_demand (volume_sl and59 mass_kg at the default 5.0 SLPM over 22 min) and the generator unit60 count with generator_units, one unit per passenger.614. Compute the crew demand with crew_demand (default 2.5 SLPM over 12062 min).635. Size the crew storage with bottle_volume from the crew demand mass,64 the service pressure in psi and the storage temperature; it returns65 volume_m3 and volume_l (for layout, one bottle or two half-size66 bottles).676. Roll everything up with oxygen_summary(n_passengers, n_crew,68 service_pressure_psi), which returns the passenger demand, the69 generator count, the crew demand, the crew bottle volume and the70 total stored mass.717. Confirm the deterministic checks with the contract test72 scripts/test_aircraft_oxygen_system_sizing.py.7374## Worked example7576Reference transport: 150 passengers, 6 crew, crew bottle service77pressure 1800 psi. Real module outputs:7879- passenger_demand(150): volume_sl = 16500.0 SL (150 * 5.0 * 22),80 mass_kg = 23.5785 kg (spec bound 23.58 within 1e-1).81- generator_units(150): 150 units, one per passenger.82- crew_demand(6): volume_sl = 1800.0 SL (6 * 2.5 * 120), mass_kg =83 2.5722 kg (spec bound 2.57 within 1e-2).84- bottle_volume(2.5722, 1800): volume_m3 = 0.015516 m3, volume_l =85 15.52 L within 1e-2 of the spec value (2.5722 * 259.8 * 288.15 /86 (1800 * 6894.757) = 0.015516 m3). For layout, one 15.5 L bottle or87 two 7.76 L bottles.88- oxygen_summary(150, 6, 1800): total_mass_kg = 26.1507 kg (23.578589 passenger + 2.5722 crew), bottle_volume_l = 15.516 L.909192## Pitfalls9394- Using one architecture for both cabins: passengers get95 continuous-flow chemical generators (one unit per passenger,96 5.0 SLPM over 22 min) while the crew runs on diluter-demand97 gaseous oxygen (2.5 SLPM over 120 min); swapping the flow rates or98 durations mis-sizes both.99- Forgetting the unit conversion in the demand mass: m_kg =100 V_SL * 1.429e-3 exactly (one standard litre of oxygen masses101 1.429 g at 0 C and 101.325 kPa), so a standard-litre volume quoted102 directly as grams is off by 1000.103- Sizing the bottle at the wrong pressure convention: pressures104 enter in psi and are converted internally (1800 psi in the worked105 example); the ideal-gas volume is inversely proportional to the106 service pressure, so a psi-versus-Pa slip mis-sizes the bottle.107- Confusing standard litres with ambient litres: all demand volumes108 are at standard conditions (0 C, 101.325 kPa); an ambient-volume109 demand does not convert through the same density.110- Neglecting the cabin altitude driver: the design cabin pressure111 altitude sets the demand context and comes from112 environmental-control-sizing; this leaf consumes that altitude113 result as an input rather than re-deriving the schedule.114- Feeding non-positive occupants, flows, durations, mass, pressure115 or temperature: every one of these raises ValueError, including116 through the oxygen_summary convenience call.117## Verification118119- Confirm passenger_demand(150) returns 16500.0 SL and 23.5785 kg,120 and that doubling the passenger count doubles both the volume and121 the mass.122- Confirm generator_units(150) returns 150 and generator_units(1)123 returns 1.124- Confirm crew_demand(6) returns 1800.0 SL and 2.5722 kg.125- Confirm bottle_volume(2.5722, 1800) returns 0.015516 m3 and126 15.516 L, that doubling the pressure halves the volume and doubling127 the mass doubles the volume.128- Confirm the mass round trip: one standard litre of oxygen masses129 exactly 1.429e-3 kg (mass_kg = volume_sl * 1.429e-3).130- Confirm identical inputs give identical outputs (deterministic).131- Confirm every non-positive n_passengers, n_crew, flow, duration,132 mass, pressure and temperature raises ValueError, including through133 oxygen_summary.134- Confirm the oxygen_summary keys match the documented contract135 exactly: passenger_demand_sl, passenger_mass_kg, generator_units,136 crew_demand_sl, crew_mass_kg, bottle_volume_m3, bottle_volume_l,137 total_mass_kg.138- Run the contract test offline: python3139 scripts/test_aircraft_oxygen_system_sizing.py (34 tests,140 deterministic).141142## Related leaves143144- vehicle-design/sizing/environmental-control-sizing: produces the145 governing cabin pressure altitude this leaf consumes as the demand146 driver.147- vehicle-design/sizing/fuselage-sizing: seat count and cabin layout148 source for the occupant split.149- vehicle-design/sizing/ice-protection-sizing: surface thermal150 protection, distinct from the breathing oxygen demand sized here.151152## Behavior contract (gate 3)153154Run the deterministic contract test (stdlib unittest, offline):155156 python3 scripts/test_aircraft_oxygen_system_sizing.py157158The test covers the 150 passenger / 6 crew / 1800 psi worked example159within the spec magnitude bounds, the doubling identities (passengers,160pressure, mass), the exact standard-litre mass round trip, the161oxygen_summary convenience keys and values, and ValueError rejection162of every non-physical input class (34 test methods).163164## Compliance165166- Standards referenced, not reproduced: FAR 25.1443 frames the167 supplemental oxygen context (framing only); the flow, density and168 protection-duration values above are standard engineering design169 practice per the summary-only convention of standards-map.yaml.170- compliance: STANDARDS-REF, gated: false.