• No se han encontrado resultados

7. Programas

7.7 Descripción de los desarrollos hechos en el CFYFP

7.7.3 Otra rutinas nuevas incluidas en el CFYFP

Como se ha visto, hay una serie de rutinas nuevas que se utilizan a lo largo del proceso, seguidamente se procederá a explarlas.

Almacen.f

Como ya se ha comentado anteriormente, almacen.f es una subrutina encargada de realizar el almacenamiento de las matrices en formato Sparse. Dada una matriz cuadrada simétrica y su dimensión devuelve una variable Sparza que contiene toda la información pero ocupando menos tamaño. El código completo se encuentra en el Anejo I pero a continuación se mostrarán las instrucciones principales.

Ante la imposibilidad de crear vectores o matrices sin una dimensión asignada, nos vemos obligados a realizar un primer pase sobre la matriz para conocer la

106

dimensión de las variables a utilizar y poder alocarlas (Figura 7.7.3.1). A pesar de tratarse de matrices simétricas, tanto la de rigidez como la de masa, debido a la configuración de las rutinas de cálculo nos vemos obligados a almacenar la matriz completa.

Fig. 7.7.3.1 Primer bucle sobre la matriz que se quiere almacenar y alocamiento de las variables

Seguidamente se recorre la matriz por segunda vez y se asignan valores a las variables creadas. Éstas son para: los valores no nulos de la matriz, columna en la que se encuentra el valor no nulo, posición en el vector de valores no nulos donde empieza una nueva fila de la matriz, dimensión de la matriz inicial y número total de valores no nulos (Figura 7.7.3.2). De la misma forma que la mostrada en la sección 7.3.2 que se comentó este tipo de almacenamiento.

Fig. 7.7.3.2 Segundo recorrido sobre la matriz y asignación de valores a las variables. Por último hay que asignar valor a la última posición del vector i.

Por último y antes de terminar se asigna un valor a la última posición del vector i (A%i(n+1)) (Figura 7.7.3.2) debido a la estructura del programa, más adelante puede verse una explicación detallada de las razones de esta asignación. Al finalizar la rutina, la variable presentará una estructura similar a la siguiente:

107 Fig. 7.7.3.3 Ejemplo variable almacenada en formato sparse, en este caso la variable se llama Spark

VectProp.f

La función de esta subrutina es obtener el vector propio completo, ya que el obtenido con el método de iteración en el subespacio al haberse calculado a partir de la matriz reducida y no incluye los grados de libertad restringidos. El código completo de la rutina se encuentra en el Anejo I. El código es muy sencillo, se definen las variables y a continuación se lee el vector de restricciones, si el grado de libertad está restringido se inserta un 0 en esa posición del vector propio completo, en caso de tratarse de un nodo libre se le da el valor calculado anteriormente (figura 7.7.3.4). Como se ha visto en la explicación del código de CFYFP.f, se distinguen entre los nodos restringidos (apoyos) y los nodos de carga y VREST llega a este punto con los nodos de carga como nodos libres. Aunque realmente no se definan como libres ya que tiene una carga o un desplazamiento impuesto, en el problema de frecuencias serán libres ya que podrán moverse en cualquier dirección según la forma de vibración.

Fig. 7.7.3.4 Formación del vector propio completo a partir del calculado previamente con las rutinas explicadas.

Escribir.f

La subrutina Escribir.f recoge los datos que resultan de la rutina Eigen_SIM (los vectores propios y las frecuencias, que se han calculado a partir de los valores propios computados) y los escribe en los ficheros de salida, dos archivos diferentes: uno que muestra la evolución de las frecuencias y del daño, y otro, con los vectores propios en

108

un formato que permita su utilización en el GID (.post.res), programa con el que se realizará el postprocesado de los resultados.

Frecuencias-daño

Este archivo es el más sencillo de los dos, en ella se presentan los resultados en forma de tabla, un ejemplo del formato de uno de estos archivos de salida puede consultarse en el Anejo II: Archivos de salida y entrada. Como el nombre del archivo indica se representa el daño que presenta la estructura en el paso y el valor de las frecuencias calculadas en Hercios. Cada fila representa un estado de daño diferente, que empieza con la estructura “nueva” (daño 0) y va aumentando hacia la parte inferior de la tabla hasta alcanzar el mayor nivel de daño calculado con el PLCD.

Para hacerlo primero se crea el encabezado de la tabla que solamente se escribirá la primera vez que se llame a la rutina, es decir en el caso elástico o básico, en el que la estructura todavía no ha sufrido daño alguno. A continuación se crea un bucle sobre el número de valores calculados y se escriben el daño seguido de los resultados de las frecuencias obtenidas.(Figura 7.7.3.6)

