Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
    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)  
Пример #4
0
    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)
Пример #5
0
    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)