Built-up steel section properties using some good old Python (Part 6)

In this part we visit adding angles nested into the web/flange interface. This is kind of a good means to increase both the bending and axial capacity of a member. Though it results in a bucket load of welding, it’s an effective means of strengthening when you have access and can’t really increase the overall footprint of the member. Basically, when those pesky architects won’t let you attempt to decapitate people by adding something under the member when head heights are limited.

It also offers fairly good access for welding when you must strengthen within the flanges.

Buy shares in your local welding company… profit

The code…

import sectionproperties.pre.sections as sections
from sectionproperties.analysis.cross_section import CrossSection
import copy

d = 612  # I section depth
b_f = 229  # I-section flange width
t_f = 19.6  # I-section flange thickness
t_w = 11.9  # I-section web thickness
r_1 = 14  # I-section root radii

d_1 = 100  # strengthening angle leg 1 length
b_1 = 100  # strengthening angle leg 2 length
t = 8  # strengthening angle thickness
r_r = 8  # strengthening root radii
r_t = 5  # strengthening toe radii

n_r = 5  # number of points considered around root radii

horiz_gap = 0.5  # horizontal gap between angle and section
vert_gap = 0.5  # vertical gap between angle and section

weld_size = 6  # weld size

mesh_area = 5  # max mesh size

# -------------------------------------------------------------
# Calculations
# -------------------------------------------------------------
# create constituent geometry
# weld base geometry
weld = sections.CustomSection(
    points=[[0, 0], [weld_size, 0], [0, weld_size]], facets=[[0, 1], [1, 2], [2, 0]], holes=[], control_points=[[weld_size / 3, weld_size / 3]]
)

# I section
geometry1 = sections.ISection(d=d, b=b_f, t_f=t_f, t_w=t_w, r=r_1, n_r=n_r, shift=[-b_f / 2, -d / 2])

# top right angle
shift = [b_1 + t_w / 2 + horiz_gap, d / 2 - d_1 - t_f - vert_gap]
geometry2 = sections.AngleSection(d=d_1, b=b_1, t=t, r_r=r_r, r_t=r_t, n_r=n_r, shift=shift)
geometry2.rotate_section(angle=5 * 90, rot_point=shift)

# bottom left angle
shift = [-b_1 - t_w / 2 - horiz_gap, -d / 2 + d_1 + t_f + vert_gap]
geometry3 = sections.AngleSection(d=d_1, b=b_1, t=t, r_r=r_r, r_t=r_t, n_r=n_r, shift=shift)
geometry3.rotate_section(angle=-90, rot_point=shift)

# top left angle
shift = [-b_1 - t_w / 2 - horiz_gap, d / 2 - d_1 - t_f - vert_gap]
geometry4 = sections.AngleSection(d=d_1, b=b_1, t=t, r_r=r_r, r_t=r_t, n_r=n_r, shift=shift)

# bottom right angle
shift = [b_1 + t_w / 2 + horiz_gap, -d / 2 + d_1 + t_f + vert_gap]
geometry5 = sections.AngleSection(d=d_1, b=b_1, t=t, r_r=r_r, r_t=r_t, n_r=n_r, shift=shift)
geometry5.rotate_section(angle=180, rot_point=shift)

# welds

geometry6 = copy.deepcopy(weld)
geometry6.shift = [t_w / 2, -d / 2 + d_1 + t_f + vert_gap]
geometry6.shift_section()

geometry7 = copy.deepcopy(weld)
geometry7.shift = [t_w / 2 + b_1 + horiz_gap, -d / 2 + t_f]
geometry7.shift_section()

geometry8 = copy.deepcopy(geometry6)
geometry8.mirror_section(axis='y', mirror_point=[0, 0])
geometry9 = copy.deepcopy(geometry7)
geometry9.mirror_section(axis='y', mirror_point=[0, 0])

geometry10 = copy.deepcopy(geometry6)
geometry10.mirror_section(axis='x', mirror_point=[0, 0])
geometry11 = copy.deepcopy(geometry7)
geometry11.mirror_section(axis='x', mirror_point=[0, 0])

geometry12 = copy.deepcopy(geometry8)
geometry12.mirror_section(axis='x', mirror_point=[0, 0])
geometry13 = copy.deepcopy(geometry9)
geometry13.mirror_section(axis='x', mirror_point=[0, 0])

# total number of individual geometry elements
geo_number = 13

# assemble geometry list
geo_list = [globals()[f'geometry{i}'] for i in range(1, geo_number + 1)]

# create merged section
geometry = sections.MergedSection(geo_list)

# add holes within closed sections formed by adding angles
geometry.add_hole([-b_1 / 2, d / 2 - d_1 / 2])
geometry.add_hole([-b_1 / 2, -d / 2 + d_1 / 2])
geometry.add_hole([b_1 / 2, d / 2 - d_1 / 2])
geometry.add_hole([b_1 / 2, -d / 2 + d_1 / 2])

# clean geometry
geometry.clean_geometry(verbose=True)

# create mesh
mesh = geometry.create_mesh(mesh_sizes=[mesh_area] * geo_number)

# create section
section = CrossSection(geometry, mesh)

# calculate results
section.calculate_geometric_properties()
section.calculate_plastic_properties()
section.calculate_warping_properties()

# plot results
section.plot_mesh()
section.plot_centroids()

# -------------------------------------------------------------
# Display results
# -------------------------------------------------------------
# display all results
# check https://sectionproperties.readthedocs.io/en/latest/rst/post.html for definitions
section.display_results(fmt='.3f')

That’s about all of the example I was going to cover, but if anyone has anything further that they regularly use put a comment below and I’ll see what I can do…

See Part 7 to go down the rabbit hole further…..

Leave a Reply