Kulak & Grondin Example 8.2

This example is from "Limit States Design in Structural Steel", Ninth Edition, CISC, by Kulak and Grondin. It illustrates using the fictitious load method to determine second-order effects (i.e., the $P-\Delta$ method).



In [1]:

from Frame2D import Frame2D
from IPython import display
display.Image('data/KG82.d/KG82a.jpg')




Out[1]:



In order account for initial out-of-straightness and partial yielding, notional lateral loads equal to 0.005 times the factored gravity loads contributed by each level are added to each level (CSA S16-09 8.4.1). At node H that will be $45 \times (10+10.5+10) \times 0.005 = 6.9\ kN$ and at node G it is $55 \times (10+10.5+10) \times 0.005 = 8.4\ kN$. These notional loads will be included in addition to the lateral forces shown above.



In [2]:

f = Frame2D('KG82')
f.input_all()

%matplotlib inline
f.show()







In [3]:

R = f.solve()
f.print_input()
f.print_results(rs=R)




Frame KG82:
===========

# of nodal degrees of freedom: 36
# of constrained nodal degrees of freedom: 10
# of unconstrained nodal degrees of freedom: 26  (= degree of kinematic indeterminacy)

# of members: 14
# of reactions: 10
# of nodes: 12
# of conditions: 8
degree of statical indeterminacy: 8

Nodes:
======

Node          X         Y  Constraints  DOF #s
----      -----     -----  -----------  ------
A         10000         0  FX,FY,MZ     26,27,28
B         10000      6500               0,1,2
C         10000     12000               3,4,5
D         20500         0  FX,FY,MZ     29,30,31
E         20500      6500               6,7,8
F         20500     12000               9,10,11
G         30500      6500               12,13,14
H         30500     12000               15,16,17
I         30500         0  FX,FY        32,33,18
J             0         0  FX,FY        34,35,19
K             0      6500               20,21,22
L             0     12000               23,24,25

Members:
========

Member   Node-J  Node-K    Length       dcx       dcy  Size                Ix           A  Releases
------   ------  ------    ------   -------   -------  --------      --------       -----  --------
AB       A       B         6500.0   0.00000   1.00000  W310x97       2.22e+08       12300
BC       B       C         5500.0   0.00000   1.00000                2.22e+08       12300
DE       D       E         6500.0   0.00000   1.00000                2.22e+08       12300
EF       E       F         5500.0   0.00000   1.00000                2.22e+08       12300
IG       I       G         6500.0   0.00000   1.00000                2.22e+08       12300
GH       G       H         5500.0   0.00000   1.00000                2.22e+08       12300
JK       J       K         6500.0   0.00000   1.00000                2.22e+08       12300
KL       K       L         5500.0   0.00000   1.00000                2.22e+08       12300
CF       C       F        10500.0   1.00000   0.00000                4.88e+08       13500
BE       B       E        10500.0   1.00000   0.00000  W460x106      4.88e+08       13500
FH       F       H        10000.0   1.00000   0.00000                4.88e+08       13500  MZJ,MZK
EG       E       G        10000.0   1.00000   0.00000                4.88e+08       13500  MZJ,MZK
KB       K       B        10000.0   1.00000   0.00000                4.88e+08       13500  MZJ,MZK
LC       L       C        10000.0   1.00000   0.00000                4.88e+08       13500  MZJ,MZK

===========

Type      Node      FX          FY          MZ
----      ----  ----------  ----------  ----------
wind      H          15000           0           0
wind      G          35000           0           0
notional  H           6900           0           0
notional  G           8400           0           0

=============

----      ------  ----------------
live      LC      UDL(L=10000.0,w=-45)
live      CF      UDL(L=10500.0,w=-45)
live      FH      UDL(L=10000.0,w=-45)
live      KB      UDL(L=10000.0,w=-55)
live      BE      UDL(L=10500.0,w=-55)
live      EG      UDL(L=10000.0,w=-55)

Support Displacements:
======================

- - - none - - -

==================

Case   Type      Factor
-----  ----      ------
all    wind        1.00
"     live        1.00
"     notional    1.00

++++++++++++++++++++++++++

Node Displacements:
===================

Node        DX         DY      Rotation
----      ------     ------   ---------
A          0.000      0.000   0.0000000
B         22.180     -2.628  -0.0071701
C         34.685     -3.640  -0.0074115
D          0.000      0.000   0.0000000
E         22.532     -2.789   0.0030960
F         34.332     -3.840   0.0057038
G         22.674     -1.321  -0.0027559
H         34.423     -1.824  -0.0018264
I          0.000      0.000  -0.0038545
J          0.000      0.000  -0.0037166
K         22.165     -1.321  -0.0027967
L         34.693     -1.824  -0.0020184

