FREE STUDENT PILOT · LEARN BY DOING

Your First HBM Simulation with Open Tools

A practical VIVA+ head-impact case study
By Yash Kumar Vari · Student pilot v0.2 · Updated 28 September 2026

Welcome! If you have learned about stiffness matrices but have never watched your own simulation move, this project is for you. We will work through one small human body model case, understand what the solver does, and turn the results into plots and an animation. One step at a time. The skull is complicated enough; the instructions should not be.

Ready now: watch the completed smooth-run animation and reproduce the plots from the supplied CSVs. The Linux/HPC head-drop run is demonstrated. A portable, independently tested solver installation guide is still in progress; the Windows full-head route has not been tested.

Scientific status: educational solver-adaptation study. The final support force is about 15% below the experimental average. Experimental agreement and exact equivalence to the published LS-DYNA input revision are not established.

Questions from students on LinkedIn and conversations at IRCOBI 2026 motivated this guide. If you want to enter crash simulation or biomechanics and need help turning a downloaded model into something you understand, start here.

Start with the resultsWatch the simulationAsk a question

Find your way

  1. What will I learn?
  2. The five-minute background
  3. What are we simulating?
  4. The workflow in one picture
  5. Tools and model downloads
  6. Before pressing Run
  7. Starter, then Engine
  8. Check the result
  9. Make sense of the forces
  10. Make the animation
  11. Try it yourself
  12. Troubleshooting and next steps
  13. Credits and further reading

The companion project record records versions, files, modifications, known results, and remaining work.

1. What will I learn?

By the end of the finished pilot workflow, you should be able to:

What you need to know already: basic force, displacement, stress, strain, and Newton’s second law. Some familiarity with files and folders helps. You do not need to derive a brain material law before lunch.

What this project does not teach yet: building a human body mesh from medical images, whole-body sled modelling, or making reliable injury predictions. We start with an existing head submodel and learn the simulation workflow around it.

Choose your entry point

RouteWhat you doStatus
UnderstandRead the background and interpret the example.Ready now
AnalyzeUse the included CSV data and Python script to regenerate four figures; no solver or HPC needed.Tested locally
RunPrepare and run the translated head case yourself.Demonstrated on Linux/HPC; complete portable setup and Windows validation remain pending

No paid solver licence is required for the OpenRadioss route. You still need a suitable computer or permitted access to university computing resources.

Start here: reproduce the results without a solver

Download this repository as a ZIP using Code → Download ZIP, extract it, and open a terminal in the folder containing index.html. You need Python; you do not need an OpenRadioss or LS-DYNA installation for this exercise.

Windows Command Prompt

py -m venv .venv
.venv\Scripts\python.exe -m pip install -r analysis\requirements.txt
.venv\Scripts\python.exe analysis\analyze.py

Linux or macOS terminal

python3 -m venv .venv
.venv/bin/python -m pip install -r analysis/requirements.txt
.venv/bin/python analysis/analyze.py

The environment creation and installation need a working Python installation and internet access for packages. If py is not recognized on Windows, use python after confirming that it launches Python 3.

Expected outcome: four PNG/PDF figures in figures/, CSV/JSON analysis summaries in analysis/, and a printed OpenRadioss filtered peak of approximately 3.913 kN. The script overwrites derived figures and tables, while keeping input CSVs unchanged. Allow small formatting differences between operating systems.

Start by identifying the experimental mean and this simulation in the force plot. Then explain, in your own words, why support reaction and head-pad contact force are different measurements.

2. The five-minute background

FEM, FEA, and HBM: three abbreviations, one manageable start

Term In plain language Example
FEM — finite element method A way to approximate a continuous object using many smaller connected pieces Divide a skull into elements
FEA — finite element analysis Applying that method to a particular engineering problem Calculate how the skull responds during impact
HBM — human body model A numerical representation of human anatomy and its mechanical behaviour The VIVA+ head submodel used here
Node A point where quantities such as motion are described A corner of an element
Element A small region connecting nodes, with equations for its behaviour A shell or solid element
Material model A rule connecting deformation and stress, sometimes including rate or history effects Bone and soft tissue use different rules
Boundary condition A rule controlling movement or loading Hold the support in place
Contact Rules for how surfaces interact when they meet The head meets a deformable pad

Illustration of nodes, elements, and model ingredients

A simple analogy: a model needs geometry, material behaviour, loads, and constraints, much like a recipe needs ingredients, quantities, and cooking instructions. A beautiful mesh with the wrong units is still the wrong recipe.

Why does an impact calculation need so many steps?

In an explicit dynamic analysis, the solver advances the motion in very small time increments. Small elements and fast stress-wave propagation can require small increments.

