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].