Ultimate Bending Capacity

This example demonstrates how to calculate ultimate bending capacities using concreteproperties. We start by importing the necessary modules.

[1]:
import numpy as np
from sectionproperties.pre.library import rectangular_section, triangular_section

import concreteproperties.stress_strain_profile as ssp
from concreteproperties import (
    Concrete,
    ConcreteSection,
    SteelBar,
    add_bar_rectangular_array,
)
from concreteproperties.post import si_kn_m, si_n_mm

Assign Materials

The materials used in this example will be 50 MPa concrete with 500 MPa steel, specified in accordance with AS 3600:2018.

[2]:
concrete = Concrete(
    name="50 MPa Concrete",
    density=2.4e-6,
    stress_strain_profile=ssp.ConcreteLinear(elastic_modulus=34.8e3),
    ultimate_stress_strain_profile=ssp.RectangularStressBlock(
        compressive_strength=50,
        alpha=0.775,
        gamma=0.845,
        ultimate_strain=0.003,
    ),
    flexural_tensile_strength=4.2,
    colour="lightgrey",
)

steel = SteelBar(
    name="500 MPa Steel",
    density=7.85e-6,
    stress_strain_profile=ssp.SteelElasticPlastic(
        yield_strength=500,
        elastic_modulus=200e3,
        fracture_strain=0.05,
    ),
    colour="grey",
)

Create Geometry and Concrete Section

The section being analysed in this example is a 1200D x 900W x 150THK hollow box beam with 50 mm chamfers. The reinforcement detailed is 9N20 top bars and 9N28 bottom bars with 6N16 side face. The bars are cast central to the walls. The geometry is generated using the sectionproperties primitive sections library and geometry manipulation.

[3]:
# construct box by subtracting an inner rectangle from an outer rectangle
outer = rectangular_section(d=1200, b=900, material=concrete)
inner = rectangular_section(d=900, b=600).align_center(align_to=outer)
box = outer - inner

# generate four chamfers
chamfer1 = (
    triangular_section(b=50, h=50, material=concrete)
    .align_to(other=inner, on="left", inner=True)
    .align_to(other=inner, on="bottom", inner=True)
)
chamfer2 = chamfer1.mirror_section(axis="y", mirror_point=(450, 600))
chamfer3 = chamfer1.mirror_section(axis="x", mirror_point=(450, 600))
chamfer4 = chamfer2.mirror_section(axis="x", mirror_point=(450, 600))

# add chamfers to box
geom = box + chamfer1 + chamfer2 + chamfer3 + chamfer4

# add bottom bars
geom = add_bar_rectangular_array(
    geometry=geom,
    area=620,
    material=steel,
    n_x=9,
    x_s=750 / 8,
    anchor=(75, 75),
)

# add top bars
geom = add_bar_rectangular_array(
    geometry=geom,
    area=310,
    material=steel,
    n_x=9,
    x_s=750 / 8,
    anchor=(75, 1125),
)

# add side bars
geom = add_bar_rectangular_array(
    geometry=geom,
    area=200,
    material=steel,
    n_x=2,
    x_s=750,
    n_y=6,
    y_s=150,
    anchor=(75, 225),
)

conc_sec = ConcreteSection(geom)
conc_sec.plot_section()
../_images/examples_ultimate_bending_6_0.svg
[3]:
<Axes: title={'center': 'Reinforced Concrete Section'}>

Calclulate Ultimate Properties (\(N = 0\))

In this example we’ll calculate the ultimate bending capacity for sagging (\(\theta = 0\)), hogging (\(\theta = \pi\)) and weak axis bending (\(\theta = \pi / 2\)). To do this we call the ultimate_bending_capacity() method:

[4]:
sag_res = conc_sec.ultimate_bending_capacity()
hog_res = conc_sec.ultimate_bending_capacity(theta=np.pi)
weak_res = conc_sec.ultimate_bending_capacity(theta=np.pi / 2)

Displaying the Results (\(N = 0\))

We can print the ultimate bending results to the terminal by using the print_results() method.