Una vez finalizada la creación, los datos pueden ser exportados a otro programa para su tratamiento y estudio.

Vectores propios

Para poder postprocesar fácilmente los resultados obtenidos en el GID el fichero de salida tiene que tener una determinada estructura con unos parámetros fijos y otros que si se pueden variar. La idea antes de crear este archivo era que todos los vectores propios que perteneciera a un misma frecuencia (primer caso (no dañado), segundo caso (empieza el daño), tercer caso (el daño va aumentando),..) se agruparan juntos bajo una misma etiqueta para observar mejor si variaban. Se ha decidido obviar que las primeras frecuencias no son constantes, ya que a medida que se va sufriendo daño la estructura van cambiando ligeramente. Esto se ha hecho ya que el modo de vibración se espera que sea similar en todos los casos.

Antes de escribir los resultados, se hace una normalización de los datos de las formas propias. La normalización se hará de tal manera que el valor máximo del vector sea uno (figura 7.7.3.5).

109 Fig. 7.7.3.5 Normalización de las formas propias antes de su escritura.

La parte de la rutina encargada de escribir esto ficheros presenta una estructura muy similar a el caso anterior, primero hay que introducir un encabezamiento fijo para el archivo (solamente se hace una vez en todo el proceso) y luego para cada modo de vibración se realiza otro encabezamiento (se repite tantas veces como modos de vibración totales calculados, número de frecuencias buscadas por el número de pasos dañados más el caso original). Los datos del vector propio los tenemos en la variable

SVECC (el vector de cada frecuencia ocupa una de las columnas de la matriz), tenemos

que escribir en cada fila un nodo y los desplazamientos que ha sufrido en cada grado de libertad (DX, DY y DZ), para ello se utilizan las instrucciones mostradas en la figura 7.7.3.6, que hacen que se vaya escribiendo los datos del vector de tres en tres y formando filas.

110

Animacion.f

A diferencia de las otras subrutinas, ésta es totalmente opcional y su llamado viene condicionado por uno de los parámetros de entrada, la razón de esta rutina es poder crear los datos necesarios para poder visualizar los n primeros modos de vibración en forma de animación. De la misma forma que las demás rutinas comentadas hasta ahora, el código completo se puede consultar en el Anejo I.

Esta rutina recibe cuatro valores de entrada (SUBROUTINE ANIMACION (VEC, F,

NTOTV, CPROB)) que representan, de izquierda a derecha: el vector propio

correspondiente a la forma que se quiere animar, el número de frecuencia de dicho vector, la dimensión del vector y, por último, el nombre del problema. De todos ellos, es el segundo el que marcará si se realiza el llamado o no, si su valor es nulo la rutina no entrará a calcular la animación.

Sin embargo, la información fundamental es la proporcionada por el vector propio, éste contiene los movimientos en cada dirección que sufre cada nodo del problema, hay que recordar que estos movimientos no son movimientos propiamente dichos, sino que representan una forma, es decir un vector y otro multiplicado por un escalar son la misma forma. Otro concepto importante es que este vector representa las posiciones finales de los nodos, no tenemos pasos intermedios y éstos son precisamente los que vamos a crear. El primer paso es normalizar el vector, para ello buscamos el máximo valor y dividimos todo el vector por éste. En este punto tenemos la forma normalizada en un extremo, para encontrar el otro multiplicamos por menos uno. A continuación se han de crear los incrementos que nos llevarán desde uno hasta otro, en este caso se ha decidido que se realicen 20 pasos entre los dos extremos o, lo que es lo mismo, 10 pasos entre la posición de reposo y cada uno de los finales, pero la adopción del número de incrementos es totalmente arbitrario y dependerá de la fluidez que se pretenda dar al movimiento.

Seguidamente se crea el archivo de salida (Animacion-Nombre del problema.

post . res) y su encabezado, que será exactamente igual que el descrito para la rutina Escribir.f ya que se realizará el postprocesado con el mismo software. Para escribir los

resultados se crea un bucle del número de pasos fijados (20 en nuestro caso) y se partirá desde el extremo que se ha multiplicado por menos uno, una vez escrito, se sumará el

111 incremento del paso y se volverá escribir, al finalizar el bucle nos encontraremos en la otra posición extrema, pero con pasos intermedios.

Para conseguir un movimiento completo, de mínimo a máximo y de máximo a mínimo, se realiza seguidamente otro bucle, con el mismo número de pasos que partiendo de la posición máxima, irá restando el incremento de paso hasta llegar a la mínima, por supuesto se irá escribiendo cada paso intermedio. De tal forma que al abrir este fichero se pueda reproducir los pasos creados en bucle sin fin creando la sensación de que vemos una película de la forma de vibración deseada.

Documento similar