Un entorno de desarrollo para la dinámica no lineal de mecanismos

Anuncio
Universidad Politécnica de Madrid
Escuela Técnica Superior de Ingenieros de Caminos,
Canales y Puertos
Un entorno de desarrollo para
la dinámica no lineal de
mecanismos flexibles
Trabajo de investigación
Daniel Iglesias Ibáñez
Ingeniero Industrial
Madrid, Septiembre 2005
Índice general
1. Introducción
1.1. Desarrollo histórico . . . . . . . . . . . .
1.2. Motivación . . . . . . . . . . . . . . . . .
1.3. Alcance . . . . . . . . . . . . . . . . . .
1.4. Estado de la técnica . . . . . . . . . . .
1.4.1. Formulaciones de piezas flexibles
1.5. Objetivos de la investigación . . . . . . .
1.6. Hipótesis de la investigación . . . . . . .
.
.
.
.
.
.
.
1
1
3
4
5
6
7
8
2. Formulación dinámica no lineal de mecanismos flexibles
2.1. Formulación continua de sólidos flexibles . . . . . . . . . . . .
2.1.1. Medidas de deformación . . . . . . . . . . . . . . . . .
2.1.2. Medidas de tensiones . . . . . . . . . . . . . . . . . . .
2.1.3. Ecuaciones de balance mecánico: Formulación fuerte . .
2.1.4. Ecuaciones constitutivas de materiales sólidos elásticos
2.1.5. Principios variacionales: Formulación débil . . . . . . .
2.2. Formulación discreta de la dinámica de sólidos flexibles . . . .
2.2.1. Discretización por elementos finitos . . . . . . . . . . .
2.2.2. Sı́ntesis modal de componentes . . . . . . . . . . . . .
2.3. Formulación de la dinámica de sólidos rı́gidos . . . . . . . . .
2.3.1. Parametrizaciones de sistemas de sólidos rı́gidos . . . .
2.4. Formulación de restricciones . . . . . . . . . . . . . . . . . . .
2.4.1. Método de los multiplicadores de Lagrange . . . . . . .
2.4.2. Método de la penalización . . . . . . . . . . . . . . . .
2.4.3. Método del lagrangiano aumentado . . . . . . . . . . .
2.5. Formulación de sistemas de sólidos rı́gidos y flexibles . . . . .
2.6. Contactos e impactos . . . . . . . . . . . . . . . . . . . . . . .
9
9
9
10
11
17
19
20
20
21
27
28
33
34
35
35
36
37
3. Resolución numérica de las ecuaciones de la
3.1. Integradores temporales . . . . . . . . . . .
3.1.1. Conceptos previos . . . . . . . . . . .
3.1.2. Clasificación de integradores . . . . .
3.1.3. Integradores multipaso lineales . . . .
3.1.4. Métodos Runge-kutta . . . . . . . . .
3.1.5. Esquemas predictor-corrector . . . .
39
44
44
46
48
50
52
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
dinámica
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3.1.6. Familia β-Newmark . . . . . . . . . . . . . . . .
3.1.7. Método de Hilber-Hughes-Taylor (HHT) . . . .
3.1.8. Método de Energı́a-Momento . . . . . . . . . .
3.2. Métodos de solución de sistemas algebraicos no lineales
3.2.1. Método de Newton . . . . . . . . . . . . . . . .
3.2.2. Método de Newton modificado . . . . . . . . . .
3.2.3. Métodos cuasi-Newton . . . . . . . . . . . . . .
3.3. Métodos de solución de sistemas algebraicos lineales . .
3.3.1. Métodos directos . . . . . . . . . . . . . . . . .
3.3.2. Métodos iterativos . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
54
54
55
55
56
56
58
58
59
4. Entornos de desarrollo. Estado del arte
4.1. Herramientas comerciales de simulación mecánica . . . . .
4.1.1. Códigos multicuerpo . . . . . . . . . . . . . . . . .
4.1.2. Códigos MEF . . . . . . . . . . . . . . . . . . . . .
4.1.3. Entornos matemáticos . . . . . . . . . . . . . . . .
4.2. Herramientas de investigación para la simulación mecánica
4.2.1. Aplicaciones de simulación multicuerpo . . . . . . .
4.2.2. Librerı́as de cálculo . . . . . . . . . . . . . . . . . .
4.3. Lenguajes de programación . . . . . . . . . . . . . . . . .
4.3.1. Lenguajes de programación estructurada . . . . . .
4.3.2. Lenguajes de programación orientada a objetos . .
4.3.3. Lenguajes de programación cientı́fı́ca . . . . . . . .
4.4. Entornos integrados de desarrollo . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
63
63
64
66
67
68
69
69
70
71
71
72
73
.
.
.
.
.
.
.
75
75
76
77
78
78
80
82
.
.
.
.
.
.
.
85
85
87
87
88
91
94
96
5. Especificaciones para un entorno de desarrollo
5.1. Definición del problema: Preproceso . . . . . . .
5.1.1. Lenguaje de definición del problema . . .
5.1.2. Herramientas visuales de mallado . . . .
5.2. Resolución del problema: Solución . . . . . . . .
5.2.1. Caracterı́sticas matemáticas . . . . . . .
5.2.2. Caracterı́sticas informáticas . . . . . . .
5.3. Análisis de resultados: Postproceso . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6. Diseño e implementación del entorno
6.1. Estructura del entorno . . . . . . . . . . . . . . . . . . . . .
6.1.1. Estructura del módulo de solución . . . . . . . . . . .
6.2. Librerı́a matricial . . . . . . . . . . . . . . . . . . . . . . . .
6.2.1. Matrices: clase Matrix . . . . . . . . . . . . . . . . .
6.2.2. Vectores: clase Vector . . . . . . . . . . . . . . . . .
6.2.3. Estructuras de datos: clase Data mat . . . . . . . . .
6.2.4. Sistemas lineales: clase Linear system . . . . . . . .
6.2.5. Selección de tipo de estructura matricial y método de
solución . . . . . . . . . . . . . . . . . . . . . . . . .
6.2.6. Dependencia entre componentes de la librerı́a . . . .
. 97
. 98
6.3. Librerı́a de métodos de solución no lineales . . . . . . . . . . . 99
6.3.1. Selección de método de solución de ecuaciones no lineales100
6.4. Librerı́a de sistemas de ecuaciones diferenciales . . . . . . . . . 100
6.4.1. Tipos de problema . . . . . . . . . . . . . . . . . . . . 101
6.4.2. Sistemas diferenciales . . . . . . . . . . . . . . . . . . . 103
6.4.3. Integradores temporales . . . . . . . . . . . . . . . . . 104
6.4.4. Ejemplo de utilización de la librerı́a . . . . . . . . . . . 107
7. Aplicaciones del entorno
7.1. PACE: Programa Académico de Cálculo de Estructuras . .
7.1.1. Caracterı́sticas del programa . . . . . . . . . . . . .
7.1.2. Estructura del código . . . . . . . . . . . . . . . . .
7.1.3. Estructura del archivo de entrada . . . . . . . . . .
7.2. Aplicación de simulación dinámica de mecanismos flexibles
7.2.1. Objetivos de la aplicación . . . . . . . . . . . . . .
7.2.2. Esquema básico de la aplicación . . . . . . . . . . .
7.2.3. Esquema de clases para el modelo de mecanismo . .
.
.
.
.
.
.
.
.
111
. 111
. 112
. 112
. 114
. 116
. 116
. 117
. 118
8. Conclusiones y futuras lı́neas de trabajo
125
8.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
8.2. Futuras lı́neas de investigación . . . . . . . . . . . . . . . . . . 125
A. Informe de salida de PACE
127
A.1. Datos de partida del problema: . . . . . . . . . . . . . . . . . 127
A.2. Cálculo de la matriz de rigidez de la estructura. . . . . . . . . 128
A.2.1. Matrices de rigidez de las barras. . . . . . . . . . . . . 128
A.2.2. Matriz de rigidez de la estructura: . . . . . . . . . . . . 130
A.3. Cálculo de los desplazamientos de la estructura. . . . . . . . . 130
A.3.1. Posiciones libres y restringidas. . . . . . . . . . . . . . 130
A.3.2. Vector de fuerzas de la estructura. . . . . . . . . . . . . 130
A.3.3. Vector de desplazamientos restringidos de la estructura. 130
A.3.4. Vector de desplazamientos libres calculados para la estructura. . . . . . . . . . . . . . . . . . . . . . . . . . . 131
A.4. Cálculo de las reacciones de la estructura. . . . . . . . . . . . 131
Bibliografı́a
133
Capı́tulo 1
Introducción
1.1.
Desarrollo histórico
La búsqueda del razonamiento y predicción del estado y el movimiento
de los cuerpos sólidos, tradicionalmente denominados cuerpos materiales, ha
sido una de las disciplinas de la Ciencia que ha avanzado de forma paralela
al desarrollo de las disciplinas matemáticas.
Junto con los trabajos de Johannes Kepler y René Descartes, las experiencias y teorı́as de Galileo Galilei —con sus leyes de transformación—
sentaron las bases para que Isaac Newton desarrollara la Teorı́a Mecánica
Clásica en sus Philosophiae naturalis principia mathematica, donde enuncia
las tres leyes fundamentales del movimiento. Gracias al desarrollo del cálculo
infinitesimal por parte del propio Newton y de Gottfried Leibniz, la mecánica clásica fue avanzando constantemente, impulsada por aportaciones entre
las que cabe destacar las del prolı́fico Leonhard Euler en los apartados de la
mecánica vectorial, los conceptos de partı́cula y masa puntual y la mecánica
del sólido rı́gido.
Con el tratado Mécanique Analytique, Joseph Louis Lagrange reformula
la mecánica clásica a partir del cálculo de variaciones consiguiendo una generalidad inédita en la formulación de las leyes de movimiento. Las claves de
su trabajo fueron la extensión de la ley de trabajos virtuales que empleaba
como principio fundamental y el método de las coordenadas generalizadas.
Su trabajo fue tan elegante que Willian Rowan Hamilton lo describió como
un poema cientı́fico. Incluso el propio Lagrange se jactaba de no haber tenido que incluir ni una sola ilustración en el tratado de mecánica citado. Se
ha de mencionar que incluso fue Lagrange el que dio la forma variacional
a la expresión conocida ahora como principio de d’Alembert, quizás un reconocimiento excesivo para este último cuando lo máximo que se le puede
reconocer es el establecimiento de la nulidad de la suma de las fuerzas de
restricción. Por último, se desea recordar la gran aportación de Hamilton, no
sólo por el desarrollo de sus famosos cuaterniones, sino principalmente por
su formulación de la mecánica que ha permitido una mayor profundización
1
2
1.1. Desarrollo histórico
teórica de la misma.
Aparte de la mecánica de los sistemas de sólidos rı́gidos, la mecánica
del medio continuo (MMC) estudia el comportamiento de cada uno de los
puntos de un medio, considerando como punto una porción del volumen infinı́tamente pequeña (lı́mite infinitesimal). La mecánica del sólido continuo
—rama especializada en los cuerpos materiales de la MMC— es también
conocida como Teorı́a de la Elasticidad. El primer cientı́fico que estudió en
profundidad el comportamiento elástico de los materiales fue el inglés Robert
Hooke, quien descubrió la relación lineal entre fuerza y extensión, estableciendo el equilibrio fuerza-desplazamiento para el caso unidimensional. Más
de cien siglos después, Thomas Young observó que distintos materiales se deformaban con ángulos distintos al aplicar la misma fuerza, estableciendo que
la rigidez de los materiales se podı́a expresar a través de una constante —que
ahora conocemos con su nombre. La generalización a las tres dimensiones de
estas teorı́as las llevaron a cabo Augustin Louis Cauchy a través de su teorı́a
de la tensión y Simeón Denis Poisson con sus contribuciones al estudio de la
compatibilidad de las deformaciones.
El estudio de la Resistencia de los Materiales a través del análisis de la
capacidad de carga de vigas comenzó probablemente con las observaciones
de Galileo y sus intentos de formular analı́ticamente ese comportamiento. Sin
embargo, su suposición de una distribución de tensiones constante a lo largo
de las secciones trasversales se considera un error lo suficientemente grave
para que su nombre no aparezca en la primera teorı́a de flexión de vigas.
La teorı́a de Euler-Bernoulli se fundamenta en la hipótesis de Bernoulli que
supone que las secciones transversales de una viga permanecen planas cuando ésta flexa. Gracias al descubrimiento en la Bibliteca Nacional del Codex
Madrid I sabemos que no fue Daniel Bernoulli el primero que formuló dicha hipótesis sino Leonardo Da Vinci, aunque con las matemáticas de que
disponı́a no tuvo oportunidad de intuir las consecuencias de la misma. A
pesar de eso, Da Vinci supuso (y acerto) que las tensiones serı́an iguales en
ambas caras externas de la viga y, por tanto, habrı́a una fibra neutra sin
tensión e incluso argumenta la distribución lineal de tensiones en la sección.
Timoshenko, a quien se le denomina padre de la ingenierı́a mecánica moderna, desarrolló nuevas teorı́as para las vigas y placas que incluı́an los efectos
de la deformación angular y estudió los efectos de la torsión y vibraciones.
A partir de los trabajos pioneros realizados por los anteriores autores, las
disciplinas de la mecánica de sólido rı́gido y contı́nuo sin duda han tenido
grandes avances pero sus teorı́as, ya sea por su sencillez o por su precisión y
elegancia siguen formando parte de la educación y la práctica profesional e
investigadora.
Con esta breve introducción se ha realizado un rápido repaso a los gigantes
sobre los que descansa nuestro aprendizaje y aunque nunca son suficientes los
citados, un estudio más profundo serı́a excesivo para la visión que se pretende
dar.
Capı́tulo 1. Introducción
1.2.
3
Motivación
La aparición de los ordenadores revolucionó la forma de abordar los problemas de la mecánica. Si tradicionalmente, los métodos analı́ticos fueron los
empleados en la resolución de estos problemas, actualmente son los métodos numéricos los que permiten resolver los problemas más complejos con la
precisión necesaria. Este cambio de enfoque ha provocado un renacimiento
de múltiples herramientas cuyo desarrollo se encontraba estancado al ser su
aplicación inviable por el número de cálculos que implicaban.
En concreto, la mecánica de medios continuos ha visto en las técnicas de
discretización del continuo una salida para la resolución de las ecuaciones
en derivadas parciales que resultan de su formulación. Entre todas ellas, el
método de elementos finitos ha alcanzado una mayor difusión y desarrollo.
Desde que se comenzó a aplicar en la década de 1960 para la resolución de
análisis estructurales lineales en la industria aeroespacial, tanto la cantidad
de problemas que emplean este método para su resolución como la cantidad
de industrias y campos a los que se aplica se ha ampliado enormemente.
El estudio de la dinámica de los mecanismos compuestos por sólidos rı́gidos también se ha beneficiado de la nueva capacidad de cálculo que nos
ofrecen los ordenadores. Las técnicas empleadas para la simulación dinámica
de mecanismos, llamadas multicuerpo o multibody, permiten en la actualidad cálculos en tiempo real para sistemas con un número considerable de
grados de libertad. Además, al aumentar la precisión de los modelos simulados, se requiere introducir en ellos efectos que hasta ahora eran despreciables
en la mayor parte de los casos, siendo la flexibilidad de los cuerpos el más
importante de ellos.
Los dos tipos de formulaciones anteriores a pesar de partir de puntos distantes casi han convergido al llegar a un mismo nivel de complejidad en el que
el objetivo es la simulación de la interactuación de múltiples cuerpos flexibles, ligados o no entre sı́, en un escenario en el que también pueden aparecer
otros cuerpos rı́gidos, fluı́dos o fuerzas con un origen no inercial (electromagnetismo, reacciones quı́micas, etc.). Este tipo de problemas con acoplamiento
entre distintas disciplinas de la fı́sica (multifı́sica) quedan fuera del ámbito
del presente proyecto, que se centra exclusivamente en la interacción entre
sistemas mecánicos compuestos por cuerpos sólidos y flexibles.
Las aplicaciones informáticas de ambas técnicas de simulación han estado claramente diferenciadas ya que aquellas especializadas en las técnicas
multicuerpo consiguen una velocidad de cálculo muy alta aplicando ciertas
simplificaciones y algoritmos especı́ficos de sistemas de sólidos rı́gidos frente
a las aplicaciones tradicionales de simulación que aplican el método de los
elementos finitos a una formulación más general. Sin embargo, el aumento de
la velocidad de cálculo y la necesidad de aumentar el número de problemas
a resolver por parte de este último tipo de aplicaciones están produciendo
una convergencia en cuanto a a la capacidad de simulación de ambos tipos
de programas.
4
1.3. Alcance
Esta evolución tanto de las formulaciones como de las aplicaciones permite realizar simulaciones de sistemas mecánicos que involucran grandes deformaciones y grandes desplazamientos que hasta hace poco se abordaban
de una forma simplificada con una falta de precisión no siempre aceptable.
El aumento de la precisión de estas simulaciones permite estudiar fenómenos
tan útiles para el desarrollo social como aquellos que involucran contactos,
impactos, plasticidad, etc, en el seno de un sistema mecánico complejo.
Para avanzar en esta dirección se hace necesario estudiar la integración
de procedimientos desarrollados para técnicas multicuerpo en la formulación
general de la mecánica de medios continuos que se emplea en las simulaciones que aplican en método de elementos finitos en su discretización. También
resulta interesante disponer de nuevas herramientas que implementen y comparen entre sı́ los métodos matemáticos que se desarrollan para mejorar la
discretización del continuo y la integración de las ecuaciones de la dinámica.
1.3.
Alcance
Este trabajo se enmarca en la mecánica de medios continuos aplicada
a sistemas de cuerpos flexibles. Ası́ por lo tanto, no se contemplan medios
fluı́dos ni efectos distintos de los de origen mecánico. Sin embargo, es difı́cil
establecer una definición de mecanismo flexible que no dé lugar a ambiguedades ni contradicciones con la utilidad de las distintas formulaciones que se
emplean en simulación.
Tradicionalmente, se establece la diferencia entre estructura y mecanismo
analizando las ecuaciones de equilibrio de sólido rı́gido, es decir las ecuaciones
de equilibrio que obvian los efectos elásticos. Ası́, en caso de que el número de
ecuaciones de equilibrio sea menor que el número de incógnitas que definen el
movimiento de sólido rı́gido, se estará hablando de libertades de movimiento
del mecanismo. Por el contrario, si existe igual o mayor número de ecuaciones que de incógnitas, se hablará de isoestaticidad o hiperestaticidad de la
estructura, respectivamente.
La clasificación anterior es útil para el aprendizaje de las técnicas habituales de estudio y simulación ya que intuitivamente es fácil de entender
la diferencia entre ambos conceptos mediante algún razonamiento similar al
siguiente: “mientras un mecanismo posee capacidad de desplazamiento, el
movimiento de los puntos de una estructura depende exclusivamente de las
deformaciones”. De esta manera se establece una clasificación exclusiva entendiendo por ésta la clara distinción entre tipos estructurales y mecanismos.
Al clasificar las técnicas de simulación, en general, sigue siendo válida
la clasifición anterior puesto que las herramientas de simulación de unas no
valen para las otras. Ası́, distinguimos entre análisis estáticos y dinámicos
basados en extracción y superposición de modos cuando se estudian tipos
estructurales y técnicas multicuerpo (MBS, multibody systems) cuando se
estudian mecanismos. Mientras las primeras adoptan normalmente formula-
Capı́tulo 1. Introducción
5
ciones geométricamente lineales, las MBS corresponden a formulaciones no
lineales aplicadas asociadas a los grandes desplazamientos de los elementos
rı́gidos o, en el caso de que se considere cierta deformación, flexibles con
una aproximación de pequeñas deformaciones con respecto a un sistema de
referencia móvil y solidario con el movimiento de sólido rı́gido del cuerpo.
Sin embargo, cuando se adoptan formulaciones para simular la flexibilidad de los sólidos que tienen en cuenta las no linealidades geométricas, la
diferencia principal entre una estructura y un mecanismo resulta tan ambigua como que mientras el mecanismo se compone de de varios cuerpos unidos
entre sı́ mediante algún tipo de unión que permite cierto desplazamiento relativo, la estructura se puede estudiar como un sólo cuerpo. De esta forma, la
clasificación resulta inclusiva ya que bien se podrı́a considerar una estructura
como un mecanismo de un sólo cuerpo.
Ası́ pues resulta necesario delimitar el campo de estudio de este trabajo
considerando como mecanismo flexible cualquier sólido o conjunto de sólidos
rı́gidos o deformables conectados mediante uniones.
1.4.
Estado de la técnica
La cinemática y dinámica de sistemas multicuerpo nacen como aplicaciones de las teorı́as de la mecánica clásica a conjuntos de dos o más sólidos
conectados entre sı́, tal y como se describe en Huston [1990], Rahnejat
[1998], Garcia de Jalon y Bayo [1994] y Shabana [1998]. La importancia de estas técnicas se acentúa al aumentar la capacidad de cálculo de los
ordenadores personales ya que pone al alcance de multitud de usuarios una
capacidad de simulación hasta hace relativamente poco imposible de imaginar. De esta forma van cambiando (y suavizándose) las dificultades que
afectan a la simulación de estos sistemas, permitiendo el empleo de técnicas
conocidas aunque no suficientemente adaptadas a estas simulaciones por no
ser rentables hasta el momento.
Por todo esto, en un principio se consideraba exclusivamente la simulación
de sólidos rı́gidos. Avances en la velocidad de cálculo de las computadoras
introdujeron la posibilidad de, por un lado, realizar simulaciones en tiempo
real y, por el otro, aumentar la complejidad de los sistemas analizados, incluyendo partes flexibles. Estas partes se implementaron primero mediante
técnicas de Resistencia de Materiales, de las que resultan elementos discretos
basados en la formulación fuerte del campo elástico. El siguiente paso fue la
generalización de la flexibilidad para cualquier tipo de sólido, modelado mediante elementos finitos pero siempre en régimen elástico y aproximado por
pequeñas deformaciones.
Los últimos avances en algoritmos y técnicas de computación ası́ como los
desarrollos teóricos de la Mecánica de Medios Continuos están permitiendo la
simulación de sistemas multicuerpo en los que aparecen nuevas prestaciones
como la implementación de formulaciones exactas en vigas o la aparición de
6
1.4. Estado de la técnica
contactos entre cuerpos. Estos avances introducen una enorme complejidad
tanto conceptual como, más importante, de resolución de las ecuaciones que
se plantean.
Las distintas aproximaciones empleadas para incluir la flexibilidad de las
partes que componen un sistema se pueden dividir en dos grandes grupos:
aproximaciones lineales y no lineales. Ambas se apoyan en discretizaciones
realizadas mediante el método de los elementos finitos, que permite transformar un sólido de infinitos grados de libertad en una serie finita de nodos y
elementos.
1.4.1.
Formulaciones de piezas flexibles
Los inicios de esta técnica corresponden a la aplicación de técnicas condensación estática de los movimientos de los nodos intermedios en los grados
de libertad maestros –reducción de Guyan–. Debido a la falta de precisión
y dificultad para poner en práctica esta técnica, se buscó otro camino para
tener en cuenta la flexibilidad pero de un modo más preciso. De esta forma
se desarrollan las técnicas de superposición modal de sólidos flexibles (Song
y Haug [1980]), ya aplicadas en dinámica lineal de estructuras, logrando
resultados aceptables aunque a costa de cálculos lentos y costosos.
Un importante avance, introducido por Shabana y Wehage (ver Shabana
y Wehage [1983]), aprovecha la popular técnica de subestructuración llamada sı́ntesis modal de componentes (Hurty [1965]) para reducir el número
de incógnitas y, por ende, el número de ecuaciones a resolver. De todos los
desarrollos de esta sı́ntes modal, probablemente, el método más general es
el método de Craig-Bampton (desarrollado en Craig y Bampton [1968]),
que permite elegir los grados de libertad no susceptibles a la superposición
modal, sino a las reacciones y desplazamientos comunes a alguna junta.
En simulaciones que implican sólidos contı́nuos, la no linealidad del sistema de ecuaciones a resolver puede tener los siguientes orı́genes:
Geométrico: debido a la aparición de grandes desplazamientos y/o grandes
deformaciones, la posición de los sólidos se vuelve muy diferente de la
que tenı́an en su definición (posición de referencia). Tener en cuenta
los efectos de estos cambios de posición implica desechar las aproximaciones que validan las teorı́as lineales produciendo la aparición de
términos no lineales.
Modelo de comportamiento del material: Cuando el rango de tensiones producido por las solicitaciones
Las técnicas que son capaces de abordar con éxito el problema de las
no linealidades geométricas, más recientes que las anteriormente descritas,
fueron introducidas primero en Simo y Vu-Quoc [1986], y están basadas en
la teorı́a de grandes rotaciones. Aún empleadas para pequeñas deformaciones,
tienen la ventaja frente a las anteriores de que capturan las deformaciones de
Capı́tulo 1. Introducción
7
segundo orden, necesarias para tener en cuenta el endurecimiento rotacional
por efectos geométricos.
A pesar de ello, la formulación habitualmente empleada para modelar
ciertos elementos simplificados, como las vigas y placas, aún siendo no lineal,
corresponde a las teorı́as clásicas de Euler-Bernoulli y de Timoshenko (en el
caso de las primeras). Estas teorı́as realizan simplificaciones cuyos efectos no
siempre son despreciables.
Es por esto que, empleando la conocida como viga de Simó-Reissner, se
pueden abarcar problemas más generales que los permitidos por las vigas
clásicas (Antman [1972], Simo y Vu-Quoc [1986], Antman [1992]).
A pesar de ser de compleja formulación, los resultados obtenidos en las simulaciones son exactamente los que predice la ley de comportamiento del
material por lo que se prefieren para problemas en donde existan grandes deformaciones, ecuaciones constitutivas no lineales, fenómenos de inestabilidad,
etc.
Lo expuesto anteriormente para el caso de las vigas también resulta válido
para el caso de las placas y láminas, para las que existen otros elementos
de equivalentes prestaciones, como son los llamados de Reisner-Midlin (Wu
[2004]).
Para los modelos geométricamente exactos como los comentados, el desarrollo de la estructura hamiltoniana de su formulación ayuda en el estudio
de la dinámica de sistemas para la simulación de la estabilidad no lineal, la
teorı́a de la bifurcación, las soluciones caóticas o de estructuras rotatorias
(Simo et al. [1988]).
1.5.
Objetivos de la investigación
Los aspectos ya comentados anteriormente han motivado la elección como tema de investigación del estudio e implementación de un entorno de
desarrollo que disponga de las herramientas necesarias para que la implementación de las aplicaciones de simulación de la dinámica de mecanismos
flexibles sea rápida y eficiente. La búsqueda de este objetivo se apoya en dos
lı́neas de trabajo:
1. La inclusión de las tareas comunes a las aplicaciones de simulación en
las herramientas del entorno.
2. La generación de una estructura de librerı́as de cálculo que haga sencillo
la inclusión de nuevos métodos y permita comparar el rendimiento de
los mismos.
Para intentar maximizar las espectativas de consecución del objetivo principal de la investigación se ha realizado un gran esfuerzo de estudio y compilación de las teorı́as mecánicas que afectan a los problemas que se desean
abordar.
8
1.6. Hipótesis de la investigación
Se han considerado y expuesto en sus capı́tulos correspondientes tanto las
teorı́as de la mecánica clásica de Newton como, especialmente, la mecánica
lagrangiana para la descripción de la dinámica de mecanismos. También se
estudian los efectos de la flexibilidad de los cuerpos, formulando las ecuaciones mediante la mecánica de medios continuos e implementando técnicas
de resolución de las ecuaciones que incluyen el método de los elementos finitos para realizar las discretizaciones de los cuerpos y técnicas numéricas
—tradicionales y recientes— para la resolución de los sistemas diferenciales
ordinarios que se derivan de aquella discretización.
Además de la teorı́a, el carácter eminéntemente aplicado de esta investigación obliga a mantener la atención puesta tanto en los trabajos de otros
investigadores como en otras fuentes de conocimiento que se podrı́an considerar auxiliares a las materias principales pero sin su dominio no se podrı́an
desarrollar las técnicas anteriores con toda su potencia y precisión. Se trata
principalmente de las técnicas matemáticas, de componente principalmente
numérica, y de cuestiones relativas a la programación y estructura de ordenadores. El trabajo necesario para su estudio y aplicación se cree que supone un
complemento imprescidible para que el resultado de esta investigación sea lo
más completo, útil y homogéneo posible, una vez asumidas las restricciones
lógicas de tiempo y conocimiento con las que se parte.
1.6.
Hipótesis de la investigación
Como en cualquier desarrollo basado en las leyes de la mecánica tradicional, se ha de asumir como propios los principios fı́sicos que rigen el movimiento y las deformaciones de los sólidos a velocidades terrestres. Ası́ pues,
las hipótesis básicas de partida serán las que se exponen a continuación:
Se desprecian los efectos de la Teorı́a de la Relatividad, ya que las
velocidades que se suponen son bajas con respecto a la velocidad de la
luz.
Se asume la conservación de la masa, despreciando por tanto transformaciones quı́micas y nucleares que pudieran hacerla variar considerablemente.
Se aplicará para el planteamiento de las ecuaciones de equilibrio el
principio de conservación de energı́a que, expresado en su forma matemática, define un potencial como un invariante.
Se desprecian los efectos microscópicos de los materiales, atendiendo
nada más a los fenómenos inerciales de ı́ndole macroscópica.
Capı́tulo 2
Formulación dinámica no lineal
de mecanismos flexibles
2.1.
Formulación continua de sólidos flexibles
Para el estudio de la flexibilidad de un medio sólido, la Mecánica de Medios Continuos define el movimiento como un cambio en la configuración (B)
de un medio. El estudio los efectos producidos al pasar un medio de una configuración inicial (material), B0 , a una configuración deformada (espacial),
Bt , se puede hacer con respecto a ambas configuraciones.
Sea B0 la configuración del sólido en t = 0 y sea Bt su configuración en
un instante t posterior, se asume que existe una aplicación de movimiento:
ϕ : B × [0, t) → R3 que describe el movimiento del sólido.
Para el estudio de los cuerpos sólidos (materiales) mediante la mecánica
de medios continuos se suele emplear la llamada formulación lagrangiana. En
ella se busca describir el comportamiento del medio “siguiendoçada uno de
los puntos del sólido a lo largo de la deformación.
En una formulación lagrangiana, si los efectos de la deformación se describen en la configuración de referencia, se estará hablando de una descripción
material o una formulación lagrangiana total.
Por el contrario, si se realiza una descripción en la configuración deformada, se trata de una descripción espacial o una formulación lagrangiana
actualizada.
2.1.1.
Medidas de deformación
A partir de la aplicación de desplazamiento ϕ, se define el tensor de
segundo orden gradiente de deformación, F como:
def
F (X, t) =
∂x
∂ϕ(X, t)
≡
∂X
∂X
Resulta útil definir también las siguientes medidas de deformación:
9
(2.1)
10
2.1. Formulación continua de sólidos flexibles
def
Cauchy-Green por la derecha: C = F T F
def
Cauchy-Green por la izquierda: b = F F T
def
Green-Lagrange: E =
1
(C − 1)
2
1
(1 − b−1 )
2
"
µ ¶T #
∂u
def 1 ∂u
Lineal de Euler: ε =
+
2 ∂x
∂x
def
Almansi-Euler: e =
donde u es el desplazamiento definido por u = x − X
2.1.2.
Medidas de tensiones
Siguiendo el postulado de Cauchy, según el cual el vector tensión, t, depende no sólo del punto en estudio, x, sino también de la superficie a la que
está asociada, cuya normal es n; se define el tensor de segundo orden de tensiones de Cauchy en dicho punto, σ(x), como aquel que verifica la siguiente
condición:
t(x, n) = σ(x) n
(2.2)
Este tensor se puede dividir en dos componentes a través del concepto de
compresión volumétrica o presión, p(x), cuyo valor en un punto se calcula
como:
1
p(x) = − tr σ(x)
3
Ası́, el tensor de tensión esférica, σV , se calcula como:
def
σ V (x) = −p(x) I
(2.3)
(2.4)
Y, el tensor de tensión desviadora, σD , toma la expresión:
def
σ D (x) = σ(x) + p(x) I = σ(x) − σ V (x)
(2.5)
Otras medidas útiles de tensión se definen de la siguiente forma:
def
Primer tensor de Piola-Kirchoff: P = det(F )σF −T
def
Segundo tensor de Piola-Kirchoff: S = F −1 P = det(F )F −1 σF −T
def
Tensor de Kirchoff: τ = det(F )σ
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
11
Trabajo virtual de deformación
Las distintas medidas de tensión y deformación definidas anteriormente
se pueden emplear para el cálculo del trabajo virtual, δΠ, esto es, el trabajo
interno que producirı́a una deformación virtual del dominio.
El trabajo virtual, expresado mediante una formulación lagrangiana total,
puede tomar las siguientes expresiones equivalentes:
Z
Z
δΠ =
Z
τ : δε =
B0
P : δF =
B0
S : δE
(2.6)
B0
Por otro lado, respecto a la configuración deformada, la formulación lagrangiana actualizada del trabajo virtual se puede poner como sigue:
Z
Z
δΠ =
σ : δε =
Bt
2.1.3.
τ : δe
(2.7)
Bt
Ecuaciones de balance mecánico: Formulación
fuerte
Se denomina formulación fuerte a aquella que describe las relaciones
mecánicas que se han de cumplir en cualquier punto de un sólido. Se presentan a continuación las distintas expresiones que relacionan fuerzas, tensiones
y deformaciones obtenidas a partir de las leyes de la mecánica aplicadas a
volúmenes infinitesimales del sólido (Gonzalez y Stuart [1995]).
Formulación lagrangiana: Ecuaciones de balance
Considerando la configuración inicial del cuerpo, B0 , en t = 0 y otra
configuración posterior, Bt , se pueden plantear las siguientes ecuaciones de
balance mecánico.
Conservación de la masa
Las propiedades de masa de un cuerpo continuo en una configuración
Bt ⊂ R3 , se describen mediante un campo de densidad de masa, ρt =
ρ (·, t) : Bt → R, de tal manera que la masa del dominio Bt se puede
calcular mediante
Z
masa [Bt ] =
ρ (x, t) dVx
(2.8)
Bt
Realizada la anterior definición, se establecerá como principio la conservación de la masa total del dominio Bt . Ası́ pues, en la mecánica de
12
2.1. Formulación continua de sólidos flexibles
medios continuos, no se consideran los efectos de reacciones quimiconucleares que impliquen modificación de la masa, ası́ como tampoco los
derivados de la Teorı́a de la Relatividad. Matemáticamente,
d
masa [Bt ] = 0
dt
(2.9)
Leyes de inercia
Se considera ahora un cuerpo con movimiento y deformación continuos
en el tiempo y espacio R3 . Sea v t = v (·, t) : Bt → V el campo de
velocidades. Se define la cantidad de movimiento como
Z
l [Bt ] =
ρ (x, t) v (x, t) dVx
(2.10)
Bt
De la misma manera que una fuerza se puede asociar a un momento con
respecto de un punto, se puede definir el momento cinéticoalrededor de
un punto como la cantidad de movimiento por la distancia perpendicular al punto z. Matemáticamente se expresa
Z
j [Bt ]z =
(x − z) × ρ (x, t) v (x, t) dVx
(2.11)
Bt
Se supone que el cuerpo se encuentra sometido a una distribución superficial de carga que describiremos como un campo de tracción tt = t
(·, t) : Bt → V, y también sometido a fuerzas volumétricas exteriores
que se describirán mediante un campo de fuerzas por unidad de masa
bt = b (·, t) : Bt → V.
La fuerza resultante en el dominio Bt debida a ambos campos resulta:
Z
Z
r [Bt ] = r s [Bt ] + r b [Bt ] =
t (x, t) dAx +
∂Bt
ρ (x, t) b (x, t) dVx
Bt
(2.12)
Y, el par (momento) resultante alrededor de un punto z es
ϑ [Bt ] = ϑs [Bt ] + ϑb [Bt ]
Z
Z
=
(x − z) × t (x, t) dAx +
(x − z) × ρ (x, t) b (x, t) dVx
∂Bt
Bt
Las Leyes de Inercia se pueden expresar de la siguiente manera:
Con respecto a un triedro de referencia, la magnitud de la variación de
la cantidad de movimiento de un cuerpo material es igual a la fuerza
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
13
resultante aplicada, y la magnitud de la variación del momento cinético con respecto de cualquier punto fijo es igual al par resultante con
respecto del mismo punto. Matemáticamente
d
l [Bt ] = r [Bt ]
dt
(2.13)
d
j [Bt ]z = ϑ [Bt ]z
dt
(2.14)
Descripciones locales de la formulación lagrangiana
En esta sección se describen las mismas leyes anteriormente enunciadas,
de modo genérico, aplicadas a un cuerpo que se mueve y deforma a lo largo del
tiempo y del que se conoce su forma en un instante inicial. En este instante
inicial (t = 0), cada punto del cuerpo se define mediante la posición que
ocupa en R3 a través de unas coordenadas únicas. Si en un instante posterior
se quiere referir un punto determinado del cuerpo, se podrá identificar de dos
maneras distintas.
Si en un instante t, se identifica un punto mediante la posición que ocupa
en el espacio en ese preciso instante t, entonces las coordenadas que lo definen se denominan coordenadas espaciales, x. A esta manera de definir los
puntos se la denomina descripción espacial o euleriana, aunque es preferible
la primera denominación ya que la segunda da lugar a confusiones con la
formulación euleriana.
Si en ese mismo instante t, para hacer referencia al mismo punto se emplean las coordenadas que lo definı́an en t = 0, entonces se denominan coordenadas materiales, X, y al tipo de definición de punto se la llama descripción
material o lagrangiana. Al igual que sucede en el caso anterior hablar de
formulación lagrangiana con descripción lagrangiana resulta redundante y
confuso, debiéndose evitar. Un esquema de lo descrito se puede consultar en
la figura 2.1.
Descripción material
Lagrangiana
Formulación
Descripción espacial
Euleriana
Figura 2.1: Nomenclatura de formulaciones y sus descripciones
14
2.1. Formulación continua de sólidos flexibles
Descripción espacial de la formulación lagrangiana
Las descripciones locales de las ecuaciones de balance se obtienen a base de imponer las definiciones anteriores a cada subdominio ∂Bt del medio
continuo en su configuración Bt .
Conservación de la masa
Retomando la ecuación (2.9) y aplicándola al estado inicial y a otro
deformado,
masa (B0 ) = masa (Bt )
(2.15)
Empleando las relaciones entre distintos estados de deformación, se
llega finalmente a la siguiente ley de conservación de la masa:
∂
ρ + ∇x · (ρv) = 0
∂t
(2.16)
donde:
ρ = ρ (x, t), es la densidad en una posición x,
v = v (x, t), es la velocidad de un punto de posición x, y
∂
∇x =
, por lo que ∇x · (·) es el operador divergencia que al
∂x
aplicarlo sobre un campo vectorial da un escalar: ∇x · v = vi,i .
Variación de la cantidad de movimiento
El equilibrio entre fuerzas en cualquier sistema mecánico requiere que
las fuerzas aplicadas se igualen con las fuerzas de inercia generadas al
variar la cantidad de movimiento del cuerpo. En medios continuos formulados de forma lagrangiana, con descripción espacial, este equilibrio
adquiere la siguiente forma:
∇x ·σ +ρb = ρv̇
(2.17)
que, en componentes —empleando notación indicial— resulta:
σij,j + ρbi = ρv̇i
(2.18)
donde:
σ, es el tensor de tensiones de Cauchy,
b, es la fuerza espacial por unidad de masa, y
∂¤
indica la derivada con respecto a la variable indepen¤̇ =
∂t
diente.
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
15
Variación del momento cinético
Tanto en ausencia de efectos inerciales como cuando estos se presentan,
la condición de suma de momentos nula implica la simetrı́a del tensor
de tensiones de Cauchy. Matemáticamente,
σ = σT
(2.19)
σij = σji
(2.20)
Y, en componentes:
Conservación de energı́a mecánica
Cuando nada más existen efectos mecánicos en un medio continuo, se
puede obtener una consecuencia de las dos anteriores leyes. La conservación de energı́a mecánica se puede expresar en descripción espacial
de la siguiente forma:
d
K [Bt ] +
dt
Z
σ : L dVx = P [Bt ]
(2.21)
Bt
donde:
R
K [Bt ] = Bt ρv · v dVx , es la energı́a cinética total en el dominio
del cuerpo, Bt ,
σ, es el tensor de tensiones de Cauchy,
L = ∇x v, es el campo tensorial dado por el gradiente de la velocidad, también llamado tasa de deformación, y
R
R
P [Bt ] = ∂t Bt v · t dAx + Bt ρb · v dVx , es la potencia de las fuerzas
exteriores actuando en Bt , siendo
t = σ · n el campo de tracción en la superficie de normal n.
Descripción material de la formulación lagrangiana
Las descripciones materiales de las ecuaciones de balance se obtinen a base
de imponer a las expresiones anteriores la transformación de coordenadas que
indica la función de deformación x = ϕ(X, t).
Conservación de la masa
Sea el campo densidad espacial, ρ(x, t), que tiene el valor en la configuración de referencia, ρo (X). La descripción material de la ley de
conservación de masa se corresponde con la siguiente igualdad:
ρm (X, t) det (F (X, t)) = ρo (X)
(2.22)
16
2.1. Formulación continua de sólidos flexibles
donde la descripción material de la densidad, ρm (X, t) = ρ (ϕ(X, t), t).
Variación de la cantidad de movimiento
La descripción material adquiere una forma parecida a la espacial,
∇X ·P +ρo bm = ρo
∂2
ϕ
∂t2
(2.23)
Donde,
P = P (X, t) = det F (X, t) σ(ϕ (X, t) , t) F (X, t)−T ,
es el primer tensor de Piola-Kirchhoff,
bm = b(ϕ (X, t) , t).
es la fuerza por unidad de masa en descripción material,
Variación del momento cinético
El resultado obtenido al imponer las condiciones correspondientes a
esta ley no convierten el tensor P en un tensor simétrico, sin embargo,
el producto siguiente sı́ lo es,
P FT = F PT
(2.24)
De manera que si se define un nuevo tensor como tal producto, dicho
tensor sı́ será simétrico. Ası́:
S = ST
(2.25)
siendo S el segundo tensor de Piola-Kirchhoff.
Conservación de energı́a mecánica
Empleando las definiciones de potencia, P , y energı́a cinética total, K ,
descritas de forma material, se puede expresar esta ley conservativa en
su descripción material como:
d
K [Bt ] +
dt
Z
P : Ḟ dVX = P [Bt ]
Bt
donde:
La derivada del tensor deformación es:
Ḟ = Ḟ (X, t) = ∇X ϕ̇ (X, t).
(2.26)
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
2.1.4.
17
Ecuaciones constitutivas de materiales sólidos
elásticos
Las relaciones entre las medidas de tensión y deformación para cada instante vienen definidas por el comportamiento del material a través de sus
ecuaciones constitutivas.
Se considera en lo que sigue el estudio de los materiales deformándose
en su rango elástico en el que la deformación es función exclusivamente del
estado tensional.
Elasticidad lineal
Si existe una relación lineal entre las tensiones y deformaciones, se puede
expresar en función del tensor de Cauchy y la deformación lineal, tal como
sigue:
σ=C:ε
(2.27)
σij = Cijkl εij
(2.28)
O, en componentes:
Donde el tensor de cuarto orden C se denomina tensor de módulos elásticos cuyas simetrı́as menores (Cijkl = Cjikl y Cijkl = Cijlk ) y mayor (Cijkl =
Cklij ) reducen el número de parámetros independientes desde los 81 elementos del tensor a sólo 21.
Para materiales reales con algún tipo de simetrı́a de comportamiento, se
pueden reducir aún más el número de parámetros necesarios para definir C:
Simetrı́a ortótropa: El comportamiento depende de la dirección estudiada, aunque existen tres direcciones ortogonales en las cuales no existe
interacción entre las tensiones normales y las deformaciones angulares. En este caso, el número de parámetros independientes se reduce a
nueve.
Isotropı́a: Se dice que un material tiene comportamiento isótropo cuando la relación esfuerzos-deformaciones no depende de la dirección estudiada. En este caso, sólo existirán dos parámetros independientes.
Sean λ y µ las constantes de Lamé, para un material isótropo, el tensor
de módulos elásticos queda definido por:
C = λ(1 ⊗ 1) + 2µI
(2.29)
Cijkl = λδij δkl + 2µδik δjl
(2.30)
O, en componentes:
18
2.1. Formulación continua de sólidos flexibles
donde:
1 es el tensor unitario de segundo orden,
I es el tensor unitario de cuarto orden, y
δij es la función Delta de Kronecker definida como:
½
δij =
1 si i = j
0 si i 6= j
(2.31)
Sustituyendo en 2.27 se obtiene la relación lineal tensión-deformación:
σ = λ tr(ε)1 + 2µε
;
σij = λεkk δij + 2µεij
(2.32)
Densidad de energı́a de deformación. Hiperelasticidad
Un material hiperelástico es aquel cuya tensión, por ejemplo, medida a
través del primer tensor de Piola-Kirchoff, deriva de un campo escalar al que
llamaremos densidad de energı́a de deformación, W (F , X), particularizado
en cada punto material:
∂W (F , X)
∂F (X)
P =
(2.33)
Ası́ mismo, se pueden emplear los pares de tensión y deformación definidos
en 2.6 para la configuración inicial o los indicados en 2.7 para la configuración
deformada.
De esta forma, el trabajo de las tensiones a lo largo de una deformación es
independiente de la trayectoria seguida, siendo sólo función del punto inicial
y del final:
Z
Z
1
t1
dW =
0
P : Ḟ dt = W01 (F , X)
(2.34)
t0
A continuación se enumeran las leyes de comportamiento de los materiales
hiperelásticos más usados que, además, son isótropos y homogéneos:
Saint-Venant Kirchoff : corresponde al modelo de comportamiento elástico lineal en la configuración material.
W (E) =
λ
[tr(E)]2 + µE : E
2
(2.35)
S(E) = λ tr(E)1 + 2µE
(2.36)
C = λ(1 ⊗ 1) + 2µI
(2.37)
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
19
Neo-Hookeano extendido:
W (C) =
λ 2
1
1
(J − 1) − (λ + 2µ) ln J + µ tr(C − 3)
4
2
2
1
S(C) = (J 2 − 1)C −1 + µ(1 − C −1 )
2
(2.38)
(2.39)
donde:
J = det F (X)
Mooney-Rivlin:
W (C) = a1 (tr(C) − 3)2 + b1 (C : C − 3)2
(2.40)
donde:
a1 , b1 son constantes del material estimadas empı́ricamente.
Hay que resaltar que, las anteriores ecuaciones dependen de los invariantes
tensoriales de los tensores deformación; por ejemplo para el tensor de CauchyGreen por la derecha, C:
I1C = tr(C)
;
I2C = C : C
;
I3C = det(C)
(2.41)
Observación 1 Si el tercer invariante resulta igual a la unidad, I3C = 1,
entonces no se produce variación volumétrica por lo que los modelos de materiales en los que no aparece este invariante corresponderán a sólidos incompresibles.
2.1.5.
Principios variacionales: Formulación débil
La ecuación de balance de cantidad de movimiento, tanto en su descripción espacial de 2.17 como en la material dada en 2.23, corresponde a una
relación que se ha de cumplir para cada punto.
En cambio, aplicando el principio de conservación de la energı́a total, cualquier trabajo producido por unas variaciones (o desplazamientos virtuales),
δx, debe ser nulo:
δΠ = 0
(2.42)
Observación 2 Una forma más correcta de enunciar este principio, desde
el punto de vista estrictamente matemático, parte de plantear unas funciones
de prueba, η : B → Rm | η(x) = 0 en el contorno del dominio sobre el
que se plantean las condiciones esenciales. Al ponderar la formulación fuerte
con estas funciones, integrar en todo el dominio y después de cierta elaboración, se obtiene un resultado equivalente al que se enuncia a continuación
20
2.2. Formulación discreta de la dinámica de sólidos flexibles
(consultar Belytschko et al. [2000] y Bonet y Wood [1997] para un
desarrollo con desplazamientos y velocidades virtuales, respectivamente).
En todo caso, el significado fı́sico tan evidente de las funciones de prueba
hace más intuitiva la utilización de la notación vista para los desplazamientos
virtuales en vez de emplear una función de prueba sin sentido geométrico.
Descomponiendo las posibles contribuciones al trabajo virtual en función
del origen de la fuerza que lo produce, se puede expandir en los siguientes
términos:
δΠ = 0 = δΠinercia − δΠinterno − δΠexterno
(2.43)
Cada una de las contribuciones anteriores se puede poner como sigue:
Z
δΠinercia =
ρẍ δx dV
(2.44)
B
Z
δΠinterno =
(2.45)
(F · S) δF dV
B0
Z
Z
δΠexterno =
b δx dV +
t δx dS
(2.46)
B
∂B
donde b y t son funciones de fuerza distribuida por unidad de volumen y
superficie respectivamente.
Observación 3 La ecuación 2.45 se puede poner en función de los pares
conjugados para el trabajo virtual interno dados en 2.6 para la descripción
lagrangiana y en 2.7 para la euleriana aunque se suele escribir de esta forma
por motivos relativos al desarrollo del método de elementos finitos descrito
en la siguiente sección.
2.2.
Formulación discreta de la dinámica de
sólidos flexibles
2.2.1.
Discretización por elementos finitos
Para resolver las ecuaciones de la formulación débil expuesta anteriormente, se suele recurrir a una semidiscretización del medio continuo en elementos
finitos, de dominio Ωe , de manera que la unión
de todos ellos forma el doS elem
Ωe ). Las coordenadas de
minio del medio continuo en estudio (B = ni=1
los puntos interiores de cada elemento se aproximan mediante la siguiente
forma:
h
x(X, t) ' x (X, t) =
n−nodos
X
a=1
Na (X)xa (t) = N · q e
(2.47)
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
21
donde las funciones Na se denominan funciones de forma mientras que
q e se llaman coordenadas generalizadas del cuerpo elástico.
Si las funciones de desplazamientos, u, se aproximan mediante las funciones de forma, entonces el elemento recibe el nombre de isoparamétrico y los
desplazamientos virtuales, δx, se pueden poner también en función de éstas
y de la variación de las coordenadas generalizadas; resultando:
u = N · ∆q e
;
δx = N · δq e
(2.48)
Por otro lado, al no depender las funciones de forma del tiempo, la derivada n-ésima de las posiciones se calcula como:
dn
dn
x = N n qe
(2.49)
dtn
dt
Sustituyendo la discretización 2.48 en las ecuaciones del trabajo virtual
inercial 2.44, interno 2.45 y externo 2.46, y teniendo en cuenta 2.49 se llega a
las siguientes expresiones para las contribuciones de cada elemento al trabajo
virtual (un desarrollo más detallado se puede ver en Garcı́a Orden [1999]):
¸
·Z
δΠeinercia
=
δq Te
T
·
Ωe
ρN · N dV · q̈ e = δq Te · M e · q̈ e
δΠeinterno = δq Te · f eint
¡
¢
C
δΠeexterno = δq Te · Qe = δq Te · −DVe (q e ) + QN
e
(2.50)
(2.51)
(2.52)
donde:
M e es la matriz de masa del elemento,
f eint es el vector de fuerzas internas del elemento, y
Qe es el vector de fuerzas externas en el elemento, que se descompone en
un término que deriva de un potencial estacionario, Ve (q e ) y en otro
C
término que engloba las fuerzas no conservativas, QN
e .
Sustituyendo las ecuaciones 2.50, 2.51 y 2.52 en 2.43 se llega al sistema
simplificado
¡
¢
δq Te M e q̈ e − f int,e − Qe = 0
(2.53)
2.2.2.
Sı́ntesis modal de componentes
El método de sı́ntesis modal de componentes realiza una descripción del
movimiento del sólido como suma del movimiento de sólido rı́gido, ur , de su
marco de referencia con el producido por las deformaciones lineales, up , con
respecto de este marco (u = ur + up ). El estudio de estos desplazamientos
se realiza básicamente mediante una extracción modal-espectral, estudiando
la aportación de los modos elegidos al desplazamiento nodal mediante las
22
2.2. Formulación discreta de la dinámica de sólidos flexibles
coordenadas modales. A la parametrización necesaria para implementar la
técnica de sı́ntesis modal de componentes se le denomina referencia flotante.
La clave del método reside en el planteamiento del cálculo de la matriz
de masas y la de rigidez, para lo cual se dividen los modos en dos grupos en
función de que los GDL maestros permanezcan fijos o no (Craig y Bampton [1968]). Estos modos maestros se definen en la generación del modelo
de elementos finitos y son aquellos en los que se aplicarán las uniones con
el resto del mecanismo por lo que también se llaman GDL de contorno, de
unión o de interfaz.
Se diferencia entre los siguientes tipos de modos de vibración:
Modos de interfaz. Cada uno de estos modos se obtiene de aplicar a un
solo GDL maestro un desplazamiento unitario, quedando el resto de
GDL restringidos.
Figura 2.2: Ejemplo de modos de interfaz. Se muestran los modos correspondientes a los GDL maestros definidos en el extremo izquierdo
de la viga
Modos de contorno fijo. Responden a los modos calculados mediante
una extracción modal del modelo en el que se restringen los GDL maestros. Habrá tantos como GDLs internos y sobre éstos se podrá aplicar
truncación modal para reducir el número de coordenadas modales.
Figura 2.3: Ejemplo de modos de contorno fijo. Los GDL maestros son
todos los que definen el desplazamiento de los extremos de la viga.
Los modos de interfaz y de contorno fijo también se denominan estáticos
y dinámicos en algunas referencias (Gutiérrez Fernández [2003]) aunque se prefiere la nomenclatura adoptada por su significado intuitivo en el
contexto de mecanismo.
Los desplazamientos fı́sicos se obtienen a partir de los modales a través
de la siguiente ecuación:
¸½ ¾
½ ¾ ·
1
0
wI
uM
(2.54)
=
up =
wF
uN
ΦN I ΦN F
donde
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
23
uM , uN son los desplazamientos fı́sicos de los GDL maetros (M ) y no
maestros (N ).
1, 0 son las matrices identidad y nula, respectivamente.
ΦN I , ΦN F son las matrices modales que relacionan los desplazamientos
de los nodos no maestros (N) con los modos de interfaz (I) y de contorno
fijo (F).
wI , wF son los desplazamientos modales de los modos de interfaz (I) y
de contorno fijo (F).
Para la descripción de los desplazamientos en esta base modal, las matrices de masa y rigidez del sólido flexible requieren la siguiente transformación,
denominándose matrices de masa y rigidez generalizadas:
·
¸T ·
¸·
¸
1
0
KM M KM N
1
0
K̂ = Φ KΦ =
ΦN I ΦN F
K M N K N N ΦN I ΦN F
·
¸
K̂II
0
=
(2.55)
0 K̂F F
T
·
T
M̂ = Φ MΦ =
·
=
1
0
ΦN I ΦN F
¸T ·
M̂II M̂IF
M̂F I M̂F F
¸
MM M MM N
MM N MN N
¸·
1
0
ΦN I ΦN F
¸
(2.56)
donde
Los subı́ndices indican relaciones con los desplazamientos de los nodos
maestros (M ) o no maestros(N ) y con los modos de interfaz (I) o de
contorno fijo (F ).
K̂F F y M̂F F son diagonales puesto que están asociadas a los autovectores modales.
Como K̂II no es diagonal, la matriz de rigidez generalizada, K̂, no es
diagonal en general pero las submatrices nulas en los bloque fuera de la
diagonal indican que no hay acoplamiento de rigidez entre los distintos
modos, cuyas inercias sı́ que estarán acopladas.
La base modal anterior no es ortogonal ya que las matrices K̂ y M̂ no
son diagonales. A través del problema de autovalores
K̂w = λM̂w
(2.57)
24
2.2. Formulación discreta de la dinámica de sólidos flexibles
X 0p
up
xo
Figura 2.4: Posición de un punto mediante referencia flotante
se obtiene una nueva transformación a través de la matriz N formada por
los autovectores del sistema que produce la buscada ortogonalización. Las
nuevas coordenadas modales w∗ cumplen la condición
Nw∗ = w
(2.58)
por lo que los desplazamientos fı́sicos se calculan ahora como
up = Φw = ΦNw∗ = Φ∗ w∗
(2.59)
La posición en un instante, t, de un punto, p, en un sólido flexible se
puede descomponer como se muestra en la figura 2.4 en la suma
xp = x0 + X 0p + up
(2.60)
donde:
x0 es la posición del sistema de referencia flotante.
X 0p es la posición del punto p en (t = 0) en el sistema de referencia
flotante.
up es el desplazamiento del punto p con respecto al sistema de referencia
flotante.
suponiendo, en general, que la orientación del sistema de referencia flotante (0) no será la misma que la del sistema inercial de referencia (G), se
define un tensor de giro entre ambos A tal que la posición de un punto i se
puede expresar en ambos sistemas con la siguiente equivalencia (cambio de
base):
0
(2.61)
xG
p = A xp
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
25
Teniendo en cuenta que, en la ecuación 2.60 los vectores con respecto al
sistema de referencia flotante se conocen proyectados en el sistema coordenado de éste, sustituyendo la transformación de coordenadas anterior, se puede
reescribir de la siguiente manera:
0
G
0
xG
p = x0 + A (X 0p + up )
(2.62)
La anterior ecuación permite conocer la posición del punto p con respecto
al sistema G una vez definido el vector xG
0 = x0 (t), el tensor A = A(ϕ) y el
0
∗
vector up = Φp w (t).
El tensor A se define mediante algún conjunto de parámetros de giro
ϕ = ϕ(t) como los ángulos de Euler o similar.
El vector u0p se calcula en la base modal definida por los m-modos Φp a
través de las coordenadas modales w∗ (t) = wi∗ (t), (i = 1 . . . m).
De esta manera, las coordenadas generalizadas de un sólido flexible formulado mediante referencia flotante se pueden escribir como
 G 
 x0 
ϕ
qf =
(2.63)
 ∗ 
w
Derivando la expresión 2.62 se obtiene la velocidad del punto en el sistema
global
0
G
0
0
vG
(2.64)
p = ẋ0 + Ȧ(X 0p + up ) + Au̇p
El segundo término de la ecuación anterior se puede expresar en función
de la velocidad angular del sistema de referencia con respecto del global, ω G
0,
como
Ȧ(X 00p + u0p ) = Ȧx00p
0
= A(ω G
0 × x0p )
= −A(x00p × ω G
0)
= −Ax̃00p ω G
0
= −Ax̃00p Bϕ̇
(2.65)
donde ω G
0 se relaciona con la derivada de los parámetros de giro a través
del tensor B en la forma ω G
0 = Bϕ y la tilde (˜) representa el tensor hemi1
simétrico asociado al producto vectorial


0 −x3 x2
(2.66)
x × ω = −x3 0 −x1  ω = x̃ω
x2 −x1 0
1
Un tensor hemisimétrico, W, es aquel cuyos elementos cumplen Wij = −Wji .
26
2.2. Formulación discreta de la dinámica de sólidos flexibles
La ecuación 2.64 se puede rescribir entonces como
0
G
∗
^
0
vG
p = ẋ0 − A(X 0p + up )Bϕ̇ + AΦp ẇ
(2.67)
que, en forma matricial, la velocidad en función de las coordenadas generalizadas resulta


h
i  x˙G
0 
0
∗
0
= Cp q̇ f
(2.68)
vG
ϕ̇
I −A(X^
p =
0p + up )B AΦp ẇ
 ∗ 
ẇ
A partir de la expresión anterior se puede plantear el cálculo de la matriz
de masa para los elementos finitos en referencia flotante a partir de la energı́a
cinética. La expresión general para esta energı́a es
Z
1
T =
ρv T vdV
(2.69)
2 V
Introduciendo una discretización por elementos finitos en la que la posición de cada punto queda definida a partir de la de los nodos del elemento y
de sus funciones de forma según (2.47), la velocidad de cada punto se calcula
también a partir de la nodal según la ecuación (2.49) para n = 1 quedando
v=
d
d
x = N q e = N q̇ e
dt
dt
(2.70)
por lo que la energı́a cinética se calcula como la suma de la energı́a de
cada uno de los n-elementos
n−elem Z
1 X
ρv T vdV
T =
(2.71)
2
V
n−elem Z
1 X
=
q̇ Te N T N q̇ e dV
(2.72)
2
V
1 T
=
q̇ MM EF q̇ e
(2.73)
2 e
(2.74)
Teniendo en cuenta la relación (2.68) que describe la velocidad para un
punto del sólido flexible, para los p-nodos de la malla se tendrá, teniendo en
cuenta que las coordenadas {ẋG
0 , ϕ̇} son las mismas para todos ellos

  


0
∗
^
0

q̇ 1 
  I −A(X 01 + u1 )B AΦ1 ẇ   x˙G
0 
..
..
..
..

(2.75)
.
.
.=
 .
  ϕ̇ 

q̇ 
∗
ẇ
0
∗
0
p
I −A(X^
0p + up )B AΦp ẇ
q̇ e = Cq̇ f
(2.76)
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
27
Por lo que la energı́a cinética se puede calcular a través de los parámetros
de referencia flotante como
1
T = q̇ Tf CT MM EF Cq̇ f
2
(2.77)
De manera que se llama matriz de masas del cuerpo flexible en referencia
flotante, Mf , al producto
Mf = CT MM EF C
(2.78)
donde la matriz C está definida en (2.75).
La contribución al trabajo virtual de las fuerzas de inercia del sólido
flexible en referencia flotante queda
"Z
#
δΠfinercia = δq Tf ·
ρN T · N dV
Ωf
· q̈ f = δq Tf · M f · q̈ f
(2.79)
Por su parte, la contribución al trabajo interno se calcula a través de
las fuerzas elásticas aproximadas linealmente por la matriz de rigidez y los
desplazamientos con respecto a la referencia flotante
¡
¢
δΠeinterno = δq Tf · f int,f = δq Tf −Kf q f
(2.80)
donde las fuerzas son sólo función de las coordenadas modales, por lo tanto
la matriz de rigidez será:



0 0
0
 x˙G
0 
0 
K f = 0 0
(2.81)
ϕ̇
 ∗ 
0 0 Kww
ẇ
2.3.
Formulación de la dinámica de sólidos
rı́gidos
Un sólido rı́gido es aquel cuyos puntos permanencen a la misma distancia
relativa, o lo que es lo mismo, el cuerpo que no se deforma a lo largo del
tiempo. No tiene sentido pues hablar de tensiones en este tipo de cuerpos
aunque sı́ que se pueden extrapolar las ecuaciones de balance vistas en 2.1.3
teniendo en cuenta que el gradiente de deformación es nulo. También debido
a esto, el movimiento se puede expresar a través de un número finito de
parámetros de manera exacta.
Obviando los detalles de la parametrización de coordenadas que se verán
en el siguiente apartado, un cuerpo sólido rı́gido se puede considerar como
un sistema de partı́culas y distribuciones de masa contı́nuas con la única condición de que todos sus puntos se encuentran situados en la misma posición
con respecto a una referencia local.
28
2.3. Formulación de la dinámica de sólidos rı́gidos
Empleando el subı́ndice p para las partı́culas y d para las masas distribuı́das en el espacio, cada una de ellas puede estar sometida a unas fuerzas
puntuales (f ) y distribuı́das (b) en el caso de las segundas. El principio de
equilibrio de D’Alambert implica entonces:
Np
X
mi ẍi δxi +
i=1
"Z
Nd
X
j=1
#
ρẍδxdV −
Bj
Nf
X
f k δxk −
k=1
Nb ·Z
X
l=1
¸
bl δxdV
= 0 (2.82)
Bl
A través de cualquiera de las parametrizaciones de sólidos (ver 2.3.1) se
discretiza el desplazamiento de las masas continuas de forma que el conjunto
de parámetros de masas puntuales y continuas se representa por q R que son
las coordenadas generalizadas del cuerpo rı́gido.
Teniendo en cuenta que la posición de cualquier punto se podrá poner en
función de las coordenadas generalizadas mediante
x = x(q R )
(2.83)
la variación de desplazamientos se transforma en
δx =
∂x
δq
∂q R R
(2.84)
Sustituyendo las anteriores discretizaciones en la ecuación 2.82, se llega
a la ecuación de equilibrio
δq TR (MR q̈ R − QR ) = 0
donde
MR es la matriz de masa, con componentes
"Z
#
Nd
NP
X
∂xk ∂xk X
∂x ∂x
mk
ρl
MRij =
+
dV
∂q
∂q
Ri ∂qRj
Ri ∂qRj
B
j
k=1
l=1
(2.85)
(2.86)
y QR es el vector de fuerzas aplicadas en sólidos rı́gidos, cuyos componentes son
¸
Nf
Nb ·Z
X
∂x
∂xk X
bl
QRi =
fk
+
dV
(2.87)
∂qRi
∂qRi
Bl
k=1
l=1
2.3.1.
Parametrizaciones de sistemas de sólidos rı́gidos
Para implementar las ecuaciones de movimiento para sistemas compuestos
por sólidos rı́gidos es necesario describir las coordenadas de ciertos puntos
con respecto a algún sistema de referencia.
La elección de qué puntos describirán la configuración del sistema y la
referencia de esta descripción definen el tipo de parametrización empleada.
A continuación se exponen los tipos de parametrizaciones empleados normalmente, indicando sus ventajas e inconvenientes.
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
29
Grados de libertad de un sistema de sólidos rı́gidos
El movimiento de un sólido rı́gido en un espacio euclı́deo de dimensión
n, En , se puede describir de manera unı́voca por la posición espacial de un
mı́nimo de n puntos de dicho sólido. Teniendo en cuenta que el total de
parámetros necesarios para definir la posición de n puntos es n2 (incógnitas)
y que la restricción de distancia constante entre n puntos implica la imposición de n condiciones (ecuaciones) para cada punto adicional, el número
de incógnitas independientes en el problema de parametrización de un sólido
rı́gido o, simplemente, los grados de libertad de un sólido rı́gido (GDL) son
n
X
GDL = n −
(i − 1)
2
(2.88)
i=1
que, para un sistema de r-sólidos rı́gidos, con una serie de enlaces o uniones
que aplican s-restricciones de desplazamiento relativo, se convierte en
"
#
n
X
GDL sistema mecánico = r · n2 −
(i − 1) − s
(2.89)
i=1
Coordenadas independientes
Si el número de parámetros empleado en la formulación de la dinámica
del sistema coincide con el número de parámetros grados de libertad del sistema, entonces se denominan coordenadas independientes. Su uso es escaso,
primero, porque es difı́cil sistematizar el proceso de elección de las coordenadas y, segundo, porque se puede demostrar que la configuración de algunos
mecanismos no queda definida de manera única al usar este tipo de coordenadas.
Pongamos el ejemplo clásico de un mecanismo cuadrilátero articulado
bidimensional como el mostrado en la figura 2.5. Si se parametriza mediante
coordenadas independientes, es necesario usar sólo un parámetro al tener un
grado de libertad. Eligiendo el ángulo entre las barras 1 y 4, la configuración
del sistema podrı́a ser también la mostrada en la figura 2.6.
Ası́ pues, aunque conociendo las condiciones iniciales es posible plantear
la simulación a través de coordenadas independientes, problemas como el
anterior se acrecentarán cuando se alcancen los posibles puntos de bloqueo
del mecanismo.
Coordenadas relativas
Este tipo de parametrización se apoya en las libertades relativas de movimiento entre los cuerpos de un sistema para definir la configuración del
mismo. Ası́, cada uno de los parámetros define la magnitud de un grado de
libertad de una junta cinemática.
30
2.3. Formulación de la dinámica de sólidos rı́gidos
barra 2
barra 1
barra 3
θ1 (t)
barra 4
Figura 2.5: Cuadrilátero articulado
barra 2
barra 1
θ1 (t)
barra 4
barra 3
Figura 2.6: Cuadrilátero articulado
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
31
barra 2
θ2 (t)
barra 1
θ3 (t)
barra 3
θ1 (t)
Figura 2.7: Coordenadas relativas. Sistema de cadena abierta
Las coordenadas relativas representan el número mı́nimo de coordenadas
para describir de forma unı́voca la configuración del sistema. En el caso de
sistemas de cadena abierta (figura 2.7), el número de coordenadas relativas
coincide con los grados de libertad del sistema y, por lo tanto, no serán
necesarias ecuaciones de restricción adicionales.
barra 2
θ2 (t)
barra 1
θ1 (t)
θ3 (t)
barra 3
θ4 (t)
Figura 2.8: Coordenadas relativas. Sistema de cadena cerrada
En el caso de sistemas de cadena cerrada como el de la figura 2.8 son
necesarias tantas ecuaciones de restricción adicionales como número de bucles
cerrados haya, multiplicado por los grados de libertad considerados para el
sistema.
Este tipo de parametrización resulta interesante cuando se aplica sobre
sistemas con pocos o ningún bucle cerrado ya que, de otra manera, es necesario un preproceso para analizar que bucles han de ser partidos para simplificar
la formulación.
Coordenadas punto de referencia
Esta parametrización describe la configuración del sistema a través de la
definición de la posición de cada uno de los sólidos que lo componen (figura
2.9). Esta definición se realiza mediante las coordenadas cartesianas de alguno
32
2.3. Formulación de la dinámica de sólidos rı́gidos
de sus puntos (normalmente, el centro de gravedad) y mediante un parámetro
de giro con respecto al sistema inercial de referencia global.
(x2 , y2 )
θ2 (t)
barra 2
(x1 , y1 )
θ3 (t)
θ1 (t)
(x3 , y3 )
barra 1
barra 3
Figura 2.9: Coordenadas punto de referencia
Las principales ventajas frente a la anterior parametrización corresponden a una mayor generalización de la formulación, al poder implementar las
restricciones en coordenadas locales de cada sólido, y también a un mejor
análisis del movimiento de cada cuerpo ya que las incógnitas del problema
describen totalmente el movimiento de todos los cuerpos que componen el
sistema.
Por contra, el número de incógnitas aumenta y, por tanto, también lo
hace el número de ecuaciones de restricción.
(x2 , y2 )
(x3 , y3 )
barra 2
barra 1
barra 3
(x1 , y1 )
(x4 , y4 )
Figura 2.10: Coordenadas naturales
Coordenadas naturales
Si en vez de seleccionar un punto cualquiera de un sólido, como en la
parametrización con coordenadas punto de referencia, se eligen puntos en los
que se unen varios cuerpos, siendo como mı́nimo dos el número de puntos
perteneciéntes a cada cuerpo, no es necesario emplear parámetros de giro que
en el caso tridimensional dificultan la formulación. En este caso, cada punto
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
33
se describe según sus coordenadas cartesianas y cada cuerpo se define por
la posición de varios puntos y, posiblemente, también por unos vectores de
orientación.
En la figura 2.10 se muestra el ejemplo anterior con este tipo de coordenadas. Se comprueba como el número de parámetros necesario para definir el
problema es menor que mediante la parametrización con coordenadas punto
de referencia.
2.4.
Formulación de restricciones
Cuando se analizan sistemas formados por varios cuerpos sólidos, éstos
se encuentran conectados mediante uniones cinemáticas que restringen el
desplazamiento relativo entre los cuerpos que unen.
Se recuerdan primero las coordenadas generalizadas como el conjunto de
parámetros, q i , (i = 1 . . . n-cuerpos), con los que se define la configuración
del sistema (para una descripción de los tipos de parámetros, consultar el
apartado 2.3.1):
q = {q 1 , q 2 , . . . , q n }T
(2.90)
En función de que la restricción de movimiento dependa o no de las derivadas de los desplazamientos, se puede establecer una primera clasificación de
uniones. Cuando las restricciones, Φ, dependen exclusivamente de las coordenadas generalizadas, q, se dice que son restricciones de tipo holónomo:
Φhol = Φ(q)
(2.91)
Mientras que, por el contrario, si dependen de las derivadas de las coordenadas con respecto del tiempo, se denominan restricciones no holónomas:
Φno−hol = Φ(q, q̇)
(2.92)
Recordemos también, que la dinámica de un sistema se puede expresar
mediante la siguiente expresión, independiente de la parametrización:
δq T {M q̈ − Q} = 0
(2.93)
donde:
δq es una variación de las coordenadas generalizadas,
M es la matriz de masa del mecanismo,
q̈ R es la aceleración generalizada,
Q = Q(q, q̇, t) es una función que incluye las fuerzas externas y las
fuerzas internas de los sólidos flexibles.
34
2.4. Formulación de restricciones
De la ecuación 2.93, no se puede afirmar que el término entre llaves sea
nulo ya que si se emplean coordenadas dependientes en la formulación harı́a
falta incluir el efecto de las restricciones con las que son compatibles los
desplazamientos virtuales.
A continuación se exponen los tres principales métodos de imposición de
restricciones.
2.4.1.
Método de los multiplicadores de Lagrange
A partir de la ecuación general es necesario imponer las restricciones para
poder resolver el comportamiento del sistema. El método de los multiplicadores consiste en añadir un término sumando en la ecuación general 2.93, de
la forma:
δq T {M q̈ − Q} + δ(λT Φ) = 0
Quedando el sistema:
δq T {M q̈ + (ΦTq λ) − Q} + δλT Φ = 0
La ecuación anterior se cumple para cualquier variación δq, δλ por lo que
cada sumando es nulo. Si se descompone en dos sistemas que imponen la nulidad de los términos que multiplican a cada variación, se obtiene finalmente
el sistema de ecuaciones algebraico-diferenciales siguiente:
M q̈ + (ΦTq λ) − Q = 0
Φ = 0
(2.94)
(2.95)
El sistema anterior consta de n ecuaciones diferenciales de segundo orden
y p ecuaciones algebraicas. Este tipo de sistemas algebraico diferenciales
se suelen denominar sistemas DAE (differential algebraic equation). Para
facilitar la resolución los sistemas DAE, se pueden imponer las derivadas
nulas de las restricciones. Derivando la expresión Φ = 0 dos veces:
Φ̇ = 0 → Φq q̇ + Φt = 0
dΦq
dΦt
q̇ +
=0
Φ̈ = 0 → Φq q̈ +
dt
dt
(2.96)
(2.97)
Sustituyendo Φ por su segunda derivada y agrupando los miembros segn
la ecuación 2.94, se llega a la siguiente expresión para el sistema conjunto:
·
¸½
¾ ½
¾
M ΦTq
q̈
Q
=
(2.98)
λ
g
Φq 0
donde:
g=−
dΦq
dΦt
q̇ −
dt
dt
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
2.4.2.
35
Método de la penalización
Se basa en la aproximación, en la ecuación 2.94, del vector de multiplicadores λ por un producto entre las ecuaciones de restricción y una matriz de
constantes, que se denomina matriz de penalización, α = αii , tal que
λ'α·Φ
(2.99)
Ası́, se obtiene directamente un sistema ODE de segundo orden en q sin
incógnitas adicionales:
M q̈ + Φq T (α · Φ) − Q = 0
(2.100)
Se puede demostrar que al aumentar indefinidamente los parámetros de
penalización, αii → ∞, las restricciones tienden a imponerse de forma exacta
lo que implica que (α · Φ) → λ.
2.4.3.
Método del lagrangiano aumentado
Se puede considerar una mezcla de los dos anteriores. Si en la ecuación
2.94 se realiza la siguiente sustitución:
λ = α · Φ + λ∗
(2.101)
el sistema se convierte en el siguiente ODE
M q̈ + Φq T (α · Φ) + ΦTq λ∗ − Q = 0
(2.102)
En el que el vector λ∗ se puede considerar una corrección a la penalización
mediante multiplicadores langrangianos.
En la ecuación (2.102) es evidente que Φq T (α·Φ) → 0 sı́ y sólo si λ∗ → λ.
Por lo tanto, si se recurre a un método iterativo en λ∗ que converja hacia λ,
se las restricciones en el sistema convergeran hacia las exactas.
Retomando la idea del método de la penalización, para el que la restricción
se impone con mayor precisión cuanto mayor sea α, se puede afirmar que,
como la restricción exacta corresponde a la impuesta por los multiplicadores
de Lagrange, la siguiente sucesión es monótona, creciente y converge a λ:
λ∗i+1 = λ∗i + α · Φi+1
(2.103)
Si Φi+1 = Φ(q i ) se calcula con la solución en desplazamientos dados por
la iteración en 2.102
M q̈i + (Φq T )i (α · Φi ) + (ΦTq )i λ∗i − Qi = 0
(2.104)
36
2.5. Formulación de sistemas de sólidos rı́gidos y flexibles
2.5.
Formulación de sistemas de sólidos rı́gidos y flexibles
Mediante las distintas parametrizaciones expuestas para representar la
dinámica de cada uno de los sólidos formulados y teniendo en cuenta que
la aplicación de la formulación débil a un sistema compuesto por sólidos
rı́gidos y flexibles sólo necesita añadir a la formulación individual los términos
de fuerza de restricción cruzada (Garcı́a Orden [1999]), la formulación
dinámica discreta tendrá la siguiente expresión:
δq TR · (MR · q̈ R ) + δq TE · (ME · q̈ E ) − δq TE · fint − δq TR · QR − δq TE · QE
+δq TR · [−fΦR − fΦRE ] + δq TE · [−fΦE − fΦER ] = 0
(2.105)
donde
se denota con subı́ndice R los sólidos rı́gidos y con E los elásticos,
se indican las derivadas con respecto de q R como DR y con respecto de
q E como DE , y
los términos fΦRE y fΦER son las fuerzas de restricción acopladas entre
solidos rı́gidos y elásticos.
Si se aplica el método de los multiplicadores de Lagrange para la imposición de las restricciones, se han de añadir las ecuaciones de restricción en la
forma conocida:
Φ=0
(2.106)
La ecuación 2.105 se puede poner en la forma matricial agrupando los
parámetros incógnita en el mismo vector,
M · q̈ = fΦ + fint + Q
(2.107)
En el caso de emplear el método de la penalización o el del lagrangiano
aumentado para imponer las restricciones, se tendrá un vector incógnita:
½
¾
qR
q=
(2.108)
qE
mientras que si se aplica el método de los multiplicadores de Lagrange, se
aumentará el número de incógnitas con tantas adicionales como ecuaciones
de restricción, quedando:


 qR 
q
q=
(2.109)
 E 
λ
Capı́tulo 2. Formulación dinámica no lineal de mecanismos flexibles
2.6.
37
Contactos e impactos
En las simulaciones realizadas mediante técnicas de sistemas multicuerpo,
es habitual que el problema a analizar implique fuerzas internas producidas
por el contacto entre una o varias partes de dicho sistema.
Cuando este contacto se produce a una cierta velocidad se habla en términos de impacto. Aún cuando la velocidad de un impacto es reducida, la reproducción mecánica del mismo en una simulación de sistemas multicuerpo es
tremendamente compleja cuando se desean analizar los fenómenos elásticos
que aparecen en los cuerpos implicados. A medida que la velocidad aumenta,
se producen otros fenómenos tales como la aparición de ondas de tensión u
ondas de choque cuyo estudio en una simulación requiere una potencia de
cálculo altı́sima, no sólo por incluir no linealidades de los materiales por plastificación, sino principalmente por la alta velocidad de propagación de estos
fenómenos.
El impacto es un fenómeno que implica un comportamiento no lineal muy
acusado, por lo que las técnicas de integración directa en el tiempo son completamente imprescindibles. Si existe intercambio térmico, resulta entonces
necesario tener en cuenta la ecuación del balance de energı́a correspondiente
al primer principio de la termodinámica:
ρu̇ =σ : d + ∇ · h + r
(2.110)
donde:
u es la£ energı́a interna por
¤ unidad de masa,
d = 12 ∇ · v + (∇ · v)T , es la velocidad de deformación,
h es el vector de flujo calorı́fico, y
r es la densidad de fuentes de calor.
En función de la velocidad relativa de los cuerpos en los que se se produce el impacto, se puede realizar la siguiente clasificación (propuesta por
Goicolea [2000]):
Baja velocidad (v < 50 m/s): los materiales aún trabajan en su rango
elástico, quizás con alguna plastificación local.
Velocidad media (50 < v < 500 m/s): se produce una plastificación
generalizada en los cuerpos que impactan en toda la zona en la que se
produce este impacto.
Velocidad alta (500 < v < 2000 m/s): en este tramo todavı́a es importante la resistencia viscosa del material.
Velocidad alta (v ≥ 2000 m/s): el material pierde su resistencia y se
comporta ya como fluı́do hidrodinámico.
Capı́tulo 3
Resolución numérica de las
ecuaciones de la dinámica
En el capı́tulo anterior se han expuesto las bases que permiten formular la
dinámica de sistemas de sólidos continuos reales. Además, esta formulación
se ha adaptado a su implementación numérica mediante una semidiscretización espacio-temporal que permite pasar de una formulación continua a otra
discreta en el espacio pero continua también en el tiempo: de los infinitos
grados de libertad de un medio continuo, se pasa a n grados de libertad que
permiten definir un sistema de, como mı́nimo, n ecuaciones a lo largo del
tiempo.
En la búsqueda del sistema de ecuaciones lineal, al que se ha de reducir
cualquier problema para poder implementar una resolución computacional,
se pueden diferenciar las siguientes estrategias empleadas en los tipos de
problemas más usuales:
Los problemas de elementos finitos lineales permiten alcanzar un sistema de ecuaciones lineal, normalmente indicado como M · ü + K · u = f ,
con M y K constantes, aprovechando las simplificaciones en la formulación de los problemas más sencillos —comportamiento lineal del
material, hipótesis de pequeñas deformaciones y pequeños desplazamientos.
El problema más sencillo (figura 3.1) es aquel que plantea un estudio
estático del sistema (ü = 0).
Para problemas lineales dinámicos, el problema formulado en el dominio
del tiempo se resuelve a través del integrador temporal. Existen dos
estrategias de integradores para los problemas lineales. El primer grupo
discretiza la variable independiente (el tiempo, t = ti ) aplicando reglas
de integración de las variables geométricas. Un segundo grupo, llamados
integradores modales, trasladan el problema al dominio de la frecuencia,
desacoplando las ecuaciones de solución y resolviéndolas una a una. Por
lo tanto, este tipo de integradores transforman un problema descrito por
39
40
Mecánica de medios continuos
Sistemas de ecuaciones diferenciales en derivadas parciales PDEs
Discretización del espacio y formulación de Galerkin
Modelo de Elementos Finitos
Sistemas de ecuaciones diferenciales ordinarias ODEs
Comportamiento lineal de material
Pequeñas deformaciones y desplazamientos
Caso estático
MEF Lineal (Kx = f )
Sistema de ecuaciones algebricas AEs
Método de
solución lineal
SOLUCIÓN→ x
Figura 3.1: Esquema de resolución estático aplicando el MEF lineal
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
41
n-ecuaciones diferenciales acopladas a n-problemas descrito cada uno
por una ecuación diferencial; integran cada uno de ellos y trasladan la
solución de nuevo al dominio del tiempo.
Cuando se han de resolver problemas donde se tienen en cuenta no
linealidades de algún tipo, aparece un nuevo elemento en el esquema
de solución (figura 3.2):
El segundo elemento nuevo es el método de solución no lineal (“solver”no lineal ), que realiza un procedimiento iterativo (indicado en el
esquema con el subı́ndice n) para resolver las variables geométricas para
cada paso de tiempo.
Mecánica de medios continuos
Sistemas de ecuaciones diferenciales en derivadas parciales PDEs
Discretización del espacio y formulación de Galerkin
Modelo de Elementos Finitos
Sistemas de ecuaciones diferenciales ordinarias ODEs
Estático
finercia = 0
Integrador
implı́cito
Integrador
explı́cito
Paso de tiempo ti
Sistema de ecuaciones algebraicas no lineal R(x) = 0
Método tipo Newton (n-iteraciones)
Método cuasi-Newton (n-iteraciones)
Paso de solución (ti )n
Sistema de ecuaciones algebricas lineales Ax = b
Método de
solución lineal
Matriz A diagonal
x = A−1 b
SOLUCIÓN→ x
Figura 3.2: Esquema de resolución aplicando el MEF no lineal
Finalmente, para los problemas tradicionales de simulación multicuerpo
de sólidos rı́gidos se aplica el esquema de solución indicado en 3.3 en
el cual, en función del método de aplición de restricciones empleado,
42
se ha de recurrir a un tipo u otro de integrador. Cabe indicar, como se
vio en el capı́tulo anterior, que no siempre se llega a un sistema DAE
cuando se aplica el método de multiplicadores de Lagrange ya que se
pueden imponer las restricciones sobre las derivadas de las coordenadas
generalizadas.
Sistemas de sólidos rı́gidos
Sistema de ecuaciones diferenciales ordinarias ODEs
Imposición de restricciones:
Multipl. de Lagrange
Método de penalización
Lagrangiano aumentado
Sistema de ecuaciones
Reducción de ı́ndice
y posible estabilización
algebraico-diferenciales DAEs
Sistema de ecuaciones
Integrador
implı́cito
especı́fico
DAE
diferenciales ordinarias ODEs
Integrador
implı́cito
Paso de tiempo ti
Sistema de ecuaciones algebraicas no lineal R(x) = 0
Método tipo Newton (n-iteraciones)
Método cuasi-Newton (n-iteraciones)
Paso de solución (ti )n
Sistema de ecuaciones algebricas lineales Ax = b
Método de
solución lineal
SOLUCIÓN→ x
Figura 3.3: Esquema de resolución aplicando técnicas multicuerpo
En este trabajo se propone un esquema de solución como el indicado el
la figura 3.4, en el que se mezclan los
En este capı́tulo se exponen los elementos propios del cálculo numérico en
las variantes más interesantes para la simulación de la dinámica de sistemas
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
43
Sistema de sólidos rı́gidos libres
Sistema de sólidos flexibles
Sist. de ecs. dif. ordinarias ODEs
Sistema de ecs. dif. parciales PDEs
Discretización espacial
+ Formulación de Galerkin
Sistemas de sólidos rı́gidos y flexibles
Sistema de ecuaciones diferenciales ordinarias ODEs
Imposición de restricciones:
Multipl. de Lagrange
Método de penalización
Lagrangiano aumentado
Reducción de ı́ndice
y posible estabilización
Sistema de ecuaciones
algebraico-diferenciales DAEs
Sistema de ecuaciones
Integrador
implı́cito
especı́fico
DAE
diferenciales ordinarias ODEs
Integrador
implı́cito
Integrador
explı́cito
Paso de tiempo ti
Sistema de ecuaciones algebraicas no lineal R(x) = 0
Método tipo Newton (n-iteraciones)
Método cuasi-Newton (n-iteraciones)
Paso de solución (ti )n
Sistema de ecuaciones algebricas lineales Ax = b
Método de
solución lineal
Matriz A diagonal
x = A−1 b
SOLUCIÓN→ x
Figura 3.4: Esquema propuesto para la resolución de sistemas flexibles
44
3.1. Integradores temporales
flexibles. El orden de exposición elegido coincide con el orden en que aparecen
invocados en la resolución de un problema de este tipo: integrador, “solver”no
lineal y “solver”lineal.
3.1.
Integradores temporales
Para la resolución de un sistema ecuaciones diferenciales ordinarias (ODE)
o algebraico-diferenciales (DAE) a lo largo de la variable independiente (tiempo, t) se emplean métodos numéricos con distintas caracterı́sticas.
3.1.1.
Conceptos previos
Antes de realizar una exposición de los distintos tipos de algoritmos de
integración, se enumeran una serie de conceptos importantes (Butcher
[2003], Teschl [2004]).
Forma estándar de un sistema ODE: Una ecuación diferencial ordinaria de orden superior (a uno) o un sistema de orden superior, pongamos
de orden n, se puede reducir a un sistema ODE de primer orden mediante la multiplicación por n de las variables.
En sistemas mecánicos, el orden de las ecuaciones normalmente es de
dos, por lo que un sistema genérico de este orden
q̈ = Q(q̇, q, t)
(3.1)
Se puede poner en la forma estándar
E = ẏ − F (y, t) = 0
(3.2)
realizando el particionamiento
½
y=
q
q̇
¾
(3.3)
queda, finalmente:
d
dt
½
q
q̇
¾
½
−
q̇
Q(q̇, q, t)
¾
=0
Hay que notar que para el sistema descrito en 3.2, se cumple que
y que esta relación nunca es singular.
(3.4)
∂E
=I
∂ ẏ
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
45
Forma estandar de un sistema DAE : Además de realizar un desarrollo
similar al de los sistemas ODE de orden superior, la forma estandar de
un sistema DAE incluye las ecuaciones algebraicas que en dinámica de
mecanismos corresponden a la imposición de restricciones. Los sistemas
DAE aparecidos normalmente en la dinámica de mecanismos tienen la
siguiente estructura funcional:
Mq̈ + ΦTq λ − Q(q̇, q, t) = 0
Φ(q, t) = 0
Empleando la partición


 q 
q̇
y=


λ
(3.5)
(3.6)
(3.7)
Se puede también escribir el sistema anterior de manera similar a 3.2
quedando un sistema diferencial
E = F(ẏ, y, t) = 0
(3.8)
La forma descrita en 3.8 permite definir un sistema DAE como aquel
∂E
cuya matriz
es singular.
∂ ẏ
Índice de un sistema DAE : es un número que corresponde a la cantidad
de derivaciones que es necesario realizar para convertir un sistema DAE
en un ODE en la forma (3.2)
Para reducir el ı́ndice del sistema DAE, la forma más sencilla consiste
en derivar el sistema 3.6. Un problema asociado a esta derivación reside
en que se pasa de imponer las restricciones en q a imponerlas en sus
derivadas, por lo que, debido a errores numéricos, la restricción se acaba
violando.
Para resolver este problema se han propuesto métodos de estabilización
de formulaciones de ı́ndice reducido, que logran un buen compromiso
entre el aumento de precisión y el aumento de tiempo de cálculo que
producen. El método clásico de estabilización de DAEs es el método de
Baumgarte (Baumgarte [1972]), muy difundido debido a su sencillez.
Ecuaciones rı́gidas: los sistemas ODE se dice que son rı́gidos o “stiff” si,
en general, el cociente entre la mayor y la menor frecuencia de oscilación (con bajo amortiguamiento) es muy alto (se suele establecer un
valor entre 20 y 200). Para sistemas ODE lineales, las frecuencias se
calculan como la parte real de los autovalores del sistema pero para los
46
3.1. Integradores temporales
sistemas no lineales, es necesario linealizar en el entorno de un instante
t para estudiar su comportamiento. Por tanto, un sistema ODE no lineal puede pasar de ser rı́gido a no serlo en función del instante y, por
tanto, también de las condiciones iniciales del mismo.
La importancia de este concepto reside en que, mientras los integradores habituales en códigos de elementos finitos son muy eficientes en
sistemas no rı́gidos, se vuelven inestables al tratar sistemas rı́gidos. Los
sistemas rı́gidos de ecuaciones aparecen asociados a sistemas fı́sicos en
los que aparecen oscilaciones en los desplazamientos muy rápidas (vibraciones) solapadas a movimientos suaves (de baja frecuencia). Este
tipo de comportamiento es muy habitual en la simulación de sistemas
flexibles de varios cuerpos.
3.1.2.
Clasificación de integradores
Los métodos de integración de sistemas de ecuaciones diferenciales varı́an
en función del tipo de éste:
Sistemas DAE : Su integración a lo largo del tiempo requiere unos integradores especı́ficos (Brenan et al. [1996], Hairer et al. [1989]),
aunque también es posible —de hecho, es más habitual— reducir el
sistema algebraico diferencial a uno exclusivamente diferencial (ODE)
empleando técnicas de estabilización como las comentadas en el apartado anterior.
Sistemas ODE : Los integradores habituales están diseñados normalmente para este tipo de sistemas en forma estándar. Sin embargo,
existen algunos métodos, como los β−Newmark que se formulan especı́ficamente para sistemas de segundo orden de origen mecánico.
Se van a considerar en la siguiente clasificación los métodos lineales empleados para resolver sistemas ODE en la forma estándar (ec. 3.2) con la
siguiente estructura
#
" k
k
X
X
(3.9)
ak−i xn−i = h ·
bk−i ẋn−i
i=0
i=0
aunque muchas de las caracterı́sticas que se establecen a continuación se
pueden estudiar de manera similar para el resto de métodos.
El algoritmo anterior general describe un método lineal multipaso, ya
que para estimar el valor de la variable xn se emplean los valores de la variable
y/o de su derivada en los k-pasos anteriores.
Además, se puede definir un algoritmo como explı́cito si el término bk =
0. Por el contrario, si bk 6= 0, el método se dice implı́cito porque contiene
a xn en ambos lados de la igualdad, siendo teniendo la suma definida en el
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
47
lado derecho una dependencia implı́cita con xn (concretamente, en el término
ponderado por bk ).
La precisión de un integrador está definida por el orden del algoritmo
empleado. En un método que deriva de una función expresada en serie de
Taylor el orden indica cuantos términos se están teniendo en cuenta. Ası́,
para un método que tenga un orden de cuatro, se esperará un error de orden
O(h5 ).
Para el cálculo del orden del integrador, considérese el funcional lineal
asociado al método multipaso de la ecuación 3.9, donde por simplificar se
supone k = n
Lx =
k
X
[ai x(ih) − hbi ẋ(ih)]
(3.10)
i=0
donde
h = ∆t es el paso de tiempo.
Si x está representada por su serie de Taylor para t = 0, el funcional se
puede expresar como
Lx = d0 x(0) + d1 hẋ(0) + d2 h2 ẍ(0) + · · ·
(3.11)
Si se expanden en serie de Taylor tanto x como ẋ y se sustituyen en 3.10,
se obtiene un polinomio en h en donde se identifican los coeficientes dj , que
en general toman la forma siguiente:
dj =
k µ j
X
i
i=0
ij−1
ai −
bi
j!
(j − 1)!
¶
(3.12)
Para cualquier método multipaso existe un entero m, llamado orden del
método multipaso, para el que se cumple la siguiente condición:
d0 = d1 = · · · = dm = 0 6= dm+1
(3.13)
A igualdad de condiciones, entre dos métodos distintos, suele preferirse
el método de orden mayor.
Desde el punto de la estabilidad, en Dahlquist [1956] se demuestra que
un método de k pasos estable como el mostrado en la ecuación 3.9 no puede
tener un orden mayor que k + 2 (o que k + 1 si k es impar) lo que se conoce
como primera barrera de Dahlquist.
se exponen a continuación los distintos algoritmos de integración que se
emplean en la simulación dinámica, agrupados en familias con caracterı́sticas
comunes.
48
3.1. Integradores temporales
3.1.3.
Integradores multipaso lineales
A partir de los polinomios caracterı́sticos del método de k pasos
p(z) =
q(z) =
k
X
i=1
k
X
ai z i
(3.14)
bi z i
(3.15)
i=1
Se establece la siguiente clasificación:
Familia Adams: poseen un primer polinomio de la forma p(z) = z k − z k−1
ya que surgen de integrar el problema de valor inicial
½
ẋ = f (x, t)
(3.16)
x(t0 ) = x0
entre tn−1 y tn sobre el eje t. Se llega a una solución para la variable
dependiente
Z t
f (x(t))dt
(3.17)
x(tn ) = x(tn−1 ) +
t−1
en la que la integral se puede aproximar mediante un esquema de cuadratura numérica utilizando un polinomio de intepolación
Z t
x(tn ) ' x(tn−1 ) +
P (t)dt
(3.18)
t−1
En caso de que, para el segundo polinomio, bk = 0, entonces el método
es explı́cito y se basa en la fórmula de Adams-Bashforth
x(tn ) = x(tn−1 ) + h
k
X
bi f n−i dt
(3.19)
i=1
El algoritmo más empleado es el basado en la fórmula de AdamsBashforth de orden 5 siguiente:
xn = xn−1 +
¤
h £
1901f n−1 − 2774f n−2 + 2616f n−3 − 1274f n−4 + 251f n−5
720
(3.20)
Los métodos Adams implı́citos (bk 6= 0) están basados en la fórmula de
Adams-Moulton
x(tn ) = x(tn−1 ) + h
k−1
X
i=0
bi f n−i dt
(3.21)
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
49
que para el método de orden 5, es
xn = xn−1 +
¤
h £
250f n + 646f n−1 − 264f n−2 + 106f n−3 − 19f n−4
720
(3.22)
Los métodos de primer orden respectivos se conocen como método de
Euler para la fórmula de Adams-Bashford con k = 1
xn = xn−1 + hf n−1
(3.23)
con su correspondiente equivalente explı́cito (Adams-Moulton), llamado método de Euler implı́cito
xn = xn−1 + hf n
(3.24)
y, finalmente, el método Adams-Moulton de segundo orden —que coincide con la suma de los dos anteriores—, define la regla trapezoidal
xn = xn−1 +
¤
h£
f n + f n−1
2
(3.25)
Familia BDF: (Backward Differentiation Formulae) también llamados métodos de Gear (Gear [1971a] y Gear [1971b]), quien popularizó estas
técnicas. Tienen un segundo polinomio caracterı́stico q(z) = bk z k y se
basan en la diferenciación del polinomio P (t) que interpola x(t) en los
métodos de Adams.
La forma general de los métodos BDF es
k
X
ai xn−i = hbf n
(3.26)
i=0
Destacar de estos métodos que resultan mucho más estables ante sistemas de ecuaciones rı́gidos que los métodos de Adams Moulton del
mismo orden.
El método BDF más simple surge de considerar P (t) una recta entre los
dos últimos puntos conocidos xn , xn−1 . La derivada de este polinomio,
es la pendiente de la recta entre los puntos, por lo que el algoritmo
toma la forma:
xn − xn−1
= fn
(3.27)
h
con lo que se vuelve a obtener el método de Euler implı́cito. Por supuesto, para interpolaciones de mayor orden, el algoritmo BDF no se
parecerá al Adams Moulton del mismo orden. Por ejemplo, comparado con la regla trapezoidal, el algoritmo BDF de segundo orden (y de
50
3.1. Integradores temporales
k
1
2
3
4
5
b
1
a0
1
a1
a2
a3
a4
2
3
6
11
12
25
60
137
4
3
18
11
48
25
300
137
− 13
9
− 11
− 36
25
− 300
137
2
11
16
25
200
137
3
− 25
75
− 137
12
137
Cuadro 3.1: Coeficientes para los métodos BDF de paso constante
paso constante) evalúa sólo una función f pero emplea el valor de tres
incógnitas previas (hasta xn−2 ). Este algoritmo viene dado por
4
1
2
xn = xn−1 − xn−2 + h f n
3
3
3
(3.28)
Las implementaciones de los métodos BDF suelen tener pasos de tiempo
casi constantes y orden variable. Variantes del método, como las implementadas en los paquetes de resolución de ODEs y DAEs (e.g. VODE, http://www.netlib.org/ode/vode.f —descrito en Brown et al.
[1989]—) utilizan la información del paso n para variar el orden de integración y el tamaño del paso h, tanto para el siguiente paso como
para el actual.
En el cuadro 3.1 se indican los coeficientes para los métodos BDF de
hasta orden 5.
3.1.4.
Métodos Runge-kutta
Estos métodos, en contraposición a los anteriores, son de un solo paso y
aproximan las derivadas parciales la serie de Taylor para x(t + h)
x(t + h) = x(t) + hẋ(t) +
h
ẍ(t) + · · ·
2!
(3.29)
donde
ẋ = f (x(t))
ẍ = f t + f x f
x(3) = f tt + f tx f + (f t + f x f )f x + (f xt + f xx f )f
x(4) = . . .
mediante el resarrollo en serie de Taylor de funciones de dos variables
f (t + h, x + hf ) = f + h(f t + f x f ) + · · · + O(hk+1 )
(3.30)
La forma general de los métodos Runge-Kutta de s-etapas es un mapeado
(t, x) → (t + h, x + hb1 k1 + · · · + hbs ks )
(3.31)
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
51
en el que el término en el paso n se calcula con el esquema
xn = xn−1 + h
s
X
bi k i
(3.32)
i=1
con
Ã
ki = f
tn−1 + ci h, xn−1 + h
s
X
!
aij kj
(3.33)
j=1
La matriz de Butcher permite escribir los coeficientes de manera compacta (Butcher [1987]) mediante la partición
Ã
!
c A
(3.34)
bT
donde c = {c1 , . . . , cs }T , b = {b1 , . . . , bs }T y A = Aij . En caso de que la
matriz cuadrada A sea triangular inferior (si ∀(j ≥ i) → Aij = 0), el método
es explı́cito, mientras que si tiene algún término no nulo en la diagonal o por
encima de ella, para (j ≥ i) algún término ki = f (kj , . . . ) 6= 0 y, por tanto,
el método es implı́cito.
Para el método Runge-Kutta clásico (de cuarto orden), la matriz de Butcher es


0 0 0 0 0
 1 1

 2 2 0 0 0 


 1 0 1 0 0 
(3.35)
 2

2


 1 0 0 1 0 
0 16 13 13 16
Método Runge-Kutta Adaptativo
En un intento por conseguir un método Runge-Kutta que ajustara el
tamaño de cada paso automáticamente, se desarrolló un método (consultar
el informe Felhberg [1969] o el artı́culo original Fehlberg [1969]) que,
mediante el empleo de dos métodos a la vez, uno de cuarto orden con cinco
evaluaciones de la función y otro de quinto orden con seis evaluaciones, se
consigue una estimación del error que permite adaptar el tamaño de paso en
cada iteración para hacerlo lo mayor posible para un error máximo dado.
Este método se conoce como Runge-Kutta-Fehlberg y es de orden 5, aunque utiliza una fórmula de orden 4 y otra de orden 5, con las evaluaciones de
los mismos puntos. El esquema es el siguiente:
xn = xn−1 +
x̄n = xn−1 +
6
X
i=1
6
X
i=1
bi ki
(3.36)
b̄i ki
(3.37)
52
3.1. Integradores temporales
con
donde, la ecuación 3.36 se utiliza para el valor de salida ya que tiene
mayor orden, mientras que la ecuación 3.37 es de orden 4 y por lo tanto
b6 = 0 (aunque se necesita definirlo para calcular el error). La diferencia
entre ambas se puede interpretar como una estimación del error global, en ,
cometido en el paso n
en = xn − x̄n =
6
X
(bi − b̄i )ki
(3.38)
i=1
A continuación se presentan, en la matriz de Butcher, los coeficientes para
el método RKF-45 que, aunque se han desarrollado otros posteriormente,
suele ser el que muestra un mejor compromiso entre velocidad y precisión.
La matriz para la ecuación 3.36 (de orden 5) es


0
0
 1
1
 4
4

 3
3
 8
32
 12 1932
 13 2197

 1 429

216
 1
8
−
 2
27
16
0 135
0
0
9
32
7200
2197
−8
2
0
0
0
0
7296
2197
3680
513
− 3680
513
6656
12825
0
0
0
0
845
− 4104
845
− 4104
28561
56430
0
0
0
0
0
− 11
40
9
− 50
0
0
0
0
0
0












(3.39)
2
55
mientras que, tanto para la ecuación 3.37 como para el cálculo del error,
es preferible definir los coeficientes b̄ = b̄i indirectamente, a través de
½
b − b̄ =
3.1.5.
1
128
2197 1 2
, 0, −
,−
, ,
360
4275 75240 50 55
¾
(3.40)
Esquemas predictor-corrector
Las fórmulas presentadas anteriormente, no suelen emplearse por separado sino que se agrupan en esquemas en los que primero se realiza una
predicción para el valor xn mediante un algoritmo explı́cito, se evalúa la función f (xn ) y se corrige un número de veces para, normalmente, terminar
evaluando el valor de la función para el valor último corregido de xn .
El esquema anterior suele denotarse con las siglas P (EC)m o P (EC)E —
en función de que se evalúe finalmente o no f (xn )—. Si m se fija de antemano,
el método globalmente es explı́cito; pero si se establece una condición de
convergencia, se tendrá un método genuinamente implı́cito.
Los métodos que habitualmente se emplean en esquemas P-C son el
ABAM (o ABM) [Adams Bashford]-[Adams Moulton] y los métodos BDF
en los que se realizan predicciones mediante extrapolación de polinomios.
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
3.1.6.
53
Familia β-Newmark
Ampliamente aplicada a la resolución de ecuaciones de la dinámica estructural. Su formulación general, que depende de los parámetros γ y β, se
suele escribir para posiciones y velocidades como
µ
¶
1
xn = xn−1 + ẋn−1 +
− β h2 ẍn−1 + βh2 ẍn
(3.41)
2
ẋn = ẋn−1 + (1 − γ) hẍn−1 + γ ẍn
(3.42)
Para sistemas de ODE en forma estandar, se puede reescribir como
xn = E1 xn−1 + J2 f n + J1 f n−1
donde
E1 =
µ
I hI
0 I
¶
µ
J1 =
¶
0 h2 βI
0 hγI
(3.43)
µ
¶
0 h2 ( 12 − β)I
J2 =
0 h(1 − γ)I
siendo I y 0 las matrices cuadradas identidad y nula, respectivamente, de
dimensión igual a la del problema.
En función de los valores de β y γ se pueden distinguir los métodos más
populares siguientes:
(
γ=0
β-Newmark explı́cito:
β=0
(
γ = 12
Diferencias centrales:
β=0
(
γ = 21
Fox & Goodwin:
1
β = 12
(
γ = 12
Aceleración lineal :
β = 16
(
γ = 12
Regla trapezoidal o método de aceleración constante:
β = 14
(
γ = 12 + α
Aceleración constante modificada:
2
β = (1+α)
4
Las caracterı́sticas más importantes de los métodos de esta familia son
las siguientes:
El método es de segundo orden sı́ y sólo si γ = 21 .
Si γ ≥ 12 , el método es incondicionalmente estable.
En caso de que γ >
frecuencias.
1
2
se produce disipación (amortiguamiento) en altas
54
3.1. Integradores temporales
3.1.7.
Método de Hilber-Hughes-Taylor (HHT)
Debido a la caracterı́stica fórmula del algoritmo, también es llamado
método alpha o HHT-α. Propuesto en Hilber et al. [1977], se basa en
la introducción de amortiguamiento numérico de las frecuencias más elevadas para evitar la desestabilización del algoritmo pero manteniendo el orden
dos de integración.
Suponiendo que la ecuación dinámica se formula mediante
Mq̈ − Q(q, q̇, t) = 0
(3.44)
y que la función Q se puede descomponer en una suma de una función
del tiempo y otra función de las coordenadas y sus derivadas primeras
Q(q, q̇, t) = Qt (t) + Qq (q, q̇)
(3.45)
la expresión general del método toma la forma
[Mq̈]n − (1 − αh )Qqn + αh Qqn−1 = Qtn+αh
(3.46)
donde la notación ¤tn +αh indica la clásica suma α¤n−1 + (1 − α)¤n , es
decir, una evaluación en t = tn + αh h.
3.1.8.
Método de Energı́a-Momento
Se puede interpretar como una modificación de la regla del punto medio,
para la cual se impone la conservación exacta de la energı́a (Simo y Tarnow
[1992]).
Suponiendo como anteriormente que la formulación del problema dinámico es
Mq̈ = Q(q, q̇, t)
(3.47)
se puede poner como
d
dt
½
q
q̇
¾
½
=
q̇
−1
M Q(q, q̇, t)
¾
(3.48)
El método se puede expresar mediante la fórmula modificada de la regla
del punto medio, que se caracteriza por la ecuación siguiente
ẋn = ẋn−1 + hfn− 1
2
(3.49)
que, sustituyendo la partición 3.48 y modificando la ecuación del cálculo
de velocidades queda
q̇n = q̇n−1 + σhM−1 Qn− 1
(3.50)
2
1
qn = qn−1 + h(q̇n − q̇n−1 )
(3.51)
2
donde el coeficiente σ se elige adecuadamente para que la energı́a total
E = T + V se conserve
∆E = En − En−1 = Tn + Vn − Tn−1 − Vn−1 = 0
(3.52)
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
3.2.
55
Métodos de solución de sistemas algebraicos no lineales
Para un sistema de ecuaciones algebraico expresado en forma residual, se
plantea el problema de calcular las raı́ces del residuo
R(q) = 0
(3.53)
Los métodos que se exponen a continuación se basan en un esquema
iterativo en el que, en cada paso, se resuelve una aproximación lineal del
residuo R (Luenberger [1989], Crisfield [1991]).
3.2.1.
Método de Newton
Este método se basa en una aproximación del valor de la función residuo
en el entorno de un punto conocido q mediante la serie de Taylor truncada
de la siguiente forma:
R(q + h) ' R(q) + R0 (q)h + O(h2 )
(3.54)
lo que en el paso k + 1, en el que se conocen los valores en k se traduce
en la igualdad
0 = R(qk+1 ) ' R(qk ) + R0 (qk )hk
(3.55)
donde R0 (q) es el jacobiano del residuo. La anterior ecuación se puede
plantear como un sistema lineal en hk , con lo que, al resolverla mediante un
método lineal (ver siguiente apartado)
¯
∂R ¯¯
· hk = −Rk
(3.56)
∂q ¯k
se pueden calcular las coordenadas generalizadas del paso k + 1 como
qk+1 = qk + hk
(3.57)
Hay que destacar que el método de Newton muestra una convergencia
cuadrática, de forma que el error de cada iteración ²i = x − xi se reduce
proporcionalmente a su cuadrado
²i+1 ' −²2i
R00 (x)
2R0 (x)
(3.58)
aunque el coste computacional es alto ya que se ha de calcular la tangente al
residuo en cada iteración.
Para intentar reducir la exigencia de cálculo que implica esta última observación, se plantean numerosas variantes entre las que se destancan los
métodos modificados y cuasi-Newton que se exponen en los dos siguientes
apartados.
56
3.2. Métodos de solución de sistemas algebraicos no lineales
3.2.2.
Método de Newton modificado
Si en vez de calcular el jacobiano del residuo en cada iteración,
¯
∂R ¯¯
Jk =
∂q ¯k
se utiliza la misma estimación del jacobiano cada m-iteraciones,
¯
∂R ¯¯
Jk = J(n·m)+i =
∂q ¯m
(3.59)
(3.60)
donde:
i = {1, 2, . . . , m}
n = {1, 2, . . . }
k = {1, . . . , m, . . . , (n · m) + i, . . . }
Se divide por m el número de veces que hace falta calcular el jacobiano,
aunque se pierde la propiedad de convergencia cuadrática.
3.2.3.
Métodos cuasi-Newton
El principal método, llamado método de la secante se basa en una aproximación del jacobiano (tangente al residuo), Jk ' Kk , de forma que se cumpla
la condición de secante dada por
Rk+1 − Rk = Kk+1 (qk+1 − qk )
(3.61)
De forma más compacta, la ecuación 3.61 se puede poner como
yk = Kk+1 dk
(3.62)
donde
yk = Rk+1 − Rk
dk = qk+1 − qk
Las matrices Kk+1 que satisfacen estas ecuaciones proporcionan la solución exacta en el caso de que R(q) derive de un funcional cuadrático y
casi exacta si ese funcional no es cuadrático pero es estrictamente convexo
(Geradin et al. [1983]).
Observación 4 Si R(q) deriva de un funcional cuadrático, entonces el problema se puede enunciar como un problema de minimización del funcional
F = F(q) = 12 qT Qq−bT q sin restricciones, donde Q es simétrica y definida
positiva, como ahora se verá. En este caso, las condiciones de minimización
necesarias son
∇F(q) = 0 −→ R(q) = Q q − b = 0
∇2 F(q) > 0 −→ K(q) = Q > 0
(3.63)
(3.64)
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
57
Una forma sencilla de calcular Kk+1 es mediante una descripción recursiva
que, a partir del valor en la iteración precedente, realiza una corrección de
primer orden como la siguiente:
Kk+1 = Kk +
(yk − Kk dk )uTk
uTk dk
(3.65)
donde uk es un vector que cumple uTk dk 6= 0 (condición de no ortogonalidad).
En la práctica, la implementación del método requiere del cálculo de la
inversa de Kk+1 , Gk+1 = K−1
k+1 que cumple
dk = Gk+1 yk
(3.66)
Recurriendo a la fórmula de Sherman-Morrison para el cálculo de inversas
de una matriz descompuesta de la siguiente forma:
(A + αabT )−1 = A−1 − α
A−1 abT A−1
1 + αbT A−1 a
(3.67)
La actualización de la inversa, a partir de 3.65 se puede poner como
Gk+1 = Gk +
(dk − Gk yk )vkT
vkT yk
(3.68)
donde, al igual que con uk en 3.65, en este caso vk son vectores arbitrarios
con la condición de que no son ortogonales a yk , tal que vkT yk 6= 0.
La primera versión de este algoritmo, Broyden [1965], simplemente
imponı́a vk = GTk dk , con lo que Gk+1 se aproximaba mediante
Gk+1 = Gk +
(dk − Gk yk )dTk Gk
dTk Gk yk
(3.69)
La versión de Davidon conserva la posible simetrı́a de Gk haciendo vk =
dk − Gk yk , consiguiendo:
Gk+1
(dk − Gk yk )(dk − Gk yk )T
= Gk +
(dk − Gk yk )T yk
(3.70)
Para evitar el mal condicionamiento de la matriz Gk+1 cuando k aumenta,
se han desarrollado fórmulas de corrección de segundo orden, que consiguen
que la matriz siga siendo definida positiva.
Si se desea mantener Hk+1 definida positiva, su inversa se puede calcular
según la fórmula de Davidon-Fletcher-Powell (DFP)
Gk+1 = Gk +
dk dTk
Gk yk ykT Gk
−
dTk yk
ykT Gk yk
(3.71)
58
3.3. Métodos de solución de sistemas algebraicos lineales
Sin embargo, si se quiere mantener Gk+1 definida positiva, entonces resulta útil la fórmula de Broyden-Fletcher-Goldfarb-Shanno (BFGS)
µ
¶
µ
¶
dk ykT
yk dTk
dk dT
Gk+1 = I − T
Gk I − T
+ T k
(3.72)
yk dk
y k dk
y k dk
volviendo al cálculo de Hk+1 , para cada método anterior se pueden realizar
las siguientes sustituciones
dk ¿ y k
G∗ → H ∗
(3.73)
y se obtiene la matriz buscada permutando el método para el que están
definidas en Hk+1 , es decir, 3.71 corresponderı́a a la formulación BFGS mientras que 3.72 corresponderı́a a la formulación DFP.
A partir de las fórmulas DFP y BFGS se puede definir la siguiente familia
de métodos de actualización, conocida por familia de Broyden (Luenberger
[1989]), definida por
Hφ = (1 − φ)HDF P + φHBF GS
3.3.
(3.74)
Métodos de solución de sistemas algebraicos lineales
Para la resolución de sistemas de ecuaciones del tipo
Ax = b
(3.75)
es necesario aplicar técnicas que sean sistemáticas y que minimicen los
errores de truncación numérica en el cálculo debidos al empleo de precisiones
finitas de coma flotante.
A continuación se exponen las técnicas más empleadas separándolas en
dos grandes grupos: de cálculo directo e iterativos. En función de la dimensión
del sistema de ecuaciones a resolver, será más conveniente emplear unas u
otras (Kincaid y Cheney [1994]).
3.3.1.
Métodos directos
Los métodos directos consisten en algoritmos que operan la matriz con
una cierta estrategia tal que encuentran una solución para el sistema en un
numero finito de pasos y sin más errores que los de redondeo (Shampine
et al. [1997]).
El Método de Gauss con sus variantes, constituye la base de los métodos
de resolución directa de sistemas de ecuaciones lineales.
La aplicación sistemática del método de Gauss implica la formación de
la matriz triangular superior (U) en la fase de avance (factorización) o de
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
59
eliminación hacia delante y la eliminación hacia atrás o fase de remonte
(solución) del sistema triangularizado.
Si existe algún elemento nulo en la diagonal principal de la matriz A, el
método general falla y es necesario realizar una permutación previa.
La descomposición LU de matrices, permite descomponer cualquier matriz en un producto de una matriz U triangular superior (y con elementos en
la diagonal iguales a la unidad) y otra L triangular inferior.
Para minimizar los errores numéricos, los pivotes deben ser los elementos
mayores de la diagonal. La operación de reordenación de filas y columnas se
denomina permutación y se asocia a una matriz P.
Realmente, la descomposición LU se aplica conjuntamente con el método
de Gauss para resolver los sistemas lineales. Suponiendo que se efectúa permutación y teniendo en cuenta que, tras la fase de avance queda un sistema:
PAx = LUx = Pb
(3.76)
donde LU se obtiene de un algoritmo modificado de eliminación gaussiana; la fase de solución comprende la resolución de dos ecuaciones:
Lz = Pb
Ux = z
(3.77)
(3.78)
La primera se conoce como sustitución hacia delante y la segunda como
sustitución hacia atrás.
Se conoce como factorización de Cholesky a aquella aplicable únicamente
a matrices reales, simétricas, y definidas positivas de la forma
A = LLT
(3.79)
donde L es una matriz triangular inferior con diagonal positiva.
Los elementos de la diagonal de la matriz L = lkk se calculan mediante
la fórmula
! 21
Ã
k−1
X
2
lks
lkk = akk −
(3.80)
s=1
Y, una vez calculado para la columna k, el resto de elementos de la columna lik , i > k se calculan mediante
Ã
!
k−1
X
1
lik =
aik −
(lis lks )
(3.81)
lkk
s=1
3.3.2.
Métodos iterativos
En contraste con los métodos directos, los iterativos consisten en algoritmos que dan una serie de vectores que convergen hacia la solución del
sistema. Su importancia radica en su capacidad para encontrar soluciones
60
3.3. Métodos de solución de sistemas algebraicos lineales
con un nivel razonable de precisión en un número no muy elevado de operaciones. Por este motivo, se prefieren para la resolución de sistemas grandes
(miles de ecuaciones) frente a los métodos directos.
Los métodos más sencillos son los siguientes:
método de Richardson para el que la fórmula iterativa en k es
(k)
xi
(k−1)
= xi
+ bi −
n
X
(k−1)
aij xj
(3.82)
j=1
método de Jacobi con fórmula
Ã
!
n
X
1
(k)
(k−1)
xi =
bi −
aij xj
aii
j=1
con
j 6= i
Método de Gauss-Seidel
Ã
!
i−1
n
X
X
1
(k)
(k)
(k−1)
xi =
bi −
aij xj −
aij xj
aii
j=1
j=i+1
(3.83)
(3.84)
Cuando A es una matriz simétrica y definida positiva, esto es
AT = A,
xT Ax > 0 para x 6= 0
(3.85)
entonces el problema a resolver Ax = b es equivalente al de minimizar la
forma cuadrática
q(x) = xT Ax − 2xT b
(3.86)
y se pueden emplear unos métodos iterativos especiales, que se exponen a
continuación.
El método del descenso más rápido se deduce de emplear un vector v para
el avance de la solución que apunte en la dirección del residuo r(k) = b−Ar (k) .
Formalmente, cada iteración se calcula mediante
¸
·
(v (k) )T v (k)
(k)
(k−1)
v (k)
(3.87)
x =x
+
(v (k) )T Av (k)
Por último, el método del gradiente conjugado se basa en elegir unas
direcciones de búsqueda v (i) tal que formen un sistema A-ortonormal, en el
que se cumple
(v (i) )T Av (j) = 0
(3.88)
siempre que i 6= j.
Para este tipo de sistemas, Hestenes y Stiefel [1952] forman un
sistema A-ortogonal a partir de imponer que los residuos r(k) = b − Ar (k)
formen un sistema ortogonal, es decir, (r(i) )T r(j) = 0 para i 6= j.
Capı́tulo 3. Resolución numérica de las ecuaciones de la dinámica
61
Con estas condiciones, se establece un método iterativo que converge en
un número finito de pasos a la solución exacta mediante las ecuaciones:
·
¸
(rk−1 )T rk−1
k
k−1
x = x
+
v k−1
(3.89)
k−1
T
k−1
(v ) Av
·
¸
(rk−1 )T rk−1
k
k−1
r = r
+
Av k−1
(3.90)
(v k−1 )T Av k−1
¸
·
(rk )T rk
k
k
v k−1
v = r +
(3.91)
(rk−1 )T rk−1
con r (0) = v(0) = b − Ax(0)
En sistemas mal condicionados se aplica una variante llamada método
del gradiente conjugado precondicionado. Es practicamente el único que se
emplea en la práctica por lo que, debido a su importancia, se han desarrollado
multitud de implementaciones distintas. Aunque no se van a abordar los
detalles del mismo, se puede consultar una extensa revisión en Barrett
et al. [1993].
Capı́tulo 4
Entornos de desarrollo. Estado
del arte
Con el objetivo de conocer las herramientas de que se dispone para realizar simulaciones como las descritas en anteriores capı́tulos, se ha realizado
una búsqueda intensiva que incluye algunas pruebas y experiencias de las
aplicaciones expuestas.
Como resultado de este estudio, a continuación se presenta una introducción a las aplicaciones de simulación con una sucinta descripción de las
diferencias principales entre las herramientas comerciales y las de investigación. Con el fin de sentar las bases para la programación informática que
se describirá posteriormente, se realiza también un análisis de los distintos
lenguajes de programación que se suelen emplear para aplicaciones de simulación. Finalmente, se realizan algunos comentarios acerca de herramientas
de asistencia a la programación y de entornos que integran multitud de ellas,
lo que produce una simbiosis realmente productiva.
4.1.
Herramientas comerciales de simulación
mecánica
Las herramientas informáticas comerciales capaces de realizar simulaciones de sistemas de sólidos se pueden dividir en tres grandes grupos: códigos
multicuerpo, códigos MEF y entornos matemáticos.
Aunque lentamente se va produciendo una convergencia entre las capacidades de análisis que poseen tanto los códigos multicuerpo como los MEF,
existen algunas diferencias notables que hacen que se puedan clasificar de
forma independiente.
Los códigos multicuerpo representan unas herramientas altamente especializadas en el tratamiento de sistemas de sólidos —normalmente la especialización se concreta en sistemas de sólidos rı́gidos—. Como contrapunto, el
desarrollo en la última decada de los códigos MEF ha tendido hacia la generación de herramientas de uso general donde la multifı́sica representa el estado
63
64
4.1. Herramientas comerciales de simulación mecánica
del arte en simulación. Debido al campo tan amplio que abarcan estas herramientas, no se muestran tan eficientes en el análisis de sistemas de sólidos
aunque en muchos casos es más un problema de diseño de la entrada/salida
que de capacidad de cálculo de los módulos de solución.
Los entornos matemáticos de simulación también se caracterizan por permitir análisis muy diversos ya que se corresponden con herramientas de álgebra y cálculo computacional. La popularidad en el uso de estas herramientas
ha permitido su crecimiento y evolución hacia entornos que ofrecen asistencia
al usuario en la generación de las ecuaciones que rigen el problema que desea
estudiar. A pesar de la alta flexibilidad que ofrecen, la dificultad del modelado de sistemas mecánicos y del análisis de resultados hacen muy complicado
su aplicación en problemas de una mı́nima complejidad.
A pesar de lo anterior, el empleo de los entornos matemáticos como lenguaje de programación de alto nivel —cada vez más eficiente numéricamente—
permite la generación de pequeñas aplicaciones adaptadas a necesidades concretas.
Hay que resaltar la tendencia no muy exitosa de incorporar capacidad
de simulación multicuerpo a los paquetes CAD/CAM/CAE como las creadas por Dassault Systemes (Catia [2005]) o por PTC (Pro/ENGINEER
[2005]). Los principales motivos para que estas herramientas no hayan tenido mejor acogida son una menor flexibilidad en la simulación debido a su
orientación al usuario tradicional de CAD/CAM, ası́ como la existencia de
formatos neutros de intercambio de datos de sólidos como y el estándar ISO
10303 (STEP [2005], ver ISO [1994]), que permiten aprovechar la capacidad de generación de geometrı́as complejas en un entorno CAD y trasladarla
a un entorno multicuerpo sin pérdida de detalle ni operaciones costosas.
4.1.1.
Códigos multicuerpo
Representan las herramientas tradicionales en el estudio y simulación de
sistemas compuestos por varios cuerpos sólidos con uniones. A continuación
se listan los principales programas con distinto grado de especialización, junto
con una breve descripción de los mismos.
MSC.ADAMS (Automatic Dynamic Analysis of Mechanical Systems,
ADAMS [2005]): es una completa colección de módulos de simulación que automatizan procesos de diseño y validación de modelos para
diversos campos de la mecánica. El núcleo es el módulo de solución
(ADAMS/Solver) cuyas caracterı́sticas principales se orientan hacia la
estabilidad y rapidez del proceso de cálculo. la parametrización de los
distintos elementos del sistema mecánico.
CarSim/TruckSim/BikeSim (CarSim [2005]): Familia de programas enfocados a la simulación de la dinámica vehı́cular de automóviles,
camiones y motocicletas que emplea modelos multicuerpo de hasta 600
Capı́tulo 4. Entornos de desarrollo. Estado del arte
65
parámetros. Para ciertos modelos, la velocidad de cálculo es mayor que
el tiempo simulado por lo que permite simulación en tiempo real incluso
con conexiones a equipos de control electrónico reales como centralitas
(ECU) de ABS (control de frenada), TCS (control de tracción), etc.
TNO MADYMO (MADYMO [2005]): Programa especializado en
el análisis de la seguridad de ocupantes de vehı́culos. Integra la simulación multicuerpo de la biomecánica del cuerpo humano con el análisis
de los elementos estructurales deformables mediante modelos MEF y
simulación explı́cita. Los modelos multicuerpo son capaces de incluir
los efectos de la flexibilidad para el análisis de lesiones a través de
subsistemas de elementos finitos descritos según referencia flotante.
RecurDyn (RecurDyn [2005]: colección de módulos de simulación
multicuerpo con capacidades para simular sólidos tanto rı́gidos como
flexibles (basados en formulaciones MEF lineal y no lineal). En función del módulo, se pueden realizar análisis estáticos, de sensibilidad,
de vibración, con sistemas de control. Ası́ mismo, permite el trabajo
con subsistemas de sólidos. Su caracterı́stica principal es la velocidad
de simulación, gracias a la formulación recursiva mediante coordenadas relativas, integradores stiff (DASSL y BDF) y empleo de jacobiano
analı́tico. Con respecto a la capacidad de simular sólidos flexibles, permite tanto una formulación lineal modal (en dominio de la frecuencia)
como formulación no lineal relativa. Además, posee un tipo de elemento
para simular el comportamiento flexible de placas, correciones dinámicas y análisis de contactos.
SIMPACK (SIMPACK [2005]): Probablemente, el código multicuerpo que mejores caracterı́sticas tiene en el tratamiento de sólidos
flexibles, para los que incluye técnicas como integración paralela en el
dominio de la frecuencia(Dietz et al. [2003]), inclusión de efectos no
lineales en vigas (Wallrapp [2002]) y de endurecimiento geométrico
(Wallrapp y Schwertassek [1991]), y análisis de contactos entre
sólidos flexibles. También posee módulos especı́ficos para el tratamiento
de sistemas y subsistemas en automoción, aeronáutica, etc. Está escrito en un lenguaje orientado a objetos (C++) y emplea las librerı́as de
Trolltech (Qt [2005]) para la interfaz gráfica de usuario, lo que permite
su uso en una gran variedad de plataformas.
Universal Mechanism (Universal Mechanism [2005]): Sorprendente programa desarrollado en Rusia por el Prof. Dmitry Pogorelov de
la Universidad Técnica de Bryansk State. De uso general en la dinámica de sistemas, también posee módulos especializados de análisis lineal
(vibraciones), ferrocarriles, optimización, subsistemas, automoción y
sólidos flexibles (referencia flotante). Los métodos de integración implementados incluyen un esquema PEC explı́cito basado en BDF de
66
4.1. Herramientas comerciales de simulación mecánica
orden y paso variables (hasta orden 5), PECE-ABAM explı́cito de paso y orden variables (hasta orden 11) y, finalmente, un método para
sistemas ODE y DAE stiff (rı́gidos) de orden fijo (orden 2) y paso
variable (Uni [2002]).
LMS Virtual.Lab Motion (Virtual.Lab Motion [2005]): evolución del conocido entorno DADS (Dynamic Analysis and Design System), es muy similar a ADAMS en cuanto a la capacidad de simulación
ya que incluye posibilidad para simular contactos, variables paramétricas, flexibilidad mediante referencia flotante, etc. ası́ como un numeroso
catálogo de módulos de pre y post-proceso para aplicaciones especı́ficas
(vehı́culos terrestres y aeronáuticos, motores, etc.).
4.1.2.
Códigos MEF
En esta sección se han agrupado aquellos programas cuya finalidad principal es la aplicación de discretización mediante elementos finitos para la
resolución de las ecuaciones en derivadas parciales fruto de formulaciones
de la fı́sica. La caracterı́stica común de los grandes conjuntos de programas
que existen actualmente es que nacieron como pequeñas aplicaciones para la
resolución de problemas concretos. Según han ido creciendo, el número de
problemas que eran capaces de resolver se ha ido ampliando hasta convertirse en herramientas flexibles y realmente capaces de abordar problemas de
multifı́sica.
Aún cuando el número de programas de este tipo es mucho mayor que el
de los códigos multicuerpo, también las diferencias entre ellos son menores.
Por tanto, sólo se citan algunos de los más usados a modo de ejemplo en
cuanto a sus posibilidades de simulación.
ANSYS (ANSYS [2005]): Se trata de una suite de simulación en el
campo de la multifı́sica, que permite el estudio de fenómenos mecánicos, térmicos, electromagnéticos, etc. También admite la simulación de
problemas acoplados, siendo la última versión la primera que permite
el estudio acoplado fluı́do-estructura mediante mallas ALE (arbitrary
lagrangian eulerian).
Con respecto a la capacidad de simulación multicuerpo, es posible generar modelos de sólidos rı́gidos y flexibles, aunque no dispone de las
herramientas de ayuda al modelado de sistemas concretos, toma de
datos, optimización de parámetros o enlaces con sistemas de control
que sı́ que ofrecen los códigos multicuerpo. No obstante, parece que se
intenta mejorar la capacidad de simulación multicuerpo ya que, en la
última versión, se ha modificado la formulación de sólidos rı́gidos y se
ha pasado de imponer la rigidez mediante multiplicadores de Lagrange
a realizar una eliminación de parámetros que, sin duda, aumentará la
velocidad de simulación en sistemas de varios cuerpos.
Capı́tulo 4. Entornos de desarrollo. Estado del arte
67
Programas similares a éste son Abaqus (Abaqus [2005]), Nastran/Patran
—ahora integrados en MSC.SimOffice (SimOffice [2005])—, Master
Fem (anteriormente I-DEAS, NX Master Fem [2005]), etc. Hasta
118 referencias comerciales se pueden encontrar en IFER [2005].
LS-Dyna (LS-Dyna [2005]): heredero de los antiguos Dyna2D y Dyna3D, es el mejor exponente de los programas especializados en simulación de fenómenos altamente no lineales, simulados a través de
análisis explı́citos. Al igual que los mencionados anteriormente, ha ido
perdiendo su caracter especializado y se ha convertido en un código de
uso general, permitiendo ahora numerosos análisis que incluyen desde
sólidos rı́gidos a métodos libres de malla (meshfree methods).
Samcef Mecano (Samcef Mecano [2005]): forma parte de un conjunto de herramientas de simulación mediante MEF, donde se destaca
una herramienta de simulación multicuerpo (Mecano Motion) que, desde el punto de vista de interfaz, se parece más por su funcionalidad a los
códigos del grupo anterior. Sin embargo, al estar basada en un código
MEF, las simulaciones de elementos flexibles emplean realmente una
formulación no lineal y no aproximaciones lineales modales o a través
de referencias flotantes.
4.1.3.
Entornos matemáticos
Los programas que se han englobado en esta categorı́a tienen una caracterı́stica común: se centran en ofrecer al usuario asistencia en la resolución de
ecuaciones matemáticas. De hecho, era precisamente ésta su única función
cuando se comenzaron a comercializar. Destacan su gran flexibilidad para
resolver numerosos tipos de problemas pero también la necesidad de implementar en ellos las ecuaciones que rigen el fenómeno que se desea estudiar.
Debido a la flexibilidad que ofrecen, funcionan (casi) como un lenguaje
de programación de nivel superior —de hecho, algunos ya lo son (MatLab
[2005])— y gracias a esta caracterı́stica, su crecimiento se ha producido a
través de módulos. Éstos no son sino programas creados en el propio lenguaje e implementan funcionalidades para agilizar el proceso de simulación
mediante la generación automática de las ecuaciones.
Los paquetes más empleados y conocidos son el citado anteriormente
MatLab, Macsyma (Macsyma [2005]), Mathematica (Mathematica [2005]), Maple (Maple [2005]) y LabVIEW (LabVIEW [2005]);
aunque sin duda el de mayor interés y que ha servido de ejemplo para este
trabajo es el entorno de desarrollo para la solución de ecuaciones en derivadas
parciales Diffpack (Diffpack [2005]).
68
4.2.
4.2. Herramientas de investigación para la simulación mecánica
Herramientas de investigación para la simulación mecánica
Las necesidades de cálculo y simulación de la industria no coincide, como
es previsible, con las que tienen los centros de desarrollo de conocimiento tales
como universidades y centros de investigación. Por ello, frente a las aplicaciones comerciales, que tratan de cubrir las necesidades de la industria, se han
desarrollado numerosas aplicaciones con un enfoque distinto, que permiten
implementar las nuevas teorı́as y métodos que surgen de la investigación y
conocimiento cientı́fico.
Las diferencias fundamentales entre las herramientas comerciales y las
de investigación surgen ya desde que se comienza a planear el proyecto de
programación. Y es que, mientras que las primeras suelen ser planeadas con
mayor detalle —ya que son el objetivo principal del trabajo de la organización que las desarrolla—, las segundas suelen empezar a generarse como
herramienta secundaria en el marco de una investigación. Por tanto, aunque
no es el caso de todas las aplicaciones de investigación, al estar enfocadas a
la resolución de problemas particulares, es difı́cil reciclarlas para su uso en
otro problema.
Hay una tendencia a cambiar la situación descrita anteriormente que tiene
su origen en dos conceptos fundamentales, no sólo para la simulación mecánica, sino para todo el campo cientı́fico e incluso también comercial. Se trata,
por un lado, de las técnicas de programación orientada a objetos (POO) y,
por otro, del desarrollo del llamado software libre. La POO es casi una filosofı́a de programación cuyo pilar fundamental es la división del código y
que permite simplificar la programación y aumentar el reciclaje de código
existente, entre otras cosas. El software libre consiste en la publicación (o
liberación), no sólo de los programas, sino del código realizado para permitir
su difusión, uso y modificación a la comunidad.
La colaboración en el desarrollo de herramientas está permitiendo la generación de aplicaciones cada vez mejor adaptadas al uso externo al programador y que, a la vez, ayudan a la realización de otras investigaciones.
Estas aplicaciones muchas veces están basadas en librerı́as de cálculo, que
no son otra cosa que colecciones de clases, funciones y procedimientos que
implementan rutinas comunes en el campo al que se refieren.
A continuación se enumeran algunas de las herramientas de investigación
que están en fase de desarrollo actualmente como ejemplo de otros muchos
proyectos de programación que están en marcha en el campo de la simulación
mecánica (consultar McPhee [2005] para una referencia de algunos otros).
También, en un apartado posterior, por su importancia para el desarrollo
de se han querido citar algunas de las librerı́as de cálculo orientadas a la
simulación de mecanismos.
Capı́tulo 4. Entornos de desarrollo. Estado del arte
4.2.1.
69
Aplicaciones de simulación multicuerpo
En general, los programas plenamente funcionales suelen adolecer de una
gran dificultad en su uso, principalmente porque la entrada de datos se realiza
en modo texto y no existe homogeneidad entre la forma de cada aplicación.
Por contra, una vez aprendida se consigue gran rapidez en la realización de
una simulación y una salida de datos que, en función del programa, puede
tener formato exclusivamente numérico o se realiza a través de alguna facilidad para el postproceso. Los siguientes programas se destacan principalmente
porque su desarrollo todavı́a está activo y, por tanto, incorporan algunos de
los últimos avances en programación y simulación o los incorporarán en el
futuro.
MBSoft (Logiciel de simulation et d’analyse de systèmes mécaniques
articulés, MBSoft [2005]): es un completo programa de simulación de
sistemas de sólidos rı́gidos, cuyo objetivo es la posibilidad de realización
de estudios cinemáticos y dinámicos de sistemas mecánicos articulados
aunque permite numerosos tipos de uniones. Su punto fuerte es la generación de las ecuaciones que rigen el movimiento del sistema en formato
simbólico automáticamente. A partir de ellas, permite la realización de
simulaciones cinemáticas, dinámicas (directas e inversas), de equilibrio,
modales y sensibilidad. Permite la medición directa de las fuerzas, posiciones, velocidades y aceleraciones en cualquier punto. Gracias a la
posibilidad de definir subsistemas, se puede trabajar con bibliotecas
que agilizan la creación de modelos de entidad superior.
MBDyn (Multibody Dynamics Software, MBDyn [2005]): Se trata de
un programa libre, distribuido bajo licencia pública general del proyecto GNU (GNU GPL [2005]). Probablemente, uno de los proyectos de
programación libre más completos ya que permite la simulación de sistemas mecánicos multifı́sicos, teniendo en cuenta la mecánica no lineal
de sólidos rı́gidos y flexibles con uniones, materiales inteligentes, redes
eléctricas, sistemas de control activo, redes hidráulicas y aerodinámicas de rotores y alas fijas. Además, al permitir enlaces dinámicos de
módulos creados por los usuarios, la librerı́a de elementos disponibles
es cada vez mayor.
4.2.2.
Librerı́as de cálculo
Son colecciones de archivos que permiten ejecutar rutinas como cajas
negras, es decir, sólo hay que saber los parámetros de entrada y saber el tipo
de salida esperado y el la librerı́a se encarga del resto. Para la simulación
multicuerpo, las más extendidas son las dos siguientes:
ABDULA (Articulated Body Dynamics Using Low-complexity Algorithms, Abdula [1999]): es una librerı́a escrita en C++ para la simulación de sistemas de sólidos rı́gidos que puede hacerse funcionar como
70
4.3. Lenguajes de programación
un programa independiente o como parte de un programa mayor. Sus
caracterı́sticas más interesantes son la capacidad de simular gran cantidad de contactos a la vez (hasta varias decenas de miles) mediante
la jerarquı́a de superficies de contacto y la posibilidad de emplear varios esquemas de integración, algoritmos de solución de sistemas de
ecuaciones lineales y técnicas de estabilización de la imposición de las
restricciones de movimiento. Por contra, no tiene posibilidad de simular partı́culas o sólidos deformables, contactos entre superficies complejas ni fuerzas de rozamiento en el contacto. Parece que su desarrollo
está parado desde 1999.
DynaMechs (Dynamics of Mechanisms, DynaMechs [2001]): Desarrollado desde 1991 para cubrir las necesidades de simular sistemas
mecánicos e hidrodinámicos en tiempo real. Está implementado en C++
y permite la compilación para varias plataformas, permite la simulación
de sistemas definidos en serie, en árbol o con bucles cerrados. Además,
posee varios integradores temporales y es fácilmente extensible gracias
a su esquema de clases. La última versión (4.0pre1) data de Julio de
2001, por lo que se desconoce si su desarrollo sigue activo. También hay
disponible una interfaz de usuario que facilita la generación de modelos
y estudio de resultados (RobotBuilder [2003]).
4.3.
Lenguajes de programación
Desde que crearon los ordenadores, se han desarrollado muchos tipos de
lenguajes que permiten comunicar los procedimientos que se desea que se
ejecuten en la máquina. Desde que, en los años 50 y 60, se viera la necesidad
de extender la programación a profesionales y cientı́ficos no necesariamente especialistas en el código ensamblador que se usaba hasta entonces, han
aparecido los llamados lenguajes de programación de medio y alto nivel.
Los distintos lenguajes se pueden clasificar en función del paradigma de
programación en el que se basen, es decir, de la forma de representar y manipular el conocimiento. Los paradigmas más habituales son el imperativo,
funcional y el orientados a objetos. A pesar de poder realizar una clasificación según el paradigma en que se basen, se van a comentar brevemente
los lenguajes más habituales clasificados según la programación se realice de
manera estructurada u orientada a objetos. También se ha creı́do conveniente
realizar un apartado para comentar algunos de los lenguajes especı́ficamente
creados para la programación cientı́fica, por la aplicación directa al tema en
estudio.
Capı́tulo 4. Entornos de desarrollo. Estado del arte
4.3.1.
71
Lenguajes de programación estructurada
Suelen denominarse también ”lenguajes sin GOTO”, aunque permitan
este tipo de instrucción (se suele desaconsejar su uso), ya que su programación se basa sólo en un bloque secuencial de instrucciones, una instrucción
condicional (IF-THEN-ELSE) y un bucle condicional (WHILE-DO).
Los principales lenguajes empleados en programación cientı́fica son los
siguientes:
C : Creado en 1969 por Ken Thompson y Dennis M. Ritchie, siendo un lenguaje destinado a la programación de sistemas operativos como UNIX
y sus variantes. Estandarizado en 1986 a través del ANSI C, permite la
creación de un código muy eficiente aunque muchas veces poco legible,
reutilizable y portable.
FORTRAN (FORMula TRANslation): utilizado principalmente en programación cientı́fica y numérica, ha pasado por varias versiones, siendo
FORTRAN 77 y FORTRAN 90 las que se siguen empleando en la
programación. La última versión incluye elementos de la programación orientada a objetos (POO, ver siguiente apartado). Destaca por
las numerosas librerı́as de manipulación simbólica y cálculo numérico
existentes, ası́ como por su eficiencia en operaciones comunes en matemáticas.
Pascal : creado por Niklaus Wirth, consiste en un lenguaje destinado a la
enseñanza principalmente ya que resulta muy legible. Su uso fue muy
extendido a lo largo de la década de 1980 y principios de los 90, cuando
pasó a convertirse en un lenguaje orientado a objetos (Turbo Pascal 5)
y sentó las bases del lenguaje Delphi. Las primeras versiones de este
lenguaje fueron muy criticadas por producir un código poco eficiente.
4.3.2.
Lenguajes de programación orientada a objetos
Las caracterı́sticas que debe cumplir para que un lenguaje se pueda clasificar totalmente dentro de la programación orientada a objetos (POO) son
las siguientes:
Abstracción: cada objeto forma parte de una clase que es una entidad
abstracta en la que se definen las caracterı́sticas de este tipo de objetos, que quedan ocultos al resto de los componentes. Ası́ mismo, los
procesos, funciones o métodos pueden ser también abstraı́dos.
Encapsulación: Se llama también ocultación de la información y es
necesaria para que los objetos no puedan modificar los datos de otros
objetos si no están autorizados a emplear una interfaz especı́fica que lo
haga.
72
4.3. Lenguajes de programación
Polimorfismo: los objetos pueden controlar o trabajar con objetos de
distinto tipo ya sea en tiempo de ejecución, mediante asignaciones
dinámicas o en tiempo de compilación, a través de plantillas y sobrecarga de operadores —en el caso de C++.
Herencia: Permite la definición de tipos de objetos que deriven de otros
previamente definidos, heredando parte de sus caracterı́sticas y por tanto reciclando el código generado anteriormente. Normalmente, se agrupan los objetos en clases, creando esquemas asociativos de clases en las
que se puede incluso producir herencia múltiple.
Los lenguajes de POO más importantes en la programación cientı́fica son
los siguientes:
C++ : Diseñado a mediados de los ochenta por Bjarne Stroustrup, consiste
en una extensión de C (ver sección 4.3.1) para adaptarlo a la POO.
Junto con la librerı́a estándar (STL [2005]) constituye un lenguaje
completo y potente ya que permite trabajar en bajo y medio nivel,
como C, pero también como lenguaje de alto nivel a través de los automatismos de esta librerı́a y de otras muchas más especı́ficas.
C# : derivado de C/C++ y desarrollado por Microsoft, está estandarizado
desde 2001 y su caracterı́stica básica es la de permitir generar código
más rápido que en C++. Aunque de momento sólo resulta válido para
la plataforma .NET, existen proyectos para que éste sea independiente
como el dotGNU Portable.NET o el Mono desarrollado por Ximian.
Java : desarrollado por SUN Micro., es muy similar a C++ pero tiene la ventaja de que el código compilado se puede ejecutar en cualquier máquina,
independientemente del sistema operativo en que trabaje. Esto lo hace
muy indicado para programación de aplicaciones que trabajen en redes,
pero tiene el inconveniente de ser más lento ya que para poderse ejecutar en cualquier máquina, se ha de compilar en un lenguaje intermedio
llamado Bytecode y necesita un intérprete en tiempo de ejecución, que
es la llamada máquina virtual (JVM). Actualmente, compiladores libres como el de GNU (GNU GCC [2005]) son capaces de compilar
Java en código máquina, logrando una notable mejora de la velocidad
de cálculo.
4.3.3.
Lenguajes de programación cientı́fı́ca
Se han clasificado como tales aquellos lenguajes cuyo diseño se ha enfocado a la programación de problemas cientı́ficos y, por lo tanto, poseen
herramientas útiles para la modelización de los fenómenos fı́sicos, quı́micos,
etc. Al contrario que los entornos matemáticos (MatLab [2005], Macsyma
[2005], Mathematica [2005] o Maple [2005]) son capaces de generar programas que, compilados en el propio lenguaje, se ejecutan de forma aislada.
Capı́tulo 4. Entornos de desarrollo. Estado del arte
73
Sin embargo, comparten con estos entornos la facilidad para generar código
eficiente de forma rápida e intuitiva.
Aunque existe un cierto número de lenguajes de este tipo, cada uno de
ellos se orientan a un campo concreto siendo el lenguaje Modelica (Modelica [2005], descrito en Elmqvist et al. [1998]) el más útil para la
simulación de sistemas de sólidos, a parte de otros campos.
Modelica es un lenguaje orientado a objetos que permite el desarrollo de
aplicaciones orientadas a componentes que representan sistemas fı́sicos complejos. Posee una librerı́a estándar y numerosas librerı́as libres especializadas
en la simulación de vehı́culos o sistemas.
4.4.
Entornos integrados de desarrollo
Estos entornos de desarrollo (IDE) asisten al programador en las tareas
habituales de gestión del código y documentación. Los más completos incluyen herramientas para la creación de interfaz gráficas (GUI), creación de
documentación interna y externa, implementación de varias lenguas, etc.
Normalmente, los IDE están asociados tanto a un lenguaje como a una
plataforma determinada aunque muchos de ellos no sólo permiten programar
en varios lenguajes sino que, además, los permite combinar en un mismo
proyecto.
Los IDE más extendidos son, en función de la plataforma:
KDevelop (KDevelop [2005]): bajo licencia GPL (GNU GPL [2005])
surgió en 1998 y está diseñado especı́ficamente para el gestor de Xwindow KDE. Soporta hasta doce lenguajes de programación, aunque
Java y C/C++ son los que más funcionalidades tienen implementadas.
Además de las tı́picas funcionalidades de los IDE, también integra otras
aplicaciones como el debugger de GNU (GNU GDB [2005]), generador automático de documentación (Doxygen [2005]), herramientas de compilado automático de la FSF —Free Software Foundation—
(GNU Autoconf [2005], GNU Automake [2005] y GNU Libtool [2005]), etc.
Anjuta DevStudio (DevStudio [2005]): menos desarrollado que el anterior ya que comenzó a desarrollarse a finales de 2003, es un entorno
completamente configurable diseñado para el gestor de ventanas GNOME. Está orientado a su uso con el lenguaje C/C++ pero también
soporta otros lenguajes como Perl, Java, Pascal, etc., aunque, para
éstos no dispone de un gestor de proyectos.
Existen otros muchos entornos y editores que asisten la programación.
Una lista muy exhaustiva se pueden encontrar en Free Editors [2005].
Capı́tulo 5
Especificaciones para un
entorno de desarrollo
En este capı́tulo se realiza una exposición de las necesidades de programación para aplicaciones de simulación dinámica. A partir del estudio de las
herramientas comentadas en el anterior capı́tulo, se pretende dar una visión
general de cuáles son las opciones consideradas para cubrir las necesidades
propias de las aplicaciones de simulación de mecanismos flexibles.
La estructura del capı́tulo corresponde a la misma que se suele dar a las
aplicaciones de simulación, en las que están separadas las funciones correspondientes a la entrada de datos, el cálculo de las variables principales y la
salida de resultados. Además, en correspondencia con lo visto en el capı́tulo
anterior, se escogen finalmente las herramientas de programación que se creen
más adecuadas para crear no sólo el entorno de programación sino también
para que las aplicaciones que deriven de él que compartan el mayor número
de funcionalidades.
5.1.
Definición del problema: Preproceso
Las aplicaciones de simulación no comerciales suelen requerir para definir
la simulación un fichero de texto en un formato especı́fico, definido por el
programador de la aplicación, que luego se ejecuta en modo batch (lote de
instrucciones). Desde un punto de vista de facilidad de uso y de las posibilidades de simulación que ofrece, este tipo de entrada y ejecución puede no
ser muy recomendable y sólo se justifica a través de un principio económico
de centrar todos los esfuerzos de programación en el módulo de cálculo. El
caso descrito es el tı́pico de las herramientas que han sido creadas para la
investigación ya que normalmente se usan por el mismo equipo que las ha
programado.
La entrada de datos, además de mantener la agilidad del modo texto,
debe ser posible a través de funciones de definición en un entorno amigable.
Teniendo en cuenta que se emplean discretizaciones de elementos finitos,
75
76
5.1. Definición del problema: Preproceso
también es útil añadir herramientas de mallado automático para generar la
discretización en cuerpos de geometrı́a compleja.
5.1.1.
Lenguaje de definición del problema
Si se quiere plantear un proyecto de programación de una aplicación de
uso general o, por lo menos, no tan restringido como el caso comentado,
serı́a deseable que la entrada de datos tuviera un formato estándar. Si a
esta entrada estándar se le añadiera una interfaz gráfica, la flexibilidad serı́a
máxima.
En este trabajo se propone un esquema de preproceso para el entorno de
simulación que permita al programador adoptar un tipo de entrada con formato prefijado para su aplicación. Este formato tendrı́a que ser común para
todas las aplicaciones generadas dentro del entorno pero no serı́a obligatorio
emplearlo para acceder a otras funcionalidades del entorno. Además, serı́a
útil construir una interfaz gráfica que facilitara la definición de los parámtros
que definen la simulación con la que además se podrı́a implementar un funcionamiento interactivo.
Hay que resaltar que, gracias al carácter modular que se quiere dar al
entorno, se facilita la generación de aplicaciones con distintos niveles de complejidad. En lo que se refiere a la entrada de datos, ésta puede ser totalmente
independiente del entorno —lo que permite generar aplicaciones sencillas— y
aprovechar la entrada estándar del entorno a la hora de generar aplicaciones
más complejas o para las que se desee una difusión más allá del grupo de
programación.
En cualquier caso, la entrada habrá de estar abierta a las futuras necesidades de los programadores, lo que plantea el problema de gestionar las
peticiones y la implementación de las mismas. Una solución sencilla y que
coincide con la filosofı́a del software libre es el poner el código fuente a disposición de la comunidad para que cada equipo de programación pueda añadir
las funcionalidades que requiera. Las modificaciones que realicen estos equipos deben llegar a quien esté encargado de la programación del entorno para
decidir si se incluyen en la entrada estándar o no y, en caso negativo, advertir del porqué a quién realizó la modificación para, por ejemplo, evitar
duplicidad en los formatos.
Dentro de las múltiples posibilidades que existen a la hora de elegir un lenguaje para los datos de entrada, los más adecuados para simulación dinámica
(consultar González Castro [2005]) son el definido por la norma ISO
10303 (estándar para la reproducción e intecambio de datos de producto,
STEP [2005]) y el lenguaje extensible de marcado, desarrollado por la W3C
(consorcio de la www, XML [2005]).
Los lenguajes STEP y XML tienen su ventaja en la flexibilidad que ofrecen ya que realmente son metalenguajes, esto es, necesitan que se hayan
definido previamente las reglas esquemáticas que se permiten en su uso. Estas reglas, junto al XML, definen los vocablos con los que se pueden definir
Capı́tulo 5. Especificaciones para un entorno de desarrollo
77
los modelos. Para el lenguaje XML existen varios lenguajes para la definición
de reglas esquemáticas, siendo el más importante el XML Schema. En STEP,
el lenguaje formal para definir dichas reglas es el EXPRESS, con variantes
de representación en texto y en modo gráfico.
Mientras que el lenguaje XML representa un estándar que no está asociado a ninguna especialidad informática, el STEP se identifica unı́vocamente
con las aplicaciones CAD/CAM/CAE/PDM. Sin embargo, iniciativas como el MechXML (Vidal y Garcı́a de Jalón [2005]) o del MbsML
(González Castro [2005]) representan un ejemplo de la capacidad y
flexibilidad del XML.
En cuanto a la disponibilidad de herramientas para la generación de código, mientras que para el XML existen multitud de herramientas de código
abierto, las pocas aplicaciones que ayudan en la generación de código STEP
junto a su elevado precio lo hacen una opción poco recomendable.
Finalmente, en el caso de XML, si se emplea para definir las reglas el lenguaje XML Schema se consigue que tanto los archivos de definición de reglas
como los archivos de datos tengan una estructura similar, lo que permite el
uso de los mismos procedimientos para la generación de código del esquema
de reglas y para los archivos de datos.
Por todo esto, aunque no se defina especı́ficamente el formato de entrada,
se puede ya recomendar que éste se base en el metalenguaje XML, con las
reglas programadas en XML Schema.
5.1.2.
Herramientas visuales de mallado
Cuando se realizan simulaciones reales, la geometrı́a de los cuerpos normalmente es compleja, entendiendo ésta como una combinación de muchos
cuerpos primitivos (esferas, paralelepı́pedos, conos, etc.) o por generación
a partir de superficies. Además, éstas geometrı́as simulan el detalle de los
cuerpos reales modificando la geometrı́a bruta, por ejemplo, suavizando las
aristas mediante redondeo (radio de acuerdo).
Al trabajar con sólidos de geometrı́a compleja, la discretización de elementos finitos no es evidente y es raro que se pueda definir manualmente.
Si a este factor se suma el hecho de que el número de elementos con el que
se suele trabajar es muy elevado, se hace completamente imprescindible el
empleo de alguna automatización en la tarea de mallado.
Debido a su importancia, la creación de herramientas de mallado automático ha proliferado hasta el punto que resulta complicado realizar una
evaluación de las mismas. Una completa recopilación donde se pueden encontrar hasta 93 herramientas de código abierto y 64 comerciales se puede
consultar en Schneiders [2005].
Existe una herramienta creada por el CIMNE (GID [2005]) que dispone
de gran difusión debido a la facilidad de uso y de adaptación a distintas aplicaciones de cálculo. GID es un pre/postprocesador orientado a la simulación
mediante el método de elementos finitos con un cómodo método de mallado
78
5.2. Resolución del problema: Solución
automático. Además de ser completamente configurable, es posible generar
los modelos y acceder a los resultados interactivamente mediante ventanas y
con vistas tridimensionales. Pese a no ser de código abierto, puede ser una
herramienta a tener en cuenta a la hora de plantear un preprocesador para
el entorno.
Una de las más destacadas herramientas de código libre (licencia GPL)
es Gmsh, que es un generador de malla con funcionalidades tipo CAD y que
además incluye un postprocesador con múltiples tipos de visualizaciones y
facilidad para ser ampliado (Gmsh [2005]).
5.2.
Resolución del problema: Solución
Los módulos de cálculo o procesadores son realmente la base de las aplicaciones y, en el caso de las herramientas de investigación, éstas carecen de
funcionalidades accesorias y suelen constar únicamente del módulo de cálculo, por lo menos hasta un cierto grado de complejidad.
Las necesidades comunes de cualquier aplicación de simulación dinámica
tienen dos orı́genes distintos, el cálculo mátemático (numérico) y el almacenamiento. En los apartados siguientes se enumeran los requisitos funcionales
que deberá tener un entorno flexible que cubra las necesidades de programación usuales, clasificándolas en función de su origen. También se especifica la
solución que se prevé para el entorno que se proyecta.
5.2.1.
Caracterı́sticas matemáticas
Para solucionar los problemas considerados de simulación de sistemas de
sólidos rı́gidos y flexibles, es necesario emplear un número amplio de técnicas, tales como multicuerpo o discretizaciones por elementos finitos. La implementación de dichas técnicas implica el trabajo con técnicas matemáticas
y numéricas que, esencialmente, se basan en el uso de matrices.
Las necesidades matemáticas se pueden dividir en los siguientes grupos:
Operaciones de álgebra de matrices: representan desde operaciones sencillas de suma, resta o multiplicación, hasta operaciones especializadas
como inversión, determinante, traza.
Sobre estas operaciones se asientan todos los métodos matemáticos
que son necesarios para las simulaciones que se contemplan, desde la
resolución de ecuaciones hasta las transformaciones geométricas.
Resolución de sistemas de ecuaciones lineales: se basan en el álgebra
de matrices y corresponden a procedimientos especı́ficos para el cálculo
de las incógnitas de un problema matricial estándar. Como se estudión
en el capı́tulo 3, existe un número amplio de maneras de abordar el
problema.
Capı́tulo 5. Especificaciones para un entorno de desarrollo
79
Cálculo de autovalores y autovectores: son problemas de cálculo del
problema Au = λu, donde u es el vector propio o autovector de A y
λ es el autovalor asociado a u. Esta transformación aparece frecuentemente en problemas de simulación dinámica, dado que implica una
transformación en la que se dan una serie de relaciones geométricas.
Resolución de sistemas de ecuaciones no lineales: también tratados en
el capı́tulo 3, corresponden tradicionalmente a técnicas de linealización
y resolución de sistemas lineales que se aplican iterativamente hasta la
convergencia de la solución.
Resolución de ODEs y DAEs: para resolver las ecuaciones de la dinámica, formadas por la aplicación de simulación, es necesario integrar a
lo largo del tiempo dichas ecuaciones para lo que se emplean múltiples procedimientos explı́citos o implı́citos. Éstos últimos recurren a los
métodos de resolución de sistemas no lineales para cada paso.
Para proveer soluciones a estas necesidades existen numerosas librerı́as
de cálculo que resuelven de distintas formas cada uno de los problemas enumerados. Una gran recopilación se puede encontrar en Dongarra [2005],
en donde se ha realizado la clasificación habitual en los siguientes grupos:
Rutinas de soporte: ATLAS, BLAS, FLAME, LINALG, MTL, NEWMAT, NIST S-BLAS, PSBLAS, SparseLib++, uBLAS.
Métodos directos de solución con almacenamiento denso: LAPACK,
LAPACK95, NAPACK, PLAPACK, PRISM, ScaLAPACK.
Métodos directos de solución con almacenamiento comprimido: DSCPACK, HSL, MFACT, MUMPS, PSPASES, SPARSE, SPOOLES, SuperLU, TAUCS, UMFPACK, Y 12M.
Precondicionadores: BPKIT, PARPRE, SPAI.
Métodos iterativos de solución con almacenamiento comprimido: BILUM, BlockSolve95, CERFACS, GMM++, HYPRE, IML++, ITL,
ITPACK, LASPack, LSQR, pARMS, PETSc, PIM, P-SparsLIB, QMRPACK, SLAP, SPLIB, SYMMLQ, Trilinos, Template.
Métodos de cálculo de autovalores/autovectores con almacenamiento
comprimido: LZPACK, LASO, PARPACK, PLANSO, SLEPc, SPAM,
TRLAN.
La gran variedad existente de métodos se justifica —en general— al tener
cada uno ventajas frente a los demás, de forma que resulta difı́cil cuál será el
que se adapte mejor al problema que se desee abordar.
Se ha de intentar tener a disposición varios métodos de resolución para que
se pueda comparar el rendimiento de cada uno en cada caso y también para
80
5.2. Resolución del problema: Solución
poder elegir el deseado en cada momento. Para que esta funcionalidad sea
cómoda de usar, a la vez que útil, se ha de poder usar cada librerı́a de métodos
mediante la ejecución del mismo código. Este problema se abordará en el
siguiente capı́tulo.
5.2.2.
Caracterı́sticas informáticas
Una vez especificadas las necesidades matemáticas del entorno, es hora
de definir cuáles son las caracterı́sticas informáticas que habrá que tener en
cuenta para realizar la implementación de las anteriores. Se han englobado en esta sección todas aquellas funcionalidades que tienen su origen en
la implementación de las aplicaciones, desde el propio lenguaje en que se
implementan hasta la forma de almacenar e intercambiar los datos.
Lenguaje de programación
Para elegir el lenguaje en que es mejor realizar la programación de aplicaciones que resuelvan problemas de simulación dinámica se han de considerar
varios factores.
La eficiencia de computación, en general se asocia a lenguajes de programación estructurada, como C o FORTRAN. Por otro lado, los lenguajes de
programación orientada a objetos (POO) ofrecen otras ventajas que proceden
de su capacidad de de concebir, analizar, modelar, diseñar e implementar los
conceptos de manera fiel a como se presentan en los razonamientos cientı́ficos.
De esta forma, este tipo de lenguajes permiten una implementación intuitiva
y rápida, produciendo código fácil de complementar y de mantener.
Sin querer entrar en más detalles acerca de las diferencias entre unos y
otros, se ha elegido el lenguaje C++ como el mejor para la implementación
del código del entorno ya que tiene todas las ventajas de la POO pero, a la
vez, permite la compilación de código C de bajo nivel para aquellas rutinas
que requieran una especial eficiencia o, simplemente, para poder emplear
naturalmente las librerı́as generadas en lenguajes tanto C++ como C.
Se quiere hacer notar que la importancia de la eficiencia numérica no
resulta prioritaria en el caso planteado ya que se prefiere un entorno enfocado
a la flexibilidad de programación. A pesar de esto, no se quiere dejar de
lado esta cualidad, considerándola deseable aunque no imprescindible en una
primera fase de desarrollo.
Almacenamiento numérico
La manera en que las matrices son almacenadas en la memoria del ordenador define dos principales métodos: almacenamiento denso y comprimido.
El almacenamiento denso guarda todos y cada uno de los elementos de la
matriz. Resulta útil para matrices que contienen pocos ceros o para aquellas
que no tienen una dimensión elevada.
Capı́tulo 5. Especificaciones para un entorno de desarrollo
81
Cuando el tamaño de la matriz aumenta y además el número de ceros en
la matriz es considerable resulta muy eficiente realizar un almacenamiento
comprimido cuyo fin es el de reducir la memoria ocupada por los elementos
de la matriz, aún a costa de un ligero aumento del número de operaciones
necesarias para escribir o leer elementos de la misma. Las caracterı́sticas de
la matriz influyen en la efectividad de este tipo de almacenamientos, ası́ si
la matriz es simétrica y tiene un ancho de banda reducido, las ventajas de la
compresión aumentan. Existen varios métodos de almacenamiento comprimido, como la compresión por columnas (CSC) o por filas (CSR) el almacenamiento de bandas enteras. En función de las caracterı́sticas esperadas de
la matriz es preferible uno u otro.
Además, hay que tener en cuenta que los vectores pueden considerarse
como matrices de una columna o como estructuras distintas y, ası́mismo,
también se les puede aplicar o no compresión. Esto multiplica las opciones
en la concepción de una aplicación para la que es necesario elegir de antemano
el tipo de matrices y vectores a emplear.
Las librerı́as mencionadas para los métodos matemáticos los implementan
para uno o varios tipos de matrices, ya sean densas o comprimidas. Por las
mismas razones que aparecı́an a la hora de seleccionar una librerı́a de métodos
de solución, no es posible elegir un formato de almacenamiento que se adapte
de manera óptima a cualquier aplicación. Ni siquiera será óptimo para varias
simulaciones realizadas por la misma aplicación.
Por lo tanto, resultarı́a muy útil el disponer de una forma de emplear
varios tipos de matrices para implementar una aplicación e incluso poder
cambiar el tipo de matriz empleado entre varias ejecuciones de un mismo
código para evaluar las diferencias.
Parsers
La funcionalidad del lenguaje propuesto para el preproceso en el entorno,
XML, depende de la capacidad que se tenga para gestionar los archivos de
datos. Los programas que se emplean para gestionar estos archivos se denominan parsers. Un parser, también llamado procesador o analizador sintáctico,
lee el documento XML y verifica que es XML bien formado, algunos también
comprueban que el código XML sea válido.
En XML hay dos modelos de parsers: DOM (Document Object Modeler ) y
SAX (Simple API for XML). El primero es un modelo de objetos estructurado
a modo de árbol de relaciones que permite un acceso aleatorio a los objetos y
el segundo simplemente recorre secuencialmente el archivo XML, generando
eventos cada vez que se abre o cierra un elemento de XML. Ası́, mientras
SAX es más rápido que DOM, también es más complejo de usar y requiere
una mayor cantidad de código para ejecutarse.
Debido a la relación entre los objetos fı́sicos que componen un sistema
mecánico, resulta más recomendable emplear un parser basado en DOM. Un
parser muy difundido de este tipo que maneja código C++ es el creado por
82
5.3. Análisis de resultados: Postproceso
la fundación Apache (Xerces-C++ [2005]).
5.3.
Análisis de resultados: Postproceso
No hay duda de que, por muy bueno que sea el cálculo de la simulación,
es el análisis de los resultados lo que permite nuestra interpretación de esta
simulación.
Los requerimientos usuales de postprocesado son los siguienes:
Cálculo de variables auxiliares: A partir de las variables básicas del
problema, que son los parámetros habituales de posición, velocidad,
aceleración y a veces también presión y temperatura, se han de poder
calcular otros valores útiles como el trabajo y energı́as, proyecciones,
estimaciones del error cometido en el cálculo, etc. Además, cuando
se trata con cuerpos flexibles, es necesario —y para nada trivial— el
cálculo y alisado de tensiones y otras medidas internas del sólido.
Representación gráfica de variables: ya sea frente al tiempo o frente
a otras variables e incluso incluyéndolas en expresiones algebraicas, la
representación gráfica resulta imprescindible para el análisis.
Animación: No sólo por su carácter atractivo, la animación del movimiento del modelo en el espacio constituye una herramienta también
muy útil de estudio de su comportamiento y posible mejora. Si además
se incluyen en ella la representación de fuerzas a través de vectores, tensiones o deformaciones a través de isolı́neas o superficies isocromáticas
y otras funcionalidades, la animación supone la mejor forma de analizar
un gran número de variables de una sóla vez.
Para lograr todos estos requisitos se puede trabajar de tres formas distintas.
Una primera consiste en buscar y emplear la aplicación externa que mejor
se adapte a cada requisito. Por ejemplo, para el trabajo de representación
gráfica se podrı́a plantear el uso de Gnuplot que, a pesar de su nombre, no
forma parte de la FSF ni del proyecto GNU (ver Gnuplot [2005]) y para
la animación, herramientas también libres como Geomview, que es una aplicación de animación interactiva con posibilidad de guardar las animaciones
e imagenes generadas (Geomview [2005]).
Una segunda opción, consistirı́a en buscar una aplicación que resolviera
todas las necesidades de una vez. A pesar de no ser de libre distribución
GiD —comentada en el apartado de preproceso— cumplirı́a, en principio,
con estas necesidades. Al estar principalmente enfocada al análisis mediante
elementos finitos, faltarı́a comprobar que su capacidad para la simulación
multicuerpo satisface las necesidades. Por otro lado se puede plantear el uso
de la herramienta Gmsh, también comentada en la sección de mallado. Frente
Capı́tulo 5. Especificaciones para un entorno de desarrollo
83
a GiD, tiene la gran ventaja de ser libre. Sin embargo, al estar enfocada a
un entorno académico, sus prestaciones podrı́an ser insuficientes en algunos
estudios.
Y, por último, una opción nada desdeñable corresponde a la creación
de una aplicación de postproceso mediante la integración de herramientas
y librerı́as de libre distribución como las comentadas en la primera opción
considerada. En este caso se aprovecharı́a el trabajo realizado por grupos de
desarrollo pero se realizarı́a un diseño expreso de la interfaz. Las librerı́as
más importantes para la gestión gráfica necesaria para una aplicación de
postproceso son OpenGL (OpenGL [2005]) y The Visualization Toolkit
(VTK [2005]), mientras que para la integración de las herramientas en la
aplicación se pueden contemplar las librerı́as Qt (Qt [2005]), principalmente
por su gran portabilidad, o las GTK+ (GIMP Toolkit, GTK+ [2005]) que
también es multiplataforma aunque con más limitaciones.
No se contempla la posibilidad de realizar una aplicación completa de
postproceso partiendo de cero por el gran trabajo que conlleva. Aunque serı́a
prácticamente obligatorio para la realización comercial, la filosofı́a adoptada
de código abierto permite el adaptar los códigos existentes y modificarlos
en caso de que sea necesario, lo que se considera más que suficiente para
disponer de un entorno de postproceso que cumpla con las especificaciones.
Capı́tulo 6
Diseño e implementación del
entorno
6.1.
Estructura del entorno
Primando la flexibilidad, se busca generar un conjunto de herramientas
homogéneas que asistan al programador en la generación de aplicaciones de
simulación de mecanismos. Para ello es necesario que no se imponga una
determinada forma de realizar los procedimientos sino que se ofrezca un abanico de soluciones para que cada cual escoja la que mejor se adapte a sus
necesidades.
La decisión tomada implica un diseño modular, por lo que el entorno
deberá estar formado por distintos módulos que funcionen como cajas negras para que el programador sólo se preocupe por mandar la información
requerida y preparse para recibir el resultado esperado.
Un primer nivel estructural se define mediante la clasificación realizada en
el capı́tulo anterior. Los tres niveles funcionales del entorno se corresponden
con la estructura normal de una aplicación completa de simulación:
Preprocesador - Cálculo de solución - Postprocesador
En lo que sigue, se ha desarrollado el diseño del módulo de cálculo de
solución ya que, una vez esté implementado, permitirá el desarrollo de aplicaciones sencillas mediante cuya programación se podrán analizar todas las
cualidades necesarias del pre y postprocesador. Hasta ese momento y también
por economı́a, se ha decidido postponer las decisiones básicas que implican
el diseño de ambos módulos dejándolos en la especificación básica dada en el
capı́tulo anterior.
Ası́ pues, el capı́tulo se centra en el diseño estructural del módulo de
cálculo. Aunque se halla llamado con ese nombre, se quiere destacar que no
es propiamente un módulo sino una colección de herramientas que realizan
funciones que habitualmente están en ese módulo.
85
86
6.1. Estructura del entorno
Entorno de desarrollo
Preprocesador
Herramienta de modelado
Definiciones XML Schema
Archivo XML
Módulo de cálculo
Parser
LMX
Métodos matriciales
Solvers lineales
Aplicación
de
Solvers no lineales
Simulación
Sistemas diferenciales
Formato de salida
Postprocesador
Datos simulación
Cálculos auxiliares
Generador de gráficas
Animaciones
Figura 6.1: Esquema propuesto para el entorno
Capı́tulo 6. Diseño e implementación del entorno
87
El módulo de cálculo se conformará a partir de componentes con una
cierta relación entre sı́, de tal forma que cada componente responde a un
tipo de necesidad de las enumeradas en el capı́tulo de especificaciones.
En la figura 6.1 se muestra el esquema propuesto para el diseño del entorno
y su relación con las aplicaciones externas y sus archivos de datos. Para la
programación de la aplicación externa se habrá de definir las comunicaciones
entre ésta y el módulo de cálculo, no siendo obligatorio que la misma se
comunique con el pre o postprocesador. Sin embargo, se deja la posibilidad
de redefinir los elementos de las definiciones del archivo de entrada (Schema
XML) de la manera que se comentó en el capı́tulo de especificaciones.
6.1.1.
Estructura del módulo de solución
Según las especificaciones, el módulo de solución del entorno deberı́a
poder tratar con varios tipos de almacenamientos de matrices y vectores,
además de poder operar con los mismos de las maneras expuestas en el
capı́tulo anterior.
Se van a definir los componentes del entorno que se han de implementar
para cumplir con las especificaciones en función del tipo de operaciones que se
realizan. Para cada componente se aborda el diseño de cada uno ası́ como, en
caso necesario, las relaciones que impiden que se repita una misma función.
Debido a la gran cantidad de métodos matriciales que se necesitan para
implementar los métodos de solución lineales, se ha decidido implementarlos
conjuntamente en el mismo componente. Una justificación más detallada se
puede encontrar en el siguiente apartado.
Por otra parte, tanto los métodos de solución (solvers) no lineales como los sistemas diferenciales, que incluyen los integradores temporales, son
componentes independientes pero cuyas funciones harán uso de los métodos
generales y lineales.
6.2.
Librerı́a matricial
La librerı́a matricial diseñada e implementada, de nombre LMX (Linked
MatriX methods), responde a las necesidades básicas de manipulación matricial y resolución de sistemas de ecuaciones. A pesar de la apariencia desde el
punto de vista del usuario de ser una librerı́a normal, tiene una caracterı́stica principal que la define. Ésta es su capacidad para hacer de puente entre
cualquier librerı́a existente y una única forma de escribir el código para usar
las rutinas. En función del valor de una serie de parámetros seleccionados, el
código ejecutará unas matrices y métodos definidos por una librerı́a u otros.
Por tanto, se trata más bien de una metalibrerı́a, que utiliza los métodos
implementados en librerı́as externas simplificando el código y permitiendo
cambiar entre una y otra.
88
6.2. Librerı́a matricial
El diseño de la librerı́a se ha realizado teniendo en cuenta que se debı́an
alcanzar las siguientes prestaciones:
El código necesario para acceder a las funcionalidades de la librerı́a
tenı́a que ser lo más natural e intuitivo posible.
Se debı́an poder emplear varios tipos de datos numéricos, como los
enteros, reales, de doble precisión, complejos, etc.
Debı́a permitir, para una aplicación que empleara el código de la librerı́a, el cambio entre los tipos de matrices, vectores y métodos de
solución sin realizar ninguna modificación en el código.
El cambio entre tipos de matrices y de métodos se debı́a poder realizar
en tiempo de compilación y también de ejecución.
Los enlaces necesarios para que la metalibrerı́a sea capaz de usar las
funcionalidades de otra librerı́a distinta de las implementadas, ha de
requerir solamente un conocimiento mı́nimo de la estructura de LMX.
Empleando un lenguaje orientado a objetos como C++ es posible sintetizar el problema en un conjunto de clases y funciones (miembro o amigas)
de cada una. La diferencia entre una función miembro y una amiga es que
la primera pertenece al objeto y, por tanto, tiene acceso a todos los elementos definidos del mismo de forma implı́cita, la función amiga es una función
externa para la cual la clase de la que es amiga define un cierto número de
parámetros a los que puede acceder.
El uso de clases patrón, llamadas templates, permite poder crear un objeto
indicando el tipo de dato con el que trabajará (que a su vez también es una
clase).
Para que se pueda entender el trabajo realizado, se expondrá a continuación la información mı́nima de la estructura y funciones de la librerı́a
y, posteriormente, se expondrán algunos ejemplos de implementación. No se
desea entrar en detalle acerca de la implementación concreta en el lenguaje
elegido, aunque sı́ que se emplearán los términos habituales de la POO.
El diseño de la jerarquı́a de las clases se realiza identificando primero los
objetos que el usuario deberá crear. Estos objetos junto con las funciones de
cada uno, se enumeran a continuación para la librerı́a generada.
6.2.1.
Matrices: clase Matrix
Los objetos de tipo matriz se crean instanciando la clase Matrix. El tipo
de dato numérico se puede elegir a la hora de crear cada uno de los objetos1
Los datos guardados en cada objeto o atributos de la clase, son:
1
Por ejemplo, en sintaxis de C++, lmx::Matrix<double> mi matriz crearı́a un objeto
de clase Matrix con reales de doble precisión, de nombre “mi matriz”.
Capı́tulo 6. Diseño e implementación del entorno
89
lmx::Matrix< T >
lmx::Vector< T >
Figura 6.2: Esquema de herencia para la clase Matrix
mrows, almacena el número de filas de la matriz.
ncols, almacena el número de columnas de la matriz.
type matrix, apunta a una estructura que almacena el contenido de la
matriz. Esta estructura es un objeto separado, que pertenece a la clase
Data mat.
Las formas de crear un nuevo objeto de la clase matrix se implementan
a través de los constructores que son un tipo especial de función miembro.
Los existentes para la clase Matrix son los siguientes:
Matrix() (constructor vacı́o): crea un objeto con los atributos por
defecto, en este caso filas y columnas iguales a cero y con una estructura
de datos vacı́a.
Matrix(filas, columnas): crea un objeto con el tamaño especificado
y todos los elementos nulos.
Matrix("nombre archivo"): lee el archivo y guarda la matriz que contenga en un nuevo objeto.
Matrix(identificador, dimensión): crea una matriz especial, cuadrada de dimensión especificada. Matrices especiales posibles son la
identidad, aleatoria, etc. Cada una se asocia a un dı́gito identificador.
Matrix(otra matriz) (constructor copia): copia todos los atributos de
la matriz llamada otra matriz en un nuevo objeto.
Además de los constructores anteriores, al emplear técnicas de almacenamiento dinámico de memoria, es necesario el uso de una función llamada
destructor que destruye los objetos cuando es necesario, liberando la memoria
de todos sus atributos. Esta función toma la forma ∼Matrix().
Las otras funciones miembro se pueden dividir en dos grupos. El primero
incluirı́a a aquellas que redefinen los sı́mbolos de operación (sobrecarga de
operadores) y se definen por la palabra clave operator, y el segundo corresponderı́a a funciones miembro clásicas. El conjunto de todas ellas es el
siguiente:
operator () (fila, columna): extrae el elemento dado por la posición de los parámetros de entrada y devuelve una referencia al mismo.
90
6.2. Librerı́a matricial
operator = (otra matriz): Copia los atributos de otra matriz en el
objeto. Los datos númericos del elemento otra matriz pueden o no ser
del mismo tipo que los del objeto para el que se aplica la función. En
caso de que sean distintos se aplica una conversión que puede implicar
pérdida de precisión e incluso de información.
operator += (otra matriz): Suma elemento a elemento los términos
de las dos matrices y guarda el resultado de nuevo en la matriz sobre
la que se invoca la función.
operator -= (otra matriz): igual que el operador += pero restando
en vez de sumando.
data (): Devuelve una referencia a la estructura de datos de la matriz.
Responde a necesidades de programación de los métodos de solución
lineal.
clean (factor): Iguala a cero los elementos cuyo valor sea menor que
el definido por el parámetro factor. Resulta útil para eliminar los
errores de redondeo y truncación antes de realizar un almacenamiento
comprimido.
resize (filas, columnas): redimensiona la matriz al tamaño nuevo.
Si éste es mayor que el anterior, los nuevos elementos serán nulos. Si es
menor, se pierden los elementos con ı́ndices de posición mayores a las
nuevas dimensiones.
Las funciones amigas a las que la clase matriz permite acceso a sus atributos son las siguientes:
operator (stream de salida, nombre matriz): Sobrecarga el operador de stream que actúa direccionando nombre matriz hacia stream de salida.
operator (archivo de salida, nombre matriz): Sobrecarga el operador de stream que actúa direccionando nombre matriz hacia el archivo en modo de escritura (llamado ofstream) con nombre stream de salida.
operator + (matriz A, matriz B): Suma ambas matrices y devuelve
el resultado como una nueva matriz. Al ser la suma elemento a elemento, es posible que las matrices tengan distintas dimensiones.
operator - (matriz A, matriz B): Igual que el anterior pero restando en vez de sumando. El orden de los operandos es siempre A - B.
operator * (matriz A, matriz B): Operación de multiplicación de
matrices, para la que estas matrices deben tener las dimensiones adecuadas.
Capı́tulo 6. Diseño e implementación del entorno
91
operator * (factor, matriz A): Operación de escalado. Multiplica
cada uno de los elementos de la matriz por el valor de factor.
rows (nombre matriz): Devuelve el número de filas de la matriz nombre matriz.
columns (nombre matriz): Devuelve el número de columnas de la matriz nombre matriz.
read element (nombre matriz, fila, columna): Acceso seguro de
sólo lectura. Devuelve una copia del elemento en la posición especificada
por lo que no permite su modificación.
traspose (nombre matriz): Trasposición sin modificación de la matriz original. Devuelve la traspuesta de la matriz como una matriz nueva.
latex print (archivo de salida, nombre, matriz A, precisión):
Salida en formato LATEX de la matriz matriz A con la precisión dada
para cada elemento. El parámetro nombre puede contener comandos de
LATEX.
Por ejemplo, si el valor de la variable nombre es \mathbf{\overline{B}},
la salida tendrá el siguiente formato, una vez compilado:


A(0, 0) A(0, 1) · · · A(0, m)
 A(1, 0) A(1, 1) · · · A(1, m) 


B=

..
..
..
.
.


.
.
.
.
A(n, 0) A(n, 1) · · · A(n, m)
donde los elementos A(i, j) serı́an los valores numéricos de los elementos
de la matriz A.
6.2.2.
Vectores: clase Vector
lmx::Matrix< T >
lmx::Vector< T >
Figura 6.3: Esquema de herencia para la clase Vector
El uso de vectores mediante la definición de matrices con número de
filas o columnas igual a la unidad no es eficiente, ni desde el punto de vista
computacional, ni desde el de almacenamiento. Por ello es necesario definir
un nuevo tipo de objeto para el que los métodos están optimizados al tener
en cuenta su caracterı́stica unidimensional.
92
6.2. Librerı́a matricial
Sin embargo, gracias a la estructura dada a la clase Matrix, en la que la
estructura es un objeto externo a la que la ésta apunta, es posible aprovechar
las posibilidades de herencia de la POO.
La clase Vector es una clase heredada de la clase Matrix para la que
se redefinen algunas de sus funciones pero cuya estructura de datos (a la
que apunta el atributo type matrix) es completamente distinta (para más
detalles acerca de esta estructura, ver la descripción de la clase Data mat en
la sección 6.2.3).
Se han redefinido los siguientes constructores:
Vector() (constructor vacı́o): crea un objeto con los atributos por
defecto, en este caso número filas igual a cero, una columna y estructura
de datos vacı́a.
Vector(filas): crea un objeto con las filas especificadas y todos los
elementos nulos.
Vector("nombre archivo"): lee el archivo y guarda el vector que contenga en un nuevo objeto.
Vector(identificador, filas): crea un vector especial, con el número de filas especificado. Vectores especiales posibles son el identidad y
aleatorio. Cada uno se asocia a un dı́gito identificador.
Vector(otro vector) (constructor copia): copia todos los atributos
del vector con nombre otro vector en un nuevo objeto.
Al igual que la matriz, se implementa un destructor especı́fico llamado
∼Vector().
Las funciones miembro redefinidas para la clase son las siguientes:
operator () (fila): extrae el elemento que se encuentra en la fila
dada y devuelve una referencia al mismo.
operator = (una matriz): Copia el atributo nrows —número de filas—
de una matriz en el objeto vector y también copia la primera columna
de la matriz en la estructura del vector. Al igual que para la copia
de matrices y vectores por separado, los datos númericos del elemento
una matriz pueden o no ser del mismo tipo que los del objeto para el
que se aplica la función.
resize (filas): redimensiona el vector al tamaño nuevo. Si éste es
mayor que el anterior, los nuevos elementos serán nulos. Si es menor,
se pierden los elementos situados en las últimas filas.
Por último se describen las funciones amigas definidas por la clase:
Capı́tulo 6. Diseño e implementación del entorno
93
norm1 (nombre vector): calcula y devuelve el valor de la norma primera del vector, calculada mediante
nrows−1
X
| ai |
i=0
donde ai son los elementos del vector.
norm2 (nombre vector): calcula y devuelve el valor de la norma segunda del vector (norma euclı́dea), calculada mediante
nrows−1
X
(ai )2
i=0
donde ai son los elementos del vector.
operator (stream de salida, nombre vector): Similar a la sobrecarga del operador de stream para matrices pero con alguna ligera
diferencia de formato.
operator (archivo de salida, nombre vector): Similar a la sobrecarga del operador de salida a archivos pero también con diferencias
de formato.
operator + (vector x, vector y): Suma ambos vectores y devuelve
el resultado como un nuevo vector. Al ser la suma elemento a elemento,
es posible que los vectores tengan distinta dimensión.
operator - (vector x, vector y): Igual que el anterior pero restando en vez de sumando. El orden de los operandos es siempre A - B.
operator * (vector x, vector y): Operación de multiplicación escalar de vectores, para la que estos vectores deben tener las misma
dimensión.
operator * (matriz A, vector x): Operación de multiplicación de
matriz por vector, para la que la matriz y vector deben tener las dimensiones adecuadas. El resultado se guarda en un nuevo vector.
operator * (factor, vector x): Operación de escalado. Multiplica
cada uno de los elementos del vector por el valor de factor. Al igual
que en el caso anterior, el resultado se guarda en un nuevo vector.
latex print (archivo de salida, nombre, vector x, precisión):
Salida en formato LATEX del vector vector x con la precisión dada para cada elemento. El parámetro nombre puede contener comandos de
LATEX. La diferencia con la función implementada para matrices es únicamente que los delimitadores se cambian de paréntesis a llaves.
94
6.2. Librerı́a matricial
Por ejemplo, si el valor de la variable nombre es \boldsymbol{\ddot{x}},
la salida tendrá el siguiente formato, una vez compilado:




x(0)



 x(1) 

ẍ =
..

. 



 x(n) 

donde los elementos x(i) serı́an los valores numéricos de los elementos
del vector x.
6.2.3.
Estructuras de datos: clase Data mat
La clase Data mat es lo que se conoce como clase abstracta, es decir, que
no tiene implementadas sus funciones sino que sólo están declaradas y se
definen en las clases heredadas de ésta.
La función que cumple este tipo de clases es la de servir de interfaz entre
cualquier objeto que pertenezca a una clase heredada de la virtual y una
variable de tipo puntero.
Desde el punto de vista de un usuario de la librerı́a (o del entorno de
programación) no es necesario ni siquiera conocer la existencia de estas clases
y funciones. Aún ası́ y buscando la completud en el documento que expone
el trabajo de investigación, se ha querido realizar una exposición breve de su
implementación.
Las funciones virtuales puras declaradas en Data mat se han de definir
en cualquier clase que herede de ella para poder instanciar ésta (la clase
heredada). Estas funciones son las siguientes:
resize (filas, columnas): redimensiona la estructura al nuevo tamaño definido por los parámetros.
extract (filas, columnas): devuelve una referencia al elemento que
ocupa la posición dada por los parámetros.
contents rows (): devuelve el número de filas de la estructura.
contents columns (): devuelve el número de columnas de la estructura.
equals (otra estructura): iguala elemento a elemento la estructura
del objeto a la de otra estructura. No se modifican las dimensiones
y —por el momento— es necesario que los tipos de estructuras sean los
mismos.
add (otra estructura): suma elemento a elemento la estructura del
objeto y la de otra estructura, guardando el resultado en el objeto.
Equivalente al operador aritmético +=, es decir a la operación: objeto
+= otra estructura.
Capı́tulo 6. Diseño e implementación del entorno
95
substract (otra estructura): igual que add pero restando. Equivale
a la operación: objeto -= otra estructura.
multiply (estructura A, estructura B): multiplica matricialmente ambas estructuras, que deben tener el tamaño adecuado, y guarda el
resultado en el objeto. Orden de operación: objeto = estructura A ·
estructura B.
multiply scalar (factor): Multiplica todos los elementos de la estructura matricial por el factor y los guarda en la propia estructura.
Los datos antiguos se pierden.
trn (): Traspone los elementos del objeto y guarda el resultado en el
propio objeto. La estructura sin trasponer no se guarda.
clean below (factor): Iguala a cero todos los elementos con valor
menor que el especificado por el factor.
read data file (nombre archivo): Lee el archivo de datos en formato estándar y guarda en el objeto estructura la matriz o vector definido
en ese archivo. Si es necesario se redimensiona el objeto para que su
estructura tenga la dimensión adecuada.
lmx::Data_mat< T >
lmx::Type_gmm< T >
lmx::Type_gmm_sparse< T >
lmx::Type_gmmVector_sparse1< T >
lmx::Type_hb< T >
lmx::Type_stdVector< T >
Figura 6.4: Esquema de herencia para la clase Data mat
A continuación se enumeran las clases heredadas de Data mat (figura 6.4)
junto con una breve descripción del tipo de estructura que proporcionan.
Type gmm: Implementa una clase que permite crear estructuras de matrices densas. Para ello se ha adaptado la clase gmm::dense matrix de
la librerı́a GMM++ (Renard y Pommier [2005]).
Type stdVector: Permite crear estructuras de vectores densos. Se emplea la clase de uso general std::vector de la librerı́a estándar STL
(Silicon Graphics [2005]) y las funciones definidas en la librerı́a
GMM++.
Type gmm sparse2 : Esta clase permite crear estructuras de matrices
comprimidas de tipo CSC (compressed sparse column). Se usa la clase
gmm::csc matrix de la librerı́a GMM++.
Type gmmVector sparse12 : Permite crear estructuras de vectores comprimidos. Se usa la clase gmm::wsvector de la librerı́a GMM++, que
es un vector sparse optimizado para escritura.
96
6.2. Librerı́a matricial
Type hb2 : También permite crear estructuras de matrices comprimidas de tipo CSC, equivalente al almacenamiento Harwell-Boeing. En
este caso se implementan todas las funciones sin apoyarse en ninguna
librerı́a.
6.2.4.
Sistemas lineales: clase Linear system
Para facilitar el trabajo de manipulación y resolución de sistemas lineales,
ası́ como para crear herramientas que ayuden en el control de dichos procedimientos, se ha creı́do útil crear esta nueva clase que simplemente gestiona
un sistema estándar
Ax = b
Cabe destacar que el tipo de dato numérico del sistema lineal no tiene
porqué coincidir con el de la matriz y el vector que definen el problema. Ası́,
por ejemplo, se pueden tener sendos A y b con elementos de precisión normal
(float) y trabajar con un sistema de precisión doble (double) para, finalmente,
guardar la solución en el formato original. De esta forma se pueden reducir
los errores de redondeo cuando el coste computacional no sea muy elevado.
Los atributos de dicha clase son, como cabe esperar, los correspondientes
a la matriz y vectores que forman el sistema.
A, es un puntero a una matriz.
x, es un vector.
b, es un puntero a un vector.
Por el momento, se han implementado las funciones mı́nimas para poder
asegurarse de que la estructura de la clase funciona correctamente. Son las
siguientes:
Linear system(matriz A, vector b) (constructor ): La única forma
de crear un objeto Linear system es a partir de una matriz y un vector
existentes. Por supuesto, han de tener dimensiones compatibles (mismo
número de filas).
∼Linear system() (destructor ): Realiza operaciones de gestión de la
memoria que ocupan los elementos del objeto que se ha de destruir.
solve yourself(): Función que aplica el método de solución correspondiente para resolver el sistema. Devuelve una referencia al vector
que contiene esa solución, x.
solution(): Si se ha calculado la solución del sistema, devuelve una
referencia al vector que la contiene, x.
2
Actualmente en desarrollo.
Capı́tulo 6. Diseño e implementación del entorno
6.2.5.
97
Selección de tipo de estructura matricial y método de solución
Hasta ahora se han expuesto las diferentes estructuras que es posible
emplear para trabajar con matrices, vectores y sistemas lineales. Se va a
explicar de qué forma se puede cambiar la estructura de matrices y vectores
con la que se desea trabajar, ası́ como el tipo de método de solución de
sistemas lineales.
Selección de estructuras de matrices y vectores
El espacio de nombres (namespace) de esta librerı́a ("lmx::") posee un
parámetro de un tipo especial llamado static. Por motivos de acceso, éste se
encuentra definido en el archivo donde se declara la clase Matrix.
El valor de este parámetro, de tipo entero (int) y nombre matrix type,
define el tipo de matrices y vectores que se empleará en la ejecución del
código. En función del valor que se asigne a este parámetro las matrices y
vectores que se generen tendrán los valores dados por la tabla 6.1.
Valor de
matrix type
0
1
Estructura
de matriz
type gmm
type gmm sparse
Estructura
de vector
type stdVector
type gmmVector sparse
Cuadro 6.1: Valores para el coeficiente matrix type
Se proponen dos formas de modificar este parámetro, según se prefiera a
la hora de generar el código correspondiente, ambas se realizan invocando a
la función select matrix type(nuevo tipo):
Selección en tiempo de compilación, mediante el cambio de inicialización por defecto del parámetro en el archivo "matrix.h". También es
posible invocar la función select matrix type(nuevo tipo) desde el
código de la aplicación que se esté programando.
Selección en tiempo de ejecución, se ha de invocar directa o indirectamente la función select matrix type(nuevo tipo) desde la entrada
de datos de la aplicación, para lo que se ha de preveer también el código
de la aplicación.
Selección de métodos de solución de sistemas lineales
Mediante una forma equivalente a la anterior, se puede elegir entre varios tipos de métodos de solución o solvers lineales. Eligiendo distintos valores para la variable solver type, lo cual se realiza mediante la función
select solver type(nuevo tipo).
98
6.2. Librerı́a matricial
Hasta la fecha nada más es posible emplear el método basado en la descomposición LU que facilita la librerı́a GMM++, lo que corresponde a un
valor de solver type = 0.
6.2.6.
Dependencia entre componentes de la librerı́a
Los distintos componentes que forman la librerı́a LMX, se agrupan en archivos. En los archivos de cabecera (con extensión ".h") se declaran las clases,
variables y funciones mientras que en los archivos con extensión ".cpp" (o
".cxx") es donde se define todo lo declarado en los archivos de cabecera.
Como excepción, la definición de las clases y funciones patrón (template) es
necesario realizarla en los archivos de cabecera.
El diagrama de dependencias entre los archicos de cabecera de la librerı́a
implementada se muestra en la figura 6.5. Los archivos con marco gris corresponden a enlaces externos a la librerı́a, mientras que el resto de archivos
se corresponden con las clases expuestas anteriormente excepto dos. Tanto
"lmx.h" como "linear solvers.h" son archivos de enlace entre las clases.
De hecho, el archivo de cabecera "lmx.h" es el archivo básico de la librerı́a
y el único que es necesario enlazar desde una aplicación externa.
gmm.h
data_mat.h
iostream
type_hb.h
type_gmm.h
matrix.h
cstdlib
fstream
type_stdvector.h
vector.h
linear_system.h
linear_solvers.h
lmx.h
Figura 6.5: Relaciones entre ficheros en la librerı́a LMX
Capı́tulo 6. Diseño e implementación del entorno
6.3.
99
Librerı́a de métodos de solución no lineales
Para resolver un sistema de ecuaciones no lineales expresado en forma no
lineal
R(q) = 0
(6.1)
se puede aplicar cualquiera de los métodos expuestos en el capı́tulo 3.
En el entorno proyectado, se ha creado una librerı́a de métodos de solución no lineal que bascula alrededor de una clase que representa el sistema no
lineal, Nl system. En principio, se ha decidido definir un espacio de nombres
especı́fico para esta librerı́a, de prefijo "nls::". A pesar de ser una librerı́a
aparte de LMX (la librerı́a matricial descrita en el apartado anterior), necesita a ésta para su funcionamiento ya que se utilizas las clases en ella definidas
para crear, manipular y resolver las matrices, vectores y sistemas lineales que
aparecen en la resolución de los sistemas no lineales.
El diseño básico de la clase Nl system —que se encuentra actualmente
implementado— consta de las siguientes funciones miembro que realizan las
tareas básicas:
Nl system() (constructor vacı́o): crea un objeto inicializando algunos
parámetros de gestión dinámica de memoria.
Nl system(vector q o) (constructor ): crea un objeto con el vector de
entrada como coordenadas iniciales de arranque del método de solución.
Además de para tener un punto de arranque, este vector es necesario
para conocer la dimensión del problema, a partir de la cual se inicializan el vector de almacenamiento del residuo en cada iteración y, si es
necesario, la matriz jacobiana (tangente).
∼Nl_system() (destructor ): destruye el objeto realizando operaciones
de liberación de memoria.
solve yourself(objeto*, max iteraciones): Función que resuelve
el sistema no lineal a través de las funciones definidas en el objeto*
que deben tener el siguiente nombre y la siguiente función:
• residue(vector q): Ha de devolver el valor del residuo R(q).
• convergence(vector q): Ha de devolver un valor booleano verdadero si se cumple el criterio de convergencia que se aplique a
partir de las coordenadas dadas y falso si no se cumple.
• jacobian(vector q): (Sólo para el método de Newton) Ha de devolver el valor de la matriz tangente o jacobiana del problema:
Dq (R(q)) =
∂R
∂q
(6.2)
100
6.4. Librerı́a de sistemas de ecuaciones diferenciales
6.3.1.
Selección de método de solución de ecuaciones
no lineales
Los métodos de resolución implementados se escogen de manera muy
similar a cómo se seleccionan los métodos en la librerı́a matricial. Ası́, existe
un parámetro de la biblioteca (nl solver type) que, en función del valor
que posea, se selecciona un método u otro a la hora de lanzar la función de
resolución (solve yourself).
Este parámetro se selecciona mediante una función también perteneciente
a la biblioteca llamada select nl solver type(tipo). Aunque de momento sólo se encuentra implementado el método de Newton, los valores de este
parámetro indicados en la tabla 6.2 restán previstos para su próxima implementación.
Valor de
nl solver type
0
1
2
3
Método de solución de
ecuaciones no lineales
Método de Newton
Método de Newton modificado
Método de la secante DFP
Método de la secante BFGS
Cuadro 6.2: Valores para el parámetro nl solver type
6.4.
Librerı́a de sistemas de ecuaciones diferenciales
Con el objetivo de aumentar la cantidad de problemas que se pueden
resolver con las herramientas que poseen las librerı́as anteriores, se ha desarrollado esta nueva librerı́a que permite definir y resolver mediante distintas
técnicas numerosos tipos de problemas definidos a través de un sistema de
ecuaciones diferenciales de tipo ODE o DAE.
La librerı́a tiene tres tipos de componentes matemáticos distintos:
Sistemas de ecuaciones diferenciales: definen la relación entre la derivada ordinaria de orden p y funciones del resto de derivadas (de orden
hasta p − 1) y la variable independiente. Para cada tipo de sistema se
diseña e implementa una clase distinta.
Tipos de problema: Se especifican desde problemas de valor inicial, para
los que se especifican las p−1 condiciones iniciales para el instante t = t0
hasta problemas de contorno, para los que se conocen los valores de las
incógnitas o de alguna de sus derivadas espaciales en todo el contorno.
Capı́tulo 6. Diseño e implementación del entorno
101
Integradores temporales: calculan el valor de las incógnitas y sus derivadas temporales hasta de orden p − 1 a partir de la derivada de orden
p.
Tipos de problema
Init val problem , Bound val problem , . . .
Sistemas diferenciales
Integradores temporales
Mec ode → M q̈ = Q(q, q̇) + Q(t)
Integrator ab: Adams-Bashford
Std ode → ẏ = F(y, t)
½
ẏ = F(y, t)
Std dae →
Φ(y) = 0
Integrator am: Adams-Moulton
...
...
Integrator abam:
Adams-Moulton-Adams-Bashford
Figura 6.6: Esquema de la librerı́a de sistemas diferenciales
Una estructura muy simplificada de esta librerı́a se muestra en la figura
6.6. Cada uno de los componentes matemáticos se puede representar mediante distintas clases de objetos. A su vez, cada una de estas clases tiene tanto
caracterı́sticas propias como comunes al tipo de componente que representa.
Ası́, se pueden destacar para cada una de los grupos de clases ciertas funciones que es necesario implementar en cada una para atender a peticiones
externas.
Todas las clases se encuentran definidas en un espacio de nombres común
que corresponde al prefijo "dif::". Se van a describir a continuación las
distintas funcionalidades de cada uno de los grupos de clases de esta librerı́a,
distinguiendo entre las que son comunes y especı́ficas de cada clase.
6.4.1.
Tipos de problema
La categorı́a de tipo de problema es la menos uniforme en cuanto al diseño
de las clases. Por ello, no existe un modelo que se establezca los requisitos
mı́nimos de la estructura de cada clase de objetos que se implementa en este
grupo.
102
6.4. Librerı́a de sistemas de ecuaciones diferenciales
La caracterı́stica común de los tipos de problema es que cada objeto que
derive de cualquier clase de este grupo ha de tener especificado dos objetos
concretos: un sistema de ecuaciones diferenciales y un método de solución —
de momento sólo hay disponibles integradores temporales—. Esta asociación
se realiza a través del constructor o de funciones especı́ficas.
En cuanto a las diferencias entre las clases de problemas, al haber realizado únicamente la implementación de una clase de objetos, sólo se puede adelantar que existirán las propias que derivan de las necesidades de resolución
y control de la solución de cada tipo de problema. Para el tipo implementado
se van a describir en mayor detalle los atributos y funciones miembro que
posee.
Problema de valor inicial: clase Init val problem
Corresponde con un problema definido por un sistema diferencial cuya
variable independiente es el tiempo, t. En un instante, t0 , se conoce la configuración del sistema diferencial (de orden p) y la de sus (p − 1) derivadas.
Para poder resolver el problema de valor inicial se han de especificar el
sistema diferencial, sus condiciones iniciales y el integrador a usar. Todos
ellos deben ser objetos externos al problema y, por tanto, se han de definir
en una función que controle todo el proceso de creación y solución.
Los atributos de la clase son los siguientes:
diff system, puntero al sistema de ecuaciones diferenciales que puede
ser de cualquier clase de las definidas en dicho grupo.
integrator, puntero al integrador que, al igual que el sistema, puede
ser de cualquier clase.
q init, puntero a un vector STL de dimensión igual al orden del sistema diferencial (p) que contiene la configuración inicial del sistema
(p−1)
desde q0 en q init[0] hasta q0
en q init[p-1].
Y las funciones miembro junto con los constructores y destructores:
Init val problem() (constructor vacı́o): crea un objeto inicializando
los punteros a 0.
Init val problem(system in, q init in) (constructor estándar sin
integrador ): crea un objeto a partir de un sistema diferencial system in
con las condiciones iniciales especificadas por q init in. Este constructor está pensado para poder definir un integrador estándar aunque
todavı́a está por decidir la forma en que éste se especifica.
Init val problem(system in, integrator in, q init in) (constructor estándar con integrador ): igual que el anterior pero se especifica el
objeto integrador a usar mediante el parámetro integrator in.
Capı́tulo 6. Diseño e implementación del entorno
103
∼Init val problem() (destructor ): destruye el objeto.
set integrator(integrator in): define el integrador a usar para un
objeto existente mediante el objeto integrator in que se pasa como
argumento de la función.
solve yourself(to, tf, h): función que resuelve el problema de valor inicial desde la configuración inicial en to hasta el tiempo tf con
un paso de tiempo definido por h. Para ello se invoca a la función
integrate del integrador.
6.4.2.
Sistemas diferenciales
Este grupo de clases definen un sistema de ecuaciones diferenciales total,
ya sea ODE o DAE (por total se entiende que no existen derivadas parciales).
Al cumplir todos ellos realmente la misma función, que es la de implementar
un sistema diferencial, las funciones a las que deben responder tienen la
misma forma.
Para que se puedan invocar las funciones de cualquier clase de sistema
de una forma homogénea se ha definido una clase abstracta, que no es más
que un interfaz que además funciona como plantilla de todas las clases de
sistemas diferenciales. Se va a explicar el contenido de esta interfaz como
muestra de la funcionalidad de las clases que concretan cada tipo de sistema
sin entrar en detalle de cómo se realiza la implementación en cada uno.
Clase abstracta total diff
En esta clase se declaran las siguientes funciones, que son las de definición
obligatoria en cada una de las clases de este grupo.
order(): devuelve el orden del sistema diferencial implementado en la
clase.
residue(q, time n): calcula (y devuelve) el residuo del sistema diferencial para la configuración indicada en el contenedor q en el instante
dado por time n.
jacobian qddot(q, partial qdot, partial q): calcula la tangente
al residuo (jacobiano del sistema) con respecto a la segunda derivada
de las variables dependientes cuando el sistema tiene la configuración
indicada en el contenedor q en el instante dado por time n.
evaluate(q, time n): calcula el valor de la derivada p-ésima del sistema diferencial de orden p cuando el sistema tiene la configuración
indicada en el contenedor q en el instante dado por time n.
104
6.4. Librerı́a de sistemas de ecuaciones diferenciales
evaluate(q, qdot, time n): calcula el valor de la aceleración del sistema diferencial de segundo orden cuando el sistema tiene la configuración indicada en el contenedor q en el instante dado por time n.
convergence(q, time n): devuelve verdadero o falso en función de
que se cumpla o no el criterio de convergencia para el residuo cuando el
sistema tiene la configuración indicada en el contenedor q en el instante
dado por time n.
6.4.3.
Integradores temporales
La colección de integradores temporales tiene una estructura similar a la
de los sistemas diferenciales. Como base de todas las clases existe una clase
abstracta llamada Integrator base que sirve de interfaz para las llamadas
a la integración del sistema que realizan los objetos pertenecientes a los tipos
de problemas. Ası́, la única función definida en esta clase abstracta es:
integrate(to, tf, h, *system in, q init): que realiza la labor de
integrar el sistema diferencial al que apunta *system in a partir de las
condiciones iniciales dadas en el contenedor q init en el instante to.
La integración se realiza con el paso máximo h hasta el tiempo tf.
Hasta el momento se han implementado dos familias de integradores temporales: aquellos basados en la fórmula de Adams-Bashford, de tipo explı́cito y los de tipo Adams-Moulton, de tipo implı́cito. La implementación de
cada tipo incluye numerosas funciones además de la impuesta por la clase
Integrator base, por ello se ha creı́do útil explicar su estructura interna.
Además, la implementación de ambos sirve de base para futuras implementaciones de otros integradores tanto explı́citos como implı́citos.
Familia Adams-Bashford de integradores: clase Integrator ab
Los integradores de tipo explı́cito como los de esta familia sólo necesitan
resolver sistemas lineales. Incluso en caso de los sistemas mecánicos en los que
se modela la masa a través de una matriz diagonal (lumped ), no es necesario
ni siquiera resolver ningún sistema.
Debido a la simplicidad de estos esquemas de integración, no es necesario
implementar muchas funciones para conseguir una separación de tareas que
produzca un código fácil de mantener.
Para la implementación de esta clase se han definido los siguientes atributos:
order define el orden de integración que se empleará al aplicar el método.
time almacena el valor de la variable tiempo para cada paso.
Capı́tulo 6. Diseño e implementación del entorno
105
h valor del paso de tiempo h = (tn − tn−1 ).
q contenedor de los vectores de incógnitas básicas y sus p-derivadas del
problema que se integra, donde el sistema diferencial es de orden-p.
Por otra parte, las funciones miembro son las siguientes:
Integrator ab() (constructor vacı́o): crea un objeto vacı́o.
Integrator ab(order) (constructor estándar ): crea un objeto integrador del orden especificado.
∼Integrator ab() (destructor ): destruye el objeto.
initialize(q init, to, h in): inicializa el método de integración
creando el contenedor (q) de las dimensiones adecuadas, asignando las
condiciones iniciales dadas por q init para el instante to y un paso
dado por h in.
advance(): realiza el avance (tn+1 = tn + h) actualizando el contenedor
de incógnitas al nuevo valor dado por el método.
integrate(to, tf, h, *system, q init): equivalente al definido en
la clase interfaz Integrator base.
Familia Adams-Moulton de integradores: clase Integrator am
Esta clase implementa una familia de integradores implı́citos que, a diferencia de los anteriores, aplican en cada paso de tiempo un método de
solución no lineal para resolver un sistema residual.
Esta pequeña diferencia hace más compleja la implementación del método
y mucho más costoso el cálculo de cada paso de tiempo.
Los atributos de esta clase de objetos se enumeran a continuación:
order define el orden de integración.
size guarda el tamaño de los vectores de incógnitas. Corresponde a
una variable auxiliar que hace más legible el código.
*system puntero al sistema diferencial que al que se aplica la integración.
time almacena el tiempo en cada paso.
h valor del paso de tiempo.
step número de pasos realizados.
b[5][5] matriz de coeficientes del método. Hasta el momento se dispone de hasta el método de orden 5.
106
6.4. Librerı́a de sistemas de ecuaciones diferenciales
q contenedor de los vectores de incógnitas y derivadas hasta de orden-p
(el orden del sistema diferencial).
*iteration puntero al sistema no lineal que se ha de resolver en cada
paso.
temp variable auxiliar que permite un avance eficiente de la solución.
Además de los atributos anteriores, se dispone también de la siguiente
colección de funciones miembros:
Integrator am() (constructor vacı́o): crea un objeto vacı́o.
Integrator am(order) (constructor estándar ): crea un objeto integrador del orden especificado.
∼Integrator am() (destructor ): destruye el objeto.
initialize(q init, to, h in): inicializa el método de integración
creando el contenedor (q) de las dimensiones adecuadas, asignando las
condiciones iniciales dadas por q init para el instante to y un paso
dado por h in.
advance(): realiza el avance (tn+1 = tn + h) moviendo las incógnitas
del contenedor de manera eficiente.
actualize(qddot in): actualiza el valor de las p-variables diferenciales
dependientes de la elegida para resolver cada paso de integración. En el
método implementado se ha elegido la derivada de mayor orden como
la incógnita a resolver en cada iteración.
residue(qddot in): devuelve el residuo para el valor dado de las incógnitas elegidas para las iteraciones. Realmente llama a la función actualización y luego pide al sistema diferencial que calcule el residuo para el
valor de las incógnitas y todas sus derivadas.
jacobian(qddot in): devuelve el jacobiando del residuo para el valor
dado de las incógnitas elegidas para las iteraciones. Al igual que la
anterior, actualiza (si es necesario) y posteriormente llama a la función
equivalente del sistema diferencial.
convergence(qddot in): llama a la función correspondiente del sistema diferencial para comprobar si existe convergencia.
integrate(to, tf, h, *system, q init): equivalente al definido en
la clase interfaz Integrator base.
Las tres funciones residue, jacobian y convergence son necesarias para
poder crear un objeto Nl system a partir del propio objeto integrador.
Capı́tulo 6. Diseño e implementación del entorno
6.4.4.
107
Ejemplo de utilización de la librerı́a
Se plantea la resolución de un problema de valor inicial definido por los
siguientes elementos:
El sistema diferencial tiene la forma
Mq̈ = Q1 (q, q̇) + Q2 (t)
donde
• la matriz de masa es
·
¸
20 0
M=
10 30
• y las funciones Q(q, q̇) y Q(t) se encuentran implementadas previamente mediante las funciones
q q(qin, qdotin) → Q(q, q̇) = Q11 (q) + Q12 (q̇)
q t(time) → Q(t)
Las condiciones iniciales, para t = t0 = 5, son las siguientes:
¾
¾
½
½
0,0
2,4
q̇(t0 ) =
q(t0 ) =
0,5
1,0
Se ha de integrar hasta un instante final t = tf = 10 mediante un
integrador implı́cito Adams-Moulton de orden 2 (regla trapezoidal ). El
paso de tiempo ha de ser de h = 0, 1
Las iteraciones en cada paso se resolverán mediante el método de Newton, para lo que se conocen también las funciones tangentes a las fuerzas
(jacobianos):
jacq q(qin) → ∇q Q11 (q)
jacq qdot(qdotin) → ∇q̇ Q12 (q̇)
Para resolver este problema mediante la librerı́a implementada se ha de
programar un código como el siguiente:
// creación de la matriz de masa de 2x2:
lmx::Matrix<double> masa(2,2);
// creación de los vectores de posiciones iniciales:
lmx::Vector<double> pos_inicial(2);
lmx::Vector<double> vel_inicial(2);
// definición del contenedor de condiciones iniciales:
std::vector< lmx::Vector<double>* > q_init;
108
6.4. Librerı́a de sistemas de ecuaciones diferenciales
// Definición de coeficientes:
masa(0,0) = 10.; masa(0,1) = 0.;
masa(1,0) = 20.; masa(1,1) = 30.;
pos_inicial(0) = 2.4;
pos_inicial(1) = 1.;
vel_inicial(0) = 0.;
vel_inicial(0) = 0.5;
// Llenado del contenedor de condiciones iniciales:
q_init.push_back(&pos_inicial); // = q_init[0]
q_init.push_back(&vel_inicial); // = q_init[1]
// Selección del método de Newton para el solver:
nls::select_nl_solver_type(0);
// Definición del sistema diferencial:
dif::Mec_ode<double> mecanismo(masa, q_q, q_t, jacq_q,
jacq_qdot);
// Definición del integrador de orden dos:
dif::Integrator_am<double> integrador(2);
// Definición del problema de valor inicial:
dif::Init_val_problem<double> problema(mecanismo, integrador,
q_init);
// Lanzamiento del cálculo de solución en el
//
intervalo t=(5,10) con un paso de tiempo de h=0.1:
problema.solve_yourself(5. , 10. , 0.1);
La estructura interna que se genera en la librerı́a con el código anterior
es la mostrada en la figura 6.7.
El objeto problema se crea una vez se han definido el mecanismo y el
integrador. Esto ha de ser ası́ para que se generen los enlaces (punteros)
necesarios entre ellos a través de sus respectivas interfaz que corresponden a
las clases Total diff e Integrator base.
Cuando el integrador llama a alguna función del sistema diferencial, el
interfaz que implementa la clase Total diff permite que el integrador encuentre el sistema al que desea hacer referencia, de la clase Mec ode. Lo mismo
se puede decir con respecto a la relación entre el problema y el integrador, al
que encuentra mediante el enlace dinámico que crea la interfaz (en este caso,
Capı́tulo 6. Diseño e implementación del entorno
Total diff
Init val problem
Mec ode
109
Integrator base
Integrator am
Nl system
Leyenda:
Relación explı́cita
Relación estructural mediante punteros
Relación estructural mediante herencia
Figura 6.7: Ejemplo de esquema de uso de la librerı́a
la clase Integrator base).
La selección del método de solución para la ecuación no lineal se realiza
mediante la llamada a la función select nl solver type con el argumento
correspondiente al método de Newton (0). Realmente no serı́a necesaria esta
llamada ya que este método es el asignado por defecto.
El objeto de la clase Nl system no se crea explı́citamente sino que se
instancia a través de la función solve yourself del objeto problema. Al
crearse el objeto que implementa el método de solución no lineal se crea
también un enlace (puntero) para que éste pueda acceder a las funciones
definidas en el integrador para el cálculo del residuo, jacobiano y criterio
de convergencia.
Capı́tulo 7
Aplicaciones del entorno
Una vez expuestas las capacidades del entorno para la resolución de problemas numéricos, se desea comentar las aplicaciones que se han contemplado
para un primer uso de las librerı́as desarrolladas.
El desarrollo de estas aplicaciones tiene un doble fin: por un lado cubren una necesidad de cálculo determinada. Por otro lado, el ejercicio de su
implementación resulta útil y hasta didáctico ya que durante el mismo aparecen nuevas necesidades que ayudan a concretar las capacidades futuras del
entorno de simulación.
Para que se cumplan los fines anteriores las aplicaciones desarrolladas no
deben ser muy complejas y, por tanto, es preferible comenzar diseñando y
programando códigos sencillos que realicen una función concreta y avanzar
en la complejidad y generalidad de los códigos según se concreta el entorno
de simulación. Por ello, para empezar, se ha optado por no ser ambicioso
en los requisitos funcionales y se comienza describiendo una aplicación muy
básica enfocada al cálculo estructural lineal.
La experiencia de la programación de la aplicación de cálculo estructural permite abordar el planteamiento de un proyecto más complejo como es
el de una aplicación más general de cálculo dinámico. A pesar de que se
concibe como un proyecto a largo plazo, el diseño de la misma se plantea
modularmente, permitiendo una implementación paso a paso en la que los
hitos intermedios se relacionan con el tipo de problemas que será capaz de
resolver.
7.1.
PACE: Programa Académico de Cálculo
de Estructuras
PACE es un programa diseñado para la generación automática de ejercicios que apoyen el aprendizaje de los métodos matriciales empleados para la
resolución de estructuras de barras y vigas a través del método de la rigidez
basado en la formulación fuerte.
111
112
7.1. PACE: Programa Académico de Cálculo de Estructuras
7.1.1.
Caracterı́sticas del programa
Además de la necesidad de realizar una prueba de la biblioteca LMX de
álgebra de matrices y métodos lineales de solución, la aplicación cumple una
función concreta. Previamente el diseño e implementación de la misma se
definieron los siguientes requisitos que debı́a cumplir desde el punto de vista
funcional:
Resolución de análisis estáticos de estructuras planas con capacidad
para ampliar la resolución a estructuras tridimensionales en un futuro,
ası́ como la implementación de otros tipos de problemas: modos de
pandeo y cálculo dinámico mediante extracción modal.
Trabajo con distintos materiales con posibilidad de definir una librerı́a
de materiales.
Aplicación de distintas secciones a los elementos con posibilidad de
definir una librerı́a de secciones.
Implementación de uniones rı́gidas y articuladas. Otro tipo de uniones
se ha de poder añadir sin una modificación sustancial del código.
Aplicación de cargas puntuales en nudos y distribuı́das en elementos
contemplando una futura ampliación a casos más generales.
Aplicación de condiciones de contorno eseciales en nudos, en principio,
concordantes con las direcciones marcadas por el sistema global.
Salida de resultados en archivos de texto plano y salida de informes en
archivos formateados en código LATEX.
7.1.2.
Estructura del código
Hasta el momento el código generado cumple con los requisitos mı́nimos
especificados anteriormente pudiendo realizar análisis estáticos lineales de estructuras planas compuestas por barras o compuestas por vigas de Bernoulli.
La flexibilidad que se especifica en los requisitos hace imprescindible el
uso de clases y la separación de tareas en funciones miembro para cada clase
de objetos. El esquema diseñado crea una clase de objetos para cada uno de
los elementos lógicos que componen una estructura, a pesar de que muchos
de ellos de momento podrı́an definirse como simples estructuras de datos.
La estructura de clases de la aplicación está compuesta por los siguientes
elementos:
Structure: Clase que representa al modelo de la estructura. Contiene
como atributos el tı́tulo y la dimensión del problema, número total
de elementos y de nodos, contenedores de nodos, materiales, secciones,
Capı́tulo 7. Aplicaciones del entorno
113
elementos, restricciones y fuerzas. Además, almacena datos de cálculo
como los desplazamientos o reacciones entre otros.
Aparte de los constructores y destructor, es posible realizar tareas propias a través de las funciones miembro que se indican a continuación:
• read input("nombre archivo"), leer una entrada de archivo,
• form Kest(), ensamblaje de la matriz de rigidez,
• form LR, identificación de GDLs libres y restringidos,
• separate Kest(), separación del sistema de ecuaciones,
• form ur(), form f() y form(), formación de los vectores y del
sistema de ecuaciones,
• solve(), resolución del sistema de ecuaciones y, finalmente,
• latex out(), salida del informe de resolución.
Node: Representa a los nodos o nudos (en lenguaje tradicional) de la
estructura. Los parámetros almacenan información del número de nodo
(i), y sus posiciones en el espacio (x, y, z) —aunque de momento sólo
se pueden posicionar en el plano (z = 0)—. De momento esta clase no
dispone de funciones miembro más que las necesarias para su creación,
destrucción y acceso a datos en modo sólo lectura.
Material: Realiza la función de simular el comportamiento del material. De momento, al poseer únicamente la capacidad de análisis lineal, se pueden implementar sólo los parámetros que definen el comportamiento lineal (Módulos de Young y de Poisson) a través de los
parámetros young y poisson. El número de material se almacena en el
parámetro n_mat. No se trabaja de momento con el peso calculado a
través de la densidad por lo que no existe un parámetro que la defina.
Section: Almacena los datos de la sección, como la inercia (en inertia)
y el área (en area) y el número de sección (en n_sec).
Element: Simula cada uno de las barras y vigas de la estructura, almacenando su numeración global, dimensión (grados de libertad de sus
nudos), ası́ como unos punteros hacia su nudo inicial y final, sección y
material.
Mediante los parámetros anteriores es capaz de calcular sus matrices de rigidez en coordenadas locales (compute_Klocal) y globales
(compute_Kglobal), matriz de giro (compute_L) y ensamblarse (mediante assemble_yourself(Kest, nodes_in)) en la matriz de rigidez
de la estructura.
Restriction: Permite restringir el movimiento de los nodos en la dirección especificada (de momento, sólo direcciones globales). Almacena
114
7.1. PACE: Programa Académico de Cálculo de Estructuras
el número de nodo (node) al que afecta y unos parámetros que, en caso
de ser no nulos, hacen que se aplique la restricción en las direcciones x,
y, z (rx, ry, rz).
Force: Representa una fuerza con componentes (x, y) y componente de
momento alrededor del eje-z (fx, fy y mz, respectivamente), aplicada
en el nodo indicado por el parámetro node.
La función principal (main()) que guı́a el proceso de resolución del problema tiene la siguiente forma:
int main(int argc, char *argv[])
{
// Selección del tipo de matriz y solver lineal de LMX:
lmx::select_matrix_type(0);
lmx::select_solver_type(0);
// Creación de objeto de clase Structure leyendo archivo:
Structure estruc("input.est");
// Formación del sistema de ecuaciones:
estruc.form();
// Resolución del sistema de ecuaciones:
estruc.solve();
// Creación del informe de salida en formato LaT
estruc.latex_out();
eX:
// Si todo ha ido bien...
return EXIT_SUCCESS;
}
7.1.3.
Estructura del archivo de entrada
Como se puede comprobar mediante el código anterior, la forma elegida
para crear un modelo y resolverlo es mediante un archivo de datos (de extensión ”.est”). A continuación se muestra un ejemplo comentado de dicho
archivo para un ejemplo sencillo.
El informe de salida que genera la aplicación a partir de este ejemplo se
presenta en el apéndice A.
// Archivo de plantilla para la introducción de datos en PACE:
// Esto es un comentario, igual que cualquier otra cosa que
// empiece por " // " (separado con espacios).
Capı́tulo 7. Aplicaciones del entorno
115
TITLE Estructura // Tı́tulo del problema. Solo una palabra y,
// además, sin espacios ni guiones bajos.
DIMENSION 2 // GDL de cada nodo: 2 -> Estructura articulada ;
// 3 -> Estr. de nudos rigidos (portico plano).
MATERIAL 1 // Numero total de materiales del problema, a partir
// de aqui empieza su definicion:
1 2.1E3 0.3 // Numero de material = 1, Modulo de Young = 2.1E9,
//Modulo de Poisson = 0.3
SECTION 1 // Numero total de materiales del problema, a partir
// de aqui empieza su definicion:
1 0.2 4E-3 // Numero de la seccion = 1, Area = 0.2,
// Inercia = 4E-3
NODE 3 // Número total de nodos del problema,
// empieza su definicion:
1 0.0 0.0 // Número de nodo = 1, coordenada x
// coordenada y = 0.0
2 0.0 3.4 // Número de nodo = 2, coordenada x
// coordenada y = 3.4
3 2.3 3.4 // Número de nodo = 3, coordenada x
// coordenada y = 3.4
ELEMENT 3 //
//
1 1 2 1 1 //
//
2 3 2 1 1 //
//
3 3 1 1 1 //
//
Número total de
aqui empieza su
Número de barra
final = 2, tipo
Número de barra
final = 2, tipo
Número de barra
final = 2, tipo
FORCE 3 -100.0 0.0 10.0 //
//
//
//
a partir de aqui
= 0.0,
= 0.0,
= 2.3,
barras del problema, a partir de
definicion:
= 1, nodo inicial = 1, nodo
de seccion = 1, Material = 1
= 2, nodo inicial = 1, nodo
de seccion = 1, Material = 1
= 2, nodo inicial = 1, nodo
de seccion = 1, Material = 1
Fuerza puntual aplicada en el nudo
3, direccion x-global = -100.0,
direccion y-global = 0.0, momento
z-global = 10.0
RESTRICTION 2 // Número total de apoyos en la estructura, a
// partir de aqui empieza su definicion:
1 0 1 0 // Apoyo en nodo = 1, restriccion según eje-x = 0 (no se
// aplica), restriccion según eje-y = 1 (se aplica) y
116
7.2. Aplicación de simulación dinámica de mecanismos flexibles
// empotramiento en eje-z = 0 (no se aplica)
2 1 1 0 // Apoyo en nodo = 3, restriccion según eje-x = 1 (se
// aplica), restriccion según eje-y = 1 (se aplica)
7.2.
Aplicación de simulación dinámica de mecanismos flexibles
La realización de una aplicación de estas caracterı́sticas requiere un estudio en profundidad del diseño de la jerarquı́a de clases y funciones.
El diseño que se presenta en esta sección es el resultado tanto del conocimiento de la formulación empleada en este tipo de simulaciones como
de la experiencia de diseño y programación del entorno de simulación y de
algunas aplicaciones más sencillas como la comentada en la sección anterior.
No obstante, no deja de ser un diseño de fase inicial, que ha de ser sometido
a revisiones fruto de las experiencias que se den durante la implementación
y utilización de la propia aplicación.
7.2.1.
Objetivos de la aplicación
El rasgo distintivo de esta aplicación es su capacidad para analizar la
dinámica de mecanismos flexibles. Sin embargo, es necesario extraer y concretar los aspectos fundamentales de la anterior definición de manera que se
puedan dar unas especificaciones de partida que permitan abordar un diseño
concreto de la aplicación que cumpla con las restricciones que se marquen.
La concreción de la variedad de análisis, mecanismos y métodos de implementar la flexibilidad, ası́ como las relaciones entre los cuerpos y otras
cualidades forman un conjunto de caracterı́sticas de las cuales, las más básicas que debe tener la aplicación se pueden resumir en los siguientes puntos:
Se han de poder realizar análisis estáticos, dinámicos y modales. Además,
estos análisis se deben poder encadenar a lo largo del tiempo.
Los tipos de sólidos a implementar serán partı́culas, sólidos rı́gidos y
flexibles.
La flexibilidad de los sólidos se debe poder simular mediante el método
de elementos finitos en coordenadas absolutas o referencia flotante.
Las restricciones se podrán poder aplicar mediante los tres métodos
explicados en el capı́tulo 2: multiplicadores de Lagrange, penalización
y lagrangiano aumentado.
Se debe poder implementar modelos tridimensionales pero también modelos planos que aprovechen la reducción de grados de libertad para
agilizar los cálculos.
Capı́tulo 7. Aplicaciones del entorno
117
Se implementarán las funcionalidades necesarias para permitir una generación lógica de los mecanismos a base de distintos niveles de sistemas.
La ejecución podrá ser interactiva o por lotes.
7.2.2.
Esquema básico de la aplicación
Las funciones básicas que debe realizar la aplicación para resolver un
problema de simulación se pueden clasificar en la siguiente lista ordenada:
1. Lectura de los datos entrada.
2. Generación del modelo de mecanismo.
3. Definición y resolución de los análisis requeridos.
4. Salida de resultados.
A partir de como se ejecute la aplicación se distinguirán dos modos de
funcionamiento:
Ejecución por lotes (batch processing): las funciones se ejecutan en el
orden establecido anteriormente y, finalizado el proceso, se termina la
ejecución.
Ejecución interactiva: el usuario decide en qué momento se realiza cada
función, para lo que ha de conocer las precedencias entre una y otra.
Como se puede suponer, es mucho más sencillo programar una ejecución
por lotes que una interactiva, por lo que resulta conveniente dejar la programación de la interactividad para una segunda fase de desarrollo.
Una primera versión de esta aplicación con un contenido mı́nimo se puede
realizar implementando los procedimientos anteriores. La dificultad de esta
implementación radica principalmente en la definición del modelo y la resolución de las ecuaciones. El modelo de mecanismo propuesto se presenta en la
siguiente sección y en el se establece un objeto, el ensamblador que controla
la formación de las ecuaciones en su forma ODE o DAE.
Haciendo uso de las herramientas del entorno de desarrollo para simulación que se describió en el capı́tulo anterior, es posible generar rápidamente
un análisis estático o dinámico simplemente enlazando el objeto que representa el sistema de ecuaciones diferenciales (Total diff) con el objeto ensamblador (Assembler, ver siguiente sección) que le facilite el cálculo de los
vectores y matrices del sistema en cada instante.
En la figura 7.1 se muestra el esquema relacional para la resolución de
análisis en una primera versión de la aplicación.
118
7.2. Aplicación de simulación dinámica de mecanismos flexibles
Analysis
Problem type
Assembler
Total diff
Integrator base
Figura 7.1: Relación entre clases del entorno y aplicación
7.2.3.
Esquema de clases para el modelo de mecanismo
Cualquier aplicación de simulación nace por su módulo de cálculo (proceso) que es, precisamente, el que se desea describir en esta sección.
Según lo expuesto en el capı́tulo 2 de formulación, la dinámica de cualquier
conjunto de mecanismos de sólidos flexibles se puede representar mediante
la siguiente ecuación en función de las coordenadas generalizadas:
Mq̈ + Q(q, q̇, t) = 0
Φ = 0
(7.1)
(7.2)
donde la ecuación (7.2) desaparece al aplicar el método de penalización
o de lagrangiano aumentado para la imposición de restricciones.
Desde el punto de vista de la generación de la ecuación anterior, se puede
realizar la siguiente reordenación de términos:
finercia + fΦ + fint = fext
(7.3)
donde:
fΦ son las fuerzas de las restricciones.
fint son las fuerzas internas de los elementos.
fext son las fuerzas aplicadas externamente.
Sin querer entrar en mayor detalle, mediante las anteriores ecuaciones se
quiere hacer notar que la formulación de las anteriores ecuaciones requiere
de un proceso de ensamblaje en cada instante que recolecte los términos de
fuerza que aporta cada uno de los objetos reales: cuerpos (sólidos y flexibles),
restricciones y fuerzas exteriores.
Tanto los cuerpos como las restricciones se pueden ver como instancias
concretas de una clase de objetos más general, que se llamará componente.
Desde el punto de vista de la topologı́a real de los mecanismos, se pueden
realizar asociaciones funcionales de objetos en forma de subsistemas que, por
un lado cumplen en su conjunto una función concreta por lo que pueden
aparecer repetidos en un mismo sistema y por otro suelen encontrarse agrupados en el espacio con una superficie exterior para el subsistema menor que
la suma de las superficies de cada uno de sus elementos. Esto último hace
Capı́tulo 7. Aplicaciones del entorno
119
que este tipo de agrupaciones sea deseable para establecer una búsqueda de
contactos entre superficies, que aunque no se plantea como una prestación
de la aplicación en este momento, sı́ que se intenta prever.
Por todo lo anterior, el esquema de clases propuesto contiene un objeto
sistema que agrupa a otros objetos. La clase sistema agrupa a objetos de
tipo componente y su diseño responde a una solución recursiva en la que,
además, cada sistema puede contener a su vez otros sistemas. Esta recursividad permite generar una jerarquı́a de tantos niveles de sistemas como se
desee y también hace posible definir para cualquier mecanismo un sistema
global que contendrá directa o indirectamente todos los objetos. Un ejemplo
de esta jerarquı́a se encuentra indicado en la figura 7.2, en la que cada objeto
system podrı́a contener objetos a su vez componente y fuerza.
Global system
05
04
01
02
03
Figura 7.2: Esquema de relaciones entre clases system.
Sistemas: clase System
Según lo introducido anteriormente, esta clase de objetos deberá contener
una serie de objetos cuyo número se desconoce. Además, no se quiere eliminar
la posibilidad de que exista algún objeto que pertenezca a dos sistemas a la
vez, por lo que más que funcionar como contenedores, los sistemas deberán
funcionar como clasificadores. Ası́, en vez de guardar a los objetos en sı́,
almacenarán referencias a esos objetos.
En el lenguaje C++ es relativamente sencillo implementar este tipo de
esquemas haciendo uso de dos herramientas: los punteros y los contenedores
de la librerı́a estándar (con prefijo std::, consultar STL [2005]). De esta
forma, una declaración básica de la clase System podrı́a ser la siguiente:
class System{
std::vector<Body*> bodies;
std::vector<Constrain*> constrains;
std::vector<System*> systems;
120
7.2. Aplicación de simulación dinámica de mecanismos flexibles
...
}
Para cada sistema, incluso el global, se establece la topologı́a interna con
forma recursiva que interrelaciona las clases según la manera mostrada en la
figura 7.3.
System
Body
Constrain
Figura 7.3: Relación entre clases determinada por punteros
Componentes: clase Component
La clase componente se puede imaginar como una interfaz de las clases
que representan a los cuerpos y las restricciones —que derivarán de ella heredando su estructura— (figura 7.4). El fin de esta interfaz es el de simplificar
la implementación del proceso de ensamblaje que, según se explicó anteriormente, no es necesario que haga distinción entre cuerpos y restricciones.
La funcionalidad básica de la interfaz es la de realizar la contribución al
vector de fuerzas y a la matriz de masas. Además, para poder aplicar el método de Newton será necesario formar el sistema jacobiano, por lo que también
se prevé una función que devuelva la contribución a la matriz tangente.
En C++, este tipo de interfaz se implementa a través de clases abstractas,
que son aquellas con alguna función virtual pura. Obviando los detalles, el
esquema de la clase Component serı́a el siguiente:
class Component{
...
virtual Matrix mass_contrib(...) = 0;
virtual Vector force_contrib(...) = 0;
virtual Vector tang_contrib(...) = 0;
...
}
Componente cuerpo: clase Body
Todas las clases de cuerpos sólidos tienen en común desde el punto de
vista geométrico que ocupan un lugar finito del espacio. Con respecto a la
Capı́tulo 7. Aplicaciones del entorno
121
System
Component
Body
Constrain
Leyenda:
Relación estructural mediante punteros
Relación estructural mediante herencia
Figura 7.4: Relación entre clases
formulación, todos ellos aportan contribuciones a la matriz de masas a pesar
de que no se calculen igual, y pueden o no contribuir al resto de vectores de
fuerzas.
Además de estructurar mejor la jerarquı́a de clases, la clase Body permite
crear un interfaz para las funciones que comparten los cuerpos sólidos. Esto
permite, por ejemplo, que una función de búsqueda de contacto no tenga que
distinguir entre las distintas clases de cuerpos sino que invoque a una función
genérica y sean estas últimas las que implementen su código particular.
El esquema de herencia se ilustra en la figura 7.5.
Component
Body
Rigid body
MEF body
···
Figura 7.5: Herencia entre clases de sólidos
Componente unión: clase Constrain
Al igual que sucede con los sólidos, las uniones entre los distintos objetos del sistema pueden ser del mismo tipo pero todas comparten ciertas
caracterı́sticas tanto geométricas como de formulación.
Para aprovechar estas similitudes, se ha realizado una agrupación que
cuelga de la clase abstracta Constrain a partir de la cual se generarán las
distintas clases de uniones, tal y como se muestra en la figura 7.6.
122
7.2. Aplicación de simulación dinámica de mecanismos flexibles
Component
Constrain
Distance cons
Plane cons
···
Figura 7.6: Herencia entre clases de uniones
Nodos: clase Node
Los nodos sitúan puntos de los componentes en el espacio y contienen la
información de las coordenadas generalizadas (grados de libertad, principalmente) de los componentes a los que pertenecen. Por tanto el objeto nodo
ha de tener los parámetros suficientes para definir su posición en el espacio.
Para permitir la implementación de elementos placa y viga, será necesario
que además de la posición, los objetos nodo definan también una orientación,
funcionando ası́ como un triedro de referencia local.
Al poder pertenecer a distintos objetos, la relación entre el objeto nodo
y el objeto que lo contiene se implementa a través de punteros, tal y como
indica la figura 7.7.
body1
constrain1
body2
···
node1
node2
node3
node4
Figura 7.7: Relación entre componentes y nodos mediante punteros
Ensamblador: clase Assembler
En el esquema propuesto, la clase ensamblador implementa los objetos
(normalmente suele haber sólo uno) encargados de guardar la numeración de
cada uno de los nodos y elementos, lo que les permite recolectar las contribuciones de cada objeto a las fuerzas y matrices de los sistemas de ecuaciones.
La doble estructura de relaciones mostrada en la figura 7.4 permite que
el proceso de búsqueda de componentes se realice mediante la estructura de
sistemas (clase System) y la llamada a funciones se implemente a través de
punteros genéricos a la clase Component de la cual derivan. Para implementar
este esquema hacen falta las relaciones a base de punteros entre la clase
ensamblador y las respectivas de los sistemas y componentes, tal y como se
indica en la figura 7.8.
Hay que hacer notar que la búsqueda puede implementarse simplemente
Capı́tulo 7. Aplicaciones del entorno
123
Assembler
System
Component
Body
Constrain
Leyenda:
Relación estructural mediante punteros
Relación estructural mediante herencia
Figura 7.8: Relación entre objetos a partir del ensamblador
conociendo la dirección que tiene el sistema global ya que a partir de éste se
pueden buscar el resto de sistemas.
Capı́tulo 8
Conclusiones y futuras lı́neas
de trabajo
8.1.
Conclusiones
8.2.
Futuras lı́neas de investigación
125
Apéndice A
Informe de salida de PACE
El siguiente informe es el resultado de ejecutar en PACE el ejemplo de
archivo de entrada expuesto en el capı́tulo 7 una vez compilado con LATEX,
sin ninguna modificación.
A.1.
Datos de partida del problema:
Tı́tulo: Estructura.
Grados de libertad de cada nodo de la estructura: 2.
Número de materiales empleados: 1.
Material número 1:
• Módulo de Young: 2100.
• Módulo de Poisson: 0.3.
Número de tipos de sección empleados: 1.
Sección número 1:
• Área: 0.2.
• Inercia: 0.004.
Número de nodos de la estructura: 3.
Nodo número 1: posición (0, 0).
Nodo número 2: posición (0, 3.4).
Nodo número 3: posición (2.3, 3.4).
Número de barras de la estructura: 3.
Tabla de conectividad de la estructura: .
127
128
A.2. Cálculo de la matriz de rigidez de la estructura.
Barra
1
2
3
NI
1
3
3
NF
2
2
1
material
1
1
1
sección
1
1
1
Número de apoyos de la estructura: 2.
En el nodo 1 existe un apoyo articulado móvil en dirección del eje-y.
En el nodo 2 existe un apoyo articulado fijo.
Fuerzas aplicadas en los nodos de la estructura: 1
En el nodo 3 se aplica una fuerza puntual con componente según el
eje-x: Fx = −100 y con componente según el eje-y: Fy = 0.
A.2.
Cálculo de la matriz de rigidez de la estructura.
A.2.1.
Matrices de rigidez de las barras.
Para el tipo de estructura estudiado, la matriz de rigidez en coordenadas
locales de las barras toma la siguiente forma:
 EA

EA
0
−
0
L
L
 0
0
0
0 


Klocal =  EA
EA

− L 0
0
L
0
0
0
0
La matriz de giro de coordenadas locales a coordenadas globales de las barras
se calcula de la siguiente manera:


cos α sin α
0
0
 − sin α cos α

0
0

Lbarra = 

0
0
cos α − sin α 
0
0
sin α cos α
Barra número 1:

124
 0
Klocal = 
 −124
0

0 −1
 1 0
L=
 0 0
0 0

0 −124 0
0
0
0 

0 124 0 
0
0
0

0 0
0 0 

0 −1 
1 0
Apéndice A. Informe de salida de PACE

Kglobal
0
0
 0 124
=
 0
0
0 −124
Simbólicamente:
µ
Kglobal =
129

0
0
0 −124 

0
0 
0 124
K11,1 K11,2
K12,1 K12,2
¶
Barra número 2:

183
 0
Klocal = 
 −183
0

−1 0
 0 −1
L=
 0
0
0
0

183
 0
Kglobal = 
 −183
0
Simbólicamente:
µ
Kglobal =

0 −183 0
0
0
0 

0 183 0 
0
0
0

0
0
0
0 

−1 0 
0 −1

0 −183 0
0
0
0 

0 183 0 
0
0
0
K23,3 K23,2
K22,3 K22,2
¶
Barra número 3:

Klocal

102
 0
=
 −102
0

0 −102 0
0
0
0 

0 102 0 
0
0
0

−0,56 0,828
0
0
 −0,828 −0,56
0
0 

L=

0
0
−0,56 0,828 
0
0
−0,828 −0,56


32,1
47,5 −32,1 −47,5
 47,5
70,2 −47,5 −70,2 

Kglobal = 
 −32,1 −47,5 32,1
47,5 
−47,5 −70,2 47,5
70,2
130
A.3. Cálculo de los desplazamientos de la estructura.
Simbólicamente:
µ
Kglobal =
A.2.2.
K33,3 K33,1
K31,3 K31,1
¶
Matriz de rigidez de la estructura:

Kest



=




32,1
47,5
0
0
−32,1 −47,5
47,5
194
0
−124 −47,5 −70,2 

0
0
183
0
−183
0 

0
−124
0
124
0
0 

−32,1 −47,5 −183
0
215
47,5 
−47,5 −70,2
0
0
47,5
70,2
A.3.
Cálculo de los desplazamientos de la estructura.
A.3.1.
Posiciones libres y restringidas.
Posiciones de los grados de libertad libres (sin restricciones):
L = {1, 5, 6}
Posiciones de los grados de libertad restringidos:
R = {2, 3, 4}
A.3.2.
Vector de fuerzas de la estructura.



0 
−100
fL =


0
A.3.3.
Vector de desplazamientos restringidos de la estructura.
 
 0 
0
uR =
 
0
Apéndice A. Informe de salida de PACE
A.3.4.
131
Vector de desplazamientos libres calculados para la estructura.


 −0,52 
−0,548
uL =


0,0188
A.4.
Cálculo de las reacciones de la estructura.
(fR )reacciones


 1,31e − 15 
100
=


−0
Bibliografı́a
[2002]. Universal Mechanism User’s Manual . Universal Mechanism Software
Lab.
Abaqus. Abaqus, inc. http://www.abaqus.com [2005].
Abdula. Francois faure.
http://www.cg.tuwien.ac.at/ francois/Public/PAVR/doc/abdula.html
[1999].
ADAMS. MSC.
http://www.mscsoftware.com/products/products detail.cfm?PI=413
[2005].
ANSYS. ANSYS, inc. http://www.ansys.com [2005].
S. S. Antman [1972]. The theory of rods VIa/2 of Handbuch der Physik.
Springer-Verlag, Flugge, S and Truesdell, C. editors.
S. S. Antman [1992]. Nonlinear problems of elasticity. Springer-Verlag.
R. Barrett, M. Berry, T. Chan, J. Demmel, J. Donato, J. Dongarra, V. Eijkhout, R. Pozo, C. Romine y H. van der Vorst
[1993]. Templates for the Solution of Linear Systems: Building Blocks
for Iterative Methods. SIAM.
J. Baumgarte [1972]. Stabilization of constraints and integrals of motion
in dynamical systems. Comp. Meth. in Appl. Mech. and Eng. 1: 1–16.
T. Belytschko, W. K. Liu y B. Moran [2000]. Nonlinear finite elements
for continua and structures. J. Wiley & Sons.
J. Bonet y R. D. Wood [1997]. Nonlinear Continuum Mechanics for
Finite Element Analysis. Cambridge University Press.
K. E. Brenan, S. L. Campbell y L. R. Petzold [1996]. Numerical
Solution of Initial Value Problems in Differential-Algebraic Equations.
SIAM.
P.Ñ. Brown, G. D. Byrne y A. C. Hindmarsh [1989]. Vode: a variablecoefficient ode solver. SIAM J. Sci. Stat. Comput. 10, no 5: 1038–1051.
133
134
Bibliografı́a
C. G. Broyden [1965]. A class of methods for solving nonlinear simultaneous equations. Mathematics of Computation 19: 577–593.
J. C. Butcher [1987]. The numerical analysis of ordinary differential equations: Runge-Kutta and general linear methods.
J. C. Butcher [2003]. Numerical methods for ordinary differential equations. John Wiley & Sons, West Sussex, England.
CarSim. Mechanical simulation corporation.
[2005].
http://www.carsim.com
Catia. Dassault systemes. http://www.3ds.com/products-solutions/plmsolutions/catia [2005].
R. R. Craig y M. C. C. Bampton [1968]. Coupling of substructures for
dynamics analyses. AIAA Journal 6: 1313–1319.
M. A. Crisfield [1991]. Non-linear Finite Element Analysis of Solids and
Structures I, Essentials. John Wiley & Sons.
G. Dahlquist [1956]. Convergence and stability in the numerical integration of ordinary differential equations. Mathematica Scandinavica
4: 33–35.
A. DevStudio. http://anjuta.sourceforge.net [2005].
S. Dietz, O. Wallrapp y S. Wiedemann. Nodal vs. modal representation
in flexible multibody system dynamics. En J. A. C. Ambrósio, ed.,
Multibody Dynamics. [2003].
Diffpack. inutech gmbh. http://www.diffpack.com/ [2005].
J. Dongarra. CIMNE.
http://www.netlib.org/utk/people/JackDongarra/la-sw.html [2005].
Doxygen. Dimitri van heesch. http://www.stack.nl/ dimitri/doxygen/
[2005].
DynaMechs. Scott mcmillan. http://dynamechs.sourceforge.net/ [2001].
H. Elmqvist, S. Mattsson y M. Otter. Modelica: The new objectoriented modeling language. [1998].
E. Fehlberg [1969]. Klassische runge-kutta-formeln fünfter und siebenter
ordnung mit schrittweiten-kontrolle. j-Computing 4: 93–106.
E. Felhberg. Low order classical runge-kutta formulae with stepsize control
and their application to some heat transfer problems. Inf. Téc. R-315
[1969].
Bibliografı́a
135
Free Editors. The free country.
http://www.thefreecountry.com/programming/editors.shtml [2005].
J. Garcia de Jalon y E. Bayo [1994]. Kinematic and Dynamic Simulation of Multibody Systems. The Real Time Challenge.. Springer-Verlag.
J. C. Garcı́a Orden. Dinámica no lineal de sistemas multicuerpo flexibles mediante algoritmos conservativos. Tesis Doctoral Universidad
Politécnica de Madrid ETSICCP [1999].
C. W. Gear [1971a]. The automatic integration of ordinary differential
equations. Commun. ACM 14, no 3: 176–179.
C. W. Gear [1971b]. Numerical Initial Value Problems is Ordinary Differential Equations. Edgewood Cliffs.
Geomview. http://www.geomview.org [2005].
M. Geradin, M. Hogge y S. Idelsohn. Implicit finite element methods. En T. Belytschko y T. Hughes, eds., Computational Methods for
Transient Analysis cap. 4, 417–471. North-Holland [1983].
GID. CIMNE. http://gid.cimne.upc.es/ [2005].
Gmsh.
Christophe
geuzaine
http://www.geuz.org/gmsh/ [2005].
and
jean-françois
remacle.
GNU Autoconf. Free software foundation.
http://www.gnu.org/software/autoconf/ [2005].
GNU Automake. Free software foundation.
http://www.gnu.org/software/automake/ [2005].
GNU GCC. Free software foundation. http://gcc.gnu.org [2005].
GNU GDB. Free software foundation.
http://www.gnu.org/software/gdb/ [2005].
GNU GPL. Free software foundation.
http://www.gnu.org/licenses/gpl.html [2005].
GNU Libtool. Free software foundation.
http://www.gnu.org/software/libtool/ [2005].
Gnuplot. http://www.gnuplot.info [2005].
J. M. Goicolea [2000]. Estructuras sometidas a impacto. EAD, CIMNE,
UPM.
O. Gonzalez y A. M. Stuart. Introduction to continuum mechanics.
[1995].
136
Bibliografı́a
M. J. González Castro. A Collaborative Environment for Flexible Development of MBS Software. Tesis Doctoral University of A Coruña
[2005].
GTK+. The gtk+ team. http://www.gtk.org/ [2005].
R. Gutiérrez Fernández. Cálculo de tensiones en componentes de sistemas móviles mediante dinámica de sistemas multicuerpo flexibles. Tesis
Doctoral Universidad de La Coruña EPS [2003].
E. Hairer, C. Lubich y M. Roche [1989]. The Numerical Solution of
Differential-Algebraic Systems By Runge-Kutta Methods. Springer.
M. R. Hestenes y E. Stiefel [1952]. Methods of conjugate gradients for
solving linear systems.
H. Hilber, T. Hughes y R. Taylor [1977]. Improved numerical dissipation for time integration algorithms in structural dynamics. Earthquake
Engin. and Struct. Dynamics 5: 283–292.
W. C. Hurty [1965]. Dynamic analysis of structural systems using component modes. AIAA Journal 3: 678–685.
R. L. Huston [1990]. Multibody dynamics. Butterworth-Heinemann.
IFER. Internet finite element resources.
http://www.engr.usask.ca/ macphed/finite/fe resources/fe resources.html
[2005].
ISO [1994]. ISO 10303-11:1994: Industrial automation systems and integration — Product data representation and exchange — Part 11: Description methods: The EXPRESS language reference manual . International
Organization for Standardization, Geneva, Switzerland.
KDevelop. http://www.kdevelop.org [2005].
D. Kincaid y W. Cheney [1994]. Análisis numérico: las matemáticas del
cálculo cientı́fico. Addison-Wesley Iberoamericana.
LabVIEW.
National
http://www.ni.com/labview/ [2005].
instruments
corporation.
LS-Dyna. Livermore software technology corp. http://www.lstc.com [2005].
D. E. Luenberger [1989]. Programación lineal y no lineal . Addison Wesley
Longman.
Macsyma. Scientek.
http://www.scientek.com/macsyma/main.htm [2005].
Bibliografı́a
137
MADYMO. TNO automotive.
http://www.automotive.tno.nl/smartsite.dws?id=1530 [2005].
Maple. Maplesoft, waterloo maple inc. http://www.maplesoft.com/ [2005].
Mathematica. Wolfram research, inc. http://www.wolfram.com [2005].
MatLab. MathWorks. http://www.mathworks.com [2005].
MBDyn. Dipartimento di ingegneria aerospaziale, politecnico di milano.
http://www.aero.polimi.it/ mbdyn [2005].
MBSoft. Université catholique de louvain. faculté des sciences appliquées
– production mécanique et machines.
http://www.prm.ucl.ac.be/recherche/projets/mbsoft/index.html
[2005].
J. McPhee. Multibody system dynamics: Research activities.
http://real.uwaterloo.ca/ mbody/ [2005].
Modelica. Modelica association. http://www.modelica.org [2005].
NX Master Fem. UGS.
http://www.ugs.com/products/nx/simulation/advanced/master fem/index.shtml
[2005].
OpenGL. Silicon graphics, inc. http://www.opengl.org/ [2005].
Pro/ENGINEER. PTC.
http://www.ptc.com/appserver/mkt/products/home.jsp?k=403 [2005].
Qt. Trolltech AS.
http://www.trolltech.com/products/qt/index.html [2005].
H. Rahnejat [1998]. Multi-body dynamics. Vehicles, machines and mechanisms. Professional Engineering Publishing.
RecurDyn. FunctionBay, inc. http://www.functionbay.co.kr [2005].
Y. Renard y J. Pommier [2005]. GMM++. Short User Documentation.
http://www-gmm.insa-toulouse.fr/getfem/gmm intro.
RobotBuilder. Steven rodenbaugh and david e. orin.
http://www.ece.osu.edu/ orin/RobotBuilder/RobotBuilder.html [2003].
Samcef Mecano. Samtech s.a. http://www.samcef.com [2005].
R. Schneiders. Mesh generation software.
http://www-users.informatik.rwth-aachen.de/ %7Eroberts/software.html
[2005].
138
Bibliografı́a
A. A. Shabana [1998]. Dynamics of multibody systems. Cambridge University Press.
A. A. Shabana y R. A. Wehage [1983]. A coordinate reduction technique for transient analysis of spatial substructures with large angular
rotations. Journal of Structural Mechanics 11: 401–431.
L. F. Shampine, R. C. Allen y S. Pruess [1997]. Fundamentals of
Numerical Computing. John Wiley & Sons.
Silicon Graphics [2005]. Standard Template Library Programmer’s Guide.
http://www.sgi.com/tech/stl/.
J. C. Simo, J. E. Marsden y P. S. Krishnaprasad [1988]. The hamiltonian structure of nonlinear elasticity: The material and convective
representations of solids, rods, and plates. Arch. Rational Mech. Anal.
104: 125–183.
J. C. Simo y N. Tarnow [1992]. The discrete energy-momentum method.
conserving algorithms for nonlinear elastodynamics. Z. Angew. Math.
Phys. 43: 757–793.
J. C. Simo y L. Vu-Quoc [1986]. On the dynamics of flexible beams under
large overall motions – the planar case: Part I. ASME Journal of Applied
Mechanics 53: 849–854.
SimOffice. MSC.
http://www.mscsoftware.com/products/products detail.cfm?PI=633
[2005].
SIMPACK. INTEC GmbH. http://www.sympack.de [2005].
J. O. Song y E. J. Haug [1980]. Dynamic analysis of planar flexible
mechanisms. Computer Methods in Applied Mechanics and Engineering
24: 359–381.
STEP. ISO. http://www.tc184-sc4.org [2005].
STL. Silicon graphics, inc. http://www.sgi.com/tech/stl/ [2005].
G. Teschl. Ordinary differential equations and dynamical systems.
http://www.mat.univie.ac.at/ gerald/ Universität Wien [2004].
Universal Mechanism. Universal mechanism software lab.
http://umlab.ru [2005].
J. Vidal y J. Garcı́a de Jalón. Mechxml: A languaje for the simulation of complex multibody systems including control. En J. Goicolea,
J. Cuadrado y J. C. Garcı́a Orden, eds., Multibody Dynamics. [2005].
Bibliografı́a
139
Virtual.Lab Motion. LMS. http://www.lmsintl.com [2005].
VTK. Kitware inc. http://public.kitware.com/VTK/ [2005].
O. Wallrapp. Nonlinear beam theory in flexible multibody dynamics theory of simbeam. Inf. téc. Intec GmbH [2002].
O. Wallrapp y R. Schwertassek [1991]. Representation of geometric
stiffening in multibody system simulation. Int. Journal for Numerical
Methods in Engineering 32: 1833–1850.
S. R. Wu [2004]. Reissner-mindlin plate theory for elastodynamics. Journal
of Applied Mathematics 3: 179–189.
Xerces-C++. The apache xml project. http://xml.apache.org/xerces-c/
[2005].
XML. World wide web consortium, W3C. http://www.w3.org/XML/ [2005].
Descargar