4. Extracting injury criteria from simulation data

Raw simulation output — nodal displacements, element stresses, rigid-body accelerations — is not an injury criterion. A crashworthiness or occupant-safety model produces time histories for thousands of nodes and dozens of parts, but the metrics that regulators, rating programs, and internal design targets actually reference are a small set of derived scalars: HIC15, HIC36, NIC, chest deflection, chest compression rate, femur force, and a handful of others. The extraction step is where those scalars are computed from the time histories, and it is also where most reporting errors originate. This chapter covers the computation of the principal head, neck, and chest criteria, the sign and filtering conventions that govern them, and a reproducible Python workflow that turns solver output into a validated metric table.

Head injury: HIC and its variants

The Head Injury Criterion is defined over a resultant translational acceleration at the head center of gravity:

HIC = max over (t1, t2) of [ (t2 - t1) * ( (1/(t2-t1)) * ∫ a(t) dt )^2.5 ]

with the integral taken over the resultant acceleration a(t) in g, and the window t2 - t1 bounded by 15 ms (HIC15) or 36 ms (HIC36). Two implementation details dominate accuracy. First, the acceleration must be the resultant magnitude, not a single axis; computing HIC on the X component alone is a common and silent error. Second, the time history must be filtered per the applicable standard — SAE J211 channel frequency class 1000 for head acceleration — before the integral is evaluated. Filtering after computing HIC changes the answer and is not equivalent.

A direct double loop over all sample pairs is O(n²) and becomes slow on 10 kHz data. The standard efficient approach uses a cumulative integral and a two-pointer sweep, since for a fixed t1 the HIC integrand is monotonic in t2 up to the window limit:

import numpy as np

def hic(a_g, dt, window=0.015):
    a = np.asarray(a_g, dtype=float)
    n = len(a)
    # cumulative integral of acceleration (velocity-like term)
    cum = np.concatenate(([0.0], np.cumsum(a) * dt))
    best = 0.0
    t1_idx = 0
    for t2 in range(1, n):
        # advance t1 so that window constraint holds
        while (t2 - t1_idx) * dt > window:
            t1_idx += 1
        for t1 in range(t1_idx, t2):
            span = (t2 - t1) * dt
            if span <= 0:
                continue
            mean_a = (cum[t2] - cum[t1]) / span
            val = span * mean_a ** 2.5
            if val > best:
                best = val
    return best

In practice the inner loop is still quadratic; production code restricts t1 to a small neighborhood or uses a vectorized sliding-window formulation. The point for this course is that the window constraint and the mean-acceleration term must both be enforced explicitly — a frequent bug is to omit the span multiplier, which inflates HIC by orders of magnitude.

Neck injury: NIC and Nij

The Neck Injury Criterion (NIC) is used primarily in rear-impact and whiplash assessment and is defined on the relative acceleration and velocity between the head and torso at the occipital condyle level:

NIC = 0.2 * a_rel + v_rel^2

where a_rel is the relative horizontal acceleration (m/s²) and v_rel the relative horizontal velocity (m/s), both computed from the head and T1 accelerations integrated and differentiated consistently. The 0.2 coefficient carries units and must not be dropped. NIC is evaluated over the impact interval and reported as a peak; the time of the peak is as important as the value, because it indicates whether the load path is compression-dominated or extension-dominated.

For frontal and side impact, the more relevant neck metric is Nij, the normalized neck injury criterion combining axial force and bending moment:

Nij = Fz / Fzc + My / Myc

where Fzc and Myc are the critical intercept values from the applicable regulation (for a 50th-percentile male, approximately 6806 N in tension, 6160 N in compression, and 310 N·m in extension). Nij is computed separately for tension-extension, tension-flexion, compression-extension, and compression-flexion, and the reported value is the maximum of the four. Sign conventions for Fz and My must match the regulation's coordinate system; a flipped sign silently swaps tension for compression and produces a plausible but wrong Nij.

Chest deflection and compression rate

Chest deflection is the maximum inward displacement of the sternum relative to the spine, measured along the chest normal. In a finite element model this is not a single node value — it is the relative displacement between a sternum reference node and a spinal reference node, projected onto the chest normal direction. The extraction must therefore define both reference nodes and the projection axis explicitly:

