# -------------------------------------------------------------------------------------------------- # Example 3. 2D Cantilever -- Static Pushover # Silvia Mazzoni & Frank McKenna, 2006 # execute this file after you have built the model, and after you apply gravity # # characteristics of pushover analysis set Dmax [expr 0.05*$LCol]; # maximum displacement of pushover. push to 10% drift. set Dincr [expr 0.001*$LCol]; # displacement increment for pushover. you want this to be very small, but not too small to slow down the analysis # create load pattern for lateral pushover load set Hload [expr $Weight]; # define the lateral load as a proportion of the weight so that the pseudo time equals the lateral-load coefficient when using linear load pattern pattern Plain 200 Linear {; # define load pattern -- generalized load 2 $Hload 0.0 0.0 0.0 0.0 0.0 } # STATIC-ANALYSIS parameters # CONSTRAINTS handler -- Determines how the constraint equations are enforced in the analysis (http://opensees.berkeley.edu/OpenSees/manuals/usermanual/617.htm) # Plain Constraints -- Removes constrained degrees of freedom from the system of equations (only for homogeneous equations) # Lagrange Multipliers -- Uses the method of Lagrange multipliers to enforce constraints # Penalty Method -- Uses penalty numbers to enforce constraints --good for static analysis with non-homogeneous eqns (rigidDiaphragm) # Transformation Method -- Performs a condensation of constrained degrees of freedom set constraintsType Plain; # default; constraints $constraintsType # DOF NUMBERER (number the degrees of freedom in the domain): (http://opensees.berkeley.edu/OpenSees/manuals/usermanual/366.htm) # determines the mapping between equation numbers and degrees-of-freedom # Plain -- Uses the numbering provided by the user # RCM -- Renumbers the DOF to minimize the matrix band-width using the Reverse Cuthill-McKee algorithm numberer Plain # SYSTEM (http://opensees.berkeley.edu/OpenSees/manuals/usermanual/371.htm) # Linear Equation Solvers (how to store and solve the system of equations in the analysis) # -- provide the solution of the linear system of equations Ku = P. Each solver is tailored to a specific matrix topology. # ProfileSPD -- Direct profile solver for symmetric positive definite matrices # BandGeneral -- Direct solver for banded unsymmetric matrices # BandSPD -- Direct solver for banded symmetric positive definite matrices # SparseGeneral -- Direct solver for unsymmetric sparse matrices # SparseSPD -- Direct solver for symmetric sparse matrices # UmfPack -- Direct UmfPack solver for unsymmetric matrices system BandGeneral # TEST: # convergence test to # Convergence TEST (http://opensees.berkeley.edu/OpenSees/manuals/usermanual/360.htm) # -- Accept the current state of the domain as being on the converged solution path # -- determine if convergence has been achieved at the end of an iteration step # NormUnbalance -- Specifies a tolerance on the norm of the unbalanced load at the current iteration # NormDispIncr -- Specifies a tolerance on the norm of the displacement increments at the current iteration # EnergyIncr-- Specifies a tolerance on the inner product of the unbalanced load and displacement increments at the current iteration set Tol 1.e-8; # Convergence Test: tolerance set maxNumIter 6; # Convergence Test: maximum number of iterations that will be performed before "failure to converge" is returned set printFlag 0; # Convergence Test: flag used to print information on convergence (optional) # 1: print information on each step; set TestType EnergyIncr; # Convergence-test type test $TestType $Tol $maxNumIter $printFlag; # Solution ALGORITHM: -- Iterate from the last time step to the current (http://opensees.berkeley.edu/OpenSees/manuals/usermanual/682.htm) # Linear -- Uses the solution at the first iteration and continues # Newton -- Uses the tangent at the current iteration to iterate to convergence # ModifiedNewton -- Uses the tangent at the first iteration to iterate to convergence set algorithmType Newton algorithm $algorithmType; # Static INTEGRATOR: -- determine the next time step for an analysis (http://opensees.berkeley.edu/OpenSees/manuals/usermanual/689.htm) # LoadControl -- Specifies the incremental load factor to be applied to the loads in the domain # DisplacementControl -- Specifies the incremental displacement at a specified DOF in the domain # Minimum Unbalanced Displacement Norm -- Specifies the incremental load factor such that the residual displacement norm in minimized # Arc Length -- Specifies the incremental arc-length of the load-displacement path # Transient INTEGRATOR: -- determine the next time step for an analysis including inertial effects # Newmark -- The two parameter time-stepping method developed by Newmark # HHT -- The three parameter Hilbert-Hughes-Taylor time-stepping method # Central Difference -- Approximates velocity and acceleration by centered finite differences of displacement integrator DisplacementControl $IDctrlNode $IDctrlDOF $Dincr # ANALYSIS -- defines what type of analysis is to be performed (http://opensees.berkeley.edu/OpenSees/manuals/usermanual/324.htm) # Static Analysis -- solves the KU=R problem, without the mass or damping matrices. # Transient Analysis -- solves the time-dependent analysis. The time step in this type of analysis is constant. The time step in the output is also constant. # variableTransient Analysis -- performs the same analysis type as the Transient Analysis object. The time step, however, is variable. This method is used when # there are convergence problems with the Transient Analysis object at a peak or when the time step is too small. The time step in the output is also variable. analysis Static # --------------------------------- perform Static Pushover Analysis set Nsteps [expr int($Dmax/$Dincr)]; # number of pushover analysis steps set ok [analyze $Nsteps]; # this will return zero if no convergence problems were encountered if {$ok != 0} { # if analysis fails, we try some other stuff, performance is slower inside this loop set ok 0; set controlDisp 0.0; set D0 0.0; # analysis starts from zero set Dstep [expr ($controlDisp-$D0)/($Dmax-$D0)] while {$Dstep < 1.0 && $ok == 0} { set controlDisp [nodeDisp $IDctrlNode $IDctrlDOF ] set Dstep [expr ($controlDisp-$D0)/($Dmax-$D0)] set ok [analyze 1 ] if {$ok != 0} { puts "Trying Newton with Initial Tangent .." test NormDispIncr $Tol 2000 0 algorithm Newton -initial set ok [analyze 1 ] test $TestType $Tol $maxNumIter 0 algorithm $algorithmType } if {$ok != 0} { puts "Trying Broyden .." algorithm Broyden 8 set ok [analyze 1 ] algorithm $algorithmType } if {$ok != 0} { puts "Trying NewtonWithLineSearch .." algorithm NewtonLineSearch .8 set ok [analyze 1 ] algorithm $algorithmType } }; # end while loop }; # end if ok !0 puts "Pushover Done. Control Disp=[nodeDisp $IDctrlNode $IDctrlDOF]"