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

Classes

class  CstarWideTable
class  CstarOfMR

Functions

 _march_core_py (D2_0, w_cls, rho_l, mu, rho_f, k_f, lnB, t_h, inv_FB, cd_blow, U_c, rho_c, pr3, cp_g, dx, n_steps, u_drop0, F0, v_floor, rr_w, starts, nq)
Any _record (List[Dict[str, Any]] assumptions, str name, Any value, str unit, str reason)
Dict[str, float] compute_combustion_state (float Pc, float Tc, float R, float Ac, float At, float Lstar, float m_dot_total)
Tuple[float, float] saturation_state (float P, float T_boil, float L_boil, float molecular_weight, Optional[float] T_crit=None)
float _gas_viscosity (float T, float M_gas)
Optional[CstarWideTable] get_cstar_wide_table (str ox_name, str fuel_name)
 _coolprop_state (Optional[str] name)
Optional[Dict[str, float]] liquid_heatup_properties (Optional[str] name, float P, float T0, float T_s, float Tc)
float abramzon_sirignano_F (float B)
float yuen_chen_drag_factor (float B)
Dict[str, Any] spray_vaporization_march (List[Dict[str, float]] streams, *, float Pc, float Tc, float gamma, float R, float m_dot_total, float Ac, float L_chamber, float u_drop0, float rr_q, str blowing="abramzon_sirignano", int profile_points=0)
Tuple[float, Dict[str, Any]] calculate_vaporization_efficiency (*, float Pc, float Tc, float gamma, float R, float MR, float m_dot_total, float Ac, float At, float Lstar, Dict[str, Any] spray_diagnostics, Optional[Dict[str, Any]] fuel_props, Optional[Dict[str, Any]] ox_props, float u_fuel, float u_lox, float rr_q, List[Dict[str, Any]] assumptions, str blowing="abramzon_sirignano", Optional[CstarOfMR] cstar_fn=None)
Tuple[float, Dict[str, float]] calculate_gasification_efficiency (float Tc, float Pc, float tau_res, float SMD, float rho_l, float cp_l, float L_eff, float T_inj, float cp_g, float rho_g, float mu_g, float U_slip, Optional[float] D_m=None, float Pr=0.8, Optional[dict] fuel_props=None, bool debug=False)
float rupe_mixing_parameter (float rho_O, float v_O, float d_O, float rho_F, float v_F, float d_F)
Optional[float] rupe_M_from_diagnostics (Optional[Dict[str, Any]] diag)
float rupe_R_opt_from_angles (Optional[float] theta_O_deg, Optional[float] theta_F_deg, Optional[float] d_O=None, Optional[float] d_F=None)
float rupe_Em_at_M (float M, float Em_opt, float M_opt=1.0, float curvature=6.07)
float rupe_Em_of_distribution (np.ndarray r, np.ndarray w, float R)
Dict[str, Any] stream_tube_mixing_efficiency (float MR, CstarOfMR cstar_fn, List[Tuple[float, float, float]] elements, str distribution="gaussian")
Tuple[float, float] _mass_quantiles_OF (np.ndarray r, np.ndarray w, Tuple[float, float] qs)
Optional[List[Tuple[float, float]]] _element_split (Dict[str, Any] diag, float MR)
Optional[CstarOfMR] _cstar_source (float Pc, Any cea_cache, List[Dict[str, Any]] assumptions)
Dict[str, Any] calculate_combustion_efficiency_advanced (float Lstar, float Pc, float Tc, float cstar_ideal, float gamma, float R, float MR, CombustionEfficiencyConfig config, float Ac, float At, float m_dot_total, Optional[float] u_fuel=None, Optional[float] u_lox=None, Optional[Dict] spray_diagnostics=None, Optional[Dict] fuel_props=None, Optional[Dict] ox_props=None, bool debug=False, Any cea_cache=None, Optional[CstarOfMR] cstar_fn=None)
Optional[Dict[str, Any]] vaporization_profile (Dict[str, Any] ce, int points=40)

Variables

float P_BOIL_REF = 101325.0
float WATSON_EXPONENT = 0.38
int _MARCH_STEPS = 100
 _GL_X
 _GL_W
 _RR_NODES = -np.log1p(-0.5 * (_GL_X + 1.0))
