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

Classes

class  WallExchange
class  LineWall

Functions

float fitting_metal (float count, float bore)
tuple[tuple[float, float],...] wall_runs (HydraulicComponent component)
float wall_bore (tuple[tuple[float, float],...] runs)
float stainless_capacity (float temperature)

Variables

tuple _STAINLESS_CP
float STAINLESS_DENSITY = 8000.0
float UNION_MASS = 0.113
float UNION_BORE = 0.01092

Detailed Description

The metal a line is made of, and the heat it gives the gas flowing through it.

Every component in this library is otherwise adiabatic, and for a liquid leg over
a five-second burn that is fine. For the pressurant path it is not, and the
evidence is visible on the stand: **icicles form on the fittings downstream of
the regulator.**

Those icicles are worth reading carefully, because they point at the mechanism
that matters and not the one they look like. Frost on the outside proves the
*metal got cold*. The metal got cold because the gas took its heat. Heat coming
back the other way -- room air into a frosted fitting -- is the small term:
measured against the drawn press path it is 6 W in still air and 32 W with a
generous frosting coefficient, which is **0.04 to 0.18 K** of gas warming. The
frost cannot carry much either; ambient at 50% RH holds about 4.3 g of water per
cubic metre, so even 10 W of latent heat would need cubic metres per second of
air stripped dry by natural convection.

The line's own thermal mass is the real term. Nitrogen leaves the regulator at
251 K into metal sitting at 293 K, and on the drawn 255 mm press path that is
about 420 g of tube and fittings holding 200 J/K. Worked through as a heat
exchanger it is **6.1 K at ignition and 4.4 K averaged over the burn -- 14% of
the 30.3 K Joule-Thomson drop.** On a plausible real stand, a metre of line with
ten fittings, it is 11.3 K, or 37%.

What this deliberately does *not* model
---------------------------------------
**Soak.** No heat transfer with no flow, and no tracking of how a line drifts
towards ambient while a stand sits. That was a considered scope decision rather
than an omission: modelling it well means an ambient boundary, insulation state
and an hours-long clock on every line, and modelling it badly means inventing a
starting temperature and dressing it as physics.

Instead the wall **starts at the temperature of the fluid its line holds at
rest**, which is what a soak model would converge to anyway and needs no clock.
That single choice is what makes a cryogenic stand come out right: a line full of
liquid oxygen has been sitting at about 90 K and its fittings are cold, a line
off the *top* of that tank holds ullage gas and is at whatever the ullage is --
cool if the tank has been sitting, near ambient if it was just pressed -- and a
pressurant line that has only ever seen bottle gas is at ambient. Three very
different wall temperatures, none of them assumed: each is just the line's own
fluid, read off the network once its temperatures have settled.

Read off the network, specifically, and not off the drawing. At build time a
tank node still carries whatever the drawing declared, which for a LOX tank is
liquid temperature -- so seeding there would put the metal of a vent line 200 K
below the vapour actually standing in it. `Session._propagate_temperatures`
seeds each wall on the first tick it has real node temperatures to seed from,
which costs one tick of no wall heat and gets all three tiers right.

The consequence is that this is a **first-run effect**, correctly. Fire twice
back to back and the second run sees a wall already near the gas temperature, so
it warms the gas by under 2 K instead of 6. The stand behaves that way too.

Function Documentation

◆ fitting_metal()

float feedtwin.comps.wall.fitting_metal ( float count,
float bore )
Metal in ``count`` tube fittings on a line of this ``bore`` [kg].

A *tube* fitting, which is the thing most of a stand is made of and the
wrong answer in two places. A fitting on the high-pressure side of the
regulator carries much more metal for the same bore, because it is holding
4500 psi rather than 500; and a valve body is several unions' worth. Both
are why `fitting_mass` exists as an override -- count on the low-pressure
side, weigh on the high.

Definition at line 96 of file wall.py.

◆ stainless_capacity()

float feedtwin.comps.wall.stainless_capacity ( float temperature)
``c_p`` of the wall [J/(kg.K)] at a temperature.

Definition at line 145 of file wall.py.

Referenced by feedtwin.comps.wall.LineWall.capacity().

◆ wall_bore()

float feedtwin.comps.wall.wall_bore ( tuple[tuple[float, float], ...] runs)
The one bore a :class:`LineWall` takes for its film coefficient [m].

One run: its own bore, exactly. Several: the length-weighted mean, which is
an approximation and says so -- the film goes as ``D^-1.8`` in turbulence
and not at all in laminar flow, so no single bore is exact for both. No
shipped stand has a multi-bore itemised gas line.

Definition at line 129 of file wall.py.

References min.

◆ wall_runs()

tuple[tuple[float, float], ...] feedtwin.comps.wall.wall_runs ( HydraulicComponent component)
``(bore, length)`` of each piece of a line a wall wraps [m].

A plain line carries its geometry in ``p``. A line the drawing itemised does
not: the segment list supersedes the line-level bore and length (see
``feedtwin.pid.network._SUPERSEDED_BY_SEGMENTS``), so the geometry is the
segments'. Reading only ``p`` left every itemised line without a wall -- on a
stand drawn with pid-designer's centerline sketch, every line. Empty when
nothing on the line states a bore: a wall cannot be sized on no bore.

Definition at line 111 of file wall.py.

Variable Documentation

◆ _STAINLESS_CP

tuple feedtwin.comps.wall._STAINLESS_CP
protected
Initial value:
1= (
2 (20.0, 16.0),
3 (50.0, 80.0),
4 (77.0, 190.0),
5 (100.0, 230.0),
6 (150.0, 320.0),
7 (200.0, 400.0),
8 (250.0, 460.0),
9 (300.0, 500.0),
10 (400.0, 530.0),
11)

Definition at line 72 of file wall.py.

◆ STAINLESS_DENSITY

float feedtwin.comps.wall.STAINLESS_DENSITY = 8000.0

Definition at line 85 of file wall.py.

◆ UNION_BORE

float feedtwin.comps.wall.UNION_BORE = 0.01092

Definition at line 93 of file wall.py.

◆ UNION_MASS

float feedtwin.comps.wall.UNION_MASS = 0.113

Definition at line 92 of file wall.py.