Back impact (Forman 2015)#

Postprocessing of Hub Impacts based on Forman et al., 2015

  • Performed by : Jobin John

  • Reviewed by :

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

Last modified: 2022-07-05

VIVA+ model version (this notebook run for): 0.3.2

© 2019-2024, OpenVT Organization (OVTO)

Available openly under Creative Commons Attribution 4.0 International License

Experiment by Forman et al. 2015#

This loadcase simulates the blunt back impacts reports by Forman et al., 2015

Forman, J., Perry, B., Henderson, K., Gjolaj, J. P., Heltzel, S., Lessley, D., … & Walilko, T. (2015). Blunt impacts to the back: biomechanical response for model development. Journal of biomechanics, 48(12), 3219-3226.

Experiment#

Information on subjects#

Subject

Age

Sex

Weight (kg)

Height (cm)

Seated Height (cm)

A

36

M

104

185

98

B

44

M

77.1

178

94

C

40

M

80.3

178

96

D

52

M

78.5

179

92

Loading and Boundary Conditions#

Four post-mortem human subjects (PMHS) were struck on the back at thoracic T8 level with a 97.5 kg circular hub of diameter 15.24 cm.

Simulation#

In the simulations presented below, the 50F and 50M VIVA+ seated models were impacted at 1.5 m/s, 3 m/s, and 5 m/s. The lower arms and lower legs were removed before the test in the simulations. However, this is not removed in the simulation setup as it is not expected to influence the thorax responses. The HBM is rotated by 12 degrees for a uniform engagement of the hub with the back at the T8 level.

The deflection between the T8 vertebra and sternum was measured as the chest deflection.

Chest Force and Deflection#

Chest Force vs Deflection#

Hide code cell source
## TODO: Define Deflection!!!
fig_fd, axs = plt.subplots(nrows=3, ncols=1, sharex=True, sharey=True,figsize=(5, 10))
#fig_fd.suptitle('Chest Force vs Deflection')

axs[0].plot(ex_impact_force_deflection_1_5.A.X, ex_impact_force_deflection_1_5.A.Y ,  **plotExperimentMale2)
axs[0].plot(ex_impact_force_deflection_1_5.B.X, ex_impact_force_deflection_1_5.B.Y ,  **plotExperimentMale2)
axs[0].plot(ex_impact_force_deflection_1_5.C.X, ex_impact_force_deflection_1_5.C.Y ,  **plotExperimentMale2)
axs[0].plot(ex_impact_force_deflection_1_5.D.X, ex_impact_force_deflection_1_5.D.Y ,  **plotExperimentMale2)
axs[0].plot((chest_deflection_50F -chest_deflection_50F.iloc[0])[simData_50F.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1], 
            simData_50F.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1][simData_50F.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1] , **plot50F)
axs[0].plot((chest_deflection_50M -chest_deflection_50M.iloc[0])[simData_50M.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1], 
            simData_50M.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1][simData_50M.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1] , **plot50M)
axs[0].set_title('1.5 m/s')

axs[1].plot(ex_impact_force_deflection_3_0.A.X, ex_impact_force_deflection_3_0.A.Y ,  **plotExperimentMale2)
axs[1].plot(ex_impact_force_deflection_3_0.B.X, ex_impact_force_deflection_3_0.B.Y ,  **plotExperimentMale2)
axs[1].plot(ex_impact_force_deflection_3_0.C.X, ex_impact_force_deflection_3_0.C.Y ,  **plotExperimentMale2)
axs[1].plot(ex_impact_force_deflection_3_0.D.X, ex_impact_force_deflection_3_0.D.Y ,  **plotExperimentMale2)
axs[1].plot((chest_deflection_50F_2 -chest_deflection_50F_2.iloc[0])[simData_50F_2.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1], 
            simData_50F_2.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1][simData_50F_2.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1] , **plot50F)
axs[1].plot((chest_deflection_50M_2 -chest_deflection_50M_2.iloc[0])[simData_50M_2.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1], 
            simData_50M_2.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1][simData_50M_2.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1] , **plot50M)
axs[1].set_title('3.0 m/s')
axs[1].set_ylabel('Impact Force (kN)')


axs[2].plot(ex_impact_force_deflection_5_5.A.X, ex_impact_force_deflection_5_5.A.Y , label="Experimental Responses", **plotExperimentMale2)
axs[2].plot(ex_impact_force_deflection_5_5.B.X, ex_impact_force_deflection_5_5.B.Y , **plotExperimentMale2)
axs[2].plot(ex_impact_force_deflection_5_5.C.X, ex_impact_force_deflection_5_5.C.Y ,  **plotExperimentMale)
axs[2].plot(ex_impact_force_deflection_5_5.D.X, ex_impact_force_deflection_5_5.D.Y , **plotExperimentMale)
axs[2].plot((chest_deflection_50F_3 -chest_deflection_50F_3.iloc[0])[simData_50F_3.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1], 
            simData_50F_3.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1][simData_50F_3.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1] , **plot50F, label="VIVA+ 50F")
axs[2].plot((chest_deflection_50M_3 -chest_deflection_50M_3.iloc[0])[simData_50M_3.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1], 
            simData_50M_3.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1][simData_50M_3.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1] , **plot50M, label="VIVA+ 50M")
