Está en la página 1de 9

29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

ANÁLISIS AVANZADO DE ESTRUCTURAS - C801


CE801 - Tarea 08

CHÁVEZ SANDOVAL, DANTE LUIS

MENDOZA SULCARAY, RENZO

Finalidad

Esta asignación examina la precisión de diferentes enfoques de integración numérica para vigas simples con soluciones conocidas para el momento de
flexión y los desplazamientos nodales.

Problema

Una viga prismática (𝑏 = 6 𝑖𝑛, ℎ = 12 𝑖𝑛) de longitud 𝐿 y rigidez a flexión 𝐸𝐼 está sujeto a tres escenarios de carga de creciente complejidad.

Complete un cuaderno (Jupyter Notebook) con OpenSees que analice las vigas utilizando 𝐿 = 25 𝑓𝑡, 𝐸 = 29000 𝑘𝑠𝑖, inercia 𝐼 considerando las
dimensiones. Aunque muchas formulaciones de elementos de marco y enfoques de integración numérica están disponibles en OpenSees, use un
elemento basado en fuerza (force-based) con secciones elásticas para cada viga. Aunque esta es una formulación de elementos de marco con no
linealidad de material, que cubriremos en las siguientes clases, podemos utilizar secciones elásticas para recuperar la respuesta elástico-lineal de la viga.
Utilice el siguiente comando para definir la sección elástica para los modelos de marco plano (2D).
𝑜𝑝𝑠.𝑠𝑒𝑐𝑡𝑖𝑜𝑛(′𝐸𝑙𝑎𝑠𝑡𝑖𝑐′, 𝑠𝑒𝑐𝑇𝑎𝑔, 𝐸, 𝐴, 𝐼)

Use la sección elástica para definir los objetos 𝑏𝑒𝑎𝑚𝐼𝑛𝑡𝑒𝑔𝑟𝑎𝑡𝑖𝑜𝑛 como se describe a continuación:

Gauss-Legendre

𝑝
Analiza los tres escenarios de carga con 𝑁 = 2 puntos de integración de Gauss-Legendre. Compare los momentos de flexión calculado en
extremos, las rotaciones en los apoyos, y las reacciones de los apoyos con soluciones exactas para cada escenario. El uso de 2 puntos de Gauss-
Legendre es suficiente para los 3 escenarios, comente al respecto.
Repita el ítem previo utilizando 3 puntos de Gauss-Legendre.

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 1/9
29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

Usando la sección definida anteriormente, puede definir la integración de Gauss-Legendre con:


𝑜𝑝𝑠.𝑏𝑒𝑎𝑚𝐼𝑛𝑡𝑒𝑔𝑟𝑎𝑡𝑖𝑜𝑛(′𝐿𝑒𝑔𝑒𝑛𝑑𝑟𝑒′, 𝑖𝑛𝑡𝑇𝑎𝑔, 𝑠𝑒𝑐𝑇𝑎𝑔, 𝑁 ) 𝑝
𝑝
Donde 𝑁 es el numero de puntos de integración. Luego, cree un elemento de marco (frame) basado en fuerza (force-based).
𝑜𝑝𝑠.𝑒𝑙𝑒𝑚𝑒𝑛𝑡(′𝑓𝑜𝑟𝑐𝑒𝐵𝑒𝑎𝑚𝐶𝑜𝑙𝑢𝑚𝑛′, 𝑒𝑙𝑒𝑇𝑎𝑔, 𝑛𝑑𝐼, 𝑛𝑑𝐽, 𝑡𝑟𝑎𝑛𝑠𝑓𝑇𝑎𝑔, 𝑖𝑛𝑡𝑇𝑎𝑔)

Use una transformación geométrica lineal.

Gauss-Lobatto

𝑝
Analiza los tres escenarios de carga con 𝑁 = 3 puntos de integración de Gauss-Lobatto. Compare los momentos de flexión calculado en extremos,
las rotaciones en los apoyos, y las reacciones de los apoyos con soluciones exactas para cada escenario. El uso de 3 puntos de Gauss-Lobatto es
suficiente para los 3 escenarios, comente al respecto.
Repita el ítem previo utilizando 4 puntos de Gauss-Lobatto.

