Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Universidad de los Andes
Proyecto de Grado
Sobre las propiedades del metodo deelementos espectrales aplicado a la
dinamica de fluidos
Autor:
Hayden Liu Weng
Asesor:
Mauricio Junca, Ph. D.
Proyecto de grado presentado para obtener
el tıtulo de Matematico en el
Departamento de Matematicas
Enero 2015
Declaracion de propiedad
Yo, Hayden Liu Weng, declaro que este proyecto de grado, titulado ’Sobre las propiedades
del metodo de elementos espectrales aplicado a la dinamica de fluidos’, y el trabajo pre-
sentado en el mismo son mıos. Ademas confirmo que:
� En caso de haber consultado el trabajo de otras personas, este sera referenciado
adecuadamente.
� Se hara una mencion agradeciendo a todas las personas que colaboraron en este
proyecto.
� En caso que parte del trabajo haya sido desarrollada en conjunto con otras per-
sonas, se presentara cual fue el aporte de esas personas.
Firma:
Fecha:
i
22/01/2015
”En todas las actividades es saludable, de vez en cuando, poner un signo de interrogacion
sobre aquellas cosas que por mucho tiempo se han dado como seguras.”
Bertrand Russell
UNIVERSIDAD DE LOS ANDES
Resumen
Facultad de Ciencias
Departamento de Matematicas
Matematico
Sobre las propiedades del metodo de elementos espectrales aplicado a la
dinamica de fluidos
por Hayden Liu Weng
Al momento de trabajar con ecuaciones diferenciales no lineales como la de Navier-
Stokes, usualmente no es posible obtener una solucion analıtica para el campo de ve-
locidades del sistema subyacente. Por este motivo, tradicionalmente se ha usado una
amplia gama de metodos computacionales para obtener soluciones aproximadas. Sin
embargo, muchas veces el algoritmo de solucion tentativo no es aplicable debido a la
falta de informacion, a las geometrıas complejas o simplemente porque su ejecucion re-
sulta bastante lenta. Es por esto que, a medida que aumenta la capacidad de computo
de los ordenadores, ası mismo lo hacen las exigencias de los algoritmos de solucion y la
complejidad de los problemas a resolver.
Particularmente, son de especial interes las familias de metodos espectrales y de ele-
mentos finitos. Por un lado, la primer familia presenta soluciones bastante rapidas (con
convergencia espectral – o mas rapida que cualquier potencia de 1/N), pero que solo son
aplicables a geometrıas sencillas. Por otro lado, la segunda familia permite la solucion
de sistemas con geometrıas esencialmente arbitrarias, a costa de un tiempo mayor de
ejecucion. Tratando de combinar ambas familias de metodos para poder trabajar con
tasas de convergencia altas en geometrıas mas generales, nacen los metodos de elementos
espectrales.
Estos metodos de elementos espectrales buscan dividir el dominio de trabajo en elemen-
tos de geometrıas mas sencillas y aplicar esquemas de solucion por metodos espectrales
en cada elemento, lo cual explica su rapida convergencia y su mayor flexibilidad (en
cuanto al dominio de solucion). Sin embargo, resulta mucho mas complicado generar
una implementacion de este metodo porque es necesario generar todo un nuevo esquema
de analisis geometrico tanto al nivel de cada elemento, como al del dominio completo.
Esto ultimo incluye, ademas, la construccion de los elementos de orden elevado, ası como
la seleccion de una familia de funciones base ortogonales que sea apropiada.
En este proyecto se estudia la teorıa detras del metodo de elementos espectrales, de
manera que sea posible desarrollar la infraestructura para una implementacion particular
del metodo en el lenguaje Python. De esta manera, se busca promover el entendimiento
sobre las caracterısticas mas relevantes en el desarrollo del metodo y hacer mas viable
su aplicacion practica en situaciones reales. Por una parte, se verifican las bondades del
metodo mediante un analisis de convergencia y de la numeracion de los nodos, trayendo
a luz algunas de las ventajas y desventajas del mismo. Por otra, se verifica el codigo
resultante mediante problemas clasicos 1D y 2D. Con estos problemas se compara su
rendimiento con respecto a los resultados reportados en la literatura, ası como contra
alternativas de solucion mas tradicionales. Estas aplicaciones son, en particular, el flujo
de Couette para el caso 1D y el flujo con una cavidad rectangular en el caso 2D. Con
todo esto se prepara un repositorio con las funciones necesarias para implementar el
metodo de elementos espectrales en aplicaciones particulares, el cual se encuentra en:
https://github.com/
Agradecimientos
Agradezco en primer lugar a mi asesor de esta tesis, Mauricio Junca, y a mi asesor del
correspondiente proyecto de grado en Ingenieria Mecanica, Andres Gonzalez, quienes me
orientaron y apoyaron incondicionalmente a lo largo de esta investigacion. Sus aportes,
criticas, comentarios y sugerencias fueron fundamentales para que el proyecto se llevara
a cabo exitosamente.
Agradezco de igual manera a mis jurados de evaluacion, Ahmed Ould y Omar Lopez,
ya que fue la retroalimentacion que recibı de ustedes la que me permitio identificar y
atacar mis puntos debiles y, ası, mejorar la calidad de mi trabajo.
Agradezco a mis profesores de Ingenieria Mecanica y Matematicas, quienes no solo me
formaron academicamente, sino que tambien me ensenaron a ser una persona ıntegra.
Unicamente a traves de las habilidades desarrolladas a lo largo de cada uno de los cursos
fue que se hizo posible llegar hasta donde estoy.
Agradezco a Sergio Bacca y a mis demas companeros del grupo Robocol, pues mas
que un equipo han sido una familia para mı, exigiendome, comprendiendome y estando
permanentemente dispuestos a escucharme.
Agradezco a mi gran amigo Carlos Carvajal, ası como a todas aquellas personas que han
estado conmigo en las buenas y en las malas, pues ha sido con su apoyo que he podido
superar todos los retos a los que me he enfrentado.
Agradezco finalmente a mi familia, quienes me impulsaron a sonar y a llegar mas alla de
lo que alguna vez creı posible. Nada de esto podria haber sido posible sin sus palabras
de aliento, sin sus grandes exigencias y expectativas.
v
Contenidos
Declaracion de propiedad i
Resumen iii
Agradecimientos v
Contenidos vi
Lista de Figuras viii
Lista de Tablas ix
Sımbolos x
1 Introduccion 1
1.1 Motivacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Contexto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Sobre el metodo de elementos espectrales . . . . . . . . . . . . . . . . . . 3
1.4 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Las bondades de los Metodos Espectrales 5
2.1 Antecedentes: Metodos Espectrales . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Fundamentos Teoricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.1 Las ecuaciones de Navier-Stokes . . . . . . . . . . . . . . . . . . . 6
2.2.2 Proyeccion de Galerkin . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.3 Funciones ortogonales y bases nodales . . . . . . . . . . . . . . . . 9
2.2.4 Familias de Funciones Ortogonales . . . . . . . . . . . . . . . . . . 11
2.2.4.1 Familias de Funciones 1D . . . . . . . . . . . . . . . . . . 11
2.2.4.2 Familias de Funciones 2D . . . . . . . . . . . . . . . . . . 16
2.3 Interpolacion, el termino de error y la convergencia espectral . . . . . . . 18
2.3.1 Las funciones de interpolacion . . . . . . . . . . . . . . . . . . . . 18
2.3.1.1 Interpolacion en 1D . . . . . . . . . . . . . . . . . . . . . 18
2.3.1.2 Interpolacion en 2D . . . . . . . . . . . . . . . . . . . . . 19
2.3.2 El termino de error . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.3 Convergencia y la constante de Lebesgue . . . . . . . . . . . . . . 22
vi
Contenidos vii
2.3.4 Convergencia Espectral . . . . . . . . . . . . . . . . . . . . . . . . 24
3 Metodos de elementos finitos y espectrales 29
3.1 Antecedentes: Metodos de Elementos Finitos . . . . . . . . . . . . . . . . 29
3.2 Generacion de la malla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.1 Generacion de los elementos . . . . . . . . . . . . . . . . . . . . . . 30
3.2.2 Generacion de nodos de interpolacion . . . . . . . . . . . . . . . . 32
3.2.3 Matriz de conectividad . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3 Construccion de la matriz global y el vector del lado derecho . . . . . . . 33
3.3.1 Matrices por elemento . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.2 Matriz de difusion global . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.3 Vector derecho y condiciones de frontera . . . . . . . . . . . . . . . 36
3.4 Diferencias en el sistema resultante: Caso 2D . . . . . . . . . . . . . . . . 37
3.4.1 Elementos quadrilaterales con numeracion XY . . . . . . . . . . . 37
3.4.2 Elementos quadrilaterales con numeracion YX . . . . . . . . . . . 38
3.4.3 Elementos triangulares con numeracion cıclica . . . . . . . . . . . . 39
3.4.4 Comparacion de los resultados . . . . . . . . . . . . . . . . . . . . 41
4 Implementacion en 1D 43
4.1 Flujo de Couette . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2 Solucion por elementos espectrales . . . . . . . . . . . . . . . . . . . . . . 44
4.3 Comparacion de resultados . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5 Implementacion en 2D 48
5.1 Flujo con una cavidad rectangular . . . . . . . . . . . . . . . . . . . . . . 48
5.2 Solucion por elementos espectrales . . . . . . . . . . . . . . . . . . . . . . 49
5.3 Comparacion de resultados . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6 Conclusiones 58
6.1 Comentarios finales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
A Funciones Utilizadas 59
A.1 Implementacion 1D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
A.2 Implementacion 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Bibliografıa 77
Lista de Figuras
2.1 Aproximacion a la funcion de Runge para distintos ordenes . . . . . . . . 11
2.2 Constantes de Lebesgue calculadas para distintos numeros de nodos y suscotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1 Malla ancestral de elementos triangulares con un paso de refinamiento . . 31
3.2 Malla definida por medio de subdivision directa del dominio de solucion . 31
3.3 Diagrama de esparcidad para la matriz de difusion en 1D . . . . . . . . . 36
3.4 Numeracion en el orden XY . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.5 Patron de esparcidad en el orden XY . . . . . . . . . . . . . . . . . . . . . 39
3.6 Numeracion en el orden YX . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.7 Patron de esparcidad en el orden YX . . . . . . . . . . . . . . . . . . . . . 40
3.8 Numeracion en el orden cıclico . . . . . . . . . . . . . . . . . . . . . . . . 40
3.9 Patron de esparcidad en la numeracion cıclica . . . . . . . . . . . . . . . . 41
4.1 Diagrama representativo del flujo de Couette generalizado . . . . . . . . . 43
4.2 Distribucion de los elementos y los nodos de interpolacion correspondi-entes a la malla (2,4,6,5,3,1) . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.3 Diagrama de esparcidad en la matriz del problema . . . . . . . . . . . . . 46
4.4 Soluciones obtenidas para el flujo bajo distintos gradientes de presion . . 47
5.1 Diagrama representativo del flujo en la cavidad . . . . . . . . . . . . . . . 48
5.2 Distribucion de los elementos y los nodos de interpolacion correspondi-entes a la malla con 8 elementos en cada direccion y orden 2 en cadacoordenada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.3 Diagrama de esparcidad en la matriz del sistema . . . . . . . . . . . . . . 52
5.4 Solucion obtenida para el flujo en la cavidad con la malla construida . . . 53
5.5 Solucion obtenida para el campo de presiones en la cavidad con la mallaconstruida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.6 Diagrama de esparcidad en la matriz del sistema para el caso YX . . . . . 54
5.7 Malla usada en el sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.8 Diagrama de esparcidad en la matriz del sistema triangular . . . . . . . . 55
5.9 Solucion obtenida para el flujo en la cavidad con la malla triangular . . . 56
5.10 Solucion obtenida para el campo de presiones en la cavidad con la mallatriangular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.11 Visualizacion reologica para el flujo en la cavidad . . . . . . . . . . . . . . 57
5.12 Solucion obtenida para el flujo en la cavidad en elementos finitos . . . . . 57
viii
Lista de Tablas
2.1 Familias de funciones conocidas en 1D . . . . . . . . . . . . . . . . . . . . 10
2.2 Miembros de la familia de polinomios de Legendre . . . . . . . . . . . . . 12
2.3 Miembros de la familia de polinomios de Lobatto . . . . . . . . . . . . . . 14
2.4 Miembros de la familia de polinomios de Chevyshev . . . . . . . . . . . . 14
2.5 Miembros de la familia de polinomios de Chevyshev del segundo tipo . . . 15
2.6 Miembros de la familia de polinomios de Jacobi . . . . . . . . . . . . . . . 15
2.7 Miembros de la familia de polinomios de Appell . . . . . . . . . . . . . . . 17
2.8 Miembros de la familia de polinomios de Proriol . . . . . . . . . . . . . . 17
2.9 Constantes de Lebesgue para nodos de interpolacion de Lobatto . . . . . 27
3.1 Tiempos medidos para la numeracion XY . . . . . . . . . . . . . . . . . . 38
3.2 Tiempos medidos para la numeracion YX . . . . . . . . . . . . . . . . . . 38
3.3 Tiempos medidos para la numeracion triangular . . . . . . . . . . . . . . . 41
4.1 Errores medidos para distintas mallas . . . . . . . . . . . . . . . . . . . . 47
ix
Sımbolos
Sımbolo Nombre Unidades
C Matriz de conectividad -
Dij Matriz de difusion (o rigidez) -
cp Capacidad termica J/(kg ·K)
f Vector de fuerzas externas N
Gi Autoproducto interno de funciones ortogonales -
k Conductividad termica W/(m ·K)
Mij Matriz de masa -
Nij Matriz de adveccion -
NE Numero de elementos -
NG Numero de nodos globales -
s Termino de entrada o generacion -
t Tiempo s
~u Vector de velocidad m/s
u, v, w Componentes de velocidad en las direcciones x, y, z m/s
w(~x) Funcion de pesos -
δij Delta de Kroenecker -
ξ, η, ζ Coordenadas elementales estandar -
θ Temperatura K
κ Difusividad termica m2/s
ΛN Constante de Lebesgue -
µ Viscosidad Dinamica Pa · sρ Densidad kg/m3
φ Funcion perteneciente a una base ortogonal -
ψ Funcion de interpolacion estandar -
x
Este trabajo es dedicado a todos aquellos que me acompanarondurante este arduo proceso.
xi
Capıtulo 1
Introduccion
Este primer capıtulo busca introducir la motivacion que conduce al trabajo de investi-
gacion presentado, asi como un breve contexto acerca del mismo. De igual manera se
introducen los objetivos del proyecto.
1.1 Motivacion
En la actualidad, uno de los grandes retos de la humanidad es el de entender a cabal-
idad el comportamiento de los fluidos. Lo anterior radica en que solo a partir de este
conocimiento es posible realizar disenos y generar productos que se adapten a las necesi-
dades presentes en toda clase de aplicaciones. Desde la aerodinamica vehicular hasta
la mecanica de biofluidos, entender las propiedades del flujo permite comprender cuales
son los problemas de disenos actuales y como solucionarlos. Ejemplos ilustrativos de
esta necesidad son el diseno de helices de aerogeneradores y la produccion de injertos
vasculares para capilares sanguıneos. En estos casos, conocer como se comporta el flu-
ido con respecto al producto resulta importante porque permitirıa aprovechar mejor las
corrientes de aire y promoverıa la compatibilidad de los dispositivos con los pacientes
respectivamente.
Sin embargo, debido a las geometrıas complejas que se presentan en la practica, rara
vez existen soluciones analıticas y, por lo tanto, se hace necesario el uso de herramientas
computacionales. Estas permiten obtener soluciones aproximadas mediante el uso de
diversos metodos numericos, cada uno con sus ventajas y desventajas. Algunos de los
mas reconocidos son los metodos de diferencias finitas, los de elementos finitos, y los es-
pectrales. Unos son mas faciles de implementar, otros permiten trabajar con geometrıas
mas complejas, y los ultimos buscan ser especialmente rapidos. En particular, uno de
1
Capıtulo 1. Introduccion 2
los grandes requerimientos que se deben satisfacer es el de brindar una respuesta con
poco error en una cantidad de tiempo razonable. Es por ello que los metodos utilizados
evolucionan permamentemente, siendo uno de los grandes retos la minimizacion de este
tiempo de ejecucion.
1.2 Contexto
En general, existen dos maneras que se utilizan para mejorar la operacion de un metodo:
reducir el numero de calculos que requiere, o aumentar la precision del mismo. Para re-
ducir el numero de calculos necesarios es posible preparar y almacenar los resultados que
se utilizaran reiteradamente, de manera que este tiempo no se perciba constantemente a
lo largo de la solucion si no una unica vez durante la aplicacion del metodo. Por el otro
lado, mejorar la precision del metodo implica realizar un refinamiento, a costa de tener
mas operaciones, o alterar el esquema de solucion por uno de convergencia mas rapida.
En todo caso, no hay que olvidar que se requiere que el metodo sea compatible con la
geometrıa con la que se trabaja. Tomando esto en cuenta, actualmente los metodos mas
populares en la practica son los metodos espectrales y los metodos de elementos finitos,
ya que cada uno ataca a uno de estos dos problemas.
Los metodos espectrales se caracterizan por su rapida convergencia en geometrıas sen-
cillas. Para lograr esto, los metodos utilizan distintas familias de funciones ortogonales
para definir tanto los modos como los nodos de la solucion [1]. Esto es, el metodo
permite trabajar con cada funcion de la familia (descripcion modal), o con los nodos
que genera la misma (descripcion nodal). Como el numero de funciones utilizadas en la
solucion final es bastante reducido, el resultado es una solucion bastante rapida [2]. No
obstante, antes de aplicar el metodo es necesario definir la familia de funciones a utilizar,
ya que cada una presenta ventajas segun el tipo de problema. Esto se traduce en una
gran cantidad de procesamiento que se debe realizar antes de entrar a la solucion. Mas
aun, la mayorıa de las familias unicamente estan definidas para trabajar con geometrıas
bastante sencillas.
Por el otro lado, los metodos de elementos finitos se caracterizan por su versatilidad
incluso en geometrıas bastante complejas. Para lograr este resultado, el metodo comienza
por subdividir el dominio de solucion en una serie de elementos de geometrıa sencilla.
Esto hace que la solucion en cada uno de los elementos sea sencilla y que el problema
radique en acoplar la informacion de nodos comunes [3]. Una vez se organizan los nodos
y sus interacciones, el resto de la solucion es bastante sencilla, por lo que no se requiere
mayor procesamiento antes de entrar a solucionar el sistema completo. En contraste,
Capıtulo 1. Introduccion 3
como la solucion en cada elemento usualmente no es particularmente precisa, el metodo
acaba por presentar tasas de convergencia mas lentas.
1.3 Sobre el metodo de elementos espectrales
En vista de lo anterior, un metodo que combina las ventajas de ambos es el metodo
de elementos espectrales. De manera sencilla, este metodo consiste en la discretizacion
del dominio en elementos y la solucion por metodos espectrales en cada uno [1]. De
esta manera, el enmallado permite conservar la versatilidad de los metodos de elementos
finitos, mientras que la solucion por metodos espectrales en cada elemento preserva la
convergencia espectral. Es por estas virtudes que, para un mismo numero de elementos,
el resultado final presenta errores mucho menores que en metodos tradicionales. De
hecho, este error cae exponencialmente [3], por lo que la complejidad computacional, ası
como la cantidad de procesos y la velocidad de los mismos, son mucho menores que en
metodos comparables. Estos metodos son estudiados ampliamente en [4, 5].
Ahora bien, es importante notar que este metodo no trae unicamente ventajas. La
implementacion de este tipo de metodo requiere la utilizacion de elementos de orden
elevado, lo cual significa que es necesario definir las funciones a partir de las cuales se
definen los nodos intermedios. En particular, como se indico para los metodos espec-
trales, estas funciones deben formar una familia ortogonal que ademas sea apropiada
para el esquema de solucion planteado [3], ya que solo ası se asegura la convergencia
del metodo. Por otra parte, el metodo de elementos espectrales requiere que el acople
entre los distintos elementos se realice de una manera sencilla para que el sistema global
resultante sea facil de solucionar, algo que depende fuertemente de la manera en que se
realice el proceso de enmallado.
1.4 Objetivos
Objetivo General:
Estudio de los fundamentos detras de la implementacion del metodo de elementos es-
pectrales que permita desarrollar un codigo en el lenguaje Python capaz de operar sobre
problemas basicos en dinamica de fluidos.
Objetivo Especıficos:
• Descripcion detallada de los fundamentos teoricos del metodo de elementos espec-
trales que permita identificar los retos existentes en la implementacion del mismo.
Capıtulo 1. Introduccion 4
• Analisis de la convergencia del metodo bajo distintas condiciones de operacion que
demuestren sus ventajas y desventajas.
• Generacion de aplicaciones del metodo en 1D y 2D que sean consistentes con
soluciones analıticas clasicas como el flujo de Couette generalizado (1D) o el flujo
en una cavidad cuadrada (2D).
• Analisis del efecto sobre la solucion de distintos esquemas de numeracion de los
nodos que permita identificar formas de mejorar la operacion del metodo (tiempos
de ejecucion y solucion).
• Creacion y documentacion de un repositorio Git publico que permita a otros usuar-
ios utilizar las funciones desarrolladas en sus propias implementaciones.
Capıtulo 2
Las bondades de los Metodos
Espectrales
Para comenzar a trabajar sobre el metodo de elementos espectrales es fundamental
considerar primero los antecedentes que condujeron al mismo. De acuerdo con lo que se
menciono anteriormente, tradicionalmente se han usado (en la practica) los metodos de
diferencias finitas, de volumenes finitos, de elementos finitos o los metodos espectrales
entre otros. Sin embargo, si bien cada uno de ellos trae sus ventajas y desventajas
particulares, se estudian mas detalladamente los metodos espectrales y los de elementos
finitos. Esto radica en que justamente son estas dos familias las que dan a lugar al
metodo a desarrollar.
En este capıtulo se discuten particularmente los metodos espectrales y las caracterısticas
que son relevantes para los metodos de elementos espectrales. En particular se mencio-
nan los componentes y fundamentos teoricos principales de los metodos, culminando
en una comprobacion de su caracter estable de convergencia espectral. El Capıtulo 3
aplica estos conceptos en la optica de los elementos finitos para comenzar a desarrollar
formalmente la implementacion de los metodos de elementos espectrales.
2.1 Antecedentes: Metodos Espectrales
Los metodos espectrales reciben su nombre debido a las altas tasas de convergencia que
tiene el error de truncado (la tasa es espectral, o mas rapida que cualquier potencia de
1/N). En este tipo de metodo la idea fundamental corresponde a la aproximacion de las
soluciones a las ecuaciones diferenciales por series finitas de funciones ortogonales, las
cuales provienen de distintos contextos. En particular, este tipo de funcion incluye las
5
Capıtulo 2. Las bondades de los Metodos Espectrales 6
exponenciales complejas (en las series de Fourier) para casos periodicos, o los polinomios
de Chebyshev o Legendre para los casos no periodicos. Debido a esto, las tres elecciones
crıticas a la hora de definir un metodo espectral son las siguientes: la escogencia de
la familia de funciones base sobre las que se van a expandir la solucion, la manera
de describir la expansion (i.e. descripcion nodal y modal) y el proceso con el que se
determinan las incognitas del problema (e.g. colocacion o proyeccion de Galerkin como
parte de una metodologia de residuos ponderados) [1].
Esta familia de metodos ha sido ampliamente estudiada en [1, 2] y ha permanecido rele-
vante por su gran velocidad de solucion. Sin embargo, su mayor limitacion corresponde
a la necesidad de tener una geometria sencilla sobre la cual operar, dado que al tener
dominios con geometrias mas complejas de hace mas dificil mantener las propiedades de
ortogonalidad y suavidad de las funciones en el dominio.
De acuerdo con la primera decision, y como se menciono en la descripcion previa, es
imperativo que las funciones seleccionadas cumplan con un criterio de ortogonalidad (o
por lo menos semi-ortogonalidad) ya que esto es lo que garantiza el caracter espectral
del metodo como se vera a continuacion en la seccion correspondiente. Asi mismo, la
descripcion de la expansion define el tipo de solucionador obtenido y la determinacion
de incognitas define cuan complejo es el problema a resolver finalmente.
2.2 Fundamentos Teoricos
Teniendo una idea gruesa del funcionamiento de estos metodos, es posible entrar a tra-
bajar sobre los fundamentos teoricos de interes para el desarrollo de la implementacion.
Para guiar este proceso, se estudia paralelamente la ecuacion de Navier-Stokes como el
caso de referencia por excelencia. En particular, se profundiza sobre la proyeccion de
Galerkin como forma de obtener una version debil del problema, y en la utilizacion de
familias de funciones ortogonales como bases nodales. Cabe anotar que, si bien una
descripcion modal es tambien posible, no se hara mayor enfasis en la misma.
2.2.1 Las ecuaciones de Navier-Stokes
Las ecuaciones de Navier-Stokes son un conjunto de ecuaciones diferenciales parciales
no lineales de segundo orden que describen el movimientos de un fluido newtoniano (con
viscosidad constante en el tiempo). Dada la alta complejidad del problema en su forma
mas general, en esta ocasion se considera unicamente el caso de densidad constante (i.e.
fluido incompresible) y uniforme [3]. De acuerdo con lo anterior, la formulacion vectorial
Capıtulo 2. Las bondades de los Metodos Espectrales 7
de estas ecuaciones sobre un dominio predeterminado D corresponde a:∂ρ∂t +∇ · (ρ~u) = 0 → ∇ · ~u = 0
ρ(∂~u∂t + ~u · ∇~u
)= ρ~f −∇p+ µ∇2~u
(2.1)
donde ∇· ~u = 0 representa la ecuacion de continuidad que se debe satisfacer en el fluido
para que el problema tenga un sentido fısico. Cabe anotar que esta ecuacion debe estar
sujeta a unas condiciones de fronteras especificas para que la solucion sea efectivamente
unica. Adicionalmente, ∇~u, ∇ · ~u y ∇2~u representan el gradiente, la divergencia y el
laplaciano del vector de velocidad respectivamente. En este sentido, las ecuaciones se
parecen bastante a otro problema de trabajo clasico que se ha estudiado ampliamente:
la ecuacion de conveccion-difusion, que se describe por
∂θ
∂t+ ~u · ∇θ = κ∇2θ +
s
ρcp. (2.2)
Dado que aun en esta formulacion el problema no es facil de solucionar, existen una serie
de consideraciones que se pueden hacer para simplificar esta formulacion [6]. Segun el
problema a trabajar, es posible:
• Eliminar los terminos no lineales (~u · ∇~u ≈ 0) cuando los efectos inerciales son
despreciables, es decir, cuando el numero de Reynolds es significativamente bajo
(Re� 1). Este tipo de flujo tambien se conoce como flujo de Stokes.
• Eliminar los terminos dependientes del tiempo(∂·∂t = 0
)cuando el fluido se en-
cuentra en estado estacionario.
• Asumir que el gradiente de presion es constante (∇p = cte) en flujos completa-
mente desarrollados.
• Despreciar los efectos de las fuerzas externas(ρ~f = 0
)como la gravedad o los
efectos de borde debido a su caracter local-uniforme sobre el dominio completo
(este termino se puede combinar con el gradiente de presion para dar lugar a una
presion modificada).
Para efecto de los casos estudiados, se omite el termino de fuerzas externas al incorpo-
rarlo como un modificador en la presion. Adicionalmente, se indicaran cuales fueron los
supuestos utilizados en cada situacion en la seccion correspondiente. Cabe anotar que se
trabajo inicialmente con la version lineal (omitiendo los efectos inerciales) de los proble-
mas para obtener soluciones menos caoticas y, por lo tanto, mejor caracterizadas. Esto
es, formalmente se presentan aplicaciones correspondientes al flujo de Stokes estable [7],
Capıtulo 2. Las bondades de los Metodos Espectrales 8
descrito por ∇ · ~u = 0
0 = −∇p+ µ∇2~u(2.3)
sobre el mismo dominio D y sujeto a las condiciones de frontera correspondientes.
2.2.2 Proyeccion de Galerkin
De acuerdo con los pasos requeridos para la aplicacion de cualquier metodo numerico,
debe existir algun metodo que permita realizar la transicion del dominio continuo al
dominio discreto. Una de las posibilidades para hacer esto corresponde al metodo de
residuales ponderados (o weighted residuals). En estos casos se analiza el residual re-
sultante de la aproximacion de la funcion objetivo original por su version interpolada
y, de acuerdo con las ecuaciones resultantes, es necesario definir los pesos correspondi-
entes a cada punto de interes. La proyeccion de Galerkin es una de las versiones mas
populares de estos metodos, ya que los pesos se definen justamente con las funciones de
interpolacion correspondientes a los nodos de interes.
Para el caso especıfico de las ecuaciones de Navier-Stokes es importante notar que las
incognitas no corresponden unicamente a las velocidades: tambien es necesario determi-
nar los valores de las presiones. De acuerdo con esto, se definen nodos de interpolacion
de velocidad y de presion, con sus respectivas funciones de interpolacion φui y φpj . Se
usan entonces las funciones de interpolacion de velocidad con la ecuacion de Navier-
Stokes, mientras que las de presion se asignan a la ecuacion de continuidad. El resultado
obtenido son las ecuaciones ∫Dφpi∇ · ~u dV = 0 (2.4)
y ∫Dφui ρ
(∂~u
∂t+ ~u · ∇~u
)dV =
∫Dφui(−∇p+ µ∇2~u
)dV , (2.5)
sobre el dominio del flujo D. Con ayuda de la definicion del operador ∇2 y el teo-
rema de divergencia de Gauss es posible reexpresar el segundo termino de la integral en
Ecuacion 2.5 para obtener en su lugar:∫Dφui (∇2~u) dV =
∫Dφui (∇ · ∇~u) dV
=
∫D∇ · (φui∇~u) dV −
∫D∇φui · ∇~u dV (2.6)
= −∮∂D
φui ~n · ∇~u dS −∫D∇φui · ∇~u dV .
Capıtulo 2. Las bondades de los Metodos Espectrales 9
Similarmente, para el termino de presion de la misma integral en Ecuacion 2.5, se obtiene
que: ∫Dφui∇p dV =
∫D∇(φui p) dV −
∫D∇φui p dV
= −∮∂D
φui p~n dS −∫D∇φui p dV . (2.7)
De esta manera, es posible reescribir finalmente la Ecuacion 2.5, usando los resultados
de Ecuacion 2.6 y Ecuacion 2.7, como:∫Dφui ρ
(∂~u
∂t+ ~u · ∇~u
)dV =
∮∂D
φui p~n dS−µ∮∂D
φui ~n·∇~u dS+
∫D∇φui p dV−µ
∫D∇φui ·∇~u dV .
(2.8)
Esta es una forma general de la ecuacion que se puede aplicar directamente a los casos
particulares estudiados, lo cual arroja como resultado un sistema de ecuaciones a re-
solver. De manera puntual, cuando se trabaja con el flujo de Stokes (despreciando los
terminos no lineales), la ecuacion resultante es:
0 =
∮∂D
φui p~n dS − µ∮∂D
φui ~n · ∇~u dS +
∫D∇φui p dS − µ
∫D∇φui · ∇~u dV . (2.9)
2.2.3 Funciones ortogonales y bases nodales
Finalmente, es necesario mencionar la ultima eleccion importante en los metodos es-
pectrales: la seleccion de la familia ortogonal a usar. Para este efecto se introduce el
producto interno < ·, · >w estandar con pesos en el espacio de funciones integrables.
Definicion 2.1. Dadas dos funciones f1, f2 integrables en el intervalo [c, d] y una funcion
de pesos positiva w(x), se dice que las funciones son ortogonales (con respecto a w(x))
si:
< f1, f2 >w:=
∫ d
cf1(x)f2(x)w(x) dx =
Gi si i = j
0 si i 6= j
donde Gi 6= 0.
De acuerdo con esta definicion, dada cualquier base del espacio de funciones integrables
en un intervalo [c, d] fijo, es posible construir una familia de funciones ortogonales me-
diante el proceso de Gram-Schmidt. De este modo, existe una infinidad de posibles
familias, aunque no todas son particularmente utiles para los metodos espectrales. La
Tabla 2.1 presenta las familias ortogonales mas conocidas para el caso unidimensional, y
Capıtulo 2. Las bondades de los Metodos Espectrales 10
Familia Sımbolo [c, d] w(t) GiChevyshev Ti(t) [−1, 1] 1√
1−t2 G0 = π,Gi = π2
Chevyshev segundo tipo Ti(t) [−1, 1]√
1− t2 π2
Hermite Hi(t) (−∞,∞) exp(−t2)√π2ii!
Jacobi J(α,β)i (t) [−1, 1] (1− t)α(1− t)β (*)
Laguerre Li(t) [0,∞) exp(−t) (i!)2
Legendre Li(t) [−1, 1] 1 22i+1
Lobatto Loi(t) [−1, 1] 1− t2 2(i+1)(i+2)2i+3
Radau Ri(t) [−1, 1] 1 + t 2i+1
(*) Gi = 2α+β+1
i!Γ(i+1+α)Γ(i+1+β)
(2i+1+α+β)Γ(i+1+α+β)
Tabla 2.1: Familias de funciones conocidas en 1D (Adaptado de [3])
el Capıtulo 2.2.4 las descripciones formales de las mismas. Para los metodos a desarrol-
lar, las familias mas relevantes son las de polinomios de Lobatto (Tabla 2.3) y Chevyshev
de segundo tipo (Tabla 2.5). Por su parte, en el caso bidimensional hay dos situaciones.
Para dominios cuadrilaterales, los polinomios usados son productos tensoriales de los
polinomios unidimensionales, de manera que no vale la pena mencionarlos nuevamente.
Mientras tanto, para dominios triangulares, las familias mas conocidas son las de Appell
y Proriol [8].
El gran interes de usar estas familias radica en que, al satisfacer la propiedad de ortogo-
nalidad sobre todo el dominio, esencialmente se tiene una base del espacio, permitiendo
asi describir exactamente cualquier funcion, particularmente las funciones de interpo-
lacion. Sin embargo, dado que los recursos de calculo que se tienen son limitados, no es
posible considerar a todos los miembros de la familia (o modos), si no unicamente a los
primeros miembros. Es por eso que se buscan familias donde la magnitud de los modos
subsguientes tienda a 0 para cualquier funcion de interes [1].
Mas aun, si los nodos de interpolacion coninciden con los ceros de estas familias, se
obtiene una ubicacion estrategica de los mismos que hace que el sistema se comporte
bien y no sufra de efectos como las oscilaciones de Runge. Este efecto se representa en la
Figura 2.1, donde un mayor orden de interpolacion no se corresponde una mejor aprox-
imacion a la funcion debido a los picos hacia los extremos (para nodos de interpolacion
uniformemente espaciados).
Puntualmente, los casos ideales corresponden a las familias que buscan minimizar la
norma del error o de la constante de Lebesgue (definida a continuacion). Para el caso uni-
dimensional estas corresponden justamente a los puntos de Chevyshev y Fekete (equiv-
alentes a los nodos de Lobatto) respectivamente. Estas tienen la propiedad, como se
Capıtulo 2. Las bondades de los Metodos Espectrales 11
Figura 2.1: Aproximacion a la funcion de Runge para distintos ordenes
demostrara mas adelante, de que
‖ψi(ξ)‖ ≤ 1 y ‖ψi(ξ, η)‖ ≤ 1 ∀ξ, η (2.10)
en 1D y 2D respectivamente, con igualdad unicamente en el caso ξ = ξi, η = ηi (donde
ξi o (ξi, ηi) corresponden a las coordenadas del i-esimo nodo de interpolacion). Esto se
traduce en que el crecimiento de la funcion de interpolacion se ve acotado, y por lo tanto
se asegura una rapida convergencia en la interpolacion con respecto al orden polinomial
de la misma, como se vera en la seccion siguiente.
2.2.4 Familias de Funciones Ortogonales
De acuerdo con lo anterior, esta subseccion presenta una breve descripcion de las famil-
ias de polinomios mas usadas tanto en 1D como en 2D (para dominios triangulares).
Adicional a esto, se presentan los primeros miembros y las formulas generales para estos
polinomios.
2.2.4.1 Familias de Funciones 1D
En el caso de funciones 1D se mencionan especıficamente las familias de polinomios de
Legendre, Lobatto, Chevyshev (primer y segundo tipo) y Jacobi.
Capıtulo 2. Las bondades de los Metodos Espectrales 12
Polinomios de Legendre
Los polinomios de Legendre se definen naturalmente como las soluciones de las ecua-
ciones diferenciales
d
dξ
[(1− ξ2) d
dξLn(ξ)
]+ n(n+ 1)Ln(ξ) = 0, (2.11)
con n ∈ N y son comunes en el contexto de la ecuacion de Laplace. La ortogonalidad de
estos polinomios viene dada por el hecho de que tambien son el resultado de aplicar el
proceso de Gram-Schmidt sobre la base canonica 1, x, x2, . . . con una funcion de pesos
w(ξ) = 1 [18]. De acuerdo con lo anterior,∫ 1
−1Li(t)Lj(t) dt =
2
2i+ 1δij . (2.12)
Esta propiedad implica en particular que∫ 1−1 Li(t) dt = 0 (usando j = 0). Asi mismo,
dada la procedencia de estas funciones se tiene que |Li(t)| ≤ 1 ∀t ∈ [−1, 1].
Polinomios de Legendre
L0(ξ) = 1L1(ξ) = ξL2(ξ) = 1
2(3ξ2 − 1)L3(ξ) = 1
2(5ξ2 − 3)ξL4(ξ) = 1
8(35ξ4 − 30ξ2 + 3)L5(ξ) = 1
8(63ξ4 − 70ξ2 + 15)ξL6(ξ) = 1
16(231ξ6 − 315ξ4 + 105ξ2 − 5)L7(ξ) = 1
16(429ξ6 − 693ξ4 + 315ξ2 − 35)ξ. . .
Li(ξ) = 12ii!
di
dξi(ξ2 − 1)i
Tabla 2.2: Primeros miembros de la familia de polinomios de Legendre (Adaptado de[3])
Para el calculo de los polinomios de interpolacion en 2D, particularmente de los miembros
de grado 3 de la familia de Proriol, son de interes los polinomios de Legendre de la forma
Lk
(2ξ1−η − 1
).
Capıtulo 2. Las bondades de los Metodos Espectrales 13
A continuacion se presentan los polinomios usados:
L0
(2ξ
1− η− 1
)= 1
L1
(2ξ
1− η− 1
)=
2ξ
1− η− 1 =
2ξ + η − 1
1− η
L2
(2ξ
1− η− 1
)=
1
2(3
(2ξ
1− η− 1
)2
− 1) =6ξ2 + 6ξη + η2 − 6ξ − 2η + 1
(1− η)2
L3
(2ξ
1− η− 1
)=
1
2(5
(2ξ
1− η− 1
)2
− 3)
(2ξ
1− η− 1
)=
(2ξ + η − 1)(10ξ2 + 10ξη + η2 − 10ξ − 2η + 1)
(1− η)3(2.13)
Polinomios de Lobatto
Estos polinomios se pueden obtener a partir de los de Legendre mediante la relacion
Loi(ξ) = L′i+1(ξ). Es por esto que muchas de las propiedades que presentan los poli-
nomios de Legendre son heredadas por los polinomios de Lobatto. Sin embargo, en este
caso la funcion de pesos deja de ser la funcion unitaria y pasa a ser w(ξ) = 1 − ξ2. La
ortogonalidad se sigue entonces mediante la integracion por partes, la definicion dada
por la Ecuacion 2.11, y la ortogonalidad de los polinomios de Legendre:
< Loi, Loj >w =
∫ 1
−1Loi(t)Loj(t)(1− t2) dt
=
∫ 1
−1L′i+1(t)L
′j+1(t)(1− t2) dt
=[L′i+1(t)(1− t2)Lj+1(t)
]1−1 −
∫ 1
−1Lj+1(t)
(L′i+1(t)(1− t2)
)′dt
= 0 + (i+ 1)(i+ 2)
∫ 1
−1Li+1(t)Lj+1(t)(1− t2) dt
=2(i+ 1)(i+ 2)
2i+ 3δij . (2.14)
Particularmente, se observa nuevamente que∫ 1−1 Loi(t)(1− t
2)dt = 0 (usando j = 0).
Polinomios de Chevyshev
Los polinomios de Chevyshev (del primer tipo) surgen a partir de la solucion de las
ecuaciones diferenciales
(1− ξ2) d2
dξ2Tn(ξ)− ξ d
dξTn(ξ) + n2Tn(ξ) = 0, (2.15)
Capıtulo 2. Las bondades de los Metodos Espectrales 14
Polinomios de Lobatto
Lo0(ξ) = 1Lo1(ξ) = 3ξLo2(ξ) = 3
2(5ξ2 − 1)Lo3(ξ) = 5
2(7ξ2 − 3)ξLo4(ξ) = 15
8 (21ξ4 − 14ξ2 + 1)Lo5(ξ) = 1
8(693ξ4 − 630ξ2 + 105)ξLo6(ξ) = 1
16(3003ξ6 − 3465ξ4 + 945ξ2 − 35). . .
Loi(ξ) = 12i+1(i+1)!
di+2
dξi+2 (ξ2 − 1)i+1
Tabla 2.3: Primeros miembros de la familia de polinomios de Lobatto (Adaptado de[3])
con n ∈ N y son especialmente valiosos en la interpolacion de funciones al minimizar el
error de interpolacion en funciones continuas (bajo la norma del supremo, o ‖·‖∞). Esto
es, aun con funciones como las de Runge no son susceptibles al fenomeno de oscilacion
y acaban por converger uniformemente a la funcion a interpolar [3]. En particular, se
observa que los polinomios 2−(n−1)Tn(t) tienen la mınima norma posible entre todos
los posibles polinomios de su mismo orden en el intervalo [−1, 1] [18]. En este caso, la
funcion de pesos corresponde a w(ξ) = 1√1−ξ2
de acuerdo con su relacion a las funciones
trigonometricas.
Polinomios de Chevyshev
T0(ξ) = 1T1(ξ) = ξT2(ξ) = 2ξ2 − 1T3(ξ) = 4ξ3 − 3ξT4(ξ) = 8ξ4 − 8ξ2 + 1T5(ξ) = 16ξ5 − 20ξ3 + 5ξ. . .Ti(ξ) = cos(i arccos ξ) = 2i−1ξi − i2i−3ξi−2 + . . .
Tabla 2.4: Primeros miembros de la familia de polinomios de Chevyshev (Adaptadode [3])
Polinomios de Chevyshev del segundo tipo
Para los polinomios del segundo tipo la situacion es similar. Los polinomios son la
solucion de la ecuacion diferencial
(1− ξ2) d2
dξ2Tn(ξ)− 3ξ
d
dξTn(ξ) + n(n+ 2)Tn(ξ) = 0, (2.16)
con n ∈ N, y pesos w(ξ) =√
1− ξ2.
Capıtulo 2. Las bondades de los Metodos Espectrales 15
Polinomios de Chevyshev del segundo tipo
T0(ξ) = 1T1(ξ) = 2ξT2(ξ) = 4ξ2 − 1T3(ξ) = 8ξ3 − 4ξT4(ξ) = 16ξ4 − 12ξ2 + 1T5(ξ) = 32ξ5 − 32ξ3 + 6ξ. . .
Ti(ξ) = sin((i+1) arccos ξ)sin(arccos ξ)
Tabla 2.5: Primeros miembros de la familia de polinomios de Chevyshev del segundotipo
Polinomios de Jacobi
Estos polinomios, tambien conocidos como polinomios hipergeometricos, se construyen
como las soluciones de la ecuacion diferencial de Jacobi [18]. Al depender de dos
parametros adicionales α, β > −1, dan a lugar a familias mucho mas variadas. De hecho,
las anteriores familias son casos particulares de los polinomios de Jacobi mediante las
relaciones [3]:
Li(ξ) = J(0,0)i (ξ) (2.17)
Loi(ξ) =i+ 2
2J(1,1)i (ξ) (2.18)
Ti(ξ) =i!√π
Γ(i+ 1/2)J(−1/2,−1/2)i (ξ) (2.19)
Ti(ξ) =i!√π
2Γ(i+ 3/2)J(1/2,1/2)i (ξ) (2.20)
Polinomios de Jacobi
J(α,β)0 (ξ) = 1
J(α,β)1 (ξ) = 1
2(α+ β + 2)ξ + 12(α− β)
J(α,β)2 (ξ) = 1
8(α+ β + 3)(α+ β + 4)ξ2 + 14(α− β)(α+ β + 3)ξ
+18 [(α− β)2 − (α+ β + 4)]
J(α,β)3 (ξ) = 1
48(α+ β + 4)(α+ β + 5)(α+ β + 6)ξ3 + 116(α− β)(α+ β + 4)(α+ β + 5)ξ2
+ 116(α+ β + 4)[(α− β)2 − (α+ β + 6)]ξ + 1
48(α− β)[(α− β)2 − (3α+ 3β + 16)]. . .
J(α,β)i (ξ) = (−1)i
2ii!(1− t)−α(1 + t)−β di
dξi((1− t)i+α(1 + t)i+β)
Tabla 2.6: Primeros miembros de la familia de polinomios de Jacobi (Adaptado de[3])
Capıtulo 2. Las bondades de los Metodos Espectrales 16
Para el calculo de los polinomios de Proriol de orden 3 son de interes los polinomios de
Jacobi de la forma J(2k+1,0)l (2η−1). A continuacion se presentan los polinomios usados:
J(7,0)0 (2η − 1) = 1
J(5,0)1 (2η − 1) =
7
2(2η − 1) +
5
2= 7η − 1
J(3,0)2 (2η − 1) =
21
4(2η − 1)2 +
9
2(2η − 1) +
1
4= 21η2 − 12η + 1
J(1,0)3 (2η − 1) =
35
8(2η − 1)3 +
15
8(2η − 1)2 − 15
8(2η − 1)− 3
8= 35η3 − 45η2 + 15η − 1
(2.21)
2.2.4.2 Familias de Funciones 2D
Para el caso bidimensional triangular el numero de familias especialmente conocidas y
relevantes son mucho mas reducidas. En este caso se menciona unicamente las familias
de Appell y Proriol. Por simplicidad en la notacion, se introduce la tercer coordenada
baricentrica ζ := 1− ξ − η.
Polinomios de Appell
Estos polinomios se conciben como una generalizacion simetrica con respecto a ξ y η
de los polinomios de Jacobi a dos dimensiones [8]. Si bien estos polinomios no son
formalmente ortogonales segun la Definicion 2.1, sı satisfacen la siguiente propiedad de
ortogonalidad parcial/incompleta (respecto a la funcion de pesos unitaria (w(ξ, η) = 1):∫∫Tξpηq Akl(ξ, η) dξdη = 0, ∀p, q : p+ q < k + l. (2.22)
(En este caso T representa el triangulo estandar definido entre los vertices (0, 0), (1, 0)
y (0, 1)). Esta propiedad se puede demostrar por integracion directa, como se observa
en [3]. Esto es, el polinomio Akl(ξ, η) es ortogonal a cualquier polinomio de orden
estrictamente menor que k+ l, ya que es ortogonal a cualquier monomio ξpηq, p+ q <
k + l que se presente. En particular, es ortogonal a Apq(ξ, η). Reversando los roles de
los ındices k, l y p, q, se concluye entonces que los polinomios Akl(ξ, η) son ortogonales
a todo otro polinomio Aij(ξ, η) excepto cuando k + l = i+ j.
Aunque se pueden generalizar a un conjunto de polinomios completamente ortogonales
acordes a la definicion dada, estos nuevos polinomios pierden varias de las propiedades
que originalmente los hacen utiles en el calculo de funciones de interpolacion.
Capıtulo 2. Las bondades de los Metodos Espectrales 17
Polinomios de Appell
A00(ξ, η) = 1A10(ξ, η) = ζ − ξ = 1− 2ξ − ηA01(ξ, η) = ζ − η = 1− ξ − 2ηA20(ξ, η) = 2ζ(ζ − 4ξ) + 2ξ2
A11(ξ, η) = ζ(ζ − 2ξ − 2η) + 2ξηA02(ξ, η) = 2ζ(ζ − 4η) + 2η2
. . .
Akl(ξ, η) = ∂k+l
∂ξk∂ηl
(ξkηlζk+l
)Tabla 2.7: Primeros miembros de la familia de polinomios de Appell (Adaptado de
[3])
Polinomios de Proriol
Por su parte, los polinomios de Proriol son ortogonales en su totalidad, haciendolos
especialmente atractivos para construir las funciones de interpolacion requeridas para
las soluciones por metodos espectrales. De manera concreta, para la implementacion
del caso m = 3 con un dominio triangular (i.e. con polinomios de orden hasta 3, o con
10 nodos de interpolacion) se calculan manualmente de manera explıcita los terminos
de orden hasta 3 de acuerdo con los polinomios calculados anteriormente para Legendre
(en la Ecuacion 2.13) y Jacobi (en la Ecuacion 2.21).
Polinomios de Proriol
P00(ξ, η) = 1P10(ξ, η) = ξ − ζ = 2ξ + η − 1P01(ξ, η) = 3η − 1P20(ξ, η) = 6ξ2 + 6ξη + η2 − 6ξ − 2η + 1P11(ξ, η) = (2ξ + η − 1)(5η − 1)P02(ξ, η) = 10η2 − 8η + 1P30(ξ, η) = (2ξ + η − 1)(10ξ2 + 10ξη + η2 − 10ξ − 2η + 1)P21(ξ, η) = (6ξ2 + 6ξη + η2 − 6ξ − 2η + 1)(7η − 1)P12(ξ, η) = (2ξ + η − 1)(21η2 − 12η + 1)P03(ξ, η) = 35η3 − 45η2 + 15η − 1. . .
Pkl(ξ, η) = Lk
(2ξ1−η − 1
)(1− η)kJ
(2k+1,0)l (2η − 1)
Tabla 2.8: Primeros miembros de la familia de polinomios de Proriol
Capıtulo 2. Las bondades de los Metodos Espectrales 18
2.3 Interpolacion, el termino de error y la convergencia
espectral
Teniendo claras la forma que se va a trabajar de la ecuacion de Navier-Stokes y que
familias de funciones se usaran tanto para los casos 1D y 2D, es necesario entrar a con-
siderar formalmente la manera de construir y manipular las funciones de interpolacion.
Esto comprende tambien tener mas claras algunas de las familias mas prominentes. Una
vez es claro lo anterior, es posible entrar a tratar con termino de error. Ya con esto,
finalmente se puede analizar la convergencia resultante.
2.3.1 Las funciones de interpolacion
Si bien existen distintos tipos de funciones de interpolacion, las mas comunes son las poli-
nomiales debido a su mayor facilidad para ser operadas (e.g. derivacion o integracion).
Particularmente, es tambien importante notar que los polinomios de interpolacion es-
tandar (i.e. definidos sobre los dominios estandar) de un orden determinado son unicos
para un conjunto de nodos apropiado. Es por esto que se puede asegurar una alta consis-
tencia y repetibilidad independientemente de la forma de caracterizarlos y construirlos.
Sin embargo, de acuerdo con la necesidad que exista, la manera de aproximarse puede
llegar a facilitar o dificultar su procesamiento.
2.3.1.1 Interpolacion en 1D
Para el caso unidimensional, tıpicamente existen dos maneras de construir las funciones
de interpolacion. Estas son las diferencias divididas de Newton y los polinomios de
interpolacion de Lagrange. La primera es especialmente util en contextos de exploracion
o cuando se requiere un procesamiento recursivo de los datos, de manera que es posible
estimar facilmente el error en funcion de los puntos que no se hayan incluido todavia.
Sin embargo, esto mismo hace que la implementacion sea ligeramente mas complicada
y que no sea tan facil de operar. De manera general, si la funcion a interpolar es f(x),
su formulacion se puede expresar a partir de
ψn(x) = b0 + b1(x− x0) + · · ·+ bn(x− x0)(x− x1) · · · (x− xn−1), (2.23)
Capıtulo 2. Las bondades de los Metodos Espectrales 19
donde bi = f [xi, xi−1, . . . , x1, x0] y se definen recursivamente
f [xj ] = f(xj)
f [xj+1, xj ] =f [xj+1]−f [xj ]xj+1−xj
· · ·
f [xj+k, xj+k−1, . . . , xj ] =f [xj+k,xj+k−1,...,xj+1]−f [xj+k−1,xj+k−2,...,xj ]
xj+k−xj
.
Esta definicion hace evidente su naturaleza recursiva y la necesidad que construir las
funciones de interpolacion de ordenes menores.
Por su parte, la interpolacion de Lagrange permite obtener de una manera rapida y
directa la funcion resultante dados los nodos y sus valores respectivos. Esto significa un
numero menor de calculos requeridos y, por lo tanto una mayor velocidad de calculo.
En este caso, se observa que
ψn(x) =
n∑i=0
f(xi)`ni (x) =
n∑i=0
f(xi)
n∏j=0j 6=i
ξ − ξjξi − ξj
. (2.24)
En este caso `ni (x) :=∏nj=0j 6=i
ξ−ξjξi−ξj corresponde al polinomio de Lagrange, que satisface
`i(xj) = δij . Esta forma no solo permite un calculo mucho mas directo de los polinomios,
si no que permite operarlos de una manera mucho mas facil (usando reglas de derivacion
de productos o, inclusive, derivacion logarıtmica), como se refleja en el Capıtulo 4 y en
el Capıtulo 5.
2.3.1.2 Interpolacion en 2D
Para el caso bidimensional, la situacion no siempre resulta tan sencilla. Unicamente para
distribuciones especiales es posible factorizar la funcion de interpolacion de manera que
cada factor dependa exclusivamente de una de las coordenadas. En estos casos, cada uno
de los factores se acaba comportando como una funcion de interpolacion unidimensional
y, por lo tanto, se puede tratar como se describio en el apartado anterior. Ejemplos de
esto son distribuciones en mallas para dominios cuadrados (u otros cuadrilateros) y la
distribucion uniforme en el triangulo.
Para el caso del cuadrado, si la funcion a interpolar es f(ξ, η) y los nodos de interpolacion
son (ξi, ηj) ∀i ∈ {0, 1, . . . ,m}, j ∈ {0, 1, . . . , n} (para un total de (m + 1)(n + 1) nodos
Capıtulo 2. Las bondades de los Metodos Espectrales 20
de interpolacion), el resultado se puede describir como:
ψ(ξ, η) =m∑i=0
n∑j=0
f(ξi, ηj)`mi (ξ)`nj (η) =
m∑i=0
n∑j=0
f(ξi, ηj)
m∏k=0k 6=i
ξ − ξkξi − ξk
n∏l=0l 6=j
η − ηkηj − ηk
.
(2.25)
Por el contrario, para los casos mas generales es necesario utilizar una estrategia difer-
ente. En estos casos se tienen nodos de interpolacion (ξ1, η1), (ξ2, η2), . . . , (ξN , ηN ) y se
busca construir primero las funciones para cada nodo tales que ψ∗i (ξj , ηj) = δij y, por lo
tanto ψ(ξ, η) =∑N
i=1 f(ξi, ηi)ψ∗i (ξ, η). Estas funciones se ven de la forma
ψ∗i (ξ, η) = cNφ1(ξ, η) + cN−1φ2(ξ, η) + · · ·+ c1φN (ξ, η) (2.26)
donde N es el numero de nodos, y los φj son miembros de una base polinomial apropi-
ada. Para describir este problema mas facilmente, se utiliza la matriz de Vander-
monde generalizada (Vφij = φi(ξj , ηj)) de manera que, si ~c = (cN , cN−1, . . . , c1)T , ~ei =
(0, 0, . . . , 1, . . . , 0)T el i-esimo vector canonico, φ(ξ, η) = (φ1(ξ, η), φ2(ξ, η), . . . , φN (ξ, η))
y ψ∗(ξ, η) = (ψ∗1(ξ, η), ψ∗2(ξ, η), . . . , ψ∗N (ξ, η)), entonces:
V Tφ · ~c = ~ei ⇔ ~c = V T
φ−1 · ~ei
⇔ ψ∗i (ξ, η) = φ(ξ, η) · V Tφ−1 · ~ei
⇔ ψ∗(ξ, η) = Vφ−1 · φ(ξ, η)
⇔ Vφ · ψ∗(ξ, η) = φ(ξ, η) (2.27)
de acuerdo con [3]. Esta ultima, la Ecuacion 2.27, representa un sistema lineal que
permite describir a ψ∗i mediante la regla de Cramer por:
ψ∗i (ξ, η) =Det [Vφ(ξ1, η1, ξ2, η2, · · · , ξi−1, ηi−1, ξ, η, ξi+1, ηi+1, · · · , ξN , ηN )]
Det [Vφ(ξ1, η1, ξ2, η2, · · · , ξN , ηN )]. (2.28)
En este caso la matriz del numerador corresponde a sustituir la i-esima columna por las
mismas funciones pero evaluadas en (ξ, η) en lugar de (ξi, ηi).
2.3.2 El termino de error
Se observa que, en general, el error del metodo viene dado en su mayor parte por el error
en la interpolacion. Esto sucede por que el error de calculo es cuantificable y dependi-
ente de la tecnologıa usada y, adicionalmente, es posible realizar una integracion exacta
(con respecto a la funcion interpolada) bajo una cuadratura adecuada. Es por ello que
Capıtulo 2. Las bondades de los Metodos Espectrales 21
en esta seccion se trabaja sobre el termino de error correspondiente especıficamente a la
interpolacion, y sobre la constante de Lebesgue. Estos dos valores caracterizan el com-
portamiento y, en particular, la convergencia del metodo. Por su mayor facilidad para
ser descrito, se trabaja exclusivamente con el caso unidimensional, pero los resultados
se pueden extender al caso bidimensional naturalmente.
Si la funcion a interpolar es f(x) ∈ CN+1([c, d]) y el polinomio resultante de la inter-
polacion es PN (x) al usar los nodos x0, x1, . . . , xN , se observa que el termino de error,
definido por
e(x) = PN (x)− f(x), (2.29)
pertenece a CN+1([c, d]) y se puede reescribir como:
e(x) = −f(N+1)(ξ)
(N + 1)!ΦN+1(x) (2.30)
donde ΦN+1(x) =∏Ni=0(x− xi) con ξ ∈ (c, d).
Esta nueva descripcion de la funcion de error proviene de considerar la funcion
Q(z) = ΦN+1(z)e(x)− ΦN+1(x)e(z), (2.31)
donde x es el punto de interes sobre el que se calcula el error (diferente a los nodos
de interpolacion, donde el error es 0). Esta funcion tiene al menos N + 2 raices corre-
sponientes a z = x, x0, x1, . . . , xN , de manera que Q(N+1)(z), la (N + 1)-esima derivada,
tiene al menos una raiz, que se denota por ξ. Escrito explicitamente, esto quiere decir
que
0 = Q(N+1)(ξ) = Φ(N+1)N+1 (ξ)e(x)− ΦN+1(x)e(N+1)(ξ). (2.32)
Ahora, si se deriva N+1 veces la definicion del error mediante la Ecuacion 2.29, el
resultado, notando que P(N+1)N (x) = 0, es
e(N+1)(x) = −f (N+1)(x). (2.33)
Usando la Ecuacion 2.33 y recordando que Φ(N+1)N+1 (ξ) = (N + 1)!, la Ecuacion 2.32 se
vuelve
0 = (N + 1)!e(x)− ΦN+1(x)(−f (N+1)(x))⇒ e(x) = −f(N+1)(ξ)
(N + 1)!ΦN+1(x), (2.34)
como se queria.
Capıtulo 2. Las bondades de los Metodos Espectrales 22
2.3.3 Convergencia y la constante de Lebesgue
Teniendo clara la manera en que se puede tratar el termino de error, es necesario dotar
al espacio de funciones continuas con una norma para entrar a discutir sobre la nocion
de convergencia. En este caso, se usara la norma del maximo ‖f‖ = maxx∈[c,d] |f(x)|.Al considerar esta norma, es sabido [3] que entre los polinomios de orden N existe
un polinomio POptN (x) (no necesariamente de interpolacion para los nodos dados) que
minimiza el error ‖e(x)‖ = ‖POptN (x) − f(x)‖. A este error se le conoce como error
minimax y se denota tambien por ρN [f(x)].
Trabajando sobre las funciones f(x) tales que ‖f‖ = 1, se obtiene entonces que:
‖e(x)‖ = ‖PN (x)− f(x)‖
= ‖(PN (x)− POptN (x)) + (POptN (x)− f(x))‖
≤ ‖(PN (x)− POptN (x))‖+ ‖(POptN (x)− f(x))‖
= ‖(PN (x)− POptN (x))‖+ ρN [f(x)]
≤ ‖PN‖ · ‖f(x)− POptN (x))‖+ ρN [f(x)]
= (1 + ‖PN‖)ρN [f(x)], (2.35)
con ‖PN‖ := max‖f‖=1 (‖PN (x)‖). Este resultado se puede obtener tambien mediante
una aplicacion particular del Lema de Lebesgue, dando como resultado:
‖PN (x)− f(x)‖ ≤ (1 + ‖PN‖) infQN∈PN
‖QN (x)− f(x)‖ = (1 + ‖PN‖)ρN [f(x)], (2.36)
siendo PN el espacio de polinomios de orden menor o igual a N [9]. Para caracterizar
el termino ‖PN‖, se introduce lo que se conoce como la constante de Lebesgue.
Lema 2.2. (de Lebesgue en la Teorıa de la Aproximacion [3]) Dado un espacio vectorial
normado (V, ‖ · ‖), un subespacio U ⊆ V y P una proyeccion lineal en U . Para cada
v ∈ V se satisface:
‖v −Pv‖ ≤ (1 + ‖P‖) infu∈U‖v − u‖.
Si se consideran los polinomios de Lagrange de orden N (i.e. con N + 1 nodos de
interpolacion) correspondientes a los nodos xi (denotados por `Ni (x) como antes), se
puede definir la funcion de Lebesgue por
LN (x) :=N∑i=0
|`Ni (x)|, (2.37)
Capıtulo 2. Las bondades de los Metodos Espectrales 23
y el maximo valor que alcanza como
ΛN := max(LN (x)), (2.38)
conocido como la constante de Lebesgue. Esta constante depende unicamente de las
posiciones de los nodos de interpolacion y se relaciona con el termino anterior, ‖PN‖, de
acuerdo con:
‖PN‖ = max‖f‖=1,x
(‖PN (x)‖)
= max‖f‖=1,x
(∣∣∣∣∣N∑i=0
f(xi)`Ni (x)
∣∣∣∣∣)
≤ max‖f‖=1,x
(N∑i=0
|f(xi)||`Ni (x)|
)
≤ maxx
(N∑i=0
|`Ni (x)|
)= max
x(LN )
= ΛN (2.39)
Combinando la Ecuacion 2.35 con la Ecuacion 2.39, el resultado final es
‖e(x)‖ ≤ (1 + ΛN )ρN [f(x)]. (2.40)
Con respecto a esta formulacion, los teoremas de Jackson y Erdos presentan cotas para
el error minimax y para la constante de Lebesgue respectivamente [3]. Particularmente,
el primer teorema de Jackson indica que:
Teorema 2.3. (Primer Teorema de Jackson [3]) Dada una funcion f(x) ∈ C([c, d]) tal
que ‖f‖ = 1, el error minimax se puede acotar por:
ρN [f(x)] ≤(
1 +π2
2
)max
|x−y|≤1/N|f(x)− f(y)|. (2.41)
De esta manera, si la funcion resulta ser de Holder con exponente α (i.e. |f(x)−f(y)| ≤A|x − y|α para constantes A,α > 0), el error minimax decrece a una tasa de al menos
1/Nα. Por otra parte, la cota inferior propuesta por Erdos corresponde a:
Teorema 2.4. (Teorema de Erdos [9]) Dada una funcion f(x) ∈ C([c, d]) tal que ‖f‖ =
1, su constante de Lebesgue asociada esta acotada por:
ΛN >2
πln(N + 1)− c, (2.42)
Capıtulo 2. Las bondades de los Metodos Espectrales 24
siendo c > 0 una constante.
Esto ultimo indica que la misma tendera a crecer inevitablemente a tasas por lo menos
logarıtmicas. De acuerdo con esto, el error convergera (uniformemente) en la medida en
que el crecimiento de la constante de Lebesgue sea menor a la tasa de decrecimiento del
error minimax.
2.3.4 Convergencia Espectral
Teniendo ya claros los conceptos de error y de la constante de Lebesgue, es posible entrar
a considerar las maneras de minimizar el error (a partir de la seleccion de los nodos de
interpolacion). Si bien definir los nodos de interpolacion como los ceros de los polinomios
de Chevyshev permite minimizar la norma (como se observa en el Capıtulo 2.2.4), estos
ceros no incluyen los extremos del intervalo. Ahora, aunque en metodos espectrales esto
no genera inconvenientes, al hablar de metodos de elementos espectrales es necesario que
existan nodos compartidos en las fronteras, garantizando la continuidad de las soluciones
entre dominios adjacentes (i.e. elementos adjacentes) [3]. Es por esto que al justificar la
utilizacion de los metodos espectrales en la practica se habla tambien de los puntos de
Fekete (que en el caso unidimensional coinciden con los nodos de interpolacion ubicados
en los ceros de Lobatto completados).
Teorema 2.5. Para una funcion f(x) definida sobre un intervalo [a, b] Holder con ex-
ponente α > 12 , los polinomios de interpolacion PN (x) definidos por los nodos correspon-
dientes a los ceros de los polinomios de Lobatto completados con (x0 = −1 y xN = 1)
convergen (i) uniforme y (ii) exponencialmente a f .
Para comprobar este resultado en su totalidad, se requiere obtener una cota bastante
refinada, la cual es dificil de construir. Sin embargo, para observar la convergencia
uniforme basta con construir una cota mas sencilla, por lo que se tratara primero solo
esta parte.
Prueba. (i) (Adaptada de [3]) Para comenzar, si el dominio de trabajo [c, d] no corre-
sponde al dominio de los polinomios de Lobatto, se utiliza el cambio de coordenadas
x =d+ c
2+ t
d− c2
, (2.43)
de manera que x ∈ [c, d] para t ∈ [−1, 1]. Particularmente, los nodos de interpolacion
x0 = c y xN = d se ven asignados a los valores t0 = −1 y tN = 1. Ahora bien, para
Capıtulo 2. Las bondades de los Metodos Espectrales 25
estos nodos t0, t1, . . . , tN es posible definir las funciones de Lagrange `Ni (t). Con esta
definicion se puede observar que las funciones satisfacen la propiedad adicional
`Ni′(ti) = 0 ∀i ∈ {1, 2, . . . , N − 1}, (2.44)
solo si los puntos intermedios corresponden a los ceros de los polinomios de Lobatto.
Como se tiene que
`Ni′(ti) =
Φ′′N+1(ti)
2Φ′N+1(ti)⇒ Φ′′N+1(ti) = 0, (2.45)
donde Φ′′N+1 representa un polinomio de orden N − 1 que satisface
(t− 1)(t+ 1)Φ′′N+1(t) = N(N + 1)ΦN+1(t)⇒ Φ′′N+1(t) = −N(N + 1)ΦN+1(t)
1− t2. (2.46)
La Ecuacion 2.46 se puede reescribir como la ecuacion diferencial
(1− t2)Φ′′N+1(t) +N(N + 1)ΦN+1(t) = 0 (2.47)
cuyas soluciones, comparado con las definiciones del Capıtulo 2.2.4, son justamente los
polinomios de la forma
ΦN+1(t) = cN+1(t2 − 1)L′N (t) = cN+1(t
2 − 1)LoN−1(t). (2.48)
para cN+1 una constante, de manera que los ceros corresponden justamente a los de
Lobatto.
Ahora bien, procedieron realmente a la convergencia, se define el polinomio de orden 2N
G2N (t) := `N02(t) + `N1
2(t) + · · ·+ `NN
2(t)− 1. (2.49)
Esta funcion satisface que G2N (ti) = 0, lo que a su vez implica que se puede factorizar
en
G2N (t) = ΦN+1(t)ΨN−1(t) (2.50)
con ΨN−1(t) un polinomio de orden N −1. Al derivar la funcion se obtiene tambien que
G′2N (t) = 2
N∑i=0
`Ni (t)`Ni′(t), (2.51)
de modo que se tiene que G′2N (ti) = 0 para los nodos intermedios (de t2 hasta tN−1).
Esto quiere decir que estos valores son raices dobles, o que el polinomio desconocido
Capıtulo 2. Las bondades de los Metodos Espectrales 26
ΨN−1(t) se puede expresar como
ΨN−1(t) = dΦN+1(t)
(t+ 1)(t− 1)= −dΦN+1(t)
1− t2, (2.52)
con d una constante. Esto a su vez significa que la funcion original corresponde a,
reemplazando la Ecuacion 2.52 en la Ecuacion 2.50:
G2N (t) = ΦN+1(t)
(−dΨN+1(t)
1− t2
)= −d
Ψ2N+1(t)
1− t2= −e(1− t2)Lo2N−1(t), (2.53)
con e una nueva constante. Si se deriva la ecuacion anterior el resultado es, evaluando
en tN = 1:
G′2N (tN ) = 2eLo2N−1(t) = 2e
(1
2N(N + 1)
)=
1
2N2(N + 1)2. (2.54)
Para calcular el valor exacto de la constante se evalua entonces la derivada G′2N (t)
(descrita por Ecuacion 2.51) en tN = 1.
G′2N (tN ) = 2`NN′(tN ) =
Φ′′N+1(tN )
Φ′N+1(tN )=
([(t2 − 1)LoN−1(t)]
′′
[(t2 − 1)LoN−1(t)]′
)t=tN
=L′N (tN )
LN (tN ), (2.55)
donde los ultimos pasos corresponden a la Ecuacion 2.48 y la ecuacion diferencial que
satisfacen los polinomios de Legendre (Capıtulo 2.2.4). De acuerdo con la construccion
de estos polinomios, se tiene finalmente que
L′N (tN )
LN (tN )=LoN−1(tN )
LN (tN )=
12N(N + 1)
1=
1
2N(N + 1). (2.56)
Comparando este valor con la Ecuacion 2.54 se observa que e = 1N(N+1) . Al introducir
este valor en la Ecuacion 2.53 se puede notar que
G2N (t) = − 1
N(N + 1)(1− t2)Lo2N−1(t) ≤ 0 ∀t ∈ [−1, 1]. (2.57)
Este ultimo resultado se traduce directamente en que
N∑i=0
`Ni (t)2 ≤ 1⇒ `Ni
2(t) ≤ 1 i = 0, 1, . . . , N ⇒ |`Ni (t)| ≤ 1 i = 0, 1, . . . , N . (2.58)
Usando la desigualdad de Cauchy-Schwartz, esto se traduce en la cota superior para la
constante de Lebesgue:
Λ2N =
(N∑i=0
|`Ni (ξ)|
)2
≤N∑i=0
|`Ni (ξ)|2 ≤ N + 1⇒ ΛN ≤√N + 1. (2.59)
Capıtulo 2. Las bondades de los Metodos Espectrales 27
N ΛN N ΛN N ΛN
1 1.000 6 1.874 11 2.2412 1.250 7 1.972 12 2.2923 1.500 8 2.046 13 2.3424 1.636 9 2.121 14 2.3915 1.779 10 2.180 15 2.430
Tabla 2.9: Constantes de Lebesgue para nodos de interpolacion de Lobatto
Combinando esto con la Ecuacion 2.41 se deduce que, como la funcion es Holder con
α > 1/2:
‖e(x)‖ ≤(
1 +√N + 1
) A
Nα∼ K
√N
Nα
N→∞→ 0, (2.60)
siendo K una constante. Esto muestra entonces la convergencia uniforme de los poli-
nomios de aproximacion, dado que el error definido aquı corresponde justamente al
maximo de los errores a lo largo del dominio de definicion.
(ii) En cuanto a la convergencia espectral, como se menciono anteriormente, es necesario
refinar la cota. Empıricamente se puede observar la manera en que varıa la constante de
Lebesgue para esta distribucion, como se presenta en la Tabla 2.9. Esta tabla muestra
los valores de ΛN calculados para valores pequenos de N , a partir de los cuales se puede
apreciar que la constante no parece crecer mucho mas alla de la cota propuesta por
Erdos. De hecho, [10, 11] muestran que la constante de Lebesgue para esta distribucion
se puede acotar por
ΛN ≤2
πln(N + 1) + 0.685. (2.61)
Tomando en cuenta esta nueva cota, la Figura 2.2 presenta de manera grafica las con-
stantes de Lebesgue con sus respectivas cotas superiores (logarıtmica y raiz).
Al combinar el resultado obtenido junto con la Ecuacion 2.41, se obtiene finalmente que
‖e(x)‖ ≤(
1 +
(2
πln(N + 1) + 0.685
))A
Nα∼ K lnN
Nα, (2.62)
en el cual se puede apreciar una tasa de convergencia mayor a cualquier potencia 1/Nβ.
Es decir, se presenta una tasa de convergencia exponencial o espectral [3].
De manera complementaria, al pasar a dos (o mas) dimensiones, nuevamente se presentan
los puntos de Fekete como las posiciones optimas para la escogencia de los nodos de
interpolacion, como se aprecia en [10, 12]. Sin embargo, para el caso triangular le siguen
de cerca las mallas de nodos generados a partir de los polinomios de Chevishev del
segundo orden y de Lobatto para ordenes no muy altos, de acuerdo con lo presentado
en [12].
Capıtulo 2. Las bondades de los Metodos Espectrales 28
Figura 2.2: Constantes de Lebesgue calculadas para distintos numeros de nodos ysus cotas
Capıtulo 3
Metodos de elementos finitos y
espectrales
Teniendo ya los fundamentos teoricos correspondientes a una solucion espectral, es posi-
ble plantear mas puntualmente los pasos necesarios para obtener una implementacion
de un metodo por elementos, ya sea de elementos finitos o espectrales. Estos pasos
corresponden puntualmente a la generacion de la malla de nodos de interpolacion y a
la construccion de las matrices globales del problema (la cual se construye a partir de
las matrices correspondientes a cada elemento). En este sentido, el presente capıtulo
describe extensivamente cada uno de estos pasos y toma en consideracion las diferencias
que pueden surgir a raiz de una nomenclatura distinta para los nodos. En el Capıtulo 4
y el Capıtulo 5 se presentan los ejemplos de aplicacion de esta infraestructura.
3.1 Antecedentes: Metodos de Elementos Finitos
Los metodos de elementos finitos han sido ampliamente acogidos para ser usados en
una gran variedad de aplicaciones debido a su alta versatilidad. Estos metodos son,
en principio, aplicables en casi cualquier tipo de geometria y para casi cualquier tipo
de problema o ecuacion (aunque funcionan mejor en problemas del tipo de la ecuacion
de difusion, que en problemas del tipo de la ecuacion de conveccion [3]). Su nombre
proviene del hecho de que en lugar de trabajar sobre el dominio de solucion completo di-
rectamente, se utilizan unidades sencillas (tıpicamente polıgonos o polihedros convexos)
llamadas elementos finitos. En particular, ejemplos populares de discretizaciones in-
cluyen el refinamiento sucesivo de una malla maestra, o la triangulacion de Delaunay.
Las mallas resultantes son estructurada y no estructurada (que permite la adicion o
remocion de elementos sin afectar necesariamente a los otros nodos o su numeracion)
29
Capıtulo 3. Metodos de elementos finitos y espectrales 30
respectivamente. Debido a lo anterior, las elecciones cruciales a la hora de definir un
metodo de elementos finitos (y que no se mencionaron al tratar con los metodos espec-
trales) son las siguientes: la escogencia de los nodos de interpolacion o la definicion de
la malla, la manera de numerar los nodos ina vez se define la malla, y la manera en que
se ensamblan los elementos en la matriz del problema [13].
Esta familia de metodos ha sido ampliamente estudiada en [13, 14] y ha sido la her-
ramienta fundamental en la mayorıa de los software de simulacion numerica. Sin em-
bargo, su mayor limitacion corresponde a la sensibilidad con respecto a la definicion de
la malla (distintas mallas significan distintos tiempos de solucion) y a la necesidad de
tiempos extensos para lograr altas precisiones. Esto es, para alcanzar una cierta pre-
cision, se puede requerir un alto numero de elementos, lo cual a su vez se traduce en
largos tiempos de solucion (ya que su tasa de convergencia suele ser del orden de 1/Nk
[3]).
3.2 Generacion de la malla
Como se expreso previamente, el componente principal de cualquier metodo de solucion
por elementos, que adicionalmente marca la precision y calidad de la solucion, corre-
sponde a la generacion de la malla de nodos con respecto a los cuales se trabaja. A
excepcion del caso lineal, en que los nodos se encuentran unicamente en los vertices
de las fronteras entre elementos, esto se realiza en dos pasos: primero se definen los
elementos a usar y posteriormente se construye en cada uno de ellos la totalidad de
los nodos de interpolacion. Sin embargo, dado que es necesario identificar nodos co-
incidentes entre elementos adjacentes para implementar las condiciones de frontera, se
utiliza un recurso adicional. Este se denomina matriz (o tabla) de conectividad y per-
mite relacionar la numeracion global que reciben los nodos, con la numeracion interna
o local a cada elemento. A continuacion se trata cada uno de estos puntos de manera
independientemente.
3.2.1 Generacion de los elementos
En general, la construccion de los elementos se puede realizar de distintas maneras,
siendo las mas populares las indicadas anteriormente (usando mallas ancestrales que se
van refinando o la triangulacion de Delaunay y sus equivalentes en otros dominios [3])
y el uso de la geometrıa del dominio completo (cuando el mismo no es muy complejo).
La primera alternativa, el uso de una malla ancestral, suele no ser ideal pues, ademas
de que se requiere la definicion de los elementos ancestrales, su crecimiento es bastante
Capıtulo 3. Metodos de elementos finitos y espectrales 31
limitado (i.e. se subdivide cada elemento de una misma manera, resultando en una malla
cuyos numeros de elementos son un multiplo de la cantidad de elementos preexistentes).
A modo de ejemplo, si la malla original consta de 8 elementos triangulares sobre un
dominio rectangular, y el paso de refinamiento consiste en construir nuevos elementos
tomando los puntos medios de las fronteras de los elementos definidos previamente, el
numero de elementos se multiplica por 4 y, por lo tanto, siempre se tiene una potencia
de 2 como numero de elementos (asi como de divisiones en cada dimension (Figura 3.1).
Figura 3.1: Malla ancestral de elementos triangulares con un paso de refinamiento
Otra estrategia de construccion, especialmente adecuada para dominios de geometrias
no muy complejas, corresponde a la subdivision uniforme de la malla. Es decir, realizar
un proceso similar al anterior, pero directamente sobre la totalidad del dominio. En este
caso, la malla se puede refinar por distintas cantidades sobre cada dimension, haciendo
la malla resultante mucho mas versatil (e.g. con mas divisiones sobre la dimension de
mayor longitud). La Figura 3.2 presenta dos ejemplos de enmallado para un sistema
rectangular.
Figura 3.2: Malla definida por medio de subdivision directa del dominio de solucion
Finalmente, la estrategia de construccion de mallas no estructuradas conocida como
triangulacion de Delaunay es adecuada para dominios generales. En este caso se definen
primero los vertices de los elementos y, a partir de ellos, se construyen los elementos
correspondientes. Sin embargo, por el numero adicional de procesos que se requieren,
Capıtulo 3. Metodos de elementos finitos y espectrales 32
toma un tiempo mas largo que el de las estrategias anteriores. Una implementacion
de esta discretizacion se encuentra en [3]. se evitano es apta y el uso de mallas no
estructuradas.
En todo caso, de acuerdo con la malla definida, es posible que se afecte no solo la facil-
idad de resolucion del sistema, si no propiedades intrinsecas de la solucion, incluyendo
la anisotropıa (i.e. dependencia en la orientacion del elemento). Para asegurar que la
solucion es fisicamente viable, se requiere satisfacer la continuidad de la misma a traves
de los elementos. Esto se garantiza mediante la seleccion de una serie de nodos compar-
tidos entre elementos adjacentes, incluyendo los vertices de los elementos. Esto se debe
a que es justamente a traves de estos nodos que se acopla el sistema global para dar
lugar a la solucion unica para la malla.
3.2.2 Generacion de nodos de interpolacion
Conociendo el numero de elementos y su distribucion, es posible generar los nodos de
interpolacion sobre cada elemento. De acuerdo con el Capıtulo 2, las ubicaciones ideales
para estos nodos corresponden justamente a los ceros de las familias de polinomios or-
togonales. Mas aun, como se deben incluir nodos de frontera compartidos para asegurar
las condiciones de continuidad, se prefieren familias como las de Lobatto sobre las de
Chevyshev o Legendre (para el caso unidimensional). Como aun bajo esta restriccion
existen un gran numero de posibles definiciones, en [15] se estudian diferentes posibili-
dades y sus consecuencias respectivas. De acuerdo con lo anterior y al Tabla 2.5 (junto
con sus analogos para mas dimensiones), el caso ideal corresponde a los nodos de inter-
polacion de Fekete. Estos coinciden justamente con los de Lobatto para el caso 1D y
para el caso 2D con dominios cuadrilaterales (ya que los nodos se obtienen a partir de
productos tensoriales de desarrollos provenientes del caso 1D).
Adicionalmente, en el caso de estudio (las ecuaciones de Navier-Stokes) se cuenta con
dos conjuntos de nodos de interpolacion (en velocidad y en presion), aunque el sistema
correpondiente a la ecuacion diferencial parcial se encuentra proyectado sobre los nodos
de interpolacion de velocidad unicamente. Esto significa que es necesario definir los
nodos de interpolacion para ambos casos, pero solo para los nodos de velocidad es
necesario garantizar completamente la continuidad de la funcion, por razones que se
discutiran en la seccion siguiente. De hecho, es necesario que se satisfaga la ecuacion:
2(NuG)i
NpG
> 1, (3.1)
donde (NuG)i corresponde a los nodos de interpolacion internos, o que no estan sobre la
frontera del dominio completo. De este modo, si se utiliza un nodo de interpolacion de
Capıtulo 3. Metodos de elementos finitos y espectrales 33
presion por elemento (i.e. esencialmente se toma la presion promedio del elemento), la
condicion indica que los nodos de interpolacion para velocidad deben ser por lo menos
cuadraticos.
3.2.3 Matriz de conectividad
Una vez se definen los nodos, la matriz de conectividad se construye sencillamente recor-
riendo ordenadamente cada uno de los nodos en cada uno de los elementos, y verificando
si el nodo ya existe en la lista. Esto es, en cada pasada se asigna el numero correspondi-
ente, o se agrega el nuevo nodo. Es de especial interes notar que la identificacion de los
nodos tiene en cuenta que un mismo nodo puede tener coordenadas ligeramente distintas
en distintos elementos debido a errores de precision o calculo, por lo cual es importante
definir una toleracia de identificacion de nodos coincidentes (generalmente una fraccion
del paso mas pequeno entre nodos consecutivos.
3.3 Construccion de la matriz global y el vector del lado
derecho
Para la construccion de la matriz global del problema es necesario primero terminar de
reducir los resultados de las Ecuacion 2.4 y Ecuacion 2.9 a una expresion que dependa
exclusivamente de los nodos de interpolacion. Para ello, recordando que el gradiante de
la funcion de velocidad se puede reexpresar mediante ∇~u =∑Nu
Gj=1(∇φuj )~uj , el resultado
es:
0 =
NuG∑
j=1
~uj ·∫Dφpi∇φ
uj dV (3.2)
0 =
NpG∑
j=1
pj
∮∂D
φui φpj dS − µ
NuG∑
j=1
~uj
∮∂D
φui ~n · ∇φuj dS
+
NpG∑
j=1
pj
∫D∇φui φ
pj dV − µ
NuG∑
j=1
~uj
∫D∇φui · ∇φuj dV (3.3)
donde el ultimo termino corresponde a la matriz de difusion Duij , es decir:
Duij =
∫D∇φui · ∇φuj dV . (3.4)
Ahora bien, si se aplican condiciones de frontera de Dirichlet sobre toda la frontera
del dominio, los primeros dos terminos de la ultima ecuacion se vuelven identicamente
Capıtulo 3. Metodos de elementos finitos y espectrales 34
0 para las funciones de interpolacion de los nodos internos. Esto quiere decir que el
sistema final se encuentra formado entonces por
0 = µ
NuG∑
j=1
Duij~uj −
NpG∑
j=1
~Ajipj , (3.5)
con ~Aji =∫D∇φ
ui φ
pj dV o, para el caso bidimensional:
~Aji = (Axij , Ayij) =
(∫D
∂φui∂x
φpj dA,
∫D
∂φui∂y
φpj dA
). (3.6)
Reescribiendo esto en forma se sistema lineal, el resultado en entonces:
µDu 0 −ATx
0 µDu −ATy−Ax −Ay 0
·
ux1...
uxNuG
uy1...
uyNuG
p1...
pNpG
= 0 (3.7)
Como las presiones estan presentes en 2(NuG) ecuaciones de este sistema, que adicional-
mente se reducen a 2(NuG)i al implementar las condicionesde frontera, se requiere que
2(NuG)i > Np
G para que el sistema efectivamente tenga solucion. Habiendo definido lo
anterior, es posible proceder a construir las matrices son respecto a las cuales se plantea
numericamente el problema original.
3.3.1 Matrices por elemento
Para la generacion de la matriz global del problema es necesario definir primero cada
una de las matrices correspondientes por cada elemento. En el caso 1D esto corresponde
a las matrices de masa y de difusion (o rigidez) por cada elemento. Respectivamente, se
tienen:
Θij =
∫ 1
−1ψi(ξ)ψj(ξ)dξ Ψij =
∫ 1
−1
dψidξ
dψjdξ
dξ, (3.8)
Capıtulo 3. Metodos de elementos finitos y espectrales 35
que se presentan en su forma adimensional ya que el valor de la integral original no
depende de la ubicacion del elemento, y el tamano del mismo se puede incorporar pos-
terirmente mediante las relaciones A(l)ij = 2
hlΨij y B
(l)ij = hl
2 Θij .
Similarmente, para el caso 2D se tienen las matrices de difusion/rigidez y masa, asi
como una matriz nueva: la matriz de adveccion. Segun el tipo de elemento, en este caso
usualmente no es posible llegar a una construccion adimensional ya que la integracion
puede ser sensible a la posicion y la orientacion de los elementos (asi como al tamano).
Las ecuaciones en este caso son:
A(`)ij =
∫∫E`
∇ψ(`)i ·∇ψ
(`)j dxdy B
(`)ij =
∫∫E`
ψ(`)i ψ
(`)j dxdy C
(`)ij =
∫∫E`
ψ(`)i ~u·∇ψ(`)
j dxdy,
(3.9)
respectivamente.
Para su calculo se hace necesario determinar los gradientes de las funciones de interpo-
lacion. Para ello, se utilizan las funciones de interpolacion (ψi(ξ, η)), sus derivadas con
respecto a ξ y a η,(∂ψi(ξ,η)
∂ξ , ∂ψi(ξ,η)∂η
)y tambien el jacobiano correspondiente al cambio
de coordenadas (x, y)↔ (ξ, η), o los terminos de la forma:
∂x
∂ξ,∂x
∂η,∂y
∂ξ,∂y
∂η.
Todo esto hace posible calcular los gradientes de las funciones de interpolacion mediante
el sistema lineal 2× 2 [3]: (∂x∂ξ
∂y∂ξ
∂x∂η
∂y∂η
)∇ψi =
(∂ψi
∂ξ
∂ψi
∂ξ
)(3.10)
Finalmente, para el calculo de la integral se utilizan tipicamente cuadraturas de Gauss
para el tipo de dominio correspondiente.
3.3.2 Matriz de difusion global
Para la construccion de la matriz global basta con sumar los efectos de cada una de las
matrices por elemento. Sin embargo, es importante notar que la matriz original siempre
va a ser singular, ya que las matrices por elemento son, por construccion, singulares.
Aun asi, este problema se puede solucionar facilmente con la remocion de una fila y
una columna del sistema (usualmente las primeras o las ultimas) donde la condicion de
frontera indique un valor conocido o al menos una restriccion que permita deducir su
valor de manera posterior.
Capıtulo 3. Metodos de elementos finitos y espectrales 36
Para el caso unidimensional, se puede observar que los unicos nodos compartidos son los
extremos de los intervalos, de manera que se obtienen patrones de esparcidad correspon-
dientes a bloques unidos por sus elementos extremos (como en el caso de la Figura 3.3).
Por su parte, el caso 2D es mas sensible a estas consideraciones, como se observa en la
seccion siguiente.
Figura 3.3: Diagrama de esparcidad para la matriz de difusion en 1D
3.3.3 Vector derecho y condiciones de frontera
En el lado derecho se incorporan los terminos adicionales del problema, incluyendo la
funcion de entrada y posibles terminos dependientes del tiempo en casos no estacionarios.
En el caso de la ecuacion de Navier-Stokes, esto corresponde a los terminos derivados
de la presion, las cargas externas y la dependencia en el tiempo. Es importante rescatar
que implementar las condiciones de frontera significa modificar, o bien a la matriz del
problema, o bien a este vector. Esto puede ser dandole un valor nuevo (frontera de
Neumann), o sumando/restando el efecto de los nodos de frontera adjacentes (frontera
de Dirichlet). A modo de ejemplo, para el caso bidimensional con fronteras de Dirichlet
se procede de la siguiente manera si l es un nodo de frontera:
• Sustituir las entradas bi por bi −Dilfl (Incluyo el efecto del nodo
• Cambiar el termino bl por fl
• Igualar las entradas de la fila l y columna l por 0 en la matriz global
Capıtulo 3. Metodos de elementos finitos y espectrales 37
• Reajustar el termino Dll a 1.
siendo D la matriz del problema, ~b el vector del lado derecho y f la funcion evaluada en
el nodo (ξl, ηl).
3.4 Diferencias en el sistema resultante: Caso 2D
Dado que el ancho de banda de la matriz global del problema depende directamente
de la manera en que estan numerados los nodos, es importante analizar cuales efectos
puede tener esta numeracion sobre el tiempo requerido para solucionar el sistema. Esto
es, si las matrices representan un mismo problema, se tendra que llegar a la misma
solucion siempre y cuando los esquemas de solucion sean igualmente precisos, pero no
necesariamente en el mismo tiempo. Si bien la numeracion externa, o de los elementos,
tiende a ser la misma para distintos casos de solucion, es importante notar que es la
numeracion interna de los nodos la que modifica el aspecto de cada uno de los bloques
correspondientes a las matrices por elemento, de manera que se analiza especificamente
este efecto.
Para evaluar los tiempos que toma a cada uno de los tres esquemas de numeracion
(cuadrilateral con numeracion XY y con numeracion YX y triangular con numeracion
cıclica), se utiliza el caso de estudio descrito en el Capıtulo 5. En esta ocasion, se definen
numeros de elementos y ordenes, de manera que las divisiones coincidan y el numero
de nodos sea el mismo en todos los casos. Estas condiciones se refieren a: 24 divisiones
sobre el eje x (de longitud 2.4), 16 divisiones sobre el eje y (de ancho 1.6), y orden 3 en
cada dimension (casos cuadrilaterales) o cada elemento (caso triangular). Para tomar
en cuenta las variaciones que pueden llegar a haber entre distintas corridas del codigo,
se utilizan 40 sistemas en cada caso.
3.4.1 Elementos quadrilaterales con numeracion XY
Esta es la numeracion natural de los nodos siguiendo la convencion fisica XY dentro
de cada elemento, como se ilustra en la Figura 3.4. Para este caso, hay varios saltos
en la numeracion a regiones distintas en la malla, lo que se traduce en un patron de
esparcidad mas disperso (Figura 3.5). Para el caso de estudio indicado previamente, los
tiempos requeridos para las tres operaciones se registran en la Tabla 3.1.
Capıtulo 3. Metodos de elementos finitos y espectrales 38
Figura 3.4: Numeracion en el orden XY
Operacion Tiempo Promedio Desviacion
Definicion de nodos 42.94 0.44Calculo de la matriz 28.57 0.37Solucion del sistema 16.16 0.51
Tiempo Total 87.68 1.08
Tabla 3.1: Tiempos medidos para la numeracion XY
Operacion Tiempo Promedio Desviacion
Definicion de nodos 43.79 0.37Calculo de la matriz 28.54 0.30Solucion del sistema 15.59 0.44
Tiempo Total 87.92 0.89
Tabla 3.2: Tiempos medidos para la numeracion YX
3.4.2 Elementos quadrilaterales con numeracion YX
Esta es la numeracion natural de las matrices siguiendo la convencion ij dentro de cada
elemento, como se ilustra en la Figura 3.6. Para este caso, la numeracion tiende a ser
mas uniforme y los saltos se presentan unicamente al cambiar de fila de elementos. Esto
se traduce en franjas mas largas en el patron de esparcidad (Figura 3.7). Para el caso
de estudio indicado previamente, los tiempos requeridos para las tres operaciones se
registran en la Tabla 3.2.
Capıtulo 3. Metodos de elementos finitos y espectrales 39
Figura 3.5: Patron de esparcidad en el orden XY
Figura 3.6: Numeracion en el orden YX
3.4.3 Elementos triangulares con numeracion cıclica
Esta es una numeracion natural de los nodos triangulares, siguiendo la convencion cıclica
y terminando por los nodos interiores, como se ilustra en la Figura 3.8. Para este caso, el
mayor numero de nodos compartidos resulta en un patron de esparcidad menos ordenado
y se alcanza un ancho de bando mayor en los bloques centrales (Figura 3.9). Para el
Capıtulo 3. Metodos de elementos finitos y espectrales 40
Figura 3.7: Patron de esparcidad en el orden YX
Figura 3.8: Numeracion en el orden cıclico
caso de estudio indicado previamente, los tiempos requeridos para las tres operaciones
se registran en la Tabla 3.3.
Capıtulo 3. Metodos de elementos finitos y espectrales 41
Operacion Tiempo Promedio Desviacion
Definicion de nodos 57.14 0.22Calculo de la matriz 14.11 0.03Solucion del sistema 17.69 0.40
Tiempo Total 88.93 0.60
Tabla 3.3: Tiempos medidos para la numeracion triangular
Figura 3.9: Patron de esparcidad en la numeracion cıclica
3.4.4 Comparacion de los resultados
De acuerdo con lo que se aprecia en cada una de las tablas, si bien las distintas numera-
ciones tienen ventajes significativas en uno u otro componente, los tiempos promedios
que les toma el calculo de la sulcion completa es aproximadamente el mismo. Pun-
tualmente, los nodos mas faciles de generar y graficar corresponden a las numeraciones
XY y YX, ya que estas se pueden obtener rapidamente mediante el uso de la funcion
meshgrid( , ). Por su parte, los elementos triangulares se numeran manualmente y por
lo tanto requieren un tiempo ligeramente mayor (aproximadamente 15 segundos mayor
en este caso). Mas aun, el numero de elementos para el caso triangular es el doble que
en los otros casos, contribuyendo tambien a esta diferencia.
En cuanto a la generacion de la matriz del problema, la situacion se reversa: el tiempo
para la numeracion triangular es casi la mitad del tiempo requerido para los casos XY
y YX. En las numeraciones XY y YX se hacen necesarias una serie de ciclios anidados
para recorrer cada dimension de cada componente (nodos de interpolacion del elemento,
Capıtulo 3. Metodos de elementos finitos y espectrales 42
nodos de la cuadratura) y adicionalmente el uso de multiples condicionales por la forma
de la funcion de interpolacion, ralentizando significativamente la velocidad de solucion.
Por su parte, el caso triangular presenta funciones precalculadas explicitamente, como lo
son los polinomios de Proriol y sus derivadas respectivas. Asi mismo, aun si el numero
de elementos es el doble, la cantidad de operaciones requerida en cada uno es menor.
Por su parte, la solucion de los sistemas es el proceso que tiene menor variacion entre los
tres. Sin embargo, es posible apreciar que la numeracion YX toma un tiempo que alcanza
a ser notablemente (i.e. estadısticamente significativo) menor que el de la numeracion
XY y, a su vez, este ultimo al de la numeracion triangular. Como en este caso el tamano
de los sistemas sigue siendo relativamente pequeno, estos resultados ya significativos
podrian indicar la aparicion de diferencias mucho mayores para tamanos mas grandes.
Capıtulo 4
Implementacion en 1D
4.1 Flujo de Couette
Figura 4.1: Diagrama representativo del flujo de Couette generalizado (Adaptado de[16])
En el flujo de Couette generalizado el fluido se encuentra confinado entre placas planas
paralelas infinitas y esta sometido a un gradiente de presion. Las placas se encuentran
separadas por una distancia constante L y el gradiente de presion se presenta en la
direccion del flujo (paralelo a las placas). Adicionalmente, las velocidades de las placas
son U0 y U1 (en direccion x) respectivamente. Todo esto se refleja en la Figura 4.1.
De acuerdo con este planteamiento, se tienen en cuenta las siguientes consideraciones:
• El flujo se presenta unicamente en la direccion x (v = w = 0).
43
Capıtulo 4. Implementacion 1D 44
• El gradiente de presion al que esta sometido el fluido es constante ( ∂p∂x = p).
• El flujo no depende de la coordenada z ( ∂∂z = 0).
• El fluido se encuentra en estado estacionario ( ∂∂t = 0).
• No hay fuerzas externas afectando el flujo (fx = fy = fz = 0).
De aquı, las ecuaciones de continuidad y de Navier-Stokes se reducen a:
∂ρ
∂t+∇ · (ρ~u) = 0 → ∂u
∂x= 0 (4.1)
ρ
(∂~u
∂t+ ~u · ∇~u
)= ρ~f −∇p+ µ∇2~u → 0 = ρu
∂u
∂x= −p+ µ
∂2u
∂y2(4.2)
En este sentido, la ecuacion resultante es un caso particular del problema de difusion
estable:
kd2f
dx2+ s(x) = 0
Donde k = µ, y s(x) = −p, y las condiciones de frontera corresponden a valores conocidos
(tipo Dirichlet):
u(0) = U0 u(L) = U1
Teniendo esto en cuenta, la solucion analıtica corresponde a
u(y) =∆p
2µ`(y2 − Ly) +
U1 − U0
Ly + U0 (4.3)
4.2 Solucion por elementos espectrales
Ahora, de acuerdo con lo desarrollado en el Capıtulo 2 y el Capıtulo 3, para aplicar el
metodo de elementos espectrales es necesario realizar los siguientes pasos:
• Introduccion de la informacion del problema
• Definicion de los elementos a usar (cantidad NE y distribucion, ası como sus
ordenes NP (i))
– Seleccion de los nodos de interpolacion a usar
– Generacion de la matriz de conectividad
• Generacion del sistema lineal del problema
– Generacion de la matriz de difusion
Capıtulo 4. Implementacion 1D 45
– Generacion del vector b (del lado derecho)
• Solucion del sistema resultante
Como la teorıa detras de cada uno de los mismos se menciono previamente, solo se
mencionan los desarrollos nuevos cuando sean relevantes. En todo caso, los codigos
de las funciones usadas se presentan en el Apendice A. En este caso los parametros a
introducir son µ = 1, ∇p/` ∈ {−40,−20, 0, 20, 40}, L = 2.0, U0 = 0 y U1 = 50. De
acuerdo con esto, los elementos a usar se construyen mediante la separacion en intervalos
uniformes del dominio y los nodos de interpolacion se definen como los puntos de Fekete
o ceros de Lobatto. Una vez se definen los nodos, se utiliza la matriz de conectividad
para almacenar de manera ordenada la numeracion local y global de los mismos.
Figura 4.2: Distribucion de los elementos y los nodos de interpolacion correspondi-entes a la malla (2,4,6,5,3,1)
En este caso, la funcion de entrada corresponde a la constante definida por el gradiente
de presion indicado, asi que es necesario calcular tanto la matriz de difusion como la
de masa. Para la generacion de estas matrices, se utilizan las matrices adimensionales
definidas anteriormente:
Θij =
∫ 1
−1ψi(ξ)ψj(ξ)dξ Ψij =
∫ 1
−1
dψidξ
dψjdξ
dξ
Capıtulo 4. Implementacion 1D 46
y se aplica la cuadratura de Lobatto para la construccion de dichas matrices, con lo que
se obtienen los siguientes resultados:
Θ =
Np+1∑p=1
mipmjpwp Ψij =
Np+1∑p=1
dipdjpwp
Figura 4.3: Diagrama de esparcidad en la matriz del problema
Teniendo esto, basta aplicar un esquema de solucion razonable para el tipo de matriz
obtenida. Como el sistema es pequeno, en este caso se utiliza el solucionador por defecto
del modulo scipy.linalg. Dado que los valores para el primer y ultimo nodo son
conocidos, se omiten los valores correspondientes (haciendo la matriz no singular). La
grafica correspondiente se presenta en la Figura 4.4. En la misma se presenta tambien
la grafica de la solucion analıtica, donde la diferencia se debe al elemento lineal usado
en uno de los extremos.
4.3 Comparacion de resultados
Como en este caso la solucion analıtica corresponde a la parabola definida por Ecuacion 4.3,
se puede observar que incluso para un numero bastante reducido de elementos que pueden
tener ordenes bajos la solucion es practicamente exacta. De hecho, como el orden de
esta funcion es cuadratico, distribuciones de elementos cuadraticos alcanzan a capturar
Capıtulo 4. Implementacion 1D 47
Figura 4.4: Soluciones obtenidas para el flujo bajo distintos gradientes de presion
NE \NP 1 2 3 4 5 6
1 25.00 6.25 1.19e− 13 2.03e− 13 4.09e− 13 3.34e− 132 25.00 1.96e− 13 2.74e− 13 2.88e− 13 1.17e− 12 3.38e− 133 25.00 5.04e− 13 4.64e− 13 4.69e− 13 1.22e− 12 5.90e− 134 25.00 9.41e− 13 6.86e− 13 6.54e− 13 1.62e− 12 8.17e− 135 25.00 1.40e− 12 9.84e− 12 1.15e− 12 1.99e− 12 8.95e− 136 25.00 1.95e− 12 1.43e− 12 1.53e− 12 2.45e− 12 1.20e− 127 25.00 2.61e− 12 1.97e− 12 1.95e− 12 2.93e− 12 2.29e− 128 25.00 3.50e− 12 2.25e− 12 2.43e− 12 3.36e− 12 2.98e− 129 25.00 4.44e− 12 2.91e− 12 3.09e− 12 4.22e− 12 3.16e− 12
Tabla 4.1: Errores medidos para distintas mallas
relativamente bien esta solucion al utilizar splines cubicas. La Tabla 4.1 presenta los
errores para distintas mallas, refinando tanto el numero de elementos como sus ordenes.
Capıtulo 5
Implementacion en 2D
5.1 Flujo con una cavidad rectangular
Figura 5.1: Diagrama representativo del flujo en la cavidad
En el flujo con una cavidad rectangular, el fluido se encuentra confinado en una region
rectangular de dimensiones L × W donde el movimiento se debe al desplazamiento
transversal de una de las caras. En este sentido, la velocidad de la cara superior es
de U0 y el de las demas interfaces es de 0. De acuerdo con esto, se tienen las siguientes
consideraciones:
• El flujo se presenta unicamente en las direcciones x y y (w = 0).
• El flujo no depende de la coordenada z ( ∂∂z = 0).
• El fluido se encuentra en estado estacionario ( ∂∂t = 0).
48
Capıtulo 5. Implementacion 2D 49
• No hay fuerzas externas afectando el flujo (fx = fy = fz = 0).
De aquı, las ecuaciones de continuidad y de Navier-Stokes se reducen a:
∂ρ
∂t+∇ · (ρ~u) = 0 → ∂u
∂x+∂v
∂y= 0 (5.1)
ρ
(∂~u
∂t+ ~u · ∇~u
)= ρ~f −∇p+ µ∇2~u →
ρ(u∂u∂x + v ∂u∂y
)= − ∂p
∂x + µ(∂2u∂x2
+ ∂2u∂y2
)ρ(u ∂v∂x + v ∂v∂y
)= −∂p
∂v + µ(∂2v∂x2
+ ∂2v∂y2
)(5.2)
Se puede ver entonces que la ecuacion resultante es un caso particular del problema de
conveccion-difusion estable:
∂f
∂t+ ~u · ∇f = k∇2f +
s
ρcp
Donde ∂f∂t = 0, k = µ
ρ = ν, y scp
= −∂p∂∗ para f = u, ∗ = x y f = v, ∗ = y, y las
condiciones de frontera corresponden a valores conocidos (tipo Dirichlet).
5.2 Solucion por elementos espectrales
Ahora, para aplicar el metodo de elementos espectrales, es necesario realizar los sigu-
ientes pasos:
• Introduccion de la informacion del problema
• Definicion de los elementos a usar (cantidad NE y distribucion, ası como sus
ordenes NP (i))
– Seleccion de los nodos de interpolacion a usar
– Generacion de la matriz de conectividad
• Generacion de la matriz del problema
– Generacion de la matriz de difusion
∗ Calculo de las funciones de interpolacion
∗ Calculo de las derivadas de las funciones de interpolacion
∗ Calculo de la funcion de transformacion y sus derivadas
Capıtulo 5. Implementacion 2D 50
∗ Calculo de los gradientes de las funciones de interpolacion
∗ Calculo del factor de correccion (cambio de base) hs
– Generacion de las matrices de presion
– Generacion del vector b
∗ Implementacion de las condiciones de frontera
• Solucion del sistema resultante
• Grafica de la solucion obtenida
Se define primero el numero de elementos y su distribucion, ası como los ordenes de cada
uno de los mismos. Conociendo el numero de elementos y su distribucion, es posible
generar los nodos correspondientes a los vertices de cada elemento. En el caso cuadri-
lateral, se utilizan los nodos de interpolacion de Lobatto, mientras que en el triangular
se usan los de Fekete. Una vez se definen los nodos, nuevamente se utiliza la matriz de
conectividad para almacenar de manera ordenada la numeracion local y global de los
mismos.
Figura 5.2: Distribucion de los elementos y los nodos de interpolacion correspondi-entes a la malla con 8 elementos en cada direccion y orden 2 en cada coordenada
Para la generacion de la matriz del problema es necesario definir las matrices de difusion,
masa y adveccion por cada elemento, las cuales no se puede expresar adimensionalmente.
A(`)ij =
∫∫E`
∇ψ(`)i ·∇ψ
(`)j dxdy B
(`)ij =
∫∫E`
ψ(`)i ψ
(`)j dxdy C
(`)ij =
∫∫E`
ψ(`)i ~u·∇ψ(`)
j dxdy
Capıtulo 5. Implementacion 2D 51
En el caso cuadrilateral, estas integrales se obtienen utilizando la cuadratura de Lobatto
sobre cada una de las dimensiones, ya que las funciones de interpolacion son bilineales
y se escriben de la forma:
ψi(ξ, η) = Li(ξ)Wi(η)
donde Li(ξ) y Wi(η) son las funciones de interpolacion (unidimensionales) correspondi-
entes. Por simplicidad, se trabaja sobre el elemento estandar con coordenadas
(−1,−1), (1,−1), (−1, 1) y (1, 1)
y se alude a un cambio de coordenadas. Comenzamos con la matriz que define el sistema
de ecuaciones, o la matriz de difusion. Dado que esta depende de los gradientes de las
funciones de interpolacion, es necesario realizar todos los pasos de construccion de los
terminos como sigue.
En este caso, debido al orden variable del metodo aplicado, se generan las funciones de
interpolacion a partir de los polinomios de interpolacion de Lagrange. Para simplificar
la notacion se considera la biyeccion: {0, 1, . . . , Np} → {0, . . . ,m} × {0, . . . , n} definida
por i 7→ (j, k)
ψi(ξ, η) = ψ(j,k)(ξ, η) = Lj(ξ)Wk(η) =
m∏l 6=j
ξ − ξlξj − ξl
n∏l 6=k
η − ηlηk − ηl
De acuerdo con esta descripcion, se tiene entonces que las derivadas con respecto a ξ y
η son entonces:
∂ψ(j,k)(ξ, η)
∂ξ= ψ(j,k)(ξ, η)
m∑l 6=j
1
ξ − ξl=
m∑l 6=j
1
ξj − ξl
m∏p 6=j,l
ξ − ξpξj − ξp
n∏l 6=k
η − ηlηk − ηl
(5.3)
∂ψ(j,k)(ξ, η)
∂η= ψ(j,k)(ξ, η)
m∑l 6=k
1
η − ηl=
n∏l 6=j
ξ − ξlξj − ξl
m∑l 6=k
1
ηk − ηl
m∏p6=k,l
η − ηpηk − ηp
(5.4)
De este modo, la funcion de transformacion de coordenadas corresponde a:
~x =
Np−1∑i=0
~xEi ψi(ξ, η) =
Np−1∑i=0
~xEi ψ(j,k)(ξ, η) =
Np−1∑i=0
~xEi Lj(ξ)Wk(η)
Capıtulo 5. Implementacion 2D 52
y por lo tanto sus derivadas son:
∂x
∂ξ=
Np−1∑i=0
xEi∂ψ(j,k)(ξ, η)
∂ξ
∂x
∂η=
Np−1∑i=0
xEi∂ψ(j,k)(ξ, η)
∂η(5.5)
∂y
∂ξ=
Np−1∑i=0
yEi∂ψ(j,k)(ξ, η)
∂ξ
∂y
∂η=
Np−1∑i=0
yEi∂ψ(j,k)(ξ, η)
∂η(5.6)
Ya con estos valores, es posible soluciones los gradientes de las funciones solucionando
los sistemas: (∂x∂ξ
∂y∂ξ
∂x∂η
∂y∂η
)∇ψi =
(∂ψi
∂ξ
∂ψi
∂ξ
)
De manera que el coeficiente de cambio de coordenadas corresponde a:
Det[J ] =
∣∣∣∣∣∂x∂ξ ∂x∂η
∂y∂ξ
∂y∂η
∣∣∣∣∣ =∂x
∂ξ
∂y
∂η− ∂x
∂η
∂y
∂ξ
Ahora bien, como tampoco se conocen los valores de presion, es necesario incorporarlas
tambien como incognitas. Para ello se calculan los vectores:
D(`)i =
∫∫E`
∇ψ(`)i dxdy
Figura 5.3: Diagrama de esparcidad en la matriz del sistema
Para el otro lado de la ecuacion se implementa la funcion de entrada. Para esto se
recorre sobre todos los elementos y se van calculando los valores para la funcion de
Capıtulo 5. Implementacion 2D 53
manera correspondiente. Estos valores se acomodan al sistema global aprovechando la
matriz de conectividad. Ası mismo, es necesario modificar la matriz global de manera
que se incorporen las condiciones de frontera de Dirichlet. Teniendo ya construidos los
componentes del sistema a resolver, basta aplicar un esquema de solucion razonable para
el tipo de matriz obtenida. En este caso se utiliza el solucionador por defecto del modulo
linalg. Dado que la matriz construida inicialmente es singular, se omiten los valores de
la primera fila y columna - que corresponden a un nodo de frontera del que ya se conoce
la velocidad. Esto permite que la matriz obtenida sea invertible.
Una vez resuelto el sistema, es posible visualizar el resultado obtenido por medio de
graficas para el campo de velocidades, y el de presiones.
Figura 5.4: Solucion obtenida para el flujo en la cavidad con la malla construida
Para el caso XY, la unica diferencia esta en el patron de esparcidad (y el tiempo de
solucion) que se presentan en la Figura 5.6
Por su parte, la solucion triangular no se puede presentar con el respectivo mapa de
color debido a la necesidad de un dominio rectangular para los mismos. En todo caso,
las soluciones son similares y es importante notar que hay diferencias en cuanto a las
presiones reportadas debido a que se trabaja unicamente con sus gradientes y por lo
tanto se definen unicamente salvo una constante.
Capıtulo 5. Implementacion 2D 54
Figura 5.5: Solucion obtenida para el campo de presiones en la cavidad con la mallaconstruida
Figura 5.6: Diagrama de esparcidad en la matriz del sistema para el caso YX
5.3 Comparacion de resultados
Al variar la nomenclatura de nodos se observan tiempos de solucion diferentes pero la
misma solucion global, como se observo en el Capıtulo 3. En todos los casos la solucion
Capıtulo 5. Implementacion 2D 55
Figura 5.7: Malla usada en el sistema
Figura 5.8: Diagrama de esparcidad en la matriz del sistema triangular
obtenida es consistente con las soluciones experimentales y con la solucion de elementos
finitos (tomada de [3]) realizada en MATLAB.
Capıtulo 5. Implementacion 2D 56
Figura 5.9: Solucion obtenida para el flujo en la cavidad con la malla triangular
Figura 5.10: Solucion obtenida para el campo de presiones en la cavidad con la mallatriangular
Capıtulo 5. Implementacion 2D 57
Figura 5.11: Visualizacion reologica para el flujo en la cavidad (Tomado de [17])
Figura 5.12: Solucion obtenida para el flujo en la cavidad en elementos finitos (Im-plementacion de [3])
Capıtulo 6
Conclusiones
De acuerdo con lo observado desde el ambito teorico, los metodos de elementos espec-
trales no son mucho mas complicados que los espectrales o los de elementos finitos. En
particular, se pudo verificar que el metodo comparte las bondades de sus antecesores
como la posibilidad de trabajar en subdominios definidos de distintas manera, ası como
la convergencia espectral. Mas aun, fue posible comparar el rendimiento de distintos
tipos de numeraciones de los nodos para obtener diferencias notables en las distintas
partes, pero un tiempo similar en la solucion global del sistema.
Si bien el resultado es una serie de modulos y una infraestructura que permite trabajar
comodamente con el metodo en el caso lineal, queda pendiente extender el mismo a casos
mas generales. Puntualmente, hasta el momento faltarıa extender el solucionador a casos
mas generales en los cuales no se forcen las simplificaciones indicadas en el Capıtulo 2.
6.1 Comentarios finales
Se obtuvieron resultados consistentes con lo esperado en cuanto al rendimiento de los
metodos analizados. Puntualmente, en el caso 2D se rescata un mejor rendimiento (en
cuanto a la precision de la solucion) cuando se va refinando la malla y para las numera-
ciones XY y YX debido a la frontegra diagonal entre elementos que altera levemente el
resultado esperado. Cabe mencionar tambien que unicamente se trabajo con geometrias
sencillas y condiciones de frontera de Dirichlet sin la inclusion de los terminos no lineales,
por lo que serıa de interes continuar observando como trabaja el metodo en estas otras
configuraciones.
58
Apendice A
Funciones Utilizadas
A.1 Implementacion 1D
En este apartado se presentan las funciones utilizadas, que se implementaron en elmodulo sem1D.
import numpy as np
#=================================================
# Funciones traducidas y adaptadas de FSELIB
# http://dehesa.freeshell.org/FSELIB/
#=================================================
def lobatto(i=6):
#=================================================
# Zeros of the ith-degree Lobatto polynomial
#
# This table contains values for i = 1, 2, ..., 6
# The default value is i=6
#=================================================
if(i>6):
print(’Data is not available; Will take i=6’)
i=6
Z = np.zeros(i)
if(i==1):
Z[0] = 0.0
elif(i==2):
Z[0] = -1.0/np.sqrt(5.0)
Z[1] = -Z[0]
elif(i==3):
Z[0] = -np.sqrt(3.0/7.0)
Z[1] = 0.0
Z[2] = -Z[0]
59
Appendix A. Funciones Utilizadas 60
elif(i==4):
Z[0] = -0.76505532392946
Z[1] = -0.28523151648064
Z[2] = -Z[1]
Z[3] = -Z[0]
elif(i==5):
Z[0] = -0.83022389627857
Z[1] = -0.46884879347071
Z[2] = 0.0
Z[3] = -Z[1]
Z[4] = -Z[0]
elif(i==6):
Z[0] = -0.87174014850961
Z[1] = -0.59170018143314
Z[2] = -0.20929921790248
Z[3] = -Z[2]
Z[4] = -Z[1]
Z[5] = -Z[0]
return Z
def emm(N=6):
#================================================
# dimensionless element mass matrix for
# Nth-order polynomial expansion
#
# values are given for: N in 1 - 6
#================================================
if(N==1):
elm_mm = np.array([
[2/3, 1/3],
[1/3, 2/3]])
elif(N==2):
elm_mm = np.array([
[0.26666666666667, 0.13333333333333, -0.06666666666667],
[0.13333333333333, 1.06666666666667, 0.13333333333333],
[-0.06666666666667, 0.13333333333333, 0.26666666666667]])
elif(N==3):
elm_mm = np.array([
[0.14285714285714, 0.05323971374999, -0.05323971374999, 0.02380952380952],
[0.05323971375000, 0.71428571428571, 0.11904761904762, -0.05323971374999],
[-0.05323971374999, 0.11904761904762, 0.71428571428571, 0.05323971375000],
[0.02380952380952, -0.05323971374999, 0.05323971375000, 0.14285714285714]])
elif(N==4):
elm_mm = np.array([
[0.08888888888889, 0.02592592592592, -0.02962962962963, 0.02592592592593,
-0.01111111111111],
[0.02592592592592, 0.48395061728395, 0.06913580246913, -0.06049382716049,
0.02592592592593],
[-0.02962962962963, 0.06913580246913, 0.63209876543211, 0.06913580246913,
-0.02962962962963],
[0.02592592592593, -0.06049382716049, 0.06913580246913, 0.48395061728395,
0.02592592592592],
[-0.01111111111111, 0.02592592592593, -0.02962962962963, 0.02592592592592,
Appendix A. Funciones Utilizadas 61
0.08888888888889]])
elif(N==5):
elm_mm = np.array([
[0.06060606060606, 0.01444043443670, -0.01748448154180, 0.01748448154179,
-0.01444043443670, 0.00606060606061],
[0.01444043443670, 0.34406814208894, 0.04165977904505, -0.04165977904505,
0.03440681420889, -0.01444043443670],
[-0.01748448154180, 0.04165977904505, 0.50441670639590, 0.05044167063958,
-0.04165977904505, 0.01748448154179],
[0.01748448154179, -0.04165977904505, 0.05044167063958, 0.50441670639590,
0.04165977904505, -0.01748448154180],
[-0.01444043443670, 0.03440681420889, -0.04165977904505, 0.04165977904505,
0.34406814208894, 0.01444043443670],
[0.00606060606061, -0.01444043443670, 0.01748448154179, -0.01748448154180,
0.01444043443670, 0.06060606060606]])
else: # Incorpora los casos en que N >= 6
elm_mm = np.array([
[0.04395604395604, 0.00883182542984, -0.01102962762764, 0.01172161172161,
-0.01102962762764, 0.00883182542984, -0.00366300366300],
[0.00883182542984, 0.25553173602605, 0.02659340659341, -0.02826184137547,
0.02659340659341, -0.02129431133550, 0.00883182542984],
[-0.01102962762764, 0.02659340659341, 0.39853419803987, 0.03529480840844,
-0.03321118316999, 0.02659340659341, -0.01102962762764],
[0.01172161172161, -0.02826184137547, 0.03529480840844, 0.45010989010988,
0.03529480840844, -0.02826184137547, 0.01172161172161],
[-0.01102962762764, 0.02659340659341, -0.03321118316999, 0.03529480840844,
0.39853419803987, 0.02659340659341, -0.01102962762764],
[0.00883182542984, -0.02129431133550, 0.02659340659341, -0.02826184137547,
0.02659340659341, 0.25553173602605, 0.00883182542984],
[-0.00366300366300, 0.00883182542984, -0.01102962762764, 0.01172161172161,
-0.01102962762764, 0.00883182542984, 0.04395604395604]])
return elm_mm
def edm(N=6):
#=======================================
# spectral element diffusion matrix for
# an Nth-order polynomial expansion.
#
# N in 1 - 6
#=======================================
if(N==1):
elm_dm = np.array([[0.5, -0.5],[-0.5, 0.5]])
elif(N==2):
elm_dm = np.array([
[1.16666666666667, -1.33333333333333, 0.16666666666667],
[-1.33333333333333, 2.66666666666667, -1.33333333333333],
[0.16666666666667, -1.33333333333333, 1.16666666666667]])
elif(N==3):
elm_dm = np.array([
[2.16666666666667, -2.43920915260403, 0.35587581927070, -0.08333333333333],
[-2.43920915260403, 4.16666666666667, -2.08333333333333, 0.35587581927070],
[0.35587581927070, -2.08333333333333, 4.16666666666667, -2.43920915260404],
[-0.08333333333333, 0.35587581927070, -2.43920915260404, 2.16666666666667]])
Appendix A. Funciones Utilizadas 62
elif(N==4):
elm_dm = np.array([
[3.50000000000000, -3.91288507544030, 0.53333333333333, -0.17044825789303,
0.05000000000000],
[-3.91288507544030, 6.35185185185185, -2.90370370370371, 0.63518518518519,
-0.17044825789303],
[0.53333333333333, -2.90370370370371, 4.74074074074074, -2.90370370370371,
0.53333333333333],
[-0.17044825789303, 0.63518518518519, -2.90370370370371, 6.35185185185185,
-3.91288507544030],
[0.05000000000000, -0.17044825789303, 0.53333333333333, -3.91288507544030,
3.50000000000000]])
elif(N==5):
elm_dm = np.array([
[5.16666666666647, -5.75534978755293, 0.75291274743628, -0.23286955119427,
0.10197325797781, -0.03333333333336],
[-5.75534978755293, 9.12668826478755, -3.98085223985198, 0.83085223985201,
-0.32331173521247, 0.10197325797781],
[0.75291274743628, -3.98085223985198, 6.03997840187932, -3.41002159812136,
0.83085223985201, -0.23286955119427],
[-0.23286955119427, 0.83085223985201, -3.41002159812136, 6.03997840187932,
-3.98085223985198, 0.75291274743628],
[0.10197325797781, -0.32331173521247, 0.83085223985201, -3.98085223985198,
9.12668826478755, -5.75534978755293],
[-0.03333333333336, 0.10197325797781, -0.23286955119427, 0.75291274743628,
-5.75534978755293, 5.16666666666647]])
else: # Incorpora los casos en que N >= 6
elm_dm = np.array([
[7.16666666666692, -7.96655757431697, 1.01647769632621, -0.30476190476184,
0.13291684274811, -0.06855125047193, 0.02380952380950],
[-7.96655757431697, 12.47251984118633, -5.29457208031436, 1.06606416109113,
-0.40971363397094, 0.20081053679675, -0.06855125047193],
[1.01647769632621, -5.29457208031436, 7.74748015881332, -4.17463558966276,
0.98204660606043, -0.40971363397094, 0.13291684274811],
[-0.30476190476184, 1.06606416109113, -4.17463558966276, 6.82666666666694,
-4.17463558966276, 1.06606416109113, -0.30476190476184],
[0.13291684274811, -0.40971363397094, 0.98204660606043, -4.17463558966276,
7.74748015881332, -5.29457208031436, 1.01647769632621],
[-0.06855125047193, 0.20081053679675, -0.40971363397094, 1.06606416109113,
-5.29457208031436, 12.47251984118632, -7.96655757431697],
[0.02380952380950, -0.06855125047193, 0.13291684274811, -0.30476190476184,
1.01647769632621, -7.96655757431697, 7.16666666666691]])
return elm_dm
#=================================================
# Funciones nuevas implementadas
#=================================================
def genNodes(Ne,Np,xe):
#=================================================
# Genera los nodos de interpolacion segun el
# numero de elementos y sus ordenes. Esta es la
# numeracion local de los nodos: (l,i)
#
# Ne = Np.size
# max(Np) < 6
#=================================================
Appendix A. Funciones Utilizadas 63
if(Ne != Np.size):
raise NameError(’La cantidad de elementos no coincide con el orden’)
xint = np.zeros((Ne,max(Np)+1))
for l in range(Ne):
mid = 0.5 * (xe[l+1]+xe[l])
dis = 0.5 * (xe[l+1]-xe[l])
xint[l,0] = xe[l]
vals = lobatto(Np[l]-1)
xint[l,1:Np[l]] = mid + vals*dis
xint[l,Np[l]] = xe[l+1]
return xint
def genConn(Ne,Np,xint):
#=================================================
# Genera los vectores de numeracion global y la
# matriz de conectividad
#
# max(Np) < 6
#=================================================
xglob = np.zeros(np.sum(Np)+1)
C = np.zeros((Ne,max(Np)+1),int)
# Contador Global
cont = 0
for l in range(Ne):
C[l,0:Np[l]+1] = np.arange(cont,cont+Np[l]+1)
xglob[cont:cont+Np[l]+1] = xint[l,0:Np[l]+1]
cont+=Np[l]
return xglob, C
def matDiff(Ne,Np,xe,xglob,C,U0,U1,mu=1,s=lambda x: 0):
#=================================================
# Genera la matriz de difusion/rigidez y el vector
# del lado derecho del sistema sujeto a condicio-
# nes de Dirichlet en ambos extremos
#
# max(Np) < 6
#=================================================
Ng = xglob.size
Mat_dif = np.zeros((Ng,Ng))
vec_b = np.zeros(Ng)
s = np.vectorize(s)
for l in range(Ne):
N = Np[l]
h = xe[l+1]-xe[l]
elm_mm = 0.5*h*emm(N)
elm_dm = 2.0*edm(N)/h
Mat_dif[C[l,0]:C[l,N]+1,C[l,0]:C[l,N]+1] += elm_dm
vec_b[C[l,0:N+1]] += np.dot(elm_mm,s(xglob[C[l,0:N+1]]))/mu
# Implementa las condiciones de frontera de Dirichlet
Appendix A. Funciones Utilizadas 64
# Extremo derecho
# los valores de N, h y elm_dm ya corresponden a los del ultimo nodo
vec_b[C[Ne-1,0:N+1]] -= elm_dm[0:N+1,N]*U1
# Extremo izquierdo
N = Np[0]
h = xe[1]-xe[0]
elm_dm = 2.0*edm(Np[0])/h
vec_b[C[0,0:N+1]] -= elm_dm[0:N+1,0]*U0
return Mat_dif, vec_b
A.2 Implementacion 2D
En este apartado se presentan las funciones utilizadas, que se implementaron en el
modulo sem2D.
import numpy as np # Ofrece funciones para operaciones basicas con arreglos
import scipy.linalg as lin # Ofrece funciones para operaciones de algebra lineal
#=================================================
# Funciones traducidas y adaptadas de FSELIB
# http://dehesa.freeshell.org/FSELIB/
#=================================================
def lobatto(i=6):
#=================================================
# Zeros of the ith-degree Lobatto polynomial
#
# This table contains values for i = 1, 2, ..., 6
# The default value is i=6
#=================================================
if(i>6):
print(’Data is not available; Will take i=6’)
i=6
Z = np.zeros(i)
if(i==1):
Z[0] = 0.0
elif(i==2):
Z[0] = -1.0/np.sqrt(5.0)
Z[1] = -Z[0]
elif(i==3):
Z[0] = -np.sqrt(3.0/7.0)
Z[1] = 0.0
Z[2] = -Z[0]
elif(i==4):
Z[0] = -0.76505532392946
Z[1] = -0.28523151648064
Appendix A. Funciones Utilizadas 65
Z[2] = -Z[1]
Z[3] = -Z[0]
elif(i==5):
Z[0] = -0.83022389627857
Z[1] = -0.46884879347071
Z[2] = 0.0
Z[3] = -Z[1]
Z[4] = -Z[0]
elif(i==6):
Z[0] = -0.87174014850961
Z[1] = -0.59170018143314
Z[2] = -0.20929921790248
Z[3] = -Z[2]
Z[4] = -Z[1]
Z[5] = -Z[0]
return Z
def qlobatto(i=6,r=’b’):
#=================================================
# Zeros of the completed ith-degree Lobatto
# polynomial, and corresponding weights for the
# Lobatto integration quadrature
#
# This table contains values for i = 1, 2, ..., 6
# The default value is i=6
#=================================================
if(i>6):
print(’Data is not available; Will take i=6’)
i=6
Z = np.zeros(i+2)
W = np.zeros(i+2)
Z[0] = -1.0
Z[-1] = -Z[0]
W[0] = 2.0/((i+1)*(i+2))
W[-1] = W[0]
if(i==1):
Z[1] = 0.0
W[1] = 4.0/3.0
elif(i==2):
Z[1] = -1.0/np.sqrt(5.0)
Z[2] = -Z[1]
W[1] = 5.0/6.0
W[2] = W[1]
elif(i==3):
Z[1] = -np.sqrt(3.0/7.0)
Z[2] = 0.0
Z[3] = -Z[1]
W[1] = 49.0/90.0
W[2] = 32.0/45.0
W[3] = W[1]
elif(i==4):
Appendix A. Funciones Utilizadas 66
Z[1] = -0.76505532392946
Z[2] = -0.28523151648064
Z[3] = -Z[2]
Z[4] = -Z[1]
W[1] = 0.37847495629785
W[2] = 0.55485837703549
W[3] = W[2]
W[4] = W[1]
elif(i==5):
Z[1] = -0.83022389627857
Z[2] = -0.46884879347071
Z[3] = 0.0
Z[4] = -Z[2]
Z[5] = -Z[1]
W[1] = 0.27682604736157
W[2] = 0.43174538120986
W[3] = 0.48761904761905
W[4] = W[2]
W[5] = W[1]
elif(i==6):
Z[1] = - 0.87174014850961
Z[2] = - 0.59170018143314
Z[3] = - 0.20929921790248
Z[4] = -Z[3]
Z[5] = -Z[2]
Z[6] = -Z[1]
W[1] = 0.21070422714350
W[2] = 0.34112269248350
W[3] = 0.41245879465870
W[4] = W[3]
W[5] = W[2]
W[6] = W[1]
if(r==’z’):
return Z
elif(r==’w’):
return W
else:
return Z, W
def gaussTri(m):
#================================================
# Abscissas (xi, eta) and weights (w)
# for Gaussian integration over a flat triangle
# in the xi-eta plane
#
# Integration is performed with respect
# to the triangle barycentric coordinates
#
# SYMBOLS:
# -------
#
# m: order of the quadrature
# choose from 1,3,4,6,7,9,12,13
# Default value is 7
#================================================
#------------------------
Appendix A. Funciones Utilizadas 67
# Checks for valid values
#------------------------
if((m != 1) and (m != 3) and (m != 4) and (m != 6) and (m != 7)
and (m != 9) and (m != 12) and (m != 13)):
m = 7
if(m==1):
xi = np.array([1.0/3.0])
eta = np.array([1.0/3.0])
w = np.array([1.0])
elif(m==3):
xi = np.array([1.0/6.0, 2.0/3.0, 1.0/6.0])
eta = np.array([1.0/6.0, 1.0/6.0, 2.0/3.0])
w = np.array([1.0/3.0, 1.0/3.0, 1.0/3.0])
elif(m==4):
xi = np.array([1.0/3.0, 1.0/5.0, 3.0/5.0, 1.0/5.0])
eta = np.array([1.0/3.0, 1.0/5.0, 1.0/5.0, 3.0/5.0])
w = np.array([-27.0/48.0, 25.0/48.0, 25.0/48.0, 25.0/48.0])
elif(m==6):
al = 0.816847572980459
be = 0.445948490915965
ga = 0.108103018168070
de = 0.091576213509771
o1 = 0.109951743655322
o2 = 0.223381589678011
xi = np.array([de, al, de, be, ga, be])
eta = np.array([de, de, al, be, be, ga])
w = np.array([o1, o1, o1, o2, o2, o2])
elif(m==7):
al = 0.797426958353087
be = 0.470142064105115
ga = 0.059715871789770
de = 0.101286507323456
o1 = 0.125939180544827
o2 = 0.132394152788506
xi = np.array([de, al, de, be, ga, be, 1.0/3.0])
eta = np.array([de, de, al, be, be, ga, 1.0/3.0])
w = np.array([o1, o1, o1, o2, o2, o2, 0.225])
elif(m==9):
al = 0.124949503233232
qa = 0.165409927389841
rh = 0.797112651860071
de = 0.437525248383384
ru = 0.037477420750088
o1 = 0.205950504760887
o2 = 0.063691414286223
xi = np.array([de, al, de, qa, ru, rh, qa, ru, rh])
eta = np.array([de, de, al, ru, qa, qa, rh, rh, ru])
w = np.array([o1, o1, o1, o2, o2, o2, o2, o2, o2])
elif(m==12):
al = 0.873821971016996
be = 0.249286745170910
ga = 0.501426509658179
de = 0.063089014491502
rh = 0.636502499121399
Appendix A. Funciones Utilizadas 68
qa = 0.310352451033785
ru = 0.053145049844816
o1 = 0.050844906370207
o2 = 0.116786275726379
o3 = 0.082851075618374
xi = np.array([de, al, de, be, ga, be, qa, ru, rh, qa, ru, rh])
eta = np.array([de, de, al, be, be, ga, ru, qa, qa, rh, rh, ru])
w = np.array([o1, o1, o1, o2, o2, o2, o3, o3, o3, o3, o3, o3])
elif(m==13):
al = 0.479308067841923
be = 0.065130102902216
ga = 0.869739794195568
de = 0.260345966079038
rh = 0.638444188569809
qa = 0.312865496004875
ru = 0.048690315425316
o1 = 0.175615257433204
o2 = 0.053347235608839
o3 = 0.077113760890257
o4 =-0.149570044467670
xi = np.array([de, al, de, be, ga, be, qa, ru, rh, qa, ru, rh, 1.0/3.0])
eta = np.array([de, de, al, be, be, ga, ru, qa, qa, rh, rh, ru, 1.0/3.0])
w = np.array([o1, o1, o1, o2, o2, o2, o3, o3, o3, o3, o3, o3, o4])
return xi, eta, w
#=================================================
# Funciones nuevas implementadas
#=================================================
def proriol(k,l,xi,eta):
#=================================================
# Evalua los polinomios de Proriol usando las
# formas precalculadas
#
# Admite polinomios de orden hasta 3: k+l < 4
#=================================================
if(k==0 and l==0):
val = 1
elif(k==1 and l==0):
val = 2*xi+eta -1
elif(k==0 and l==1):
val = 3*eta -1
elif(k==2 and l==0):
val = 6*xi**2+6*xi*eta+eta**2 -6*xi-2*eta +1
elif(k==1 and l==1):
val = (2*xi+eta -1)*(5*eta -1)
elif(k==0 and l==2):
val = 10*eta**2 -8*eta +1
elif(k==3 and l==0):
val = (2*xi+eta -1)*(10*xi**2+10*xi*eta+eta**2 -10*xi-2*eta +1)
elif(k==2 and l==1):
val = (6*xi**2+6*xi*eta+eta**2 -6*xi-2*eta +1)*(7*eta-1)
elif(k==1 and l==2):
val = (2*xi+eta -1)*(21*eta**2 -12*eta +1)
elif(k==0 and l==3):
val = 35*eta**3 -45*eta**2 +15*eta -1
else:
raise NameError(’La cantidad de elementos no coincide con el orden’)
Appendix A. Funciones Utilizadas 69
return val
def dproriol(k,l,xi,eta,var=’xi’):
#=================================================
# Evalua las derivadas de los polinomios de
# Proriol usando las formas precalculadas
#
# Admite polinomios de orden hasta 3: k+l < 4
#=================================================
if(var==’xi’):
if(k==0 and l==0):
val = 0
elif(k==1 and l==0):
val = 2
elif(k==0 and l==1):
val = 0
elif(k==2 and l==0):
val = 12*xi+6*eta-6
elif(k==1 and l==1):
val = 2*(5*eta -1)
elif(k==0 and l==2):
val = 0
elif(k==3 and l==0):
val = 2*(10*xi**2+10*xi*eta+eta**2 -10*xi-2*eta +1)+(2*xi+eta -1)*(20*xi+10*eta-10)
elif(k==2 and l==1):
val = (12*xi+6*eta-6)*(7*eta-1)
elif(k==1 and l==2):
val = 2*(21*eta**2 -12*eta +1)
elif(k==0 and l==3):
val = 0
else:
raise NameError(’La cantidad de elementos no coincide con el orden’)
elif(var==’eta’):
if(k==0 and l==0):
val = 0
elif(k==1 and l==0):
val = 1
elif(k==0 and l==1):
val = 3
elif(k==2 and l==0):
val = 6*xi+2*eta-2
elif(k==1 and l==1):
val = (5*eta -1)+(2*xi+eta -1)*5
elif(k==0 and l==2):
val = 20*eta-8
elif(k==3 and l==0):
val = (10*xi**2+10*xi*eta+eta**2 -10*xi-2*eta +1)+(2*xi+eta -1)*(10*xi+2*eta-2)
elif(k==2 and l==1):
val = (6*xi+2*eta-2)*(7*eta-1)+(6*xi**2+6*xi*eta+eta**2 -6*xi-2*eta +1)*7
elif(k==1 and l==2):
val = (21*eta**2 -12*eta +1)+(2*xi+eta -1)*(42*eta-12)
elif(k==0 and l==3):
val = 105*eta**2-90*eta +15
else:
raise NameError(’La cantidad de elementos no coincide con el orden’)
else:
raise NameError(’Variable de derivacion invalida’)
return val
def genVDM(m):
Appendix A. Funciones Utilizadas 70
#=================================================
# Evalua la matriz de Vandermonde generalizada, su
# determinante y la matriz de cofactores
#
# Admite polinomios de orden hasta 3: k+l < 4
#=================================================
# Recupera las posiciones estandar de los nodos
npe = (m+1)*(m+2)/2
distr = 0.5+0.5*lobatto(m-1)
xist = np.zeros(npe)
etast = np.zeros(npe)
xist[0:3*m] = np.concatenate([[0],distr,[1],distr[::-1],np.zeros(m)])
etast[0:3*m] = np.concatenate([np.zeros(m+1),distr,[1],distr[::-1]])
if(m==3):
xist[9] = 1./3.
etast[9] = 1./3.
# Inicializa las matrices requeridas para el calculo
Mat_VDM = np.zeros([npe,npe])
Mat_Cof = np.zeros([npe,npe])
Mat_Min = np.zeros([npe-1,npe-1])
prind = np.array([[0,1,0,2,1,0,3,2,1,0],
[0,0,1,0,1,2,0,1,2,3]])
# Construye la matriz de Vandermonde generalizada
for i in range(npe):
for j in range(npe):
k = prind[0,i]
l = prind[1,i]
Mat_VDM[i,j] = proriol(k,l,xist[j],etast[j])
Det_VDM = lin.det(Mat_VDM)
for i in range(npe):
for j in range(npe):
Temp = np.delete(Mat_VDM,i,0)
Mat_Min = np.delete(Temp,j,1)
Mat_Cof[i,j] = (-1)**(i+j)*np.linalg.det(Mat_Min)
return Mat_VDM, Det_VDM, Mat_Cof
def genNodes(Ne,Np,px,py,ordn=’xy’):
#=================================================
# Genera los nodos de interpolacion segun el
# numero de elementos y sus ordenes. Esta es la
# numeracion local de los nodos: (l,i)
#
# Ne = Np.size
# max(Np) < 6
#=================================================
ne = Ne[0]*Ne[1] # Recupera el numero de elementos
npe = (Np[0]+1)*(Np[1]+1) # Recupera el numero de nodos por elemento
x = np.zeros([ne,npe]) # Coordenadas x por elemento
y = np.zeros([ne,npe]) # Coordenadas y por elemento
# Genera los nodos de interpolacion de Lobatto
dx = qlobatto(Np[0]-1,’z’)
dy = qlobatto(Np[1]-1,’z’)
Appendix A. Funciones Utilizadas 71
for l in range(ne):
cx = l % Ne[0]
cy = l / Ne[0]
midx = 0.5 * (px[cx+1]+px[cx])
disx = 0.5 * (px[cx+1]-px[cx])
midy = 0.5 * (py[cy+1]+py[cy])
disy = 0.5 * (py[cy+1]-py[cy])
pxe = midx+disx*dx
pye = midy+disy*dy
(xv,yv) = np.meshgrid(pxe,pye,indexing=ordn)
x[l,:] = xv.reshape(npe)
y[l,:] = yv.reshape(npe)
return x, y, ne, npe
def genNodesTri(Ne,m,px,py):
#=================================================
# Genera los nodos de interpolacion segun el
# numero de elementos y sus ordenes para una malla
# triangular. Esta es la numeracion local de los
# nodos: (l,i)
#
# m < 4
#=================================================
ne = 2*Ne[0]*Ne[1] # Recupera el numero de elementos
npe = (m+1)*(m+2)/2 # Este es el numero de nodos por elemento
x = np.zeros([ne,npe]) # Coordenadas x por elemento
y = np.zeros([ne,npe]) # Coordenadas y por elemento
# Genera los nodos de interpolacion de Lobatto
distr = lobatto(m-1)
for l in range(ne/2): # Desarrolla dos elementos por iteracion
cx = l % Ne[0]
cy = l / Ne[0]
pxe = 0.5 * ((px[cx+1]+px[cx])+(px[cx+1]-px[cx])*distr)
pye = 0.5 * ((py[cy+1]+py[cy])+(py[cy+1]-py[cy])*distr)
# Elemento inferior
x[2*l,0:3*m] = np.concatenate([[px[cx]],pxe,[px[cx+1]],pxe[::-1],
px[cx]*np.ones(m)])
y[2*l,0:3*m] = np.concatenate([py[cy]*np.ones(m+1),
pye,[py[cy+1]],pye[::-1]])
if(m==3):
x[2*l,9] = (2.*px[cx]+px[cx+1])/3.
y[2*l,9] = (2.*py[cy]+py[cy+1])/3.
# Elemento superior
x[2*l+1,0:3*m] = np.concatenate([[px[cx+1]],pxe[::-1],[px[cx]],pxe,
px[cx+1]*np.ones(m)])
y[2*l+1,0:3*m] = np.concatenate([[py[cy]],pye,py[cy+1]*np.ones(m+1),
pye[::-1]])
if(m==3):
x[2*l+1,9] = (2.*px[cx+1]+px[cx])/3.
y[2*l+1,9] = (2.*py[cy+1]+py[cy])/3.
return x, y, ne, npe
Appendix A. Funciones Utilizadas 72
def genConn(Ne,Npm,ne,npe,x,y,L,W,U0,h,tipo=’quad’):
#=================================================
# Genera los vectores de numeracion global, la
# matriz de conectividad y el vector de frontera
#
# max(Np) < 6 (quad) o m < 4 (tri)
#=================================================
# Calcula el numero de nodos globales para definir el tamano de las matrices contenedoras
if(tipo == ’quad’):
ng = ne*npe - ((Ne[0]-1)*(Npm[1]+1)+(Ne[1]-1)*(Npm[0]+1)
+(Ne[0]-1)*(Ne[1]-1)*(sum(Npm)+1))
elif(tipo == ’tri’):
ng = ne*npe - ((ne/2+Ne[0]+Ne[1]-2)*(Npm+1)+(Ne[0]-1)*(Ne[1]-1)*(2*Npm+1))
coords = np.zeros([ng,2]) # Almacena las coordenadas de todos los nodos sin redundancia
C = np.zeros((ne,npe),int) # Matriz de conectividad
gfl = np.zeros([ng,3]) # Indicador de nodos de frontera [indicador, vel. x, vel. y]
# Se introduce manualmente el primer nodo
coords[0,0] = x[0,0]
coords[0,1] = y[0,0]
# C[0,0] = 0 Esta condicion ya se tiene de la inicializacion de C
gfl[0,0] = 1 # Indica un nodo de frontera (el valor de la velocidad es de [0,0])
cont = 1 # Contador global
tol = h*1e-6 # Tolerancia para identificacion de nodos iguales
for l in range(ne):
for k in range(npe):
existe = False
for n in range(cont):
if(np.abs(coords[n,0]-x[l,k])+np.abs(coords[n,1]-y[l,k]) < tol):
existe = True
C[l,k] = n # El nodo (l,m) corresponde al nodo global n
if(not existe): # Registra el nodo si no existe todavia
coords[cont,0] = x[l,k]
coords[cont,1] = y[l,k]
C[l,k] = cont
# Identifica los nodos de frontera y actualiza el indicador
if (L/2.-np.abs(x[l,k]) < tol or W/2.-np.abs(y[l,k]) < tol):
gfl[cont,0] = 1
# Si se encuentra en la frontera superior actualiza la velocidad x
if(W/2.-y[l,k] < tol):
gfl[cont,1] = U0
cont += 1
return coords, C, gfl, ng
def matDiff(Ne,Np,ne,npe,ng,x,y,C,gfl,mu=1):
#=================================================
# Genera la matriz de difusion/rigidez y el vector
# del lado derecho del sistema sujeto a condicio-
# nes de Dirichlet
#
# max(Np) < 6
#=================================================
# Recupera los nodos de interpolacion de Lobatto
dx = qlobatto(Np[0]-1,’z’)
dy = qlobatto(Np[1]-1,’z’)
Appendix A. Funciones Utilizadas 73
(xi,wx) = qlobatto(Np[0],’b’) # Utiliza un orden mayor para tener una integral exacta
(eta,wy) = qlobatto(Np[1],’b’) # Utiliza un orden mayor para tener una integral exacta
NQ = (Np[0]+2)*(Np[1]+2) # Numero de nodos a usar en la cuadratura
(ix,iy) = np.meshgrid(range(Np[0]+2),range(Np[1]+2),indexing=’xy’)
M_ind = np.array([ix.reshape(NQ),iy.reshape(NQ)]).T # Indices para la cuadratura
Mat_dif = np.zeros([2*ng+ne,2*ng+ne]) # Inicializa la matriz de difusion global
for l in range(ne):
elm_dm = np.zeros([npe,npe]) # Inicializa la matriz de difusion elemental
vecD = np.zeros([npe,2])
# Realiza la cuadratura de Gauss
for nq in M_ind:
psi = np.ones(npe) # Almacena las funciones de interpolacion
dpsixi = np.zeros(npe) # Almacena las derivadas con respecto a xi
dpsieta = np.zeros(npe) # Almacena las derivadas con respecto a eta
grpsi = np.zeros([npe,2]) # Almacena los gradientes de las funciones
dxdxi = 0.
dxdeta = 0.
dydxi = 0.
dydeta = 0.
for i in range(npe): #Realiza los calculos sobre cada elemento
divx = i % (Np[0]+1)
divy = i / (Np[0]+1)
# Calcula las funciones de interpolacion
fx = 1
for ind in range(Np[0]+1):
if(ind != divx):
fx *= (xi[nq[0]]-dx[ind])/(dx[divx]-dx[ind])
# print fx,
fy = 1
for ind in range(Np[1]+1):
if(ind != divy):
fy *= (eta[nq[1]]-dy[ind])/(dy[divy]-dy[ind])
psi[i] = fx*fy
# print fy, psi[i]
# Calcula las derivadas con respecto a las dos variables
for ind in range(Np[0]+1):
if(ind != divx):
prod = 1
for ind2 in range(Np[0]+1):
if(ind2 != divx and ind2 != ind):
prod *= (xi[nq[0]]-dx[ind2])/(dx[divx]-dx[ind2])
dpsixi[i] += 1./(dx[divx]-dx[ind])*prod
dpsixi[i] *= fy
for ind in range(Np[1]+1):
if(ind != divy):
prod = 1
for ind2 in range(Np[1]+1):
if(ind2 != divy and ind2 != ind):
prod *= (eta[nq[1]]-dy[ind2])/(dy[divy]-dy[ind2])
dpsieta[i] += 1./(dy[divy]-dy[ind])*prod
dpsieta[i] *= fx
# print dpsixi[i], dpsieta[i]
# Actualiza los valores de las derivadas de la funcion de transformacion
Appendix A. Funciones Utilizadas 74
dxdxi += x[l,i]*dpsixi[i]
dxdeta += x[l,i]*dpsieta[i]
dydxi += y[l,i]*dpsixi[i]
dydeta += y[l,i]*dpsieta[i]
# print dxdxi,dxdeta,dydxi,dydeta
for i in range(npe):
# Calcula el gradiente para cada funcion de interpolacion
grpsi[i,:] = lin.solve(np.array([[dxdxi,dydxi],[dxdeta,dydeta]]),
np.array([dpsixi[i],dpsieta[i]]))
# Calcula el factor de correccion
hs = np.abs(dxdxi*dydeta-dxdeta*dydxi)
# Construye la matriz de difusion elemental
for i in range(npe):
for j in range(npe):
elm_dm[i,j] += np.dot(grpsi[i,:],grpsi[j,:])*(hs*wx[nq[0]]*wy[nq[1]])
# Construye los vectores D
vecD[i,:] += grpsi[i,:]*(hs*wx[nq[0]]*wy[nq[1]])
# Actualiza la matriz de difusion global
Mat_dif[np.meshgrid(C[l,:],C[l,:],indexing=’ij’)] += mu*elm_dm
Mat_dif[np.meshgrid(ng+C[l,:],ng+C[l,:],indexing=’ij’)] += mu*elm_dm
# Extensiones
Mat_dif[C[l,:],2*ng+l] -= vecD[:,0] #incorpora Dx en el bloque B
Mat_dif[ng+C[l,:],2*ng+l] -= vecD[:,1] #incorpora Dy en el bloque B
Mat_dif[2*ng+l,C[l,:]] -= vecD[:,0] #incorpora Dx en el bloque C
Mat_dif[2*ng+l,ng+C[l,:]] -= vecD[:,1] #incorpora Dy en el bloque C
# Construye el vector del lado derecho
vec_b = np.zeros(2*ng+ne)
# Implementa las condiciones de frontera
for ind in range(ng):
if(gfl[ind,0]==1):
# Ajusta las entradas al lado derecho
vec_b -= Mat_dif[:,ind]*gfl[ind,1] + Mat_dif[:,ng+ind]*gfl[ind,2]
# Ajusta el valor de la entrada en b
vec_b[ind] = gfl[ind,1] # Coor. x
vec_b[ng+ind] = gfl[ind,2] # Coor. y
# Ajusta la matriz del problema
Mat_dif[:,ind] = np.zeros(2*ng+ne)
Mat_dif[:,ng+ind] = np.zeros(2*ng+ne)
Mat_dif[ind,:] = np.zeros(2*ng+ne)
Mat_dif[ng+ind,:] = np.zeros(2*ng+ne)
Mat_dif[ind,ind] = 1.
Mat_dif[ng+ind,ng+ind] = 1.
return Mat_dif, vec_b
def matDiffTri(Ne,m,ne,npe,ng,x,y,C,gfl,mu=1):
#=================================================
# Genera la matriz de difusion/rigidez y el vector
# del lado derecho del sistema sujeto a condicio-
# nes de Dirichlet para el caso triangular
#
# m < 4
#=================================================
Appendix A. Funciones Utilizadas 75
# Define los nodos a usar en la cuadratura
NQ = 7 # Numero de nodos a usar en la cuadratura (1,3,4,6,7,9,12,13)
(xiq, etaq, wq) = gaussTri(NQ)
(Mat_VDM, Det_VDM, Mat_Cof) = genVDM(m)
prind = np.array([[0,1,0,2,1,0,3,2,1,0],
[0,0,1,0,1,2,0,1,2,3]])
Mat_dif = np.zeros([2*ng+ne,2*ng+ne]) # Inicializa la matriz de difusion global
for ell in range(ne):
elm_dm = np.zeros([npe,npe]) # Inicializa la matriz de difusion elemental
vecD = np.zeros([npe,2])
# Realiza la cuadratura de Gauss
for nq in range(NQ):
psi = np.ones(npe) # Almacena las funciones de interpolacion
dpsixi = np.zeros(npe) # Almacena las derivadas con respecto a xi
dpsieta = np.zeros(npe) # Almacena las derivadas con respecto a eta
grpsi = np.zeros([npe,2]) # Almacena los gradientes de las funciones
dxdxi = 0.
dxdeta = 0.
dydxi = 0.
dydeta = 0.
for i in range(npe): #Realiza los calculos sobre cada elemento
# Calcula las funciones de interpolacion
vect = np.zeros(npe)
for j in range(npe):
k = prind[0,j]
l = prind[1,j]
vect[j] = proriol(k,l,xiq[nq],etaq[nq])
psi[i] = np.dot(vect,Mat_Cof[:,i])/Det_VDM
# Calcula las derivadas con respecto a las dos variables
vect = np.zeros(npe)
for j in range(npe):
k = prind[0,j]
l = prind[1,j]
vect[j] = dproriol(k,l,xiq[nq],etaq[nq],’xi’)
dpsixi[i] = np.dot(vect,Mat_Cof[:,i])/Det_VDM
vect = np.zeros(npe)
for j in range(npe):
k = prind[0,j]
l = prind[1,j]
vect[j] = dproriol(k,l,xiq[nq],etaq[nq],’eta’)
dpsieta[i] = np.dot(vect,Mat_Cof[:,i])/Det_VDM
# print dpsixi[i], dpsieta[i]
# Actualiza los valores de las derivadas de la funcion de transformacion
dxdxi += x[ell,i]*dpsixi[i]
dxdeta += x[ell,i]*dpsieta[i]
dydxi += y[ell,i]*dpsixi[i]
dydeta += y[ell,i]*dpsieta[i]
# print dxdxi,dxdeta,dydxi,dydeta
for i in range(npe):
# Calcula el gradiente para cada funcion de interpolacion
grpsi[i,:] = lin.solve(np.array([[dxdxi,dydxi],[dxdeta,dydeta]]),
np.array([dpsixi[i],dpsieta[i]]))
# Calcula el factor de correccion
hs = np.abs(dxdxi*dydeta-dxdeta*dydxi)
Appendix A. Funciones Utilizadas 76
# Construye la matriz de difusion elemental
for i in range(npe):
for j in range(npe):
elm_dm[i,j] += np.dot(grpsi[i,:],grpsi[j,:])*(0.5*hs*wq[nq])
# Construye los vectores D
vecD[i,:] += grpsi[i,:]*(0.5*hs*wq[nq])
# Actualiza la matriz de difusion global
Mat_dif[np.meshgrid(C[ell,:],C[ell,:],indexing=’ij’)] += mu*elm_dm
Mat_dif[np.meshgrid(ng+C[ell,:],ng+C[ell,:],indexing=’ij’)] += mu*elm_dm
# Extensiones
Mat_dif[C[ell,:],2*ng+ell] -= vecD[:,0] #incorpora Dx en el bloque B
Mat_dif[ng+C[ell,:],2*ng+ell] -= vecD[:,1] #incorpora Dy en el bloque B
Mat_dif[2*ng+ell,C[ell,:]] -= vecD[:,0] #incorpora Dx en el bloque C
Mat_dif[2*ng+ell,ng+C[ell,:]] -= vecD[:,1] #incorpora Dy en el bloque C
# Construye el vector del lado derecho
vec_b = np.zeros(2*ng+ne)
# Implementa las condiciones de frontera
for ind in range(ng):
if(gfl[ind,0]==1):
# Ajusta las entradas al lado derecho
vec_b -= Mat_dif[:,ind]*gfl[ind,1] + Mat_dif[:,ng+ind]*gfl[ind,2]
# Ajusta el valor de la entrada en b
vec_b[ind] = gfl[ind,1] # Coor. x
vec_b[ng+ind] = gfl[ind,2] # Coor. y
# Ajusta la matriz del problema
Mat_dif[:,ind] = np.zeros(2*ng+ne)
Mat_dif[:,ng+ind] = np.zeros(2*ng+ne)
Mat_dif[ind,:] = np.zeros(2*ng+ne)
Mat_dif[ng+ind,:] = np.zeros(2*ng+ne)
Mat_dif[ind,ind] = 1.
Mat_dif[ng+ind,ng+ind] = 1.
return Mat_dif, vec_b
Bibliografıa
[1] D.A. Kopriva. Implementing Spectral Methods for Partial Differential Equations:
Algorithms for Scientists and Engineers, chapter Spectral Element Methods, pages
293–354. Scientific Computation. Springer, 2009. ISBN 9789048122615.
[2] L.N. Trefethen. Spectral Methods in MATLAB. Software, Environments, and Tools.
Society for Industrial and Applied Mathematics, 2000. ISBN 9780898714654.
[3] C. Pozrikidis. Introduction to Finite and Spectral Element Methods using MATLAB.
Taylor & Francis, 2005. ISBN 9781584885290.
[4] G. Karniadakis and S. Sherwin. Spectral/hp Element Methods for Computational
Fluid Dynamics: Second Edition. Numerical Mathematics and Scientific Computa-
tion. OUP Oxford, 2013. ISBN 9780199671366.
[5] S.J. Sherwin and G.E. Karniadakis. A triangular spectral element method; appli-
cations to the incompressible navier-stokes equations. Computer Methods in Ap-
plied Mechanics and Engineering, 123(1–4):189 – 229, 1995. ISSN 0045-7825. doi:
http://dx.doi.org/10.1016/0045-7825(94)00745-9.
[6] C. Kleinstreuer. Biofluid Dynamics: Principles and Selected Applications. Taylor
& Francis, 2006. ISBN 9780849322211.
[7] F.M. White. Fluid Mechanics. McGraw-Hill series in mechanical engineering.
McGraw-Hill, 2011. ISBN 9780071311212.
[8] M.G. Blyth and C. Pozrikidis. A lobatto interpolation grid over the triangle. IMA
journal of applied mathematics, 71(1):153–169, 2006.
[9] L.N. Trefethen. Approximation Theory and Approximation Practice. Siam, 2013.
ISBN 9781611972405.
[10] L.P. Bos. Bounding the lebesgue function for lagrange interpolation in a simplex.
Journal of Approximation Theory, 38(1):43 – 59, 1983. ISSN 0021-9045. doi: http:
//dx.doi.org/10.1016/0021-9045(83)90140-5.
77
Bibliografıa 78
[11] B. Sundermann. Lebesgue constants in lagrangian interpolation at the fekete points.
Ergebnisbericht der Lehrstuhle Math III, VIII, 44, 1980.
[12] M.G. Blyth, H. Luo, and C. Pozrikidis. A comparison of interpolation grids over the
triangle or the tetrahedron. Journal of Engineering Mathematics, 56(3):263–272,
2006. ISSN 0022-0833. doi: 10.1007/s10665-006-9063-0. URL http://dx.doi.
org/10.1007/s10665-006-9063-0.
[13] F.N. van de Vosse and P.D. Minev. Spectral Element Methods: Theory and Appli-
cations/ F.N. Van de Vosse and P.D. Minev. EUT report. Eindhoven University
of Technology, Faculty of Mechanical Engineering, 1996. ISBN 9789038603186.
[14] F.J. Sayas. A gentle introduction to the finite element method, 2008. URL http:
//www.imati.cnr.it/marini/didattica/Metodi-engl/Intro2FEM.pdf.
[15] R. Pasquetti and F. Rapetti. Spectral element methods on unstructured meshes:
which interpolation points? Numerical Algorithms, 55(2-3):349–366, 2010.
[16] D.A. Samano and M. Sen. Mecanica de fluidos, 2009. URL http://www3.nd.edu/
~msen/MecFl.pdf.
[17] JR Koseff and RL Street. The lid-driven cavity flow: a synthesis of qualitative and
quantitative observations. Journal of Fluids Engineering, 106(4):390–398, 1984.
[18] T.S. Chihara. An introduction to orthogonal polynomials. Courier Dover Publica-
tions, 2011.
[19] S. Chapra and R. Canale. Numerical Methods for Engineers. McGraw-Hill Educa-
tion, 2014. ISBN 9780073397924.