OpenSees Cloud

OpenSees AMI

Minimal Damper Example

Original Post - 12 Jan 2025 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


One of the axioms of earthquake engineering simulation is that any shear frame model can be analyzed using simple springs and masses. Even a 40-story shear frame can be economically modeled with 40 zero length elements in series.

But what happens when you add dampers to the shear frame? Do you have to start modeling the actual story heights and bay widths?

No.

Before we get to the minimal example, let’s see what could go wrong when you model a shear frame with flexural members and a damper.

Consider an often referenced viscous damper example from the OpenSees wiki.

One story frame with viscous damper

If you look in the example Tcl file, you’ll see the frame’s lateral stiffness, k, is calculated from the seismic weight (1000 kN) and the target undamped natural period (0.7 sec). Nothing wrong there. But many shenanigans ensue because the frame members are modeled explicitly with elasticBeamColumn elements.

That’s a lot of work to make a portal frame respond like an SDF system. If the point of the example was to demonstrate how to use the ViscousDamper material, that point could easily be lost in stiff elements, constraints, and convergence issues.

Instead, the system can be modeled in one dimension with a zero length element for the frame in parallel with another zero length element for the damper. The key here is that the orientation of the zero length damper element is specified via the -orient option to be “diagonal” based on the story height and width. Even though the model is 1D, you can still define the direction cosine for a zero length element.

import openseespy.opensees as ops

# Units = kN, mm, sec

# Frame dimensions
L = 5000
h = 3000

# Seismic mass
W = 1000
g = 9810
m = W/g

# Natural period
Tn = 0.7
pi = 3.14159
wn = 2*pi/Tn
K = m*wn**2

# Structural damping
zeta = 0.02
C = 2*m*wn*zeta

# Damper properties
Kd = 25
Cd = 20.7452
ad = 0.35

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.uniaxialMaterial('Elastic',1,K,C)
ops.element('zeroLength',1,1,2,'-mat',1,'-dir',1)

ops.uniaxialMaterial('ViscousDamper',2,Kd,Cd,ad)
ops.element('zeroLength',2,1,2,'-mat',2,'-dir',1,'-orient',L,h,0)

ops.timeSeries('Path',1,'-dt',0.01,'-filePath','TakY.th','-factor',0.5*g)
ops.pattern('UniformExcitation',1,1,'-accel',1,'-factor',1.0)

ops.analysis('Transient','-noWarnings')
ops.analyze(4096,0.01)

The response history of roof displacement is shown below for the stiff frame model and the minimal SDF model. The response histories are identical.

Displacement response history

Likewise, the damper force-elongation responses shown below are identical between the two modeling approaches.

Damper force-elongation response

While you might say the nuances of the stiff element model are not a big deal for a single story shear frame, you will undoubtedly run into issues with this approach when modeling multi-story shear frames. Keep it simple!