float _RR_WEIGHTS = 0.5 * _GL_W
float _V_FLOOR = 1.0e-3
 _njit = None
 _USE_COMPILED_MARCH = _njit is not None
 _march_core = _njit(cache=True, error_model="numpy")(_march_core_py) if _njit is not None else None
int CSTAR_WIDE_SCHEMA_VERSION = 1
 _CSTAR_WIDE_MR = np.geomspace(0.1, 20.0, 161)
 _CSTAR_WIDE_PC = np.geomspace(1.0e5, 1.2e7, 16)
float _PSI_PA = 6894.757293168361
float _FT_M = 0.3048
dict _CSTAR_WIDE_MEMO = {}
dict _COOLPROP_ALIASES
dict _AS_MEMO = {}
 _HEATUP_GL_X
 _HEATUP_GL_W
tuple BLOWING_MODELS = ("abramzon_sirignano", "none")
tuple RUPE_FIG1_N_RANGE = (0.26, 0.78)
 _HALF_X = 3.0 * (_HALF_X + 1.0)
 _HALF_W = 3.0 * _HALF_W * np.exp(-0.5 * _HALF_X ** 2)
 _GAUSS_X = np.concatenate([-_HALF_X[::-1], _HALF_X])
 _GAUSS_W = np.concatenate([_HALF_W[::-1], _HALF_W])
dict _UNIT_MAD
 MIXING_DISTRIBUTIONS = tuple(_UNIT_MAD)

Detailed Description

c* efficiency physics: vaporization and mixing.

    eta_c* = eta_vap * eta_mix * eta_HL

eta_HL, the heat lost to the wall upstream of the throat, is applied in combustion_eff.eta_cstar.

- eta_vap: c* retained by incomplete vaporization, F c*(O/F_vap)/c*(O/F), F the mass fraction
  vaporized by the throat from a one-dimensional spray march started where the doublet's sheet
  breaks into drops, in the manner of Priem & Heidmann (NASA TR R-67, 1960).
- eta_mix: the stream-tube c* integral (Pieper, Dean & Valentine, JSR 4(6), 1967) of an O/F
  distribution that reproduces Rupe's mixing factor E_m (JPL TR 32-1546 eq. 1), E_m from Rupe's
  correlation against M = rho_O v_O^2 d_O / (rho_F v_F^2 d_F) (TR 32-1546 Fig. 1), plus any
  element-to-element striation the injector reports. c*(O/F) is CEA.
- Chemical kinetics carry no c* loss. At ~3200 K and ~3 MPa the LOX/ethanol products relax in about
  a microsecond (CO + OH, H + OH + M) against a millisecond stay time. Kinetic losses belong to the
  nozzle, where CEA's frozen and shifting Cf bracket them (JANNAF, CPIA 246).

Function Documentation

◆ _coolprop_state()

engine.pipeline.combustion_physics._coolprop_state ( Optional[str] name)
protected

Definition at line 379 of file combustion_physics.py.

Referenced by liquid_heatup_properties().

◆ _cstar_source()

Optional[CstarOfMR] engine.pipeline.combustion_physics._cstar_source ( float Pc,
Any cea_cache,
List[Dict[str, Any]] assumptions )
protected

Definition at line 1142 of file combustion_physics.py.

References _record(), and get_cstar_wide_table().

Referenced by calculate_combustion_efficiency_advanced().

◆ _element_split()

Optional[List[Tuple[float, float]]] engine.pipeline.combustion_physics._element_split ( Dict[str, Any] diag,
float MR )
protected
Per-element (mass flow, O/F) from the injector's manifold model, or None.

``element_mixture_ratios``: O/F per element. ``element_mass_flows``: per element either the
total mdot, or (mdot_O, mdot_F) pairs (which then also give the O/F).

Definition at line 1118 of file combustion_physics.py.

Referenced by calculate_combustion_efficiency_advanced().

◆ _gas_viscosity()

float engine.pipeline.combustion_physics._gas_viscosity ( float T,
float M_gas )
protected

Definition at line 213 of file combustion_physics.py.

Referenced by spray_vaporization_march().

◆ _march_core_py()

