Elemento Beam

Fundamento teórico

El elemento Beam (viga) es un elemento finito bidimensional donde las coordenadas locales y globales coinciden. Está caracterizado por una función de forma lineal. El elemento Beam tiene un modulo de elasticidad E, momento de inercia I y longitud L. Cada elemento Beam tiene dos nodos y se asume horizontal como se muestra en la figura. En este caso la matriz de rigidez del elemento está dada por la matriz siguiente, asumiendo que la deformación axial es despreciable:

$$ k = \frac{EI}{L^3} \begin{bmatrix} 12 & 6L & -12 & 6L \\ 6L & 4L^2 & -6L & 2L^2 \\ -12 & -6L & 12 & -6L \\ 6L & 2L^2 & -6L & 4L^2 \end{bmatrix} $$

Está claro que el elemento Beam tiene cuatro grados de libertad, dos en cada nodo: un desplazamiento transversal y una rotación. La convención de signos utilizada es la tradicional: los desplazamientos son positivos hacia arriba y las rotaciones cuando son antihorario.

Ejemplos resueltos

Ejemplo 1. Viga en voladizo


In [22]:
%matplotlib inline
import numpy as np
from nusa import *
import itertools
import matplotlib.pyplot as plt

def pairwise(iterable):
    #~ "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

# Input data 
E = 210e9 # Pa
I = 1e-5
L = 1
P = 10e3

nelm = 10
parts = np.linspace(0,L,nelm)

nodos = []
for xc in parts:
    cn = Node((xc,0))
    nodos.append(cn)

elementos = []
for x in pairwise(nodos):
    ni,nj = x[0], x[1]
    ce = Beam((ni,nj),E,I)
    elementos.append(ce)

m = BeamModel()

for n in nodos: m.add_node(n)
for e in elementos: m.add_element(e)

m.add_constraint(nodos[0], ux=0, uy=0, ur=0)
m.add_force(nodos[-1], (-P,))
m.plot_model()
m.solve()
m.plot_disp(1)
xx = np.linspace(0,L)
d = ((-P*xx**2.0)/(6.0*E*I))*(3*L - xx)
plt.plot(xx,d)
plt.axis("auto")
plt.xlim(0,1.1*L)


Out[22]:
(0, 1.1)

Ejemplo 2. Determine los desplazamientos nodales y rotaciones, fuerzas nodales globales, y fuerzas en elementos para la viga mostrada en la figura. Se ha discretizado la viga como se indica en la numeración nodal. La viga está fija en los nodos 1 y 5, y tiene un soporte de rodillo en el nodo 3. Las cargas verticales de 10 000 lb cada una son aplicadas en los nodos 2 y 4. Sea E=300x106 psi and I=500 in4.


In [14]:
"""
Logan, D. (2007). A first course in the finite element analysis.
Example 4.2 , pp. 166.
"""
from nusa.core import *
from nusa.model import *
from nusa.element import *

# Input data 
E = 30e6
I = 500.0
P = 10e3
L = 10*(12.0)  # ft -> in
# Model
m1 = BeamModel("Beam Model")
# Nodes
n1 = Node((0,0))
n2 = Node((10*12,0))
n3 = Node((20*12,0))
n4 = Node((30*12,0))
n5 = Node((40*12,0))
# Elements
e1 = Beam((n1,n2),E,I)
e2 = Beam((n2,n3),E,I)
e3 = Beam((n3,n4),E,I)
e4 = Beam((n4,n5),E,I)

# Add elements 
for nd in (n1,n2,n3,n4,n5): m1.add_node(nd)
for el in (e1,e2,e3,e4): m1.add_element(el)

m1.add_force(n2,(-P,))
m1.add_force(n4,(-P,))
m1.add_constraint(n1, ux=0,uy=0,ur=0) # fixed 
m1.add_constraint(n5, ux=0,uy=0,ur=0) # fixed
m1.add_constraint(n3, uy=0, ur=0) # fixed
m1.add_constraint(n2, ur=0)
m1.add_constraint(n4, ur=0)
m1.plot_model()
m1.solve() # Solve model

