Skip to content

Commit f37cef3

Browse files
committed
clean up
1 parent 764e6d2 commit f37cef3

27 files changed

+1986
-1088
lines changed

content/en/benchmarks/frame-0002/cantilever.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import xara.units.iks as units
44
import veux
55
import os
6-
from xsection.library import from_aisc
6+
from xsection.library import from_aisc, Rectangle
77
import numpy as np
88

99
def create_cantilever(shape, length, element, material,
@@ -70,16 +70,19 @@ def analyze(model, P):
7070
model.pattern("Plain", 1, "Linear", load={nn-1: [0,0,1, 0,0,0]})
7171
model.integrator("LoadControl", P)
7272
model.analysis("Static")#, pattern=1, integrator=1)
73+
model.test("Residual", 1e-10, 3)
7374

74-
model.analyze(1)
75+
assert model.analyze(1) == 0
7576

7677

7778

7879

7980
if __name__ == "__main__":
80-
shape = from_aisc("W14x48", units=units)
81+
# shape = Rectangle(d=14, b=10, mesh_scale=1/100) #
82+
shape = from_aisc("W14x48", units=units, mesh_scale=1/100)
83+
8184
E = 29e3*units.ksi
82-
G = 11.2e3*units.ksi * 4/5
85+
G = 11.2e3*units.ksi # * 4/5
8386

8487
A = shape.cnn()[0,0]
8588
GA = A*G
@@ -90,10 +93,10 @@ def analyze(model, P):
9093
model = create_cantilever(shape,
9194
length=L,
9295
material={"name": "ElasticIsotropic", "E": E, "G": G},
93-
element=os.environ.get("Element", "ForceFrame"),
94-
section="ShearFiber",
96+
element=os.environ.get("Element", "ForceFrame"),
97+
section="ShearFiber",
9598
shear=shear,
96-
ne=6,
99+
ne=1,
97100
nen=2
98101
)
99102

@@ -105,9 +108,9 @@ def analyze(model, P):
105108
u_euler = P*L**3/(3*EI)
106109
u_shear = P*L/GA * shear
107110

108-
print(f"Uz = {uz:.3f}, Uz theory = {u_euler+u_shear:.3f} ({u_euler:.3f} + {u_shear:.6f})")
111+
print(f"Uz = {uz:.6f}, Uz theory = {u_euler+u_shear:.6f} ({u_euler:.6f} + {u_shear:.6f})")
109112

110-
model.eval(f"verify value [nodeDisp {end} 3] {u_euler+u_shear:.6f} 1e-4")
113+
model.eval(f"verify value [nodeDisp {end} 3] {u_euler+u_shear:.12f} 1e-6")
111114

112115
# a = veux.create_artist(model)
113116
# a.draw_sections()

content/en/benchmarks/frame-0011/e0011.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
# Test of the warping DOF
22
# Linear 7-DOF analysis of a cantilever subjected to a torque
3+
#
34
import os
45
import sys
56

67
import veux
78
from veux.motion import Motion
89
from xsection.library import WideFlange, HollowRectangle, Channel, Rectangle, Circle
10+
911
import opensees.openseespy as ops
1012

1113
# External libraries
@@ -31,7 +33,7 @@ def create_cantilever(aspect,
3133
nen = 2
3234
nn = ne*(nen-1)+1
3335

34-
model = ops.Model(ndm=3, ndf=7) #, echo_file=open(f"test-{case}-{element[:5]}.tcl", "w+"))
36+
model = ops.Model(ndm=3, ndf=7)
3537

3638
model.eval(f"set E {E}")
3739
model.eval(f"set G {G}")
@@ -43,11 +45,11 @@ def create_cantilever(aspect,
4345

4446

4547
if section == "Elastic":
46-
cmm = shape.torsion.cmm()
47-
cnn = shape.torsion.cnn()
48-
cnv = shape.torsion.cnv()
49-
cnm = shape.torsion.cnm()
50-
cmw = shape.torsion.cmw()
48+
cmm = shape.cmm()
49+
cnn = shape.cnn()
50+
cnv = shape.cnv()
51+
cnm = shape.cnm()
52+
cmw = shape.cmw()
5153
A = cnn[0,0]
5254
model.section("ElasticFrame", sec,
5355
E=E,
@@ -66,20 +68,27 @@ def create_cantilever(aspect,
6668
Sz=-cmw[2,0]
6769
)
6870
else:
71+
72+
6973
model.section("ShearFiber", 1, GJ=0)
74+
75+
7076
for fiber in shape.create_fibers():
77+
7178
model.fiber(**fiber, material=mat, section=1)
7279

7380

81+
7482
model.geomTransf("Linear", 1, (0,0,1))
7583

84+
7685
for i,x in enumerate(np.linspace(0, L, nn)):
7786
model.node(i, (x,0,0))
7887

7988
for i in range(ne):
8089
start = i * (nen - 1)
8190
nodes = list(range(start, start + nen))
82-
model.element(element, i+1, nodes, section=sec, transform=1, shear=1)
91+
model.element(element, i+1, nodes, section=1, transform=1, shear=1)
8392

8493
wi = int(case in "cb")
8594
wj = int(case in "c")
@@ -124,6 +133,9 @@ def create_cantilever(aspect,
124133
mesh_scale=1/200
125134
)
126135

136+
137+
138+
127139
print(shape.summary())
128140

129141
fig, ax = plt.subplots()
@@ -183,7 +195,7 @@ def create_cantilever(aspect,
183195
P.append(model.getTime())
184196
if model.analyze(1) != 0:
185197
print(f"Failed at time = {model.getTime()}")
186-
break
198+
break
187199

188200
model.reactions()
189201

@@ -206,14 +218,14 @@ def create_cantilever(aspect,
206218

207219
xs = [(x+model.nodeCoord(model.eleNodes(tag)[0], 1))/L for tag in model.getEleTags() for x in model.eleResponse(tag, "integrationPoints")]
208220
ws = [
209-
model.eleResponse(tag, "section", i+1, "resultant")[6]/(Mmax*L)
210-
for tag in model.getEleTags()
221+
model.eleResponse(tag, "section", i+1, "resultant")[6]/(Mmax*L)
222+
for tag in model.getEleTags()
211223
for i in range(len(model.eleResponse(tag, "integrationPoints")))
212224
]
213225
ax4.plot(xs, ws, "-", color=color, label=case)
214226
vs = [
215227
model.eleResponse(tag, "section", i+1, "resultant")[9]/Mmax
216-
for tag in model.getEleTags()
228+
for tag in model.getEleTags()
217229
for i in range(len(model.eleResponse(tag, "integrationPoints")))
218230
]
219231
ax5.plot(xs, vs, "-", color=color)
@@ -245,5 +257,3 @@ def create_cantilever(aspect,
245257
ax4.figure.savefig("img/e0011-resultants.png")
246258
plt.show()
247259

248-
249-

content/en/benchmarks/frame-0011/e0011_6dof.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def create_cantilever(case="a", element="ExactFrame", section="Elastic"):
3939
d = 21.62,
4040
b = 8.42,
4141
# saint_venant="linear"
42-
).create_shape()
42+
)
4343

4444
if section == "Elastic":
4545
cmm = shape.torsion.cmm()
@@ -66,9 +66,8 @@ def create_cantilever(case="a", element="ExactFrame", section="Elastic"):
6666
)
6767
else:
6868
model.section("ShearFiber", 1, GJ=0)
69-
for fiber in shape.fibers():
70-
y, z = fiber.location
71-
model.fiber(y, z, fiber.area, warp=[fiber.warp[0], [0,0,0], [0,0,0]], material=mat, section=1)
69+
for fiber in shape.create_fibers():
70+
model.fiber(**fiber, material=mat, section=1)
7271

7372

7473
model.geomTransf("Linear", 1, (0,0,1))

content/en/benchmarks/frame-0013/a.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import opensees.openseespy as ops
2+
3+
m = ops.Model(ndm=3, ndf=6)
4+
5+
m.node(1, (0,0,0))
6+
m.node(2, (1,2,3))
7+
m.fix(1, (1,1,1, 1,1,1))
8+
9+
m.geomTransf("Corotational", 1, (0,0,1))
10+
m.section("ElasticFrame", 1, A=1, Iy=1, Iz=1, J=1, G=1, E=1, Ay=1, Az=1)
11+
m.element("ForceFrame", 1, (1,2), transform=1, section=1)
12+
13+
m.pattern("Plain", 1, "Linear", loads={2: (0.2,1,1, 0, 0.3,0)})
14+
m.integrator("LoadControl", 0.001)
15+
m.test("FixedNumIter", 1)
16+
m.analysis("Static")
17+
m.analyze(1, operation="increment")
18+
m.analyze(1, operation="iteration")
19+
m.analyze(1, operation="iteration")
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
# Cantilever with channel section and eccentric loading
2+
#
3+
import veux
4+
from veux.motion import Motion
5+
from shps.shapes import Channel
6+
import opensees.openseespy as ops
7+
8+
# External libraries
9+
import numpy as np
10+
import matplotlib.pyplot as plt
11+
try:
12+
plt.style.use("veux-web")
13+
except:
14+
pass
15+
16+
def create_cantilever(ne, offset, element, section, nen=2):
17+
model = ops.Model(ndm=3, ndf=6)
18+
19+
E = 2.1e4 # MPa, or 210 GPa
20+
v = 0.30 #0.5*E/G - 1
21+
G = 0.5*E/(1+v) # 8076.92
22+
23+
nmn = ne*(nen-1)+1
24+
L = 900
25+
26+
27+
mat = 1
28+
sec = 1
29+
model.material('ElasticIsotropic', mat, E, v) #G=G)
30+
31+
shape = Channel(d=30, b=10, tf=1.6, tw=1.0).create_shape()
32+
33+
shape = shape.translate(offset)
34+
35+
36+
# _m = shape.mesh
37+
# veux.serve(veux.render((_m.nodes, _m.cells())))
38+
39+
if "fiber" in section.lower():
40+
warp = os.environ.get("Warp", None)
41+
print(f"Section = Fiber; ", warp)
42+
model.section("ShearFiber", sec, GJ=0)
43+
44+
for fiber in shape.fibers(warp=warp):
45+
model.fiber(y, z, fiber.area, mat, fiber.warp[0], section=sec) #fiber.warp[1], section=sec)
46+
47+
else:
48+
print("Section = Elastic")
49+
cmm = shape.torsion.cmm()
50+
cnn = shape.torsion.cnn()
51+
cnv = shape.torsion.cnv()
52+
cnm = shape.torsion.cnm()
53+
cmw = shape.torsion.cmw()
54+
A = cnn[0,0]
55+
model.section("ElasticFrame", sec,
56+
E=E,
57+
G=G,
58+
A=A,
59+
Ay=1*A,
60+
Az=1*A,
61+
Qy=cnm[0,1],
62+
Qz=cnm[2,0],
63+
Iy=cmm[1,1],
64+
Iz=cmm[2,2],
65+
J =shape.torsion.torsion_constant(),
66+
Ry= cnv[1,0],
67+
Rz=-cnv[2,0],
68+
Sy= cmw[1,0],
69+
Sz=-cmw[2,0]
70+
)
71+
72+
73+
# model.geomTransf("Corotational", 1, (0,1,0))
74+
model.geomTransf("Corotational", 1, (0,0,1))
75+
76+
for i,x in enumerate(np.linspace(0, L, nmn)):
77+
model.node(i, (x,0,0))
78+
79+
model.fix(0, (1,1,1, 1,1,1))
80+
81+
for i in range(ne):
82+
start = i * (nen - 1)
83+
nodes = list(range(start, start + nen))
84+
model.element(element, i+1, nodes, section=sec, transform=1)
85+
86+
87+
return model, shape
88+
89+
def analyze(element, section, pattern="node", nen=2):
90+
ne = 20
91+
en = ne*(nen-1)
92+
if pattern == "node":
93+
offset = (0, 15)
94+
else:
95+
offset = (0, 0)
96+
97+
model,shape = create_cantilever(ne, offset, element=element, section=section, nen=nen)
98+
if False:
99+
artist = veux.create_artist(model, model_config=dict(extrude_outline=shape))
100+
artist.draw_nodes(size=10)
101+
# artist.draw_sections()
102+
# veux.serve(artist)
103+
motion = Motion(artist)
104+
105+
#
106+
# Apply vertical load
107+
#
108+
speed = 1 # animation frames
109+
Pmax = 20 # kN
110+
model.pattern("Plain", 1, "Linear")
111+
if pattern == "node":
112+
print("Pattern = node")
113+
model.load(en, (0,0,-1, 0,0,0), pattern=1)
114+
# model.load(ne, (0,-1,0, 0,0,0), pattern=1)
115+
116+
else:
117+
print("Pattern = element")
118+
model.eleLoad("Frame", "Dirac",
119+
force = [0, 0, -1],
120+
basis = "global",
121+
offset=[1.0,0, -15],
122+
pattern=1,
123+
elements=[ne]
124+
)
125+
126+
model.system('Umfpack')
127+
model.integrator("LoadControl", Pmax/1000)#, 8, Pmax/500, Pmax/2)
128+
model.test("NormDispIncr", 1e-8, 100, 0)
129+
# model.test('NormUnbalance',1e-6,10,1)
130+
model.algorithm("Newton")
131+
model.analysis("Static")
132+
# input()
133+
134+
u = []
135+
v = []
136+
w = []
137+
P = []
138+
# for i in range(50):
139+
while model.getTime() < Pmax:
140+
# motion.advance(time=model.getTime()*speed)
141+
# motion.draw_sections(rotation=model.nodeRotation,
142+
# position=model.nodeDisp)
143+
# u.append(-model.nodeDisp(ne, 1))
144+
# v.append( model.nodeDisp(ne, 2))
145+
# w.append(-model.nodeDisp(ne, 3))
146+
# P.append( model.getTime())
147+
if model.analyze(1) != 0:
148+
print(f"Failed at time = {model.getTime()} with v = {v[-1]}")
149+
break
150+
151+
152+
if False:
153+
fig, ax = plt.subplots()
154+
ax.set_xlabel(r"Displ, $v$")
155+
ax.set_ylabel("Load, $P$")
156+
# ax.set_xlim([0, 300])
157+
ax.set_ylim([0, Pmax])
158+
ax.axvline(0, color='black', linestyle='-', linewidth=1)
159+
ax.axhline(0, color='black', linestyle='-', linewidth=1)
160+
ax.plot(u, P, label="$u$")
161+
ax.plot(v, P, label="$v$")
162+
ax.plot(w, P, label="$w$")
163+
ax.legend()
164+
fig.savefig("img/e0013.png")
165+
plt.show()
166+
167+
motion.add_to(artist.canvas)
168+
veux.serve(artist)
169+
170+
if __name__ == "__main__":
171+
import os
172+
analyze(pattern = os.environ.get("Pattern", "node"),
173+
element = os.environ.get("Element", "ExactFrame"),
174+
section = os.environ.get("Section", "ShearFiber"),
175+
nen=2
176+
)
177+

content/en/benchmarks/frame-0013/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ $$
2525

2626
Beams:
2727

28+
- Rong et al 2020, Section 7.2
2829
- Hsiao KM, Lin W Y (2000) A co-rotational formulation for thin-walled beams with monosymmetric open section. DOI: 10.1016/S0045-7825(99)00471-5
2930
- D Manta, R Goncalves (2016) A geometrically exact Kirchhoff beam model including torsion warping.
3031

0 commit comments

Comments
 (0)