|
STAR
Cal STAR — firmware, DAQ server, and engine design
|
Classes | |
| class | CombustionState |
| class | CStarModel |
| class | ConstantCStar |
| class | CEATable |
| class | ChamberResult |
| class | Chamber |
Functions | |
| float | burning (float mdot_oxidiser, float mdot_fuel, tuple[float, float]|None mixture_ratios) |
| "ChamberResult" | unlit (float ambient_pressure, float mdot_oxidiser, float mdot_fuel) |
| Path|None | cea_cache_for (str design_name, tuple[str,...] search_paths=("output/cache",)) |
| float | mixture_ratio_of (float mdot_oxidiser, float mdot_fuel) |
Variables | |
| float | GRAVITY = 9.80665 |
| float | MIN_CHAMBER_FLOW = 1.0e-3 |
The chamber: total flow in, pressure and gas state out.
One relation carries most of it. At steady state the throat passes exactly what
the injector delivers, which fixes chamber pressure:
.. code-block:: text
p_c = mdot_total . c* / A_throat
and that is a *feedback* loop, not a formula evaluated once. More flow raises
chamber pressure, which lowers the injector's pressure difference, which lowers
the flow. Every pressure-fed engine sits at the fixed point of that loop, and
the loop is why chamber pressure moves so much less than tank pressure does
over a burn -- and why an injector stiffness ratio below about 20% makes the
whole thing twitchy.
Where ``c*`` comes from
-----------------------
``c*`` is not a constant. It depends on mixture ratio, and mixture ratio moves
during a burn because the two propellant legs have different resistances and
respond differently to the same upstream change. Modelling ``c*`` as fixed is
what makes O/F drift invisible -- which is a shame, because O/F drift is the
output most worth having.
So the chamber takes a :class:`CStarModel`, and the one that matters is
:class:`CEATable`, which reads EngineDesign's own ``.npz`` CEA cache. That gives
``c*``, thrust coefficient, **chamber temperature** and ``gamma`` on the real
``(p_c, O/F, epsilon)`` grid for the actual propellant pair -- so a firing
trajectory reports chamber temperature that came from CEA rather than from a
guess, and the two tools agree because they are reading the same table.
| float feedtwin.engine.chamber.burning | ( | float | mdot_oxidiser, |
| float | mdot_fuel, | ||
| tuple[float, float] | None | mixture_ratios ) |
The flow that burns [kg/s]: all of it inside the table's O/F range; beyond it, the scarce propellant and as much of the other as burns with it at the table's edge. The rest passes through the throat unburned, as :func:`unlit` already says a lone propellant does. Clamping the O/F instead kept the edge's hot c* for the whole flow: an Engine Abort that vented the fuel tank ran LOX-rich at O/F 20-70 with the c* of O/F ~4, held the chamber at the fuel tank's own pressure, and pushed the fuel line backwards on every other step. This is continuous at the table's edge and goes to the unlit chamber as one side goes to zero. ``mixture_ratios`` None: no range, all of it burns.
Definition at line 243 of file chamber.py.
Referenced by feedtwin.engine.chamber.Chamber.evaluate().
| Path | None feedtwin.engine.chamber.cea_cache_for | ( | str | design_name, |
| tuple[str, ...] | search_paths = ("output/cache",) ) |
Find a CEA cache matching a propellant pair, if one is lying around. A convenience, not a contract: it returns ``None`` rather than guessing, so a missing cache surfaces as "no table, using a constant" rather than as a silently wrong propellant pair.
Definition at line 439 of file chamber.py.
| float feedtwin.engine.chamber.mixture_ratio_of | ( | float | mdot_oxidiser, |
| float | mdot_fuel ) |
O/F by mass, with the zero-fuel case answered rather than raised.
Definition at line 458 of file chamber.py.
| "ChamberResult" feedtwin.engine.chamber.unlit | ( | float | ambient_pressure, |
| float | mdot_oxidiser, | ||
| float | mdot_fuel ) |
The chamber with nothing burning in it: at ambient, no thrust. A single propellant (a fuel lead, the step a tank runs dry) flows out through the throat as liquid; its momentum thrust is a few newtons and its pressure rise a psi or two, so it is reported as the unlit chamber it is. Before this, a one-sided flow was evaluated at mixture ratio zero, which the c* table clamps to its leanest point: fuel alone "burned" at 3.5 kN.
Definition at line 271 of file chamber.py.
Referenced by feedtwin.engine.chamber.Chamber.evaluate().
| float feedtwin.engine.chamber.GRAVITY = 9.80665 |
Definition at line 232 of file chamber.py.
| float feedtwin.engine.chamber.MIN_CHAMBER_FLOW = 1.0e-3 |
Definition at line 234 of file chamber.py.