@@ -15,8 +15,11 @@ def concrete_rectangular_section(
1515 n_bot : int ,
1616 n_circle : int ,
1717 cover : float ,
18+ dia_side : float = None ,
19+ n_side : int = 0 ,
1820 area_top : float = None ,
1921 area_bot : float = None ,
22+ area_side : float = None ,
2023 conc_mat : pre .Material = pre .DEFAULT_MATERIAL ,
2124 steel_mat : pre .Material = pre .DEFAULT_MATERIAL ,
2225) -> geometry .CompoundGeometry :
@@ -33,12 +36,17 @@ def concrete_rectangular_section(
3336 :param int n_bot: Number of bottom steel reinforcing bars
3437 :param int n_circle: Number of points discretising the steel reinforcing bars
3538 :param float cover: Side and bottom cover to the steel reinforcing bars
39+ :param float dia_side: If provided, diameter of the side steel reinforcing bars
40+ :param int n_side: If provided, number of side bars either side of the section
3641 :param float area_top: If provided, constructs top reinforcing bars based on their
3742 area rather than diameter (prevents the underestimation of steel area due to
3843 circle discretisation)
3944 :param float area_bot: If provided, constructs bottom reinforcing bars based on
4045 their area rather than diameter (prevents the underestimation of steel area due
4146 to circle discretisation)
47+ :param float area_side: If provided, constructs side reinforcing bars based on
48+ their area rather than diameter (prevents the underestimation of steel area due
49+ to circle discretisation)
4250 :param Optional[sectionproperties.pre.pre.Material] conc_mat: Material to
4351 associate with the concrete
4452 :param Optional[sectionproperties.pre.pre.Material] steel_mat: Material to
@@ -93,10 +101,18 @@ def concrete_rectangular_section(
93101 spacing_top = (b - 2 * cover - dia_top ) / (n_top - 1 )
94102 spacing_bot = (b - 2 * cover - dia_bot ) / (n_bot - 1 )
95103
104+ # calculate reinforcing bar dimensions for side layers if specified
105+ if n_side != 0 :
106+ x_i_side_left = cover + dia_side / 2
107+ x_i_side_right = b - x_i_side_left
108+ spacing_side = (d - 2 * cover - dia_top / 2 - dia_bot / 2 ) / (n_side + 1 )
109+
96110 if area_top is None :
97111 area_top = np .pi * dia_top ** 2 / 4
98112 if area_bot is None :
99113 area_bot = np .pi * dia_bot ** 2 / 4
114+ if area_side is None and dia_side is not None :
115+ area_side = np .pi * dia_side ** 2 / 4
100116
101117 # add top bars
102118 for i in range (n_top ):
@@ -118,6 +134,25 @@ def concrete_rectangular_section(
118134 )
119135 geom = (geom - bar ) + bar
120136
137+ # add side bars if specified
138+ if n_side != 0 :
139+ for i in range (n_side ):
140+ bar_left = primitive_sections .circular_section_by_area (
141+ area = area_side , n = n_circle , material = steel_mat
142+ )
143+ bar_right = bar_left
144+
145+ bar_left = bar_left .shift_section (
146+ x_offset = x_i_side_left ,
147+ y_offset = cover + dia_bot / 2 + spacing_side * (i + 1 ),
148+ )
149+ bar_right = bar_right .shift_section (
150+ x_offset = x_i_side_right ,
151+ y_offset = cover + dia_bot / 2 + spacing_side * (i + 1 ),
152+ )
153+
154+ geom = (geom - bar_left - bar_right ) + bar_left + bar_right
155+
121156 return geom
122157
123158
0 commit comments