engine.pipeline.combustion_physics._march_core_py ( D2_0,
w_cls,
rho_l,
mu,
rho_f,
k_f,
lnB,
t_h,
inv_FB,
cd_blow,
U_c,
rho_c,
pr3,
cp_g,
dx,
n_steps,
u_drop0,
F0,
v_floor,
rr_w,
starts,
nq )
protected
The Heun march of ``spray_vaporization_march`` as scalar loops, for compilation.

Same formulas and step order as the NumPy loop there; returns (fraction vaporized per stream,
x at 95 % per stream (NaN if not reached), F at the end). ``inv_FB`` divides the convective
part of Nu (Abramzon-Sirignano) and ``cd_blow`` multiplies the drag of an evaporating drop
(Yuen-Chen); both are 1 with the blowing model off.

Definition at line 53 of file combustion_physics.py.

References max, and min.

◆ _mass_quantiles_OF()

Tuple[float, float] engine.pipeline.combustion_physics._mass_quantiles_OF ( np.ndarray r,
np.ndarray w,
Tuple[float, float] qs )
protected
O/F at the given cumulative mass fractions of the stream tubes.

Definition at line 1107 of file combustion_physics.py.

References min.

Referenced by stream_tube_mixing_efficiency().

◆ _record()

Any engine.pipeline.combustion_physics._record ( List[Dict[str, Any]] assumptions,
str name,
Any value,
str unit,
str reason )
protected
Note an assumed input in the result and in the process-wide assumptions registry.

Definition at line 143 of file combustion_physics.py.

Referenced by _cstar_source(), calculate_combustion_efficiency_advanced(), and calculate_vaporization_efficiency().

◆ abramzon_sirignano_F()

float engine.pipeline.combustion_physics.abramzon_sirignano_F ( float B)
Film-thickening factor F(B) = (1 + B)^0.7 ln(1 + B) / B (Abramzon & Sirignano, Int. J. Heat
Mass Transfer 32(9), 1989, eq. 19). Nu* = 2 + (Nu0 - 2)/F(B_T): the Stefan flow thickens the
film and cuts the convective part of the heat transfer. F(0) = 1.

Definition at line 448 of file combustion_physics.py.

Referenced by spray_vaporization_march().

◆ calculate_combustion_efficiency_advanced()

Dict[str, Any] engine.pipeline.combustion_physics.calculate_combustion_efficiency_advanced ( float Lstar,
float Pc,
float Tc,
float cstar_ideal,
float gamma,
float R,
float MR,
CombustionEfficiencyConfig config,
float Ac,
float At,
float m_dot_total,
Optional[float] u_fuel = None,
Optional[float] u_lox = None,
Optional[Dict] spray_diagnostics = None,
Optional[Dict] fuel_props = None,
Optional[Dict] ox_props = None,
bool debug = False,
Any cea_cache = None,
Optional[CstarOfMR] cstar_fn = None )
eta_vap * eta_mix. Heat loss is applied by combustion_eff.eta_cstar.

eta_mix is the stream-tube c* integral (``stream_tube_mixing_efficiency``) of an O/F
distribution built from Rupe's mixing factor E_m: E_m at the element's M from
``rupe_Em_at_M`` (impinging doublets) or ``rupe_Em_opt`` itself (other elements, recorded),
and element-to-element striation from the injector's ``element_mixture_ratios`` /
``element_mass_flows`` when it publishes them (uniform elements otherwise). c*(O/F) comes from
``cstar_fn``, else the wide CEA c* table / ``cea_cache`` (``CstarOfMR``).

Returns eta_total, eta_vaporization, eta_mixing, the inputs that set them and the assumptions
made for missing inputs.

Definition at line 1156 of file combustion_physics.py.

References _cstar_source(), _element_split(), _record(), calculate_vaporization_efficiency(), compute_combustion_state(), rupe_Em_at_M(), rupe_M_from_diagnostics(), and stream_tube_mixing_efficiency().

◆ calculate_gasification_efficiency()

Tuple[float, Dict[str, float]] engine.pipeline.combustion_physics.calculate_gasification_efficiency ( float Tc,
float Pc,
float tau_res,
float SMD,
float rho_l,
float cp_l,
float L_eff,
float T_inj,
float cp_g,
float rho_g,
float mu_g,
float U_slip,
Optional[float] D_m = None,
float Pr = 0.8,
Optional[dict] fuel_props = None,
bool debug = False )
Single-drop gasification time scale. Used only by reaction_chemistry's progress diagnostics;
c* comes from ``spray_vaporization_march``.

