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#
Show 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));
Deflection vs time#
Show 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));
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.