[5]:
sag_res.print_results(units=si_kn_m)
               Ultimate Bending Results               
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
┃ Property                                    Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩
│ Bending Angle - theta                  0.000 rads │
│ Neutral Axis Depth - d_n          118.3 x 10^-3 m │
│ Neutral Axis Parameter - k_u        105.1 x 10^-3 │
├──────────────────────────────┼─────────────────────┤
│ Axial Force                      21.08 x 10^-3 kN │
│ Bending Capacity - m_x          3.647 x 10^3 kN.m │
│ Bending Capacity - m_y        312.9 x 10^-15 kN.m │
│ Bending Capacity - m_xy         3.647 x 10^3 kN.m │
└──────────────────────────────┴─────────────────────┘
[6]:
si_n_mm.radians = False  # display angles in degrees
hog_res.print_results(units=si_n_mm)
              Ultimate Bending Results               
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓
┃ Property                                   Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩
│ Bending Angle - theta                 180.0 degs │
│ Neutral Axis Depth - d_n                81.04 mm │
│ Neutral Axis Parameter - k_u       72.04 x 10^-3 │
├──────────────────────────────┼────────────────────┤
│ Axial Force                             -22.75 N │
│ Bending Capacity - m_x        -2.192 x 10^9 N.mm │
│ Bending Capacity - m_y        454.5 x 10^-9 N.mm │
│ Bending Capacity - m_xy        2.192 x 10^9 N.mm │
└──────────────────────────────┴────────────────────┘
[7]:
weak_res.print_results()
            Ultimate Bending Results            
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Property                              Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ Bending Angle - theta            1.571 rads │
│ Neutral Axis Depth - d_n              101.2 │
│ Neutral Axis Parameter - k_u  122.7 x 10^-3 │
├──────────────────────────────┼───────────────┤
│ Axial Force                          -27.04 │
│ Bending Capacity - m_x         614.9 x 10^6 │
│ Bending Capacity - m_y        -2.139 x 10^9 │
│ Bending Capacity - m_xy        2.225 x 10^9 │
└──────────────────────────────┴───────────────┘

We can also extract specific results from the UltimateBendingResults objects. Note that m_xy refers to the resultant bending moment, so will always be positive.

[8]:
print(f"M_x+ = {sag_res.m_xy / 1e6:.2f} kN.m")
print(f"M_x- = {hog_res.m_xy / 1e6:.2f} kN.m")
print(f"M_y = {weak_res.m_xy / 1e6:.2f} kN.m")
M_x+ = 3646.75 kN.m
M_x- = 2191.64 kN.m
M_y = 2225.48 kN.m

Calclulate Ultimate Properties (\(N = 5000\) kN)

Say our reinforced concrete cross-section has an axial compression of 5000 kN. We can also calculate the ultimate bending capacities given this axial load.

[9]:
n = 5000e3
sag_axial_res = conc_sec.ultimate_bending_capacity(n=n)
hog_axial_res = conc_sec.ultimate_bending_capacity(theta=np.pi, n=n)
weak_axial_res = conc_sec.ultimate_bending_capacity(theta=np.pi / 2, n=n)

Displaying the Results (\(N = 5000\) kN)

[10]:
msg_sag = f"M_x+ = {sag_axial_res.m_xy / 1e6:.1f} kN.m "
msg_sag += f"with N = {sag_axial_res.n / 1e3:.0f} kN"
msg_hog = f"M_x- = {hog_axial_res.m_xy / 1e6:.1f} kN.m "
msg_hog += f"with N = {hog_axial_res.n / 1e3:.0f} kN"
msg_weak = f"M_y = {weak_axial_res.m_xy / 1e6:.1f} kN.m "
msg_weak += f"with N = {weak_axial_res.n / 1e3:.0f} kN"

print(msg_sag)
print(msg_hog)
print(msg_weak)
M_x+ = 5741.6 kN.m with N = 5000 kN
M_x- = 4668.1 kN.m with N = 5000 kN
M_y = 3711.0 kN.m with N = 5000 kN