PROGRAMA PORTICOS
Mario de Lama mdelama@teleline.es
http://www.teleline.es/personal/mdelama/
Tipo
legal del programa y responsablidades
El programa es freeware. No me hago responsable de nada, bastante
he tenido con hacer el programa. Haber si se os cae la casa y me echáis
las culpas.
Inicio
Datos
del programa
Nombre: PORTICOS
Tamaño: 11967 by, cheksum # 841Dh (48GX); 12559 by, cheksum
# A92Fh (48G)
Autor: Mario de Lama
Utilidad: Cálculo de estructuras reticulares planas (pórticos)
Fecha: 26-1-1996
Inicio
Variables
del directorio PORTICOS
Para empezar, pasa el archivo PORTICOS (del directorio 48G o del 48GX)
a la calculadora, es un directorio que contiene tres variables:
-
|DATOS|
una lista con los datos del programa, inicialmente tiene el valor '0'
-
|ESCALA|
un número real que modifica la presentación del croquis que
dibuja el programa. Puede ser cualquier nº positivo (si es negativo,
no se dibuja nada) de forma que con '0' se dibujaría una línea
vertical y con '100' (o más) una horizontal, los valores normales
varían entre '0,5' y '2' dependiendo de cómo desees ver el
croquis. Si borras esta variable, el programa la vuelve a crear con un
valor predefinido.
-
|PORTICOS|
es el programa en sí. Tras almacenar la lista de datos sólo
tienes que presionar |PORTICOS| y el programa se pondrá a funcionar.
Si encuentra algo mal en los datos, se producirá un error y te informará
dónde. También te informa de algún otro tipo de error,
encontrarás la tabla de errores más adelante.
Inicio
Criterio
de signos
En la figura superior podemos ver el convenio de signos usado por el
programa tanto para los datos como para las soluciones.
Inicio
Unidades
En cuanto a las unidades, pueden ser cualesquiera siempre que seamos
consecuentes: Si damos el módulo de Young (E) en kg/cm^2, las cargas
habremos de darlas en kg, las coordenadas en cm, las áreas en cm^2
y las inercias en cm^4. Si lo damos en T/m^2, los datos habrán de
ir en T, m, m^2 y m^4. De igual forma con cualquier otra combinación
que deseéis. Usaremos grados sexagesimales para definir los ángulos
que forman las cargas y radianes para los giros.
Inicio
Funcionamiento
del programa
Pasa la estructura que desees resolver del dir. PORTICOS.EJP (una de
ellas es TRIMO cuya lista de datos se presenta en la siguiente ilustración)
o crea una nueva y almacénala en |DATOS|, seguidamente pulsa |PORTICOS|.
El programa calculará la estructura si tienes memoria suficiente,
todo depende del nº de nudos del pórtico. Siempre que lo desees,
por ejemplo si ves que el croquis no se corresponde con la estructura (habrás
definido mal las coordenadas) puedes interrumpir el programa presionando
[ON]. Al finalizar se emite un pitido y se muestra un cuadro de selección
para optar entre ver los resultados (si tienes el String Writer se utiliza
este editor sino el de la hp48) o estudiar alguna barra más a fondo,
para esto último has de tener el programa MIRON en el directorio
PORTICOS o en el path. Encontrarás los resultados en la variable
|res|.
Inicio
Ejemplo
gráfico y tipos de cargas
Inicio
Datos del
programa
La lista |DATOS| tiene el siguiente formato:
{
"Nombre de la estructura" (Es opcional)
{ Lista con los datos generales }
{ Matriz de coordenadas }
{ Listas con los tipos de barras }
{ Matriz con la definición de las barras }
{ Matrices de carga en nudos }
{ Matrices de carga en barras }
{ Matriz con la definición de los apoyos }
}
-
El nombre
irá en una cadena (string), el programa lo copia al principio de
|res|, de forma que puedas reconocer fácilmente a que estructura
corresponden esos resultados. Es opcional, si el primer elemento de DATOS
no es una cadena, el programa pone "" al principio de |res| y de DATOS.
-
Los datos
generales irán en una lista con 4 componentes:
-
El primero es el número de nudos del pórtico.
-
El segundo, el nº de barras.
-
El tercero será el nº de hipótesis de carga, esto es,
si deseamos calcular una estructura bajo las hipótesis de peso propio,
nieve, y viento, tenemos dos alternativas: hacer tres listas de datos,
cada una de ellas diferentes sólo en las cargas, o hacer una sola
lista de datos incluyendo una lista con tres matrices de cargas en nudos
y otra con tres matrices de carga en barras. Si en alguna de las hipótesis
no hay cargas en nudos o en barras, la matriz correspondiente se sustituirá
por el número 0, si en los datos generales hemos puesto un 3 en
las hip., y en la lista de carga en nudos sólo hemos puesto una
matriz, se producirá un error.
-
El cuarto dato será el módulo de Young (E).
-
Para las coordenadas
daremos una lista con una matriz de dos columnas (la primera con las abscisas
(x) y la segunda con ordenadas (y)) y tantas filas como nudos tenga la
estructura. El programa admite coordenadas negativas.
-
Los tipos
de barras son las distintas inercias y áreas que
consideramos en la estructura, habremos de hacer una lista para cada barra
que tenga esos datos distintos a otra cualquiera, y englobar a todas ellas
en una lista. Dado que el módulo E siempre está asociado
al área A y a la inercia I de la forma: E*A o E*I, pueden multiplicarse
A e I por una potencia de 10, dividiendo E por la misma, de esta forma
nos facilitamos la entrada de datos. Para estructuras que tengan algunas
barras con E1 y otras con E2, se da para toda la estructura el módulo
E1 y se multiplican las I, A del segundo material por la relación
E2/E1.
-
La lista de definición
de las barras contiene una matriz con tres columnas,
la primera para el nudo 'i' de la barra, la 2ª para el 'j' y la tercera
con el tipo de barra. El nudo 'i' es siempre el menor de los dos que delimitan
a la barra, hay que ser cuidadoso con esto o produciremos un error. En
la figura TRIMO podemos ver que la matriz tiene tantas filas como barras.
El tipo de barra es un nº que nos dice en qué posición
de la lista de tipos se encuentra la I y el A de la barra. En el caso de
que haya una sola fila, esta debe ser de la forma:
[ [ i j k ] ] y no de la forma: [ i j k ]
Procura que la numeración de los nudos sea tal que la mayor diferencia
j-i de todas las barras sea lo menor posible, esto es muy importante sobre
todo si empleas los programas del dir. 48G, ya que el tiempo de resolución
y la memoria necesaria son muy sensibles a esta dif.
-
La lista de cargas
en nudos contendrá tantas matrices (o ceros) como
hipótesis de carga haya. Estas matrices son de cuatro columnas siendo
la primera para en nº de nudo en que se aplica la carga, la segunda
para la carga en la dir. 'x' la tercera en la dir. 'y' y la cuarta en la
'z' (los momentos). En el caso de que haya una sola fila, esta debe ser
de la forma:
[ [ i x y z ] ] y no de la forma: [ i x y z ]
-
Igualmente la lista de cargas
en barras contiene tantos ceros o matrices como hipótesis
de carga, las matrices tienen siete columnas:
-
Nudo 'i'.
-
Nudo 'j'.
-
La carga. En el caso de las cargas tipo '2' (ver figura anterior) habrá
de dar la carga por unidad de longitud, en los demás casos sólo
el valor de la carga (para las de tipo '3', hay que dar el valor máximo
de la carga). Todas las cargas se darán con signo positivo, excepto
las de tipo '4' (momentos) cuyo valor positivo es el sentido del reloj.
-
Distancia 'A' (ver dibujo anterior) siempre contada desde el nudo 'i'.
Fijaros que en la barra 1-2 la distancia 'A' es 6 (que es la distancia
desde el apoyo '1' hasta el punto de aplicación) mientras que en
la 3-4 la distancia 'A' es 1, distancia desde el inicio de la barra al
punto de aplicación, esto es, desde el nudo '3' no desde el apoyo
'4'.
-
Distancia 'B' o longitud de la carga.
-
Angulo en grados sexagesimales medido en el sentido contrario al de las
agujas del reloj y tomando por origen el eje de las 'x' en los ejes generales
de la estructura, no los particulares de la barra (en los que el eje 'x'
coincide con el eje mayor de la barra en cuestión).
-
Tipo de carga, siendo '1' para la puntual, '2' para la uniformemente repartida,
'3' la triangular con pendiente positiva, '-3' la triangular con pendiente
negativa y '4' los momentos puntuales. Todos los tipos están en
la figura anterior. En aquellas cargas que no necesiten alguno de los datos
(los momentos no necesitan la distancia 'B' ni el ángulo), dichos
datos se sustituyen por '0'. En el caso de que haya una sola fila, esta
debe ser de la forma:
[ [ i j k l ...] ] y no de la forma: [ i j k l ...]
-
Finalmente la última lista de |DATOS| contendrá la definición
de los apoyos,
siendo esta una matriz de cuatro columnas y tantas filas como apoyos:
-
Nº de nudo que se considera apoyo.
-
Coacción en el eje 'x' general ('cx')
-
Coacción en el eje 'cy'.
-
Coacción en el eje 'cz'.
Las coacciones pueden tener los valores:
-
'0': el movimiento está totalmente coartado en esa dirección.
-
'1': libertad total de movimiento en la dir. considerada.
-
'k': para los apoyos elásticos, siendo 'k' un nº que nos indica
el coeficiente de muelle del apoyo.
Cuando queramos imponer un movimiento determinado a un apoyo, por ejemplo
un descenso en 5 cm del apoyo por asentamiento del terreno, habremos de
poner un '0' en la coacción considerada del apoyo ('cy' en este
caso) y una carga en el nudo-apoyo del que se trata cuyo valor será
el movimiento multiplicado por 1*E30 en la dirección debida, en
este caso -5*E30 en la dirección 'y' (si estamos considerando las
distancias en cm ó -0,05*E30 si las consideramos en m). Para imponer
un giro hacemos lo mismo pero dando el giro en radianes.
Inicio
Resultados
del programa
Los resultados se presentan en |res|, que es una lista con el siguiente
formato (para cada hipótesis de carga):
-
Una matriz con las reacciones
en los apoyos, tiene 4 columnas:
-
Otra matriz con los esfuerzos
en los extremos de las barras (reacciones del nudo sobre
la barra). Tiene 4 columnas y para cada barra nos da tres filas:
-
Nudo 'i', nudo 'j', axil 'i', axil 'j'
-
Nudo 'i', nudo 'j', cortante 'i', cortante 'j'
-
Nudo 'i', nudo 'j', momento 'i', momento 'j'
-
(nudo 'i'= nudo con menor numeración de la barra, 'j'= con mayor
numeración)
Si deseas conocer los esfuerzos en otros puntos de la barra utiliza el programa
MIRON que te permite dibujar los diagramas de esfuerzos
y movimientos, obtener el valor de ellos en cualquier punto y ver sus ecuaciones.
También puedes definirlos como nudos (haciendo varias barras de
una). Supongamos que deseas conocer los esfuerzos y la flecha en el centro
de la viga 2-3 del ejemplo TRIMO, debes modificar la lista DATOS de forma
que tendrías ahora 5 nudos y 4 barras: el pilar 1-2, la viga 2-3
(3 estaría en el centro de la antigua viga 2-3), la viga 3-4 y el
pilar 4-5. Naturalmente debes modificar toda la lista de datos colocando
los datos generales, coordenadas, definición de las barras, cargas
y apoyos debidos. Obtendrás en el punto 3 los axiles, cortantes
y momentos buscados y la flecha en la matriz de movimiento de los nudos
(la siguiente en la variable |res|).
-
Los movimientos
de los nudos vienen en la última matriz de cada hipótesis
de carga y nos da el desplazamiento de los nudos en las direcciones X,
Y, Z (el giro en radianes en la dir. Z). Tiene 4 columnas:
-
nudo, dir X, dir. Y, giro Z
La lista |res| viene lo suficientemente explicada con la serie de strings
(cadenas) que incluye. Para acceder a ella elige "ver resultados" al finalizar
el programa. En todo momento posterior puedes recuperarla en la pila y
optar por:
-
Editarla normalmente con [EDIT] o [VISIT].
-
Deshacerla en la pila con |->OBJ|, tomar la matriz que desees ver y editarla
con el editor de matrices (dando al cursor 'hacia abajo' con la matriz
en el nivel 1 de la pila).
-
Usar un editor de textos del estilo del String Writer (la opción
más rápida y eficaz).
-
Pasar la variable |res| al ordenador en formato ASCII y editarla en este,
solución también bastante buena, sólo hay que tener
un PC o similar.
Inicio
¿Porqué
las versiones 48gx y 48g?
Los programas de 48GX tardan dos o tres veces menos que los de 48G pero
también consumen hasta cinco veces más memoria. Os puedo
dar la memoria mínima necesaria para ejecutarse y el tiempo que
tardan las estructuras del dir. PORTICOS.EJP:
Estructura |
Nudos |
Barras |
Kb
requeridos |
Kb
requeridos |
min:sg |
min:sg |
|
|
|
(48gx) |
(48g) |
(48gx) |
(48g)
|
TRIMO |
4 |
3 |
8 |
5 |
0:33 |
1:15
|
P2AG |
5 |
4 |
9 |
6 |
0:39 |
1:25 |
TRIBUNA |
9 |
9 |
20 |
9 |
1:14 |
3:03 |
METALICO |
13 |
16 |
35 |
12, 15 (*) |
2:30, 4:17 (*) |
8:39, 9:07 (*) |
HORMIGON |
22 |
33 |
90 |
25 |
5:57 |
18:45 |
BESTIAL |
34 |
55 |
205 |
40 |
15:00 |
33:31 |
(*)Para 1 o 2 hipótesis
(Los tiempos están tomados con la memoria especificada,
con más memoria libre el programa tardará menos)
Los programas de 48GX utilizan la división de matrices para resolver
los sistemas de ecuaciones (ver Guía de Usuario de la calculadora
pág. 14-17). Por ello, con matrices mal condicionadas (mirar la
pág 14-17) pueden darse soluciones erróneas. Es el caso de
la 2ª TMLótesis de carga del ejemplo METALICO en el dir. PORTICOS.EJP;
la matriz de rigidez de esta estructura tiene un nº de condición
(ver pág 14-18 del manual) del orden de 1*E150 y se consideran mal
condicionadas las matrices cuyo nº de condición sea superior
a 1*E12. De todas formas estos resultados erróneos son escasos,
clarísimos y perfectamente identificables por su incongruencia:
la 2ª hipótesis del ejemplo METALICO, es un descenso de 5 cm
en un apoyo, y la solución nos da movimientos de nudos y esfuerzos
del orden de 1*E15. Para obtener la solución correcta, utiliza el
programa PORTICOS del dir. 48G.
Los programas de 48G usan el método de Gauss para la resolución,
esto conlleva sus pros y sus contras:
-
Se necesita menos memoria para resolver la misma estructura, ya que no
es necesario almacenar toda la matriz de rigidez, sino solamente la parte
superior de la banda (estas matrices son simétricas en banda), ya
que la parte inferior a la diagonal principal es simétrica (por
tanto idéntica a la superior) y todo lo demás son ceros.
-
Se evitan los problemas con las matrices mal condicionadas.
-
Se aumenta algo el código del programa y por tanto su tamaño.
-
Se hace bastante más lento ya que hay que triangular la matriz (multiplicar
cada fila por un factor y sumársela a las demás hasta conseguir
una matriz triangular superior) para a continuación hacer la sustitución
hacia atrás (ir sustituyendo y despejando todas las incógnitas),
cosa bastante larga.
Si la estructura a resolver tiene planos de simetría,
puedes aprovecharlos para introducir una estructura menor. Si las cargas
no son simétricas, puedes descomponerlas en sus componentes simétricas
y antimétricas. Las estructuras debes introducirlas de forma que
las barras situadas en el plano de simetría tengan sus características
(inercia y área) divididas por dos, igualmente las cargas que actúen
en puntos del plano de simetría deben dividirse por dos. Los nudos
situados en el plano de simetría se definirán como apoyos,
coartando sus desplazamientos en función de la simetría o
antisimetría de cargas. Naturalmente para averiguar los esfuerzos
resultantes en las barras contenidas en el plano de simetría, hemos
de multiplicar el resultado que parece en |res| por dos. Igualmente hemos
de doblar las reacciones (ya que no estamos teniendo en cuenta la acción
de la parte simétrica) y eliminar las que estén contenidas
en el plano de simetría, que han de ser cero. Para saber algo más
de este tema, puedes observar los dos ejemplos del archivo ESPACIAL.DOC,
son por un lado CUPULA y por otro SIMETRIA que es la misma cúpula
en la que se ha aprovechado el plano de simetría, otro ejemplo es
FORJADO en EMPARRI.DOC. También puedes acudir al capítulo
7 (pág. 95) y al capítulo 9 (pags. 162 y 180) del siguiente
libro.
Inicio
Agradecimientos
A Francisco Morán Cabré por su libro: "Análisis
matricial de estructuras en ordenadores personales compatibles", de la
Editorial Rueda.
Inicio
Tabla de
errores
(Se considera que en la lista |DATOS| hemos incluido el nombre de la
estructura, está compuesta entonces por ocho listas)
Cuando se produce un error el programa termina, emite un doble pitido
y muestra un mensaje en la pantalla diciendo:
ERROR EN:
Tipo de error
En los menús aparece el clásico |OK|, si lo pulsamos saldremos
a la pila normal.
El texto 'Tipo de error' puede ser uno de los siguientes:
-
APOYOS
-
El último componente de la lista |DATOS| no es una lista cuyo único
elemento sea una matriz de 4 columnas.
-
En la 1ª columna de esta matriz hay algún número que
no se corresponde con el de un nudo de la estructura.
-
AREAS
-
El cuarto componente de |DATOS| no es una lista con números reales.
-
Esta lista no contiene una serie de listas con dos nº reales cada
una.
-
BARRA i,j
-
En la matriz de definición de barras (quinto componente de |DATOS|)
hay un error en la fila cuyas dos primeras columnas son 'i' y 'j', probablemente:
-
El componente de la tercera columna (el tipo de barra) es mayor que 'n',
siendo 'n' el nº de listas que hay en la tercera lista de |DATOS|,
o es un cero, o es un nº negativo, ...
-
El nº 'i' o el 'j' es mayor que el nº de nudos de los datos generales
(el primer nº del 2º componente de |DATOS|).
-
i > j.
-
CA. EN BARRA i,j
-
En la primera o segunda columna de alguna de las matrices de carga en barras
no hay un nº que se corresponda con el de un nudo de la estructura.
-
En la séptima columna de alguna de las matrices de carga en barras
hay un nº distinto de 1, 2, 3, -3, 4.
-
CARGA EN BARRAS
-
El séptimo elemento de |DATOS| no es una lista.
-
Una de las matrices de carga en barras (en la séptima lista de |DATOS|)
no tiene 7 columnas.
-
La matriz no tiene un corchete que englobe a todas las filas (en el caso
de que haya una sola fila, esta debe ser de la forma: [ [ i j k l ...]
] y no de la forma: [ i j k l ...] )
-
CARGA EN NUDOS
-
El sexto elemento de |DATOS| no es una lista.
-
Una de las matrices de carga en nudos (en la sexta lista de |DATOS|) no
tiene 4 columnas.
-
En la primera columna de alguna de estas matrices no hay un nº que
se corresponda con el de un nudo de la estructura.
-
La matriz no tiene un corchete que englobe a todas las filas (en el caso
de que haya una sola fila, esta debe ser de la forma: [ [ i x y z ] ] y
no de la forma: [ i x y z ] )
-
COORDENADAS
-
El tercer componente de |DATOS| no es una lista con una sola matriz.
-
El nº de filas de la matriz no coincide con el nº de nudos de
los datos generales (el primer nº de la 1ª lista de |DATOS|).
-
La matriz no tiene 2 columnas.
-
DATOS GENERALES
-
El segundo elemento de |DATOS| no es una lista con cuatro números.
-
Los tres primeros números no son enteros o el 4º no es un real.
-
DEF. BARRAS
-
El quinto elemento de |DATOS| no es una lista con una sola matriz.
-
El nº de filas de la matriz no coincide con el nº de barras de
los datos generales (el segundo nº de la 1ª lista de |DATOS|).
-
La matriz no tiene 3 columnas.
-
La matriz no tiene un corchete que englobe a todas las filas (en el caso
de que haya una sola fila, esta debe ser de la forma: [ [ i j k ] ] y no
de la forma: [ i j k ] )
-
FALTA MEMORIA
-
La estructura tiene demasiados nudos para la memoria de que dispones, si
te sobra el dinero por 60.000 ptas. te venden 1 Mby de memoria. También
puedes recurrir a la simetría.
-
HIPOTESIS
-
La sexta lista de |DATOS| (carga en nudos) no tiene tantos elementos como
hipótesis de carga hemos definido en la 1ª lista de |DATOS|
(tercer nº de esa lista).
-
La séptima lista de |DATOS| (carga en barras) no tiene tantos elementos
como hipótesis de carga hemos definido en la 1ª lista de |DATOS|
(tercer nº de esa lista).
-
¿LISTA 'DATOS'?
-
En el directorio actual no se encuentra la variable |DATOS|.
-
El contenido de la variable |DATOS| no es una lista, o es una lista vacía.
-
NºERROR #Nh
-
'#Nh' es uno de los números de error 'N' (en hexadecimal) que aparecen
en el apéndice B del manual de la calculadora. Probablemente hayas
estado trasteando en el código del programa. Vuelve a grabar el
programa desde el PC e inténtalo de nuevo. En caso de que siga ocurriendo,
te agradecería que me enviaras la lista de datos de tu estructura
y el nº de error junto a la versión de tu máquina, para
obtenerla sólo tienes que teclear: VERSION y dar [ENTER], en el
nivel 2 aparece: "Version HP-48-P" ('P' en la mía) y en el nivel
1: "Copyright HP 1993" (en la mía). También me sería
de utilidad saber a que altura del programa se produce, qué es lo
que hay en pantalla en el momento del error. Te contestaré con la
solución, si es que la consigo. Hasta ahora he comprobado que estos
programas corren sin problemas con las versiones M, P, R (Si tienes una
versión diferente a estas, también te agradecería
que me contaras cómo funcionan los programas).
-
PARADA USUARIO" :
-
SIS. INCOMPATIBLE
-
Revisa el diseño de la estructura, probablemente sea un mecanismo
o puede que esté en equilibrio interno pero que fallen las condiciones
de apoyo y tengas que ir a buscarla a Madagascar porque se escapa.
-
Si estás intentando resolver una sola viga, estás matando
moscas a cañonazos, compra un bote de Raid o defínela bien.
-
Mira si hay problemas con barras de área o inercia cero.
-
SIS. INDETERMINA.
Inicio
En los ejemplos que incluyo en el directorio PORTICOS.EJP,
hay casos de todas las incidencias:
-
Movimientos impuestos a apoyos y apoyos elásticos en P2AG (pórtico
a dos aguas)
-
Cargas triangulares y momentos en TRIMO.
-
Barras biarticuladas en TRIBUNA (le ponemos una inercia de '0') es posible
introducir barras con inercia cero porque en sus extremos hay otras barras
de inercia no nula que le dan rigidez al giro.
-
Varias hipótesis de carga en METALICO.
-
Ménsulas en HORMIGON : se eliminan las ménsulas y se sustituyen
por las acciones que ejercen sobre el nudo de empotramiento. También
podían haberse introducido numerándolas como otra viga cualquiera
y considerando el extremo en voladizo como un apoyo con libertad total
de desplazamiento (todas las coacciones serían 1) pero así
aumentamos la memoria necesaria y el tiempo de resolución.
-
El ejemplo BESTIAL es el mismo que HORMIGON pero con más alturas.
A continuación podeis ver los croquis de las estructuras:
BESTIAL es el mismo que HORMIGON pero con dos alturas más.
Inicio