if (displayMode == "displayON"): # a window to plot the nodal displacements versus load for node 3 ops.recorder("plot", "Node41.out", "Node_3_Xdisp", 10, 340, 300, 300, "-columns", 3, 1, "-dT", 0.1) # ------------------------------ # End of recorder generation # ------------------------------ # ------------------------------ # Start of lateral load analysis # ------------------------------ # Perform an eigenvalue analysis lam = ops.eigen(2) Tstart = 2.0*math.pi/math.sqrt(lam[0]) print("Fundamental period at start of pushover analysis: ", Tstart, "sec\n") # Change the integrator to take a min and max load increment ops.integrator("LoadControl", 1.0, 4, 0.02, 2.0) # record once at time 0 ops.record() # Perform the pushover analysis # Set some parameters maxU = 10.0; # Max displacement controlDisp = 0.0 ok = ops.analyze(1) while ((ok == 0) and (controlDisp < maxU)):
if (displayMode == "displayON"): # a window to plot the nodal displacements versus load for node 3 ops.recorder("plot", "Node41.out", "Node_3_Xdisp", 10, 340, 300, 300, "-columns", 3, 1, "-dT", 0.1) # ------------------------------ # End of recorder generation # ------------------------------ # ------------------------------ # Start of lateral load analysis # ------------------------------ # Perform an eigenvalue analysis lam = ops.eigen(2) Tstart = 2.0 * math.pi / math.sqrt(lam[0]) print("Fundamental period at start of pushover analysis: ", Tstart, "sec\n") # Change the integrator to take a min and max load increment ops.integrator("LoadControl", 1.0, 4, 0.02, 2.0) # record once at time 0 ops.record() # Perform the pushover analysis # Set some parameters maxU = 10.0 # Max displacement controlDisp = 0.0 ok = ops.analyze(1)
def get_inelastic_response(mass, k_spring, f_yield, motion, dt, xi=0.05, r_post=0.0): """ Run seismic analysis of a nonlinear SDOF :param mass: SDOF mass :param k_spring: spring stiffness :param f_yield: yield strength :param motion: list, acceleration values :param dt: float, time step of acceleration values :param xi: damping ratio :param r_post: post-yield stiffness :return: """ op.wipe() op.model('basic', '-ndm', 2, '-ndf', 3) # 2 dimensions, 3 dof per node # Establish nodes bot_node = 1 top_node = 2 op.node(bot_node, 0., 0.) op.node(top_node, 0., 0.) # Fix bottom node op.fix(top_node, opc.FREE, opc.FIXED, opc.FIXED) op.fix(bot_node, opc.FIXED, opc.FIXED, opc.FIXED) # Set out-of-plane DOFs to be slaved op.equalDOF(1, 2, *[2, 3]) # nodal mass (weight / g): op.mass(top_node, mass, 0., 0.) # Define material bilinear_mat_tag = 1 mat_type = "Steel01" mat_props = [f_yield, k_spring, r_post] op.uniaxialMaterial(mat_type, bilinear_mat_tag, *mat_props) # Assign zero length element beam_tag = 1 op.element('zeroLength', beam_tag, bot_node, top_node, "-mat", bilinear_mat_tag, "-dir", 1, '-doRayleigh', 1) # Define the dynamic analysis load_tag_dynamic = 1 pattern_tag_dynamic = 1 values = list(-1 * motion) # should be negative op.timeSeries('Path', load_tag_dynamic, '-dt', dt, '-values', *values) op.pattern('UniformExcitation', pattern_tag_dynamic, opc.X, '-accel', load_tag_dynamic) # set damping based on first eigen mode angular_freq = op.eigen('-fullGenLapack', 1)**0.5 alpha_m = 0.0 beta_k = 2 * xi / angular_freq beta_k_comm = 0.0 beta_k_init = 0.0 op.rayleigh(alpha_m, beta_k, beta_k_init, beta_k_comm) # Run the dynamic analysis op.wipeAnalysis() op.algorithm('Newton') op.system('SparseGeneral') op.numberer('RCM') op.constraints('Transformation') op.integrator('Newmark', 0.5, 0.25) op.analysis('Transient') tol = 1.0e-10 iterations = 10 op.test('EnergyIncr', tol, iterations, 0, 2) analysis_time = (len(values) - 1) * dt analysis_dt = 0.001 outputs = { "time": [], "rel_disp": [], "rel_accel": [], "rel_vel": [], "force": [] } while op.getTime() < analysis_time: curr_time = op.getTime() op.analyze(1, analysis_dt) outputs["time"].append(curr_time) outputs["rel_disp"].append(op.nodeDisp(top_node, 1)) outputs["rel_vel"].append(op.nodeVel(top_node, 1)) outputs["rel_accel"].append(op.nodeAccel(top_node, 1)) op.reactions() outputs["force"].append( -op.nodeReaction(bot_node, 1)) # Negative since diff node op.wipe() for item in outputs: outputs[item] = np.array(outputs[item]) return outputs
nep, fmt_interp='b-', az_el=(-68., 39.), fig_wi_he=fig_wi_he, endDispFlag=0) plt.title('3d 3-element cantilever beam') # - 2 opsv.plot_defo(sfac, 19, fmt_interp='b-', az_el=(6., 30.), fig_wi_he=fig_wi_he) plt.title('3d 3-element cantilever beam') # - 3 nfreq = 6 eigValues = ops.eigen(nfreq) modeNo = 6 sfac = 2.0e1 opsv.plot_mode_shape(modeNo, sfac, 19, fmt_interp='b-', az_el=(106., 46.), fig_wi_he=fig_wi_he) plt.title(f'Mode {modeNo}') sfacN = 1.e-2 sfacVy = 5.e-2 sfacVz = 1.e-2