eta = 1 - exp(-tau_res/tau_vap), tau_vap = tau_heat + tau_gasify: heat-up and gasification are
successive stages of one drop's life, so their times add (Law 1982; Lefebvre, Atomization and
Sprays ch. 8). They were combined as parallel rates, which made tau_vap shorter than either.

Definition at line 856 of file combustion_physics.py.

References max, and min.

◆ calculate_vaporization_efficiency()

Tuple[float, Dict[str, Any]] engine.pipeline.combustion_physics.calculate_vaporization_efficiency ( * ,
float Pc,
float Tc,
float gamma,
float R,
float MR,
float m_dot_total,
float Ac,
float At,
float Lstar,
Dict[str, Any] spray_diagnostics,
Optional[Dict[str, Any]] fuel_props,
Optional[Dict[str, Any]] ox_props,
float u_fuel,
float u_lox,
float rr_q,
List[Dict[str, Any]] assumptions,
str blowing = "abramzon_sirignano",
Optional[CstarOfMR] cstar_fn = None )
c* retained by incomplete vaporization (Priem & Heidmann, NASA TR R-67).

Unvaporized liquid crosses the throat carrying mass and no energy, so
c*_eff = Pc At/mdot = (mdot_gas/mdot) c*(O/F_gas):

    eta_vap = F c*(O/F_vap)/c*(O/F),   F = fraction vaporized,  O/F_vap = O/F f_O/f_F,

f_O, f_F each stream's fraction vaporized. The c* ratio has either sign: it is above 1 when
the vaporized gas lies nearer the c* peak than the injected O/F, and below 1 past it (the
6.5 kN ethalox design sits at the LOX/ethanol c* peak, O/F ~1.53 at 374 psia, and its
fuel-limited gas at 1.62 loses 0.1 %). Without ``cstar_fn`` it is taken as 1 and recorded.

Drops form where the doublet's sheet breaks up, x0 = L_imp + L_sheet_breakup from the face
(injector diagnostics), and are marched from there over L - x0; L = L* A_t/A_c is the
volume-equivalent cylinder. Each stream evaporates at its own saturation state at Pc with its
own D32. Liquid heat-up integrates CoolProp's cp(T) at Pc for the named fluid, with the liquid
density at the mean drop temperature; a fluid CoolProp does not know uses the configured cp
and density, recorded.

Definition at line 651 of file combustion_physics.py.

References _record(), liquid_heatup_properties(), max, saturation_state(), and spray_vaporization_march().

Referenced by calculate_combustion_efficiency_advanced().

◆ compute_combustion_state()

Dict[str, float] engine.pipeline.combustion_physics.compute_combustion_state ( float Pc,
float Tc,
float R,
float Ac,
float At,
float Lstar,
float m_dot_total )
Chamber gas state and stay time.

tau_res is the stay time t_s = V_c rho / mdot = L* rho_c / (mdot/A_t) (Sutton & Biblarz ch. 8),
the transit time of the gas at the chamber exit velocity.

Definition at line 150 of file combustion_physics.py.

Referenced by calculate_combustion_efficiency_advanced().

◆ get_cstar_wide_table()

Optional[CstarWideTable] engine.pipeline.combustion_physics.get_cstar_wide_table ( str ox_name,
str fuel_name )
The committed wide c* table for a propellant pair; built from rocketcea when missing and CEA
builds are allowed (cea_cache._cea_build_allowed). None when neither is possible.

Definition at line 295 of file combustion_physics.py.

Referenced by _cstar_source().

◆ liquid_heatup_properties()

Optional[Dict[str, float]] engine.pipeline.combustion_physics.liquid_heatup_properties ( Optional[str] name,
float P,
float T0,
float T_s,
float Tc )
Heat-up integral I = int_{T0}^{Ts} cp_l(T, P) dT / (T_c - T) and the liquid density at the
mean drop temperature (T0 + Ts)/2, from CoolProp for the named fluid. None when CoolProp does
not know the fluid.

