Multiple-Support Excitation

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.

17 thoughts on “Multiple-Support Excitation

  1. 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.

    Liked by 1 person

  2. 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?

    Liked by 1 person

  3. 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

    Like

  4. 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

    Like

  5. 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?

    Like

      1. In tcl, it is clear that due to the curly brackets, imposedMotion 1 and 3 (tags 1 and 3) are associated with multiple-support excitation pattern 1 (tag 1).

        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)

        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 to pattern 1).

        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)

        So it seems to me that there is never a need to define more than one MultipleSupport excitation patterns as in the case of UniformExcitation. For example, I use the following to assign uniform excitations in three directions:

        for i in range(1, 4):
            EndTsTag += 1
            EndPTag += 1
            gm_i = gm_mat[i - 1, :] # nx3 (accelerations in three directions)
            ops.timeSeries('Path', EndTsTag, '-dt', gm_dt, '-values', *list(gm_i), '-factor', sf)
            ops.pattern('UniformExcitation', EndPTag, i, '-accel', EndTsTag)

        With the same logic, I have been using the following to apply multiple support excitations:

        # Creating MultipleSupport Excitation load pattern in three global directions
        for i in range(1, 4):
            EndTsTag += 1
            EndPTag += 1
            EndgmTag += 1
            gm_i = gm_mat[i - 1, :] 
            ops.timeSeries('Path', EndTsTag, '-dt', gm_dt, '-values', *list(gm_i), '-factor', sf)
            ops.pattern('MultipleSupport', EndPTag)
            ops.groundMotion(EndgmTag, 'Plain', '-accel', EndTsTag)
            for node in support_nodes:
                ops.imposedMotion(node, i, EndgmTag)

        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.

        Like

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.