## cantilver column: transient versus modal transient analysis

If you have a script you think might be useful to others post it
here. Hopefully we will be able to get the most useful of these incorporated in the manuals.

Moderators: silvia, selimgunay, Moderators

fmk
Site Admin
Posts: 5866
Joined: Fri Jun 11, 2004 2:33 pm
Location: UC Berkeley
Contact:

### cantilver column: transient versus modal transient analysis

# Purpose: To show modal transient & transient analysis for elastic problems
# result in similar answer. Model is a cantilever column, constant
# cross section and mass distribution, elastic material modeeled
# using a bunch of elastic elements along the length.

# Notation&Theory: straight out of A. K. Chopra's book, 'Dynamics of Structures'

# Requires: ReadSMDFIle.tcl and some .at2 files to test (currently ARL360.at2)

# Note: to use more eigen values you have to add more nodes.
# you can uncomment disp recorders, plot in matlab disp.out versus sum(disp\$i.out)

# created: fmk
# date: 31/08/05

# The proc to read those .at2 files
source ReadSMDFile.tcl

# The motion name
set motion ARL360
#set motion IELC180

# Read in the motion
ReadSMDFile \$motion.at2 \$motion.acc dt

# Some constants
set PI 3.14159265
set g 386.4

# Cantilever Parameters
set M 200.0; # total mass
set L 10.0; # total length
set A 100.0; # cross-section area
set I 1000.0; # cross-section I
set E 2000.0; # column material E
set numNode 20; # num nodes to use to model column
set numEigen 9; # num modes to use

#
# the Cantilever Model Analysis
#

puts "Cantilever Model (\$numNode nodes and \$motion record)"

model basic -ndm 2 -ndf 3
set dL [expr \$L/(\$numNode -1)];
set dM [expr \$M/\$L*\$dL]

set currentHeight 0.0;
for {set i 1} {\$i < \$numNode} {incr i 1} {
node \$i 0.0 \$currentHeight -mass \$dM \$dM 0.0
set currentHeight [expr \$currentHeight + \$dL]
}
node \$numNode 0.0 \$L -mass [expr \$dM/2.0] [expr \$dM/2.0] 0.0
fix 1 1 1 1

geomTransf Linear 1
for {set i 1; set j 2} {\$i < \$numNode} {incr i 1; incr j 1} {
element elasticBeamColumn \$i \$i \$j \$A \$E \$I 1
}

set eigenvalues "[eigen \$numEigen]"

set accelSeries "Path -filePath \$motion.acc -dt \$dt -factor \$g"
pattern UniformExcitation 2 1 -accel \$accelSeries
recorder EnvelopeNode -file envelope.out -node \$numNode -dof 1 disp
recorder Node -time -file disp.out -node \$numNode -dof 1 disp
system ProfileSPD
constraints Plain
numberer Plain
algorithm Linear
integrator Newmark 0.5 0.25
analysis Transient
analyze 2000 \$dt;
remove recorders
if [catch {open envelope.out r} InFileID] {
puts "ERROR - cannot open envelope.out"
}
set min [gets \$InFileID]
set max [gets \$InFileID]
set absMax [gets \$InFileID]
close \$InFileID

puts "\tMax Tip Disp: \$absMax"
puts "\tEigenValues : \$eigenvalues"

#
# get participation factors & Eigenvector Values
# corresponding to tip displacement
#

remove recorders
set nodes " "
for {set i 1} {\$i <= \$numNode} {incr i 1} {
lappend nodes \$i
}

# get eigenvectors & eigenvalues & participation factors for tip
for {set i 1} {\$i <= \$numEigen} {incr i 1} {
set eig "eigen \$i"
set recorderCommand "recorder Node -file Eigenvector\$i.out -node \$nodes -dof 1 2 3 {eigen \$i}"
eval \$recorderCommand
}

analyze 1 0.01

# mass matrix; diagonal

set M ""
for {set i 1} {\$i < \$numNode} {incr i 1} {
lappend M \$dM
lappend M \$dM
lappend M 0.0
}
lappend M [expr \$dM/2.0]
lappend M [expr \$dM/2.0]
lappend M 0.0

