A closed volume of gas, with the thermodynamics done exactly.
A COPV, a tank ullage and a manifold plenum are the same object at different
sizes: a fixed volume holding a mass of gas at some energy. Everything
interesting about a pressure-fed system starts here, because what the regulator
sees is this vessel's pressure and what the vessel's pressure does over a burn
is mostly a question of how much it cools.
State is ``(mass, internal energy)``, not ``(mass, temperature)``
--------------------------------------------------------------
The energy balance of a vessel losing gas is exactly
.. code-block:: text
dm/dt = mdot_in - mdot_out
dU/dt = mdot_in . h_in - mdot_out . h(vessel) + Qdot
in *internal energy*. Writing it in temperature instead needs
``du = cv dT + (du/drho)_T drho``, and dropping that second term -- which is
what a ``T``-based state quietly does -- is wrong for a real gas by exactly the
amount that makes a COPV interesting. Since ``(rho, u)`` is a state pair the
property layer can address directly, tracking ``U`` costs nothing and keeps the
balance exact.
Why blowdown cooling matters
----------------------------
Gas leaving a bottle does work on the gas behind it, so the bottle cools, so its
pressure falls faster than mass alone would suggest. Model it as isothermal and
you over-predict how long the bottle holds regulator inlet pressure. Model it as
adiabatic and you under-predict, because the vessel wall is a heat reservoir
several times the gas's own heat capacity and it fights the cooling the whole
way down. Neither bound is the answer; the wall is, which is why
:class:`GasVolume` carries one.