axs[2].plot(-(chest_deflect_50F_4 -chest_deflect_50F_4.iloc[0])[simData_50F_4.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1], 
            simData_50F_4.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1][simData_50F_4.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1] , **plot50F, linestyle = "--")
axs[2].plot(-(chest_deflect_50M_4 -chest_deflect_50M_4.iloc[0])[simData_50M_4.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1], 
            simData_50M_4.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1][simData_50M_4.IMPACTOR["Contactforce-impactor-to-HBM-m"].iloc[:,1]>0.1] , **plot50M, linestyle = "--")
axs[2].set_title('5.5 m/s')

axs[2].set_xlabel('Deflection (mm)');

fig_fd.legend(loc="upper right", bbox_to_anchor=(0.9, 0.87));
../_images/7699fad66a9329faf056ad143382f1a70c5fea0a4e49fa58d06c287c3bea9fbb.png

Deflection vs time#

Hide code cell source
fig_rt, axs = plt.subplots(nrows=3, ncols=1, sharex=True, sharey=True,figsize=(5, 10))
fig_rt.suptitle('T1-L3 Rotation vs Time')

axs[0].plot(ex_deflection_time.v1_5_mean.X, ex_deflection_time.v1_5_mean.Y, **plotExperimentMale, label = 'Mean')
axs[0].plot(ex_deflection_time.v1_5_plusSD.X, ex_deflection_time.v1_5_plusSD.Y, **plotExperimentMale2, label = '1 SD Corridors')
axs[0].plot(ex_deflection_time.v1_5_minusSD.X, ex_deflection_time.v1_5_minusSD.Y, **plotExperimentMale2)
axs[0].plot(simData_50F.Bone.T1_COG_ry.time, np.degrees(simData_50F.Bone.L3_COG_ry.displacement - simData_50F.Bone.T1_COG_ry.displacement),  **plot50F)
axs[0].plot(simData_50M.Bone.T1_COG_ry.time, np.degrees(simData_50M.Bone.L3_COG_ry.displacement - simData_50M.Bone.T1_COG_ry.displacement),  **plot50M)
axs[0].set_title('1.5 m/s')
axs[0].set_ylabel('Rotation (deg)')

axs[1].plot(ex_deflection_time.v3_0_mean.X, ex_deflection_time.v3_0_mean.Y, **plotExperimentMale)
axs[1].plot(ex_deflection_time.v3_0_plusSD.X, ex_deflection_time.v3_0_plusSD.Y, **plotExperimentMale2)
axs[1].plot(ex_deflection_time.v3_0_minusSD.X, ex_deflection_time.v3_0_minusSD.Y, **plotExperimentMale2)
axs[1].plot(simData_50F_2.Bone.T1_COG_ry.time, np.degrees(simData_50F_2.Bone.L3_COG_ry.displacement - simData_50F_2.Bone.T1_COG_ry.displacement),  **plot50F)
axs[1].plot(simData_50M_2.Bone.T1_COG_ry.time, np.degrees(simData_50M_2.Bone.L3_COG_ry.displacement - simData_50M_2.Bone.T1_COG_ry.displacement),  **plot50M)
axs[1].set_title('3.0 m/s')
axs[1].set_ylabel('Rotation (deg)')


axs[2].plot(ex_deflection_time.v5_5_mean.X, ex_deflection_time.v5_5_mean.Y, **plotExperimentMale)
axs[2].plot(ex_deflection_time.v5_5_plusSD.X, ex_deflection_time.v5_5_plusSD.Y, **plotExperimentMale2)
axs[2].plot(ex_deflection_time.v5_5_minusSD.X, ex_deflection_time.v5_5_minusSD.Y, **plotExperimentMale2)
axs[2].plot(simData_50F_3.Bone.T1_COG_ry.time, np.degrees(simData_50F_3.Bone.L3_COG_ry.displacement - simData_50F_3.Bone.T1_COG_ry.displacement),  **plot50F, label="VIVA+ 50F")
axs[2].plot(simData_50M_3.Bone.T1_COG_ry.time, np.degrees(simData_50M_3.Bone.L3_COG_ry.displacement - simData_50M_3.Bone.T1_COG_ry.displacement),  **plot50M, label="VIVA+ 50M")
axs[2].plot(simData_50F_4.Bone.T1_COG_ry.time, np.degrees(simData_50F_4.Bone.L3_COG_ry.displacement - simData_50F_4.Bone.T1_COG_ry.displacement),  **plot50F, linestyle = "--")
axs[2].plot(simData_50M_4.Bone.T1_COG_ry.time, np.degrees(simData_50M_4.Bone.L3_COG_ry.displacement - simData_50M_4.Bone.T1_COG_ry.displacement),  **plot50M, linestyle = "--")
axs[2].set_title('5.5 m/s')
axs[2].set_ylabel('Rotation (deg)')


axs[2].set_xlabel('Time (ms)')

fig_rt.legend(loc="upper right", bbox_to_anchor=(0.9, 0.87));
../_images/33cbaf86d96335bdc92ba43af028e3139eef8991e849e4bd5c6715b56d84f17c.png

For the 5.5 m/s impact, the plot lines with dashed lines represent simulations where the impactor had a stroke length of 150 mm whereas the solid line represents the impact with stroke length of 85 mm.