Example T30 v6: HSS Brace Analysis
The photo shows the end details of a typical brace in a 4-storey steel structure. This was photographed in Ottawa, in September, 2015.
This notebook shows the computations necessary to compute the factored tension resistance, $T_r$, for a similar brace. Note, all of the dimensions and properties were invented by the author of this notebook; no attempt has been made to have an accurate model of the real structure.
from Designer import Part, DesignNotes, SST
import math
sind = lambda deg: math.sin(math.radians(deg)) # return sin of angle expressed in degrees
cosd = lambda deg: math.cos(math.radians(deg)) # return cos of angle expressed in degrees
%figure "brace.jpg"
Setup the units system
import pint # setup to use the module for computing with units
ureg = pint.UnitRegistry()
mm = ureg['mm'] # define symbols for the units used below
inch = ureg['inch']
kN = ureg['kN']
MPa = ureg['MPa']
ureg.default_format = '~P'
The various $\phi$ values used below:
phiw = 0.67 # S16-14 13.1
phiu = 0.75
phib = 0.80
phibr = 0.80
phi = 0.90
notes = DesignNotes('Tr',title='Typical HSS Cross Brace',units=kN)
# useful abbreviations:
REQUIRE = notes.require # a requirement
CHECK = notes.check # a check
USEVARS = notes.usevars
class Bolts(Part):
'Bolts' # bolt group is the same on the tongue plate and on the gusset plate.
grade = 'ASTM A325'
size = '3/4"'
Fu = 825*MPa
d = (3/4*inch).to(mm)
hole_type = 'punched'
hd = 22*mm # hole diameter
ha = hd + 2*mm # hole allowance
threads_intercepted = True
nlines = 2 # a line is perpendicular to load
nperline = 3 # number of bolts in each line
g = 75*mm # gauge (perpendicular to load)
s = 75*mm # spacing (parallel to load)
class Welds(Part):
'Welds'
grade = 'E49xx'
Xu = 490*MPa
matching = True
class Plates(Part):
'Plates'
grade = 'CSA G40.21 350W'
Fy = 350*MPa
Fu = 450*MPa
class HSS(Part):
'HSS Column'
grade = 'CSA G40.21 350W'
Fy = 350*MPa
Fu = 450*MPa
size = 'HS127x127x13'
D,T,A = SST.section(size,'D,T,A')
D = D*mm
T = T*mm
A = A*mm*mm
class CoverPlate(Plates):
'Cover Plate'
T = 10*mm
W = 60*mm
Lw = 90*mm # length of weld from net section to end of HSS
D = 6*mm # size of weld from on HSS.
class TonguePlate(Plates):
'Tongue Plate'
T = 20*mm
W = 280*mm
L = 260*mm
e = 40*mm
D = 8*mm # weld size
c = 45*mm # dist end of weld to 1st bolt line
Lw = L - (c + (Bolts.nlines-1)*Bolts.s + e)
Dh = SST.section(HSS.size,'D')*mm
ns = 10
class GussetPlate(Plates):
'Gusset Plate'
T,W = TonguePlate.values('T,W')
W2 = 110*mm
e = 40*mm # end distance
D = 8*mm # plate to column weld size
theta = 45.
with USEVARS(('W,W2,theta,D',GussetPlate),
('Xu',Welds),
locals='L,L1,Mw,Aw', record='Vr', label='Gusset to HSS Weld'):
L1 = W2+W*cosd(theta)
L = (L1/sind(theta))*cosd(theta) + W*sind(theta)
Mw = 1.0
Aw = 2*L*.707*D
Vr = 0.67*phiw*Aw*Xu*(1+sind(theta)**1.5)*Mw # S16-14: 13.13.2.2
Gusset Block Shear
Because the gusset must be the same thickness as the tongue, and as the edges align so they are the same width (mostly), the block shear strengths determined here should be the same. So this section is not really necessary. The tongue does have one more pattern (Pattern 3)) that is judged not applicable here because of the increased width of the gusset.
Block Shear Case 1)
with USEVARS(('nlines,nperline,g,s,ha',Bolts),
('W,e,T,Fy,Fu',GussetPlate),
locals='An,Agv,Ut',
record='Vr',label='Gusset Block Shear Case 1)'):
An = T*((nperline-1)*g - (nperline-1)*ha)
Agv = 2*T*((nlines-1)*s + e)
Ut = 1.0
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
with USEVARS(('nlines,nperline,g,s,ha',Bolts),
('W,e,T,Fy,Fu',GussetPlate),
locals='edge,Ut,An,Agv',
record='Vr',label='Gusset Block Shear Case 2)'):
edge = (W - (nperline-1)*g)/2.
An = (((nperline-1)*g+edge)-(nperline-0.5)*ha)*T
Agv = T*((nlines-1)*s + e)
Ut = 0.8
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
with USEVARS(('nlines,nperline,s',Bolts),
('e,T,Fy,Fu',GussetPlate),
locals='Agv',
record='Vr',label='Gusset tearout'):
Agv = T*((nlines-1)*s + e) * nperline * 2
Vr = phiu * 0.6*Agv*(Fy+Fu)/2. # S16-14: 13.2 a) ii) & 13.11
class LapPlates(Plates):
'Lap Plates'
W = 230*mm
L = 315*mm
T = 10*mm*2. # thickness, include 2 plates
e = 40*mm # could be different than gusset
with USEVARS(('W,T,Fy',LapPlates), locals='Ag', label='Lap Plates, Gross Yield'):
Ag = W*T
Tr = phi*Ag*Fy # S16-14: 13.2 a) i)
with USEVARS(('W,T,Fu',LapPlates),
('nperline,ha',Bolts),
locals='wn,Ane', label='Lap Plates, Net Fracture'):
wn = W - nperline*ha
Ane = An = wn*T
Tr = phiu*Ane*Fu # S16-14: 13.2 a) iii)
with USEVARS(('T,e,W,Fy,Fu',LapPlates),
('ha,nperline,nlines,s,g',Bolts),
locals='An,Agv,Ut', record='Vr', label='Lap Plates, Block Shear Case 1)'):
An = ((nperline-1)*g - (nperline-1)*ha)*T
Agv = (e + (nlines-1)*s)*T*2
Ut = 1.0
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
with USEVARS(('T,e,W,Fy,Fu',LapPlates),
('ha,nperline,nlines,s,g',Bolts),
locals='edge,An,Agv,Ut', record='Vr', label='Lap Plates, Block Shear Case 2)'):
edge = (W - (nperline-1)*g)/2.0
An = (W - (edge-ha/2) - nperline*ha)*T
Agv = (e + (nlines-1)*s)*T
Ut = 0.8
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
with USEVARS(('T,e,W,Fy,Fu',LapPlates),
('ha,nperline,nlines,s,g',Bolts),
locals='An,Agv,Ut', record='Vr', label='Lap Plates, Block Shear Case 3)'):
An = (W - nperline*ha - (g-ha))*T
Agv = (e + (nlines-1)*s)*T * 2.
Ut = 0.6
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
with USEVARS(('T,e,W,Fy,Fu',LapPlates),
('ha,nperline,nlines,s,g',Bolts),
locals='Agv,An,Ut', record='Vr', label='Lap Plates, tearout'):
An = 0*mm*mm
Agv = (e + (nlines-1)*s)*T*2*nperline
Ut = 1
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
class TonguePlate(TonguePlate):
D = 8*mm # weld size
c = 45*mm # dist end of weld to 1st bolt line
Lw = TonguePlate.L - (c + (Bolts.nlines-1)*Bolts.s + TonguePlate.e)
Dh = SST.section(HSS.size,'D')*mm
with USEVARS(('W,T,Fy',TonguePlate),
locals='Ag', label='Tongue Plate, Gross Yield'):
Ag = W*T
Tr = phi*Ag*Fy # S16-14: 13.2 a) i)
with USEVARS(('W,T,Fu',TonguePlate),
('ha,nperline',Bolts),
locals='wn,Ane', label='Tongue Plate, Bolted End, Net Section Fracture'):
wn = W - nperline*ha
Ane = An = wn*T
Tr = phiu*Ane*Fu # S16-14: 13.2 a) iii)
with USEVARS(('T,e,W,Fy,Fu',TonguePlate),
('ha,nperline,nlines,s,g',Bolts),
locals='An,Agv,Ut', record='Vr', label='Tongue Plate, Block Shear Case 1)'):
An = ((nperline-1)*g - (nperline-1)*ha)*T
Agv = (e + (nlines-1)*s)*T*2
Ut = 1.0
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
with USEVARS(('T,e,W,Fy,Fu',TonguePlate),
('ha,nperline,nlines,s,g',Bolts),
locals='edge,An,Agv,Ut', record='Vr', label='Tongue Plate, Block Shear Case 2)'):
edge = (W - (nperline-1)*g)/2.0
An = (W - (edge-ha/2.) - nperline*ha)*T
Agv = (e + (nlines-1)*s)*T
Ut = 0.8
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.1
with USEVARS(('T,e,W,Fy,Fu',TonguePlate),
('ha,nperline,nlines,s,g',Bolts),
locals='An,Agv,Ut', record='Vr', label='Tongue Plate, Block Shear Case 3)'):
An = (W - nperline*ha - (g-ha))*T
Agv = (e + (nlines-1)*s)*T * 2.
Ut = 0.6
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
with USEVARS(('T,e,W,Fy,Fu',TonguePlate),
('ha,nperline,nlines,s,g',Bolts),
locals='Agv,An,Ut', record='Vr', label='Tongue Plate tearout'):
An = 0*mm*mm
Agv = (e + (nlines-1)*s)*T*2*nperline
Ut = 1
Vr = phiu*(Ut*An*Fu + 0.6*Agv*(Fy+Fu)/2.) # S16-14: 13.2 a) ii) & 13.11
with USEVARS(('W,w2=Dh,L=Lw,T,Fu',TonguePlate),
locals='w3,An2,An3,Ane', label='Tongue Plate, Welded End, Net Section Fracture'):
if L >= 2*w2: # S16-14: 12.3.3.3 b)
An2 = 1.00*w2*T
elif L >= w2:
An2 = 0.5*w2*T + 0.25*L*T
else:
An2 = 0.75*L*T
w3 = (W-w2)/2. # S16-14: 12.3.3.3 c)
xbar = w3/2.
if L >= w3:
An3 = (1.-xbar/L)*w3*T
else:
An3 = 0.50*L*T
Ane = An2 + An3 + An3 # S16-14: 12.3.3.3
Tr = phiu*Ane*Fu
with USEVARS(('d,Fu,threads_intercepted,s,nlines,nperline',Bolts),
locals='n,m,Ab', record='Vr', label='Bolts in Shear'):
n = nlines*nperline # no. of bolts
m = 2 # no. of faying surfaces
Ab = 3.14159*d*d/4.
Vr = 0.6*phib*n*m*Ab*Fu # S16-14: 13.12.1.2 c)
L = (nlines-1)*s
if L >= 760*mm:
Vr = (0.5/0.6)*Vr
if threads_intercepted:
Vr = 0.7*Vr
with USEVARS(('d,nlines,nperline',Bolts),
('Fu',TonguePlate),
locals='n,t', record='Br', label='Bolts in Bearing'):
n = nlines*nperline
t = min(GussetPlate.T,TonguePlate.T,2*LapPlates.T)
Br = 3*phibr*n*t*d*Fu # S16-14: 13.12.1.2 a)
with USEVARS(('L=Lw,D',TonguePlate),
('Xu,matching',Welds),
locals='Aw', record='Vr', label='Fillet Weld (HSS to Plate)'):
if not matching:
raise Exception('Non matching electrodes')
Aw = 4.*L*D*0.707
Vr = 0.67*phiw*Aw*Xu # S16-14: 13.13.2.2
with USEVARS(('D,th=T,A,Fyh=Fy,Fuh=Fu',HSS),
('tp=T,wp=W,Fyp=Fy,Fup=Fu',CoverPlate),
('tt=T,Lw',TonguePlate),
locals='xbar,Ag,An,Ane,Fy,Fu', label='HSS Net Section Fracture'):
Fy = min(Fyh,Fyp) # use min properties of plate & HSS (conservative)
Fu = min(Fuh,Fup)
h = D/2. - th - tt/2. # height of vertical leg
xbar = (2.*h*th*h/2. + D*th*(h+th/2.) + wp*tp*(h+th+tp/2.))/(2*h*th + D*th + wp*tp)
Ag = A + 2*wp*tp # gross area of HSS + cover plates
An = Ag - 2.*tt*th # net area, remove slots cut for tongue
if xbar/Lw > 0.1: # S16-14: 12.3.3.4
Ane = (1.1 - xbar/Lw)*An
else:
Ane = An
Tr = phiu*Ane*Fu # S16-14: 13.2 a) iii)
with USEVARS(('A,Fy',HSS),
locals='Ag', label='HSS Gross Section Yield'):
Ag = A
Tr = phi*Ag*Fy # S16-14: 13.2 a) i)
with USEVARS(('T,W,L=Lw,D,Fy,Fu',CoverPlate),
('Xu',Welds),
locals='Aw,Vr,An,An2,Ane', record=False, label='Checking Cover Plate'):
Aw = 0.707*D*L*2.
Vr = (0.67*phiw*Aw*Xu*1*1).to(kN) # S16-14: 13.13.2.2, weld strength, to one side
Tr = (phi*(T*W)*Fy).to(kN) # S16-14: 13.2 a) i) gross section yield, of cover Plate
CHECK(Vr>=Tr,'Coverplate weld strength, gross yield','L,D,Aw,Vr,Tr')
An = W*T # S16-14: 12.3.3.3 b)
if L >= 2*W: # Ane of plate
An2 = W*T
elif L >= W:
An2 = 0.5*W*T + 0.25*L*T
else:
An2 = 0.75*L*T
Ane = An2
Tr = (phiu*An2*Fu).to(kN) # S16-14: 13.2 a) iii)
CHECK(Vr>=Tr,'Coverplate weld strength, net fracture','L,W,An2,Ane,Vr,Tr');
with USEVARS(('W,T,L,e',LapPlates),
('s,g,nlines,nperline,d',Bolts),
locals='minedge,maxedge,minend,minpitch', record=False):
minedge = 32*mm # S16-14: 22.3.2 Table 6, 3/4" bolt, sheared edge
maxedge = min(150*mm,12.*T) # S16-14: 22.3.3
minend = 32*mm # S16-14: 22.3.4
minpitch = 2.7*d # S16-14: 22.3.1
edge = (W - (nperline-1)*g)/2.
CHECK(edge>=minedge,'Bolt min edge distance, lap plate','edge,minedge',)
CHECK(edge<=maxedge,'Bolt max edge distance, lap plate','edge,maxedge',)
CHECK(e>=minend,'Bolt min end distance, lap plate','e,minend',)
CHECK(s>=minpitch and g>=minpitch,'Bolt spacing, lap plate','s,g,minpitch')
# TODO
# TODO
# TODO
# TODO
notes.summary()
Notes
- The factored resistance of this component is low, governed by the weld of the HSS to the tongue plate. Its capacity is 498 kN, almost 1/2 of the next lowest item (the shear strength of the bolts).
- To increase the overall strength, the first thing to do would be to increase length of that weld from 100mm to something considerably larger. 200mm of weld would require increasing the length of tongue from 280mm to 380mm but would double that strength at very small cost.
- The cover plate welding to the HSS may be inadequate as it is shown. Increasing the length of the HSS to tongue weld will leave space for more weld on the cover plate, up to 190mm on one side of the minimum cross-section, which should be more than enough.
- Increasing the HSS to tongue plate weld length may also increase $T_r$ for Tongue Plate, Welded End, Net Section Fracture and HSS Net Section Fracture.