11import unittest
2- import numpy as np
32import sectionproperties .pre .sections as sections
43from sectionproperties .analysis .cross_section import CrossSection
4+ from sectionproperties .tests .helper_functions import validate_properties
55
66
77class TestRectangle (unittest .TestCase ):
8+ """Section properties are mostly validated against hand calcs. Results from
9+ Strand7 and Roark's Formulas for Stress and Strain are used for some
10+ warping properties."""
11+
812 def setUp (self ):
913 self .geometry = sections .RectangularSection (d = 100 , b = 50 )
1014 self .mesh = self .geometry .create_mesh (mesh_sizes = [10 ])
@@ -13,97 +17,105 @@ def setUp(self):
1317 def test_geometric (self ):
1418 self .section .calculate_geometric_properties ()
1519
16- self .assertAlmostEqual (self .section .get_area (), 100 * 50 )
17- self .assertAlmostEqual (self .section .get_ea (), 1 * 100 * 50 )
18- (qx , qy ) = self .section .get_q ()
19- self .assertAlmostEqual (qx , 100 * 50 * 50 )
20- self .assertAlmostEqual (qy , 100 * 50 * 25 )
21- (ixx_g , iyy_g , ixy_g ) = self .section .get_ig ()
22- self .assertAlmostEqual (ixx_g , 50 * 100 ** 3 / 3 )
23- self .assertAlmostEqual (iyy_g , 100 * 50 ** 3 / 3 )
24- self .assertAlmostEqual (ixy_g , 100 * 50 * 50 * 25 )
25- (cx , cy ) = self .section .get_c ()
26- self .assertAlmostEqual (cx , 50 / 2 )
27- self .assertAlmostEqual (cy , 100 / 2 )
28- (ixx_c , iyy_c , ixy_c ) = self .section .get_ic ()
29- self .assertAlmostEqual (ixx_c , 50 * 100 ** 3 / 12 )
30- self .assertAlmostEqual (iyy_c , 100 * 50 ** 3 / 12 )
31- self .assertAlmostEqual (ixy_c , 0 )
32- (zxx_plus , zxx_minus , zyy_plus , zyy_minus ) = self .section .get_z ()
33- self .assertAlmostEqual (zxx_plus , 50 * 100 ** 2 / 6 )
34- self .assertAlmostEqual (zxx_minus , 50 * 100 ** 2 / 6 )
35- self .assertAlmostEqual (zyy_plus , 100 * 50 ** 2 / 6 )
36- self .assertAlmostEqual (zyy_minus , 100 * 50 ** 2 / 6 )
37- (rx , ry ) = self .section .get_rc ()
38- self .assertAlmostEqual (rx , (50 * 100 ** 3 / 12 / 100 / 50 ) ** 0.5 )
39- self .assertAlmostEqual (ry , (100 * 50 ** 3 / 12 / 100 / 50 ) ** 0.5 )
40- (i11_c , i22_c ) = self .section .get_ip ()
41- self .assertAlmostEqual (i11_c , 50 * 100 ** 3 / 12 )
42- self .assertAlmostEqual (i22_c , 100 * 50 ** 3 / 12 )
43- phi = self .section .get_phi ()
44- self .assertAlmostEqual (phi , 0 )
45- (z11_plus , z11_minus , z22_plus , z22_minus ) = self .section .get_zp ()
46- self .assertAlmostEqual (z11_plus , 50 * 100 ** 2 / 6 )
47- self .assertAlmostEqual (z11_minus , 50 * 100 ** 2 / 6 )
48- self .assertAlmostEqual (z22_plus , 100 * 50 ** 2 / 6 )
49- self .assertAlmostEqual (z22_minus , 100 * 50 ** 2 / 6 )
50- (r11 , r22 ) = self .section .get_rp ()
51- self .assertAlmostEqual (r11 , (50 * 100 ** 3 / 12 / 100 / 50 ) ** 0.5 )
52- self .assertAlmostEqual (r22 , (100 * 50 ** 3 / 12 / 100 / 50 ) ** 0.5 )
20+ val_list = []
21+ val_list .append ({"prop" : "area" , "val" : 100 * 50 , "tol" : None })
22+ val_list .append ({"prop" : "ea" , "val" : 1 * 100 * 50 , "tol" : None })
23+ val_list .append ({"prop" : "qx" , "val" : 100 * 50 * 50 , "tol" : None })
24+ val_list .append ({"prop" : "qy" , "val" : 100 * 50 * 25 , "tol" : None })
25+ val_list .append ({"prop" : "ixx_g" , "val" : 50 * 100 ** 3 / 3 ,
26+ "tol" : None })
27+ val_list .append ({"prop" : "iyy_g" , "val" : 100 * 50 ** 3 / 3 ,
28+ "tol" : None })
29+ val_list .append ({"prop" : "ixy_g" , "val" : 100 * 50 * 50 * 25 ,
30+ "tol" : None })
31+ val_list .append ({"prop" : "cx" , "val" : 50 / 2 , "tol" : None })
32+ val_list .append ({"prop" : "cy" , "val" : 100 / 2 , "tol" : None })
33+ val_list .append ({"prop" : "ixx_c" , "val" : 50 * 100 ** 3 / 12 ,
34+ "tol" : None })
35+ val_list .append ({"prop" : "iyy_c" , "val" : 100 * 50 ** 3 / 12 ,
36+ "tol" : None })
37+ val_list .append ({"prop" : "ixy_c" , "val" : 0 , "tol" : None })
38+ val_list .append ({"prop" : "zxx_plus" , "val" : 50 * 100 ** 2 / 6 ,
39+ "tol" : None })
40+ val_list .append ({"prop" : "zxx_minus" , "val" : 50 * 100 ** 2 / 6 ,
41+ "tol" : None })
42+ val_list .append ({"prop" : "zyy_plus" , "val" : 100 * 50 ** 2 / 6 ,
43+ "tol" : None })
44+ val_list .append ({"prop" : "zyy_minus" , "val" : 100 * 50 ** 2 / 6 ,
45+ "tol" : None })
46+ val_list .append ({"prop" : "rx" ,
47+ "val" : (50 * 100 ** 3 / 12 / 100 / 50 ) ** 0.5 ,
48+ "tol" : None })
49+ val_list .append ({"prop" : "ry" ,
50+ "val" : (100 * 50 ** 3 / 12 / 100 / 50 ) ** 0.5 ,
51+ "tol" : None })
52+ val_list .append ({"prop" : "i11_c" , "val" : 50 * 100 ** 3 / 12 ,
53+ "tol" : None })
54+ val_list .append ({"prop" : "i22_c" , "val" : 100 * 50 ** 3 / 12 ,
55+ "tol" : None })
56+ val_list .append ({"prop" : "phi" , "val" : 0 , "tol" : None })
57+ val_list .append ({"prop" : "z11_plus" , "val" : 50 * 100 ** 2 / 6 ,
58+ "tol" : None })
59+ val_list .append ({"prop" : "z11_minus" , "val" : 50 * 100 ** 2 / 6 ,
60+ "tol" : None })
61+ val_list .append ({"prop" : "z22_plus" , "val" : 100 * 50 ** 2 / 6 ,
62+ "tol" : None })
63+ val_list .append ({"prop" : "z22_minus" , "val" : 100 * 50 ** 2 / 6 ,
64+ "tol" : None })
65+ val_list .append ({"prop" : "r11" ,
66+ "val" : (50 * 100 ** 3 / 12 / 100 / 50 ) ** 0.5 ,
67+ "tol" : None })
68+ val_list .append ({"prop" : "r22" ,
69+ "val" : (100 * 50 ** 3 / 12 / 100 / 50 ) ** 0.5 ,
70+ "tol" : None })
71+
72+ validate_properties (self , val_list , self .section )
5373
5474 def test_plastic (self ):
5575 self .section .calculate_geometric_properties ()
5676 self .section .calculate_plastic_properties ()
5777
58- (x_pc , y_pc ) = self .section .get_pc ()
59- self .assertTrue (np .isclose (x_pc , 50 / 2 ))
60- self .assertTrue (np .isclose (y_pc , 100 / 2 ))
61- (x11_pc , y22_pc ) = self .section .get_pc_p ()
62- self .assertTrue (np .isclose (x11_pc , 50 / 2 ))
63- self .assertTrue (np .isclose (y22_pc , 100 / 2 ))
64- (sxx , syy ) = self .section .get_s ()
65- self .assertTrue (np .isclose (sxx , 50 * 100 ** 2 / 4 ))
66- self .assertTrue (np .isclose (syy , 100 * 50 ** 2 / 4 ))
67- (s11 , s22 ) = self .section .get_sp ()
68- self .assertTrue (np .isclose (s11 , 50 * 100 ** 2 / 4 ))
69- self .assertTrue (np .isclose (s22 , 100 * 50 ** 2 / 4 ))
70- (sf_xx_plus , sf_xx_minus , sf_yy_plus ,
71- sf_yy_minus ) = self .section .get_sf ()
72- self .assertTrue (np .isclose (sf_xx_plus , 1.5 ))
73- self .assertTrue (np .isclose (sf_xx_minus , 1.5 ))
74- self .assertTrue (np .isclose (sf_yy_plus , 1.5 ))
75- self .assertTrue (np .isclose (sf_yy_minus , 1.5 ))
76- (sf_11_plus , sf_11_minus , sf_22_plus ,
77- sf_22_minus ) = self .section .get_sf_p ()
78- self .assertTrue (np .isclose (sf_11_plus , 1.5 ))
79- self .assertTrue (np .isclose (sf_11_minus , 1.5 ))
80- self .assertTrue (np .isclose (sf_22_plus , 1.5 ))
81- self .assertTrue (np .isclose (sf_22_minus , 1.5 ))
78+ val_list = []
79+ val_list .append ({"prop" : "x_pc" , "val" : 50 / 2 , "tol" : None })
80+ val_list .append ({"prop" : "y_pc" , "val" : 100 / 2 , "tol" : None })
81+ val_list .append ({"prop" : "x11_pc" , "val" : 50 / 2 , "tol" : None })
82+ val_list .append ({"prop" : "y22_pc" , "val" : 100 / 2 , "tol" : None })
83+ val_list .append ({"prop" : "sxx" , "val" : 50 * 100 ** 2 / 4 , "tol" : None })
84+ val_list .append ({"prop" : "syy" , "val" : 100 * 50 ** 2 / 4 , "tol" : None })
85+ val_list .append ({"prop" : "s11" , "val" : 50 * 100 ** 2 / 4 , "tol" : None })
86+ val_list .append ({"prop" : "s22" , "val" : 100 * 50 ** 2 / 4 , "tol" : None })
87+ val_list .append ({"prop" : "sf_xx_plus" , "val" : 1.5 , "tol" : None })
88+ val_list .append ({"prop" : "sf_xx_minus" , "val" : 1.5 , "tol" : None })
89+ val_list .append ({"prop" : "sf_yy_plus" , "val" : 1.5 , "tol" : None })
90+ val_list .append ({"prop" : "sf_yy_minus" , "val" : 1.5 , "tol" : None })
91+ val_list .append ({"prop" : "sf_11_plus" , "val" : 1.5 , "tol" : None })
92+ val_list .append ({"prop" : "sf_11_minus" , "val" : 1.5 , "tol" : None })
93+ val_list .append ({"prop" : "sf_22_plus" , "val" : 1.5 , "tol" : None })
94+ val_list .append ({"prop" : "sf_22_minus" , "val" : 1.5 , "tol" : None })
95+
96+ validate_properties (self , val_list , self .section )
8297
8398 def test_warping (self ):
8499 self .section .calculate_geometric_properties ()
85100 self .section .calculate_warping_properties ()
86101
87- j = self .section .get_j ()
88- self .assertTrue (np .isclose (j , 2861002 , rtol = 0.05 , atol = 0 )) # roarks
89- # TODO: add Strand7 check and more resources?
90- (x_se , y_se ) = self .section .get_sc ()
91- self .assertTrue (np .isclose (x_se , 50 / 2 ))
92- self .assertTrue (np .isclose (y_se , 100 / 2 ))
93- (x11_se , y22_se ) = self .section .get_sc_p ()
94- self .assertTrue (np .isclose (x11_se , 50 / 2 ))
95- self .assertTrue (np .isclose (y22_se , 100 / 2 ))
96- (x_st , y_st ) = self .section .get_sc_t ()
97- self .assertTrue (np .isclose (x_st , 50 / 2 ))
98- self .assertTrue (np .isclose (y_st , 100 / 2 ))
99- gamma = self .section .get_gamma ()
100- # TODO: check gamma
101- (A_sx , A_sy ) = self .section .get_As ()
102- self .assertTrue (np .isclose (A_sx , 5 / 6 * 100 * 50 ))
103- self .assertTrue (np .isclose (A_sy , 5 / 6 * 100 * 50 ))
104- (A_s11 , A_s22 ) = self .section .get_As_p ()
105- self .assertTrue (np .isclose (A_s11 , 5 / 6 * 100 * 50 ))
106- self .assertTrue (np .isclose (A_s22 , 5 / 6 * 100 * 50 ))
102+ val_list = []
103+ val_list .append ({"prop" : "j" , "val" : 2861002 , "tol" : 0.04 }) # roark's
104+ val_list .append ({"prop" : "j" , "val" : 2.85852e6 , "tol" : 2e-5 }) # st7
105+ val_list .append ({"prop" : "gamma" , "val" : 3.17542e8 ,
106+ "tol" : None }) # st7
107+ val_list .append ({"prop" : "x_se" , "val" : 50 / 2 , "tol" : None })
108+ val_list .append ({"prop" : "y_se" , "val" : 100 / 2 , "tol" : None })
109+ val_list .append ({"prop" : "x11_se" , "val" : 0 , "tol" : None })
110+ val_list .append ({"prop" : "y22_se" , "val" : 0 , "tol" : None })
111+ val_list .append ({"prop" : "x_st" , "val" : 50 / 2 , "tol" : None })
112+ val_list .append ({"prop" : "y_st" , "val" : 100 / 2 , "tol" : None })
113+ val_list .append ({"prop" : "A_sx" , "val" : 5 / 6 * 100 * 50 , "tol" : None })
114+ val_list .append ({"prop" : "A_sy" , "val" : 5 / 6 * 100 * 50 , "tol" : None })
115+ val_list .append ({"prop" : "A_s11" , "val" : 5 / 6 * 100 * 50 ,
116+ "tol" : None })
117+ val_list .append ({"prop" : "A_s22" , "val" : 5 / 6 * 100 * 50 ,
118+ "tol" : None })
107119
108120
109121if __name__ == "__main__" :
0 commit comments