OpenSees Cloud
OpenSees AMI
The OpenSees Are Pounding
11 Oct 2026 - Michael H. Scott
Pounding between a flexible structure and a rigid wall can occur during an earthquake when a bridge deck strikes an abutment or a base-isolated building impacts its moat wall.
While a compression-only spring with an initial gap can model pounding, adding viscosity allows the model to account for energy dissipated during impact.
Dimitrakopoulos et al (2010) performed a dimensional analysis of a pounding single degree of freedom (SDF) oscillator subjected to pulse excitations. Their examples are well suited to verification of the impact models available in OpenSees.
Consider an SDF oscillator with mass, m=0.001 tonne (1 kg), natural period, To=1.5 sec, and 5% damping ratio.

The oscillator is adjacent to a rigid wall with 0.011 m gap and the coefficient of restitution between the oscillator and the wall is 0.5. The oscillator is subjected to a single cycle cosine pulse of period 2To (twice the natural period of the oscillator) and amplitude 0.5g.
The ViscoelasticGap material represents the impact between the
oscillator and wall. The contact stiffness is set to four orders of
magnitude higher than the oscillator stiffness. As a result, a small
analysis time step is required in order to capture the contact response.
import openseespy.opensees as ops
from math import pi, log
# Units = kg, m, sec
g = 9.81
# Structural period, mass, and damping ratio
Tn = 1.5
m = 1
zeta = 0.05
wn = 2*pi/Tn
k = m*wo**2
c = 2*zeta*m*wo
# Gap and coefficient of restitution
gap = 0.011
e = 0.5
# Contact stiffness and damping
Kc = 1e4*k
zetac = -log(e)/(pi**2+(log(e)**2))**0.5
Cc = 2*zetac*(Kc*m)**0.5
# Pulse duration and magnitude
Tp = 2*Tn
alpha = 0.5*g
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,c)
ops.uniaxialMaterial('ViscoelasticGap',2,Kc,Cc,-gap)
ops.element('zeroLength',1,1,2,'-mat',1,'-dir',1)
ops.element('zeroLength',2,2,3,'-mat',2,'-dir',1)
ops.timeSeries('Sine',1,0,Tp,Tp,'-shift',pi/2,'-factor',alpha)
ops.pattern('UniformExcitation',1,1,'-accel',1)
ops.analysis('Transient','-noWarnings')
# Analysis duration, time step, and number of steps
T = 7
dt = 1e-4
Nsteps = int(T/dt)
for i in range(Nsteps):
ops.analyze(1,dt)
Note that the model uses three nodes and two zero length elements. Tee
gap distance is specified in the ViscoelasticGap material.
If you want to be really efficient, you could perform this analysis with only two nodes and one zero length element that contains both the oscillator and impact material. But that’s not a very generalizable approach.
Anyway, the analysis results for pounding are shown below along with the results for forced vibration with no wall.

At each impact, the oscillator velocity rapidly changes from positive to negative, i.e., from moving toward the wall to moving away from the wall. The pounding oscillator response histories match those shown in Dimitrakopoulos et al (2010).
Published examples like this one provide a useful starting point for verifying contact models before moving on to pounding between two oscillators, as can occur in adjacent buildings and bridge frames separated by expansion joints.