STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
test_vessels Namespace Reference

Functions

 _reached (list[tuple[float, VesselState]] history, float m0, float fraction)
None test_adiabatic_blowdown_matches_the_closed_form ()
None test_a_real_gas_departs_from_the_ideal_result_at_copv_pressure ()
None test_an_ideal_gas_would_overstate_what_a_bottle_holds ()
None test_the_wall_sets_the_polytropic_exponent_rather_than_assuming_it ()
None test_heat_from_the_wall_is_reported_not_buried ()
None test_an_isolated_vessel_holds_its_state ()
None test_initial_state_round_trips_through_pressure_and_temperature ()
object _orifice (float bore_mm=1.0)
None test_the_critical_pressure_ratio_is_the_textbook_value ()
None test_choked_flow_is_a_ceiling_not_an_asymptote ()
None test_choked_flow_scales_with_area_and_upstream_pressure ()
None test_helium_chokes_at_a_third_the_mass_flow_of_nitrogen ()
None test_gas_pressure_drop_rises_with_flow_and_inverts_correctly ()
None test_gas_conditions_carry_what_a_gas_needs ()
None test_a_liquid_in_a_gas_volume_is_refused ()
None test_gases_round_trip_through_tables_without_loss ()
None test_stirring_scales_only_the_wall_exchange ()

Variables

 M = Provenance.MANUFACTURER

Detailed Description

Vessels and the gas side: does a COPV's pressure mean anything?

Phase 05's exit criteria. The one that matters is the first: an adiabatic
blowdown has a closed-form answer, and a model that cannot reproduce it has no
business predicting how long a bottle holds regulator inlet pressure.

Checked at *low* pressure, deliberately. Nitrogen is nearly ideal there, so the
ideal-gas closed form is the right reference; at COPV pressure the model should
depart from it, and by how much is the whole reason for using a real equation of
state. Both directions are asserted.

Function Documentation

◆ _orifice()

◆ _reached()

test_vessels._reached ( list[tuple[float, VesselState]] history,
float m0,
float fraction )
protected
The sample nearest a mass fraction, asserting it was actually reached.

Without the assertion a blowdown that ran out of time returns its last
sample and the test quietly checks the wrong point -- which is exactly what
happened while writing these.

Definition at line 33 of file test_vessels.py.

References min.

Referenced by test_a_real_gas_departs_from_the_ideal_result_at_copv_pressure(), test_adiabatic_blowdown_matches_the_closed_form(), and test_the_wall_sets_the_polytropic_exponent_rather_than_assuming_it().

◆ test_a_liquid_in_a_gas_volume_is_refused()

None test_vessels.test_a_liquid_in_a_gas_volume_is_refused ( )
(rho, u) is a fine state pair for a gas and a poor one for a liquid.

Liquid density is roughly 180x less sensitive to pressure, so recovering
pressure from density amplifies any error in it by the same factor: through
interpolated tables a liquid comes back 0.1-0.7% out where a gas is within
1e-4%. That is small enough to go unnoticed and large enough to matter, so
it is refused rather than tolerated.

Definition at line 285 of file test_vessels.py.

◆ test_a_real_gas_departs_from_the_ideal_result_at_copv_pressure()

None test_vessels.test_a_real_gas_departs_from_the_ideal_result_at_copv_pressure ( )
And it must, or the real equation of state is doing nothing.

A test that only checked the ideal limit would pass on an ideal-gas model,
which is the model this phase exists to replace.

Definition at line 76 of file test_vessels.py.

References _reached().

◆ test_adiabatic_blowdown_matches_the_closed_form()

None test_vessels.test_adiabatic_blowdown_matches_the_closed_form ( )
``T/T0 = (m/m0)^(g-1)`` and ``p/p0 = (m/m0)^g``, exactly, for an ideal gas.

Phase 05's headline criterion. A vessel with no wall is adiabatic, and at
two bar nitrogen is ideal to within 0.04%, so the model has nowhere to hide.

Definition at line 51 of file test_vessels.py.

References _reached().

◆ test_an_ideal_gas_would_overstate_what_a_bottle_holds()