# determine particpation factors
set participationFactors ""
set phisTopFloorDirnX ""
for {set i 1} {\$i <= \$numEigen} {incr i 1} {
if [catch {open Eigenvector\$i.out r} InFileID] {
puts "ERROR - cannot open envelope.out"
}
set eigenVector [gets \$InFileID]
set Ln 0.0;
set Mn 0.0;
for {set j 0} {\$j < [expr \$numNode*3]} {incr j 1} {
set mJ [lindex \$M \$j];
set phiJ [lindex \$eigenVector \$j];

set Ln [expr \$Ln + \$mJ * \$phiJ];
set Mn [expr \$Mn + \$mJ * \$phiJ * \$phiJ];
}

set participationFactor [expr \$Ln / \$Mn]
set phiTopFloor [lindex \$eigenVector [expr (\$numNode*3 -3)]]
lappend participationFactors \$participationFactor
lappend phisTopFloorDirnX \$phiTopFloor
}

puts "\tParticipation Factors: \$participationFactors"
puts "\tEigenvector Values Tip X Dirn: \$phisTopFloorDirnX"

#
# the Modal Analysis
#

puts "\n\nModal Analysis (for ground motion * participation factor * eigenvector value for tip x disp)"

# reset some param
set M 1.0;
set A 1.0;
set L 1.0;
set loc 0;
set modalResults "";
for {set i 0} {\$i < \$numEigen} {incr i 1} {
set eigenvalue [lindex \$eigenvalues \$i]
set participationFactor [lindex \$participationFactors \$i]
set phiTopFloor [lindex \$phisTopFloorDirnX \$i]
set accelSeries "Path -filePath \$motion.acc -dt \$dt -factor [expr \$g * \$participationFactor * \$phiTopFloor]"
wipe
model basic -ndm 1 -ndf 1
set K [expr \$eigenvalue * \$M];
set E [expr \$K * \$L / \$A];
node 1 0.0
node 2 \$L -mass \$M
fix 1 1
uniaxialMaterial Elastic 1 \$E
element truss 1 1 2 \$A 1
pattern UniformExcitation 2 1 -accel \$accelSeries
recorder EnvelopeNode -file envelope.out -node 2 -dof 1 disp
recorder Node -time -file disp\$loc.out -node 2 -dof 1 disp
system ProfileSPD
constraints Plain
numberer Plain
algorithm Linear
integrator Newmark 0.5 0.25
analysis Transient
analyze 2000 \$dt;
remove recorders
if [catch {open envelope.out r} InFileID] {
puts "ERROR - cannot open envelope.out"
}
set min [gets \$InFileID]
set max [gets \$InFileID]
set absMax [gets \$InFileID]
close \$InFileID
puts "\teigenvalue: \$eigenvalue max disp: \$absMax"
lappend modalResults \$absMax;
}

set absSum 0.0;
set srss 0.0;
for {set i 0} {\$i < \$numEigen} {incr i 1} {
set responseI [lindex \$modalResults \$i];
set absSum [expr \$absSum + \$responseI]
set srss [expr \$srss + \$responseI * \$responseI]
}
set srss [expr sqrt(\$srss)]

puts "\nCombination of Modal Responses:"
puts "\tAbsolute Sum combination: \$absSum"
puts "\tSquare Root of Sum Of Squares (SRSS) combination: \$srss"

johnnyontheweb
Posts: 43
Joined: Sat Oct 08, 2011 6:28 am

### Re: cantilver column: transient versus modal transient analy

thanks for the useful post, but how to extract the participation factors from a complex structures, e.g. a building? (this is easily done here 'cause it's a cantilever...).
I read from other topic in this forum that OS does not allow to obtain the participation factors from a modal analysis,
can you please tell if there is the possibility to obtain the participation factors from an external recorder?
in other words, is it possible to write a recorder (and if so, I'll try to do it) than would give as output the participation factors after a modal analysis or the OS framework does not allow that?
thanks,
Giovanni

fmk
Site Admin
Posts: 5866
Joined: Fri Jun 11, 2004 2:33 pm
Location: UC Berkeley
Contact:

### Re: cantilver column: transient versus modal transient analy

no recorder will presently give you the factors. you could write one to give you the factors as it is just a combination of eigenvector values and masses. you might start with the Node recorder.