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

Classes

class  LiquidThermal
class  CollapseModel
class  NoCollapse
class  ConductionCollapse

Functions

None register_collapse_model (str name, CollapseFactory factory)
CollapseModel build_collapse_model (str name, **object kwargs)
list[str] registered_collapse_models ()

Variables

int MIN_CONTACT_TIME = 1e-3
 CollapseFactory = Callable[..., CollapseModel]
dict _MODELS

Detailed Description

Ullage collapse: what warm pressurant loses to cold liquid.

Pressurant enters a LOX tank at roughly ambient temperature and meets a surface
at 90 K. It cools. The pressure it was supplying falls with it, so more
pressurant is demanded, so the bottle drains faster -- and because the regulator
is holding tank pressure, **the effect never shows up as a pressure sag at all.
It shows up as pressurant consumption.** That is the trap: a tank pressure trace
can look perfect while the COPV empties 20% faster than predicted.

Why the model is transient, not a heat transfer coefficient
-----------------------------------------------------------
Heat does not enter the liquid uniformly; it diffuses into a thermal layer that
grows from the surface. The layer's depth goes as ``sqrt(pi alpha t)``, which for
LOX is about **1.1 mm after 5 s** and 3.8 mm after a minute. A steady coefficient
``h`` cannot represent that: whatever value reproduces a five-second burn is far
too small for a two-minute hold, and whatever reproduces the hold is far too
small at ignition. So the model is the transient conduction solution for a
semi-infinite solid, whose instantaneous flux

.. code-block:: text

    q(t) = A . dT . sqrt(k rho c / (pi t))

integrates to ``Q(t) = 2 A dT sqrt(k rho c t / pi)`` -- the familiar
square-root-of-time behaviour, and the reason a repressurisation immediately
before firing is worth doing: it resets ``t``.

That reset is why elapsed contact time is part of the tank's *state* rather than
a wall-clock reading. A scenario that repressurises at T-10 s starts the clock
again; one that has been sitting on the pad for an hour does not, and the two
consume materially different amounts of pressurant over the same burn.

Bounds, honestly
----------------
Pure conduction into quiescent liquid is a **lower** bound. Real ullages have
free convection, sloshing, and a spray of incoming gas that scrubs the interface,
and nitrogen over LOX can condense outright, which moves an order of magnitude
more energy per unit area than sensible cooling does. The
:data:`registered_collapse_models` registry exists so those can be added as
named models with their own assumptions rather than as a fudge factor on this
one. What this module will not do is pretend a single tuned coefficient covers
all of them.

Function Documentation

◆ build_collapse_model()

CollapseModel feedtwin.vessels.collapse.build_collapse_model ( str name,
**object kwargs )

Definition at line 216 of file collapse.py.

◆ register_collapse_model()

None feedtwin.vessels.collapse.register_collapse_model ( str name,
CollapseFactory factory )

Definition at line 212 of file collapse.py.

◆ registered_collapse_models()

list[str] feedtwin.vessels.collapse.registered_collapse_models ( )

Definition at line 225 of file collapse.py.

Variable Documentation

◆ _MODELS

dict feedtwin.vessels.collapse._MODELS
protected
Initial value:
1= {
2 "none": lambda **kw: NoCollapse(),
3 "conduction": lambda **kw: ConductionCollapse(**kw),
4}

Definition at line 206 of file collapse.py.

◆ CollapseFactory

feedtwin.vessels.collapse.CollapseFactory = Callable[..., CollapseModel]

Definition at line 204 of file collapse.py.

◆ MIN_CONTACT_TIME

int feedtwin.vessels.collapse.MIN_CONTACT_TIME = 1e-3

Definition at line 55 of file collapse.py.