Plastic hinges

Plastic hinges#

Click –> Live Code on the top right corner of this screen to investigate some plasticity!

We’re investigating the plastic behaviour of the following structure:

Figure 1

import micropip
await micropip.install("ipympl")
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np
import sympy as sym

import ipywidgets as widgets

%matplotlib widget
fy = sym.S(235*10**6)
E = sym.S(210*10**9)
b = sym.nsimplify(1/10)
h = sym.nsimplify(3/10)
c = sym.symbols('c',positive=True)
Izz = b * h ** 3 /12 - (b * c **3 / 12)
eps_y = fy/E
kappa_e = eps_y / (h/2)
M_el = fy * Izz / (h / 2)
kappa = sym.symbols('kappa',positive=True)
k = sym.symbols('k',positive=True)
Izz_2 = b * k ** 3 /12 - (b * sym.Piecewise((c,c<k),(k,c>=k)) **3 / 12)
M_el_2 = fy * Izz_2 / (k / 2)
d = sym.Piecewise((k, k > c), (c, k <= c))
R_pl = b * ( h / 2 - d / 2) * fy
a = (h + d) / 2
M_pl = R_pl * a

M_el_2 = M_el_2.subs(k,kappa_e / kappa * h)
M_pl = M_pl.subs(k,kappa_e / kappa * h)
M_tot = M_el_2 + M_pl
alpha = (M_tot / M_el)
alpha = alpha.subs(kappa,kappa_e*1000000000)

M_pl_nump = sym.lambdify((kappa,c),M_pl)
M_el_nump = sym.lambdify(c,M_el)
M_tot_nump = sym.lambdify((kappa,c),M_tot)
alpha_nump = sym.lambdify(c,alpha)
def solve_kappa(kappa_list,M_list, value):
    idx = (np.abs(M_list - value)).argmin()
    return kappa_list[idx]
fig = plt.figure()
fig.tight_layout()
ax1 = fig.add_subplot(1,2,1)

ax2 = fig.add_subplot(1,2,2)


M_mid_slider = widgets.FloatSlider(value=0, min=0, max=1, step=0.01,description='Load')
c_slider = widgets.FloatSlider(value=0, min=0, max=h*0.9999, step=0.01, description='Gap (m) in cross section:')

def update_plot(M_mid, c_nump):
    ax1.clear()  # Clear the existing plot
    ax2.clear()
    M_el_max = M_el_nump(c_nump)

    M_pl_max = M_pl_nump(c=c_nump,kappa = float(kappa_e)*10000000)
    M_mid = M_el_max + (M_pl_max - M_el_max) * M_mid

    k_linspace = np.linspace(float(kappa_e),float(kappa_e)*10,1000)
    M_linspace = M_tot_nump(kappa = k_linspace, c = c_nump)
    kappa_el_max = M_el_max/(E*Izz.subs(c,c_nump))
    kappa_pl_max = max(k_linspace)

    
    x_elastic_1 = np.array([0,2.5 - max(2.5 - 2.5 * M_el_max / M_mid,0)])
    M_elastic_1 = np.array([0,M_el_max])
    kappa_1 = np.array([0,kappa_el_max])
    x_elastic_2 = np.array([2.5 + max(2.5 - 2.5 * M_el_max / M_mid,0),5])
    M_elastic_2 = np.array([M_el_max,0])
    kappa_2 = np.array([kappa_el_max,0])
    x_plastic = np.array([2.5 - max(2.5 - 2.5 * M_el_max / M_mid,0),2.5,2.5 + max(2.5 - 2.5 * M_el_max / M_mid,0)])
    M_plastic = np.array([M_el_max,M_mid,M_el_max])
    ax1.plot(x_elastic_1,M_elastic_1,color='black')
    ax1.plot(x_plastic,M_plastic,color='red')
    ax1.plot(x_elastic_2,M_elastic_2,color='black')
    ax1.set_ylim(0,M_pl_max)
    ax1.invert_yaxis()
    ax1.spines['right'].set_color('none')
    ax1.spines['top'].set_color('none')
    ax1.spines['left'].set_position('zero')
    ax1.spines['bottom'].set_position('zero')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks([])
    ax1.set_yticks([])
    ax1.set_ylabel('Moment')

    x_plastic_1 = np.linspace(2.5 - max(2.5 - 2.5 * M_el_max / M_mid,0),2.5,100)
    x_plastic_2 = np.linspace(2.5,2.5 + max(2.5 - 2.5 * M_el_max / M_mid,0),100)
    M_plastic_1 = np.linspace(M_el_max,M_mid,100)
    M_plastic_2 = np.linspace(M_mid,M_el_max,100)
    kappa_plastic_1 = []
    kappa_plastic_2 = []
    for moment in M_plastic_1:
        kappa_plastic_1.append(solve_kappa(k_linspace,M_linspace,moment))
    for moment in M_plastic_2:
        kappa_plastic_2.append(solve_kappa(k_linspace,M_linspace,moment))
    kappa_pl_max = solve_kappa(k_linspace,M_linspace,M_pl_max)

    ax2.plot(x_elastic_1,kappa_1,color='black')
    ax2.plot(x_plastic_1,kappa_plastic_1,color='red')
    ax2.plot(x_plastic_2,kappa_plastic_2,color='red')
    ax2.plot(x_elastic_2,kappa_2,color='black')
    ax2.set_ylim([0,kappa_pl_max])
    ax2.invert_yaxis()
    ax1.spines['right'].set_color('none')
    ax1.spines['top'].set_color('none')
    ax1.set_xticklabels([])
    ax2.spines['right'].set_color('none')
    ax2.spines['top'].set_color('none')
    ax2.spines['left'].set_position('zero')
    ax2.spines['bottom'].set_position('zero')
    ax2.set_xticklabels([])
    ax2.set_yticklabels([])
    ax2.set_xticks([])
    ax2.set_yticks([])
    ax2.set_ylabel('Curvature')
    title = r'$\alpha=$'+str(np.round(alpha_nump(c = c_nump),3))
    ax2.set_title(title)
    plt.draw()

widgets.interact(update_plot, M_mid = M_mid_slider, c_nump = c_slider);