In the earlier completed baseline run, a typical increment was about 0.00036 ms. That gives the following estimate for an 11 ms event:

11 / 0.00036 ≈ 30,556 increments

The earlier baseline completed 30,556 cycles in about 77 minutes. This is historical runtime evidence, not a newly measured timing for the smoother-output run or a laptop estimate.

Important: the solver increment and the saved animation interval are different. Saving a picture every 0.1 ms does not mean the solver jumps forward by 0.1 ms.

3. What are we simulating?

We use the VIVA+ 50F head-without-scalp submodel in the published Yoganandan head lateral-drop setup. The working case is named drop_3.5.

Item Working case
Body region Head submodel, not a complete occupant
Initial velocity −3.5 mm/ms along the specified Z direction
Speed magnitude 3.5 m/s
End time 11 ms
Contact Head and impact pad
Environment Deformable pad and constrained supporting structure
Our solver OpenRadioss, importing the LS-DYNA-format input
Our main outputs Energies, forces, motion, and animation files

The model is oriented and positioned by its source transformation cards. Gravity, contact, extra masses, and constraints are also part of the setup. Preserve these definitions unless an intentional, documented study requires a change.

Units: the quiet source of very loud problems

The case uses a consistent mm–ms–kg–kN system.

Quantity Model unit Familiar equivalent
Length mm 1 mm = 0.001 m
Time ms 1 ms = 0.001 s
Mass kg Kilograms
Velocity mm/ms 1 mm/ms = 1 m/s
Force kN 1 kN = 1,000 N
Energy kN·mm 1 kN·mm = 1 J
Acceleration mm/ms² Gravity magnitude ≈ 0.00981 mm/ms²

Example: the 3.5 mm/ms input speed is 3.5 m/s, not 3,500 m/s. Units save both simulations and embarrassment.

The reference run reports about 21.09 kg total model mass. This includes the setup; do not present it as the mass of a human head.

4. The workflow in one picture

Six stages from model preparation to interpretation

Stage Question to ask Evidence to keep
Prepare Do the files, units, and include paths make sense? Sources, versions, change log
Starter Can the solver read and initialise the model? Starter log and initial restart
Engine Can it advance through the requested event? Engine log and result files
Check Are the numerical results sensible? Energy, mass, timestep checks
Analyze Am I comparing the correct physical quantities? Labelled force–time plots
Visualize Can someone understand the event and its limits? Animation with units and time

A useful habit: after every stage, check the expected output before moving on. Launching the Engine repeatedly cannot repair a missing include file. We tested that lesson thoroughly so you do not have to.

5. Tools and model downloads

Use official sources. Download links are starting points, not a guarantee that the newest release reproduces this draft’s results.

Resource What it does Official link
OpenRadioss Calculates the response Website · Releases
OpenRadioss documentation Explains installation, execution, and input options Community documentation
VIVA+ Supplies the human body models and their documentation Documentation · Model repository
VIVA+ validation project Supplies the reference head-drop setup and comparison material Catalog · Repository
Python Helps read results, calculate quantities, and make plots Download · Beginner resources
ParaView Displays the mesh, motion, and result fields Download · User guide

Find these locations inside the validation archive:

Keep the archive’s folder structure. An include file is like a chapter referenced by the main book: moving the chapter without updating the reference makes it disappear from the solver’s point of view.

Compatibility reminder: reading an LS-DYNA input in another solver does not automatically give identical formulations or results. This project records the adaptation and checks the outcome.

6. Before pressing Run

Step A — keep an original and a working copy

Keep source files untouched. Make changes only in a working copy. Use a different result directory for a different study.

Suggested project folders:

Folder Contents
source/ Original downloaded files, with their original internal structure
working/ Prepared case and documented changes
results/smoke/ Short check
results/full/ Complete event
results/video/ Run with more frequent animation output
analysis/ CSV files, plots, and calculations
notes/ Versions, warnings, decisions, and observations

These are suggested names. The reference run used different cluster directories, recorded in the companion document.

Step B — record what you downloaded

Write down the archive name, release tag or commit, download date, and solver build. A filename containing main is not a fixed version: its contents may change later.

Our exact validation commit and solver build fingerprint still need to be captured before the student release. The public VIVA+ full-body version and this archived head submodel must not be assumed to be the same release.

Step C — understand the changes already made

Our working main file adds the unit declaration and corrects the head include path. Three material curves also required reordering of their existing x–y pairs to pass the input checks. That last change affects the model definition and needs engineering review; it is not simply tidying a filename.

