Abdominal Impact (Hardy 2001)#

Model validation information

  • Performed by : Johan Iraeus

  • Reviewed by :

Added to VIVA+ Validation Catalog on : 2022-06-28

Last modified :

Model version (this notebook run for): 0.3.2

© 2019-2023, 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) 1

1 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.

Other Notes for simulation#

Notes on implementation and iterations during the implementation of validation simulations

Model Energies#

Hide 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));
../_images/77d810c24cb644a5b3331e891756855fa119df71533aa1fd3f4798edcf289c98.png
Hide 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()
../_images/1f567deb9c9e46ae5b187b44f1d51ed1d1a3a6f4ef01b32b0c17616cf34c414f.png
Hide 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()
../_images/2b0dccd6d62f8ba9aa02be353ac3aabfb2a02890c8c7742ef4c07da9ac654e33.png