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

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

Detailed Description

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.

Function Documentation

◆ burning()

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().

◆ cea_cache_for()

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.

◆ mixture_ratio_of()

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.

◆ unlit()

"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().

Variable Documentation

◆ GRAVITY

float feedtwin.engine.chamber.GRAVITY = 9.80665

Definition at line 232 of file chamber.py.

◆ MIN_CHAMBER_FLOW

float feedtwin.engine.chamber.MIN_CHAMBER_FLOW = 1.0e-3

Definition at line 234 of file chamber.py.