A graduate student and I are developing an OpenSees model of the water tower described in this paper. Thankfully, the model is pretty straightforward, i.e., reproducible from what’s written in the paper, so it could be a future modeling challenge here at PD.

The authors of the paper did a pushover analysis of the water tower using dynamic response to a “slow, ramped, horizontal ground acceleration that increases at a constant rate of 0.3g/min”. In other words, a constant ground jerk of 0.3g/min. I wasn’t familiar with this approach to pushover analysis. I usually specify a load pattern, then ramp up the load factor in a static analysis.

Naturally, I had to figure out how to do this in OpenSees. After defining your model, create a linear time series with the jerk as the time series factor. Then define a uniform excitation and proceed with a dynamic analysis as usual.

inch = 1.0
sec = 1.0
g = 386.4*inch/sec**2
#
# Define model, including mass and damping
#
dt = 0.02*sec
Tfinal = 60*sec
ops.timeSeries('Linear',12,'-factor',0.3*g/Tfinal)
ops.pattern('UniformExcitation',23,1,'-accel',12) # direction = 1 (X-direction)
ops.analysis('Transient')
Nsteps = int(Tfinal/dt)
for i in range(Nsteps):
ok = ops.analyze(1,dt)
if ok < 0:
break
ops.reactions('-dynamic')
#
# Do other stuff
#

The load applied to each dynamic DOF is directly proportional to the nodal mass and in the opposite direction of the ground acceleration.

The pushover analysis works, but the real question is how far does the ground displace?

I definitely attempt to stay positive all the time. I have been involved in the development, maintenance, and growth of OpenSees since its early days. Recently, I've taken an interest in learning Python and improving my academic writing.
View all posts by Positive Definite