La definición de integración de Gauss-Lobatto es la misma que Gauss-Legendre, solo con una palabra clave diferente.
𝑜𝑝𝑠.𝑏𝑒𝑎𝑚𝐼𝑛𝑡𝑒𝑔𝑟𝑎𝑡𝑖𝑜𝑛(′𝐿𝑜𝑏𝑎𝑡𝑡𝑜′, 𝑖𝑛𝑡𝑇𝑎𝑔, 𝑠𝑒𝑐𝑇𝑎𝑔, 𝑁 )𝑝
Newton-Cotes

𝑝
Analiza los tres escenarios de carga con 𝑁 = 4 puntos de integración de Newton-Cotes. Compare los momentos de flexión calculado en extremos,
las rotaciones en los apoyos, y las reacciones de los apoyos con soluciones exactas para cada escenario. El uso de 4 puntos de Newton-Cotes es
suficiente para los 3 escenarios, comente al respecto.
Repita el ítem previo utilizando 5 puntos de Newton-Cotes.

La definición de integración de Newton-Cotes es la misma que Gauss-Legendre, solo con una palabra clave diferente.
𝑜𝑝𝑠.𝑏𝑒𝑎𝑚𝐼𝑛𝑡𝑒𝑔𝑟𝑎𝑡𝑖𝑜𝑛(′𝑁𝑒𝑤𝑡𝑜𝑛𝐶𝑜𝑡𝑒𝑠′, 𝑖𝑛𝑡𝑇𝑎𝑔, 𝑠𝑒𝑐𝑇𝑎𝑔, 𝑁 ) 𝑝
Cargas en vigas Para el primer escenario (𝑀 = 400 𝑘𝑖𝑝 − 𝑓𝑡), puede usar una carga nodal como sigue:
𝑜𝑝𝑠. 𝑙𝑜𝑎𝑑(2,0,0, 𝑀)

Para el segundo escenario (𝑤 = 5 𝑘𝑖𝑝 ⁄ 𝑓𝑡), puede usar el comando 𝑒𝑙𝑒𝐿𝑜𝑎𝑑 como sigue:
𝑜𝑝𝑠.𝑒𝑙𝑒𝐿𝑜𝑎𝑑(′ − 𝑒𝑙𝑒′, 1,′− 𝑡𝑦𝑝𝑒′,′𝑏𝑒𝑎𝑚𝑈𝑛𝑖𝑓𝑜𝑟𝑚′, −𝑤)

Del mismo modo, para el tercer escenario de carga, puede dar más argumentos al comando 𝑒𝑙𝑒𝐿𝑜𝑎𝑑 como sigue:
𝑦 𝑥 / / 𝑦 𝑥
𝑜𝑝𝑠. 𝑒𝑙𝑒𝐿𝑜𝑎𝑑(′− 𝑒𝑙𝑒′, 1,′− 𝑡𝑦𝑝𝑒′,′𝑏𝑒𝑎𝑚𝑈𝑛𝑖𝑓𝑜𝑟𝑚′, 0,0,0,1, −𝑤, 0) # 𝑤 𝑒𝑛 𝑎, 𝑤 𝑒𝑛 𝑎, 𝑎 𝐿 , 𝑏 𝐿 , 𝑤 𝑒𝑛 𝑏, 𝑤 𝑒𝑛 𝑏

Resolución del problema

Solución exacta para cada caso de carga

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 2/9
29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

Parte 1: Gauss-Legendre

- Parte 1-A: Gauss-Legendre ( 𝑁𝑝 = 2 puntos de integración)

1. Realizando el modelo en OpenSees y realizando el Análisis Elástico

In [1]: import openseespy.opensees as ops


import matplotlib.pyplot as plt
import numpy as np
import opsvis as opsv
import math
from pandas import DataFrame

2. Unidades básicas y derivadas

In [2]: kip = 1.0


inch = 1.0
ft = 12*inch
ksi = kip/inch**2

3. Propiedades del material

In [3]: E = 29000*ksi
v = 0.30
G = E/(2*(1+v))
print("Modulo de elasticidad del acero E= ",E,"ksi")
print("Modulo de corte del acero G= ",G,"ksi")

