Propellant Tank Sizing (space-systems/subsystems/propellant-tank-sizing)
Use when the task is sizing a spacecraft propellant tank from the
propellant mass budget of the propulsion bus: converting the propellant
mass into the liquid volume with the propellant density, adding the
ullage volume for the required ullage fraction, computing the total
spherical tank volume and its radius, sizing the membrane wall
thickness from the burst pressure and the material allowable,
estimating the tank shell mass, and sizing the pressurant gas mass for
the regulated or blowdown pressurization scheme. This leaf implements
the standard tank sizing chain in pure Python, stdlib only. It pairs
with space-systems/mission-design/mission-delta-v-budget upstream, the
leaf that converts the mission budget into the propellant mass this
sizing consumes, and with space-systems/subsystems/thermal-design, the
other spacecraft bus sizing sibling.
Domain quick reference
- Propellant volume: V_p = m / rho, where m is the propellant mass and
rho the propellant density at the reference temperature.
- Ullage volume: the ullage fraction u is a fraction of the TOTAL tank
volume, so V_ullage = V_p * u / (1 - u). The propellant occupies the
remaining (1 - u) of the tank.
- Tank volume: V_t = V_p / (1 - u), the sum of the propellant and
ullage volumes.
- Sphere radius: r = (3 * V_t / (4 * pi))^(1/3) for a spherical tank.
- Burst pressure: p_burst = burst_factor * MEOP, with burst factor 2.0
a typical proof margin over the maximum expected operating pressure.
- Wall thickness (thin-walled sphere membrane): t = p_burst * r /
(2 * sigma_ult), from the hoop stress balance 2 * sigma * t / r = p.
- Shell mass: m_shell = 4 * pi * r^2 * t * rho_material * f_boss,
where f_boss covers bosses and welds.
- Tank mass fraction: m_shell / m_propellant, the sanity metric that
gates the bus design against a typical 0.20 budget.
- Pressurant mass (ideal gas): m_gas = P * V_ullage / (R * T), at the
operating pressure of the scheme. A regulated system holds MEOP; a
blowdown system starts at MEOP and falls to MEOP / ratio.
- Blowdown pressure range: p_initial = MEOP, p_final = MEOP / ratio
for a given blowdown ratio.
- Units are SI throughout: kg, m3, m, Pa, K. The helium gas constant
is 2077.0 J/(kg K).
- ECSS frames the spacecraft engineering context; the relations above
are standard engineering methodology, summary-only.
Workflow
- Fix the propellant budget: propellant_mass_kg from the mission
delta-v work and propellant_density_kg_m3 for the chosen propellant
(hydrazine is about 1008 kg/m3).
- Choose the ullage fraction (typically 0.06 of the total volume) and
convert mass to volume with propellant_volume_m3.
- Add the gas volume with ullage_volume_m3 and close the total with
tank_volume_m3, then get the sphere radius with sphere_radius_m.
- Set the pressure case: meop_pa, the burst factor (typically 2.0)
and the material ultimate, then burst_pressure_pa and
wall_thickness_m.
- Estimate the structure: shell_mass_kg with the material density
(Ti-6Al-4V is about 4430 kg/m3) and the boss factor (typically
1.10).
- Size the pressurant: pressurant_mass_kg at the MEOP for a regulated
system or at the initial pressure for blowdown, and
blowdown_pressure_range for the blowdown scheme.
- Run analyze with the full input dict to get every quantity plus the
tank mass fraction and the "tank-sizing-pass" or "tank-sizing-fail"
verdict against the typical 0.20 budget.
- Confirm the deterministic checks with the contract test
scripts/test_propellant_tank_sizing.py.
The ullage fraction, burst factor and boss factor are documented
typical values; they are program inputs and must come from the actual
tank specification, not from this leaf.
Worked example
Hydrazine monopropellant tank: mass 100 kg, density 1008 kg/m3, ullage
fraction 0.06, MEOP 2.0 MPa, burst factor 2.0, Ti-6Al-4V ultimate 900
MPa, material density 4430 kg/m3, helium pressurant at 293 K, regulated
scheme at the MEOP.
- Propellant volume: 100 / 1008 = 0.099206 m3.
- Ullage volume: 0.099206 * 0.06 / 0.94 = 0.0063323 m3.
- Tank volume: 0.099206 / 0.94 = 0.105539 m3.
- Sphere radius: (3 * 0.105539 / (4 * pi))^(1/3) = 0.29319 m.
- Burst pressure: 2.0 * 2.0 = 4.0 MPa; wall thickness: 4e6 * 0.29319 /
(2 * 900e6) = 6.5153e-4 m = 0.6515 mm.
- Shell mass: 4 * pi * 0.29319^2 * 6.5153e-4 * 4430 * 1.10 = 3.4296 kg.
- Tank mass fraction: 3.4296 / 100 = 0.0343, well inside the 0.20
budget, so the verdict is "tank-sizing-pass".
- Pressurant mass (regulated at MEOP): 2e6 * 0.0063323 / (2077 * 293) =
0.020811 kg of helium.
- Blowdown case: ratio 2.5 at the same MEOP gives p_initial 2.0 MPa and
p_final 0.8 MPa; the pressurant is sized at the initial pressure, so
the gas mass is the same 0.020811 kg with these inputs.
- Fail construction: keeping the same radius and thickness but a
material density of 30000 kg/m3 raises the shell to about 23.2 kg,
fraction 0.232 above 0.20, so the verdict flips to
"tank-sizing-fail".
Pitfalls
- Taking the typical values as the design: the ullage fraction,
burst factor, and boss factor are documented typicals (0.06, 2.0,
1.10) that must come from the actual tank specification; the leaf
itself says they are program inputs.
- Adding ullage the wrong way: the ullage fraction is a fraction of
the TOTAL tank volume, so V_ullage = V_p * u / (1 - u), not u
times the propellant volume.
- Sizing the wall from MEOP instead of burst pressure: the membrane
thickness uses p_burst = burst_factor * MEOP; a burst-factor slip
of 1.0 (rejected by validation) halves the wall and the shell
mass.
- Confusing the pressurization schemes: a regulated system holds
MEOP while a blowdown system starts at MEOP and falls to
MEOP / ratio, with the pressurant sized at the initial pressure;
picking the wrong scheme changes the gas mass and the pressure
case.
- Judging the bus on the raw shell alone: the gate is the tank mass
fraction m_shell / m_propellant against the 0.20 budget (0.0343 in
the worked example), so a heavy propellant load can mask an
overbuilt tank and vice versa.
- Sizing pressurant with the wrong gas constant: helium is
2077.0 J/(kg K); a nitrogen or other-gas constant silently
rescales the pressurant mass.
Verification
- Confirm propellant_volume_m3(100, 1008) returns 0.099206 m3.
- Confirm analyze returns a tank volume of 0.105539 m3, a radius of
0.29319 m, a wall thickness of 6.5153e-4 m and a shell mass of 3.4296
kg for the worked example inputs.
- Confirm the sphere round-trip: sphere_radius_m then 4/3 * pi * r^3
recovers the tank volume.
- Confirm the blowdown range p_final = MEOP / ratio and that the
blowdown pressurant mass is computed at the initial pressure.
- Confirm the verdict flips to "tank-sizing-fail" only when the tank
mass fraction exceeds 0.20.
- Confirm every non-positive mass, density, pressure, temperature,
radius and thickness, burst factors at or below 1.0, ullage fractions
outside (0, 1), an unknown pressurization mode and blowdown without a
ratio raise ValueError.
- Run the contract test offline: python3
scripts/test_propellant_tank_sizing.py (49 tests, deterministic).
Related leaves
- space-systems/mission-design/mission-delta-v-budget: upstream leaf
that converts the mission budget into the propellant mass this tank
sizing consumes.
- space-systems/subsystems/thermal-design: the thermal control sizing
sibling of the spacecraft bus, paired on the same spacecraft.
- space-systems/subsystems/solar-array-sizing: the power side of the
bus mass and volume trade around the tank.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_propellant_tank_sizing.py
The test covers the worked-example sizing contract (volumes, radius,
burst pressure, wall thickness, shell mass, pressurant mass within the
stated tolerances), ullage fraction edges, sphere volume round trip,
boss factor effect, the regulated and blowdown pressurant sizing, the
blowdown pressure range, the fail-verdict construction and its 0.20
boundary, the documented-default analyze path, and ValueError rejection
of non-physical inputs.
Compliance
- Standards referenced, not reproduced: ECSS is a free ESA download
(ecss.nl/standards); the tank sizing relations above are standard
engineering methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: propellant-tank-sizing3description: Use when you must size a spacecraft propellant tank for the propulsion bus: convert the propellant mass into the liquid volume with the propellant density, add the ullage volume for the required tank ullage fraction, compute the spherical tank volume and radius, size the sphere tank wall thickness from the burst pressure and the material allowable, estimate the tank shell mass, and size the helium pressurant mass for the regulated or blowdown pressurization scheme with the blowdown pressure range. Produces the propellant, ullage and tank volumes, the radius, wall thickness, shell mass, pressurant mass, the tank mass fraction and the pass or fail verdict that gate the spacecraft propulsion bus design. Trigger: propellant tank sizing, propellant volume, tank ullage fraction, pressurant mass, blowdown pressure range, sphere tank wall thickness, spacecraft propulsion bus.4license: Apache-2.05---67# Propellant Tank Sizing (space-systems/subsystems/propellant-tank-sizing)89Use when the task is sizing a spacecraft propellant tank from the10propellant mass budget of the propulsion bus: converting the propellant11mass into the liquid volume with the propellant density, adding the12ullage volume for the required ullage fraction, computing the total13spherical tank volume and its radius, sizing the membrane wall14thickness from the burst pressure and the material allowable,15estimating the tank shell mass, and sizing the pressurant gas mass for16the regulated or blowdown pressurization scheme. This leaf implements17the standard tank sizing chain in pure Python, stdlib only. It pairs18with space-systems/mission-design/mission-delta-v-budget upstream, the19leaf that converts the mission budget into the propellant mass this20sizing consumes, and with space-systems/subsystems/thermal-design, the21other spacecraft bus sizing sibling.2223## Domain quick reference2425- Propellant volume: V_p = m / rho, where m is the propellant mass and26 rho the propellant density at the reference temperature.27- Ullage volume: the ullage fraction u is a fraction of the TOTAL tank28 volume, so V_ullage = V_p * u / (1 - u). The propellant occupies the29 remaining (1 - u) of the tank.30- Tank volume: V_t = V_p / (1 - u), the sum of the propellant and31 ullage volumes.32- Sphere radius: r = (3 * V_t / (4 * pi))^(1/3) for a spherical tank.33- Burst pressure: p_burst = burst_factor * MEOP, with burst factor 2.034 a typical proof margin over the maximum expected operating pressure.35- Wall thickness (thin-walled sphere membrane): t = p_burst * r /36 (2 * sigma_ult), from the hoop stress balance 2 * sigma * t / r = p.37- Shell mass: m_shell = 4 * pi * r^2 * t * rho_material * f_boss,38 where f_boss covers bosses and welds.39- Tank mass fraction: m_shell / m_propellant, the sanity metric that40 gates the bus design against a typical 0.20 budget.41- Pressurant mass (ideal gas): m_gas = P * V_ullage / (R * T), at the42 operating pressure of the scheme. A regulated system holds MEOP; a43 blowdown system starts at MEOP and falls to MEOP / ratio.44- Blowdown pressure range: p_initial = MEOP, p_final = MEOP / ratio45 for a given blowdown ratio.46- Units are SI throughout: kg, m3, m, Pa, K. The helium gas constant47 is 2077.0 J/(kg K).48- ECSS frames the spacecraft engineering context; the relations above49 are standard engineering methodology, summary-only.5051## Workflow52531. Fix the propellant budget: propellant_mass_kg from the mission54 delta-v work and propellant_density_kg_m3 for the chosen propellant55 (hydrazine is about 1008 kg/m3).562. Choose the ullage fraction (typically 0.06 of the total volume) and57 convert mass to volume with propellant_volume_m3.583. Add the gas volume with ullage_volume_m3 and close the total with59 tank_volume_m3, then get the sphere radius with sphere_radius_m.604. Set the pressure case: meop_pa, the burst factor (typically 2.0)61 and the material ultimate, then burst_pressure_pa and62 wall_thickness_m.635. Estimate the structure: shell_mass_kg with the material density64 (Ti-6Al-4V is about 4430 kg/m3) and the boss factor (typically65 1.10).666. Size the pressurant: pressurant_mass_kg at the MEOP for a regulated67 system or at the initial pressure for blowdown, and68 blowdown_pressure_range for the blowdown scheme.697. Run analyze with the full input dict to get every quantity plus the70 tank mass fraction and the "tank-sizing-pass" or "tank-sizing-fail"71 verdict against the typical 0.20 budget.728. Confirm the deterministic checks with the contract test73 scripts/test_propellant_tank_sizing.py.7475The ullage fraction, burst factor and boss factor are documented76typical values; they are program inputs and must come from the actual77tank specification, not from this leaf.7879## Worked example8081Hydrazine monopropellant tank: mass 100 kg, density 1008 kg/m3, ullage82fraction 0.06, MEOP 2.0 MPa, burst factor 2.0, Ti-6Al-4V ultimate 90083MPa, material density 4430 kg/m3, helium pressurant at 293 K, regulated84scheme at the MEOP.8586- Propellant volume: 100 / 1008 = 0.099206 m3.87- Ullage volume: 0.099206 * 0.06 / 0.94 = 0.0063323 m3.88- Tank volume: 0.099206 / 0.94 = 0.105539 m3.89- Sphere radius: (3 * 0.105539 / (4 * pi))^(1/3) = 0.29319 m.90- Burst pressure: 2.0 * 2.0 = 4.0 MPa; wall thickness: 4e6 * 0.29319 /91 (2 * 900e6) = 6.5153e-4 m = 0.6515 mm.92- Shell mass: 4 * pi * 0.29319^2 * 6.5153e-4 * 4430 * 1.10 = 3.4296 kg.93- Tank mass fraction: 3.4296 / 100 = 0.0343, well inside the 0.2094 budget, so the verdict is "tank-sizing-pass".95- Pressurant mass (regulated at MEOP): 2e6 * 0.0063323 / (2077 * 293) =96 0.020811 kg of helium.97- Blowdown case: ratio 2.5 at the same MEOP gives p_initial 2.0 MPa and98 p_final 0.8 MPa; the pressurant is sized at the initial pressure, so99 the gas mass is the same 0.020811 kg with these inputs.100- Fail construction: keeping the same radius and thickness but a101 material density of 30000 kg/m3 raises the shell to about 23.2 kg,102 fraction 0.232 above 0.20, so the verdict flips to103 "tank-sizing-fail".104105106## Pitfalls107108- Taking the typical values as the design: the ullage fraction,109 burst factor, and boss factor are documented typicals (0.06, 2.0,110 1.10) that must come from the actual tank specification; the leaf111 itself says they are program inputs.112- Adding ullage the wrong way: the ullage fraction is a fraction of113 the TOTAL tank volume, so V_ullage = V_p * u / (1 - u), not u114 times the propellant volume.115- Sizing the wall from MEOP instead of burst pressure: the membrane116 thickness uses p_burst = burst_factor * MEOP; a burst-factor slip117 of 1.0 (rejected by validation) halves the wall and the shell118 mass.119- Confusing the pressurization schemes: a regulated system holds120 MEOP while a blowdown system starts at MEOP and falls to121 MEOP / ratio, with the pressurant sized at the initial pressure;122 picking the wrong scheme changes the gas mass and the pressure123 case.124- Judging the bus on the raw shell alone: the gate is the tank mass125 fraction m_shell / m_propellant against the 0.20 budget (0.0343 in126 the worked example), so a heavy propellant load can mask an127 overbuilt tank and vice versa.128- Sizing pressurant with the wrong gas constant: helium is129 2077.0 J/(kg K); a nitrogen or other-gas constant silently130 rescales the pressurant mass.131## Verification132133- Confirm propellant_volume_m3(100, 1008) returns 0.099206 m3.134- Confirm analyze returns a tank volume of 0.105539 m3, a radius of135 0.29319 m, a wall thickness of 6.5153e-4 m and a shell mass of 3.4296136 kg for the worked example inputs.137- Confirm the sphere round-trip: sphere_radius_m then 4/3 * pi * r^3138 recovers the tank volume.139- Confirm the blowdown range p_final = MEOP / ratio and that the140 blowdown pressurant mass is computed at the initial pressure.141- Confirm the verdict flips to "tank-sizing-fail" only when the tank142 mass fraction exceeds 0.20.143- Confirm every non-positive mass, density, pressure, temperature,144 radius and thickness, burst factors at or below 1.0, ullage fractions145 outside (0, 1), an unknown pressurization mode and blowdown without a146 ratio raise ValueError.147- Run the contract test offline: python3148 scripts/test_propellant_tank_sizing.py (49 tests, deterministic).149150## Related leaves151152- space-systems/mission-design/mission-delta-v-budget: upstream leaf153 that converts the mission budget into the propellant mass this tank154 sizing consumes.155- space-systems/subsystems/thermal-design: the thermal control sizing156 sibling of the spacecraft bus, paired on the same spacecraft.157- space-systems/subsystems/solar-array-sizing: the power side of the158 bus mass and volume trade around the tank.159160## Behavior contract (gate 3)161162Run the deterministic contract test (stdlib unittest, offline):163164 python3 scripts/test_propellant_tank_sizing.py165166The test covers the worked-example sizing contract (volumes, radius,167burst pressure, wall thickness, shell mass, pressurant mass within the168stated tolerances), ullage fraction edges, sphere volume round trip,169boss factor effect, the regulated and blowdown pressurant sizing, the170blowdown pressure range, the fail-verdict construction and its 0.20171boundary, the documented-default analyze path, and ValueError rejection172of non-physical inputs.173174## Compliance175176- Standards referenced, not reproduced: ECSS is a free ESA download177 (ecss.nl/standards); the tank sizing relations above are standard178 engineering methodology, summary-only per standards-map.yaml.179- compliance: STANDARDS-REF, gated: false.