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

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

cantilver column: transient versus modal transient analysis

Post by fmk » Thu Sep 01, 2005 10:48 am

# 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

Post by johnnyontheweb » Thu Jun 13, 2013 7:23 am

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: 5883
Joined: Fri Jun 11, 2004 2:33 pm
Location: UC Berkeley
Contact:

Re: cantilver column: transient versus modal transient analy

Post by fmk » Thu Jun 13, 2013 11:34 am

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.

Post Reply