Structural systems typically have different ground accelerations at supports separated by long distances. These systems can be a single structure such as a long span bridge or multiple structures in a region.
While most OpenSees analyses use uniform excitation with effective earthquake forces applied to the dynamic DOFs of the model, the framework also accommodates multi-support excitation. The basic idea is that the locations of support excitation become DOFs where the ground displacement is input–much like putting sp constraints inside a load pattern.
For more details on the equation of motion for multiple-support excitation, see Ch. 9 of Chopra, 5th edition. Although Chopra presents the equation of motion for linear-elastic models, the extension to nonlinear models is straightforward.
But rather than get into details of the equation of motion, I’d like to show how to apply multiple-support excitation in OpenSees. As usual, so we don’t get mired in the details of specific element and material models, I’ll use a simple 1D model.
After defining the model, we define time series for two ground motions, then impose the ground motions at the two supports.
import openseespy.opensees as ops
k = 60
m = 2
g = 386.4
ops.wipe()
ops.model('basic','-ndm',1,'-ndf',1)
ops.node(1,0); ops.fix(1,1)
ops.node(2,0); ops.mass(2,m)
ops.node(3,0); ops.fix(3,1)
ops.uniaxialMaterial('Elastic',1,k)
ops.element('zeroLength',1,1,2,'-mat',1,'-dir',1)
ops.element('zeroLength',2,2,3,'-mat',1,'-dir',1)
ops.timeSeries('Path',1,'-dt',0.02,'-filePath','tabasFN.txt','-factor',g)
ops.timeSeries('Path',2,'-dt',0.02,'-filePath','tabasFP.txt','-factor',g)
ops.pattern('MultipleSupport',1)
ops.groundMotion(1,'Plain','-accel',1)
ops.imposedMotion(1,1,1) # node, dof, gmTag
ops.groundMotion(2,'Plain','-accel',2)
ops.imposedMotion(3,1,2)
The default integration for obtaining ground velocity and displacement from ground acceleration is the trapezoidal rule. You can also use Simpson’s rule.
In addition, the groundMotion
and imposedMotion
objects must be defined after the load pattern. In Tcl speak, these objects should be inside braces.
timeSeries Path 1 -dt 0.02 -filePath tabasFN.txt -factor $g
timeSeries Path 2 -dt 0.02 -filePath tabasFP.txt -factor $g
pattern MultipleSupport 1 {
groundMotion 1 Plain -accel 1
imposedMotion 1 1 1 ;# node, dof, gmTag
groundMotion 2 Plain -accel 2
imposedMotion 3 1 2
}
After performing dynamic analysis, the displacement response histories of the mass and the two supports are shown below.
We see that the supports have different displacement response histories, as expected, while the dynamic DOF vibrates. Multiple-support excitation is fairly straightforward in OpenSees.
The remainder of this post deals with two ways to apply uniform excitation to the simple 1D model. First, we can impose the same ground motion at the supports.
ops.timeSeries('Path',1,'-dt',0.02,'-filePath','tabasFN.txt','-factor',g)
ops.pattern('MultipleSupport',1)
ops.groundMotion(1,'Plain','-accel',1)
ops.imposedMotion(1,1,1) # node, dof, gmTag
ops.imposedMotion(3,1,1)
Alternatively, we can apply a standard uniform excitation.
ops.timeSeries('Path',1,'-dt',0.02,'-filePath','tabasFN.txt','-factor',g)
ops.pattern('UniformExcitation',1,1,'-accel',1) # tag, dir, tsTag
These two approaches give the same response for the dynamic DOF (relative to the ground displacement). But of course we lose the ground displacement when doing the standard uniform excitation.
Dear Dr. Scott,
Thank you for such an informative post. I consider every post from you as a gem. I have a question to you. In OS wiki page, it says at groundMotion page that “For earthquake excitations it is important that the user provide the displacement time history, as the one generated using the trapezoidal method will not provide good results.”, Why is it so? Do we have to be careful about our accelerogram input? Kindly throw some light on this point. Thank you again.
LikeLiked by 1 person
Hello Prabakaran,
Thank you for the question. I’m not sure how important that is for earthquake ground motion, but I’ve never looked at the issue.
PD
LikeLike
Sure Dr. Scott. Thanks for your reply.
LikeLike
Thank you for a fantastic article. I’d would like to ask you a question. Is Multiple-Support Excitation better for high-rise structures? Because I believe uniform excitation causes a uniform acceleration across all nodes of the structure, which may be true for rigid and short structures but not for high-rise structures (of course, this is my opinion). What are your thoughts on this?
LikeLiked by 1 person
Hello MSB,
Thank you! I don’t know if multiple-support excitation would be better for high rise structures.
PD
LikeLike
Dear Dr. Scott,
Thank you for your post. I have a question. I have a 3D soil column model, which I should apply horizontal and vertical ground acceleration to the base nodes. (horizontal acc to node 1, and vertical acc to node 2, which they are 2 meter apart of each other). May I use multiple support excitation in this case?
If yes, how can I define vertical direction for acceleration to the multiple support excitation model?
thank you
LikeLike
Yes, you can do that. It’s a pretty common scenario and you can find examples online.
LikeLike
Dear Dr. Scott,
is it possible to help me how to define recorders in this case?
timeSeries Path 1 -dt 0.02 -filePath tabasFN.txt -factor $g
timeSeries Path 2 -dt 0.02 -filePath tabasFP.txt -factor $g
pattern MultipleSupport 1 {
groundMotion 1 Plain -accel 1
imposedMotion 1 1 1 ;# node, dof, gmTag
groundMotion 2 Plain -accel 2
imposedMotion 3 1 2
}
I run your code with my acceleration data, but I think there is a problem with recorders! I want to apply accel X and accel Y at the same time, but I don’t know how to record them,
here is my recorder code:
## record nodal displacments, velocities, and accelerations at each time step
recorder Node -file displacement.out -time -dT $recDT -nodeRange 1 $nNodeT -dof 1 2 3 disp
recorder Node -file velocity.out -time -dT $recDT -nodeRange 1 $nNodeT -dof 1 2 3 vel
recorder Node -file acceleration.out -time -dT $recDT -nodeRange 1 $nNodeT -dof 1 2 3 accel
may I define 2 recorders? for each accel directions?
regards
LikeLike
Yes, you should be able to define two recorders for each direction. You can post your issue on the OpenSees message board or Facebook group.
LikeLike
Hi Prof. Scott,
Thank you very much for this post. Nonetheless, it is not very obvious to me how OpenSeesPy relates a Multiple-Support Excitation (MSE) Pattern to different imposedmotions. (In tcl this looks more obvious). I am guessing that since these commands (“groundMotion” and “imposedMotion”) are associated only with MSE patterns, there is no need for this. So, unlike the uniform excitation case, we do not need to generate a pattern per global DOF (1, 2, 3, 4, 5, 6). The definition of a single MSE pattern would always be enough, right?
LikeLike
I don’t use multi-support all that often, so I’m not sure what you mean. Do you have a minimal example showing the difference between Tcl and Python for multi-support excitation?
LikeLike
In tcl, it is clear that due to the curly brackets,
imposedMotion
1 and 3 (tags 1 and 3) are associated with multiple-support excitationpattern
1 (tag 1).But in the case of OpenSeesPy, obviously, the syntax is different and we do not have curly brackets. Nonetheless, we do not use the pattern tag for anything at all (For example, we do not necessarily relate
imposedMotion
3 topattern
1).So it seems to me that there is never a need to define more than one
MultipleSupport
excitation patterns as in the case ofUniformExcitation
. For example, I use the following to assign uniform excitations in three directions:With the same logic, I have been using the following to apply multiple support excitations:
However, I guess, creating three different MultipleSupport patterns is not necessary, right? Instead, I can just define a single MultipleSupport pattern before
for i in range(1, 4):
.Nonetheless, if for some reason there is a need to create more than one pattern, how do we associate the imposed motions with that specific pattern? Could it be by just defining them subsequently after creating a specific pattern (as in my example)?Sorry for the very long reply.LikeLike
Is this what you’re asking about? https://portwooddigital.com/2020/11/29/a-little-secret-about-opensees-tcl/
LikeLike
In a sense, yes! I missed this post. Thank you.
LikeLiked by 1 person
No problem! I can add multi-support patterns to that post on Tcl braces.
LikeLike