PROGRAMA CELOSIAS
Mario de Lama mdelama@teleline.es
http://teleline.terra.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. Si se os cae la casa no me echéis
las culpas.
Inicio
Datos
del programa
Nombre: CELOSIAS
Tamaño: 7338 by, cheksum # 5242h (CELO49.GX); 8145 by, cheksum # 45FEh (CELO49.G)
Autor: Mario de Lama
http://teleline.terra.es/personal/mdelama
Utilidad: Cálculo de estructuras articuladas planas (celosías)
Fecha: 20-11-1999
Inicio
Variables
del directorio CELOSIAS
Para empezar, pasa el archivo CELO49.GX o CELO49.G
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.
-
|CELOSIAS|
es el programa en sí. Tras almacenar la lista de datos sólo
tienes que presionar |CELOSIAS| 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.
Inicio
Funcionamiento
del programa
Pasa la estructura que desees resolver del dir. CELOSIAS.EJP (una de
ellas es PICOSIERRA cuya lista de datos se presenta en la siguiente ilustración)
o crea una nueva y almacénala en |DATOS|, seguidamente pulsa |CELOSIAS|.
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 el programa termina, los resultados se encontrarán en la variable |res|.
Inicio
Ejemplo
gráfico
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 }
{ 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 de la celosía.
-
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.
Si en los datos generales hemos puesto un 3 en las hip., y en la lista de cargas
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 áreas de las barras que consideramos en la estructura, habremos de hacer una lista con todas las áreas diferentes que haya en la estructura. Dado que el módulo E siempre está asociado al área A de la forma: E×A, puede multiplicarse A 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 A del segundo material por la relación E2/E1.
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 CELO49.G, 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 tres columnas siendo
la primera para en nº de nudo en que se aplica la carga, la segunda
para la carga en la dir. 'x' y la tercera en la dir. 'y'. 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 ]
Verás que en la lista 'DATOS' del ejemplo TRIMO de PORTICOS.DOC hay cuatro columnas, piensa que aquí no hay que considerar los momentos como en PORTICOS ya que, por definición, los nudos de las celosías son rótulas y por tanto no pueden soportar momentos.
-
Cargas
en barras. Se supone que en las celosías las cargas están aplicadas en los nudos y por tanto no hay que poner el siguiente grupo de datos que aparece en el programa PORTICOS: las cargas en barras.
-
Finalmente la última lista de |DATOS| contendrá la definición
de los apoyos,
siendo esta una matriz de tres 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'.
Las coacciones pueden tener los valores:
-
'0': el movimiento está totalmente coartado en esa dirección.
-
'1': libertad total de movimiento en la dirección 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).
En los ejemplos que incluyo hay casos con alguna incidencia, para ver movimientos impuestos en los apoyos mira PORTICOS.DOC, apoyos elásticos en PASARELA y varias hipótesis de carga en CER4HIP (cercha 4 hipótesis).
Inicio
Resultados
del programa
Los resultados se presentan en la variable |res|, que es una lista con el siguiente
formato (para cada hipótesis de carga):
-
Una matriz con las reacciones
en los apoyos, tiene 3 columnas:
-
Otra matriz con los esfuerzos
en los extremos de las barras (reacciones del nudo sobre
la barra). Tiene tres columnas y para cada barra nos da una fila:
(nudo 'i'= nudo con menor numeración de la barra, 'j'= con mayor
numeración)
-
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 e
Y. Tiene tres columnas:
La lista |res| viene lo suficientemente explicada con la serie de strings
(cadenas de caracteres) que incluye. Para acceder a ella recupérala en la pila y
opta por:
-
Editarla normalmente con [EDIT] o presionando el cursor 'hacia abajo'.
-
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 (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 CELO49.GX y CELO49.G?
El programa CELO49.GX tarda dos o tres veces menos que CELO49.G pero
también consume hasta cinco veces más memoria.
El programa CELO49.GX utiliza la división de matrices para resolver
los sistemas de ecuaciones. Por ello, con matrices mal condicionadas pueden darse soluciones erróneas. Es el caso de la 2ª hipótesis de carga del ejemplo METALICO en el dir. PORTICOS.EJP;
la matriz de rigidez de esta estructura tiene un nº de condición
del orden de 1*E150 (lo puedes hallar poniendo la matriz de rigidez en la pila y ejecutando COND) 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 (la estructura se rompería). Para obtener la solución correcta en este caso, utiliza el
programa PORTIC49.G.
El programa CELO49.G usa 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 áreas 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 3 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.
-
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.
-
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 3 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 ] ] y
no de la forma: [ i x y ] )
-
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, siempre
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).
-
¿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 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. 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, y tras varios años de uso en numerosas situaciones, sólo me han comunicado un error que se solucionó fácilmente.
-
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
Los croquis de los ejemplos de CELOSIAS.EJP, son:
En los dos últimos ejemplos no he puesto las cargas que soportan, de todas formas no es muy difícil imaginar una flecha en cada nudo, (o dos, ya que si la carga no sigue la dirección de uno de los ejes coordenados habrá que introducirla en sus dos componentes).
Inicio