Tutorial para correr desde Python
Crear estructuras desde script de python
Se puede crear y correr una estructura desde un script de python (archivo .py), corriendolo desde una consola de Python o desde el 'Command prompt' de windows. Se pueden encontrar ejemplos de scripts en el Gitlab del proyecto.
Ubicación:
El archivo .py debe guardarse en el mismo directorio que la carpeta Atenea3d.
*Para guardar y correr el archivo desde otro directorio, debe poder importarse de manera correcta el paquete Atenea3d, donde quiera que esté en la computadora.
Estructura del archivo
El archivo debe importar todas las funciones del paquete core de Atenea3d (que está en el mismo directorio que el archivo de la estructura):
from Atenea3d.source.core import *
Cargar nodos y barras:
Los nodos se cargan definiendo las coordenadas en un diccionario.
XYZ = {}
XYZ[1] = [0,0,0] # Nodo 1
XYZ[2] = [0,0,3]
XYZ[3] = [4,0,0]
XYZ[4] = [4,0,3]
XYZ[5] = [4,4,0]
XYZ[6] = [4,4,3]
XYZ[7] = [0,4,0]
XYZ[8] = [0,4,3]
Las barras se cargan definiendo las conectividades entre nodos en un diccionario.
CON = {}
CON[1] = [1,2] # Barra 1, del Nodo 1 al Nodo 2
CON[2] = [3,4]
CON[3] = [5,6]
CON[4] = [7,8]
CON[5] = [2,4]
CON[6] = [2,8]
CON[7] = [6,8]
CON[8] = [6,4]
Se tiene que definir el tipo de elemento de barra
ElemName = {}
ElemName[1] = '3DFrame' # Barra 1, es un elemento tipo viga
ElemName[2] = '3DFrame'
ElemName[3] = '3DFrame'
ElemName[4] = '3DFrame'
ElemName[5] = '3DFrame'
ElemName[6] = '3DFrame'
ElemName[7] = '3DFrame'
ElemName[8] = '3DFrame'
Cargar vínculos:
Las condiciones de vínculo se indican especificando los grados de libertad [dx,dy,dz,gx,gy,gz] restringidos en los nodos correspondientes.
BOUN = {}
BOUN[1] = [1,1,1,1,1,1] # Nodo 1 con restricción de desplazamientos y giros
BOUN[3] = [1,1,1,1,1,1]
BOUN[5] = [1,1,1,1,1,1]
BOUN[7] = [1,1,1,1,1,1]
Los releases (articulaciones) en las barras se indican especificando el release liberado
[Mxi, Myi, Mzi, Pxf, Myf, Mzf] en la barra correspondiente
rel = {}
rel[5] = [0,1,1,0,0,0] # Barra 5 con releases de momento en ambas direcciones en nudo inicial
Los materiales y secciones deben definirse primero, y luego asociarse a cada barra. Todas las barras deben tener un material y sección asociados.
Se les puede asignar cualquier nomber
# Materiales
all = {'E':30000000, 'mu':0.2, 'l':1e-5}
# Secciones
cols = {'A': 0.05, 'Iy': 0.08, 'Iz': 0.08, 'Jt': 0.05, 'alpha': 0}
vigas = {'A': 0.09, 'Iy': 0.12, 'Iz': 0.03, 'Jt': 0.06, 'alpha': 0}
Y ahora se asignan material y sección a cada barra.
ElemData = {}
ElemData[1] = {'mat':all, 'seccion':cols}
ElemData[2] = {'mat':all, 'seccion':cols}
ElemData[3] = {'mat':all, 'seccion':cols}
ElemData[4] = {'mat':all, 'seccion':cols}
ElemData[5] = {'mat':all, 'seccion':vigas}
ElemData[6] = {'mat':all, 'seccion':vigas}
ElemData[7] = {'mat':all, 'seccion':vigas}
ElemData[8] = {'mat':all, 'seccion':vigas}
Cargar acciones:
Las cargas puntuales se indican por nodo con una lista de 6 elementos: [Px, Py, Pz, Mx, My, Mz]
P = {}
P[2] = [1000,0,0,0,0,0] # Carga puntual en dir. X de valor 1000, en el Nodo 2
P[8] = [1000,0,0,0,0,0]
Las cargas distribuidas se indican por barra, indicando, además, la terna (local o global) para definir el sentido de la carga.
w = {}
w[5] = {'wxi':1, 'wxf':1, 'wyi':0, 'wyf':0, 'wzi':-1, 'wzf':-1, 'terna':'local'}
Las deformaciones no-mecánicas (ej. temperatura, secado) se indican por barra, indicando:
[Tsupy, Tinfy, hy, Tsupz, Tinfz, hz]
e0 = {}
e0[1] = [-10,20,0.5,0,0,1] # Variación de temperatura en Barra 1 en sentido y
Los cedimientos de vínculo se indican por Nodo, con 6 componentes: [dx, dy, dz, gx, gy, gz]
ced = {}
ced[1] = [0,0.01,0,0,0] # Cedimiento de vínculo horizontal, en Nodo 1.
Crear estructura:
Se crea un objeto de la clase 'Estructura' mediante el módulo preprocess.
Estructura = preprocess.crear_estructura(XYZ, CON, ElemName, BOUN, ElemData, rel, P, w, e0, ced)
Alternativamente puede crearse una estructura desde un archivo .txt con un formato similar al recién explicado, usando el comando:
filename = 'direccion\\del\\archivo\\estructura.txt'
Estructura = preprocess.crear_estructura_from_file(filename)
Correr estructura:
Correr el método de rigideces
analysis1el.metodo_rigideces(Estructura)
Correr la estructura con el método de flexibilidades
analysis1el.metodo_flexibilidades(Estructura)
Correr la estructura usando equilibrio de fuerzas (solo para estructura isostáticas)
analysis1el.resolver_isostatico(Estructura)
Mostrar resultados:
Plotear estructura (indices de nodos y barras, ejes locales) y acciones:
graph2d.plot_estructura(Estructura, fuerzas=True, vinculos=True, cedimientos=True,
indiceN=False, ejes_loc=False, temp=True, indiceB=False, origen=False)
Plotear resultados (reacciones, diagramas, deformada):
graph3d.plot_resultados(Estructura, reacciones=False, diagrama='Mz', deformada=False)
graph2d.plot_resultados(Estructura, reacciones=False, diagrama=False, deformada=True)