def chest_deflection(sternum_xyz, spine_xyz, normal):
    rel = sternum_xyz - spine_xyz          # shape (n, 3)
    return rel @ np.asarray(normal)        # signed projection, mm

The sign convention matters: positive deflection is inward (compression), negative is outward. Report the peak compression and the time of peak, and also the rate of compression, since viscous criteria and some rating protocols use deflection rate. A deflection of 40 mm at 3 m/s is a different injury risk than 40 mm at 8 m/s, and the scalar alone hides that.

For the chest, the Viscous Criterion (VC) combines deflection and rate:

VC = max over t of [ (dD/dt) * (D(t) / D_max) ]

where D(t) is the instantaneous deflection and D_max the maximum deflection over the event. VC is expressed in m/s and is typically evaluated over the interval where deflection is between 0 and 40% of its peak, because the product is ill-conditioned near zero deflection.

Other metrics and the extraction pipeline

Femur force is the axial force along the femur axis, reported as peak compression; tibia index combines axial force and bending moment normalized by critical values. Pelvis force, abdominal pressure, and lower-extremity metrics follow the same pattern: identify the load path, project onto the anatomical axis, apply the standard's filter, and take the peak within the specified window.

The pipeline that ties these together has four stages, and each stage has a failure mode worth checking:

  • Channel identification. Map solver output channels to metric inputs by name and part ID. A renamed node set or a re-meshed part silently breaks the mapping; assert that every expected channel exists before computing.
  • Filtering. Apply the correct SAE J211 class per channel (CFC 1000 for head acceleration, CFC 600 for chest, CFC 180 for femur). Filtering must be applied to the raw time history, not to the derived scalar.
  • Computation. Evaluate each criterion over its specified window with explicit sign and unit handling. Keep the time of peak alongside the value.
  • Validation. Compare against a reference run or a hand-checked single-channel calculation. A metric table that has never been cross-checked is a liability, not a deliverable.
Unit consistency is the most common source of wrong injury values. Acceleration in g versus m/s², deflection in mm versus m, and force in N versus kN all appear in the same table. Normalize to a single unit system at ingestion and record the unit in the output column header — never rely on the reader to infer it.

The figure below shows the data flow from solver channels through filtering and criterion computation to the validated metric table, with the sign and window conventions annotated at each stage.

Solver Channels head accel (g) T1 accel (m/s²) sternum / spine xyz femur axial force SAE J211 Filter CFC 1000 — head CFC 600 — chest CFC 180 — femur filter raw, not scalar Criterion Compute HIC15 / HIC36 NIC, Nij (4 modes) deflection, VC femur force, tibia index Metric Table value + t_peak unit in header sign convention validation flag Conventions enforced at each stage • HIC uses resultant |a| in g; window 15 ms or 36 ms; span multiplier required • NIC = 0.2·a_rel + v_rel² ; a_rel in m/s², v_rel in m/s, coefficient retained • Nij sign: tension +Fz, compression −Fz ; My sign per regulation axis • Chest deflection: inward positive, projected on chest normal, mm Validation gate — reject table if any check fails 1. Every expected channel present (name + part ID) — else abort, do not fill with zero 2. Single-channel hand check: recompute one HIC on a short window and compare 3. Unit audit: all columns carry explicit units; no mixed g / m/s² in one table 4. t_peak within event window; peak outside window indicates wrong channel or filter

Worked extraction example

Consider a frontal impact model sampled at 10 kHz over 120 ms. The head acceleration channel is a resultant in g, already filtered at CFC 1000. Running the HIC routine with a 15 ms window returns a value of 612 at t_peak = 0.058 s. The chest sternum and spine nodes are projected onto the chest normal, giving a peak inward deflection of 34.2 mm at 0.071 s and a VC of 0.41 m/s. The femur axial force peaks at 4.8 kN compression. These are illustrative values for a teaching model, not measured results; the point is the shape of the output — each metric carries a value, a time, a unit, and a sign convention, and each is traceable to a named channel and filter class.

When a value looks wrong, the diagnostic order is fixed: confirm the channel exists and is the intended one, confirm the filter class and that it was applied to the raw history, confirm the unit and sign, then confirm the window. In practice the first two checks resolve most discrepancies, and the third resolves nearly all the rest. A metric table that passes the validation gate is the correct input to the automated Excel reporting stage that follows.