def test_laminate_applied_force_for_strains(self): """Apply a force and calculate the resultant laminate midplane strains. 'Fiber-Reinforced Composites' by Mallick (3rd edition), Example 3.13 Test will check that the resultant strains match the expected strains from example 3.13 with a maximum normalized error of 2 decimal places (< 1% error) """ ply = Ply(E1=133.4e9, E2=8.78e9, nu12=0.26, G12=3.254e9, h=0.006) # h is in [mm] laminae_pos45 = Laminae(ply=ply, theta_rad=(45.0*np.pi/180.0)) laminae_neg45 = Laminae(ply=ply, theta_rad=(-45.0*np.pi/180.0)) laminae_list = [laminae_pos45, laminae_neg45] laminate = Laminate(laminae_list) N = np.matrix.transpose(np.matrix([100.0e3, 0.0, 0.0])); # N[0] is in [N/m] M = np.matrix.transpose(np.matrix([0.0, 0.0, 0.0])); strain_dictionary = laminate.applied_stress(N,M) Epsilon = strain_dictionary['Epsilon'] Kappa = strain_dictionary['Kappa'] Epsilon_expected = np.matrix.transpose(np.matrix([77.385e-5, -50.715e-5, 0.0])) Kappa_expected = np.matrix.transpose(np.matrix([0.0, 0.0, 0.060354])) Epsilon_diff_norm_max = np.nanmax(np.abs(Epsilon_expected -Epsilon)/Epsilon) Kappa_diff_norm_max = np.nanmax(np.abs(Kappa_expected -Kappa)/Kappa) max_norm_diff = np.nanmax([Epsilon_diff_norm_max, Kappa_diff_norm_max]) self.assertAlmostEqual(max_norm_diff,0.0,places=2)
def test_laminate_applied_force_for_laminae_midplane_stress(self): """Apply a force to a laminate and determine the midplane stresses of the laminae in the laminate. 'Fiber-Reinforced Composites' by Mallick (3rd edition), Example 3.13 Test will look at the midplane stresses of the two laminae in the laminate. """ ply = Ply(E1=133.4e9, E2=8.78e9, nu12=0.26, G12=3.254e9, h=0.006) # h is in [mm] laminae_pos45 = Laminae(ply=ply, theta_rad=(45.0*np.pi/180.0)) laminae_neg45 = Laminae(ply=ply, theta_rad=(-45.0*np.pi/180.0)) laminae_list = [laminae_pos45, laminae_neg45] laminate = Laminate(laminae_list) N = np.matrix.transpose(np.matrix([100.0e3, 0.0, 0.0])); # N[0] is in [N/m] M = np.matrix.transpose(np.matrix([0.0, 0.0, 0.0])); strain_dictionary = laminate.applied_stress(N,M) Epsilon = strain_dictionary['Epsilon'] Kappa = strain_dictionary['Kappa'] laminae_midplane_strains = laminate.laminae_midplane_strain(Epsilon, Kappa) laminae_midplane_stresses = laminate.laminae_stress(Epsilon, Kappa) laminae_midplane_stress_expected = np.power(10.0,6.0)*np.matrix.transpose(np.matrix([8.33, 0.0, 2.09])) self.assertMatrixAlmostEqualPercent(laminae_midplane_stresses[0],laminae_midplane_stress_expected) laminae_midplane_stress_expected = np.power(10.0,6.0)*np.matrix.transpose(np.matrix([8.33, 0.0, -2.09])) self.assertMatrixAlmostEqualPercent(laminae_midplane_stresses[1],laminae_midplane_stress_expected)
def test_laminate_matrix_symmetricbalanced(self): """ Test a symmetric balanced ply laminate matrix against a known example. 'Fiber-Reinforced Composites' by Mallick (3rd edition), Example 3.7b Test will check that the laminate stiffness matrix matches the expected stiffness matrices from example 3.7b with a maximum normalized error of 3 decimal places (< 0.1% error) Symmetric Laminate should have A16, A26 = 0, B = 0 """ ply = Ply(E1=133.4e9, E2=8.78e9, nu12=0.26, G12=3.254e9, h=0.006) # h is in [mm] laminae_pos45 = Laminae(ply=ply, theta_rad=(45.0*np.pi/180.0)) laminae_neg45 = Laminae(ply=ply, theta_rad=(-45.0*np.pi/180.0)) laminae_list = [laminae_pos45, laminae_neg45, laminae_neg45, laminae_pos45] laminate = Laminate(laminae_list) A_expected = np.power(10.0,6.0)*np.matrix([[962.64, 806.64, 0.0], [806.64, 962.64, 0.0], [0.0, 0.0, 829.68]]); A_diff_norm_max = np.nanmax(np.abs(A_expected -laminate.A)/laminate.A) B_expected = np.matrix([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]) B_diff_norm_max = np.max(np.abs(B_expected -laminate.B)) D_expected = np.power(10.,3.)*np.matrix([[46.21, 38.72, 27.04], [38.72, 46.21, 27.04], [27.04, 27.04, 39.82]]) D_diff_norm_max = np.nanmax(np.abs(D_expected -laminate.D)/laminate.D) max_norm_diff = np.max([A_diff_norm_max,B_diff_norm_max,D_diff_norm_max]) self.assertAlmostEqual(max_norm_diff,0.0,places=3)
def test_laminate_matrix_inverse(self): """Checks the inverse (A1,B1,C1,D1) matrices to see they form properly. 'Fiber-Reinforced Composites' by Mallick (3rd edition), Example 3.13 Test will use data from expample 3.13 to check the "inverse" relationship stiffness matrices with a maximum normalized error of 2 decimal places (< 1% error). """ ply = Ply(E1=133.4e9, E2=8.78e9, nu12=0.26, G12=3.254e9, h=0.006) # h is in [mm] laminae_pos45 = Laminae(ply=ply, theta_rad=(45.0*np.pi/180.0)) laminae_neg45 = Laminae(ply=ply, theta_rad=(-45.0*np.pi/180.0)) laminae_list = [laminae_pos45, laminae_neg45] laminate = Laminate(laminae_list) A1_expected = np.power(10.0,-9.0)*np.matrix([[7.7385, -5.0715, 0.0], [-5.0715, 7.7385, 0.0], [0.0, 0.0, 5.683]]); A1_diff_norm_max = np.nanmax(np.abs(A1_expected -laminate.A_1)/laminate.A_1) B1_expected = np.power(10.0,-9.0)*np.matrix([[0.0, 0.0, 603.54], [0.0, 0.0, 603.54], [602.74, 602.74, 0.0]]) B1_diff_norm_max = np.nanmax(np.abs(B1_expected -laminate.B_1)/laminate.B_1) C1_expected = np.power(10.0,-9.0)*np.matrix([[0.0, 0.0, 602.74], [0.0, 0.0, 602.74], [603.54, 603.54, 0.0]]) C1_diff_norm_max = np.nanmax(np.abs(C1_expected -laminate.C_1)/laminate.C_1) D1_expected = np.power(10.,-4.0)*np.matrix([[6.45, -4.23, 0.0], [-4.23, 6.45, 0.0], [0.0, 0.0, 4.74]]) D1_diff_norm_max = np.nanmax(np.abs(D1_expected -laminate.D_1)/laminate.D_1) max_norm_diff = np.nanmax([A1_diff_norm_max,B1_diff_norm_max,C1_diff_norm_max,D1_diff_norm_max]) self.assertAlmostEqual(max_norm_diff,0.0,places=2)
def test_laminate_matrix_angleply(self): """ Test an angle ply laminate matrix against a known example. 'Fiber-Reinforced Composites' by Mallick (3rd edition), Example 3.7a Test will check that the laminate stiffness matrix matches the expected stiffness matrices from example 3.7a with a maximum normalized error of 3 decimal places (< 0.1% error) This test will throw a 'RuntimeWarning: invalid value encountered in divide' because of the zero elements in the A, B and D matrices, this is okay, ignore the warning. """ ply = Ply(E1=133.4e9, E2=8.78e9, nu12=0.26, G12=3.254e9, h=0.006) # h is in [mm] laminae_pos45 = Laminae(ply=ply, theta_rad=(45.0*np.pi/180.0)) laminae_neg45 = Laminae(ply=ply, theta_rad=(-45.0*np.pi/180.0)) laminae_list = [laminae_pos45, laminae_neg45] laminate = Laminate(laminae_list) A_expected = np.power(10.0,6.0)*np.matrix([[481.32, 403.32, 0.0], [403.32, 481.32, 0.0], [0.0, 0.0, 414.84]]); A_diff_norm_max = np.nanmax(np.abs(A_expected -laminate.A)/laminate.A) B_expected = np.power(10.0,3.0)*np.matrix([[0.0, 0.0, -1126.8], [0.0, 0.0, -1126.8], [-1126.8, -1126.8, 0.0]]) B_diff_norm_max = np.nanmax(np.abs(B_expected -laminate.B)/laminate.B) D_expected = np.matrix([[5775.84, 4839.84, 0.0], [4839.84, 5775.84, 0.0], [0.0, 0.0, 4978.08]]) D_diff_norm_max = np.nanmax(np.abs(D_expected -laminate.D)/laminate.D) max_norm_diff = np.max([A_diff_norm_max,B_diff_norm_max,D_diff_norm_max]) self.assertAlmostEqual(max_norm_diff,0.0,places=3)