The drop's surface temperature Ts comes from Clausius-Clapeyron; when it lies above CoolProp's
own T_sat(P) the liquid is integrated to T_sat - 0.05 K and the last sliver is carried at the
cp there (reported as ``T_liquid_limit``). Above the critical pressure there is no saturation
and the liquid is integrated to Ts.

Definition at line 396 of file combustion_physics.py.

References _coolprop_state(), and min.

Referenced by calculate_vaporization_efficiency().

◆ rupe_Em_at_M()

float engine.pipeline.combustion_physics.rupe_Em_at_M ( float M,
float Em_opt,
float M_opt = 1.0,
float curvature = 6.07 )
Rupe mixing factor E_m of an unlike doublet at mixing parameter M = rho_O v_O^2 d_O /
(rho_F v_F^2 d_F), from Rupe's correlation (JPL TR 32-1546 Fig. 1, see RUPE_FIG1_N_RANGE):

    N_R = M/(1 + M),   E_m = Em_opt (1 - curvature (N_R - N_opt)^2),   floored at 0.

Definition at line 1026 of file combustion_physics.py.

References max.

Referenced by calculate_combustion_efficiency_advanced().

◆ rupe_Em_of_distribution()

float engine.pipeline.combustion_physics.rupe_Em_of_distribution ( np.ndarray r,
np.ndarray w,
float R )
Rupe's mixing factor (JPL TR 32-1546 eq. 1, as a fraction) of stream tubes with oxidizer
mass fractions r and mass weights w about the bulk R:
    E_m = 1 - sum_{r<R} w (R - r)/R - sum_{r>R} w (r - R)/(1 - R).

Definition at line 1044 of file combustion_physics.py.

Referenced by stream_tube_mixing_efficiency().

◆ rupe_M_from_diagnostics()

Optional[float] engine.pipeline.combustion_physics.rupe_M_from_diagnostics ( Optional[Dict[str, Any]] diag)
Rupe M from injector diagnostics: ``rupe_M`` if published, else from the jet state
(rho_*_momentum, v_*_bulk, d_jet_*), else from momentum_ratio_R and the jet diameters
(M = R^2 d_O/d_F). None when the injector is not an impinging doublet.

Definition at line 947 of file combustion_physics.py.

References rupe_mixing_parameter().

Referenced by calculate_combustion_efficiency_advanced().

◆ rupe_mixing_parameter()

float engine.pipeline.combustion_physics.rupe_mixing_parameter ( float rho_O,
float v_O,
float d_O,
float rho_F,
float v_F,
float d_F )
Elverum & Morey mixing parameter M = rho_O v_O^2 d_O / (rho_F v_F^2 d_F).

JPL Memo 30-5 (1959) eq. 1, SP-8089 eq. 1: mixture-ratio uniformity of an unlike element is
best at M = M_opt, 1.0 for a 1-on-1 doublet (SP-8089 Table IV). No angle term.

Definition at line 931 of file combustion_physics.py.

Referenced by rupe_M_from_diagnostics().

◆ rupe_R_opt_from_angles()

float engine.pipeline.combustion_physics.rupe_R_opt_from_angles ( Optional[float] theta_O_deg,
Optional[float] theta_F_deg,
Optional[float] d_O = None,
Optional[float] d_F = None )
Momentum ratio R = sqrt(rho_O u_O^2 / rho_F u_F^2) at which a doublet's resultant is axial.

The transverse momenta cancel when mdot_O u_O sin(theta_O) = mdot_F u_F sin(theta_F), i.e.
rho_O u_O^2 A_O sin(theta_O) = rho_F u_F^2 A_F sin(theta_F), so
    R_tilt = (d_F/d_O) sqrt(sin(theta_F)/sin(theta_O)).
