def test_ElasticFrame(): # # some parameter # PI = 2.0 * asin(1.0) g = 386.4 ft = 12.0 Load1 = 1185.0 Load2 = 1185.0 Load3 = 970.0 # floor masses m1 = Load1 / (4 * g) # 4 nodes per floor m2 = Load2 / (4 * g) m3 = Load3 / (4 * g) # floor distributed loads w1 = Load1 / (90 * ft) # frame 90 ft long w2 = Load2 / (90 * ft) w3 = Load3 / (90 * ft) # ------------------------------ # Start of model generation # ------------------------------ # Remove existing model ops.wipe() # Create ModelBuilder (with two-dimensions and 2 DOF/node) ops.model('BasicBuilder', '-ndm', 2, '-ndf', 3) # Create nodes # ------------ # Create nodes & add to Domain - command: node nodeId xCrd yCrd <-mass massX massY massRz> # NOTE: mass in optional ops.node(1, 0.0, 0.0) ops.node(2, 360.0, 0.0) ops.node(3, 720.0, 0.0) ops.node(4, 1080.0, 0.0) ops.node(5, 0.0, 162.0, '-mass', m1, m1, 0.0) ops.node(6, 360.0, 162.0, '-mass', m1, m1, 0.0) ops.node(7, 720.0, 162.0, '-mass', m1, m1, 0.0) ops.node(8, 1080.0, 162.0, '-mass', m1, m1, 0.0) ops.node(9, 0.0, 324.0, '-mass', m2, m2, 0.0) ops.node(10, 360.0, 324.0, '-mass', m2, m2, 0.0) ops.node(11, 720.0, 324.0, '-mass', m2, m2, 0.0) ops.node(12, 1080.0, 324.0, '-mass', m2, m2, 0.0) ops.node(13, 0.0, 486.0, '-mass', m3, m3, 0.0) ops.node(14, 360.0, 486.0, '-mass', m3, m3, 0.0) ops.node(15, 720.0, 486.0, '-mass', m3, m3, 0.0) ops.node(16, 1080.0, 486.0, '-mass', m3, m3, 0.0) # the boundary conditions - command: fix nodeID xResrnt? yRestrnt? rZRestrnt? ops.fix(1, 1, 1, 1) ops.fix(2, 1, 1, 1) ops.fix(3, 1, 1, 1) ops.fix(4, 1, 1, 1) # Define geometric transformations for beam-column elements ops.geomTransf('Linear', 1) # beams ops.geomTransf('PDelta', 2) # columns # Define elements # Create elastic beam-column - command: element elasticBeamColumn eleID node1 node2 A E Iz geomTransfTag # Define the Columns ops.element('elasticBeamColumn', 1, 1, 5, 75.6, 29000.0, 3400.0, 2) # W14X257 ops.element('elasticBeamColumn', 2, 5, 9, 75.6, 29000.0, 3400.0, 2) # W14X257 ops.element('elasticBeamColumn', 3, 9, 13, 75.6, 29000.0, 3400.0, 2) # W14X257 ops.element('elasticBeamColumn', 4, 2, 6, 91.4, 29000.0, 4330.0, 2) # W14X311 ops.element('elasticBeamColumn', 5, 6, 10, 91.4, 29000.0, 4330.0, 2) # W14X311 ops.element('elasticBeamColumn', 6, 10, 14, 91.4, 29000.0, 4330.0, 2) # W14X311 ops.element('elasticBeamColumn', 7, 3, 7, 91.4, 29000.0, 4330.0, 2) # W14X311 ops.element('elasticBeamColumn', 8, 7, 11, 91.4, 29000.0, 4330.0, 2) # W14X311 ops.element('elasticBeamColumn', 9, 11, 15, 91.4, 29000.0, 4330.0, 2) # W14X311 ops.element('elasticBeamColumn', 10, 4, 8, 75.6, 29000.0, 3400.0, 2) # W14X257 ops.element('elasticBeamColumn', 11, 8, 12, 75.6, 29000.0, 3400.0, 2) # W14X257 ops.element('elasticBeamColumn', 12, 12, 16, 75.6, 29000.0, 3400.0, 2) # W14X257 # Define the Beams ops.element('elasticBeamColumn', 13, 5, 6, 34.7, 29000.0, 5900.0, 1) # W33X118 ops.element('elasticBeamColumn', 14, 6, 7, 34.7, 29000.0, 5900.0, 1) # W33X118 ops.element('elasticBeamColumn', 15, 7, 8, 34.7, 29000.0, 5900.0, 1) # W33X118 ops.element('elasticBeamColumn', 16, 9, 10, 34.2, 29000.0, 4930.0, 1) # W30X116 ops.element('elasticBeamColumn', 17, 10, 11, 34.2, 29000.0, 4930.0, 1) # W30X116 ops.element('elasticBeamColumn', 18, 11, 12, 34.2, 29000.0, 4930.0, 1) # W30X116 ops.element('elasticBeamColumn', 19, 13, 14, 20.1, 29000.0, 1830.0, 1) # W24X68 ops.element('elasticBeamColumn', 20, 14, 15, 20.1, 29000.0, 1830.0, 1) # W24X68 ops.element('elasticBeamColumn', 21, 15, 16, 20.1, 29000.0, 1830.0, 1) # W24X68 # Define loads for Gravity Analysis # --------------------------------- #create a Linear TimeSeries (load factor varies linearly with time): command timeSeries Linear tag ops.timeSeries('Linear', 1) # Create a Plain load pattern with a linear TimeSeries: # command pattern Plain tag timeSeriesTag { loads } ops.pattern('Plain', 1, 1) ops.eleLoad('-ele', 13, 14, 15, '-type', '-beamUniform', -w1) ops.eleLoad('-ele', 16, 17, 18, '-type', '-beamUniform', -w2) ops.eleLoad('-ele', 19, 20, 21, '-type', '-beamUniform', -w3) # --------------------------------- # Create Analysis for Gravity Loads # --------------------------------- # Create the system of equation, a SPD using a band storage scheme ops.system('BandSPD') # Create the DOF numberer, the reverse Cuthill-McKee algorithm ops.numberer('RCM') # Create the constraint handler, a Plain handler is used as h**o constraints ops.constraints('Plain') # Create the integration scheme, the LoadControl scheme using steps of 1.0 ops.integrator('LoadControl', 1.0) # Create the solution algorithm, a Linear algorithm is created ops.test('NormDispIncr', 1.0e-10, 6) ops.algorithm('Newton') # create the analysis object ops.analysis('Static') # --------------------------------- # Perform Gravity Analysis # --------------------------------- ops.analyze(1) # print "node 5: nodeDisp 5" # print "node 6: nodeDisp 6" # print "node 7: nodeDisp 7" # print "node 8: nodeDisp 8" # print "node 9: nodeDisp 9" # print "node 10: nodeDisp 10" # --------------------------------- # Check Equilibrium # --------------------------------- # invoke command to determine nodal reactions ops.reactions() node1Rxn = ops.nodeReaction( 1 ) # nodeReaction command returns nodal reactions for specified node in a list node2Rxn = ops.nodeReaction(2) node3Rxn = ops.nodeReaction(3) node4Rxn = ops.nodeReaction(4) inputedFy = -Load1 - Load2 - Load3 # loads added negative Fy diren to ele computedFx = node1Rxn[0] + node2Rxn[0] + node3Rxn[0] + node4Rxn[0] computedFy = node1Rxn[1] + node2Rxn[1] + node3Rxn[1] + node4Rxn[1] print("\nEqilibrium Check After Gravity:") print("SumX: Inputed: 0.0 + Computed:", computedFx, " = ", 0.0 + computedFx) print("SumY: Inputed: ", inputedFy, " + Computed: ", computedFy, " = ", inputedFy + computedFy) # --------------------------------- # Lateral Load # --------------------------------- # gravity loads constant and time in domain to e 0.0 ops.loadConst('-time', 0.0) ops.timeSeries('Linear', 2) ops.pattern('Plain', 2, 2) ops.load(13, 220.0, 0.0, 0.0) ops.load(9, 180.0, 0.0, 0.0) ops.load(5, 90.0, 0.0, 0.0) # --------------------------------- # Create Recorder # --------------------------------- #recorder Element -file EleForces.out -ele 1 4 7 10 forces # --------------------------------- # Perform Lateral Analysis # --------------------------------- ops.analyze(1) # print "node 5: nodeDisp 5" # print "node 6: nodeDisp 6" # print "node 7: nodeDisp 7" # print "node 8: nodeDisp 8" # print "node 9: nodeDisp 9" # print "node 10: nodeDisp 10" # --------------------------------- # Check Equilibrium # --------------------------------- ops.reactions() node1Rxn = ops.nodeReaction( 1 ) # =nodeReaction( command returns nodal reactions for specified node in a list node2Rxn = ops.nodeReaction(2) node3Rxn = ops.nodeReaction(3) node4Rxn = ops.nodeReaction(4) inputedFx = 220.0 + 180.0 + 90.0 computedFx = node1Rxn[0] + node2Rxn[0] + node3Rxn[0] + node4Rxn[0] computedFy = node1Rxn[1] + node2Rxn[1] + node3Rxn[1] + node4Rxn[1] print("\nEqilibrium Check After Lateral Loads:") print("SumX: Inputed: ", inputedFx, " + Computed: ", computedFx, " = ", inputedFx + computedFx) print("SumY: Inputed: ", inputedFy, " + Computed: ", computedFy, " = ", inputedFy + computedFy) # print ele information for columns at base #print ele 1 4 7 10 # --------------------------------- # Check Eigenvalues # --------------------------------- eigenValues = ops.eigen(5) print("\nEigenvalues:") eigenValue = eigenValues[0] T1 = 2 * PI / sqrt(eigenValue) print("T1 = ", T1) eigenValue = eigenValues[1] T2 = 2 * PI / sqrt(eigenValue) print("T2 = ", T2) eigenValue = eigenValues[2] T3 = 2 * PI / sqrt(eigenValue) print("T3 = ", T3) eigenValue = eigenValues[3] T4 = 2 * PI / sqrt(eigenValue) print("T4 = ", T4) eigenValue = eigenValues[4] T5 = 2 * PI / sqrt(eigenValue) print("T5 = ", T5) assert abs(T1 - 1.0401120938612862) < 1e-12 and abs( T2 - 0.3526488583606463 ) < 1e-12 and abs(T3 - 0.1930409642350476) < 1e-12 and abs( T4 - 0.15628823050715784) < 1e-12 and abs(T5 - 0.13080166151268388) < 1e-12 #recorder Node -file eigenvector.out -nodeRange 5 16 -dof 1 2 3 eigen 0 #record print("==========================")
#op.recorder('Drift', '-file', 'Data-4-inelasticFiber/Drift.out','-time', '-node', 1, '-dof', 1,2,3, 'disp') op.recorder('Element', '-file', 'Data-4-inelasticFiber/FCol.out', '-time', '-ele', 1, 2, 'globalForce') op.recorder('Element', '-file', 'Data-4-inelasticFiber/FBeam.out', '-time', '-ele', 3, 'globalForce') op.recorder('Element', '-file', 'Data-4-inelasticFiber/ForceColSec1.out', '-time', '-ele', 1, 2, 'section', 1, 'force') op.recorder('Element', '-file', 'Data-4-inelasticFiber/DefoColSec1.out', '-time', '-ele', 1, 2, 'section', 1, 'deformation') #op.recorder('Element', '-file', 'Data-4-inelasticFiber/DCol.out','-time', '-ele', 1, 'deformations') #defining gravity loads WzBeam = Weight / LBeam op.timeSeries('Linear', 1) op.pattern('Plain', 1, 1) op.eleLoad('-ele', 3, '-type', '-beamUniform', -WzBeam, 0.0, 0.0) #op.load(2, 0.0, -PCol, 0.0) Tol = 1e-8 # convergence tolerance for test NstepGravity = 10 DGravity = 1 / NstepGravity op.integrator('LoadControl', DGravity) # determine the next time step for an analysis op.numberer( 'Plain' ) # renumber dof's to minimize band-width (optimization), if you want to op.system('BandGeneral' ) # how to store and solve the system of equations in the analysis op.constraints('Plain') # how it handles boundary conditions op.test(
ops.element('elasticBeamColumn', 2, 3, 4, Acol, E, IzCol, 1) # girder ops.element('elasticBeamColumn', 3, 2, 4, Agir, E, IzGir, 1) Px = 2.e+3 Wy = -10.e+3 Wx = 0. Ew = {3: ['-beamUniform', Wy, Wx]} ops.timeSeries('Constant', 1) ops.pattern('Plain', 1, 1) ops.load(2, Px, 0., 0.) for etag in Ew: ops.eleLoad('-ele', etag, '-type', Ew[etag][0], Ew[etag][1], Ew[etag][2]) ops.constraints('Transformation') ops.numberer('RCM') ops.system('BandGeneral') ops.test('NormDispIncr', 1.0e-6, 6, 2) ops.algorithm('Linear') ops.integrator('LoadControl', 1) ops.analysis('Static') ops.analyze(1) ops.printModel() # 1. plot model with tag lebels szer, wys = 16., 10.
def dead_load(): ''' dead load ''' ops.timeSeries('Linear', 1) ops.pattern('Plain', 1, 1) ops.eleLoad('-ele', 1, '-type', '-beamUniform', 0, -1.000E+001, 0) ops.eleLoad('-ele', 2, '-type', '-beamUniform', 0, -1.000E+001, 0) ops.eleLoad('-ele', 3, '-type', '-beamUniform', 0, -1.000E+001, 0) ops.eleLoad('-ele', 4, '-type', '-beamUniform', 0, -1.000E+001, 0) ops.eleLoad('-ele', 5, '-type', '-beamUniform', 0, -1.000E+001, 0) ops.eleLoad('-ele', 6, '-type', '-beamUniform', 0, -1.000E+001, 0) logger.info("load create")
def dead_load(): ''' dead load ''' ops.timeSeries('Linear', 1) ops.pattern('Plain', 1, 1) ops.eleLoad('-ele', 5, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 5, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 5, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 8, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 8, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 6, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 6, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 6, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 7, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 7, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 15, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 15, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 21, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 21, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 21, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 18, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 18, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 19, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 19, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 19, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 16, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 16, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 19, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 19, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 19, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 17, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 17, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 20, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 20, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 20, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 28, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 28, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 34, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 34, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 34, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 31, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 31, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 32, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 32, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 32, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 29, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 29, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 32, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 32, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 32, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 30, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 30, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 33, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 33, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 33, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 41, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 41, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 47, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 47, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 47, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 44, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 44, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 45, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 45, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 45, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 42, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 42, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 45, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 45, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 45, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 43, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 43, '-type', '-beamUniform', 0, -4.219E+000, 0) ops.eleLoad('-ele', 46, '-type', '-beamUniform', 0, -3.797E+000, 0) ops.eleLoad('-ele', 46, '-type', '-beamUniform', 0, -1.688E+000, 0) ops.eleLoad('-ele', 46, '-type', '-beamUniform', 0, -3.797E+000, 0) logger.info("load create")
for k in range(len(col_split_point) - 1): c = stu.Column( none, stu.node_manager.anti_get(col_split_point[k]), stu.node_manager.anti_get(col_split_point[k + 1])) # element('dispBeamColumn', eleTag, *eleNodes, transfTag, integrationTag, # '-cMass', '-mass', mass=0.0) ops.element("dispBeamColumn", c.name, col_split_point[k], col_split_point[k + 1], 1, 4, '-mass', mass_col_all_beamL) # eleLoad('-ele', *eleTags, '-range', eleTag1, eleTag2, '-type', '-beamUniform', # Wy, Wz=0.0, Wx=0.0, '-beamPoint', Py, Pz=0.0, xL, Px=0.0, '-beamThermal', *tempPts) # create load for beamL_lvl_all: ops.eleLoad("ele", c.name, "-range", c.name, c.name, '-type', '-beamUniform', Wy_L, Wz_L, Wx_L) # when Undivided # ops.element("dispBeamColumn", *j , 1 , 4 , '-mass' , mass) # create element for beamB_lvl_all split_num_beam_B = 5 mass_col_all_beamB = col_area_all_beam * unit_mass_Q235B + 15.0 / 9800 Wy_B, Wz_B, Wx_B = 0.0, -mass_col_all_beamB * 9800, 0.0 for i in range(14): for j in frame_lvl_14.to_beamB_nth(i): col = stu.member_manager.get_object_by_id(j[0]) col.splitB(split_num_beam_B)
Iz1 = 4423680.0 op.element('elasticBeamColumn', 1, 1, 3, A, E, Iz, 1) op.element('elasticBeamColumn', 2, 2, 4, A, E, Iz, 1) op.element('elasticBeamColumn', 3, 3, 4, A1, E, Iz1, 1) op.recorder('Node', '-file', 'Data-1b/DFree.out','-time', '-node', 3,4, '-dof', 1,2,3, 'disp') op.recorder('Node', '-file', 'Data-1b/DBase.out','-time', '-node', 1,2, '-dof', 1,2,3, 'disp') op.recorder('Node', '-file', 'Data-1b/RBase.out','-time', '-node', 1,2, '-dof', 1,2,3, 'reaction') #op.recorder('Drift', '-file', 'Data-1b/Drift.out','-time', '-node', 1, '-dof', 1,2,3, 'disp') op.recorder('Element', '-file', 'Data-1b/FCol.out','-time', '-ele', 1,2, 'globalForce') op.recorder('Element', '-file', 'Data-1b/DCol.out','-time', '-ele', 3, 'deformations') #defining gravity loads op.timeSeries('Linear', 1) op.pattern('Plain', 1, 1) op.eleLoad('-ele', 3, '-type', '-beamUniform', -7.94) op.constraints('Plain') op.numberer('Plain') op.system('BandGeneral') op.test('NormDispIncr', 1e-8, 6) op.algorithm('Newton') op.integrator('LoadControl', 0.1) op.analysis('Static') op.analyze(10) op.loadConst('-time', 0.0) #applying Dynamic Ground motion analysis op.timeSeries('Path', 2, '-dt', 0.01, '-filePath', 'BM68elc.acc', '-factor', 1.0) op.pattern('UniformExcitation', 2, 1, '-accel', 2) #how to give accelseriesTag?