-
Notifications
You must be signed in to change notification settings - Fork 11
/
beam.py
52 lines (40 loc) · 1.79 KB
/
beam.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
" discretized beam model "
from gpkit import Model, Variable, Vectorize
#pylint: disable=invalid-name
class Beam(Model):
"discretized beam bending model"
qbarFun = None
SbarFun = None
MbarFun = None
def setup(self, N):
with Vectorize(N-1):
EIbar = Variable("\\bar{EI}", "-",
"normalized YM and moment of inertia")
dx = Variable("dx", "-", "normalized length of element")
with Vectorize(N):
qbar = Variable("\\bar{q}", self.qbarFun, "-", "normalized loading")
Sbar = Variable("\\bar{S}", self.SbarFun, "-", "normalized shear")
Mbar = Variable("\\bar{M}", self.MbarFun, "-", "normalized moment")
th = Variable("\\theta", "-", "deflection slope")
dbar = Variable("\\bar{\\delta}", "-", "normalized displacement")
Sbartip = Variable("\\bar{S}_{tip}", 1e-10, "-", "Tip loading")
Mbartip = Variable("\\bar{M}_{tip}", 1e-10, "-", "Tip moment")
throot = Variable("\\theta_{root}", 1e-10, "-", "Base angle")
dbarroot = Variable("\\bar{\\delta}_{root}", 1e-10, "-",
"Base deflection")
constraints = []
if self.SbarFun is None:
constraints.extend([
Sbar[:-1] >= Sbar[1:] + 0.5*dx*(qbar[:-1] + qbar[1:]),
Sbar[-1] >= Sbartip])
if self.MbarFun is None:
constraints.extend([
Mbar[:-1] >= Mbar[1:] + 0.5*dx*(Sbar[:-1] + Sbar[1:]),
Mbar[-1] >= Mbartip])
constraints.extend([
th[0] >= throot,
th[1:] >= th[:-1] + 0.5*dx*(Mbar[1:] + Mbar[:-1])/EIbar,
dbar[0] >= dbarroot,
dbar[1:] >= dbar[:-1] + 0.5*dx*(th[1:] + th[:-1]),
])
return constraints