API Reference
BeamSolver -- Symbolic Solver to Elastic Beams Copyright (C) 2023 Antonio Vinicius Garcia Campos
BeamEB
Bases: apiBeam
Class Beam Implement
Source code in beamsolver/beam.py
class BeamEB(apiBeam):
"""Class Beam Implement"""
def setLength(L):
return L
def setEI(E, I):
return E * I
def getBoundCond(bc):
return bc
def setConstraintEq(bc_list, V, M, s, v, L):
eqbc = []
for itbc in range(len(bc_list)):
if bc_list[itbc]["dof"] == "V":
eqbc.append(
V.subs(x, bc_list[itbc]["begin"]) - bc_list[itbc]["value"]
)
elif bc_list[itbc]["dof"] == "M":
eqbc.append(
M.subs(x, bc_list[itbc]["begin"]) - bc_list[itbc]["value"]
)
elif bc_list[itbc]["dof"] == "s":
eqbc.append(
s.subs(x, bc_list[itbc]["begin"]) - bc_list[itbc]["value"]
)
elif bc_list[itbc]["dof"] == "v":
eqbc.append(
v.subs(x, bc_list[itbc]["begin"]) - bc_list[itbc]["value"]
)
return eqbc
def setLoad(load_list):
load = []
support = []
for itl in range(len(load_list)):
if load_list[itl]["type"] == "apply":
if np.sign(load_list[itl]["value"]) == 1:
load.append("+")
load.append(
load_list[itl]["value"]
* sb.SingularityFunction(
x, load_list[itl]["begin"], load_list[itl]["order"]
)
)
else:
load.append(
load_list[itl]["value"]
* sb.SingularityFunction(
x, load_list[itl]["begin"], load_list[itl]["order"]
)
)
elif load_list[itl]["type"] == "support":
sup_sym = sb.Symbol(load_list[itl]["value"])
support.append(load_list[itl]["value"])
load.append("+")
load.append(
sup_sym
* sb.SingularityFunction(
x, load_list[itl]["begin"], load_list[itl]["order"]
)
)
else:
pass
load_str = " ".join(str(e) for e in load)
load_sympy = sb.parsing.sympy_parser.parse_expr(load_str)
support_constr = ", ".join(str(e) for e in support)
return load_sympy, support_constr
def getShear(load_sympy):
return sb.integrate(load_sympy, x) + C0
def getBending(shear):
return sb.integrate(shear, x) + C1
def getSlope(bending):
return sb.integrate(bending, x) + C2
def getDisplacement(slope):
return sb.integrate(slope, x) + C3
def getLinSolver(consteqs, support):
symbols = sb.symbols("C0, C1, C2, C3, " + support)
sol = sb.linsolve(consteqs, symbols)
const_val = list(sol)[0]
ss_str = []
for e in symbols:
ss_str.append(str(e))
const = dict(zip(ss_str, list(const_val)))
return const
NewBeam
Bases: ABC
Class New Beam
Source code in beamsolver/beam.py
class NewBeam(ABC):
"""Class New Beam"""
def __init__(self, Beam: apiBeam) -> None:
self.beam = Beam
L = 1.0
E = 1.0
I = 1.0
load_list = [
{"type": "apply", "order": 0, "value": 0.0, "begin": 0.0},
]
bc_list = [
{"type": "0", "dof": "v", "value": 0},
{"type": "0", "dof": "s", "value": 0},
{"type": "L", "dof": "M", "value": 0},
{"type": "L", "dof": "V", "value": 0},
]
self.beam.length = self.beam.setLength(L)
self.beam.ei = self.beam.setEI(E, I)
load, support = self.beam.setLoad(load_list)
self.beam.load = load
self.beam.support = support
self.beam.bc = self.beam.getBoundCond(bc_list)
def length(self, L: float):
self.beam.length = self.beam.setLength(L)
def thick(self, t_max: float, t_min: float):
self.beam.t_max = t_max
self.beam.t_min = t_min
def width(self, width: float):
self.beam.b = width
def EI(self, E: float, I: float):
self.beam.i = I
self.beam.ei = self.beam.setEI(E, I)
def first_moment_of_area(self, Q: float):
self.beam.q = Q
def load(self, load_list: list):
load, support = self.beam.setLoad(load_list)
self.beam.load = load
self.beam.support = support
def bc(self, bc: list):
self.beam.bc = self.beam.getBoundCond(bc)
def shear(self):
self.beam.shear = self.beam.getShear(self.beam.load)
def bending(self):
self.beam.bending = self.beam.getBending(self.beam.shear)
def slope(self):
self.beam.slope = self.beam.getSlope(self.beam.bending)
def displacement(self):
self.beam.displ = self.beam.getDisplacement(self.beam.slope)
def constraint(self):
L = self.beam.length
V = self.beam.shear
M = self.beam.bending
s = self.beam.slope
v = self.beam.displ
return self.beam.setConstraintEq(self.beam.bc, V, M, s, v, L)
def linsolve(self, consteqs):
constraints = self.beam.getLinSolver(consteqs, self.beam.support)
self.beam.shear_eval = (
(self.beam.shear).subs(constraints)
).rewrite(sb.Piecewise)
self.beam.bending_eval = (
(self.beam.bending).subs(constraints)
).rewrite(sb.Piecewise)
self.beam.slope_eval = (
(1 / self.beam.ei * self.beam.slope).subs(constraints)
).rewrite(sb.Piecewise)
self.beam.displ_eval = (
(1 / self.beam.ei * self.beam.displ).subs(constraints)
).rewrite(sb.Piecewise)
# def eval_constant(self, constraints):
# self.beam.shear_eval = (
# (self.beam.shear).subs(constraints)
# ).rewrite(sb.Piecewise)
# self.beam.bending_eval = (
# (self.beam.bending).subs(constraints)
# ).rewrite(sb.Piecewise)
# self.beam.slope_eval = (
# (1 / self.beam.ei * self.beam.slope).subs(constraints)
# ).rewrite(sb.Piecewise)
# self.beam.displ_eval = (
# (1 / self.beam.ei * self.beam.displ).subs(constraints)
# ).rewrite(sb.Piecewise)
def getload(self):
return self.beam.load
def getbc(self):
return self.beam.bc
def getshear(self):
return self.beam.shear_eval
def getbending(self):
return self.beam.bending_eval
def getslope(self):
return self.beam.slope_eval
def getdisplacement(self):
return self.beam.displ_eval
def getshear_array(self, x_array):
return (
(sb.lambdify(x, self.beam.shear_eval, "numpy"))(x_array)
) * np.ones_like(x_array)
def getbending_array(self, x_array):
return (
(sb.lambdify(x, self.beam.bending_eval, "numpy"))(x_array)
) * np.ones_like(x_array)
def getslope_array(self, x_array):
return (
(sb.lambdify(x, self.beam.slope_eval, "numpy"))(x_array)
) * np.ones_like(x_array)
def getdisplacement_array(self, x_array):
return (
(sb.lambdify(x, self.beam.displ_eval, "numpy"))(x_array)
) * np.ones_like(x_array)
def stressxx(self, bending):
x = np.linspace(0, self.beam.length, len(bending))
y = np.linspace(self.beam.t_min, self.beam.t_max, len(bending))
X, Y = np.meshgrid(x,y)
SXX = -bending*Y/self.beam.i
return X, Y, SXX
apiBeam
Bases: ABC
Class apiNewBeam
Source code in beamsolver/beam.py
class apiBeam(ABC):
"""Class apiNewBeam"""
@abstractmethod
def setLength():
pass
@abstractmethod
def setEI():
pass
@abstractmethod
def setLoad():
pass
@abstractmethod
def getBoundCond():
pass
@abstractmethod
def setConstraintEq():
pass
@abstractmethod
def getShear():
pass
@abstractmethod
def getBending():
pass
@abstractmethod
def getSlope():
pass
@abstractmethod
def getDisplacement():
pass
@abstractmethod
def getLinSolver():
pass
@abstractmethod
def getNonLinSolver():
pass