See the input-change record before extending the case. The original preparation script is retained as a record, not a portable installer. Do not repair material curves manually without understanding their intended meaning.

Step D — use a short check first

The reference smoke test simulated 0.05 ms, took about 23 seconds, and completed 140 cycles. Its job was to check that the workflow starts. It was too short to establish that the full impact response is correct.

Which computer do I need?

The completed full run used four CPU cores on university HPC, reported about 303 MB solver memory, and took 1 hour 17 minutes. Those are measured results for that machine, not a laptop guarantee. Installation, results storage, Python, and ParaView need additional resources.

Windows instructions and a local hardware benchmark will be added after testing. For now, use the reading route or prepared results rather than guessing Windows executable names from Linux commands.

7. Starter, then Engine

OpenRadioss has two main stages. Think of the Starter as the preparation check and the Engine as the calculation.

Program What it does What to inspect
Starter Reads the input, maps supported cards, and prepares the model Errors, warnings, restart creation
Engine Advances the simulation through time Numerical output and final termination

Learn the file names

Example Meaning
main-openradioss.key Working main input in LS-DYNA keyword format
main-openradioss_0000.out Starter’s written report
main-openradioss_0000_0001.rst Prepared initial state for the Engine
main-openradioss_0001.rad Engine controls, including end time and output intervals
main-openradioss_0001.out Engine’s written report
main-openradiossT01 Time-history results: values saved over time
main-openradiossA001 One saved animation state
head_drop_history.csv Converted time-history table
main-openradiossA001.vtk Converted animation state for ParaView

Execution pattern only — not a complete installation command:

Starter → main-openradioss.key → initial restart
Engine  → main-openradioss_0001.rad + initial restart → results

On the cluster, Slurm schedules the calculation. sbatch submits a batch job; squeue shows its status. This is the cluster’s queue manager, not part of the physics model. A local computer does not require Slurm.

The reference full Engine run finished with NORMAL TERMINATION. That confirms completion. It does not certify the physics. A solver can finish a very confident calculation of a badly defined problem.

8. Check the result

Read the progress line

An illustrative log line based on the reference run:

NC=11300  T=4.0680E+00  DT=3.6000E-04  ERR=-0.3%  DM/M=0.0000E+00
Label Meaning here
NC Cycle count: 11,300 increments completed
T Simulated time: 4.068 ms
DT Current increment: 0.00036 ms
ERR Solver-reported energy error indicator; inspect with the energy histories
DM/M Relative added-mass indicator; zero at this reported point

3.6000E-04 means 0.00036. Scientific notation looks intimidating until you realise it mostly saves typing zeros.

Five checks before celebrating

  1. Completion: did the run reach the intended end time?
  2. Finite values: do energies, forces, and masses remain numeric, without NaN or infinity?
  3. Energy behaviour: can you explain how kinetic energy becomes deformation energy and other contributions?
  4. Mass and timestep: are added mass or a collapsing timestep influencing the result?
  5. Motion: does the head contact the intended surface, with sensible constraints and deformation?

Our earlier, failed whole-body runs showed NaN in the Engine logs but repeated 0.5 values in several converted CSV columns. Therefore “all CSV values are finite” was not sufficient. An isolated value of 0.5 can be perfectly valid; repeated identical values across unrelated signals deserve investigation. This is an observed diagnostic clue, not a universal converter rule.

A simple energy example

For a hypothetical 2 kg object moving at 3 m/s:

kinetic energy = ½ × mass × speed² = ½ × 2 × 3² = 9 J

When it hits a pad, some motion slows and the pad deforms. You expect kinetic energy and internal energy to change together, with external work, contact, damping, and other terms included in the balance.

Do not insist that kinetic energy must always be tiny compared with internal energy: this is a dynamic impact, not a quasi-static loading exercise.

9. Make sense of the forces

First identify where the experimental measurement was taken. For this reference, compare the reaction at the rigid support beneath the pad.

SignalDefinitionFinal-run raw peak
Head-pad normal contact forceInterface 100000; resultant of FNX, FNY, FNZ only3.135 kN
Support reactionNode 9041005 of rigid support part 100003; resultant of REACX, REACY, REACZ3.918 kN

The pad is a dynamic system, so the two forces need not match at every instant. A resultant is sqrt(Fx² + Fy² + Fz²); retain signed components when direction matters.

Final smooth-run force comparison

Final support reaction against the experimental corridor and published LS-DYNA curves
Published references: VIVA+ Yoganandan head-drop validation catalog. OpenRadioss: this educational adaptation.
CurvePeak forcePeak time on comparison axis
Experimental average4.601 kN3.325 ms
Published LS-DYNA, cortical MAT1244.785 kN3.110 ms
Published LS-DYNA, cortical MAT814.825 kN3.260 ms
This OpenRadioss run, CFC10003.913 kN4.960 ms

