by Luis Maldonado de la Torre
Python, conocido por su
simplicidad y versatilidad, se ha vuelto cada vez más popular entre los
ingenieros que buscan optimizar sus procesos, automatizar tareas
repetitivas y mejorar la precisión de sus análisis.
En este blog, exploraremos mis 5 bibliotecas de Python favoritas para el
análisis estructural. Ya sea que esté trabajando con análisis dinámicos
complejos o simplemente busque calcular las propiedades geométricas de
una sección, ¡hay una herramienta para usted!
¿Qué es una biblioteca de Python?
Una biblioteca de Python es
una colección de herramientas predefinidas que incluyen funciones,
clases y módulos diseñados para resolver tareas específicas sin
necesidad de codificar todo desde cero, ahorrándonos tiempo, porque en
la programación, no hay necesidad de reinventar la rueda.
Además, estas bibliotecas proporcionan flexibilidad y personalización debido a su de código abierto ,
lo que nos permite explorar, modificar y adaptar sus funcionalidades de
acuerdo con las necesidades específicas de cada proyecto. También se
destacan por su facilidad de uso , con documentación clara y una comunidad activa que hace que aprender y aplicarlos directamente, incluso para aquellos que no son expertos en programación.
Algunos ejemplos de
bibliotecas populares de Python que puede conocer son Numpy, Matplotlib,
Plotly y Pandas. Estos paquetes son ampliamente utilizados por los
ingenieros pero tienen un límite común. No están diseñados para la
ingeniería sino para el análisis de datos.
Sin embargo, en este artículo, quiero compartir los que aún no conoce que sean puramente para ingenieros. ¡Vamos a sumergirnos!
1. Modelado y análisis estructurales con OpenSePy
Opensees es
un poderoso software de código abierto. Es ideal para modelar y
analizar sistemas estructurales bajo cargas estáticas y dinámicas,
especialmente en escenarios que involucran terremotos. Su capacidad para
manejar análisis no lineales y avanzados lo hace particularmente útil
para proyectos de ingeniería sísmica.
Ventajas:
- Modelado avanzado: simula
el comportamiento plástico de los materiales y permite un análisis
lineal, por lo que es una herramienta versátil para todo tipo de
proyectos estructurales.
- Análisis dinámico: admite el análisis de la historia de tiempo, el análisis modal espectral y otros análisis dinámicos con alta precisión.
- Comunidad activa: Opensees tiene una gran base de usuarios que comparte ejemplos, modelos y soluciones a problemas complejos.
# Veamos un ejemplo de aplicación en Google Colab gracias a PPI >>!pip install openseespy
Collecting openseespy
Downloading openseespy-3.7.1.2-py3-none-any.whl.metadata (2.3 kB)
Collecting openseespylinux>=3.7.1.2 (from openseespy)
Downloading openseespylinux-3.7.1.2-py3-none-any.whl.metadata (1.2 kB)
Downloading openseespy-3.7.1.2-py3-none-any.whl (5.3 kB)
Downloading openseespylinux-3.7.1.2-py3-none-any.whl (58.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 58.1/58.1 MB 16.9 MB/s eta 0:00:00
Installing collected packages: openseespylinux, openseespy
Successfully installed openseespy-3.7.1.2 openseespylinux-3.7.1.2
Collecting opsvis
Downloading opsvis-1.2.30-py3-none-any.whl.metadata (1.1 kB)
Requirement already satisfied: openseespy in /usr/local/lib/python3.11/dist-packages (from opsvis) (3.7.1.2)
Requirement already satisfied: openseespylinux>=3.7.1.2 in /usr/local/lib/python3.11/dist-packages (from openseespy->opsvis) (3.7.1.2)
Downloading opsvis-1.2.30-py3-none-any.whl (54 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 54.7/54.7 kB 3.6 MB/s eta 0:00:00
Installing collected packages: opsvis
Successfully installed opsvis-1.2.30
>>import openseespy.opensees as ops
>>import opsvis as opsv
>>import matplotlib.pyplot as plt
>>import numpy as np
>>ops.wipe()
>>ops.model('basic', '-ndm', 2, '-ndf', 3)
>>m = 100 # Mass (kg)
>>h = 3 # Story height (m)
>>L = 5 # Bay width (m)
>>A = 0.09 # Column cross-sectional area (m2)
>>Ic = 0.000675 # Column moment of inertia (m4)
>>Iv = 10e10 # Rigid beam moment of inertia (m4)
>>E = 20e9 # Modulus of elasticity (GPa)
>># Definition of nodes and masses
>>ops.node(1, 0, 0)
>>ops.node(2, L, 0)
>>ops.node(3, 0, 1*h, '-mass', m, 0, 0)
>>ops.node(4, L, 1*h, '-mass', m, 0, 0)
>>ops.node(5, 0, 2*h, '-mass', m/2, 0, 0)
>>ops.node(6, L, 2*h, '-mass', m/2, 0, 0)
>># support
>>ops.fix(1, 1, 1, 1) # Fixed
>>ops.fix(2, 1, 1, 1) # Fixed
>>ops.geomTransf('Linear', 1)
>># Column
>>ops.element('elasticBeamColumn', 1, 1, 3, A, E, 2*Ic, 1)
>>ops.element('elasticBeamColumn', 2, 2, 4, A, E, 2*Ic, 1)
>>ops.element('elasticBeamColumn', 3, 3, 5, A, E, 1*Ic, 1)
>>ops.element('elasticBeamColumn', 4, 4, 6, A, E, 1*Ic, 1)
>># Beam
>>ops.element('elasticBeamColumn', 5, 3, 4, A, E, Iv, 1)
>>ops.element('elasticBeamColumn', 6, 5, 6, A, E, Iv, 1)
>># Calculation of vibration periods
>>NumModes = 2
>>eigen = np.array(ops.eigen(NumModes))
>>ω = eigen**0.5
>>T = 2*np.pi/ω
>>for i in range(NumModes):
>> opsv.plot_mode_shape(i+1, endDispFlag=0)
>> plt.title("$T_{%i}$: %.4f sec" % (i+1, T[i]))
>>plt.show() ```
2. Análisis FEM accesible con Pynite
Pynite es
una biblioteca de python liviana que permite el análisis de elementos
finitos de una manera simple y accesible. Su objetivo principal es
proporcionar una herramienta que logre un buen equilibrio entre la
simplicidad y la eficiencia para los ingenieros estructurales que no
necesitan un solucionador técnicamente complejo.
Pynite puede realizar un
análisis estático 3D y 2D, análisis P-δ para estructuras de cuadros y
manejar diferentes tipos de cargas: cargas de puntos, cargas
distribuidas, cargas nodales y combinaciones de carga.
Ventajas:
- Facilidad de uso :
Pynite tiene una curva de aprendizaje corta, por lo que cualquier
ingeniero con conocimiento básico de programación puede usarlo.
- Análisis eficiente : perfecto para proyectos donde se requieren simplicidad y velocidad.
- Resultados inmediatos : rápidamente genera diagramas de estrés y deformación, lo que le permite visualizar el comportamiento estructural al instante.
3. Calcule las propiedades de la sección transversal con las propiedades de secciones
SectionProperties permite el cálculo de las propiedades transversales utilizando el método de elementos finitos (FEM),
como área, centroide, momentos de inercia, tensiones de flexión y más,
lo que lo convierte en una herramienta esencial para ingenieros que
trabajan con concreto, acero o elementos madereros. Además, admite
trabajar con .dxf y .3dm (rhino), que es útil para importar geometrías de otros programas de modelado.
Una de las características impresionantes de SectionProperties es su capacidad para generar mallas precisas de secciones transversales. Además, proporciona opciones de exportación que
permiten guardar geometrías y propiedades calculadas en diferentes
formatos, lo que permite la integración en otros flujos de trabajo.
Ventajas :
- Flexibilidad : permite la definición de secciones complejas, incluidas formas compuestas e irregulares.
- Visualización gráfica :
proporciona una interfaz gráfica para visualizar las distribuciones de
estrés y deformación, lo que facilita la comprensión del comportamiento
estructural de las secciones analizadas.
- Velocidad :
realiza cálculos avanzados en segundos, ahorrando tiempo durante la
fase de diseño preliminar y mejorando la eficiencia en el desarrollo del
proyecto.
- Accesibilidad y código abierto :
a diferencia de otras herramientas comerciales, SectionProperties es de
código abierto y tiene una API disponible, lo que lo hace ideal para
los investigadores y los ingenieros que necesitan personalizar su flujo
de trabajo.
Veamos ahora un ejemplo en Google Colab, Gracias a PPI
>>! pip install sectionproperties
Collecting sectionproperties
Downloading sectionproperties-3.9.0-py3-none-any.whl.metadata (7.3 kB)
Collecting cytriangle>=2.0.0 (from sectionproperties)
Downloading cytriangle-2.0.0.tar.gz (336 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 336.4/336.4 kB 7.0 MB/s eta 0:00:00
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: matplotlib>=3.9.2 in /usr/local/lib/python3.11/dist-packages (from sectionproperties) (3.10.0)
Requirement already satisfied: more-itertools>=10.5.0 in /usr/local/lib/python3.11/dist-packages (from sectionproperties) (10.7.0)
Requirement already satisfied: numpy>=1.26.4 in /usr/local/lib/python3.11/dist-packages (from sectionproperties) (2.0.2)
Requirement already satisfied: rich>=13.9.4 in /usr/local/lib/python3.11/dist-packages (from rich[jupyter]>=13.9.4->sectionproperties) (13.9.4)
Requirement already satisfied: scipy>=1.14.1 in /usr/local/lib/python3.11/dist-packages (from sectionproperties) (1.15.3)
Requirement already satisfied: shapely>=2.0.7 in /usr/local/lib/python3.11/dist-packages (from sectionproperties) (2.1.1)
Collecting numpy>=1.26.4 (from sectionproperties)
Using cached numpy-2.3.1-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (62 kB)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.9.2->sectionproperties) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.9.2->sectionproperties) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.9.2->sectionproperties) (4.58.4)
Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.9.2->sectionproperties) (1.4.8)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.9.2->sectionproperties) (24.2)
Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.9.2->sectionproperties) (11.2.1)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.9.2->sectionproperties) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib>=3.9.2->sectionproperties) (2.9.0.post0)
Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from rich>=13.9.4->rich[jupyter]>=13.9.4->sectionproperties) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.11/dist-packages (from rich>=13.9.4->rich[jupyter]>=13.9.4->sectionproperties) (2.19.2)
Requirement already satisfied: ipywidgets<9,>=7.5.1 in /usr/local/lib/python3.11/dist-packages (from rich[jupyter]>=13.9.4->sectionproperties) (7.7.1)
Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.11/dist-packages (from ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (6.17.1)
Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.2.0)
Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.11/dist-packages (from ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (5.7.1)
Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (3.6.10)
Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (7.34.0)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (3.0.15)
Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.11/dist-packages (from markdown-it-py>=2.2.0->rich>=13.9.4->rich[jupyter]>=13.9.4->sectionproperties) (0.1.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.7->matplotlib>=3.9.2->sectionproperties) (1.17.0)
Requirement already satisfied: debugpy>=1.0 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.8.0)
Requirement already satisfied: jupyter-client>=6.1.12 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (6.1.12)
Requirement already satisfied: matplotlib-inline>=0.1 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.1.7)
Requirement already satisfied: nest-asyncio in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.6.0)
Requirement already satisfied: psutil in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (5.9.5)
Requirement already satisfied: pyzmq>=17 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (24.0.1)
Requirement already satisfied: tornado>=6.1 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (6.4.2)
Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (75.2.0)
Collecting jedi>=0.16 (from ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties)
Downloading jedi-0.19.2-py2.py3-none-any.whl.metadata (22 kB)
Requirement already satisfied: decorator in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (4.4.2)
Requirement already satisfied: pickleshare in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.7.5)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (3.0.51)
Requirement already satisfied: backcall in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.2.0)
Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (4.9.0)
Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.11/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (6.5.7)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in /usr/local/lib/python3.11/dist-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.8.4)
Requirement already satisfied: jupyter-core>=4.6.0 in /usr/local/lib/python3.11/dist-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (5.8.1)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (3.1.6)
Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (25.1.0)
Requirement already satisfied: nbformat in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (5.10.4)
Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (7.16.6)
Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.8.3)
Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.18.1)
Requirement already satisfied: prometheus-client in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.22.1)
Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.3.1)
Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.11/dist-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.7.0)
Requirement already satisfied: wcwidth in /usr/local/lib/python3.11/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.2.13)
Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.11/dist-packages (from jupyter-core>=4.6.0->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (4.3.8)
Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.11/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.2.4)
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (4.13.4)
Requirement already satisfied: bleach!=5.0.0 in /usr/local/lib/python3.11/dist-packages (from bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (6.2.0)
Requirement already satisfied: defusedxml in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.7.1)
Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.3.0)
Requirement already satisfied: markupsafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (3.0.2)
Requirement already satisfied: mistune<4,>=2.0.3 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (3.1.3)
Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.10.2)
Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.5.1)
Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.11/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (2.21.1)
Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.11/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (4.24.0)
Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.11/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (21.2.0)
Requirement already satisfied: webencodings in /usr/local/lib/python3.11/dist-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.5.1)
Requirement already satisfied: tinycss2<1.5,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.4.0)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (25.3.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (2025.4.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (0.26.0)
Requirement already satisfied: jupyter-server<3,>=1.8 in /usr/local/lib/python3.11/dist-packages (from notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.16.0)
Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.17.1)
Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.11/dist-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (2.7)
Requirement already satisfied: typing-extensions>=4.0.0 in /usr/local/lib/python3.11/dist-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (4.14.0)
Requirement already satisfied: pycparser in /usr/local/lib/python3.11/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (2.22)
Requirement already satisfied: anyio>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (4.9.0)
Requirement already satisfied: websocket-client in /usr/local/lib/python3.11/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.8.0)
Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.11/dist-packages (from anyio>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (3.10)
Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.11/dist-packages (from anyio>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<9,>=7.5.1->rich[jupyter]>=13.9.4->sectionproperties) (1.3.1)
Downloading sectionproperties-3.9.0-py3-none-any.whl (112 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 112.9/112.9 kB 9.7 MB/s eta 0:00:00
Using cached numpy-2.3.1-cp311-cp311-manylinux_2_28_x86_64.whl (16.9 MB)
Downloading jedi-0.19.2-py2.py3-none-any.whl (1.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 49.6 MB/s eta 0:00:00
Building wheels for collected packages: cytriangle
Building wheel for cytriangle (pyproject.toml) ... done
Created wheel for cytriangle: filename=cytriangle-2.0.0-cp311-cp311-manylinux_2_35_x86_64.whl size=1237594 sha256=e0ee93786649d8d407a4c59b28696bad82913137d83f00ae5c181770f35604bd
Stored in directory: /root/.cache/pip/wheels/d9/52/63/2e5a154198119771769a1600d36b6555bffe0314b2a04ac6b0
Successfully built cytriangle
Installing collected packages: numpy, jedi, cytriangle, sectionproperties
Attempting uninstall: numpy
Found existing installation: numpy 2.0.2
Uninstalling numpy-2.0.2:
Successfully uninstalled numpy-2.0.2
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
cupy-cuda12x 13.3.0 requires numpy<2.3,>=1.22, but you have numpy 2.3.1 which is incompatible.
numba 0.60.0 requires numpy<2.1,>=1.22, but you have numpy 2.3.1 which is incompatible.
tensorflow 2.18.0 requires numpy<2.1.0,>=1.26.0, but you have numpy 2.3.1 which is incompatible.
Successfully installed cytriangle-2.0.0 jedi-0.19.2 numpy-2.3.1 sectionproperties-3.9.0
WARNING: The following packages were previously imported in this runtime:
[numpy]
You must restart the runtime in order to use newly installed versions.
>>import sectionproperties.pre.library.primitive_sections as sections
>>from sectionproperties.analysis.section import Section
>>import matplotlib.pyplot as plt
>># Create outer circular section (diameter = 10)
>>outer_geometry = sections.circular_section(d=10, n=100)
>># Create inner circular section (hole) and shift it (diameter = 4, offset by 2 in x, 1 in y)
>>inner_geometry = sections.circular_section(d=4, n=100)
>>inner_geometry = inner_geometry.shift_section(x_offset=2, y_offset=1)
>># Subtract inner geometry from outer geometry to form a hollow section
>>geometry = outer_geometry - inner_geometry
>># Plot the resulting hollow section
>>geometry.plot_geometry()
>># Generate mesh for the section
>>geometry.create_mesh(mesh_sizes=[1])
>># Perform section analysis and display results
>>section = Section(geometry, time_info=True)
>>section.display_mesh_info()
>>section.plot_mesh(materials=False)
>>section.calculate_geometric_properties()
>>section.calculate_warping_properties()
>>section.calculate_plastic_properties()
>>section.plot_centroids()
>>section.display_results()
Mesh Statistics:
-
2036 nodes
- 918 elements
-
1 region
Section Properties
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Property ┃ Value ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ area │ 6.593005e+01 │
│ perimeter │ 3.141076e+01 │
│ qx │ -1.255810e+01 │
│ qy │ -2.511621e+01 │
│ ixx_g │ 4.651203e+02 │
│ iyy_g │ 4.274460e+02 │
│ ixy_g │ -2.511621e+01 │
│ cx │ -3.809524e-01 │
│ cy │ -1.904762e-01 │
│ ixx_c │ 4.627283e+02 │
│ iyy_c │ 4.178779e+02 │
│ ixy_c │ -2.990025e+01 │
│ zxx+ │ 8.914949e+01 │
│ zxx- │ 9.621084e+01 │
│ zyy+ │ 7.765873e+01 │
│ zyy- │ 9.046842e+01 │
│ rx │ 2.649240e+00 │
│ ry │ 2.517579e+00 │
│ i11_c │ 4.776784e+02 │
│ i22_c │ 4.029278e+02 │
│ phi │ -1.534349e+02 │
│ z11+ │ 9.556281e+01 │
│ z11- │ 9.556281e+01 │
│ z22+ │ 8.811666e+01 │
│ z22- │ 7.427927e+01 │
│ r11 │ 2.691697e+00 │
│ r22 │ 2.472134e+00 │
│ j │ 7.861955e+02 │
│ x_se │ -1.068935e+00 │
│ y_se │ -5.344649e-01 │
│ x1_se │ 7.691864e-01 │
│ y2_se │ -2.093882e-06 │
│ x_st │ -1.068935e+00 │
│ y_st │ -5.344649e-01 │
│ gamma │ 2.014705e+02 │
│ a_sx │ 4.774900e+01 │
│ a_sy │ 4.403138e+01 │
│ a_s11 │ 4.913163e+01 │
│ a_s22 │ 4.291766e+01 │
│ beta_x+ │ -1.142929e+00 │
│ beta_x- │ 1.142929e+00 │
│ beta_y+ │ -2.383527e+00 │
│ beta_y- │ 2.383527e+00 │
│ beta_11+ │ -4.187765e-06 │
│ beta_11- │ 4.187765e-06 │
│ beta_22+ │ 2.706659e+00 │
│ beta_22- │ -2.706659e+00 │
│ x_pc │ -6.297811e-01 │
│ y_pc │ -5.522453e-01 │
│ x11_pc │ -5.632947e-01 │
│ y22_pc │ -2.816474e-01 │
│ sxx │ 1.497765e+02 │
│ syy │ 1.374368e+02 │
│ s11 │ 1.558461e+02 │
│ s22 │ 1.344723e+02 │
│ sf_xx+ │ 1.680060e+00 │
│ sf_xx- │ 1.556753e+00 │
│ sf_yy+ │ 1.769754e+00 │
│ sf_yy- │ 1.519169e+00 │
│ sf_11+ │ 1.630824e+00 │
│ sf_11- │ 1.630824e+00 │
│ sf_22+ │ 1.526071e+00 │
│ sf_22- │ 1.810361e+00 │
└───────────┴───────────────┘
4. Análisis detallado de la sección de concreto reforzado con concreteproperties
Las concretas de propiedades facilitan el análisis detallado de secciones de concreto reforzadas , incluidas compuestas de concreto y acero , así como pretensado .
A diferencia de
SectionProperties, Concreteproperties se especializa en secciones de
concreto reforzadas y su análisis detallado. Esta herramienta no solo
permite el cálculo de propiedades geométricas, como el área transversal,
momentos de inercia, centroide, rigidez axial y más, sino que también
realiza análisis avanzados como de curvatura e diagramas ,
que se adaptan específicamente al comportamiento de concreto reforzado
en varias condiciones de carga. Esto lo convierte en la opción ideal
cuando se requiere un análisis detallado del comportamiento no lineal del concreto , incluyendo grietas, capacidad de flexión final y rigidez efectiva bajo cargas de servicio.
Ventajas :
- Versatilidad :
Concreteproperties admite una amplia gama de materiales, desde concreto
(confinado y no confinado) y acero hasta material pretensado, lo que lo
hace adaptable para diferentes tipos de proyectos.
- Análisis especializado :
proporciona herramientas para realizar un análisis profundo de
secciones concretas, desde la rigidez inicial hasta la capacidad de
carga máxima y las condiciones de servicio.
- Cumplimiento del código : incluye módulos específicos para validar diseños de acuerdo con estándares como AS3600 y pautas de evaluación como NZS3101 , asegurando el cumplimiento de los estándares reconocidos.
- Visualización clara :
genera gráficos detallados que ayudan a comprender el comportamiento
estructural, incluidas las distribuciones de estrés y los diagramas de
curvatura de momento.
>>! pip install concreteproperties
>>import matplotlib.pyplot as plt
>>from concreteproperties.design_codes.nzs3101 import NZS3101
>>from concreteproperties.design_codes.as3600 import AS3600
>>from sectionproperties.pre.library.concrete_sections import concrete_rectangular_section
>>from concreteproperties.concrete_section import ConcreteSection
>>from concreteproperties.results import MomentInteractionResults
>>from concreteproperties.results import MomentCurvatureResults
>># Select a design code
>>design_code = NZS3101()
>># design_code = AS3600()
>># Materials
>>concrete_40 = design_code.create_concrete_material(compressive_strength=40)
>>steel_500 = design_code.create_steel_material(steel_grade="500E") # steel for design code NZS3101
>># steel_500 = design_code.create_steel_material() # steel for design code AS3600
>>geom_col = concrete_rectangular_section(
>> b=600, d=600,
>> dia_top=20, area_top=314.16, n_top=4,
>> dia_bot=20, area_bot=314.16, n_bot=4,
>> dia_side=20, area_side=314.16, n_side=2,
>> c_bot=47, c_side=47, c_top=47,
>> n_circle=8,
>> conc_mat=concrete_40, steel_mat=steel_500)
>>conc_sec_col = ConcreteSection(geom_col)
>>conc_sec_col.plot_section()
>>design_code.assign_concrete_section(conc_sec_col)
>>f_mi_res, mi_res, phis = design_code.moment_interaction_diagram()
>>ax = MomentInteractionResults.plot_multiple_diagrams(
>> [f_mi_res, mi_res], ["Factored", "Unfactored"], fmt="-", render=False)
>># design load cases
>>n_stars = [4000e3, 5000e3, -500e3, 1000e3]
>>m_stars = [200e6, 400e6, 100e6, 650e6]
>>marker_styles = ["x", "+", "o", "*"]
>># check to see if combination is within diagram and plot result
>>for idx in range(len(n_stars)):
>> case = f_mi_res.point_in_diagram(n=n_stars[idx], m=m_stars[idx])
>> print("Case {num}: {status}".format(
>> num=idx + 1, status="OK" if case else "FAIL"))
>> ax.plot(m_stars[idx] / 1e6, n_stars[idx] / 1e3, "k" + marker_styles[idx],
>> markersize=10, label=f"Case {idx + 1}")
>>ax.legend(loc="lower right")
>>plt.show()
>># Moment-Curvature Analysis
>>moment_curvature_results = conc_sec_col.moment_curvature_analysis()
>>MomentCurvatureResults.plot_results(moment_curvature_results, fmt="-r")
5. Análisis estructural con anaestructiva
Anastruct es una biblioteca de pitón liviana diseñada para realizar un análisis estructural lineal de marcos y armaduras en
2D, utilizando el método de elementos finitos, lo que permite a los
ingenieros obtener rápidamente resultados claros y precisos sin
complicaciones.
Anastruct ofrece un conjunto
completo de herramientas para analizar reacciones, momentos de flexión,
fuerzas de corte, fuerzas axiales y desplazamientos. Además, admite nodos no lineales y no linealidad geométrica , lo que mejora su capacidad para modelar sistemas con un comportamiento complejo.
Ventajas :
- Visualización clara :
la anastructación genera gráficos detallados, que incluyen líneas de
momento de flexión, fuerzas axiales, fuerzas de corte y desplazamientos,
lo que facilita la interpretación y comunicación de resultados.
- Facilidad de uso :
con una configuración directa, la anastructación es ideal para los
ingenieros que buscan una herramienta rápida y accesible para cálculos
estructurales 2D.
- Flexibilidad en la definición de la sección :
ofrece una base de datos de perfiles de acero como HEA e IPE, así como
la opción de definir propiedades geométricas para cada elemento creado.
>>from anastruct import SystemElements
>>ss = SystemElements(EA=2e4, EI=6e3)
>>ss.add_element([[0, 0], [0, 3]])
>>ss.add_element([[4, 0], [4, 3]])
>>ss.add_element([[8, 0], [8, 3]])
>>ss.add_element([[0, 3], [0, 6]])
>>ss.add_element([[4, 3], [4, 6]])
>>ss.add_element([[0, 3], [4, 3]])
>>ss.add_element([[4, 3], [8, 3]])
>>ss.add_element([[0, 6], [4, 6]])
>>ss.add_support_fixed(1)
>># Add rotational spring support at node 3
>>ss.add_support_spring(3, translation=3, k=6e3)
>>ss.add_support_spring(5, translation=2, k=3e3)
>># Add loads
>>ss.q_load(q=-6, element_id=[6, 7, 8])
>>ss.point_load(node_id=[2, 7], Fx=8)
>>ss.solve()
>>ss.show_structure()
>>ss.show_reaction_force()
>>ss.show_axial_force()
>>ss.show_shear_force()
>>ss.show_bending_moment()
>>ss.show_displacement()
API de software comercial
Además de estas bibliotecas de código abierto, muchos programas de análisis estructural comerciales ofrecen API (interfaz
de programación de aplicaciones) que puede usar con Python para
automatizar los procesos. Algunos de los más conocidos son:
- RFEM (Dlubal)
- Etabs (CSI)
- Ansys
- Abaqus
- Tekla
En los próximos blogs,
exploraremos cómo usar estas API para crear flujos de trabajo eficientes
y automatizar tareas repetitivas en grandes proyectos de ingeniería.
¿Qué sigue?
Usar Python es un cambio de
juego en ingeniería estructural. Si domina las habilidades para
automatizar su trabajo con Python, se destaca entre la multitud. En
lugar de lidiar con tareas repetitivas, Python le permite pasar más
tiempo creando soluciones innovadoras.
Si desea que sus
automatizaciones de Python sean más accesibles, puede usar VIKTOR para
convertirlas en aplicaciones web intuitivas y compartibles que
racionalizan aún más su flujo de trabajo. Con Viktor, puede integrarse
con cualquier software de terceros y biblioteca de Python, aumentar la
eficiencia y la colaboración dentro de los equipos de ingeniería, y
ofrecer soluciones óptimas en muy poco tiempo.
¿Listo para ofrecer un mejor diseño estructural en menos tiempo? Aprende más.