Modulo de elasticidad del acero E= 29000.0 ksi


Modulo de corte del acero G= 11153.846153846154 ksi

4. Propiedades geométricas de las secciones

In [4]: L = 25*ft
b = 6*inch
h = 12*inch
A = b*h
I = 1/12*b*h**3
M = 400*kip*ft
w = 5.0*kip/ft
EI = E*I
print("Sección cuadrada ",b,"x",h,"inch")
print("Área de la sección A= ",A,"inch^2")
print("Momento de Inercia de la sección I= ",I,"inch^4")

Sección cuadrada 6.0 x 12.0 inch


Área de la sección A= 72.0 inch^2
Momento de Inercia de la sección I= 864.0 inch^4

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 3/9
29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

5. Geometría del modelo

In [5]: ops.wipe()
ops.model('basic','-ndm',2,'-ndf',3)

# Definición de coordenadas del modelo
ops.node(1,0.0,0.0), ops.fix(1,1,1,0)
ops.node(2,L,0.0), ops.fix(2,1,1,0)

# Transformación geométrica lineal
ops.geomTransf('Linear',5)

# Definición de las secciones para el modelo de marco plano (2D)
ops.section('Elastic',1,E,A,I)

Np = 2 #Número de puntos de integración

# Creación de elementos frame
ops.beamIntegration('Legendre',15,1,Np)
ops.element('forceBeamColumn',1,1,2,5,15)

# Asignación de cargas
ops.timeSeries('Constant',20)
ops.pattern('Plain',5,20)
ops.load(2,0.0,0.0,M)

ops.analysis('Static')
ops.analyze(1)

ops.reactions()

WARNING analysis Static - no Algorithm yet specified,


NewtonRaphson default will be used
WARNING analysis Static - no ConstraintHandler yet specified,
PlainHandler default will be used
WARNING analysis Static - no Numberer specified,
RCM default will be used
WARNING analysis Static - no Integrator specified,
StaticIntegrator default will be used
WARNING analysis Static - no LinearSOE specified,
ProfileSPDLinSOE default will be used

Vista tridimensional del modelo

In [6]: opsv.plot_model(node_labels=1, element_labels=1, local_axes =True)


plt.title('Modelo estructural de Viga Simplemente apoyada')
opsv.plot_loads_2d ()
plt.title('Asignación de cargas')

Out[6]: Text(0.5, 1.0, 'Asignación de cargas')

Vista del modelo estructural deformado

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 4/9
29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

In [7]: opsv.plot_defo(sfac=False, nep=17, unDefoFlag=1, fmt_defo={'color': 'blue', 'linestyle': 'solid',


'linewidth': 1.2, 'marker': '', 'markersize': 1},
fmt_undefo={'color': 'green', 'linestyle': (0, (1, 5)), 'linewidth': 1.2, 'marker': '', 'markersize': 1},
Eo=0, node_supports=True, ax=False)
plt.title('Vista Deformada')

Out[7]: Text(0.5, 1.0, 'Vista Deformada')

6. Resultados del análisis

6.1. Reacciones en la base

In [8]: print("Nodo [Rx, Ry, Mz]")


R1 = ops.nodeReaction(1)
R2 = ops.nodeReaction(2)
print(1,ops.nodeReaction(1))
print(2,ops.nodeReaction(2))

print('\n', 'Reacciones en el nodo 1 - Calculadas')
display(DataFrame(R1))
print('\n', 'Reacciones en el nodo 2 - Calculadas')
display(DataFrame(R2))

Nodo [Rx, Ry, Mz]


1 [0.0, 16.0, -2.0516921495072933e-13]
2 [0.0, -16.0, 0.0]

Reacciones en el nodo 1 - Calculadas

0 0.000000e+00

1 1.600000e+01

2 -2.051692e-13

Reacciones en el nodo 2 - Calculadas

0 0.0

1 -16.0

2 0.0

Resultados esperados del modelo - Reacciones en la base

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 5/9
29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

In [9]: # Reacciones en el Nodo 1


R1_esperado = np.zeros((3,1))
R1_esperado[0,0] = 0.0*kip
R1_esperado[1,0] = M/L
R1_esperado[2,0] = 0.0

