1. Baseline Airbag Inflation Model Setup

Why a Baseline Model Comes First

Every optimization study needs a fixed reference point. Before sweeping vent diameters or calibrating a gas generator, you need a model that is simple enough to reason about, yet faithful enough that its outputs — peak bag pressure and fill time — respond to parameter changes in a physically meaningful way. This case builds that reference: a single gas generator feeding a single airbag volume through a single vent hole, described by a lumped-parameter (0-D) control-volume model.

The lumped-parameter assumption treats the bag as one uniform pressure and temperature state. That is a deliberate simplification: it discards spatial gradients and fabric folding, but it preserves the two quantities that dominate occupant-restraint performance — how fast the bag fills and how high the pressure peaks. For a baseline, this is the right trade-off.

Model Structure and Governing Equations

The model has three coupled states: gas mass in the bag m [kg], bag internal energy U [J], and bag volume V [m³]. The gas generator supplies mass at a prescribed rate; the vent hole removes mass; the bag volume grows as pressure acts on the fabric.

Mass balance:

dm/dt = mdot_gen(t) - mdot_vent(t)

Vent flow is modeled as compressible orifice flow. For the subsonic branch (bag pressure p above ambient p_amb but below the critical ratio):

mdot_vent = Cd * A_vent * p / sqrt(R * T) * sqrt( 2*gamma/(gamma-1) * ( (p_amb/p)^(2/gamma) - (p_amb/p)^((gamma+1)/gamma) ) )

When p_amb/p <= (2/(gamma+1))^(gamma/(gamma-1)) the flow is choked and the bracket collapses to the critical-flow constant. Energy balance with an ideal-gas closure gives temperature, and pressure follows from the ideal gas law:

p = m * R * T / V

Volume growth is driven by the pressure difference across the fabric, integrated against an effective stiffness:

dV/dt = (p - p_amb) / K_eff   (while p > p_amb, else 0)

This is a first-order fill law, not a membrane solve — appropriate for a baseline where the goal is a stable, tunable reference rather than fabric-accurate deployment.

Baseline Parameters

The table below defines the reference parameter set. These are teaching values chosen to produce a physically plausible fill in the 30–60 ms range; they are not measured data from a specific inflator.

SymbolParameterBaseline valueUnit
m_totalTotal gas generator mass0.060kg
t_burnBurn duration0.040s
mdot_genGenerator mass flow (constant)1.50kg/s
A_ventVent hole area3.0e-4m²
CdVent discharge coefficient0.80–
V_0Initial bag volume0.005m³
K_effEffective fill stiffness2.0e5Pa·s/m³
T_gasGenerator gas temperature900K
RSpecific gas constant287J/(kg·K)
gammaRatio of specific heats1.40–
p_ambAmbient pressure101325Pa

Reference Implementation

The model is small enough to integrate with an explicit fixed-step solver. The code below is self-contained: it defines the parameters, the derivative function, a forward-Euler integrator, and the two metrics the baseline must record.

import math

# --- Baseline parameters ---
m_total  = 0.060      # kg
t_burn   = 0.040      # s
mdot_gen = m_total / t_burn
A_vent   = 3.0e-4     # m^2
Cd       = 0.80
V0       = 0.005      # m^3
K_eff    = 2.0e5      # Pa*s/m^3
T_gas    = 900.0      # K
R        = 287.0      # J/(kg*K)
gamma    = 1.40
p_amb    = 101325.0   # Pa

def vent_mass_flow(p, T):
    if p <= p_amb:
        return 0.0
    ratio = p_amb / p
    crit  = (2.0 / (gamma + 1.0)) ** (gamma / (gamma - 1.0))
    if ratio <= crit:
        # choked flow
        term = math.sqrt(gamma / (R * T)) * (2.0 / (gamma + 1.0)) ** ((gamma + 1.0) / (2.0 * (gamma - 1.0)))
    else:
        term = math.sqrt(2.0 * gamma / ((gamma - 1.0) * R * T) *
                         (ratio ** (2.0 / gamma) - ratio ** ((gamma + 1.0) / gamma)))
    return Cd * A_vent * p * term

