Arch Instability
3 min read • 569 wordsSeveral nonlinear static analysis methods are used to investigate instabilities in a shallow arch.
Clarke, M.J. and Hancock, G.J. (1990) ‘A study of incremental‐iterative strategies for non‐linear analyses’, International Journal for Numerical Methods in Engineering, 29(7), pp. 1365–1391. Available at: https://doi.org/10.1002/nme.1620290702 .
Begin by importing the arch_model
helper function from the file
arch.py
:
from arch import arch_model
Import some helpful third-party libraries
import numpy as np
import matplotlib.pyplot as plt
try:
import scienceplots
plt.style.use("steel") #(["ieee", "science", "notebook"])
except:
pass
def analyze(model, mid, increment, steps, dx, *args):
dof = 2
xy = []
status = 0
increment(model, mid, dof, dx, *args)
for step in range(steps):
if status != 0:
dx /= 2
increment(model, mid, dof, dx, *args)
status = model.analyze(1)
xy.append([model.nodeDisp(mid, dof), model.getTime()])
return np.array(xy).T
The strategies used by Clarke and Hancock are:
def solution0(model, mid, dof, dx):
model.integrator("LoadControl", 400.0)
def solution1(model, mid, dof, dx):
Jd = 5
model.integrator("LoadControl", dx, Jd, -800., 800.)
def solution2(model, mid, dof, dx):
Jd = 5
model.integrator("DisplacementControl", mid, dof, dx, Jd)
def norm_control(model, mid, dof, dx):
Jd = 15
model.integrator("MinUnbalDispNorm", dx, Jd, -10, 10, "-det")
def arc_control(model, mid, dof, dx, a):
model.integrator("ArcLength", dx, a, det=True, exp=0.5, reference="point")
fig, ax = plt.subplots()
# x, y = solution0(*arch_model(), 6, 400.0)
# ax.plot(-x, y, 'x', label="S0")
# x, y = analyze(*arch_model(), solution1, 6, 400.0)
# ax.plot(-x, y, 'x', label="S1")
# print(y)
x, y = analyze(*arch_model(), solution2, 7, -150)
ax.plot(-x, y, 'o', label="S2")
x, y = analyze(*arch_model(), solution2, 536, -1.5)
ax.plot(-x, y, '-', label="S2")
# x, y = analyze(*arch_model(), arc_control, 9500, 0.5, 0)
# ax.plot(-x, y, "-", label="arc")
# Requires -det
x, y = analyze(*arch_model(), arc_control, 110, 45, 0)
ax.plot(-x, y, "x", label="arc")
x, y = analyze(*arch_model(), arc_control, 80, 88, 0)
ax.plot(-x, y, "+", label="arc")
x, y = analyze(*arch_model(), arc_control, 80, 188, 0)
ax.plot(-x, y, "*", label="arc")
# x, y = analyze(*arch_model(), arc_control, 8000, 0.8, 0)
# ax.plot(-x, y, "x", label="arc")
# x, y = analyze(*arch_model(), norm_control, 7000, 1.0)
# ax.plot(-x, y, "-", label="norm")
ax.set_xlim([0, 1200])
ax.set_ylim([-800, 3000])
fig.legend()
Output:
[0;31m FAILURE[0m :: Iter: 25, Norm: 49845.5, Norm deltaX: 152.498
[0;31m FAILURE[0m :: Iter: 25, Norm: 11340.8, Norm deltaX: 123.419
ArcLength::update() - imaginary roots due to multiple instability directions - initial load increment was too large
a: 6.20586 b: -2674.5 c: 319258 b24ac: -772128
[0;31m FAILURE[0m :: Iter: 25, Norm: 3293.9, Norm deltaX: 54.5382
<matplotlib.legend.Legend at 0x7f1ddb0b8d00>
<Figure size 2560x1920 with 1 Axes>
plt.plot(-x, '.')
Output:
[<matplotlib.lines.Line2D at 0x7f1dd8e8ec40>]
<Figure size 2560x1920 with 1 Axes>
ax.plot(-x, ".")
Output:
[<matplotlib.lines.Line2D at 0x7f1dd8cc8340>]
The following animation of the solution is created in
Animating.ipynb