C-M Interaction Curves
Note: a few sample manual calculations are also available, if you do not like reading Python code.
%pylab inline
rcParams['figure.figsize'] = [10,10] # make plots a bit bigger
b = 100.
d = 300.
Fy = 345.
def calcCM_R(y0,b=b,d=d,Fy=Fy):
assert all(y0 >= 0.) and all(y0 <= d/2.) # y0 can be an array of values
C = 2.*y0*b*Fy * 1E-3
# dist between T forces dt = d - 2*(d/2-y0)/2 = d/2+y0
# M = T*dt
M = (d/2.-y0)*b*Fy*(d/2.+y0) * 1E-6
return C,M
zz,Mpr = calcCM_R(0.)
Cyr,zz = calcCM_R(d/2.)
print(Cyr,Mpr)
Print values for checking when $y_0 = 0.2 d$:
C,M = calcCM_R(0.2*d)
print(0.2*d,C,M)
These agree with the values on the manual calculations.
Cr,Mr = calcCM_R(linspace(0.,1.)*d/2)
grid(True)
xlabel('$M/M_p$')
ylabel('$C/C_y$')
plot(Mr/Mpr,Cr/Cyr);
from Designer import sst, show
SST = sst.SST()
B,T,W,D,A,Zx = SST.section('W250x73',properties='B,T,W,D,A,Zx')
show('B,T,W,D,A,*1e3,Zx')
def calcCM_W(y0,B=B,T=T,D=D,W=W,Fy=Fy):
H = D - 2.*T
assert all(y0>=0.) and all(y0<=D/2.) # y0 can be an array of values
def case1(y0): # y0 <= H/2
C = 2.*y0*W*Fy * 1E-3
T1 = (H/2.-y0)*W*Fy * 1E-3 # web
T2 = B*T*Fy * 1E-3 # flange
M = (T1*(y0+(H/2-y0)/2.)*2. + T2*(H/2.+T/2.)*2.) * 1E-3
return C,M
def case2(y0): # y0 > H/2
C1 = H*W*Fy * 1E-3 # web
C2 = 2*(y0-H/2.)*B*Fy * 1E-3 # flange
C = C1 + C2
M = (D/2-y0)*B*Fy*(D-(D/2-y0)) * 1E-6 # could be simplified. who cares?
return C,M
if isscalar(y0):
return case1(y0) if y0 <= H/2. else case2(y0)
cm = array([case1(y) if y <= H/2 else case2(y) for y in y0])
return cm[:,0],cm[:,1]
zz,Mpw = calcCM_W(0.)
Cyw,zz = calcCM_W(D/2.)
Mpw,Cyw
The above values are about 1.5% less than values obtained directly using properties from the handbook. I suspect that is difference due to fillets, etc. For example, compare computed Area vs published:
Ac = 2*B*T + (D-2*T)*W
A,Ac,A/Ac
Again, about 1.5% difference.
Now generate C,M values at $y_0 = H/4$ (halfway along web) and $y_0 = D/2 - T/2$ (halfway through flange) for checking.
y0 = (D-2.*T)/4.
C,M = calcCM_W(y0)
print(y0,C,M)
y0 = D/2 - T/2
C,M = calcCM_W(y0)
print(y0,C,M)
These agree with the values on the manual calculations.
Cw,Mw = calcCM_W(linspace(0.,1.)*D/2.)
grid(True)
xlabel('$M/M_p$')
ylabel('$C/C_y$')
plot(Mw/Mpw,Cw/Cyw);
# comput 2 pts on the S16-14 curve:
# c/cy + 0.85*m/mp = 1; c/cy = 1 - 0.85*m/mp
mrat = array([0.,1.])
crat = 1 - 0.85*mrat
grid(True)
xlabel('$M/M_p$')
ylabel('$C/C_y$')
plot(Mr/Mpr,Cr/Cyr,'g',Mw/Mpw,Cw/Cyw,'b',mrat,crat,'r');
In the above, the blue line is for the W shape, the green line is for the rectangle (and has almost no significance), and the red line matches the basis of the interaction formulae in S16-14:
$$ \frac{C}{C_y} + 0.85 \frac{M}{M_p} \le 1 $$