Statics of a 3d 3-element cantilever beam

Example .py file can be downloaded here:

_images/demo_cantilever_3el_3d_model.png _images/demo_cantilever_3el_3d_extruded_members.png _images/demo_cantilever_3el_3d_defo.png _images/demo_cantilever_3el_3d_Mz.png _images/demo_cantilever_3el_3d_My.png _images/demo_cantilever_3el_3d_Vz.png _images/demo_cantilever_3el_3d_Vy.png _images/demo_cantilever_3el_3d_T.png
  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()