Finding: the filtered OpenRadioss peak is 14.95% lower and 1.635 ms later than the experimental average on this comparison axis; the pulse shape also differs. This is a descriptive comparison, not a validation pass/fail criterion.

Filtering and the time axis

OpenRadioss support-force X/Y/Z components are resampled onto a uniform grid, filtered individually with CFC1000 using Dynasaur 1.3.18, then combined into a resultant. Published LS-DYNA CSVs are already processed and are not filtered again. The raw peak is 3.918 kN; filtering changes it only slightly, so it does not explain the mismatch.

The comparison follows the reference notebook by plotting simulation time minus 1 ms. Experimental times remain unchanged. Equal physical contact onset has not been independently established. No curve is shifted to align its peak. Energy and motion plots use original simulation time.

Energy and motion checks

Final-run energy histories and added mass
Initial kinetic energy: 21.521 J. Final internal energy: 18.868 J; final kinetic energy: 2.916 J. The energy channels are diagnostics, not a reconstructed complete balance.

All 1,100 × 647 numeric values are finite. Total mass is 21.086 kg, including the support/setup; it is not head mass alone. Added mass is approximately zero. Peak absolute hourglass energy is approximately 0.149% of initial kinetic energy. These checks support interpretation but do not establish experimental agreement.

Global displacement, velocity and filtered resultant acceleration at node 1090010

Displacement and velocity describe node 1090010; head displacement includes rigid motion and must not be labelled skull deformation. Its resultant acceleration uses component-wise CFC1000 filtering: approximately 96.5 g at 6.12 ms, versus a raw peak of 179.5 g. This is a nodal response, not an injury prediction. The selected filter is a head-impact processing convention; full SAE channel compliance has not been established.

See the larger acceleration plot and method detailsRaw and CFC1000 resultant head acceleration

The acceleration routine uses SAE J211-style coefficients with forward/backward filtering and documented endpoint reflection. Its endpoint handling differs from the legacy Dynasaur force routine. See METHODS.md for sampling, padding and source details.

What could explain the solver difference?

OpenRadioss translates LS-DYNA keywords to its own formulations. In our Starter report, the pad’s MAT_063 becomes LAW33. The original pad input includes Poisson’s ratio 0.43; LAW33 theory describes uncoupled stresses and zero Poisson effect before full compaction. This gives us a concrete material-behaviour question to investigate.

Checks of the imported listing preserved the pad density, elastic modulus and 113 curve-11 point values, with a strain-sign conversion; the detailed friction law retains 0.7. Curves 10, 112 and 150 were reordered elsewhere; the active pad material references curve 11. Those facts narrow the investigation, but they do not establish the cause of the full-head mismatch.

A separate one-element compression test was used to investigate lateral motion and unloading. Its results remain a research observation requiring controls, including PR=0 tests, element-formulation checks and a pad-only intervention in the head case. Contact, other mapped materials and reference revision differences remain possible contributors. Documented LAW33 behaviour is not itself evidence of a software bug.

Sources: MAT_063 mapping · LAW33 theory. Confirm the current mapping for your exact solver build.

10. Make the animation

The smoother run has completed. Its verified export contains 111 frames, shown at 24 fps in 1560 × 780 resolution. The supplied video repeats the same simulation five times: 23.125 seconds of slow-motion playback, not five independent tests. Repetitions were made without re-encoding.

VIVA+ 50F head lateral drop, initial speed 3.5 m/s. Educational OpenRadioss adaptation; displacement colour range fixed at 0–20 mm.

Animation output was requested every 0.1 ms. The solver still advances at its much smaller time increment. Frame indices 0–110 are not milliseconds.

Illustration of solver increments versus animation output

Demonstrated conversion syntax on Linux, after the tools are installed and available in the current directory or command path:

th_to_csv_linux64_gf main-openradiossT01 head_drop_history
anim_to_vtk_linux64_gf main-openradiossA001 > main-openradiossA001.vtk

The first command produces head_drop_history.csv. The second converts one animation state. Our cluster used full executable paths and Slurm; these short examples explain the syntax rather than replace the pending portable setup instructions.

In ParaView

  1. Open the grouped .vtk file sequence using File → Open.
  2. Click Apply so ParaView loads the data.
  3. Choose a useful view and play the sequence.
  4. If available, colour by displacement magnitude and label it in mm. NODE_ID is an identifier, not a physical response.
  5. Keep one colour range across the animation so colours have consistent meaning.
  6. Save the view with File → Save State.
  7. Export with File → Save Animation. MP4 availability depends on the installed build; a PNG image sequence is another export route.

