Cold Gas Thruster (propulsion/rocket/cold-gas-thruster)
Use when the task is sizing and assessing a cold gas thruster for
spacecraft reaction control: a high pressure inert gas plenum, often
nitrogen, discharges through a choked nozzle throat and produces a
small thrust for attitude control. This leaf implements the standard
cold gas RCS model in pure Python, stdlib only: choked nozzle mass
flow from the plenum pressure and temperature, thrust from the mass
flow and specific impulse, tank gas mass from the ideal gas law,
isothermal blowdown of the plenum, operating time to a minimum usable
pressure, and the total impulse available over the blowdown. It pairs
with propulsion/rocket/rocket-engine-cycle for the feed cycle context
this thruster class replaces on small spacecraft, and with
propulsion/rocket/nozzle-design for the throat and expansion geometry.
The boundary is strict: this leaf is the gas thruster flow and
blowdown model, not a tank structural sizer and not an attitude
control law.
Domain quick reference
- Choked mass flow: m_dot = P * A* / sqrt(T) * CF_CONST, where
CF_CONST = sqrt(gamma/R * (2/(gamma+1))^((gamma+1)/(gamma-1))). For
nitrogen with gamma = 1.4 and R = 296.8 J/(kg K), CF_CONST =
0.039746. The throat is choked while the plenum pressure ratio stays
above the critical value, which holds for cold gas blowdown.
- Thrust from mass flow and specific impulse: F = m_dot * Isp * g0
with g0 = 9.80665 m/s^2. The specific impulse of a cold gas
thruster is low, typically 40 to 75 s for nitrogen, because the
stored gas is never heated.
- Tank gas mass: m = P * V / (R * T) from the ideal gas law. A
25 MPa, 0.03 m3 nitrogen plenum at 293 K holds about 8.62 kg.
- Isothermal blowdown: the tank is thin walled and the discharge is
slow, so the gas stays near the wall temperature. Mass flow is
proportional to pressure and the pressure decays exponentially:
p(t) = p0 * exp(-t / tau) with tau = m_tank / m_dot0. Blowdown from
25 MPa with a 0.5 mm throat gives tau about 757 s.
- Operating time: t = tau * ln(p0 / p_min) to reach the minimum
usable pressure p_min at which the thrust stays controllable.
- Total impulse: I = Isp * g0 * (m0 - m_final), the momentum of the
expelled gas at the fixed specific impulse. Blowing the worked
plenum down to 2 MPa yields about 5058 Ns.
- Cold gas thrusters suit small spacecraft RCS duty: simple, safe,
low thrust, modest total impulse; hydrazine and electric options
carry far more impulse per kilogram when the mission demands it.
- Units are SI throughout: Pa, m3, K, m, kg/s, N, s, Ns.
- ECSS frames the spacecraft propulsion context; the relations above
are standard engineering methodology, summary-only.
Workflow
- Fix the plenum state: pressure P0 in Pa, volume V in m3,
temperature T in K, throat diameter d in m, specific impulse Isp
in s and the minimum usable pressure p_min in Pa.
- Compute the throat area A* = pi * d^2 / 4.
- Get the initial choked mass flow with choked_mass_flow(P0, T, A*)
and the thrust with thrust(m_dot, Isp). The mass flow scales
linearly with plenum pressure.
- Compute the tank gas mass with tank_gas_mass(P0, V, T) and the
blowdown time constant with blowdown_time_constant(m, m_dot0).
- Sample the pressure history with pressure_at_time(P0, t, tau) at
any requested time, and find the operating time with
operating_time(P0, p_min, tau).
- Compute the gas mass left at p_min with tank_gas_mass(p_min, V, T)
and the total impulse with total_impulse(Isp, m0, m_final).
- For a one-call sizing, run size_thruster(P0, V, T, d, Isp, p_min,
t_query) and read all nine outputs from the result dict.
- Confirm the deterministic checks with the contract test
scripts/test_cold_gas_thruster.py.
Worked example
A nitrogen cold gas RCS plenum: P0 = 25 MPa, V = 0.03 m3, T = 293 K,
throat diameter 0.5 mm, Isp = 65 s, p_min = 2 MPa.
- Throat area: A* = pi/4 * (0.5e-3)^2 = 1.9635e-7 m2.
- Initial mass flow: m_dot0 = 25e6 * 1.9635e-7 / sqrt(293) * 0.039746
= 0.011398 kg/s.
- Thrust: F = 0.011398 * 65 * 9.80665 = 7.265 N.
- Tank gas mass: m0 = 25e6 * 0.03 / (296.8 * 293) = 8.6244 kg.
- Time constant: tau = 8.6244 / 0.011398 = 756.7 s.
- Pressure at 30 s: p = 25e6 * exp(-30 / 756.7) = 24.028 MPa.
- Operating time: t = 756.7 * ln(25 / 2) = 1911.1 s.
- Mass at p_min: m_final = 2e6 * 0.03 / (296.8 * 293) = 0.68995 kg.
- Total impulse: I = 65 * 9.80665 * (8.6244 - 0.68995) = 5057.7 Ns.
- At p_min the flow and thrust scale with pressure: m_dot_min =
0.000912 kg/s and F_min = 0.581 N, both about 8% of the initial
values.
Verification
- Confirm choked_mass_flow(25e6, 293, 1.9635e-7) returns 0.011398
kg/s and thrust(0.011398, 65) returns 7.265 N.
- Confirm tank_gas_mass(25e6, 0.03, 293) returns 8.6244 kg,
blowdown_time_constant(8.6244, 0.011398) returns 756.7 s and
pressure_at_time(25e6, 30, 756.7) returns 24.028 MPa.
- Confirm operating_time(25e6, 2e6, 756.7) returns 1911.1 s and
total_impulse(65, 8.6244, 0.68995) returns 5057.7 Ns.
- Confirm the mass flow doubles when the plenum pressure doubles, and
that the pressure decay shape p(tau) = p0 / e holds.
- Confirm every non-positive pressure, temperature, volume, area,
mass flow, tank mass and isp, every p_min at or above p0, and every
negative query time raises ValueError.
- Run the contract test offline: python3
scripts/test_cold_gas_thruster.py (30 tests, deterministic).
Related leaves
- propulsion/rocket/rocket-engine-cycle: the pressure-fed and pump-fed
feed cycle context this cold gas thruster class replaces for small
spacecraft.
- propulsion/rocket/nozzle-design: throat and expansion geometry and
the exit flow terms for chemical thrusters.
- propulsion/rocket/thrust-vector-control: larger engines steered
mechanically, the alternative to small RCS thrusters for attitude
control.
- space-systems/subsystems/propellant-tank-sizing: the plenum tank
that stores the gas, sized as a pressure vessel.
- propulsion/electric/hall-thruster and the electric pack: the high
impulse electric alternative for long life station keeping.
Pitfalls
- Using a high Isp for the cold gas budget: the specific impulse of a
cold gas thruster is low, typically 40 to 75 s for nitrogen because
the stored gas is never heated - quoting a chemical-thruster Isp
inflates the total impulse and undersizes the plenum.
- Treating the blowdown as adiabatic: the model assumes isothermal
blowdown (thin-walled tank, slow discharge, gas near the wall
temperature), which gives the exponential p(t) = p0 * exp(-t / tau);
a fast, adiabatic discharge follows a different pressure history.
- Reporting the initial thrust as the available thrust: at the minimum
usable pressure the flow and thrust scale with pressure, so F_min =
0.581 N is about 8% of the 7.265 N initial value - the RCS sizing
must hold across the blowdown, not at p0.
- Setting p_min at or above the plenum pressure: operating_time needs
p_min below p0 for the logarithm to exist; p_min at or above p0
raises ValueError, as do negative query times.
- Computing the total impulse from the initial mass alone: the impulse
is Isp * g0 * (m0 - m_final) over the expelled gas, so the gas left
in the tank at p_min (0.690 kg of 8.624 kg in the example) must be
subtracted, not included.
- Using the model beyond its boundary: this leaf is the gas thruster
flow and blowdown model, not a tank structural sizer and not an
attitude control law - the plenum tank belongs to
space-systems/subsystems/propellant-tank-sizing.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_cold_gas_thruster.py
The test covers the worked-example contract (mass flow 0.011398 kg/s,
thrust 7.265 N, tank mass 8.6244 kg, time constant 756.7 s, pressure
24.028 MPa at 30 s, operating time 1911.1 s, total impulse 5057.7 Ns),
the linear scaling of mass flow with pressure, the isothermal
exponential decay shape, the size_thruster chain with all nine output
keys, and ValueError rejection of non-positive pressure, temperature,
volume, throat area, mass flow, tank mass and isp, p_min at or above
p0, and negative query times.
Compliance
- Standards referenced, not reproduced: ECSS E-ST-35 is a free ESA
download (ecss.nl/standards); the cold gas thruster relations above
are standard engineering methodology, summary-only per
standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: cold-gas-thruster3description: Use when you must size and assess a cold gas thruster for spacecraft reaction control: compute the choked mass flow through the nozzle throat from the plenum pressure and temperature, the thrust from the mass flow and specific impulse, the tank gas mass from the plenum volume and pressure, the isothermal blowdown time constant and pressure history, the operating time to the minimum usable pressure, and the total impulse available over the blowdown. Produces the throat area, mass flow, thrust, tank gas mass, time constant, pressure at a query time, operating time, and total impulse that gate a cold gas RCS sizing. Trigger: cold gas thruster, nitrogen RCS, choked mass flow, plenum blowdown, total impulse, reaction control thruster sizing, isothermal blowdown time constant.4license: Apache-2.05---67# Cold Gas Thruster (propulsion/rocket/cold-gas-thruster)89Use when the task is sizing and assessing a cold gas thruster for10spacecraft reaction control: a high pressure inert gas plenum, often11nitrogen, discharges through a choked nozzle throat and produces a12small thrust for attitude control. This leaf implements the standard13cold gas RCS model in pure Python, stdlib only: choked nozzle mass14flow from the plenum pressure and temperature, thrust from the mass15flow and specific impulse, tank gas mass from the ideal gas law,16isothermal blowdown of the plenum, operating time to a minimum usable17pressure, and the total impulse available over the blowdown. It pairs18with propulsion/rocket/rocket-engine-cycle for the feed cycle context19this thruster class replaces on small spacecraft, and with20propulsion/rocket/nozzle-design for the throat and expansion geometry.21The boundary is strict: this leaf is the gas thruster flow and22blowdown model, not a tank structural sizer and not an attitude23control law.2425## Domain quick reference2627- Choked mass flow: m_dot = P * A* / sqrt(T) * CF_CONST, where28 CF_CONST = sqrt(gamma/R * (2/(gamma+1))^((gamma+1)/(gamma-1))). For29 nitrogen with gamma = 1.4 and R = 296.8 J/(kg K), CF_CONST =30 0.039746. The throat is choked while the plenum pressure ratio stays31 above the critical value, which holds for cold gas blowdown.32- Thrust from mass flow and specific impulse: F = m_dot * Isp * g033 with g0 = 9.80665 m/s^2. The specific impulse of a cold gas34 thruster is low, typically 40 to 75 s for nitrogen, because the35 stored gas is never heated.36- Tank gas mass: m = P * V / (R * T) from the ideal gas law. A37 25 MPa, 0.03 m3 nitrogen plenum at 293 K holds about 8.62 kg.38- Isothermal blowdown: the tank is thin walled and the discharge is39 slow, so the gas stays near the wall temperature. Mass flow is40 proportional to pressure and the pressure decays exponentially:41 p(t) = p0 * exp(-t / tau) with tau = m_tank / m_dot0. Blowdown from42 25 MPa with a 0.5 mm throat gives tau about 757 s.43- Operating time: t = tau * ln(p0 / p_min) to reach the minimum44 usable pressure p_min at which the thrust stays controllable.45- Total impulse: I = Isp * g0 * (m0 - m_final), the momentum of the46 expelled gas at the fixed specific impulse. Blowing the worked47 plenum down to 2 MPa yields about 5058 Ns.48- Cold gas thrusters suit small spacecraft RCS duty: simple, safe,49 low thrust, modest total impulse; hydrazine and electric options50 carry far more impulse per kilogram when the mission demands it.51- Units are SI throughout: Pa, m3, K, m, kg/s, N, s, Ns.52- ECSS frames the spacecraft propulsion context; the relations above53 are standard engineering methodology, summary-only.5455## Workflow56571. Fix the plenum state: pressure P0 in Pa, volume V in m3,58 temperature T in K, throat diameter d in m, specific impulse Isp59 in s and the minimum usable pressure p_min in Pa.602. Compute the throat area A* = pi * d^2 / 4.613. Get the initial choked mass flow with choked_mass_flow(P0, T, A*)62 and the thrust with thrust(m_dot, Isp). The mass flow scales63 linearly with plenum pressure.644. Compute the tank gas mass with tank_gas_mass(P0, V, T) and the65 blowdown time constant with blowdown_time_constant(m, m_dot0).665. Sample the pressure history with pressure_at_time(P0, t, tau) at67 any requested time, and find the operating time with68 operating_time(P0, p_min, tau).696. Compute the gas mass left at p_min with tank_gas_mass(p_min, V, T)70 and the total impulse with total_impulse(Isp, m0, m_final).717. For a one-call sizing, run size_thruster(P0, V, T, d, Isp, p_min,72 t_query) and read all nine outputs from the result dict.738. Confirm the deterministic checks with the contract test74 scripts/test_cold_gas_thruster.py.7576## Worked example7778A nitrogen cold gas RCS plenum: P0 = 25 MPa, V = 0.03 m3, T = 293 K,79throat diameter 0.5 mm, Isp = 65 s, p_min = 2 MPa.8081- Throat area: A* = pi/4 * (0.5e-3)^2 = 1.9635e-7 m2.82- Initial mass flow: m_dot0 = 25e6 * 1.9635e-7 / sqrt(293) * 0.03974683 = 0.011398 kg/s.84- Thrust: F = 0.011398 * 65 * 9.80665 = 7.265 N.85- Tank gas mass: m0 = 25e6 * 0.03 / (296.8 * 293) = 8.6244 kg.86- Time constant: tau = 8.6244 / 0.011398 = 756.7 s.87- Pressure at 30 s: p = 25e6 * exp(-30 / 756.7) = 24.028 MPa.88- Operating time: t = 756.7 * ln(25 / 2) = 1911.1 s.89- Mass at p_min: m_final = 2e6 * 0.03 / (296.8 * 293) = 0.68995 kg.90- Total impulse: I = 65 * 9.80665 * (8.6244 - 0.68995) = 5057.7 Ns.91- At p_min the flow and thrust scale with pressure: m_dot_min =92 0.000912 kg/s and F_min = 0.581 N, both about 8% of the initial93 values.9495## Verification9697- Confirm choked_mass_flow(25e6, 293, 1.9635e-7) returns 0.01139898 kg/s and thrust(0.011398, 65) returns 7.265 N.99- Confirm tank_gas_mass(25e6, 0.03, 293) returns 8.6244 kg,100 blowdown_time_constant(8.6244, 0.011398) returns 756.7 s and101 pressure_at_time(25e6, 30, 756.7) returns 24.028 MPa.102- Confirm operating_time(25e6, 2e6, 756.7) returns 1911.1 s and103 total_impulse(65, 8.6244, 0.68995) returns 5057.7 Ns.104- Confirm the mass flow doubles when the plenum pressure doubles, and105 that the pressure decay shape p(tau) = p0 / e holds.106- Confirm every non-positive pressure, temperature, volume, area,107 mass flow, tank mass and isp, every p_min at or above p0, and every108 negative query time raises ValueError.109- Run the contract test offline: python3110 scripts/test_cold_gas_thruster.py (30 tests, deterministic).111112## Related leaves113114- propulsion/rocket/rocket-engine-cycle: the pressure-fed and pump-fed115 feed cycle context this cold gas thruster class replaces for small116 spacecraft.117- propulsion/rocket/nozzle-design: throat and expansion geometry and118 the exit flow terms for chemical thrusters.119- propulsion/rocket/thrust-vector-control: larger engines steered120 mechanically, the alternative to small RCS thrusters for attitude121 control.122- space-systems/subsystems/propellant-tank-sizing: the plenum tank123 that stores the gas, sized as a pressure vessel.124- propulsion/electric/hall-thruster and the electric pack: the high125 impulse electric alternative for long life station keeping.126127## Pitfalls128129- Using a high Isp for the cold gas budget: the specific impulse of a130 cold gas thruster is low, typically 40 to 75 s for nitrogen because131 the stored gas is never heated - quoting a chemical-thruster Isp132 inflates the total impulse and undersizes the plenum.133- Treating the blowdown as adiabatic: the model assumes isothermal134 blowdown (thin-walled tank, slow discharge, gas near the wall135 temperature), which gives the exponential p(t) = p0 * exp(-t / tau);136 a fast, adiabatic discharge follows a different pressure history.137- Reporting the initial thrust as the available thrust: at the minimum138 usable pressure the flow and thrust scale with pressure, so F_min =139 0.581 N is about 8% of the 7.265 N initial value - the RCS sizing140 must hold across the blowdown, not at p0.141- Setting p_min at or above the plenum pressure: operating_time needs142 p_min below p0 for the logarithm to exist; p_min at or above p0143 raises ValueError, as do negative query times.144- Computing the total impulse from the initial mass alone: the impulse145 is Isp * g0 * (m0 - m_final) over the expelled gas, so the gas left146 in the tank at p_min (0.690 kg of 8.624 kg in the example) must be147 subtracted, not included.148- Using the model beyond its boundary: this leaf is the gas thruster149 flow and blowdown model, not a tank structural sizer and not an150 attitude control law - the plenum tank belongs to151 space-systems/subsystems/propellant-tank-sizing.152153## Behavior contract (gate 3)154155Run the deterministic contract test (stdlib unittest, offline):156157 python3 scripts/test_cold_gas_thruster.py158159The test covers the worked-example contract (mass flow 0.011398 kg/s,160thrust 7.265 N, tank mass 8.6244 kg, time constant 756.7 s, pressure16124.028 MPa at 30 s, operating time 1911.1 s, total impulse 5057.7 Ns),162the linear scaling of mass flow with pressure, the isothermal163exponential decay shape, the size_thruster chain with all nine output164keys, and ValueError rejection of non-positive pressure, temperature,165volume, throat area, mass flow, tank mass and isp, p_min at or above166p0, and negative query times.167168## Compliance169170- Standards referenced, not reproduced: ECSS E-ST-35 is a free ESA171 download (ecss.nl/standards); the cold gas thruster relations above172 are standard engineering methodology, summary-only per173 standards-map.yaml.174- compliance: STANDARDS-REF, gated: false.