None test_vessels.test_an_ideal_gas_would_overstate_what_a_bottle_holds ( )
The number that justifies the whole property layer.

A 9 L bottle at 4500 psi holds about 2.79 kg of nitrogen. Ideal gas says
3.21 kg -- 15% more pressurant than is actually in there, which propagates
straight into how long the tanks stay up.

Definition at line 97 of file test_vessels.py.

◆ test_an_isolated_vessel_holds_its_state()

None test_vessels.test_an_isolated_vessel_holds_its_state ( )
No flow, no heat: nothing should drift.

Definition at line 163 of file test_vessels.py.

◆ test_choked_flow_is_a_ceiling_not_an_asymptote()

None test_vessels.test_choked_flow_is_a_ceiling_not_an_asymptote ( )
Past it, no downstream pressure exists that passes the flow.

Reported as infeasible rather than iterated on, so a solver can back off
rather than wander.

Definition at line 208 of file test_vessels.py.

References _orifice().

◆ test_choked_flow_scales_with_area_and_upstream_pressure()

None test_vessels.test_choked_flow_scales_with_area_and_upstream_pressure ( )
The two things a relief orifice is sized on.

Definition at line 223 of file test_vessels.py.

◆ test_gas_conditions_carry_what_a_gas_needs()

None test_vessels.test_gas_conditions_carry_what_a_gas_needs ( )
Liquid components ignore these; gas components cannot work without them.

Definition at line 277 of file test_vessels.py.

◆ test_gas_pressure_drop_rises_with_flow_and_inverts_correctly()

None test_vessels.test_gas_pressure_drop_rises_with_flow_and_inverts_correctly ( )
The relation is solved by bracketing, so check it actually inverts.

Definition at line 250 of file test_vessels.py.

References _orifice().

◆ test_gases_round_trip_through_tables_without_loss()

None test_vessels.test_gases_round_trip_through_tables_without_loss ( )
The other half of that claim, so the guard is not merely superstition.

Definition at line 299 of file test_vessels.py.

◆ test_heat_from_the_wall_is_reported_not_buried()

None test_vessels.test_heat_from_the_wall_is_reported_not_buried ( )
It decides how fast a bottle droops, so it belongs in the result.

Definition at line 146 of file test_vessels.py.

◆ test_helium_chokes_at_a_third_the_mass_flow_of_nitrogen()

None test_vessels.test_helium_chokes_at_a_third_the_mass_flow_of_nitrogen ( )
Same hole, same pressure, very different pressurant budget.

Helium's low molecular weight means far less mass through the same orifice,
which is the trade against its not condensing into a cold ullage.

Definition at line 236 of file test_vessels.py.

References _orifice().

◆ test_initial_state_round_trips_through_pressure_and_temperature()

None test_vessels.test_initial_state_round_trips_through_pressure_and_temperature ( )
Nobody fills a bottle to an internal energy.

Definition at line 176 of file test_vessels.py.

◆ test_stirring_scales_only_the_wall_exchange()

None test_vessels.test_stirring_scales_only_the_wall_exchange ( )
A charge jet stirs the vessel; `stirring` multiplies the still-gas
conductance and nothing else. At 1 it is exactly the old behaviour.

Definition at line 311 of file test_vessels.py.

◆ test_the_critical_pressure_ratio_is_the_textbook_value()

None test_vessels.test_the_critical_pressure_ratio_is_the_textbook_value ( )
0.528 for a diatomic gas. A constant worth pinning, not deriving twice.

Definition at line 202 of file test_vessels.py.

◆ test_the_wall_sets_the_polytropic_exponent_rather_than_assuming_it()

None test_vessels.test_the_wall_sets_the_polytropic_exponent_rather_than_assuming_it ( )
EngineDesign's blowdown solver takes ``n`` as an input. Here it is output.

The vessel wall is a heat reservoir several times the gas's own capacity,
and how tightly it is coupled decides how much the bottle cools. Assuming an
exponent assumes the answer; giving the wall its real mass and conductance
produces one.

Definition at line 116 of file test_vessels.py.

References _reached().

Variable Documentation

◆ M

test_vessels.M = Provenance.MANUFACTURER

Definition at line 30 of file test_vessels.py.