This sets the spray direction, not the mixing optimum (that is Rupe's M = 1); the c* model does
not use it. Without diameters the orifices are taken equal. 1.0 without angles.

Definition at line 973 of file combustion_physics.py.

◆ saturation_state()

Tuple[float, float] engine.pipeline.combustion_physics.saturation_state ( float P,
float T_boil,
float L_boil,
float molecular_weight,
Optional[float] T_crit = None )
Surface temperature [K] and latent heat [J/kg] of a drop evaporating at pressure P.

T_sat from Clausius-Clapeyron through the normal boiling point,
    1/T_sat = 1/T_boil - R_u/(M L_boil) ln(P/101325),
and h_fg(T_sat) from Watson, h_fg = L_boil ((T_c - T_sat)/(T_c - T_boil))^0.38.
At 2.977 MPa this gives ethanol 472.1 K / 503 kJ/kg and oxygen 143.6 K / 109 kJ/kg; CoolProp
gives 473.1 / 506 and 141.5 / 120. At or above the critical pressure the surface reaches T_c
and h_fg = 0. Without T_c the normal-boiling-point latent heat is kept, which overstates h_fg.

Definition at line 179 of file combustion_physics.py.

Referenced by calculate_vaporization_efficiency().

◆ spray_vaporization_march()

Dict[str, Any] engine.pipeline.combustion_physics.spray_vaporization_march ( List[Dict[str, float]] streams,
* ,
float Pc,
float Tc,
float gamma,
float R,
float m_dot_total,
float Ac,
float L_chamber,
float u_drop0,
float rr_q,
str blowing = "abramzon_sirignano",
int profile_points = 0 )
Fraction of each stream vaporized along the chamber (Priem & Heidmann, NASA TR R-67).

``profile_points`` > 0 also records each stream's fraction vaporized at about that many
stations (``out["profile"][name] = [[x, f], ...]``, x from where the drops form). It runs the
Python march, which the compiled one matches (tests/test_compiled_hot_loops.py); 0, the
default, is the solver's path and records nothing.

Each stream is a Rosin-Rammler spray (volume basis, X = D32 Gamma(1 - 1/q)) resolved into
size classes. Drops start at ``u_drop0`` where they form (the caller places that plane, and
``L_chamber`` is the distance from it to the throat). The gas is the burned vaporized
propellant: U_g(x) = U_c F(x), F the fraction vaporized, U_c = mdot/(rho_c A_c). Per class:

- heat-up then evaporation, in series (Law, Prog. Energy Combust. Sci. 8, 1982), lumped, at
  the initial slip: t_heat = rho_l D0^2 / (6 Nu0 k_f) * I, I = int_{T0}^{Ts} cp_l dT/(T_c - T)
  (``heatup_integral`` when the caller has the liquid's cp(T); else cp_l ln((T_c - T0)/(T_c - Ts)));
- d^2-law, dD^2/dt = -K, K = 4 Nu k_f ln(1 + B)/(rho_l c_pg), B = c_pg (T_c - T_s)/h_fg
  (Spalding; Turns ch. 3 and 10), Nu = 2 + 0.6 Re_f^0.5 Pr^(1/3) (Ranz-Marshall);
- drag, dv/dt = (U_g - v)/tau_p, tau_p = rho_l D^2/(18 mu_f phi), phi = 1 + Re^(2/3)/6 below
  Re = 1000 and 0.424 Re/24 above (Putnam), Re on free-stream density (Yuen & Chen 1976).

``blowing`` = "abramzon_sirignano" corrects both for the Stefan flow of an evaporating drop:
Nu* = 2 + (Nu0 - 2)/F(B) (Abramzon & Sirignano 1989) and C_D (1 + B)^-0.2 (Yuen & Chen 1976),
applied while the drop evaporates (not during heat-up). "none" is the uncorrected laws.

Film properties at T_f = T_s + (T_c - T_s)/3 (1/3 rule): mu_f from Huzel & Huang,
k_f = mu_f c_pg/Pr, rho_f = Pc/(R T_f), c_pg = gamma R/(gamma - 1).

``streams``: dicts with name, mass_fraction, D32, rho_l, cp_l, T0, T_s, h_fg (and optionally
heatup_integral); a stream with ``instant`` set is vaporized at the face.

Definition at line 467 of file combustion_physics.py.

References _gas_viscosity(), _march_core, abramzon_sirignano_F(), max, and yuen_chen_drag_factor().

Referenced by calculate_vaporization_efficiency(), and vaporization_profile().

◆ stream_tube_mixing_efficiency()

Dict[str, Any] engine.pipeline.combustion_physics.stream_tube_mixing_efficiency ( float MR,
CstarOfMR cstar_fn,
List[Tuple[float, float, float]] elements,
str distribution = "gaussian" )
c* mixing efficiency by stream tubes (Pieper, Dean & Valentine, JSR 4(6), 1967; Dickerson
et al., AFRPL-TR-68-147): each tube burns to equilibrium at its own O/F and none mixes with
another before the throat, so

    eta_mix = sum_i w_i c*(O/F_i) / c*(O/F_bulk).

``elements`` = [(mass weight, element O/F, element E_m)]. Within an element the oxidizer mass
fraction r = O/(O+F) is spread about the element's own r_j with the mean absolute deviation
that reproduces Rupe's E_m, MAD = 2 (1 - E_m) r_j (1 - r_j), in the named shape:
"gaussian" (normal in r, 64 tubes to 6 sigma) or "two_tube" (equal-mass tubes at r_j +- MAD).
Element-to-element striation enters through the r_j; the element centres are shifted together
so their mass-weighted mean is the bulk (the injector's element split and MR come from
different solves; the shift is reported). The integral stays unmixed to the throat, which
over-states the loss by whatever gas-phase mixing does downstream of the spray.

Definition at line 1053 of file combustion_physics.py.

References _mass_quantiles_OF(), and rupe_Em_of_distribution().

Referenced by calculate_combustion_efficiency_advanced().

◆ vaporization_profile()

Optional[Dict[str, Any]] engine.pipeline.combustion_physics.vaporization_profile ( Dict[str, Any] ce,
int points = 40 )
The droplet march that set eta_vap, run again with its profile, in chamber coordinates
(x from the injector face). ``ce`` is the c* model's diagnostics
(``diagnostics["cstar_efficiency"]``). Per stream: the fraction vaporized along the chamber,
where it reaches 95 % (None if it does not), and the fraction at the chamber end. None when
the solve carried no march (the sheet reached the throat, or an older result).

Definition at line 1287 of file combustion_physics.py.

References spray_vaporization_march().

◆ yuen_chen_drag_factor()

float engine.pipeline.combustion_physics.yuen_chen_drag_factor ( float B)
C_D of an evaporating drop over the standard curve at film properties, (1 + B)^-0.2
(Yuen & Chen, Combust. Sci. Technol. 14, 1976, eq. 5; Faeth, PECS 9, 1983).

Definition at line 459 of file combustion_physics.py.

Referenced by spray_vaporization_march().

Variable Documentation

◆ _AS_MEMO

dict engine.pipeline.combustion_physics._AS_MEMO = {}
protected

Definition at line 375 of file combustion_physics.py.

◆ _COOLPROP_ALIASES

dict engine.pipeline.combustion_physics._COOLPROP_ALIASES
protected
Initial value:
1= {"LOX": "Oxygen", "O2": "Oxygen", "GOX": "Oxygen", "LCH4": "Methane",
2 "CH4": "Methane", "LNG": "Methane", "LH2": "Hydrogen", "H2": "Hydrogen",
3 "N2O": "NitrousOxide", "H2O2": None, "RP-1": None, "RP1": None,
4 "Kerosene": None, "Jet-A": None}

Definition at line 371 of file combustion_physics.py.

◆ _CSTAR_WIDE_MEMO

dict engine.pipeline.combustion_physics._CSTAR_WIDE_MEMO = {}
protected

Definition at line 229 of file combustion_physics.py.

◆ _CSTAR_WIDE_MR

engine.pipeline.combustion_physics._CSTAR_WIDE_MR = np.geomspace(0.1, 20.0, 161)
protected

Definition at line 225 of file combustion_physics.py.

◆ _CSTAR_WIDE_PC

engine.pipeline.combustion_physics._CSTAR_WIDE_PC = np.geomspace(1.0e5, 1.2e7, 16)
protected

Definition at line 226 of file combustion_physics.py.

◆ _FT_M

float engine.pipeline.combustion_physics._FT_M = 0.3048
protected

Definition at line 228 of file combustion_physics.py.

◆ _GAUSS_W

engine.pipeline.combustion_physics._GAUSS_W = np.concatenate([_HALF_W[::-1], _HALF_W])
protected

Definition at line 1015 of file combustion_physics.py.

◆ _GAUSS_X

engine.pipeline.combustion_physics._GAUSS_X = np.concatenate([-_HALF_X[::-1], _HALF_X])
protected

Definition at line 1014 of file combustion_physics.py.

◆ _GL_W

engine.pipeline.combustion_physics._GL_W
protected

Definition at line 39 of file combustion_physics.py.

◆ _GL_X

engine.pipeline.combustion_physics._GL_X
protected

Definition at line 39 of file combustion_physics.py.

◆ _HALF_W

float engine.pipeline.combustion_physics._HALF_W = 3.0 * _HALF_W * np.exp(-0.5 * _HALF_X ** 2)
protected

Definition at line 1011 of file combustion_physics.py.

◆ _HALF_X

float engine.pipeline.combustion_physics._HALF_X = 3.0 * (_HALF_X + 1.0)
protected

Definition at line 1011 of file combustion_physics.py.

◆ _HEATUP_GL_W

engine.pipeline.combustion_physics._HEATUP_GL_W
protected

Definition at line 376 of file combustion_physics.py.

◆ _HEATUP_GL_X

engine.pipeline.combustion_physics._HEATUP_GL_X
protected

Definition at line 376 of file combustion_physics.py.

◆ _march_core

engine.pipeline.combustion_physics._march_core = _njit(cache=True, error_model="numpy")(_march_core_py) if _njit is not None else None
protected

Definition at line 140 of file combustion_physics.py.

Referenced by spray_vaporization_march().

◆ _MARCH_STEPS

int engine.pipeline.combustion_physics._MARCH_STEPS = 100
protected

Definition at line 38 of file combustion_physics.py.

◆ _njit

engine.pipeline.combustion_physics._njit = None
protected

Definition at line 48 of file combustion_physics.py.

◆ _PSI_PA

float engine.pipeline.combustion_physics._PSI_PA = 6894.757293168361
protected

Definition at line 227 of file combustion_physics.py.

◆ _RR_NODES

engine.pipeline.combustion_physics._RR_NODES = -np.log1p(-0.5 * (_GL_X + 1.0))
protected

Definition at line 40 of file combustion_physics.py.

◆ _RR_WEIGHTS

float engine.pipeline.combustion_physics._RR_WEIGHTS = 0.5 * _GL_W
protected

Definition at line 41 of file combustion_physics.py.

◆ _UNIT_MAD

dict engine.pipeline.combustion_physics._UNIT_MAD
protected
Initial value:
1= {
2 "gaussian": (_GAUSS_X / float(np.sum(_GAUSS_W * np.abs(_GAUSS_X))), _GAUSS_W),
3 "two_tube": (np.array([-1.0, 1.0]), np.array([0.5, 0.5])),
4}

Definition at line 1019 of file combustion_physics.py.

◆ _USE_COMPILED_MARCH

engine.pipeline.combustion_physics._USE_COMPILED_MARCH = _njit is not None
protected

Definition at line 50 of file combustion_physics.py.

◆ _V_FLOOR

float engine.pipeline.combustion_physics._V_FLOOR = 1.0e-3
protected

Definition at line 43 of file combustion_physics.py.

◆ BLOWING_MODELS

tuple engine.pipeline.combustion_physics.BLOWING_MODELS = ("abramzon_sirignano", "none")

Definition at line 445 of file combustion_physics.py.

◆ CSTAR_WIDE_SCHEMA_VERSION

int engine.pipeline.combustion_physics.CSTAR_WIDE_SCHEMA_VERSION = 1

Definition at line 224 of file combustion_physics.py.

◆ MIXING_DISTRIBUTIONS

engine.pipeline.combustion_physics.MIXING_DISTRIBUTIONS = tuple(_UNIT_MAD)

Definition at line 1023 of file combustion_physics.py.

◆ P_BOIL_REF

float engine.pipeline.combustion_physics.P_BOIL_REF = 101325.0

Definition at line 31 of file combustion_physics.py.

◆ RUPE_FIG1_N_RANGE

tuple engine.pipeline.combustion_physics.RUPE_FIG1_N_RANGE = (0.26, 0.78)

Definition at line 1007 of file combustion_physics.py.

◆ WATSON_EXPONENT

float engine.pipeline.combustion_physics.WATSON_EXPONENT = 0.38

Definition at line 32 of file combustion_physics.py.