Before sharing: show the case name, initial speed, displayed quantity and unit, and correct physical time. If ParaView shows frame numbers 0, 1, 2, …, do not label those numbers “ms.” Actual timestamps need to be assigned or verified.

At 24 frames/s, 111 saved states play in about 4.6 seconds. This is slow-motion playback of an 11 ms event. Repeating frames can make the clip longer but does not create new simulation information.

11. Try it yourself

Task Your answer should show
Convert 3.5 mm/ms to m/s Understanding of consistent units
Estimate cycles for 11 ms at 0.00036 ms Difference between physical time and computation
Explain the two force signals Awareness of the measurement location
Find peak force and its time Ability to extract a meaningful result
Identify one limitation Scientific judgment
Create a labelled 10-second presentation clip Clear communication; slow playback or looping is fine if labelled
Check the first two answers 3.5 mm/ms equals 3.5 m/s. The estimated cycle count is about 30,556. Actual timesteps may vary, so this is an estimate, not an instruction to force that exact count.

Your final mini-report can be one page: question → model → checks → result → limitation. A classmate should be able to understand it without decoding your terminal history.

12. Troubleshooting and next steps

Symptom First useful action
Include file not found Confirm the file exists and inspect the include path relative to the case
Missing shared library on Linux Follow the solver environment setup; do not repeatedly rerun the same command
Function-read error Read the full curve ID and error description; inspect a working copy and seek help before changing data
Starter writes no restart Resolve Starter errors before launching the Engine
Normal termination but suspicious results Inspect the log, energies, mass, and motion together
Animation barely moves between frames Check the saved-state interval and displayed sequence
Command not found after pasting Copy the command only, without the terminal prompt or previous output
Downloaded archive will not extract Check download completion; do not assume it is a model error

What is ready, and what comes next?

Student questions and feedback

Use GitHub Discussions → Q&A for learning questions. Use Issues for broken instructions, missing files or a reproducible error. Your question may help the next student too.

Ask in DiscussionsReport an issueOpen repository

When this page is hosted on the standard GitHub Pages address, these buttons connect to the matching repository automatically. In an offline copy, use the Discussions or Issues tab in the repository you downloaded.

Include this with your question

Operating system and tool versions:
Guide section / step:
What I expected:
What happened:
Exact error text:
What I already tried:

Remove credentials and private paths from logs. Student feedback is welcome; this is a pilot guide, and the author’s response time is not guaranteed.

13. Credits and further reading

This educational workflow is being prepared by Yash Kumar Vari. VIVA+ developers created the human body model, and the validation contributors supplied the published test setup and reference material. The project adapts and documents execution and analysis with OpenRadioss, Python, and ParaView.

Retain each source file’s licence and notices. This draft does not relicense the model or reference data. It is an independent educational project and does not imply endorsement by Audi, VIVA+, or the software providers.

Your first goal: understand one result well enough to explain it. More elements can wait.

Project record · v0.2

This update uses the completed smooth-run history head_drop_final_history.csv. It supersedes the earlier unfiltered 3.92 kN estimate. The full quantitative methods are in METHODS.md; input changes are in inputs/README.md.

ItemRecorded evidenceLimit
SourceVIVA+ validation archive; published notebook says 2.0.0 beta 1 / LS-DYNA R12.1Exact archive commit is not established.
OpenRadiossLinux GNU double-precision Starter/Engine; baseline 0 errors and 11 warningsExact build/executable hashes still needed; copyright year is not a version.
Final history1,100 rows × 647 columns; all finite; last saved time 10.99029 msHistory need not include the requested 11 ms endpoint.
Final animation111 frames at 24 fps; 1560 × 780; five repeatsFrame count and playback time are not physical timestamps.
Input changesUnits, head include path, curves 10/112/150 reordered in a separate setupPreserved point pairs do not guarantee preserved material interpretation.
Pad mappingMaterial 10, active curve 11, MAT_063 → LAW33Requires controlled material and system tests; not a proven explanation of all discrepancy.

The original baseline ran on four HPC CPU cores and reported about 303 MB solver memory and 77 minutes runtime. Those measurements exclude additional storage and postprocessing needs and are not performance guarantees for the final animation run or another machine.

Source hashes: included analysis inputs are recorded in analysis/input_sha256.json. The original setup used for the cube material extraction had SHA-256 405f25d20c07b6ed1b856d31d6ecba94334f5c19ec2594367947738ed6134c53. This identifies those bytes, not the unknown upstream commit.