# Reacciones en el Nodo 2
R2_esperado = np.zeros((3,1))
R2_esperado[0,0] = 0.0*kip
R2_esperado[1,0] = -M/L
R2_esperado[2,0] = 0.0

print("Nodo [Rx, Ry, Mz]")
print(1,np.transpose(R1_esperado))
print(2,np.transpose(R2_esperado))

print('\n', 'Reacciones en el nodo 1 - Esperadas')
display(DataFrame(R1_esperado))
print('\n', 'Reacciones en el nodo 2 - Esperadas')
display(DataFrame(R2_esperado))

Nodo [Rx, Ry, Mz]


1 [[ 0. 16. 0.]]
2 [[ 0. -16. 0.]]

Reacciones en el nodo 1 - Esperadas

0 0.0

1 16.0

2 0.0

Reacciones en el nodo 2 - Esperadas

0 0.0

1 -16.0

2 0.0

Errores en el cálculo de Reacciones

In [10]: # Errores en las reacciones en el Nodo 1


Error_1 = np.zeros((3,1))
for i in range(1,4):
Error_1 [i-1,0] = abs(R1 [i-1] - R1_esperado [i-1,0])

# Errores en las reacciones en el Nodo 2
Error_2 = np.zeros((3,1))
for i in range(1,4):
Error_2 [i-1,0] = abs(R2 [i-1] - R2_esperado [i-1,0])

print('\n', 'Errores en las reacciones en el nodo 1')
display(DataFrame(Error_1))
print('\n', 'Errores en las reacciones en el nodo 2')
display(DataFrame(Error_2))

Errores en las reacciones en el nodo 1

0 0.000000e+00

1 0.000000e+00

2 2.051692e-13

Errores en las reacciones en el nodo 2

0 0.0

1 0.0

2 0.0

Comentario:

Se puede apreciar que el error en las reacciones se encuentran en un margen de 0.00 en la dirección Y, por lo que es aproximadamente exacta, mientras
en el momento se tiene un momento en un extremo 2.05𝑥10−13 (por valor esperado debería ser 0). Por lo que se puede decir que con 2 puntos el
cálculo es suficiente para dar por válido el modelo.

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 6/9
29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

6.2. Desplazamientos en los nodos

In [11]: print("Nodo [Δx, Δy, θz]")


Δ1 = ops.nodeDisp(1)
Δ2 = ops.nodeDisp(2)
for nd in ops.getNodeTags():
print(nd,ops.nodeDisp(nd))

print('\n', 'Desplazamientos en el nodo 1 - Calculadas')
display(DataFrame(Δ1))
print('\n', 'Desplazamientos en el nodo 2 - Calculadas')
display(DataFrame(Δ2))

Nodo [Δx, Δy, θz]


1 [0.0, 0.0, -0.00957854406130268]
2 [0.0, 0.0, 0.019157088122605366]

Desplazamientos en el nodo 1 - Calculadas

0 0.000000

1 0.000000

2 -0.009579

Desplazamientos en el nodo 2 - Calculadas

0 0.000000

1 0.000000

2 0.019157

Resultados esperados del modelo - Desplazamientos de los nodos

In [12]: # Desplazamientos en el Nodo 1


Δ1_esperado = np.zeros((3,1))
Δ1_esperado[0,0] = 0.0*inch
Δ1_esperado[1,0] = 0.0*inch
Δ1_esperado[2,0] = -M*L/(6*EI)

# Desplazamientos en el Nodo 2
Δ2_esperado = np.zeros((3,1))
Δ2_esperado[0,0] = 0.0*inch
Δ2_esperado[1,0] = 0.0*inch
Δ2_esperado[2,0] = M*L/(3*EI)

print("Nodo [Δx, Δy, θz]")
print(1,np.transpose(Δ1_esperado))
print(2,np.transpose(Δ2_esperado))

print('\n', 'Desplazamientos en el nodo 1 - Esperadas')
display(DataFrame(Δ1_esperado))
print('\n', 'Desplazamientos en el nodo 2 - Esperadas')
display(DataFrame(Δ2_esperado))

Nodo [Δx, Δy, θz]


1 [[ 0. 0. -0.00957854]]
2 [[0. 0. 0.01915709]]

