Aftertreatment thermal & catalytic blocks¶
Reference for three TOML blocks on the thermal path that had no documentation before 2026-08-01:
[pipe.filter.thermal]— solid-phase thermal mass for a DPF (cake + substrate wall + canning loss)[pipe.filter.csf]— catalysed-soot-filter CO / HC oxidation[[coolant_coupling]]— pairs a gas pipe to a coolant pipe through a dynamic wall
They belong together because each one moves heat out of the gas and into something with a heat capacity, which is what makes an aftertreatment model lag rather than track. Every field defaults to the pre-feature behaviour, so adding any of these blocks to an existing case and leaving its values at their defaults is bit-identical — see the "off by default" note on each table.
For the filter model itself ([pipe.filter], [pipe.filter.regen]) see
closures-reference; for the physics see
theory §7. tests/unit/test_aftertreatment_thermal_doc_coverage.py
asserts every field of every spec below appears on this page.
[pipe.filter.thermal] — DPF solid-phase thermal mass¶
Routes regeneration heat release through a per-cell cake temperature
T_cake (mirroring the catalyst's T_solid path) instead of depositing it
straight into the gas energy residual, and optionally adds a second,
much larger thermal mass for the substrate wall itself.
Omit the block entirely to keep heat release on the original direct-to-gas path.
| Field | Type | Default | Meaning |
|---|---|---|---|
Omega_cake |
float |
1500000.0 |
Volumetric heat capacity of the soot cake, \(\rho_s c_{p,s}\) [J/(m³·K)]. The default is soot at 1500 kg/m³ × 1000 J/(kg·K) = 1.5 MJ/(m³·K). |
h_eff |
float |
10000.0 |
Volumetric cake↔gas heat-transfer coefficient \(h \cdot a_v\) [W/(m³·K)]. |
T_cake_init |
float |
300.0 |
Initial uniform cake temperature [K]. |
Omega_wall |
float |
0.0 |
Volumetric heat capacity of the substrate monolith [J/(m³·K)]; cordierite is ≈ 2.0 MJ/(m³·K) (1800 kg/m³ × 1100 J/(kg·K)) scaled by the solid fraction. 0 = off, and off means the substrate stays in equilibrium with the gas. This is the thermal-inertia element a WHTC or cold-start case needs. |
h_wall |
float |
0.0 |
Volumetric substrate↔gas coefficient [W/(m³·K)]. 0 = off. The wall temperature is seeded from FilterSpec.T_solid_init. |
h_canning |
float |
0.0 |
Lumped volumetric substrate↔ambient coefficient through shell + insulation [W/(m³·K)]. 0 = adiabatic canning. Build it from the series resistance \(1/h = 1/h_{conv} + \Delta x_{ins}/k_{ins} + \Delta x_{shell}/k_{shell}\), then convert per-area to per-volume with \(h_{vol} = h_{area}\cdot 4/D_{brick}\). |
T_ambient |
float |
298.15 |
Ambient temperature outside the canning [K]. Only read when h_canning > 0. |
T_cake_max |
float |
0.0 |
Clip applied to T_cake at the end of each macro step [K]. 0 = no clip. A stand-in for the O₂ mass-transfer limit the pure-Arrhenius regen rate does not have: without it a localised ignition can drive one cell past 2000 K and the burn-down rate stops being physical. |
[pipe.filter.csf] — catalysed soot filter (CO + HC oxidation)¶
A wall-flow catalysed DPF carries a washcoat that oxidises CO and unburnt hydrocarbons on the cake and wall, in parallel with the soot-O₂ regeneration. Rates are Arrhenius in the substrate temperature and first order in the gas-phase concentration.
Omit [pipe.filter.csf] to leave the brick passive — and note that both
pre-exponentials default to 0.0, so the block is inert until you set them.
| Field | Type | Default | Meaning |
|---|---|---|---|
A_co |
float |
0.0 |
CO–O₂ catalytic pre-exponential [1/(s·(mol/m³))]. 0 = off. |
Ea_co |
float |
50000.0 |
CO oxidation activation energy [J/mol]; ≈ 50 kJ/mol is typical for Pt/Pd. |
A_c3h6 |
float |
0.0 |
C₃H₆–O₂ catalytic pre-exponential [1/(s·(mol/m³))]. 0 = off. |
Ea_c3h6 |
float |
65000.0 |
HC oxidation activation energy [J/mol]; ≈ 65 kJ/mol typical for Pt/Pd. |
dH_co |
float |
10000000.0 |
Heat of reaction [J per kg CO], from CO + ½O₂ → CO₂. |
dH_c3h6 |
float |
46000000.0 |
Heat of reaction [J per kg C₃H₆], from C₃H₆ + 9/2 O₂ → 3CO₂ + 3H₂O. |
k_mt_co |
float |
0.0 |
CO mass-transfer rate constant [1/s]. 0 = off (unbounded Arrhenius). |
k_mt_c3h6 |
float |
0.0 |
C₃H₆ mass-transfer rate constant [1/s]. 0 = off. |
The two k_mt_* caps use the same serial-resistance composition as the soot
side's RegenSpec.k_mt:
Above light-off the bare Arrhenius rate grows without bound while a real
washcoat plateaus at the rate species can reach the surface. Setting these is
what lets literature-scale A values run without destabilising the
quasi-steady energy solve.
Reference magnitudes, from AVL Cruise-M's cake_regeneration_models for
C02006: A ≈ 1.11e10 kmol/(m³·s), 1.5e8 m^1.5/(kmol^0.5·s) and
0.003736 kmol/(m³·s); T_act = 5000–7998 K, i.e. Ea ≈ 42–66 kJ/mol.
[[coolant_coupling]] — gas pipe ↔ coolant pipe¶
A top-level list block. Each entry pairs one gas pipe with one coolant pipe; the two exchange heat through the gas pipe's dynamic wall.
| Field | Type | Default | Meaning |
|---|---|---|---|
gas_pipe |
str |
required | id of the gas-side pipe. It must carry [pipe.thermal_wall] with kind = "dynamic" — a static-wall pipe has no wall state for the coolant to reach. |
coolant_pipe |
str |
required | id of the coolant-side pipe. |
The coupling is cell-aligned: cell i of the gas pipe exchanges with cell
i of the coolant pipe through wall cell i. Both pipes must therefore
declare the same n_cells; they need not have the same length or area, so a
counter-flow jacket of a different physical size is expressed by choosing the
cell count to match, not the geometry.
[[coolant_coupling]]
gas_pipe = "egr_cooler_gas"
coolant_pipe = "egr_cooler_water"