Reactions:
==========

Node        FX         FY         MZ
----     -------    -------    -------
A          2.178    994.654     41.900
D        -63.236   1055.346    184.368
I         -2.309    500.000      --
J         -1.933    500.000      --

Member End Forces:
==================

/----- Axial -----/   /----- Shear -----/   /----- Moment ----/
Member       FX J       FX K       FY J       FY K       MZ J       MZ K
------     -------    -------    -------    -------    -------    -------
AB         994.654   -994.654     -2.178      2.178     41.900    -56.055
BC         452.382   -452.382    -88.371     88.371   -241.073   -244.970
DE        1055.346  -1055.346     63.236    -63.236    184.368    226.664
EF         470.118   -470.118    115.285   -115.285    295.981    338.086
IG         500.000   -500.000      2.309     -2.309      0.000     15.008
GH         225.000   -225.000     -2.729      2.729    -15.008      0.000
JK         500.000   -500.000      1.933     -1.933      0.000     12.566
KL         225.000   -225.000     -2.285      2.285    -12.566      0.000
CF          90.656    -90.656    227.382    245.118    244.970   -338.086
BE         -90.412     90.412    267.272    310.228    297.128   -522.645
FH         -24.629     24.629    225.000    225.000      0.000      0.000
EG         -38.362     38.362    275.000    275.000      0.000      0.000
KB          -4.218      4.218    275.000    275.000      0.000      0.000
LC           2.285     -2.285    225.000    225.000      0.000      0.000



The above are the results of a first-order analysis and should be compared with those shown in the following figure from Kulak & Grondin:



In [4]:

display.Image('data/KG82.d/KG82b.jpg')




Out[4]:



Compare book values (end bending moments)



In [5]:

import pandas as pd

BM = [('AB',44.2,-57.5),    # values given on figure, above
('BC',-232.,-236.),
('DE',181.,227.),
('EF',287.,330.),
('BE',290.,-515.),
('CF',236.,-330.)]

BOOK = pd.DataFrame({m:{'MZJ':a,'MZK':b} for m,a,b in BM}).T
BOOK




Out[5]:

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
}

text-align: right;
}

MZJ
MZK

AB
44.2
-57.5

BC
-232.0
-236.0

BE
290.0
-515.0

CF
236.0
-330.0

DE
181.0
227.0

EF
287.0
330.0




In [6]:

HERE = pd.DataFrame([(m.id,ef.m2/1e6,ef.m5/1e6)
for m,ef in R.member_efs.items()],columns=['ID','MZJ','MZK']).set_index(['ID'])
HERE = HERE.loc[BOOK.index]
HERE




Out[6]:

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
}

text-align: right;
}

MZJ
MZK

AB
41.899586
-56.055426

BC
-241.072569
-244.969631

BE
297.127995
-522.644884

CF
244.969631
-338.085575

DE
184.367580
226.663606

EF
295.981278
338.085575



% Difference in End Moments



In [7]:

(100*(HERE-BOOK)/HERE).round(2)




Out[7]:

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
}

text-align: right;
}

MZJ
MZK

AB
-5.49
-2.58

BC
3.76
3.66

BE
2.40
1.46

CF
3.66
2.39

DE
1.83
-0.15

EF
3.03
2.39



Max. difference is 5.5%, which I think is a little large.

Compare Reactions



In [8]:

REAC = pd.DataFrame(f.list_reaction_forces(R),columns=['ID','FX','FY','MZ']).set_index(['ID'])
REAC[['FY']]/1E3




Out[8]:

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
}

text-align: right;
}

FY

ID

A
994.654016

D
1055.345984

I
500.000000

J
500.000000



The reactions agree very closely.

$P-\Delta$ Analysis



In [9]:

f.reset()
f.input_all()
rs = f.solve(pdelta=True)
f.print_results(rs)
f.write_results(f.dsname,rs)




iter=1, max D=40.07059055185681, max chg=5.377546135135162, max % chg=13.420181886702878
iter=2, max D=40.914400791627784, max chg=0.8438349556926994, max % chg=2.062439970684775
iter=3, max D=41.04715700863964, max chg=0.13276037993390588, max % chg=0.3234338005576425
iter=4, max D=41.06806149694625, max chg=0.02090514731253279, max % chg=0.0509036622390547
iter=5, max D=41.0713541601887, max chg=0.0032927670257691943, max % chg=0.00801718641398228

++++++++++++++++++++++++++

Node Displacements:
===================

Node        DX         DY      Rotation
----      ------     ------   ---------
A          0.000      0.000   0.0000000
B         26.392     -2.614  -0.0075457
C         41.059     -3.622  -0.0075611
D          0.000      0.000   0.0000000
E         26.745     -2.803   0.0027204
F         40.706     -3.858   0.0055544
G         26.889     -1.321  -0.0032662
H         40.801     -1.824  -0.0021613
I          0.000      0.000  -0.0045720
J          0.000      0.000  -0.0044338
K         26.378     -1.321  -0.0033071
L         41.071     -1.824  -0.0023537

P-Delta Node Forces:
====================

Node        FX         FY         MZ
----     -------    -------    -------
B          2.814      0.000   0.0000000
C          1.202      0.000   0.0000000
E          3.167      0.000   0.0000000
F          1.197      0.000   0.0000000
G          1.499      0.000   0.0000000
H          0.569      0.000   0.0000000
K          1.428      0.000   0.0000000
L          0.601      0.000   0.0000000

Reactions:
==========

Node        FX         FY         MZ
----     -------    -------    -------
A         -3.625    989.141     63.325
D        -69.040   1060.859    205.798
I         -2.744    500.000      --
J         -2.368    500.000      --

Member End Forces:
==================

/----- Axial -----/   /----- Shear -----/   /----- Moment ----/
Member       FX J       FX K       FY J       FY K       MZ J       MZ K
------     -------    -------    -------    -------    -------    -------
AB         989.141   -989.141      3.625     -3.625     63.325    -39.762
BC         450.830   -450.830    -86.072     86.072   -236.573   -236.821
DE        1060.859  -1060.859     69.040    -69.040    205.798    242.962
EF         471.670   -471.670    117.583   -117.583    300.476    346.232
IG         500.000   -500.000      2.744     -2.744      0.000     17.839
GH         225.000   -225.000     -3.243      3.243    -17.839      0.000
JK         500.000   -500.000      2.368     -2.368      0.000     15.393
KL         225.000   -225.000     -2.799      2.799    -15.393      0.000
CF          90.673    -90.673    225.830    246.670    236.821   -346.232
BE         -90.622     90.622    263.312    314.188    276.335   -543.438
FH         -25.713     25.713    225.000    225.000      0.000      0.000
EG         -38.911     38.911    275.000    275.000      0.000      0.000
KB          -3.739      3.739    275.000    275.000      0.000      0.000
LC           3.400     -3.400    225.000    225.000      0.000      0.000



The above are the results of a second-order ($P-\Delta$) analysis and should be compared with the following figure from Kulak & Grondin:



In [10]:

display.Image('data/KG82.d/KG82c.jpg')




Out[10]:




In [11]:

import pandas as pd

BM = [('AB',64.0,-39.2),    # values given on gigure, above
('BC',-236.,-237.),
('DE',207.,244.),
('EF',301.,347.),
('BE',276.,-544.),
('CF',237.,-347.)]

BOOK = pd.DataFrame({m:{'MZJ':a,'MZK':b} for m,a,b in BM}).T
BOOK




Out[11]:

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
}

text-align: right;
}

MZJ
MZK

AB
64.0
-39.2

BC
-236.0
-237.0

BE
276.0
-544.0

CF
237.0
-347.0

DE
207.0
244.0

EF
301.0
347.0




In [12]:

HERE = pd.DataFrame([(m.id,ef.m2/1e6,ef.m5/1e6)
for m,ef in rs.member_efs.items()],columns=['ID','MZJ','MZK']).set_index(['ID'])
HERE = HERE.loc[BOOK.index]
HERE




Out[12]:

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
}

text-align: right;
}

MZJ
MZK

AB
63.324512
-39.761879

BC
-236.572716
-236.820752

BE
276.334595
-543.438243

CF
236.820752
-346.231622

DE
205.797688
242.962366

EF
300.475876
346.231622



% Difference in End Moments



In [13]:

(100*(HERE-BOOK)/HERE).round(2)




Out[13]:

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
}

text-align: right;
}

MZJ
MZK

AB
-1.07
1.41

BC
0.24
-0.08

BE
0.12
-0.10

CF
-0.08
-0.22

DE
-0.58
-0.43

EF
-0.17
-0.22



Max. difference is 1.4%, which is much better and is actually quite decent.



In [ ]: