Remaining schema blocks — field reference¶
Six TOML blocks that had only partial documentation before 2026-08-03. Each
one is a knob surface a user has to touch to do real work — [[controller]]
and [cylinder.combustion] are among the first blocks anyone edits — and an
undocumented knob is a knob nobody outside this repo can find.
Coverage before this page, measured across every *Spec in
aeolus1d.io.schema (a field counts as documented if its name appears in
backticks anywhere under docs/):
| Spec | Block | Was | Now |
|---|---|---|---|
ShaftSpec |
[[shaft]] |
1/6 | 6/6 |
ThermalWallSpec |
[pipe.thermal_wall] |
1/16 | 16/16 |
RegenSpec |
[pipe.filter.regen] |
1/13 | 13/13 |
UreaSpec |
[pipe.urea] |
5/13 | 13/13 |
ControllerSpec |
[[controller]] |
9/34 | 34/34 |
WiebeSpec |
[cylinder.combustion] |
8/33 | 33/33 |
tests/unit/test_schema_block_reference_coverage.py fails CI when a field
lands on any of these specs without a row here, and checks the Default column
against the dataclass. That pairing is the point: of the reference pages
audited on 2026-08-01, the one page that had a coverage guard was the one
that had not rotted, and every unguarded number in the others was wrong.
For [case] see run settings; for [[cylinder]] see the
cylinder reference; for the aftertreatment thermal
blocks see aftertreatment thermal & catalytic
blocks.
[[shaft]] — turbocharger shaft¶
Couples a [[turbo]] compressor and turbine through
I·dω/dt = (Ẇ_T − Ẇ_C)/ω. eta_mech and bearing_friction both default to
the loss-free shaft, so adding them to an existing case and leaving the
defaults is bit-identical.
| Field | Type | Default | Meaning |
|---|---|---|---|
id |
str |
required | Unique shaft identifier. |
inertia |
float |
1e-05 |
Shaft polar moment of inertia I. Drives the integrator: I·dω/dt = (Ẇ_T − Ẇ_C) / ω. Units: kg·m². Typical: 1e-5 (turbocharger). |
omega_init |
float |
1000.0 |
Initial shaft speed at t = 0. Units: rad/s. |
omega_min |
float |
50.0 |
Minimum shaft speed. The integrator clamps ω to this floor to avoid singularities in Ẇ / ω at near-zero speed. Units: rad/s. Default: 50. |
eta_mech |
float |
1.0 |
Phase v0.5-turbo-robust — bearing/seal mechanical efficiency (debits net driving power) + viscous windage coefficient k (friction power k·ω² opposing rotation). Defaults reproduce the loss-free shaft. |
bearing_friction |
float |
0.0 |
Viscous windage coefficient k; friction power k·ω² opposes rotation. 0 = loss-free shaft (pre-feature default). |
[pipe.thermal_wall] — per-pipe dynamic wall¶
Gives a pipe a wall with heat capacity, so it lags rather than tracking the
gas. kind = "none" (default) keeps the original static-T_wall HEAT
closure and carries no extra state.
Three ways to close the outside of the wall, in increasing fidelity:
- Nothing (
h_ext = eps_rad = 0) — adiabatic outside. The wall soaks up gas heat forever; only meaningful for warm-up transients. - Ambient BC (
h_extand/oreps_rad) — the wall sheds toT_amband reaches a steady balance. - Coolant coupling — a matching
[[coolant_coupling]]ties the wall to aCoolantPipethroughh_cool.
Setting layers switches to the radial multi-layer solver, and the
single-layer mass fields (m_wall_per_cell, cp_wall) stop being consulted.
| Field | Type | Default | Meaning |
|---|---|---|---|
kind |
Literal['none', 'dynamic'] |
'none' |
"none" uses the static T_wall from the HEAT closure and carries no wall state. "dynamic" gives the pipe a per-cell T_wall(x) ODE advanced by m·c·dT/dt = q̇_gas − q̇_cool. |
m_wall_per_cell |
float |
0.0 |
[kg per cell] Wall thermal mass. Single-layer only — superseded by layers when that is non-empty. |
cp_wall |
float |
900.0 |
[J/(kg·K)] Wall specific heat (aluminium default). Single-layer only. |
h_gas |
float |
400.0 |
[W/(m²·K)] Gas-side film coefficient. |
h_cool |
float |
2000.0 |
[W/(m²·K)] Coolant-side film coefficient. Used only when a matching [[coolant_coupling]] points at this pipe. |
A_wall_per_cell |
float |
0.0 |
[m² per cell] Gas-side wetted wall area. Multiplies h_gas; 0 leaves the wall thermally disconnected from the gas. |
T_wall_init |
float |
300.0 |
[K] Initial wall temperature at t = 0. |
h_ext |
float |
0.0 |
external convection, W/(m²·K) |
T_amb |
float |
300.0 |
[K] Ambient sink temperature for the external convection / radiation BC. |
eps_rad |
float |
0.0 |
outer-surface emissivity (0 ⇒ off) |
A_ext_per_cell |
float |
0.0 |
[m² per cell] External (outer-surface) area for h_ext / eps_rad. 0 reuses A_wall_per_cell. |
k_wall |
float |
0.0 |
[W/(m·K)] Wall thermal conductivity for axial conduction (steel ≈ 45, Al ≈ 200). Paired with A_cross_wall. |
A_cross_wall |
float |
0.0 |
[m²] Wall-material cross-section (an annulus) carrying axial conduction. Paired with k_wall; both 0 ⇒ axial conduction off. |
gas_coupled |
bool |
False |
v0.4 — opt-in two-way gas coupling for a coolant-coupled wall. Default false keeps the historical read-only-gas behaviour (the gas-side loss is modelled by a separate HEAT closure); true wires the energy-conservative gas↔wall py_heat tie (and overrides the HEAT closure). No effect on standalone walls (always two-way). |
layers |
list[WallLayerSpec] |
[] |
v0.4 multi-layer radial wall. When non-empty (and kind="dynamic"), the build uses the radial multi-layer solver: the gas couples to the first (inner) layer via h_gas / A_wall_per_cell and the external BC (h_ext / eps_rad) acts on the last (outer) layer. The single-layer mass fields (m_wall_per_cell / cp_wall) are unused. |
axial_conduction |
bool |
False |
Opt-in axial conduction along the pipe within each radial layer (multi-layer walls only; per-layer conductance derived from each layer's k / thickness). Off by default. |
[pipe.filter.regen] — DPF regeneration kinetics¶
Two soot-oxidation pathways run in parallel: the active O₂ route
(C + ½O₂ → CO/CO₂, lights off above ~550 °C) and the passive NO₂ route
(C + NO₂ → NO + CO₂), which ticks along at ordinary exhaust temperatures.
Three refinements are off by default and each is bit-identical when left off:
k_mt (mass-transfer cap), frac_fast (two-population soot), and
hrr_clamp (per-step heat-release stability clamp).
| Field | Type | Default | Meaning |
|---|---|---|---|
A_o2 |
float |
100000000.0 |
Active (O₂) regeneration pre-exponential factor. Soot oxidation pathway C + ½ O₂ → CO + CO₂; first-order in soot loading and O₂ concentration. Rate per cell (kg-soot / m³-filter / s): A_o2 · (ρ · Y_O2 / M_O2) · soot · exp(-Ea_o2 / RT). Pathway lights off above ~550 °C exhaust gas temperature. Units: m³ / (mol · s). Typical: 1e8 (Konstandopoulos & Kostoglou, 2000). |
Ea_o2 |
float |
150000.0 |
Active (O₂) regeneration activation energy. Sets the temperature gate for O₂-driven oxidation; below ~500 °C exhaust temperatures the rate is effectively zero. Units: J/mol. Typical: 150 000 (150 kJ/mol, Konstandopoulos & Kostoglou). |
A_no2 |
float |
5500.0 |
Passive (NO₂) regeneration pre-exponential factor. Soot oxidation pathway C + NO₂ → NO + CO₂; far lower activation energy than the O₂ pathway, so it ticks along at typical exhaust temperatures (~250–400 °C). Rate per cell: A_no2 · (ρ · Y_NO2 / M_NO2) · soot · exp(-Ea_no2 / RT). Units: m³ / (mol · s). Typical: 5.5e3. |
Ea_no2 |
float |
100000.0 |
Passive (NO₂) regeneration activation energy. Lower than the O₂ pathway — NO₂ is an aggressive oxidiser, so the passive route runs at exhaust temperatures. Units: J/mol. Typical: 100 000 (100 kJ/mol). |
K_NO_inh |
float |
0.0 |
[m³/mol] Langmuir NO back-inhibition constant on the NO₂ pathway — NO produced by the reaction competes for the same sites. 0 = no inhibition (pre-feature default, bit-identical). |
dH |
float |
32800000.0 |
Heat of reaction released per kg of soot oxidised. Both pathways pour this into the gas energy residual R_E per cell at rate dH · |d_soot/dt| (W/m³). Positive = exothermic. Phase 8f.5 lacks a solid-phase thermal mass for the cake — Phase 8g (backlogged) adds it. At realistic loadings the released heat dumps directly into the gas, which can run away if soot is high; tune the example with low loadings until 8g lands. Units: J/kg-soot. Typical: 32.8e6 (C + O₂ → CO₂, lower if CO is the major product). |
k_mt |
float |
0.0 |
[m³/(mol·s)] Volumetric mass-transfer coefficient capping the burn rate where O₂ supply, not kinetics, limits. Composed as a serial resistance 1/r_eff = 1/r_arrhenius + 1/r_mt, so low-T behaviour is unchanged and the high-T "Arrhenius cliff" is removed. 0 = disabled. |
frac_fast |
float |
0.0 |
Fraction (0..1) of the initial soot loading assigned to the fast-burning population. The rest burns with A_o2/Ea_o2. 0 = single-fraction (bit-identical). |
A_o2_fast |
float |
100000000.0 |
[m³/(mol·s)] Pre-exponential for the fast soot fraction. Only consulted when frac_fast > 0. |
Ea_o2_fast |
float |
120000.0 |
[J/mol] Activation energy for the fast soot fraction — lower than Ea_o2, which is what makes it light off earlier. |
heater_power_w |
float |
0.0 |
[W] Electrical heater power for active regeneration, applied once soot_trigger_kg_m3 is exceeded. 0 = passive regeneration only. |
soot_trigger_kg_m3 |
float |
8.0 |
[kg/m³] Soot-loading threshold at which the active heater switches on. |
hrr_clamp |
bool |
False |
Phase 8n — opt-in per-step soot-oxidation HRR stability clamp. Bounds the regen rate so its explicit heat release can't overshoot the gas / cake temperature in one step (cap = ρ·cp·T/(dH·dt) direct, Ω_cake·T_cake/(dH·dt) thermal). False (default) = no clamp, bit-identical; True hardens active regen / high-soot-load runs against forward-Euler T overshoot. |
[pipe.urea] — SCR urea-water doser¶
Injects urea-water solution (AdBlue) that decomposes to the NH₃ the SCR
brick needs. control picks the strategy: "fixed" follows the
mdot_t/mdot_v schedule, "anr_feedforward" closes the loop on a target
ammonia-to-NOx ratio from the live NOx flow at the brick inlet and ignores
the schedule entirely.
The mdot_t abscissa must ascend; it is checked at load and at build.
| Field | Type | Default | Meaning |
|---|---|---|---|
kind |
Literal['none', 'urea_spray'] |
'none' |
"none" disables the doser. "urea_spray" injects urea-water solution, which decomposes to NH₃ for the downstream SCR. |
mdot_t |
list[float] |
[] |
time schedule (s) |
mdot_v |
list[float] |
[] |
UWS rate (kg/s) |
uws_conc |
float |
0.325 |
urea mass fraction in UWS (AdBlue default) |
x_frac |
float |
0.1 |
normalised injection location [0, 1] |
n_spray_cells |
int |
1 |
cells to spread source over |
eta_conv |
float |
1.0 |
urea → NH₃ conversion efficiency |
hnco_frac |
float |
0.0 |
Phase 7b-3 — when > 0, a fraction hnco_frac of the urea is injected as HNCO intermediate rather than being instantly converted to 2NH₃+CO₂. The HNCO species must appear in pipe.species_extras for tracking. |
control |
Literal['fixed', 'anr_feedforward'] |
'fixed' |
Dosing strategy. "fixed" (default) drives the dose from the mdot_t / mdot_v schedule. "anr_feedforward" closes the loop: each step the dose is computed to hit a target Ammonia-to-NOx Ratio (NH₃ : NOx molar) from the live engine-out NOx flow at the brick inlet (mirrors the AVL Cruise M SCR dosing controller). Under anr_feedforward the mdot_t/mdot_v schedule is ignored. |
anr_target |
float |
1.0 |
target NH₃ : NOx molar ratio (ANR) |
nox_species |
list[str] |
[] |
NOx species summed for the ANR denominator (molar flow). Standard diesel SCR feed is NO + NO₂. |
light_off_T |
float |
0.0 |
[K] Inlet-temperature gate below which dosing is suppressed (urea deposits rather than decomposing). 0 = no gate. |
max_mdot_uws |
float |
0.0 |
kg/s UWS dose clamp (0 = no clamp) |
charge_cooling |
bool |
False |
AdBlue evaporation / decomposition enthalpy sink on the gas — sensible heat warming the liquid to gas temperature, latent heat of the carrier water, and the endothermic urea decomposition. Off by default; every existing case is bit-identical. |
T_liquid |
float |
300.0 |
[K] injected UWS temperature, for the sensible-heat term |
cp_liquid |
float |
4180.0 |
[J/(kg·K)] specific heat of the aqueous urea solution |
L_water |
float |
2260000.0 |
[J/kg] latent heat of the carrier water |
water_mol_ratio |
float |
6.9 |
mol H₂O evaporated per mol urea decomposed (32.5 wt-% AdBlue) |
dH_decomp |
float |
-100000.0 |
[J/mol urea] decomposition enthalpy, +ve = exothermic (urea decomposition is endothermic, hence negative) |
[[controller]] — closed-loop actuators¶
One block per controller. kind selects the arm, and each arm consults a
different subset of the fields — fields belonging to another arm are
ignored rather than rejected, so a misspelled kind silently gives you a
different controller. id, kind and Kp are always required.
kind |
actuates | controlled variable | key fields |
|---|---|---|---|
boost_pressure |
VGT vane | manifold pressure | turbine_id, manifold_pipe_id, p_target, vane_min/max |
wastegate |
waste-gate bypass | manifold pressure | turbine_id, manifold_pipe_id, p_target, bypass_min/max |
dpf_heater |
electrical heater | DPF temperature | dpf_pipe_id, T_target, P_min/max |
doc_sulfur |
— (storage model) | DOC sulphur loading | doc_pipe_id, Y_SO2_in, A_store, Ea_store, A_reduce, Ea_reduce |
egr_valve |
EGR valve | species fraction at a probe | egr_pipe_id, egr_end, probe_pipe_id, species_name, Y_target, open_min/max |
fuel_injector |
injected fuel mass | species fraction at a probe | cylinder_id, probe_pipe_id, species_name, Y_target, m_fuel_min/max |
spark_timing |
spark angle | knock margin | cylinder_id, knock_margin_target, theta_min_deg, theta_max_deg |
fuel_injector deliberately reuses probe_pipe_id / species_name /
Y_target from the egr_valve arm: both are PI-on-species-fraction at a
probe pipe and the semantics are identical.
| Field | Type | Default | Meaning |
|---|---|---|---|
id |
str |
required | Unique controller identifier. |
kind |
Literal['boost_pressure', 'dpf_heater', 'wastegate', 'doc_sulfur', 'egr_valve', 'fuel_injector', 'spark_timing'] |
required | Which controller to build. Each arm consults a different subset of the fields below; fields belonging to other arms are ignored. |
Kp |
float |
required | Proportional gain. Sign convention is per-controller — see the arm's section. |
Ki |
float |
0.0 |
Integral gain. 0 = pure proportional (steady-state offset remains). |
turbine_id |
Optional[str] |
None |
Turbine whose vane (boost) or waste-gate (bypass) this controller actuates. |
manifold_pipe_id |
Optional[str] |
None |
Pipe whose pressure is the controlled variable (the boost/manifold probe). |
p_target |
Optional[float] |
None |
[Pa] Target manifold pressure. Required by boost_pressure and wastegate. |
vane_min |
float |
0.05 |
Lower clamp on VGT vane position (0 = fully closed). Kept above 0 so the turbine never fully chokes. |
vane_max |
float |
1.0 |
Upper clamp on VGT vane position (1 = fully open). |
bypass_min |
float |
0.0 |
Lower clamp on waste-gate bypass fraction (0 = fully closed). |
bypass_max |
float |
1.0 |
Upper clamp on waste-gate bypass fraction (1 = fully bypassed). |
dpf_pipe_id |
Optional[str] |
None |
DPF pipe whose temperature the heater controls. |
T_target |
Optional[float] |
None |
[K] Target DPF temperature for the dpf_heater arm. |
P_min |
float |
0.0 |
[W] Lower clamp on heater power. |
P_max |
float |
5000.0 |
[W] Upper clamp on heater power. |
doc_pipe_id |
Optional[str] |
None |
DOC pipe carrying the sulphur-storage state. |
Y_SO2_in |
float |
5e-05 |
Inlet SO₂ mass fraction feeding the DOC sulphur-storage model. |
A_store |
float |
100.0 |
Pre-exponential for sulphur storage on the DOC washcoat. |
Ea_store |
float |
20000.0 |
[J/mol] Activation energy for sulphur storage. |
A_reduce |
float |
1000000000.0 |
Pre-exponential for sulphur release (de-sulphation). |
Ea_reduce |
float |
180000.0 |
[J/mol] Activation energy for sulphur release — high, so de-sulphation needs a deliberate high-temperature excursion. |
egr_pipe_id |
Optional[str] |
None |
Pipe terminated by the EGR-valve BC this controller actuates. |
egr_end |
Literal['left', 'right'] |
'left' |
Which end of egr_pipe_id the EGR valve BC is attached to. |
probe_pipe_id |
Optional[str] |
None |
Pipe where the controlled species fraction is measured. |
species_name |
str |
'O2' |
Species whose mass fraction is the controlled variable (O2 for EGR-rate control). |
Y_target |
Optional[float] |
None |
Target mass fraction of species_name at the probe. |
open_min |
float |
0.0 |
Lower clamp on valve opening fraction. |
open_max |
float |
1.0 |
Upper clamp on valve opening fraction. |
cylinder_id |
Optional[str] |
None |
Cylinder this controller actuates (fuel injector or spark timing). |
m_fuel_min |
float |
0.0 |
[kg/cycle] Lower clamp on injected fuel mass. |
m_fuel_max |
float |
0.0001 |
[kg/cycle] Upper clamp on injected fuel mass. |
knock_margin_target |
Optional[float] |
None |
Target knock margin the spark_timing controller holds by retarding spark. |
theta_min_deg |
float |
300.0 |
[°CA] Most-retarded spark angle the controller may command. |
theta_max_deg |
float |
420.0 |
[°CA] Most-advanced spark angle the controller may command. |
[cylinder.combustion] — combustion models¶
This block carries three alternative models rather than one parameter
set, which is why it needs sections rather than a flat table. kind picks
which, and the other models' parameters are inert.
m_fuel and LHV scale the total released energy for every model.
kind = "wiebe" (default) — prescribed burn shape¶
Uses theta_start_deg, duration_deg, a, m. Set stages to a list of
[[cylinder.combustion.stage]] blocks for a multi-stage profile (HCCI /
RCCI / diesel), which replaces the single-stage shape above.
kind = "si_turbulent" — predictive SI¶
Computes the burn rate from the in-cylinder state via the turbulent-flame
entrainment model, using the si_* fields. Nothing is prescribed except the
spark timing.
Multi-pulse diesel¶
The diesel_* fields drive the Watson-correlation multi-pulse diesel model
(premixed spike + diffusion tail). Note
diesel_premixed_duration_deg / diesel_diffusion_duration_base_deg are in
crank angle, while diffusion burn is mixing-limited and takes roughly
constant time — see BACKLOG.md for the measured consequence on the EPW
suite's MFB50 speed trend.
Two-zone diagnostics¶
two_zone, gamma_burnt, gamma_unburnt, burnt_dissociation and
caloric_zone_split are
diagnostic layers only — they do not change the bulk volume integration
or add a conservation law. They feed the burnt-zone temperature the Zeldovich
NOx post-processor reads.
| Field | Type | Default | Meaning |
|---|---|---|---|
theta_start_deg |
float |
360.0 |
[°CA] Crank angle at which combustion starts (kind = "wiebe" only). |
duration_deg |
float |
60.0 |
[°CA] Total burn duration Δθ (kind = "wiebe" only). |
a |
float |
5.0 |
Wiebe completeness coefficient. a = 5 (default) gives ~99 % burnt by the close of the window (the textbook convention). Units: dimensionless. |
m |
float |
2.0 |
Wiebe shape exponent. m ≈ 2 is a typical SI shape; CI engines tend higher (longer ignition-delay tail). Units: dimensionless. |
m_fuel |
float |
5e-05 |
[kg/cycle] Fuel mass injected per cycle. Scales total released energy together with LHV, for every kind. |
LHV |
float |
44000000.0 |
[J/kg] Fuel lower heating value. With m_fuel this sets the total energy released per cycle, for every kind. |
two_zone |
bool |
False |
When true, the cylinder maintains separate burnt-zone and unburnt-zone temperatures (Phase 25j) for diagnostic output. The bulk volume integration is unchanged — these are layered diagnostics, not a new conservation law. Default: false. |
gamma_burnt |
Optional[float] |
None |
Optional per-zone γ for the burnt-zone temperature diagnostic (Phase 25k two-zone). Typical value 1.27 for hot polyatomic-rich combustion products. Leave unset to fall back to the cylinder's single γ. Units: dimensionless. |
gamma_unburnt |
Optional[float] |
None |
Optional per-zone γ for the unburnt-zone temperature diagnostic. Typical value 1.40 for cold diatomic-rich fresh charge. Leave unset to fall back to the cylinder's single γ. Units: dimensionless. |
burnt_dissociation |
bool |
False |
Chem audit 2026-07 — dissociation-aware burnt-zone T diagnostic. When True the two-zone burnt-zone energy balance adds the endothermic dissociation energy of the combustion products, capping the unphysically-high peak T a frozen constant-γ back-solve gives at high load (which inflates the Zeldovich NOx post-processor). Default False = bit-identical to the constant-γ behaviour. Diagnostic-only. |
caloric_zone_split |
bool |
False |
P2 (2026-08-08) — evaluate BOTH zones with the volume's own caloric model instead of two heat capacities frozen from a constant γ and the cylinder's nominal R_gas. The unburnt zone uses e_cal(T_u); the burnt zone is the Newton inverse T_from_e. Both frozen terms bias the solved T_b up, and T_b feeds the Zeldovich NOx post-processor whose rate is exponential in it. MEASURED on EPW: frozen c_v = 838.3 vs caloric 938 @ 1500 K / 1339 @ 2400 K, and R_eff = 288.17 vs 287.05 — so the correction scales with the temperature reached and is self-limiting. T_b fell 2.24 % at peak pressure. Requires a volume carrying a caloric evaluator; a species-less cylinder keeps the legacy path. Default False = bit-identical. Diagnostic-only. |
stages |
list[WiebeStageSpec] |
[] |
CP12-2 — Optional multi-stage Wiebe profile for HCCI / RCCI / diesel. When non-empty, the per-stage (theta_start_deg, duration_deg, a, m, mass_fraction) tuples replace the single-stage shape above. m_fuel + LHV still scale total energy. TOML form: [cylinder.combustion] m_fuel = 8e-5 LHV = 43e6 [[cylinder.combustion.stage]] theta_start_deg = 360 duration_deg = 10 mass_fraction = 0.4 a = 6.5 m = 3.0 [[cylinder.combustion.stage]] theta_start_deg = 365 duration_deg = 60 mass_fraction = 0.6 a = 4.0 m = 1.2 |
kind |
str |
'wiebe' |
C1 — combustion-model selector. "wiebe" (default) = the prescribed-shape burn above; "si_turbulent" = the PREDICTIVE SI turbulent-flame entrainment model (aeolus1d.closures.si_turbulent_combustion), which COMPUTES the burn rate from the in-cylinder state via the si_* parameters below (plus the shared m_fuel / LHV). Default keeps every existing case bit-exact. |
si_spark_timing_deg |
float |
340.0 |
spark crank angle [° in 0..720) |
si_fuel |
str |
'gasoline' |
laminar-flame-speed fuel preset |
si_phi |
float |
1.0 |
equivalence ratio |
si_dilution |
float |
0.0 |
residual + EGR fraction (lowers S_L) |
si_c_u |
float |
0.5 |
u' = c_u · mean piston speed |
si_c_l |
float |
0.5 |
integral length = c_l · chamber height; also absorbs the model's fixed lumped viscosity (it enters only as ν·c_l), so it is a calibration constant, not a pure geometric ratio |
si_kernel_radius |
float |
0.001 |
seeded spark-kernel radius [m] |
si_gamma_unburnt |
float |
1.35 |
γ for the adiabatic unburnt-zone T_u |
diesel_soi_deg |
float |
348.0 |
start of injection [° CA] |
diesel_inj_duration_deg |
float |
20.0 |
injection duration [° CA] |
diesel_cetane_number |
float |
50.0 |
#2 diesel ~48–52 |
diesel_phi |
float |
0.0 |
equivalence ratio; ≤0 ⇒ from charge |
diesel_afr_stoich |
float |
14.5 |
stoichiometric air/fuel |
diesel_comb_efficiency |
float |
1.0 |
burnt fraction of injected fuel |
diesel_premixed_duration_deg |
float |
8.0 |
premixed-spike Wiebe duration |
diesel_diffusion_lag_deg |
float |
4.0 |
diffusion start after SOC |
diesel_diffusion_duration_base_deg |
float |
12.0 |
dur = base + k·inj_dur |
diesel_diffusion_duration_k |
float |
1.6 |
Slope of the diffusion-burn duration on injection duration: dur = base + k·inj_dur. |
diesel_watson_a |
float |
0.7 |
premixed-fraction coefficients |
diesel_watson_b |
float |
0.35 |
Watson premixed-fraction coefficient b (exponent on ignition delay). |
diesel_watson_c |
float |
0.4 |
Watson premixed-fraction coefficient c (exponent on equivalence ratio). |
mz_c_tan_alpha |
float |
0.26 |
Spray spreading-angle coefficient in tan(α/2). Calibrate through this, not through mz_c_xchar — a wider cone and a shorter x⁺ are the same knob, so tuning both double-counts. |
mz_c_xchar |
float |
0.66 |
Geometry correction on the characteristic length x⁺. Normally held fixed at the published value. |
mz_m_bmf |
float |
0.3 |
Exponent on the burnt-mass-fraction slowdown of entrainment — a zone surrounded by burnt charge entrains less fresh air. |
mz_eps_bmf |
float |
0.25 |
Shift keeping that slowdown finite as BMF → 1. Without it late-cycle zones stop entraining entirely, which they do not. |
mz_c_tau_vap |
float |
0.00015 |
Evaporation time-scale [s] at the 900 K reference; τ ∝ T⁻³. |
mz_c_tau_mix |
float |
0.0008 |
Mixing time-scale [s] at the 1200 rpm reference; τ ∝ rpm^-0.6. |
mz_k_mix |
float |
2.0 |
Mixing slowdown once the spray reaches the bowl rim and then the bore — the crude stand-in for wall impingement. |
mz_c_liftoff |
float |
622500000.0 |
Lift-off length constant, in the correlation's own mixed units. Calibrated value since 2026-08-25; the published SAE 2005-01-3843 constant is 7.04e8, and this is 0.884× it. Not 1.0 — the correlation has no natural scale without it. |
mz_c_tau_id |
float |
16.7 |
Ignition-delay prefactor [s·Pa]. Calibrated value since 2026-08-25; the previous default 25.14 was derived by anchoring to 1.0 ms at 60 bar / 900 K / air, which this gives as 0.67 ms. Pairs with mz_ea_over_r = 3242.0 — change both together or neither. |
mz_ea_over_r |
float |
3242.0 |
Apparent activation temperature [K] for the ignition delay. |
mz_u_swirl |
float |
0.0 |
Swirl velocity [m/s]. Zero reproduces the reference implementation. |
mz_bowl_diameter |
float |
0.0 |
Piston-bowl diameter [m]. ≤ 0 resolves to 0.6·bore; passing 0 through would divide by zero in the mixing ramp. |
mz_packet_duration_s |
float |
5e-05 |
Injection slice that seeds one zone. Smaller means more zones and a finer (λ,T) distribution. |
mz_tzone_mode |
int |
2 |
Zone-temperature closure. 2 = mixing + first law (no fitted coefficients). 1 (adiabatic-flame jump) is refused at build since 2026-09-29: advance_zones has no path for it, so it used to be accepted and silently ran mode 2. Modes 3/4/11/22 are rejected and refused at build. |
inj_a_holes_geometric_m2 |
float |
1e-07 |
Geometric nozzle-hole area [m²]. Sets exit velocity; the discharge coefficient is already in the mass flow, so using the effective area here would count it twice. |
inj_a_holes_m2 |
float |
7e-08 |
Effective (discharge-corrected) hole area [m²]. |
inj_a_gain_m2 |
float |
0.0 |
Effective inlet/gain restriction area [m²]. ≤ 0 means absent, not closed — a zero area would give zero flow. |
inj_a_seat_m2 |
float |
0.0 |
Effective seat area [m²]. ≤ 0 means fully lifted / absent. |
inj_rail_pressure_pa |
float |
180000000.0 |
Common-rail pressure [Pa]. |
inj_rail_volume_m3 |
float |
8e-05 |
Rail volume [m³]. A starting value, not a calibration. Not read yet: the multi-zone model holds a regulated rail. |
inj_rail_bulk_modulus_pa |
float |
1800000000.0 |
Fuel bulk modulus [Pa]. Sets how fast the rail droops when injection outruns the pump. Not read yet: the multi-zone model holds a regulated rail. |
inj_rho_fuel |
float |
820.0 |
Liquid fuel density [kg/m³]. |
inj_n_holes |
int |
8 |
Nozzle hole count for multizone_diesel: one hole's diameter, sqrt(4·A_geo/(π·n)), sets the spray length and the flame lift-off. Hardware, not a calibration. |