def derivatives(t, m, T, V):
    mdot_in  = mdot_gen if t < t_burn else 0.0
    mdot_out = vent_mass_flow(m * R * T / V, T)
    dm = mdot_in - mdot_out
    # energy: generator gas enters at T_gas, vent removes at bag T
    cp = gamma * R / (gamma - 1.0)
    dU = mdot_in * cp * T_gas - mdot_out * cp * T
    # ideal gas: U = m * cv * T  ->  dT from dU and dm
    cv = R / (gamma - 1.0)
    dT = (dU - cv * T * dm) / (m * cv)
    p  = m * R * T / V
    dV = (p - p_amb) / K_eff if p > p_amb else 0.0
    return dm, dT, dV

def simulate(dt=1e-5, t_end=0.120):
    m, T, V = 1e-6, 300.0, V0
    t, p_peak, t_fill = 0.0, 0.0, None
    V_target = 0.060   # 60 L deployed volume
    while t < t_end:
        dm, dT, dV = derivatives(t, m, T, V)
        m += dm * dt; T += dT * dt; V += dV * dt
        t += dt
        p = m * R * T / V
        p_peak = max(p_peak, p)
        if t_fill is None and V >= V_target:
            t_fill = t
    return p_peak, t_fill

p_peak, t_fill = simulate()
print(f"peak pressure = {p_peak/1000:.1f} kPa")
print(f"fill time     = {t_fill*1000:.1f} ms")

Run this and you obtain the two baseline numbers. With the parameters above, the expected output is on the order of peak pressure ≈ 210–230 kPa and fill time ≈ 35–45 ms. These are illustrative results from the stated inputs, not measured inflator data — treat them as the reference your later sweeps will move away from.

The initial mass 1e-6 kg and temperature 300 K avoid a divide-by-zero in the temperature derivative at t=0. Keep them small but nonzero; setting them to exactly zero will produce NaN on the first step.

Reading the Baseline Behavior

The SVG below shows the coupled signal path and the expected qualitative shape of the two recorded metrics. The key structural insight is that the generator and the vent act on the same mass state in opposition: the generator raises mass and temperature, the vent removes mass and carries away enthalpy, and the volume growth converts pressure into displacement. Peak pressure occurs near the end of the burn, when inflow is still high but the vent has not yet caught up; fill time is governed by the integral of volume growth, which lags pressure because dV/dt depends on the pressure excess over ambient.

Gas Generator mdot_gen = 1.5 kg/s t_burn = 40 ms, T = 900 K Bag Control Volume states: m, T, V p = mRT / V V0 = 5 L, K_eff = 2e5 Vent Hole A_vent = 3.0e-4 m² Cd = 0.80, choked/subsonic + mass, + enthalpy − mass, − enthalpy Recorded Metrics p_peak ≈ 220 kPa, t_fill ≈ 40 ms integrate dm, dT, dV Pressure vs. time peak Volume vs. time V_target = 60 L

Verification and Failure Symptoms

A baseline is only useful if it is stable and reproducible. Check three things before accepting it as the reference:

  • Step-size independence. Halve dt from 1e-5 to 5e-6; peak pressure and fill time should change by less than about 1%. If they drift more, the explicit Euler step is too coarse for the burn transient.
  • Mass conservation. At t = t_end, the mass remaining in the bag plus the mass vented should equal m_total to within numerical tolerance. A mismatch points to a sign error in the vent term.
  • Monotonic volume. V should never decrease while p > p_amb. A decreasing volume means the pressure-excess term is being applied with the wrong sign.
Common failure symptoms: NaN on the first step (zero initial mass or temperature); pressure that rises without bound (vent flow returning zero because p <= p_amb is evaluated before the pressure is updated); fill time reported as None (target volume never reached — check K_eff and V_target are consistent).

Baseline Record Card

Record the following so every later case has a fixed comparison point. Fill in the values your run produces.

FieldValue to record
Model type0-D lumped control volume, single generator, single vent
IntegratorForward Euler, dt = 1e-5 s, t_end = 0.120 s
Peak bag pressure______ kPa (expected ≈ 210–230)
Fill time to 60 L______ ms (expected ≈ 35–45)
Mass balance residual______ kg (should be ≈ 0)
Step-size checkΔp_peak < 1% at dt/2: pass / fail

Once these numbers are recorded and the three checks pass, the baseline is locked. Any later change to vent area, generator profile, or stiffness is measured against this card, which is exactly what makes the following optimization cases interpretable.