# Desplazamientos nodales y rotaciones
print("Desplazamientos nodales y rotaciones")
print("UY \t UR")
for node in m1.get_nodes():
    print("{0} \t {1}".format(node.uy, node.ur))

# Fuerzas nodales globales
print("\nFuerzas nodales globales")
print("FY \t M")
for node in m1.get_nodes():
    print("{0} \t {1}".format(node.fy, node.m))

# Fuerzas en elementos
print("\nFuerzas en elementos")
for element in m1.get_elements():
    print("\nFY:\n{0} \n M:\n{1}\n".format(element.fy, element.m))


Desplazamientos nodales y rotaciones
UY 	 UR
0 	 0
-0.048 	 1.665334536937735e-20
0 	 -6.66133814775094e-20
-0.04800000000000001 	 1.665334536937735e-20
0 	 0

Fuerzas nodales globales
FY 	 M
5000.0 	 299999.99999999994
-10000.0 	 0.0
10000.0 	 -1.9828229724794254e-11
-10000.0 	 0.0
5000.0 	 -300000.0

Fuerzas en elementos

FY:
[[ 5000.]
 [-5000.]] 
 M:
[[300000.]
 [300000.]]


FY:
[[-5000.]
 [ 5000.]] 
 M:
[[-300000.]
 [-300000.]]


FY:
[[ 5000.]
 [-5000.]] 
 M:
[[300000.]
 [300000.]]


FY:
[[-5000.]
 [ 5000.]] 
 M:
[[-300000.]
 [-300000.]]


In [15]:
# Dibujando diagramas de cortante y momento flexionante
m1.plot_shear_diagram()
m1.plot_moment_diagram()



In [ ]:

Ejemplo 3.


In [109]:
"""
Beer & Johnston. (2012) Mechanics of materials. 
Problem 9.13 , pp. 568.
"""
# Input data 
E = 29e6
I = 291 # W14x30 
P = 35e3
L1 = 5*12 # in
L2 = 10*12 #in
# Model
m1 = BeamModel("Beam Model")
# Nodes
n1 = Node((0,0))
n2 = Node((L1,0))
n3 = Node((L1+L2,0))
# Elements
e1 = Beam((n1,n2),E,I)
e2 = Beam((n2,n3),E,I)

# Add elements 
for nd in (n1,n2,n3): m1.add_node(nd)
for el in (e1,e2): m1.add_element(el)
    
m1.add_force(n2, (-P,))
m1.add_constraint(n1, ux=0, uy=0) # fixed 
m1.add_constraint(n3, uy=0) # fixed
m1.solve() # Solve model

m1.plot_shear_diagram()
m1.plot_moment_diagram()



In [112]:
n1.fy


Out[112]:
23333.333333333358

Ejemplo 4


In [175]:
"""
Beer & Johnston. (2012) Mechanics of materials. 
Problem 9.13 , pp. 568.
"""

# Datos
P1 = 3e3
P2 = 3e3
M1 = 450
E = 200e9
I = (1/12)*(50e-3)*(60e-3)**3

n1 = Node((0,0))
n2 = Node((0.3,0))
n3 = Node((0.5,0))
n4 = Node((0.7,0))
n5 = Node((1,0))

e1 = Beam((n1,n2), E, I)
e2 = Beam((n2,n3), E, I)
e3 = Beam((n3,n4), E, I)
e4 = Beam((n4,n5), E, I)

model_cp = BeamModel()

for nodo in (n1,n2,n3,n4,n5): model_cp.add_node(nodo)
for el in (e1,e2,e3,e4): model_cp.add_element(el)

model_cp.add_constraint(n1, ux=0, uy=0)
model_cp.add_constraint(n5, uy=0)
model_cp.add_force(n2, (-P1,))
model_cp.add_force(n4, (-P2,))
model_cp.add_moment(n3, (-M1,))

model_cp.solve()
model_cp.plot_shear_diagram()
model_cp.plot_moment_diagram()



In [185]:
uy = []
for n in model_cp.get_nodes():
    uy.append(n.fy)

In [186]:
plt.plot(uy)


Out[186]:
[<matplotlib.lines.Line2D at 0x251f208c908>]

In [ ]: