Statics of a 3d 3-element cantilever beam
Example .py
file can be downloaded here
:
1import openseespy.opensees as ops
2# import opensees as ops # local compilation
3import opsvis as opsv
4
5import matplotlib.pyplot as plt
6
7ops.wipe()
8
9ops.model('basic', '-ndm', 3, '-ndf', 6)
10
11b = 0.2
12h = 0.4
13
14A, Iz, Iy, J = 0.04, 0.0010667, 0.0002667, 0.01172
15
16E = 25.0e6
17G = 9615384.6
18
19# Lx, Ly, Lz = 4., 3., 5.
20Lx, Ly, Lz = 4., 4., 4.
21
22ops.node(1, 0., 0., 0.)
23ops.node(2, 0., 0., Lz)
24ops.node(3, Lx, 0., Lz)
25ops.node(4, Lx, Ly, Lz)
26
27ops.fix(1, 1, 1, 1, 1, 1, 1)
28
29lmass = 200.
30
31ops.mass(2, lmass, lmass, lmass, 0.001, 0.001, 0.001)
32ops.mass(3, lmass, lmass, lmass, 0.001, 0.001, 0.001)
33ops.mass(4, lmass, lmass, lmass, 0.001, 0.001, 0.001)
34
35gTTagz = 1
36gTTagx = 2
37gTTagy = 3
38
39coordTransf = 'Linear'
40ops.geomTransf(coordTransf, gTTagz, 0., -1., 0.)
41ops.geomTransf(coordTransf, gTTagx, 0., -1., 0.)
42ops.geomTransf(coordTransf, gTTagy, 1., 0., 0.)
43
44ops.element('elasticBeamColumn', 1, 1, 2, A, E, G, J, Iy, Iz, gTTagz)
45ops.element('elasticBeamColumn', 2, 2, 3, A, E, G, J, Iy, Iz, gTTagx)
46ops.element('elasticBeamColumn', 3, 3, 4, A, E, G, J, Iy, Iz, gTTagy)
47
48Ew = {}
49
50Px = -4.e1
51Py = -2.5e1
52Pz = -3.e1
53
54ops.timeSeries('Constant', 1)
55ops.pattern('Plain', 1, 1)
56ops.load(4, Px, Py, Pz, 0., 0., 0.)
57
58ops.constraints('Transformation')
59ops.numberer('RCM')
60ops.system('BandGeneral')
61ops.test('NormDispIncr', 1.0e-6, 6, 2)
62ops.algorithm('Linear')
63ops.integrator('LoadControl', 1)
64ops.analysis('Static')
65ops.analyze(1)
66
67
68opsv.plot_model()
69
70sfac = 2.0e0
71
72# fig_wi_he = 22., 14.
73fig_wi_he = 30., 20.
74
75# - 1
76nep = 9
77opsv.plot_defo(sfac, nep, fmt_interp='b-', az_el=(-68., 39.),
78 fig_wi_he=fig_wi_he, endDispFlag=0)
79
80plt.title('3d 3-element cantilever beam')
81
82# - 2
83opsv.plot_defo(sfac, 19, fmt_interp='b-', az_el=(6., 30.),
84 fig_wi_he=fig_wi_he)
85
86plt.title('3d 3-element cantilever beam')
87
88# - 3
89nfreq = 6
90eigValues = ops.eigen(nfreq)
91
92modeNo = 6
93
94sfac = 2.0e1
95opsv.plot_mode_shape(modeNo, sfac, 19, fmt_interp='b-', az_el=(106., 46.),
96 fig_wi_he=fig_wi_he)
97plt.title(f'Mode {modeNo}')
98
99sfacN = 1.e-2
100sfacVy = 5.e-2
101sfacVz = 1.e-2
102sfacMy = 1.e-2
103sfacMz = 1.e-2
104sfacT = 1.e-2
105
106# plt.figure()
107minY, maxY = opsv.section_force_diagram_3d('N', Ew, sfacN)
108plt.title(f'Axial force N, max = {maxY:.2f}, min = {minY:.2f}')
109
110minY, maxY = opsv.section_force_diagram_3d('Vy', Ew, sfacVy)
111plt.title(f'Transverse force Vy, max = {maxY:.2f}, min = {minY:.2f}')
112
113minY, maxY = opsv.section_force_diagram_3d('Vz', Ew, sfacVz)
114plt.title(f'Transverse force Vz, max = {maxY:.2f}, min = {minY:.2f}')
115
116minY, maxY = opsv.section_force_diagram_3d('My', Ew, sfacMy)
117plt.title(f'Bending moments My, max = {maxY:.2f}, min = {minY:.2f}')
118
119minY, maxY = opsv.section_force_diagram_3d('Mz', Ew, sfacMz)
120plt.title(f'Bending moments Mz, max = {maxY:.2f}, min = {minY:.2f}')
121
122minY, maxY = opsv.section_force_diagram_3d('T', Ew, sfacT)
123plt.title(f'Torsional moment T, max = {maxY:.2f}, min = {minY:.2f}')
124
125# just for demonstration,
126# the section data below does not match the data in OpenSees model above
127# For now it can be source of inconsistency because OpenSees has
128# not got functions to return section dimensions.
129# A workaround is to have own Python helper functions to reuse data
130# specified once
131ele_shapes = {1: ['circ', [h]],
132 2: ['rect', [b, h]],
133 3: ['I', [b, h, b/10., h/6.]]}
134opsv.plot_extruded_shapes_3d(ele_shapes, fig_wi_he=fig_wi_he)
135
136plt.show()
137
138exit()