Abdominal Impact (Hardy 2001)#
Model validation information
Performed by : Johan Iraeus
Reviewed by : Matej Kranjec
Added to VIVA+ Validation Catalog on 2022-06-28 by Johan Iraeus
Version |
Date |
Performed by |
LS-Dyna |
|---|---|---|---|
0.3.2 |
2022-06-28 |
Johan Iraeus |
9.2.1 |
0.3.2 |
2022-07-05 |
Johan Iraeus |
9.2.1 |
1.1.1 |
2024-05-22 |
Matej Kranjec |
12.2.1 |
© 2019-2024, OpenVT Organization (OVTO)
Available openly under under Creative Commons Attribution 4.0 International License 
Experiment by Hardy et al. (2001)#
Summary:#
The simulated outputs are compared to the references from PMHS tests reported by Hardy et al. (2001).
Hardy, W. N., Schneider, L. W., and Rouhana, S. W. (2001). Abdominal impact response to rigid-bar, seatbelt, and airbag loading. Stapp Car Crash J 45, 1–32.

(figure shows aligned impactors for easier visualisation)
Experiment#
Information on the subjects/specimens used for the validation#
2 female specimens (average age: 89 yrs, average mass: 55 kg, average height: 165 cm)
4 male specimens (average age: 79 yrs, average mass: 76 kg, average height: 175 cm)
Loading and Boundary Conditions#
Low-Speed (LS=6.3m/s) and High-Speed (HS=9.2m/s) impacts at the mid position according to the paper (approximately at the level of L3).
Positioning#
The VIVA+ model is rotated 23 degress forward to reach an upright posture. No contact is modelled between arms and impactors.
Responses recorded#
The reference values from the paper were digitalised and are incuded in the package. The data corresponds to the unnormalised corridors.
Simulation Energies#
Show code cell source
# fig_energy, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2,2)
fig_energy, (ax1, ax2, ax3, ax4) = plt.subplots(1,4, figsize=(10,5))
fig_energy.suptitle('Model Energies', y=1.02)
#ax.set_title('Simulation #1')
ax1.set_ylabel('Energies (J)')
ax1.set(title='50F 6.3 m/s', xlabel='time (ms)')
ax2.set(title='50M 6.3 m/s', xlabel='time (ms)')
ax3.set(title='50F 9.2 m/s', xlabel='time (ms)')
ax4.set(title='50M 9.2 m/s', xlabel='time (ms)')
ax1.plot(simData_50F.MODEL.Hourglass_Energy.time, simData_50F.MODEL.Hourglass_Energy.energy, label="Hourglass Energy")
ax1.plot(simData_50F.MODEL.Internal_Energy.time, simData_50F.MODEL.Internal_Energy.energy, label="Internal Energy")
ax1.plot(simData_50F.MODEL.Kinetic_Energy.time, simData_50F.MODEL.Kinetic_Energy.energy, label="Kinetic Energy")
ax1.plot(simData_50F.MODEL.Total_Energy.time, simData_50F.MODEL.Total_Energy.energy, label="Total Energy")
ax1.plot(simData_50F.MODEL.Added_Mass.time, simData_50F.MODEL.Added_Mass.mass, label="Added Mass")
# ax1.plot(simData_50F.Bone.Disp_x.time, simData_50F.Bone.Disp_x.displacement, label="Displacement")
# ax1.plot(simData_50F.Bone.Rigid_x.time, simData_50F.Bone.Rigid_x.displacement, label="Displacement")
# ax1.plot(simData_50F.Impactor.Force_x.time, simData_50F.Impactor.Force_x.force, label="Force X")
ax2.plot(simData_50M.MODEL.Hourglass_Energy.time, simData_50M.MODEL.Hourglass_Energy.energy)#, label="Hourglass Energy")
ax2.plot(simData_50M.MODEL.Internal_Energy.time, simData_50M.MODEL.Internal_Energy.energy)#, label="Internal Energy")
ax2.plot(simData_50M.MODEL.Kinetic_Energy.time, simData_50M.MODEL.Kinetic_Energy.energy)#, label="Kinetic Energy")
ax2.plot(simData_50M.MODEL.Total_Energy.time, simData_50M.MODEL.Total_Energy.energy)#, label="Total Energy")
ax2.plot(simData_50M.MODEL.Added_Mass.time, simData_50M.MODEL.Added_Mass.mass)#, label="Added Mass")
# ax2.plot(simData_50M.Bone.Disp_x.time, simData_50M.Bone.Disp_x.displacement, label="Displacement")
# ax2.plot(simData_50M.Bone.Rigid_x.time, simData_50M.Bone.Rigid_x.displacement, label="Displacement")
# ax2.plot(simData_50M.Impactor.Force_x.time, simData_50M.Impactor.Force_x.force, label="Force X")
ax3.plot(simData_50F_2.MODEL.Hourglass_Energy.time, simData_50F_2.MODEL.Hourglass_Energy.energy)#, label="Hourglass Energy")
ax3.plot(simData_50F_2.MODEL.Internal_Energy.time, simData_50F_2.MODEL.Internal_Energy.energy)#, label="Internal Energy")
ax3.plot(simData_50F_2.MODEL.Kinetic_Energy.time, simData_50F_2.MODEL.Kinetic_Energy.energy)#, label="Kinetic Energy")
ax3.plot(simData_50F_2.MODEL.Total_Energy.time, simData_50F_2.MODEL.Total_Energy.energy)#, label="Total Energy")
ax3.plot(simData_50F_2.MODEL.Added_Mass.time, simData_50F_2.MODEL.Added_Mass.mass)#, label="Added Mass")
ax4.plot(simData_50M_2.MODEL.Hourglass_Energy.time, simData_50M_2.MODEL.Hourglass_Energy.energy)#, label="Hourglass Energy")
ax4.plot(simData_50M_2.MODEL.Internal_Energy.time, simData_50M_2.MODEL.Internal_Energy.energy)#, label="Internal Energy")
ax4.plot(simData_50M_2.MODEL.Kinetic_Energy.time, simData_50M_2.MODEL.Kinetic_Energy.energy)#, label="Kinetic Energy")
ax4.plot(simData_50M_2.MODEL.Total_Energy.time, simData_50M_2.MODEL.Total_Energy.energy)#, label="Total Energy")
ax4.plot(simData_50M_2.MODEL.Added_Mass.time, simData_50M_2.MODEL.Added_Mass.mass)#, label="Added Mass")
fig_energy.tight_layout(pad=0.1)
fig_energy.legend(loc='center left', bbox_to_anchor=(1, 0.5));
Show code cell source
fig_cont, (ax1, ax2) = plt.subplots(1,2, figsize=(10,5))
fig_cont.suptitle('Contact Force Impactor - HBM', y=1.02)
ax1.set_ylabel('Force (kN)')
ax1.set(title='6.3 m/s', xlabel='time (ms)')
ax2.set(title='9.2 m/s',xlabel='time (ms)')
ax1.plot(simData_50F.IMPACTOR.Force_x.time, simData_50F.IMPACTOR.Force_x.force, label = "VIVA+ 50F", **plot50F)
ax1.plot(simData_50M.IMPACTOR.Force_x.time, simData_50M.IMPACTOR.Force_x.force, label = "VIVA+ 50M", **plot50M)
ax1.plot(experiment['Time-F_GI3 M'], experiment['Force_GI3 M'], label = "Experiment 6.3m/s GI3 M", **plotExperimentMale)
ax1.plot(experiment['Time-F_GI4 F'], experiment['Force_GI4 F'], label = "Experiment 6.3m/s GI4 F", **plotExperimentFemale)
ax1.plot(experiment['Time-F_GI6 M'], experiment['Force_GI6 M'], label = "Experiment 6.3m/s GI6 M", **plotExperimentMale2)
ax2.plot(simData_50F_2.IMPACTOR.Force_x.time, simData_50F_2.IMPACTOR.Force_x.force, **plot50F)#, label = "50 F")
ax2.plot(simData_50M_2.IMPACTOR.Force_x.time, simData_50M_2.IMPACTOR.Force_x.force, **plot50M)#, label = "50 M")
ax2.plot(experiment['Time-F_GS7 M'], experiment['Force_GS7 M'], label = "Experiment 9.2m/s GS7 M", **plotExperimentMale)
ax2.plot(experiment['Time-F_GS8 M'], experiment['Force_GS8 M'], label = "Experiment 9.2m/s GS8 M", **plotExperimentMale2)
ax2.plot(experiment['Time-F_GS9 F'], experiment['Force_GS9 F'], label = "Experiment 9.2m/s GS9 F", **plotExperimentFemale)
ax2.set_ylim(0,13)
ax2.set_xlim(0,100)
ax1.set_ylim(0,13)
ax1.set_xlim(0,100)
fig_cont.tight_layout(pad=0.5)
fig_cont.legend(loc='center left', bbox_to_anchor=(1, 0.5));
plt.show()
Show code cell source
fig_fd, (ax1, ax2) = plt.subplots(1,2, figsize=(10,5))
#fig_, ((ax1, ax2)) = plt.subplots(2, figsize=(5,5))
fig_fd.suptitle('Force - Displacement', y=1.02)
ax1.set_ylabel('Force (kN)')
ax2.set_ylabel('Force (kN)')
ax1.set(title='6.3 m/s', xlabel='displacement (mm)')
ax2.set(title='9.2 m/s', xlabel='displacement (mm)')
#displ = simData_50F.Bone.Rigid_x.displacement - simData_50F.Bone.Disp_x.displacement
#ax1.plot(simData_50F.Bone.Rigid_x.time, displ, label = "Displacement 50F", **plot50F)
#df = pd.read_csv("Hardy_Bar_Impact.csv", header=1, delimiter=';', decimal=',')
x=experiments_s['Displacement_GI3 M']
y=df10['Force_GI3 M']
x2=df10['Displacement_GI4 F']
y2=df10['Force_GI4 F']
x3=df10['Displacement_GI6 M']
y3=df10['Force_GI6 M']
displacement_sim_50F=- (simData_50F.IMPACTOR.Rigid_x.displacement.to_numpy()-simData_50F.Bone.Disp_x.displacement.to_numpy())
displacement_sim_50F = displacement_sim_50F - displacement_sim_50F[0]
force_50F = simData_50F.IMPACTOR.Force_x.force
displacement_sim_50M= -(simData_50M.IMPACTOR.Rigid_x.displacement.to_numpy()-simData_50M.Bone.Disp_x.displacement.to_numpy())
displacement_sim_50M = displacement_sim_50M - displacement_sim_50M[0]
force_50M = simData_50M.IMPACTOR.Force_x.force
ax1.plot(displacement_sim_50F, force_50F, label = "VIVA+ 50 F", **plot50F)
ax1.plot(displacement_sim_50M, force_50F, label = "VIVA+ 50 M", **plot50M)
ax1.plot(experiments_s['Displacement_GI3 M'], experiments_s['Force_GI3 M'], label = "Experiment 6.3m/s GI3 M ", **plotExperimentMale)
ax1.plot(experiments_s['Displacement_GI4 F'], experiments_s['Force_GI4 F'], label = "Experiment 6.3m/s GI4 F ", **plotExperimentFemale)
ax1.plot(experiments_s['Displacement_GI6 M'], experiments_s['Force_GI6 M'], label = "Experiment 6.3m/s GI6 M ", **plotExperimentMale2)
displacement_sim_50F_2=- (simData_50F_2.IMPACTOR.Rigid_x.displacement.to_numpy()-simData_50F_2.Bone.Disp_x.displacement.to_numpy())
displacement_sim_50F_2 = displacement_sim_50F_2 - displacement_sim_50F_2[0]
force_50F_2 = simData_50F_2.IMPACTOR.Force_x.force
displacement_sim_50M_2= -(simData_50M_2.IMPACTOR.Rigid_x.displacement.to_numpy()-simData_50M_2.Bone.Disp_x.displacement.to_numpy())
displacement_sim_50M_2 = displacement_sim_50M_2 - displacement_sim_50M_2[0]
force_50M_2 = simData_50M_2.IMPACTOR.Force_x.force
ax2.plot(displacement_sim_50F_2, force_50F_2, **plot50F)
ax2.plot(displacement_sim_50M_2, force_50M_2, **plot50M)
ax2.plot(experiments_s['Displacement_GS7 M'], experiments_s['Force_GS7 M'], label = "Experiment 9.2m/s GS7 M", **plotExperimentMale)
ax2.plot(experiments_s['Displacement_GS8 M'], experiments_s['Force_GS8 M'], label = "Experiment 9.2m/s GS8 M", **plotExperimentMale2)
ax2.plot(experiments_s['Displacement_GS9 F'], experiments_s['Force_GS9 F'], label = "Experiment 9.2m/s GS9 F", **plotExperimentFemale)
ax2.set_ylim(0,13)
ax2.set_xlim(0,210)
ax1.set_ylim(0,13)
ax1.set_xlim(0,210)
fig_fd.tight_layout(pad=0.5)
fig_fd.legend(loc='center left', bbox_to_anchor=(1, 0.5));
plt.show()