Desplazamientos en el nodo 1 - Esperadas

0 0.000000

1 0.000000

2 -0.009579

Desplazamientos en el nodo 2 - Esperadas

0 0.000000

1 0.000000

2 0.019157

Errores en el cálculo de los Desplazamientos

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 7/9
29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

In [13]: # Errores en los desplazamientos en el Nodo 1


Error_1 = np.zeros((3,1))
Error_1_porc = np.zeros((3,1))
for i in range(1,4):
Error_1 [i-1,0] = abs(Δ1 [i-1] - Δ1_esperado [i-1,0])
if Δ1_esperado [i-1,0] == 0:
Error_1_porc [i-1,0] = 0.0
else:
Error_1_porc [i-1,0] = Error_1 [i-1,0]/abs(Δ1_esperado [i-1,0])*100
# Errores en los desplazamientos en el Nodo 2
Error_2 = np.zeros((3,1))
Error_2_porc = np.zeros((3,1))
for i in range(1,4):
Error_2 [i-1,0] = abs(Δ2 [i-1] - Δ2_esperado [i-1,0])
if Δ2_esperado [i-1,0] == 0:
Error_2_porc [i-1,0] = 0.0
else:
Error_2_porc [i-1,0] = Error_2 [i-1,0]/abs(Δ2_esperado [i-1,0])*100

print('\n', 'Errores en los desplazamientos en el nodo 1')
display(DataFrame(Error_1))
print('\n', 'Errores en los desplazamientos en el nodo 2')
display(DataFrame(Error_2))

print('\n', 'Error Porcentual en los desplazamientos en el nodo 1 (%)')
display(DataFrame(Error_1_porc))
print('\n', 'Error Porcentual en los desplazamientos en el nodo 2 (%)')
display(DataFrame(Error_2_porc))

Errores en los desplazamientos en el nodo 1

0 0.000000e+00

1 0.000000e+00

2 1.734723e-18

Errores en los desplazamientos en el nodo 2

0 0.000000e+00

1 0.000000e+00

2 3.469447e-18

Error Porcentual en los desplazamientos en el nodo 1 (%)

0 0.000000e+00

1 0.000000e+00

2 1.811051e-14

Error Porcentual en los desplazamientos en el nodo 2 (%)

0 0.000000e+00

1 0.000000e+00

2 1.811051e-14

Comentario:

Se puede apreciar que el error en los desplazamientos se encuentran en un margen de 1.81𝑥10−14 % por lo que se puede decir que con 2 puntos el
cálculo es suficiente para dar por válido el modelo.

6.3. Fuerzas básicas en los elementos

In [14]: print("Elemento [Fx, Fy, Mz]")


for nd in ops.getEleTags():
print(nd, ops.basicForce(nd))

Elemento [Fx, Fy, Mz]


1 [0.0, -2.0516921495072933e-13, 4800.0]

6.4. Diagrama de fuerzas en los elementos

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 8/9
29/6/23, 23:10 C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01 - Jupyter Notebook

Diagrama de Fuerzas axiales (N)

In [15]: opsv.section_force_diagram_2d('N',sfac=0.5, end_max_values=True, node_supports=True)


plt.title('Axial force N')

Out[15]: Text(0.5, 1.0, 'Axial force N')

Diagrama de Fuerzas cortantes (V)

In [16]: opsv.section_force_diagram_2d('T',sfac=1, end_max_values=True, node_supports=True)


plt.title('Transverse force V')

Out[16]: Text(0.5, 1.0, 'Transverse force V')

Diagrama de Momentos flectores (M)

In [17]: opsv.section_force_diagram_2d('M',sfac=0.02, end_max_values=True, node_supports=True)


plt.title('Bending moments M')

Out[17]: Text(0.5, 1.0, 'Bending moments M')

Comentario:

Se puede apreciar que hay una correspondencia entre los diagramas y las cargas aplicadas en el modelo. Por lo tanto se da validez a los resultados
obtenidos.

localhost:8889/notebooks/C831 ANALISIS AVANZADO/Tarea 08/C801 - Tarea 08 - CHAVEZ SANDOVAL - MENDOZA SULCARAY - Parte 01.ipynb 9/9

También podría gustarte