2. PAM-CRASH model architecture for production

A production-grade PAM-CRASH model is not a single input file. It is a structured, version-controlled assembly of decks, includes, and material libraries that must remain traceable from the first CAD release to the final sign-off run. This section defines the architecture that makes that traceability possible: how decks are organized, how the include hierarchy is layered, how unit systems are locked, and how the assembled model is versioned so that any result can be reproduced exactly.

Deck Organization: One Master, Many Modules

The recommended production layout separates the model into a thin master deck and a set of functional module decks. The master deck contains only control cards, unit declarations, include statements, and run-level switches. It contains no geometry, no mesh, and no material data. Every physical subsystem — body-in-white, closures, powertrain, suspension, interior, barrier, dummy, and restraint — lives in its own module deck.

A typical directory structure for a frontal impact program looks like this:

model_root/
  master/
    run_main.key
    units.inc
    controls.inc
  modules/
    01_biw/
      biw_mesh.inc
      biw_props.inc
    02_closures/
      hood.inc
      doors.inc
    03_powertrain/
      engine.inc
      mounts.inc
    04_suspension/
      front_susp.inc
      rear_susp.inc
    05_interior/
      seats.inc
      ip.inc
    06_restraints/
      belts.inc
      airbags.inc
    07_barrier/
      barrier_rigid.inc
    08_dummy/
      dummy_hybrid3.inc
  library/
    materials/
      steel_hsla.lib
      aluminum.lib
    sections/
      sections_std.lib
  runs/
    R2024_11_05_baseline/
    R2024_11_12_seat_update/

The master deck references modules through include statements in a fixed order. That order matters: nodes and elements must exist before they are referenced by constraints, and contact definitions must appear after all surfaces are defined. A stable include order is therefore part of the architecture, not an incidental detail.

Include Hierarchy and Resolution Rules

PAM-CRASH resolves includes relative to the working directory of the solver, not relative to the including file. In production this is a frequent source of failure when a model is moved between machines. The standard mitigation is to declare a single root variable and build every include path from it, or to run the solver from model_root/ and use paths relative to that root.

The include hierarchy should be shallow — three levels maximum. A deep chain of includes makes it impossible to answer "which file defines this element?" without opening every file. The recommended layering is:

  • Level 0 — master: run_main.key, includes units, controls, and the module list.
  • Level 1 — modules: one include per subsystem, each self-contained.
  • Level 2 — library: material and section libraries included by modules, never by the master.

Modules must not include each other. If the suspension needs a material from the library, it includes the library file directly. Cross-module includes create hidden coupling and break independent versioning.

Keep every include path relative to model_root/. Absolute paths will break the moment the model is archived or moved to a compute cluster.

Unit System: Declare Once, Verify Everywhere

PAM-CRASH does not enforce a unit system. It computes with whatever numbers you provide. A model that mixes millimetres with metres, or tonnes with kilograms, will run to completion and produce plausible-looking but wrong results. The only defence is a declared, documented, and verified unit system.

The two common production systems are:

QuantitySystem A (mm-tonne-s)System B (m-kg-s)
Lengthmmm
Masstonnekg
Timess
ForceNN
StressMPaPa
Densityt/mm³ (7.85e-9 for steel)kg/m³ (7850 for steel)
Young's modulusMPa (210000 for steel)Pa (2.1e11 for steel)

System A is the de facto standard for automotive crash models because mesh coordinates are naturally in millimetres. The critical check is density: steel at 7.85e-9 t/mm³, not 7850. A density off by 10⁹ produces a model that either explodes or barely moves.

Verification is done with a single-element or single-part check run before the full assembly. Apply a known load, compare the computed displacement or frequency against the hand calculation, and confirm the unit system is consistent. This takes minutes and prevents days of debugging.

Version-Controlled Model Assembly

Version control for CAE models is not the same as version control for source code. Binary result files, large meshes, and solver outputs do not belong in the repository. The production pattern is to version the text decks and the assembly manifest, and to store meshes and results in a separate artifact store referenced by hash.

Each run directory contains a manifest that records exactly which revision of each module was used:

# runs/R2024_11_12_seat_update/manifest.yaml
run_id: R2024_11_12_seat_update
solver: PAM-CRASH 2024.0
units: mm-tonne-s
modules:
  biw:        git:abc1234
  closures:   git:def5678
  powertrain: git:abc1234
  suspension: git:abc1234
  interior:   git:9ab0cde
  restraints: git:9ab0cde
  barrier:    git:abc1234
  dummy:      git:abc1234
library:
  materials:  git:1122334
  sections:   git:1122334
mesh_artifacts:
  biw_mesh:   sha256:7f3a...
  dummy_mesh: sha256:2c9b...

The manifest is the single source of truth for reproducibility. Given a manifest, the assembly script checks out the exact revisions, resolves the include paths, and produces a runnable master deck. No manual file copying, no "latest version" ambiguity.

Never edit a module deck directly inside a run directory. Runs are read-only assemblies. All changes go back to the module repository, get a new revision, and are pulled into a new run.

Assembly Workflow and Verification

The assembly workflow has four stages: checkout, resolve, validate, and freeze. Checkout pulls the revisions named in the manifest. Resolve expands the include hierarchy into a single flattened deck for the solver. Validate runs structural checks — orphan nodes, duplicate IDs, missing materials, unit consistency, and include path resolution. Freeze writes the flattened deck and its hash into the run directory, making the run immutable.

Validation is where most production defects are caught. The checks that matter most are: every element references an existing property, every property references an existing material, no duplicate node or element IDs across modules, and all include paths resolve from the run root. A model that passes these checks is structurally sound; whether it is physically correct is a separate question answered by the solver.

PAM-CRASH Production Model Assembly Architecture Master Deck run_main.key units.inc controls.inc no geometry, no materials Module Decks (Level 1) 01_biw 02_closures 03_powertrain 04_suspension 05_interior 06_restraints 07_barrier / 08_dummy self-contained, no cross-includes Library (Level 2) materials/steel_hsla.lib materials/aluminum.lib sections/sections_std.lib Assembly Pipeline 1. Checkout 2. Resolve 3. Validate 4. Freeze manifest.yaml records git revisions + mesh hashes → reproducible run

Practical Failure Modes and Their Symptoms

Three failure modes account for most production assembly problems. First, unit mismatch: the model runs but displacements are off by orders of magnitude, or the time step collapses to near zero. Check density and Young's modulus first. Second, include path failure: the solver reports a missing file, or worse, silently reads a stale file from a different directory. Always run from model_root/ and verify resolved paths in the validation log. Third, duplicate IDs: two modules define the same node or element ID, and the solver overwrites one with the other. The symptom is a part that appears to have no stiffness or a contact that never activates. The validation stage must check ID ranges per module and enforce non-overlapping allocation.

ID range allocation is part of the architecture. Assign each module a fixed numeric block — for example, BIW nodes 100000–199999, closures 200000–299999, and so on. This makes duplicates impossible by construction and makes it trivial to trace any element back to its owning module.

Summary

A production PAM-CRASH model is an assembly, not a file. The master deck declares units and controls; module decks own geometry and properties; the library owns materials and sections; the manifest records exact revisions; the assembly pipeline checks out, resolves, validates, and freezes. Unit systems are declared once and verified with a single-element check. ID ranges are allocated per module. Include paths are relative to a single root. Follow this architecture and any result can be reproduced from its manifest; skip it and every result becomes an unrepeatable one-off.